ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL0tjb25maWcgYi9kcml2ZXJzL2lkZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzBhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9LY29uZmlnCkBAIC0wLDAgKzEsMTA1NiBAQAorIworIyBJREUgQVRBIEFUQVBJIEJsb2NrIGRldmljZSBkcml2ZXIgY29uZmlndXJhdGlvbgorIworIyBBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorIworCittZW51ICJBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0IgorCitjb25maWcgSURFCisJdHJpc3RhdGUgIkFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdXIga2VybmVsIHdpbGwgYmUgYWJsZSB0byBtYW5hZ2UgbG93IGNvc3QgbWFzcworCSAgc3RvcmFnZSB1bml0cyBzdWNoIGFzIEFUQS8oRSlJREUgYW5kIEFUQVBJIHVuaXRzLiBUaGUgbW9zdCBjb21tb24KKwkgIGNhc2VzIGFyZSBJREUgaGFyZCBkcml2ZXMgYW5kIEFUQVBJIENELVJPTSBkcml2ZXMuCisKKwkgIElmIHlvdXIgc3lzdGVtIGlzIHB1cmUgU0NTSSBhbmQgZG9lc24ndCB1c2UgdGhlc2UgaW50ZXJmYWNlcywgeW91CisJICBjYW4gc2F5IE4gaGVyZS4KKworCSAgSW50ZWdyYXRlZCBEaXNrIEVsZWN0cm9uaWNzIChJREUgYWthIEFUQS0xKSBpcyBhIGNvbm5lY3Rpbmcgc3RhbmRhcmQKKwkgIGZvciBtYXNzIHN0b3JhZ2UgdW5pdHMgc3VjaCBhcyBoYXJkIGRpc2tzLiBJdCB3YXMgZGVzaWduZWQgYnkKKwkgIFdlc3Rlcm4gRGlnaXRhbCBhbmQgQ29tcGFxIENvbXB1dGVyIGluIDE5ODQuIEl0IHdhcyB0aGVuIG5hbWVkCisJICBTVDUwNi4gUXVpdGUgYSBudW1iZXIgb2YgZGlza3MgdXNlIHRoZSBJREUgaW50ZXJmYWNlLgorCisJICBBVCBBdHRhY2htZW50IChBVEEpIGlzIHRoZSBzdXBlcnNldCBvZiB0aGUgSURFIHNwZWNpZmljYXRpb25zLgorCSAgU1Q1MDYgd2FzIGFsc28gY2FsbGVkIEFUQS0xLgorCisJICBGYXN0LUlERSBpcyBBVEEtMiAoYWxzbyBuYW1lZCBGYXN0IEFUQSksIEVuaGFuY2VkIElERSAoRUlERSkgaXMKKwkgIEFUQS0zLiBJdCBwcm92aWRlcyBzdXBwb3J0IGZvciBsYXJnZXIgZGlza3MgKHVwIHRvIDguNEdCIGJ5IG1lYW5zIG9mCisJICB0aGUgTEJBIHN0YW5kYXJkKSwgbW9yZSBkaXNrcyAoNCBpbnN0ZWFkIG9mIDIpIGFuZCBmb3Igb3RoZXIgbWFzcworCSAgc3RvcmFnZSB1bml0cyBzdWNoIGFzIHRhcGVzIGFuZCBjZHJvbS4gVURNQS8zMyAoYWthIFVsdHJhRE1BLzMzKSBpcworCSAgQVRBLTQgYW5kIHByb3ZpZGVzIGZhc3RlciAoYW5kIG1vcmUgQ1BVIGZyaWVuZGx5KSB0cmFuc2ZlciBtb2RlcworCSAgdGhhbiBwcmV2aW91cyBQSU8gKFByb2dyYW1tZWQgcHJvY2Vzc29yIElucHV0L091dHB1dCkgZnJvbSBwcmV2aW91cworCSAgQVRBL0lERSBzdGFuZGFyZHMgYnkgbWVhbnMgb2YgZmFzdCBETUEgY29udHJvbGxlcnMuCisKKwkgIEFUQSBQYWNrZXQgSW50ZXJmYWNlIChBVEFQSSkgaXMgYSBwcm90b2NvbCB1c2VkIGJ5IEVJREUgdGFwZSBhbmQKKwkgIENELVJPTSBkcml2ZXMsIHNpbWlsYXIgaW4gbWFueSByZXNwZWN0cyB0byB0aGUgU0NTSSBwcm90b2NvbC4KKworCSAgU01BUlQgSURFIChTZWxmIE1vbml0b3JpbmcsIEFuYWx5c2lzIGFuZCBSZXBvcnRpbmcgVGVjaG5vbG9neSkgd2FzCisJICBkZXNpZ25lZCBpbiBvcmRlciB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBhbmQgZGlzayBjcmFzaCBieQorCSAgZGV0ZWN0aW5nIHByZSBoYXJkd2FyZSBmYWlsdXJlIGNvbmRpdGlvbnMgKGhlYXQsIGFjY2VzcyB0aW1lLCBhbmQKKwkgIHRoZSBsaWtlLi4uKS4gRGlza3MgYnVpbHQgc2luY2UgSnVuZSAxOTk1IG1heSBmb2xsb3cgdGhpcyBzdGFuZGFyZC4KKwkgIFRoZSBrZXJuZWwgaXRzZWxmIGRvZXNuJ3QgbWFuYWdlIHRoaXM7IGhvd2V2ZXIgdGhlcmUgYXJlIHF1aXRlIGEKKwkgIG51bWJlciBvZiB1c2VyIHByb2dyYW1zIHN1Y2ggYXMgc21hcnQgdGhhdCBjYW4gcXVlcnkgdGhlIHN0YXR1cyBvZgorCSAgU01BUlQgcGFyYW1ldGVycyBmcm9tIGRpc2sgZHJpdmVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpZGUuCisKKwkgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitpZiBJREUKKworY29uZmlnIElERV9NQVhfSFdJRlMgCisJaW50ICJNYXggSURFIGludGVyZmFjZXMiCisJZGVwZW5kcyBvbiBBTFBIQSB8fCBTVVBFUkgKKwlkZWZhdWx0IDQKKwloZWxwCisJICBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBJREUgaGFyZHdhcmUgaW50ZXJmYWNlcyB0aGF0IHdpbGwKKwkgIGJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLiBNYWtlIHN1cmUgaXQgaXMgYXQgbGVhc3QgYXMgaGlnaCBhcworCSAgdGhlIG51bWJlciBvZiBJREUgaW50ZXJmYWNlcyBpbiB5b3VyIHN5c3RlbS4KKworY29uZmlnIEJMS19ERVZfSURFCisJdHJpc3RhdGUgIkVuaGFuY2VkIElERS9NRk0vUkxMIGRpc2svY2Ryb20vdGFwZS9mbG9wcHkgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgdXNlIHRoZSBmdWxsLWZlYXR1cmVkIElERSBkcml2ZXIgdG8KKwkgIGNvbnRyb2wgdXAgdG8gdGVuIEFUQS9JREUgaW50ZXJmYWNlcywgZWFjaCBiZWluZyBhYmxlIHRvIHNlcnZlIGEKKwkgICJtYXN0ZXIiIGFuZCBhICJzbGF2ZSIgZGV2aWNlLCBmb3IgYSB0b3RhbCBvZiB1cCB0byB0d2VudHkgQVRBL0lERQorCSAgZGlzay9jZHJvbS90YXBlL2Zsb3BweSBkcml2ZXMuCisKKwkgIFVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBsYXJnZSAoPjU0MCBNQikgSURFIGRpc2tzLCBtdWx0aXBsZQorCSAgaW50ZXJmYWNlcywgd2hhdCB0byBkbyBpZiBBVEEvSURFIGRldmljZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5CisJICBkZXRlY3RlZCwgc291bmQgY2FyZCBBVEEvSURFIHBvcnRzLCBtb2R1bGUgc3VwcG9ydCwgYW5kIG90aGVyCisJICB0b3BpY3MsIGlzIGNvbnRhaW5lZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+LiBGb3IgZGV0YWlsZWQKKwkgIGluZm9ybWF0aW9uIGFib3V0IGhhcmQgZHJpdmVzLCBjb25zdWx0IHRoZSBEaXNrLUhPV1RPIGFuZCB0aGUKKwkgIE11bHRpLURpc2stSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBmaW5lLXR1bmUgQVRBL0lERSBkcml2ZS9pbnRlcmZhY2UgcGFyYW1ldGVycyBmb3IgaW1wcm92ZWQKKwkgIHBlcmZvcm1hbmNlLCBsb29rIGZvciB0aGUgaGRwYXJtIHBhY2thZ2UgYXQKKwkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2hhcmR3YXJlLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlLnR4dD4uIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWRlLW1vZC4KKwkgIERvIG5vdCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbSAodGhlCisJICBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gYW4gSURFIGRldmljZS4KKworCSAgSWYgeW91IGhhdmUgb25lIG9yIG1vcmUgSURFIGRyaXZlcywgc2F5IFkgb3IgTSBoZXJlLiBJZiB5b3VyIHN5c3RlbQorCSAgaGFzIG5vIElERSBkcml2ZXMsIG9yIGlmIG1lbW9yeSByZXF1aXJlbWVudHMgYXJlIHJlYWxseSB0aWdodCwgeW91CisJICBjb3VsZCBzYXkgTiBoZXJlLCBhbmQgc2VsZWN0IHRoZSAiT2xkIGhhcmQgZGlzayBkcml2ZXIiIGJlbG93CisJICBpbnN0ZWFkIHRvIHNhdmUgYWJvdXQgMTMgS0Igb2YgbWVtb3J5IGluIHRoZSBrZXJuZWwuCisKK2lmIEJMS19ERVZfSURFCisKK2NvbW1lbnQgIlBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcyIKKworY29uZmlnIEJMS19ERVZfSURFX1NBVEEKKwlib29sICJTdXBwb3J0IGZvciBTQVRBIChkZXByZWNhdGVkOyBjb25mbGljdHMgd2l0aCBsaWJhdGEgU0FUQSBkcml2ZXIpIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoZXJlIGFyZSB0d28gZHJpdmVycyBmb3IgU2VyaWFsIEFUQSBjb250cm9sbGVycy4KKworCSAgVGhlIG1haW4gZHJpdmVyLCAibGliYXRhIiwgZXhpc3RzIGluc2lkZSB0aGUgU0NTSSBzdWJzeXN0ZW0KKwkgIGFuZCBzdXBwb3J0cyBtb3N0IG1vZGVybiBTQVRBIGNvbnRyb2xsZXJzLgorCisJICBUaGUgSURFIGRyaXZlciAod2hpY2ggeW91IGFyZSBjdXJyZW50bHkgY29uZmlndXJpbmcpIHN1cHBvcnRzCisJICBhIGZldyBmaXJzdC1nZW5lcmF0aW9uIFNBVEEgY29udHJvbGxlcnMuCisKKwkgIEluIG9yZGVyIHRvIGVsaW1pbmF0ZSBjb25mbGljdHMgYmV0d2VlbiB0aGUgdHdvIHN1YnN5c3RlbXMsCisJICB0aGlzIGNvbmZpZyBvcHRpb24gZW5hYmxlcyB0aGUgSURFIGRyaXZlcidzIFNBVEEgc3VwcG9ydC4KKwkgIE5vcm1hbGx5IHRoaXMgaXMgZGlzYWJsZWQsIGFzIGl0IGlzIHByZWZlcnJlZCB0aGF0IGxpYmF0YQorCSAgc3VwcG9ydHMgU0FUQSBjb250cm9sbGVycywgYW5kIHRoaXMgKElERSkgZHJpdmVyIHN1cHBvcnRzCisJICBQQVRBIGNvbnRyb2xsZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQkxLX0RFVl9IRF9JREUKKwlib29sICJVc2Ugb2xkIGRpc2stb25seSBkcml2ZXIgb24gcHJpbWFyeSBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiAoWDg2IHx8IFNIX01QQzEyMTEpCisJLS0taGVscC0tLQorCSAgVGhlcmUgYXJlIHR3byBkcml2ZXJzIGZvciBNRk0vUkxML0lERSBkaXNrcy4gIE1vc3QgcGVvcGxlIHVzZSBqdXN0CisJICB0aGUgbmV3IGVuaGFuY2VkIGRyaXZlciBieSBpdHNlbGYuICBUaGlzIG9wdGlvbiBob3dldmVyIGluc3RhbGxzIHRoZQorCSAgb2xkIGhhcmQgZGlzayBkcml2ZXIgdG8gY29udHJvbCB0aGUgcHJpbWFyeSBJREUvZGlzayBpbnRlcmZhY2UgaW4KKwkgIHRoZSBzeXN0ZW0sIGxlYXZpbmcgdGhlIG5ldyBlbmhhbmNlZCBJREUgZHJpdmVyIHRvIHRha2UgY2FyZSBvZiBvbmx5CisJICB0aGUgMm5kLzNyZC80dGggSURFIGludGVyZmFjZXMuICBEb2luZyB0aGlzIHdpbGwgcHJldmVudCB5b3UgZnJvbQorCSAgaGF2aW5nIGFuIElERS9BVEFQSSBDRC1ST00gb3IgdGFwZSBkcml2ZSBjb25uZWN0ZWQgdG8gdGhlIHByaW1hcnkKKwkgIElERSBpbnRlcmZhY2UuICBDaG9vc2luZyB0aGlzIG9wdGlvbiBtYXkgYmUgdXNlZnVsIGZvciBvbGRlciBzeXN0ZW1zCisJICB3aGljaCBoYXZlIE1GTS9STEwvRVNESSBjb250cm9sbGVyK2RyaXZlcyBhdCB0aGUgcHJpbWFyeSBwb3J0CisJICBhZGRyZXNzICgweDFmMCksIGFsb25nIHdpdGggSURFIGRyaXZlcyBhdCB0aGUgc2Vjb25kYXJ5LzNyZC80dGggcG9ydAorCSAgYWRkcmVzc2VzLgorCisJICBOb3JtYWxseSwganVzdCBzYXkgTiBoZXJlOyB5b3Ugd2lsbCB0aGVuIHVzZSB0aGUgbmV3IGRyaXZlciBmb3IgYWxsCisJICA0IGludGVyZmFjZXMuCisKK2NvbmZpZyBCTEtfREVWX0lERURJU0sKKwl0cmlzdGF0ZSAiSW5jbHVkZSBJREUvQVRBLTIgRElTSyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgd2lsbCBpbmNsdWRlIGVuaGFuY2VkIHN1cHBvcnQgZm9yIE1GTS9STEwvSURFIGhhcmQgZGlza3MuICBJZgorCSAgeW91IGhhdmUgYSBNRk0vUkxML0lERSBkaXNrLCBhbmQgdGhlcmUgaXMgbm8gc3BlY2lhbCByZWFzb24gdG8gdXNlCisJICB0aGUgb2xkIGhhcmQgZGlzayBkcml2ZXIgaW5zdGVhZCwgc2F5IFkuICBJZiB5b3UgaGF2ZSBhbiBTQ1NJLW9ubHkKKwkgIHN5c3RlbSwgeW91IGNhbiBzYXkgTiBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpZGUtZGlzay4KKwkgIERvIG5vdCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbQorCSAgKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gdGhlIElERSBkaXNrLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSURFRElTS19NVUxUSV9NT0RFCisJYm9vbCAiVXNlIG11bHRpLW1vZGUgYnkgZGVmYXVsdCIKKwloZWxwCisJICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IsIHRyeSB0byBzYXkgWSBoZXJlOgorCisJICBoZGE6IHNldF9tdWx0bW9kZTogc3RhdHVzPTB4NTEgeyBEcml2ZVJlYWR5IFNlZWtDb21wbGV0ZSBFcnJvciB9CisJICBoZGE6IHNldF9tdWx0bW9kZTogZXJyb3I9MHgwNCB7IERyaXZlU3RhdHVzRXJyb3IgfQorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBCTEtfREVWX0lERUNTCisJdHJpc3RhdGUgIlBDTUNJQSBJREUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDTUNJQQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIG91dGJvYXJkIElERSBkaXNrcywgdGFwZSBkcml2ZXMsIGFuZCBDRC1ST00gZHJpdmVzCisJICBjb25uZWN0ZWQgdGhyb3VnaCBhICBQQ01DSUEgY2FyZC4KKworY29uZmlnIEJMS19ERVZfSURFQ0QKKwl0cmlzdGF0ZSAiSW5jbHVkZSBJREUvQVRBUEkgQ0RST00gc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIENELVJPTSBkcml2ZSB1c2luZyB0aGUgQVRBUEkgcHJvdG9jb2wsIHNheSBZLiBBVEFQSSBpcworCSAgYSBuZXdlciBwcm90b2NvbCB1c2VkIGJ5IElERSBDRC1ST00gYW5kIFRBUEUgZHJpdmVzLCBzaW1pbGFyIHRvIHRoZQorCSAgU0NTSSBwcm90b2NvbC4gTW9zdCBuZXcgQ0QtUk9NIGRyaXZlcyB1c2UgQVRBUEksIGluY2x1ZGluZyB0aGUKKwkgIE5FQy0yNjAsIE1pdHN1bWkgRlg0MDAsIFNvbnkgNTVFLCBhbmQganVzdCBhYm91dCBhbGwgbm9uLVNDU0kKKwkgIGRvdWJsZSgyWCkgb3IgYmV0dGVyIHNwZWVkIGRyaXZlcy4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBDRC1ST00gZHJpdmUgd2lsbCBiZSBpZGVudGlmaWVkIGF0IGJvb3QgdGltZQorCSAgYWxvbmcgd2l0aCBvdGhlciBJREUgZGV2aWNlcywgYXMgImhkYiIgb3IgImhkYyIsIG9yIHNvbWV0aGluZworCSAgc2ltaWxhciAoY2hlY2sgdGhlIGJvb3QgbWVzc2FnZXMgd2l0aCBkbWVzZykuIElmIHRoaXMgaXMgeW91ciBvbmx5CisJICBDRC1ST00gZHJpdmUsIHlvdSBjYW4gc2F5IE4gdG8gYWxsIG90aGVyIENELVJPTSBvcHRpb25zLCBidXQgYmUgc3VyZQorCSAgdG8gc2F5IFkgb3IgTSB0byAiSVNPIDk2NjAgQ0QtUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiLgorCisJICBOb3RlIHRoYXQgb2xkZXIgdmVyc2lvbnMgb2YgTElMTyAoTEludXggTE9hZGVyKSBjYW5ub3QgcHJvcGVybHkgZGVhbAorCSAgd2l0aCBJREUvQVRBUEkgQ0QtUk9Ncywgc28gaW5zdGFsbCBMSUxPIDE2IG9yIGhpZ2hlciwgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vbGlsby5nby5keW5kbnMub3JnLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlkZS1jZC4KKworY29uZmlnIEJMS19ERVZfSURFVEFQRQorCXRyaXN0YXRlICJJbmNsdWRlIElERS9BVEFQSSBUQVBFIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBJREUgdGFwZSBkcml2ZSB1c2luZyB0aGUgQVRBUEkgcHJvdG9jb2wsIHNheSBZLgorCSAgQVRBUEkgaXMgYSBuZXdlciBwcm90b2NvbCB1c2VkIGJ5IElERSB0YXBlIGFuZCBDRC1ST00gZHJpdmVzLAorCSAgc2ltaWxhciB0byB0aGUgU0NTSSBwcm90b2NvbC4gIElmIHlvdSBoYXZlIGFuIFNDU0kgdGFwZSBkcml2ZQorCSAgaG93ZXZlciwgeW91IGNhbiBzYXkgTiBoZXJlLgorCisJICBZb3Ugc2hvdWxkIGFsc28gc2F5IFkgaWYgeW91IGhhdmUgYW4gT25TdHJlYW0gREktMzAgdGFwZSBkcml2ZTsgdGhpcworCSAgd2lsbCBub3Qgd29yayB3aXRoIHRoZSBTQ1NJIHByb3RvY29sLCB1bnRpbCB0aGVyZSBpcyBzdXBwb3J0IGZvciB0aGUKKwkgIFNDLTMwIGFuZCBTQy01MCB2ZXJzaW9ucy4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSB0YXBlIGRyaXZlIHdpbGwgYmUgaWRlbnRpZmllZCBhdCBib290IHRpbWUKKwkgIGFsb25nIHdpdGggb3RoZXIgSURFIGRldmljZXMsIGFzICJoZGIiIG9yICJoZGMiLCBvciBzb21ldGhpbmcKKwkgIHNpbWlsYXIsIGFuZCB3aWxsIGJlIG1hcHBlZCB0byBhIGNoYXJhY3RlciBkZXZpY2Ugc3VjaCBhcyAiaHQwIgorCSAgKGNoZWNrIHRoZSBib290IG1lc3NhZ2VzIHdpdGggZG1lc2cpLiAgQmUgc3VyZSB0byBjb25zdWx0IHRoZQorCSAgPGZpbGU6ZHJpdmVycy9pZGUvaWRlLXRhcGUuYz4gYW5kIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlLnR4dD4gZmlsZXMKKwkgIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWRlLXRhcGUuCisKK2NvbmZpZyBCTEtfREVWX0lERUZMT1BQWQorCXRyaXN0YXRlICJJbmNsdWRlIElERS9BVEFQSSBGTE9QUFkgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhbiBJREUgZmxvcHB5IGRyaXZlIHdoaWNoIHVzZXMgdGhlIEFUQVBJIHByb3RvY29sLAorCSAgYW5zd2VyIFkuICBBVEFQSSBpcyBhIG5ld2VyIHByb3RvY29sIHVzZWQgYnkgSURFIENELVJPTS90YXBlL2Zsb3BweQorCSAgZHJpdmVzLCBzaW1pbGFyIHRvIHRoZSBTQ1NJIHByb3RvY29sLgorCisJICBUaGUgTFMtMTIwIGFuZCB0aGUgSURFL0FUQVBJIElvbWVnYSBaSVAgZHJpdmUgYXJlIGFsc28gc3VwcG9ydGVkIGJ5CisJICB0aGlzIGRyaXZlci4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGp1bXBlciBzZXR0aW5ncyBhbmQgdGhlIHF1ZXN0aW9uCisJICBvZiB3aGVuIGEgWklQIGRyaXZlIHVzZXMgYSBwYXJ0aXRpb24gdGFibGUsIHNlZQorCSAgPGh0dHA6Ly93d3cud2luLnR1ZS5ubC9+YWViL2xpbnV4L3ppcC96aXAtMS5odG1sPi4KKwkgIChBVEFQSSBQRC1DRC9DRFIgZHJpdmVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOyBzdXBwb3J0CisJICBmb3IgUEQtQ0QvQ0RSIGRyaXZlcyBpcyBhdmFpbGFibGUgaWYgeW91IGFuc3dlciBZIHRvCisJICAiU0NTSSBlbXVsYXRpb24gc3VwcG9ydCIsIGJlbG93KS4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBGTE9QUFkgZHJpdmUgd2lsbCBiZSBpZGVudGlmaWVkIGFsb25nIHdpdGgKKwkgIG90aGVyIElERSBkZXZpY2VzLCBhcyAiaGRiIiBvciAiaGRjIiwgb3Igc29tZXRoaW5nIHNpbWlsYXIgKGNoZWNrCisJICB0aGUgYm9vdCBtZXNzYWdlcyB3aXRoIGRtZXNnKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWRlLWZsb3BweS4KKworY29uZmlnIEJMS19ERVZfSURFU0NTSQorCXRyaXN0YXRlICJTQ1NJIGVtdWxhdGlvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSQorCS0tLWhlbHAtLS0KKwkgIFdBUk5JTkc6IGlkZS1zY3NpIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIGNkIHdyaXRpbmcgYXBwbGljYXRpb25zIQorCSAgVGhlIDIuNiBrZXJuZWwgc3VwcG9ydHMgZGlyZWN0IHdyaXRpbmcgdG8gaWRlLWNkLCB3aGljaCBlbGltaW5hdGVzCisJICB0aGUgbmVlZCBmb3IgaWRlLXNjc2kgKyB0aGUgZW50aXJlIHNjc2kgc3RhY2sganVzdCBmb3Igd3JpdGluZyBhCisJICBjZC4gVGhlIG5ldyBtZXRob2QgaXMgbW9yZSBlZmZpY2llbnQgaW4gZXZlcnkgd2F5LgorCisJICBUaGlzIHdpbGwgcHJvdmlkZSBTQ1NJIGhvc3QgYWRhcHRlciBlbXVsYXRpb24gZm9yIElERSBBVEFQSSBkZXZpY2VzLAorCSAgYW5kIHdpbGwgYWxsb3cgeW91IHRvIHVzZSBhIFNDU0kgZGV2aWNlIGRyaXZlciBpbnN0ZWFkIG9mIGEgbmF0aXZlCisJICBBVEFQSSBkcml2ZXIuCisKKwkgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGFuIEFUQVBJIGRldmljZSBmb3Igd2hpY2ggbm8gbmF0aXZlCisJICBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiAoZm9yIGV4YW1wbGUsIGFuIEFUQVBJIFBELUNEIGRyaXZlKTsKKwkgIHlvdSBjYW4gdGhlbiB1c2UgdGhpcyBlbXVsYXRpb24gdG9nZXRoZXIgd2l0aCBhbiBhcHByb3ByaWF0ZSBTQ1NJCisJICBkZXZpY2UgZHJpdmVyLiBJbiBvcmRlciB0byBkbyB0aGlzLCBzYXkgWSBoZXJlIGFuZCB0byAiU0NTSSBzdXBwb3J0IgorCSAgYW5kICJTQ1NJIGdlbmVyaWMgc3VwcG9ydCIsIGJlbG93LiBZb3UgbXVzdCB0aGVuIHByb3ZpZGUgdGhlIGtlcm5lbAorCSAgY29tbWFuZCBsaW5lICJoZHg9aWRlLXNjc2kiICh0cnkgIm1hbiBib290cGFyYW0iIG9yIHNlZSB0aGUKKwkgIGRvY3VtZW50YXRpb24gb2YgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8KKwkgIHBhc3Mgb3B0aW9ucyB0byB0aGUga2VybmVsIGF0IGJvb3QgdGltZSkgZm9yIGRldmljZXMgaWYgeW91IHdhbnQgdGhlCisJICBuYXRpdmUgRUlERSBzdWItZHJpdmVycyB0byBza2lwIG92ZXIgdGhlIG5hdGl2ZSBzdXBwb3J0LCBzbyB0aGF0CisJICB0aGlzIFNDU0kgZW11bGF0aW9uIGNhbiBiZSB1c2VkIGluc3RlYWQuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBkb2VzIE5PVCBhbGxvdyB5b3UgdG8gYXR0YWNoIFNDU0kgZGV2aWNlcyB0byBhCisJICBib3ggdGhhdCBkb2Vzbid0IGhhdmUgYSBTQ1NJIGhvc3QgYWRhcHRlciBpbnN0YWxsZWQuCisKKwkgIElmIGJvdGggdGhpcyBTQ1NJIGVtdWxhdGlvbiBhbmQgbmF0aXZlIEFUQVBJIHN1cHBvcnQgYXJlIGNvbXBpbGVkCisJICBpbnRvIHRoZSBrZXJuZWwsIHRoZSBuYXRpdmUgc3VwcG9ydCB3aWxsIGJlIHVzZWQuCisKK2NvbmZpZyBJREVfVEFTS19JT0NUTAorCWJvb2wgIklERSBUYXNrZmlsZSBBY2Nlc3MiCisJaGVscAorCSAgVGhpcyBpcyBhIGRpcmVjdCByYXcgYWNjZXNzIHRvIHRoZSBtZWRpYS4gIEl0IGlzIGEgY29tcGxleCBidXQKKwkgIGVsZWdhbnQgc29sdXRpb24gdG8gdGVzdCBhbmQgdmFsaWRhdGUgdGhlIGRvbWFpbiBvZiB0aGUgaGFyZHdhcmUgYW5kCisJICBwZXJmb3JtIGJlbG93IHRoZSBkcml2ZXIgZGF0YSByZWNvdmVyIGlmIG5lZWRlZC4gIFRoaXMgaXMgdGhlIG1vc3QKKwkgIGJhc2ljIGZvcm0gb2YgbWVkaWEtZm9yZW5zaWNzLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSwgc2F5IE4gaGVyZS4KKworY29tbWVudCAiSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcyIKKworY29uZmlnIElERV9HRU5FUklDCisJdHJpc3RhdGUgImdlbmVyaWMvZGVmYXVsdCBJREUgY2hpcHNldCBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBCTEtfREVWX0NNRDY0MAorCWJvb2wgIkNNRDY0MCBjaGlwc2V0IGJ1Z2ZpeC9zdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2CisJLS0taGVscC0tLQorCSAgVGhlIENNRC1UZWNobm9sb2dpZXMgQ01ENjQwIElERSBjaGlwIGlzIHVzZWQgb24gbWFueSBjb21tb24gNDg2IGFuZAorCSAgUGVudGl1bSBtb3RoZXJib2FyZHMsIHVzdWFsbHkgaW4gY29tYmluYXRpb24gd2l0aCBhICJOZXB0dW5lIiBvcgorCSAgIlNpUyIgY2hpcHNldC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIGEgbnVtYmVyIG9mIHJhdGhlciBuYXN0eQorCSAgZGVzaWduIGZsYXdzIHRoYXQgY2FuIGNhdXNlIHNldmVyZSBkYXRhIGNvcnJ1cHRpb24gdW5kZXIgbWFueSBjb21tb24KKwkgIGNvbmRpdGlvbnMuIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBjb2RlIHdoaWNoIHRyaWVzIHRvIGF1dG9tYXRpY2FsbHkKKwkgIGRldGVjdCBhbmQgY29ycmVjdCB0aGUgcHJvYmxlbXMgdW5kZXIgTGludXguIFRoaXMgb3B0aW9uIGFsc28KKwkgIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBzZWNvbmRhcnkgSURFIHBvcnRzIGluIHNvbWUgQ01ENjQwIGJhc2VkCisJICBzeXN0ZW1zLgorCisJICBUaGlzIGRyaXZlciB3aWxsIHdvcmsgYXV0b21hdGljYWxseSBpbiBQQ0kgYmFzZWQgc3lzdGVtcyAobW9zdCBuZXcKKwkgIHN5c3RlbXMgaGF2ZSBQQ0kgc2xvdHMpLiBCdXQgaWYgeW91ciBzeXN0ZW0gdXNlcyBWRVNBIGxvY2FsIGJ1cworCSAgKFZMQikgaW5zdGVhZCBvZiBQQ0ksIHlvdSBtdXN0IGFsc28gc3VwcGx5IGEga2VybmVsIGJvb3QgcGFyYW1ldGVyCisJICB0byBlbmFibGUgdGhlIENNRDY0MCBidWdmaXgvc3VwcG9ydDogImlkZTA9Y21kNjQwX3ZsYiIuIChUcnkgIm1hbgorCSAgYm9vdHBhcmFtIiBvciBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBib290IGxvYWRlciBhYm91dCBob3cgdG8KKwkgIHBhc3Mgb3B0aW9ucyB0byB0aGUga2VybmVsLikKKworCSAgVGhlIENNRDY0MCBjaGlwIGlzIGFsc28gdXNlZCBvbiBhZGQtaW4gY2FyZHMgYnkgQWNjdWxvZ2ljLCBhbmQgb24KKwkgIHRoZSAiQ1NBLTY0MDBFIFBDSSB0byBJREUgY29udHJvbGxlciIgdGhhdCBzb21lIHBlb3BsZSBoYXZlLiBGb3IKKwkgIGRldGFpbHMsIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9pZGUudHh0Pi4KKworY29uZmlnIEJMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJYm9vbCAiQ01ENjQwIGVuaGFuY2VkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCTEtfREVWX0NNRDY0MAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHNldHRpbmcvYXV0b3R1bmluZyBQSU8gbW9kZXMgYW5kCisJICBwcmVmZXRjaCBvbiBDTUQ2NDAgSURFIGludGVyZmFjZXMuICBGb3IgZGV0YWlscywgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pZGUudHh0Pi4gSWYgeW91IGhhdmUgYSBDTUQ2NDAgSURFIGludGVyZmFjZQorCSAgYW5kIHlvdXIgQklPUyBkb2VzIG5vdCBhbHJlYWR5IGRvIHRoaXMgZm9yIHlvdSwgdGhlbiBzYXkgWSBoZXJlLgorCSAgT3RoZXJ3aXNlIHNheSBOLgorCitjb25maWcgQkxLX0RFVl9JREVQTlAKKwlib29sICJQTlAgRUlERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUE5QCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBQblAgKFBsdWcgYW5kIFBsYXkpIGNvbXBhdGlibGUgRUlERSBjYXJkIGFuZAorCSAgd291bGQgbGlrZSB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGFuZCBhY3RpdmF0ZQorCSAgaXQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBCTEtfREVWX0lERVBDSQorCWJvb2wgIlBDSSBJREUgY2hpcHNldCBzdXBwb3J0IiBpZiBQQ0kKKwlkZWZhdWx0IEJMS19ERVZfSURFRE1BX1BNQUMgaWYgUFBDX1BNQUMgJiYgQkxLX0RFVl9JREVETUFfUE1BQworCWhlbHAKKwkgIFNheSBZIGhlcmUgZm9yIFBDSSBzeXN0ZW1zIHdoaWNoIHVzZSBJREUgZHJpdmUocykuCisJICBUaGlzIG9wdGlvbiBoZWxwcyB0aGUgSURFIGRyaXZlciB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBhbmQKKwkgIGNvbmZpZ3VyZSBhbGwgUENJLWJhc2VkIElERSBpbnRlcmZhY2VzIGluIHlvdXIgc3lzdGVtLgorCitjb25maWcgSURFUENJX1NIQVJFX0lSUQorCWJvb2wgIlNoYXJpbmcgUENJIElERSBpbnRlcnJ1cHRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgQkxLX0RFVl9JREVQQ0kKKwloZWxwCisJICBTb21lIEFUQS9JREUgY2hpcHNldHMgaGF2ZSBoYXJkd2FyZSBzdXBwb3J0IHdoaWNoIGFsbG93cyBmb3IKKwkgIHNoYXJpbmcgYSBzaW5nbGUgSVJRIHdpdGggb3RoZXIgY2FyZHMuIFRvIGVuYWJsZSBzdXBwb3J0IGZvcgorCSAgdGhpcyBpbiB0aGUgQVRBL0lERSBkcml2ZXIsIHNheSBZIGhlcmUuCisKKwkgIEl0IGlzIHNhZmUgdG8gc2F5IFkgdG8gdGhpcyBxdWVzdGlvbiwgaW4gbW9zdCBjYXNlcy4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCTEtfREVWX09GRkJPQVJECisJYm9vbCAiQm9vdCBvZmYtYm9hcmQgY2hpcHNldHMgZmlyc3Qgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBCTEtfREVWX0lERVBDSQorCWhlbHAKKwkgIE5vcm1hbGx5LCBJREUgY29udHJvbGxlcnMgYnVpbHQgaW50byB0aGUgbW90aGVyYm9hcmQgKG9uLWJvYXJkCisJICBjb250cm9sbGVycykgYXJlIGFzc2lnbmVkIHRvIGlkZTAgYW5kIGlkZTEgd2hpbGUgdGhvc2Ugb24gYWRkLWluIFBDSQorCSAgY2FyZHMgKG9mZi1ib2FyZCBjb250cm9sbGVycykgYXJlIHJlbGVnYXRlZCB0byBpZGUyIGFuZCBpZGUzLgorCSAgQW5zd2VyaW5nIFkgaGVyZSB3aWxsIGFsbG93IHlvdSB0byByZXZlcnNlIHRoZSBzaXR1YXRpb24sIHdpdGgKKwkgIG9mZi1ib2FyZCBjb250cm9sbGVycyBvbiBpZGUwLzEgYW5kIG9uLWJvYXJkIGNvbnRyb2xsZXJzIG9uIGlkZTIvMy4KKwkgIFRoaXMgY2FuIGltcHJvdmUgdGhlIHVzYWJpbGl0eSBvZiBzb21lIGJvb3QgbWFuYWdlcnMgc3VjaCBhcyBsaWxvCisJICB3aGVuIGJvb3RpbmcgZnJvbSBhIGRyaXZlIG9uIGFuIG9mZi1ib2FyZCBjb250cm9sbGVyLgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgYW5kIHlvdSBhY3R1YWxseSB3YW50IHRvIHJldmVyc2UgdGhlIGRldmljZSBzY2FuCisJICBvcmRlciBhcyBleHBsYWluZWQgYWJvdmUsIHlvdSBhbHNvIG5lZWQgdG8gaXNzdWUgdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lIG9wdGlvbiAiaWRlPXJldmVyc2UiLiAoVHJ5ICJtYW4gYm9vdHBhcmFtIiBvciBzZWUgdGhlCisJICBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQgaG93IHRvCisJICBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuKQorCisJICBOb3RlIHRoYXQsIGlmIHlvdSBkbyB0aGlzLCB0aGUgb3JkZXIgb2YgdGhlIGhkKiBkZXZpY2VzIHdpbGwgYmUKKwkgIHJlYXJyYW5nZWQgd2hpY2ggbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uIG9mIGZzdGFiIGFuZCBvdGhlciBmaWxlcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgQkxLX0RFVl9HRU5FUklDCisJdHJpc3RhdGUgIkdlbmVyaWMgUENJIElERSBDaGlwc2V0IFN1cHBvcnQiCisJZGVwZW5kcyBvbiBCTEtfREVWX0lERVBDSQorCitjb25maWcgQkxLX0RFVl9PUFRJNjIxCisJdHJpc3RhdGUgIk9QVGkgODJDNjIxIGNoaXBzZXQgZW5oYW5jZWQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBCTEtfREVWX0lERVBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgT1BUaSA4MkM2MjEgRUlERSBjb250cm9sbGVyLgorCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYz4uCisKK2NvbmZpZyBCTEtfREVWX1JaMTAwMAorCXRyaXN0YXRlICJSWjEwMDAgY2hpcHNldCBidWdmaXgvc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBCTEtfREVWX0lERVBDSSAmJiBYODYKKwloZWxwCisJICBUaGUgUEMtVGVjaG5vbG9naWVzIFJaMTAwMCBJREUgY2hpcCBpcyB1c2VkIG9uIG1hbnkgY29tbW9uIDQ4NiBhbmQKKwkgIFBlbnRpdW0gbW90aGVyYm9hcmRzLCB1c3VhbGx5IGFsb25nIHdpdGggdGhlICJOZXB0dW5lIiBjaGlwc2V0LgorCSAgVW5mb3J0dW5hdGVseSwgaXQgaGFzIGEgcmF0aGVyIG5hc3R5IGRlc2lnbiBmbGF3IHRoYXQgY2FuIGNhdXNlCisJICBzZXZlcmUgZGF0YSBjb3JydXB0aW9uIHVuZGVyIG1hbnkgY29uZGl0aW9ucy4gU2F5IFkgaGVyZSB0byBpbmNsdWRlCisJICBjb2RlIHdoaWNoIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgY29ycmVjdHMgdGhlIHByb2JsZW0gdW5kZXIKKwkgIExpbnV4LiBUaGlzIG1heSBzbG93IGRpc2sgdGhyb3VnaHB1dCBieSBhIGZldyBwZXJjZW50LCBidXQgYXQgbGVhc3QKKwkgIHRoaW5ncyB3aWxsIG9wZXJhdGUgMTAwJSByZWxpYWJseS4KKworY29uZmlnIEJMS19ERVZfU0w4MkMxMDUKKwl0cmlzdGF0ZSAiV2luYm9uZCBTTDgyYzEwNSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIChQUEMgfHwgQVJNKSAmJiBCTEtfREVWX0lERVBDSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgV2luYm9uZCBTTDgyYzEwNSBJREUgY29udHJvbGxlciwgc2F5IFkgaGVyZSB0byBlbmFibGUKKwkgIHNwZWNpYWwgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjaGlwLiBUaGlzIGlzIGNvbW1vbiBvbiB2YXJpb3VzIENIUlAKKwkgIG1vdGhlcmJvYXJkcywgYnV0IGNvdWxkIGJlIHVzZWQgZWxzZXdoZXJlLiBJZiBpbiBkb3VidCwgc2F5IFkuCisKK2NvbmZpZyBCTEtfREVWX0lERURNQV9QQ0kKKwlib29sICJHZW5lcmljIFBDSSBidXMtbWFzdGVyIERNQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIEJMS19ERVZfSURFUENJCisJLS0taGVscC0tLQorCSAgSWYgeW91ciBQQ0kgc3lzdGVtIHVzZXMgSURFIGRyaXZlKHMpIChhcyBvcHBvc2VkIHRvIFNDU0ksIHNheSkgYW5kCisJICBpcyBjYXBhYmxlIG9mIGJ1cy1tYXN0ZXIgRE1BIG9wZXJhdGlvbiAobW9zdCBQZW50aXVtIFBDSSBzeXN0ZW1zKSwKKwkgIHlvdSB3aWxsIHdhbnQgdG8gc2F5IFkgaGVyZSB0byByZWR1Y2UgQ1BVIG92ZXJoZWFkLiBZb3UgY2FuIHRoZW4gdXNlCisJICB0aGUgImhkcGFybSIgdXRpbGl0eSB0byBlbmFibGUgRE1BIGZvciBkcml2ZXMgZm9yIHdoaWNoIGl0IHdhcyBub3QKKwkgIGVuYWJsZWQgYXV0b21hdGljYWxseS4gQnkgZGVmYXVsdCwgRE1BIGlzIG5vdCBlbmFibGVkIGF1dG9tYXRpY2FsbHkKKwkgIGZvciB0aGVzZSBkcml2ZXMsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGF0IGJ5IHNheWluZyBZIHRvIHRoZQorCSAgZm9sbG93aW5nIHF1ZXN0aW9uICJVc2UgRE1BIGJ5IGRlZmF1bHQgd2hlbiBhdmFpbGFibGUiLiBZb3UgY2FuIGdldAorCSAgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBoZHBhcm0gdXRpbGl0eSBmcm9tCisJICA8ZnRwOi8vaWJpYmxpby5vcmcvcHViL0xpbnV4L3N5c3RlbS9oYXJkd2FyZS8+LgorCisJICBSZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIDxmaWxlOmRyaXZlcnMvaWRlL2lkZS1kbWEuYz4KKwkgIGFuZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBJdCBpcyBzYWZlIHRvIHNheSBZIHRvIHRoaXMgcXVlc3Rpb24uCisKK2lmIEJMS19ERVZfSURFRE1BX1BDSQorCitjb25maWcgQkxLX0RFVl9JREVETUFfRk9SQ0VECisJYm9vbCAiRm9yY2UgZW5hYmxlIGxlZ2FjeSAyLjAuWCBIT1NUUyB0byB1c2UgRE1BIgorCWhlbHAKKwkgIFRoaXMgaXMgYW4gb2xkIHBpZWNlIG9mIGxvc3QgY29kZSBmcm9tIExpbnV4IDIuMCBLZXJuZWxzLgorCisJICBHZW5lcmFsbHkgc2F5IE4gaGVyZS4KKworY29uZmlnIElERURNQV9QQ0lfQVVUTworCWJvb2wgIlVzZSBQQ0kgRE1BIGJ5IGRlZmF1bHQgd2hlbiBhdmFpbGFibGUiCisJLS0taGVscC0tLQorCSAgUHJpb3IgdG8ga2VybmVsIHZlcnNpb24gMi4xLjExMiwgTGludXggdXNlZCB0byBhdXRvbWF0aWNhbGx5IHVzZQorCSAgRE1BIGZvciBJREUgZHJpdmVzIGFuZCBjaGlwc2V0cyB3aGljaCBzdXBwb3J0IGl0LiBEdWUgdG8gY29uY2VybnMKKwkgIGFib3V0IGEgY291cGxlIG9mIGNhc2VzIHdoZXJlIGJ1Z2d5IGhhcmR3YXJlIG1heSBoYXZlIGNhdXNlZCBkYW1hZ2UsCisJICB0aGUgZGVmYXVsdCBpcyBub3cgdG8gTk9UIHVzZSBETUEgYXV0b21hdGljYWxseS4gVG8gcmV2ZXJ0IHRvIHRoZQorCSAgcHJldmlvdXMgYmVoYXZpb3VyLCBzYXkgWSB0byB0aGlzIHF1ZXN0aW9uLgorCisJICBJZiB5b3Ugc3VzcGVjdCB5b3VyIGhhcmR3YXJlIGlzIGF0IGFsbCBmbGFrZXksIHNheSBOIGhlcmUuCisJICBEbyBOT1QgZW1haWwgdGhlIElERSBrZXJuZWwgcGVvcGxlIHJlZ2FyZGluZyB0aGlzIGlzc3VlIQorCisJICBJdCBpcyBub3JtYWxseSBzYWZlIHRvIGFuc3dlciBZIHRvIHRoaXMgcXVlc3Rpb24gdW5sZXNzIHlvdXIKKwkgIG1vdGhlcmJvYXJkIHVzZXMgYSBWSUEgVlAyIGNoaXBzZXQsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBzYXkgTi4KKworY29uZmlnIElERURNQV9PTkxZRElTSworCWJvb2wgIkVuYWJsZSBETUEgb25seSBmb3IgZGlza3MgIgorCWRlcGVuZHMgb24gSURFRE1BX1BDSV9BVVRPCisJaGVscAorCSAgVGhpcyBpcyB1c2VkIGlmIHlvdSBrbm93IHlvdXIgQVRBUEkgRGV2aWNlcyBhcmUgZ29pbmcgdG8gZmFpbCBETUEKKwkgIFRyYW5zZmVycy4KKworCSAgR2VuZXJhbGx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBCTEtfREVWX0FFQzYyWFgKKwl0cmlzdGF0ZSAiQUVDNjJYWCBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBleHBsaWNpdCBzdXBwb3J0IGZvciBBY2FyZCBBRUM2Mnh4IChBcnRvcCBBVFA4eHgpCisJICBJREUgY29udHJvbGxlcnMuIFRoaXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hhbmdlIFBJTywgRE1BIGFuZCBVRE1BCisJICBzcGVlZHMgYW5kIHRvIGNvbmZpZ3VyZSB0aGUgY2hpcCB0byBvcHRpbXVtIHBlcmZvcm1hbmNlLgorCitjb25maWcgQkxLX0RFVl9BTEkxNVgzCisJdHJpc3RhdGUgIkFMSSBNMTV4MyBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgZW5zdXJlcyAoVSlETUEgc3VwcG9ydCBmb3IgQUxJIDE1MzMsIDE1NDMgYW5kIDE1NDNDCisJICBvbmJvYXJkIGNoaXBzZXRzLiAgSXQgYWxzbyB0ZXN0cyBmb3IgU2ltcGxleCBtb2RlIGFuZCBlbmFibGVzCisJICBub3JtYWwgZHVhbCBjaGFubmVsIHN1cHBvcnQuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgYWxzbyBuZWVkIHRvIHNheSBZIHRvICJVc2UgRE1BIGJ5IGRlZmF1bHQKKwkgIHdoZW4gYXZhaWxhYmxlIiwgYWJvdmUuICBQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZgorCSAgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmM+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgV0RDX0FMSTE1WDMKKwlib29sICJBTEkgTTE1eDMgV0RDIHN1cHBvcnQgKERBTkdFUk9VUykiCisJZGVwZW5kcyBvbiBCTEtfREVWX0FMSTE1WDMKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyBmb3IgVWx0cmFETUEgc3VwcG9ydCBmb3IgV0RDIGRyaXZlcyB0aGF0IGlnbm9yZSBDUkMKKwkgIGNoZWNraW5nLiBZb3UgYXJlIGEgZm9vbCBmb3IgZW5hYmxpbmcgdGhpcyBvcHRpb24sIGJ1dCB0aGVyZSBoYXZlCisJICBiZWVuIHJlcXVlc3RzLiBETyBOT1QgQ09NUExBSU4gSUYgWU9VUiBEUklWRSBIQVMgRlMgQ09SUlVQVElPTiwgSUYKKwkgIFlPVSBFTkFCTEUgVEhJUyEgTm8gb25lIHdpbGwgbGlzdGVuLCBqdXN0IGxhdWdoIGZvciBpZ25vcmluZyB0aGlzCisJICBTRVJJT1VTIFdBUk5JTkcuCisKKwkgIFVzaW5nIHRoaXMgb3B0aW9uIGNhbiBhbGxvdyBXREMgZHJpdmVzIHRvIHJ1biBhdCBBVEEtNC81IHRyYW5zZmVyCisJICByYXRlcyB3aXRoIG9ubHkgYW4gQVRBLTIgc3VwcG9ydCBzdHJ1Y3R1cmUuCisKKwkgIFNBWSBOIQorCitjb25maWcgQkxLX0RFVl9BTUQ3NFhYCisJdHJpc3RhdGUgIkFNRCBhbmQgblZpZGlhIElERSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgZXhwbGljaXQgc3VwcG9ydCBmb3IgQU1ELTd4eCBhbmQgQU1ELTgxMTEgY2hpcHMKKwkgIGFuZCBhbHNvIGZvciB0aGUgblZpZGlhIG5Gb3JjZSBjaGlwLiAgVGhpcyBhbGxvd3MgdGhlIGtlcm5lbCB0bworCSAgY2hhbmdlIFBJTywgRE1BIGFuZCBVRE1BIHNwZWVkcyBhbmQgdG8gY29uZmlndXJlIHRoZSBjaGlwIHRvCisJICBvcHRpbXVtIHBlcmZvcm1hbmNlLgorCitjb25maWcgQkxLX0RFVl9BVElJWFAKKwl0cmlzdGF0ZSAiQVRJIElYUCBjaGlwc2V0IElERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2CisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBleHBsaWNpdCBzdXBwb3J0IGZvciBBVEkgSVhQIGNoaXBzZXQuCisJICBUaGlzIGFsbG93cyB0aGUga2VybmVsIHRvIGNoYW5nZSBQSU8sIERNQSBhbmQgVURNQSBzcGVlZHMKKwkgIGFuZCB0byBjb25maWd1cmUgdGhlIGNoaXAgdG8gb3B0aW11bSBwZXJmb3JtYW5jZS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBVEkgSVhQIGNoaXBzZXQgSURFIGNvbnRyb2xsZXIuCisKK2NvbmZpZyBCTEtfREVWX0NNRDY0WAorCXRyaXN0YXRlICJDTUQ2NHszfDZ8OHw5fSBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBJREUgY29udHJvbGxlciB3aGljaCB1c2VzIGFueSBvZiB0aGVzZQorCSAgY2hpcHNldHM6IENNRDY0MywgQ01ENjQ2LCBvciBDTUQ2NDguCisKK2NvbmZpZyBCTEtfREVWX1RSSUZMRVgKKwl0cmlzdGF0ZSAiQ29tcGFxIFRyaWZsZXggSURFIHN1cHBvcnQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIENvbXBhcSBUcmlmbGV4IElERSBjb250cm9sbGVyLCBzdWNoCisJICBhcyB0aG9zZSBjb21tb25seSBmb3VuZCBvbiBDb21wYXEgUGVudGl1bS1Qcm8gc3lzdGVtcworCitjb25maWcgQkxLX0RFVl9DWTgyQzY5MworCXRyaXN0YXRlICJDWTgyQzY5MyBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBkZXRlY3Rpb24gYW5kIHN1cHBvcnQgZm9yIHRoZSBDWTgyQzY5MyBjaGlwc2V0CisJICB1c2VkIG9uIERpZ2l0YWwncyBQQy1BbHBoYSAxNjRTWCBib2FyZHMuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzYXkgWSB0byAiVXNlIERNQSBieSBkZWZhdWx0CisJICB3aGVuIGF2YWlsYWJsZSIgYXMgd2VsbC4KKworY29uZmlnIEJMS19ERVZfQ1M1NTIwCisJdHJpc3RhdGUgIkN5cml4IENTNTUxMC8yMCBNZWRpYUdYIGNoaXBzZXQgc3VwcG9ydCAoVkVSWSBFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBQSU8gdHVuaW5nIGFuIHZpcnR1YWwgRE1BIG9uIHRoZSBDeXJpeCBNZWRpYUdYIAorCSAgNTUxMC81NTIwIGNoaXBzZXQuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRldGVjdGVkIGFuZAorCSAgY29uZmlndXJlZCBpZiBmb3VuZC4KKworCSAgSXQgaXMgc2FmZSB0byBzYXkgWSB0byB0aGlzIHF1ZXN0aW9uLgorCitjb25maWcgQkxLX0RFVl9DUzU1MzAKKwl0cmlzdGF0ZSAiQ3lyaXgvTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBDUzU1MzAgTWVkaWFHWCBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBVRE1BIG9uIHRoZSBDeXJpeCBNZWRpYUdYIDU1MzAgY2hpcHNldC4gVGhpcworCSAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRldGVjdGVkIGFuZCBjb25maWd1cmVkIGlmIGZvdW5kLgorCisJICBJdCBpcyBzYWZlIHRvIHNheSBZIHRvIHRoaXMgcXVlc3Rpb24uCisKK2NvbmZpZyBCTEtfREVWX0hQVDM0WAorCXRyaXN0YXRlICJIUFQzNFggY2hpcHNldCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgdXAgdG8gNCBtb3JlIEVJREUgZGV2aWNlcyBzaGFyaW5nIGEgc2luZ2xlCisJICBpbnRlcnJ1cHQuIFRoZSBIUFQzNDMgY2hpcHNldCBpbiBpdHMgY3VycmVudCBmb3JtIGlzIGEgbm9uLWJvb3RhYmxlCisJICBjb250cm9sbGVyOyB0aGUgSFBUMzQ1L0hQVDM2MyBjaGlwc2V0IGlzIGEgYm9vdGFibGUgKG5lZWRzIEJJT1MgRklYKQorCSAgUENJIFVETUEgY29udHJvbGxlcnMuIFRoaXMgZHJpdmVyIHJlcXVpcmVzIGR5bmFtaWMgdHVuaW5nIG9mIHRoZQorCSAgY2hpcHNldCBkdXJpbmcgdGhlIGlkZS1wcm9iZSBhdCBib290IHRpbWUuIEl0IGlzIHJlcG9ydGVkIHRvIHN1cHBvcnQKKwkgIERWRCBJSSBkcml2ZXMsIGJ5IHRoZSBtYW51ZmFjdHVyZXIuCisKK2NvbmZpZyBIUFQzNFhfQVVUT0RNQQorCWJvb2wgIkhQVDM0WCBBVVRPRE1BIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBCTEtfREVWX0hQVDM0WCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGlzIGEgZGFuZ2Vyb3VzIHRoaW5nIHRvIGF0dGVtcHQgY3VycmVudGx5ISBQbGVhc2UgcmVhZCB0aGUKKwkgIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL2hwdDM0eC5jPi4gIElmIHlvdSBzYXkgWQorCSAgaGVyZSwgdGhlbiBzYXkgWSB0byAiVXNlIERNQSBieSBkZWZhdWx0IHdoZW4gYXZhaWxhYmxlIiBhcyB3ZWxsLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQkxLX0RFVl9IUFQzNjYKKwl0cmlzdGF0ZSAiSFBUMzZYLzM3WCBjaGlwc2V0IHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgSFBUMzY2IGlzIGFuIFVsdHJhIERNQSBjaGlwc2V0IGZvciBBVEEtNjYuCisJICBIUFQzNjggaXMgYW4gVWx0cmEgRE1BIGNoaXBzZXQgZm9yIEFUQS02NiBSQUlEIEJhc2VkLgorCSAgSFBUMzcwIGlzIGFuIFVsdHJhIERNQSBjaGlwc2V0IGZvciBBVEEtMTAwLgorCSAgSFBUMzcyIGlzIGFuIFVsdHJhIERNQSBjaGlwc2V0IGZvciBBVEEtMTAwLgorCSAgSFBUMzc0IGlzIGFuIFVsdHJhIERNQSBjaGlwc2V0IGZvciBBVEEtMTAwLgorCisJICBUaGlzIGRyaXZlciBhZGRzIHVwIHRvIDQgbW9yZSBFSURFIGRldmljZXMgc2hhcmluZyBhIHNpbmdsZQorCSAgaW50ZXJydXB0LgorCisJICBUaGUgSFBUMzY2IGNoaXBzZXQgaW4gaXRzIGN1cnJlbnQgZm9ybSBpcyBib290YWJsZS4gT25lIHNvbHV0aW9uCisJICBmb3IgdGhpcyBwcm9ibGVtIGFyZSBzcGVjaWFsIExJTE8gY29tbWFuZHMgZm9yIHJlZGlyZWN0aW5nIHRoZQorCSAgcmVmZXJlbmNlIHRvIGRldmljZSAweDgwLiBUaGUgb3RoZXIgc29sdXRpb24gaXMgdG8gc2F5IFkgdG8gIkJvb3QKKwkgIG9mZi1ib2FyZCBjaGlwc2V0cyBmaXJzdCBzdXBwb3J0IiAoQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQpIHVubGVzcworCSAgeW91ciBtb3RoZXIgYm9hcmQgaGFzIHRoZSBjaGlwc2V0IG5hdGl2ZWx5IG1vdW50ZWQuIFJlZ2FyZGxlc3Mgb25lCisJICBzaG91bGQgdXNlIHRoZSBmb3JlIG1lbnRpb25lZCBvcHRpb24gYW5kIGNhbGwgYXQgTElMTyBvciBpbmNsdWRlCisJICAiaWRlPXJldmVyc2UiIGluIExJTE8ncyBhcHBlbmQtbGluZS4KKworCSAgVGhpcyBkcml2ZXIgcmVxdWlyZXMgZHluYW1pYyB0dW5pbmcgb2YgdGhlIGNoaXBzZXQgZHVyaW5nIHRoZQorCSAgaWRlLXByb2JlIGF0IGJvb3QuIEl0IGlzIHJlcG9ydGVkIHRvIHN1cHBvcnQgRFZEIElJIGRyaXZlcywgYnkgdGhlCisJICBtYW51ZmFjdHVyZXIuCisKK2NvbmZpZyBCTEtfREVWX1NDMTIwMAorCXRyaXN0YXRlICJOYXRpb25hbCBTQ3gyMDAgY2hpcHNldCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGJ1aWx0IGluIElERSBvbiB0aGUgTmF0aW9uYWwKKwkgIFNDeDIwMCBzZXJpZXMgb2YgZW1iZWRkZWQgeDg2ICJHZW9kZSIgc3lzdGVtcworCitjb25maWcgQkxLX0RFVl9QSUlYCisJdHJpc3RhdGUgIkludGVsIFBJSVhuIGNoaXBzZXRzIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBleHBsaWNpdCBzdXBwb3J0IGZvciBJbnRlbCBQSUlYIGFuZCBJQ0ggY2hpcHMKKwkgIGFuZCBhbHNvIGZvciB0aGUgRWZhciBWaWN0b3J5NjYgKHNsYzkwZTY2KSBjaGlwLiAgVGhpcyBhbGxvd3MKKwkgIHRoZSBrZXJuZWwgdG8gY2hhbmdlIFBJTywgRE1BIGFuZCBVRE1BIHNwZWVkcyBhbmQgdG8gY29uZmlndXJlCisJICB0aGUgY2hpcCB0byBvcHRpbXVtIHBlcmZvcm1hbmNlLgorCitjb25maWcgQkxLX0RFVl9JVDgxNzIKKwlib29sICJJVDgxNzIgSURFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoTUlQU19JVEU4MTcyIHx8IE1JUFNfSVZSKQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgb24tYm9hcmQgSURFIGNvbnRyb2xsZXIgb24gdGhlIEludGVncmF0ZWQKKwkgIFRlY2hub2xvZ3kgRXhwcmVzcywgSW5jLiBJVEU4MTcyIFNCQy4gIFZlbmRvciBwYWdlIGF0CisJICA8aHR0cDovL3d3dy5pdGUuY29tLnR3L2lhL2JyaWVmX2l0ODE3MmJzcC5odG0+OyBwaWN0dXJlIG9mIHRoZQorCSAgYm9hcmQgYXQgPGh0dHA6Ly93d3cubXZpc3RhLmNvbS9wYXJ0bmVycy9zZW1pY29uZHVjdG9yL2l0ZS5odG1sPi4KKworY29uZmlnIEJMS19ERVZfTlM4NzQxNQorCXRyaXN0YXRlICJOUzg3NDE1IGNoaXBzZXQgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIGRldGVjdGlvbiBhbmQgc3VwcG9ydCBmb3IgdGhlIE5TODc0MTUgY2hpcAorCSAgKHVzZWQgaW4gU1BBUkM2NCwgYW1vbmcgb3RoZXJzKS4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYz4uCisKK2NvbmZpZyBCTEtfREVWX1BEQzIwMlhYX09MRAorCXRyaXN0YXRlICJQUk9NSVNFIFBEQzIwMns0Nnw2Mnw2NXw2N30gc3VwcG9ydCIKKwloZWxwCisJICBQcm9taXNlIFVsdHJhMzMgb3IgUERDMjAyNDYKKwkgIFByb21pc2UgVWx0cmE2NiBvciBQREMyMDI2MgorCSAgUHJvbWlzZSBVbHRyYTEwMCBvciBQREMyMDI2NS9QREMyMDI2Ny9QREMyMDI2OAorCisJICBUaGlzIGRyaXZlciBhZGRzIHVwIHRvIDQgbW9yZSBFSURFIGRldmljZXMgc2hhcmluZyBhIHNpbmdsZQorCSAgaW50ZXJydXB0LiBUaGlzIGFkZC1vbiBjYXJkIGlzIGEgYm9vdGFibGUgUENJIFVETUEgY29udHJvbGxlci4gU2luY2UKKwkgIG11bHRpcGxlIGNhcmRzIGNhbiBiZSBpbnN0YWxsZWQgYW5kIHRoZXJlIGFyZSBCSU9TIFJPTSBwcm9ibGVtcyB0aGF0CisJICBoYXBwZW4gaWYgdGhlIEJJT1MgcmV2aXNpb25zIG9mIGFsbCBpbnN0YWxsZWQgY2FyZHMgKHRocmVlLW1heCkgZG8KKwkgIG5vdCBtYXRjaCwgdGhlIGRyaXZlciBhdHRlbXB0cyB0byBkbyBkeW5hbWljIHR1bmluZyBvZiB0aGUgY2hpcHNldAorCSAgYXQgYm9vdC10aW1lIGZvciBtYXgtc3BlZWQuICBVbHRyYTMzIEJJT1MgMS4yNSBvciBuZXdlciBpcyByZXF1aXJlZAorCSAgZm9yIG1vcmUgdGhhbiBvbmUgY2FyZC4gVGhpcyBjYXJkIG1heSByZXF1aXJlIHRoYXQgeW91IHNheSBZIHRvCisJICAiU3BlY2lhbCBVRE1BIEZlYXR1cmUiLgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gc2F5IFkgdG8gIlVzZSBETUEgYnkgZGVmYXVsdCB3aGVuCisJICBhdmFpbGFibGUiIGFzIHdlbGwuCisKKwkgIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCisJICA8ZmlsZTpkcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfb2xkLmM+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUERDMjAyWFhfQlVSU1QKKwlib29sICJTcGVjaWFsIFVETUEgRmVhdHVyZSIKKwlkZXBlbmRzIG9uIEJMS19ERVZfUERDMjAyWFhfT0xECisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIHRoZSBwZGMyMDJ4eCBkcml2ZXIgdG8gZW5hYmxlIFVETUEgbW9kZXMgb24gdGhlCisJICBQREMyMDJ4eCBldmVuIHdoZW4gdGhlIFBEQzIwMnh4IEJJT1MgaGFzIG5vdCBkb25lIHNvLgorCisJICBJdCB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgdGhlIFBEQzIwMjQ2L1VsdHJhMzMsIHdob3NlIEJJT1Mgd2lsbAorCSAgb25seSBzZXR1cCBVRE1BIG9uIHRoZSBmaXJzdCB0d28gUERDMjAyNDYgY2FyZHMuICBJdCBoYXMgYWxzbyBiZWVuCisJICB1c2VkIHN1Y2Nlc2Z1bGx5IG9uIGEgUERDMjAyNjUvVWx0cmExMDAsIGFsbG93aW5nIHVzZSBvZiBVRE1BIG1vZGVzCisJICB3aGVuIHRoZSBQREMyMDI2NSBCSU9TIGhhcyBiZWVuIGRpc2FibGVkIChmb3IgZmFzdGVyIGJvb3QgdXApLgorCisJICBQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZgorCSAgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jPi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJMS19ERVZfUERDMjAyWFhfTkVXCisJdHJpc3RhdGUgIlBST01JU0UgUERDMjAyezY4fDY5fDcwfDcxfDc1fDc2fDc3fSBzdXBwb3J0IgorCisjIEZJWE1FIC0gcHJvYmFibHkgd2FudHMgdG8gYmUgb25lIGZvciBvbGQgYW5kIGZvciBuZXcKK2NvbmZpZyBQREMyMDJYWF9GT1JDRQorCWJvb2wgIkVuYWJsZSBjb250cm9sbGVyIGV2ZW4gaWYgZGlzYWJsZWQgYnkgQklPUyIKKwlkZXBlbmRzIG9uIEJMS19ERVZfUERDMjAyWFhfTkVXCisJaGVscAorCSAgRW5hYmxlIHRoZSBQREMyMDJ4eCBjb250cm9sbGVyIGV2ZW4gaWYgaXQgaGFzIGJlZW4gZGlzYWJsZWQgaW4gdGhlIEJJT1Mgc2V0dXAuCisKK2NvbmZpZyBCTEtfREVWX1NWV0tTCisJdHJpc3RhdGUgIlNlcnZlcldvcmtzIE9TQjQvQ1NCNS9DU0I2IGNoaXBzZXRzIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBQSU8vKFUpRE1BIHN1cHBvcnQgZm9yIHRoZSBTZXJ2ZXJXb3JrcyBPU0I0L0NTQjUKKwkgIGNoaXBzZXRzLgorCitjb25maWcgQkxLX0RFVl9TR0lJT0M0CisJdHJpc3RhdGUgIlNpbGljb24gR3JhcGhpY3MgSU9DNCBjaGlwc2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJQTY0X1NHSV9TTjIgfHwgSUE2NF9HRU5FUklDCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBQSU8gJiBNdWx0aU1vZGUgRE1BLTIgc3VwcG9ydCBmb3IgdGhlIFNHSSBJT0M0CisJICBjaGlwc2V0LCB3aGljaCBoYXMgb25lIGNoYW5uZWwgYW5kIGNhbiBzdXBwb3J0IHR3byBkZXZpY2VzLgorCSAgUGxlYXNlIHNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQWx0aXggU3lzdGVtIGZyb20gU0dJLgorCitjb25maWcgQkxLX0RFVl9TSUlNQUdFCisJdHJpc3RhdGUgIlNpbGljb24gSW1hZ2UgY2hpcHNldCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgUElPLyhVKURNQSBzdXBwb3J0IGZvciB0aGUgU0kgQ01ENjgwIGFuZCBTSUkKKwkgIDMxMTIgKFNlcmlhbCBBVEEpIGNoaXBzLgorCitjb25maWcgQkxLX0RFVl9TSVM1NTEzCisJdHJpc3RhdGUgIlNpUzU1MTMgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgZW5zdXJlcyAoVSlETUEgc3VwcG9ydCBmb3IgU0lTNTUxMyBjaGlwc2V0IGZhbWlseSBiYXNlZAorCSAgbWFpbmJvYXJkcy4KKworCSAgVGhlIGZvbGxvd2luZyBjaGlwc2V0cyBhcmUgc3VwcG9ydGVkOgorCSAgQVRBMTY6ICBTaVM1NTExLCBTaVM1NTEzCisJICBBVEEzMzogIFNpUzU1OTEsIFNpUzU1OTcsIFNpUzU1OTgsIFNpUzU2MDAKKwkgIEFUQTY2OiAgU2lTNTMwLCBTaVM1NDAsIFNpUzYyMCwgU2lTNjMwLCBTaVM2NDAKKwkgIEFUQTEwMDogU2lTNjM1LCBTaVM2NDUsIFNpUzY1MCwgU2lTNzMwLCBTaVM3MzUsIFNpUzc0MCwKKwkgIFNpUzc0NSwgU2lTNzUwCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzYXkgWSB0byAiVXNlIERNQSBieSBkZWZhdWx0IHdoZW4KKwkgIGF2YWlsYWJsZSIgYXMgd2VsbC4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL3NpczU1MTMuYz4uCisKK2NvbmZpZyBCTEtfREVWX1NMQzkwRTY2CisJdHJpc3RhdGUgIlNMQzkwRTY2IGNoaXBzZXQgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGRyaXZlciBlbnN1cmVzIChVKURNQSBzdXBwb3J0IGZvciBWaWN0cm95NjYgU291dGhCcmlkZ2VzIGZvcgorCSAgU01zQyB3aXRoIEludGVsIE5vcnRoQnJpZGdlcy4gIFRoaXMgaXMgYW4gVWx0cmE2NiBiYXNlZCBjaGlwc2V0LgorCSAgVGhlIG5pY2UgdGhpbmcgYWJvdXQgaXQgaXMgdGhhdCB5b3UgY2FuIG1peCBVbHRyYS9ETUEvUElPIGRldmljZXMKKwkgIGFuZCBpdCB3aWxsIGhhbmRsZSB0aW1pbmcgY3ljbGVzLiAgU2luY2UgdGhpcyBpcyBhbiBpbXByb3ZlZAorCSAgbG9vay1hLWxpa2UgdG8gdGhlIFBJSVg0IGl0IHNob3VsZCBiZSBhIG5pY2UgYWRkaXRpb24uCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzYXkgWSB0byAiVXNlIERNQSBieSBkZWZhdWx0IHdoZW4KKwkgIGF2YWlsYWJsZSIgYXMgd2VsbC4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKKwkgIDxmaWxlOmRyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jPi4KKworY29uZmlnIEJMS19ERVZfVFJNMjkwCisJdHJpc3RhdGUgIlRla3JhbSBUUk0yOTAgY2hpcHNldCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYnVzIG1hc3RlciBETUEgdHJhbnNmZXJzCisJICB1c2luZyB0aGUgVGVrcmFtIFRSTTI5MCBQQ0kgSURFIGNoaXAuIFZvbHVudGVlcnMgYXJlCisJICBuZWVkZWQgZm9yIGZ1cnRoZXIgdHdlYWtpbmcgYW5kIGRldmVsb3BtZW50LgorCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9pZGUvcGNpL3RybTI5MC5jPi4KKworY29uZmlnIEJMS19ERVZfVklBODJDWFhYCisJdHJpc3RhdGUgIlZJQTgyQ1hYWCBjaGlwc2V0IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBleHBsaWNpdCBzdXBwb3J0IGZvciBWSUEgQnVzTWFzdGVyaW5nIElERSBjaGlwcy4KKwkgIFRoaXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hhbmdlIFBJTywgRE1BIGFuZCBVRE1BIHNwZWVkcyBhbmQgdG8KKwkgIGNvbmZpZ3VyZSB0aGUgY2hpcCB0byBvcHRpbXVtIHBlcmZvcm1hbmNlLgorCitlbmRpZgorCitjb25maWcgQkxLX0RFVl9JREVfUE1BQworCWJvb2wgIkJ1aWx0aW4gUG93ZXJNYWMgSURFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBJREU9eQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBidWlsdC1pbiBJREUgY29udHJvbGxlciBvbgorCSAgbW9zdCBvZiB0aGUgcmVjZW50IEFwcGxlIFBvd2VyIE1hY2ludG9zaGVzIGFuZCBQb3dlckJvb2tzLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEJMS19ERVZfSURFX1BNQUNfQVRBMTAwRklSU1QKKwlib29sICJQcm9iZSBpbnRlcm5hbCBBVEEvMTAwIChLYXVhaSkgZmlyc3QiCisJZGVwZW5kcyBvbiBCTEtfREVWX0lERV9QTUFDCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgQVRBLzEwMCBjb250cm9sbGVyIGZvdW5kIGluIFVuaU5vcnRoMgorCSAgYmFzZWQgbWFjaGluZXMgKFdpbmR0dW5uZWwgUG93ZXJNYWMsIEFsdW1pbml1bSBQb3dlckJvb2tzLCAuLi4pCisJICB0byBiZSBwcm9iZWQgYmVmb3JlIHRoZSBBVEEvNjYgYW5kIEFUQS8zMyBjb250cm9sbGVycy4gV2l0aG91dAorCSAgdGhlc2UsIHRob3NlIG1hY2hpbmUgdXNlZCB0byBoYXZlIHRoZSBoYXJkIGRpc2sgb24gaGRjIGFuZCB0aGUKKwkgIENELVJPTSBvbiBoZGEuIFRoaXMgb3B0aW9uIGNoYW5nZXMgdGhpcyB0byBtb3JlIG5hdHVyYWwgaGRhIGZvcgorCSAgaGFyZCBkaXNrIGFuZCBoZGMgZm9yIENELVJPTS4KKworY29uZmlnIEJMS19ERVZfSURFRE1BX1BNQUMKKwlib29sICJQb3dlck1hYyBJREUgRE1BIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCTEtfREVWX0lERV9QTUFDCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBkcml2ZXIgZm9yIHRoZSBidWlsdC1pbiBJREUgY29udHJvbGxlciBvbgorCSAgUG93ZXIgTWFjaW50b3NoZXMgYW5kIFBvd2VyQm9va3MgdG8gdXNlIERNQSAoZGlyZWN0IG1lbW9yeSBhY2Nlc3MpCisJICB0byB0cmFuc2ZlciBkYXRhIHRvIGFuZCBmcm9tIG1lbW9yeS4gIFNheWluZyBZIGlzIHNhZmUgYW5kIGltcHJvdmVzCisJICBwZXJmb3JtYW5jZS4KKworY29uZmlnIEJMS19ERVZfSURFX1BNQUNfQkxJTksKKwlib29sICJCbGluayBsYXB0b3AgTEVEIG9uIGRyaXZlIGFjdGl2aXR5IgorCWRlcGVuZHMgb24gQkxLX0RFVl9JREVfUE1BQyAmJiBBREJfUE1VCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBzbGVlcCBMRUQgYXMgYSBoYXJkIGRyaXZlCisJICBhY3Rpdml0eSBMRUQuCisKK2NvbmZpZyBJREVfQVJNCisJZGVmX2Jvb2wgQVJNICYmIChBUkNIX0E1SyB8fCBBUkNIX0NMUFM3NTAwIHx8IEFSQ0hfUlBDIHx8IEFSQ0hfU0hBUkspCisKK2NvbmZpZyBCTEtfREVWX0lERV9JQ1NJREUKKwl0cmlzdGF0ZSAiSUNTIElERSBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX0FDT1JOCisJaGVscAorCSAgT24gQWNvcm4gc3lzdGVtcywgc2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIElDUyBJREUKKwkgIGludGVyZmFjZSBjYXJkLiAgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIElDUyBwYXJ0aXRpb24gc3VwcG9ydC4KKwkgIElmIHlvdSBhcmUgdW5zdXJlLCBzYXkgTiB0byB0aGlzLgorCitjb25maWcgQkxLX0RFVl9JREVETUFfSUNTCisJYm9vbCAiSUNTIERNQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQkxLX0RFVl9JREVfSUNTSURFCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhZGQgRE1BIChEaXJlY3QgTWVtb3J5IEFjY2Vzcykgc3VwcG9ydCB0bworCSAgdGhlIElDUyBJREUgZHJpdmVyLgorCitjb25maWcgSURFRE1BX0lDU19BVVRPCisJYm9vbCAiVXNlIElDUyBETUEgYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIEJMS19ERVZfSURFRE1BX0lDUworCWhlbHAKKwkgIFByaW9yIHRvIGtlcm5lbCB2ZXJzaW9uIDIuMS4xMTIsIExpbnV4IHVzZWQgdG8gYXV0b21hdGljYWxseSB1c2UKKwkgIERNQSBmb3IgSURFIGRyaXZlcyBhbmQgY2hpcHNldHMgd2hpY2ggc3VwcG9ydCBpdC4gRHVlIHRvIGNvbmNlcm5zCisJICBhYm91dCBhIGNvdXBsZSBvZiBjYXNlcyB3aGVyZSBidWdneSBoYXJkd2FyZSBtYXkgaGF2ZSBjYXVzZWQgZGFtYWdlLAorCSAgdGhlIGRlZmF1bHQgaXMgbm93IHRvIE5PVCB1c2UgRE1BIGF1dG9tYXRpY2FsbHkuIFRvIHJldmVydCB0byB0aGUKKwkgIHByZXZpb3VzIGJlaGF2aW91ciwgc2F5IFkgdG8gdGhpcyBxdWVzdGlvbi4KKworCSAgSWYgeW91IHN1c3BlY3QgeW91ciBoYXJkd2FyZSBpcyBhdCBhbGwgZmxha2V5LCBzYXkgTiBoZXJlLgorCSAgRG8gTk9UIGVtYWlsIHRoZSBJREUga2VybmVsIHBlb3BsZSByZWdhcmRpbmcgdGhpcyBpc3N1ZSEKKworY29uZmlnIEJMS19ERVZfSURFX1JBUElERQorCXRyaXN0YXRlICJSYXBJREUgaW50ZXJmYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUk0gJiYgQVJDSF9BQ09STgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCB0aGUgWWVsbG93c3RvbmUgUmFwSURFIGNvbnRyb2xsZXIKKwkgIG1hbnVmYWN0dXJlZCBmb3IgdXNlIHdpdGggQWNvcm4gY29tcHV0ZXJzLgorCitjb25maWcgQkxLX0RFVl9JREVfQkFTVAorCXRyaXN0YXRlICJTaW10ZWMgQkFTVCAvIFRob3Jjb20gVlIxMDAwIElERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJNICYmIChBUkNIX0JBU1QgfHwgTUFDSF9WUjEwMDApCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoZSBvbmJvYXJkIElERSBjaGFubmVscyBvbiB0aGUKKwkgIFNpbXRlYyBCQVNUIG9yIHRoZSBUaG9yY29tIFZSMTAwMAorCitjb25maWcgQkxLX0RFVl9HQVlMRQorCWJvb2wgIkFtaWdhIEdheWxlIElERSBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFNSUdBCisJaGVscAorCSAgVGhpcyBpcyB0aGUgSURFIGRyaXZlciBmb3IgdGhlIEFtaWdhIEdheWxlIElERSBpbnRlcmZhY2UuIEl0IHN1cHBvcnRzCisJICBib3RoIHRoZSBgQTEyMDAgc3R5bGUnIGFuZCBgQTQwMDAgc3R5bGUnIG9mIHRoZSBHYXlsZSBJREUgaW50ZXJmYWNlLAorCSAgVGhpcyBpbmNsdWRlcyBidWlsdGluIElERSBpbnRlcmZhY2VzIG9uIHNvbWUgQW1pZ2EgbW9kZWxzIChBNjAwLAorCSAgQTEyMDAsIEE0MDAwLCBhbmQgQTQwMDBUKSwgYW5kIElERSBpbnRlcmZhY2VzIG9uIHRoZSBab3JybyBleHBhbnNpb24KKwkgIGJ1cyAoTS1UZWNoIEUtTWF0cml4IDUzMCBleHBhbnNpb24gY2FyZCkuCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhbiBBbWlnYSB3aXRoIGEgR2F5bGUgSURFIGludGVyZmFjZSBhbmQgd2FudCB0byB1c2UKKwkgIElERSBkZXZpY2VzIChoYXJkIGRpc2tzLCBDRC1ST00gZHJpdmVzLCBldGMuKSB0aGF0IGFyZSBjb25uZWN0ZWQgdG8KKwkgIGl0LgorCSAgTm90ZSB0aGF0IHlvdSBhbHNvIGhhdmUgdG8gZW5hYmxlIFpvcnJvIGJ1cyBzdXBwb3J0IGlmIHlvdSB3YW50IHRvCisJICB1c2UgR2F5bGUgSURFIGludGVyZmFjZXMgb24gdGhlIFpvcnJvIGV4cGFuc2lvbiBidXMuCisKK2NvbmZpZyBCTEtfREVWX0lERURPVUJMRVIKKwlib29sICJBbWlnYSBJREUgRG91YmxlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQkxLX0RFVl9HQVlMRSAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgc28tY2FsbGVkIGBJREUgZG91YmxlcnMnIChtYWRlCisJICBieSB2YXJpb3VzIG1hbnVmYWN0dXJlcnMsIGUuZy4gRXlldGVjaCkgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZQorCSAgYnVpbHRpbiBJREUgaW50ZXJmYWNlIG9mIHNvbWUgQW1pZ2EgbW9kZWxzLiBVc2luZyBzdWNoIGFuIElERQorCSAgZG91YmxlciwgeW91IGNhbiBjb25uZWN0IHVwIHRvIGZvdXIgaW5zdGVhZCBvZiB0d28gSURFIGRldmljZXMgb24KKwkgIHRoZSBBbWlnYSdzIGJ1aWx0aW4gSURFIGludGVyZmFjZS4KKworCSAgTm90ZSB0aGF0IHRoZSBub3JtYWwgQW1pZ2EgR2F5bGUgSURFIGRyaXZlciBtYXkgbm90IHdvcmsgY29ycmVjdGx5CisJICBpZiB5b3UgaGF2ZSBhbiBJREUgZG91YmxlciBhbmQgZG9uJ3QgZW5hYmxlIHRoaXMgZHJpdmVyIQorCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhbiBJREUgZG91Ymxlci4gIFRoZSBkcml2ZXIgaXMgZW5hYmxlZCBhdCBrZXJuZWwKKwkgIHJ1bnRpbWUgdXNpbmcgdGhlICJpZGU9ZG91YmxlciIga2VybmVsIGJvb3QgcGFyYW1ldGVyLgorCitjb25maWcgQkxLX0RFVl9CVURESEEKKwlib29sICJCdWRkaGEvQ2F0d2Vhc2VsL1gtU3VyZiBJREUgaW50ZXJmYWNlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBaT1JSTyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGlzIHRoZSBJREUgZHJpdmVyIGZvciB0aGUgSURFIGludGVyZmFjZXMgb24gdGhlIEJ1ZGRoYSwgCisJICBDYXR3ZWFzZWwgYW5kIFgtU3VyZiBleHBhbnNpb24gYm9hcmRzLiAgSXQgc3VwcG9ydHMgdXAgdG8gdHdvIGludGVyZmFjZXMgCisJICBvbiB0aGUgQnVkZGhhLCB0aHJlZSBvbiB0aGUgQ2F0d2Vhc2VsIGFuZCB0d28gb24gdGhlIFgtU3VyZi4KKworCSAgU2F5IFkgaWYgeW91IGhhdmUgYSBCdWRkaGEgb3IgQ2F0d2Vhc2VsIGV4cGFuc2lvbiBib2FyZCBhbmQgd2FudCB0bworCSAgdXNlIElERSBkZXZpY2VzIChoYXJkIGRpc2tzLCBDRC1ST00gZHJpdmVzLCBldGMuKSB0aGF0IGFyZSBjb25uZWN0ZWQKKwkgIHRvIG9uZSBvZiBpdHMgSURFIGludGVyZmFjZXMuCisKK2NvbmZpZyBCTEtfREVWX0ZBTENPTl9JREUKKwlib29sICJGYWxjb24gSURFIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVRBUkkKKwloZWxwCisJICBUaGlzIGlzIHRoZSBJREUgZHJpdmVyIGZvciB0aGUgYnVpbHRpbiBJREUgaW50ZXJmYWNlIG9uIHRoZSBBdGFyaQorCSAgRmFsY29uLiBTYXkgWSBpZiB5b3UgaGF2ZSBhIEZhbGNvbiBhbmQgd2FudCB0byB1c2UgSURFIGRldmljZXMgKGhhcmQKKwkgIGRpc2tzLCBDRC1ST00gZHJpdmVzLCBldGMuKSB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGJ1aWx0aW4gSURFCisJICBpbnRlcmZhY2UuCisKK2NvbmZpZyBCTEtfREVWX01BQ19JREUKKwlib29sICJNYWNpbnRvc2ggUXVhZHJhL1Bvd2VyYm9vayBJREUgaW50ZXJmYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQUMKKwloZWxwCisJICBUaGlzIGlzIHRoZSBJREUgZHJpdmVyIGZvciB0aGUgYnVpbHRpbiBJREUgaW50ZXJmYWNlIG9uIHNvbWUgbTY4aworCSAgTWFjaW50b3NoIG1vZGVscy4gSXQgc3VwcG9ydHMgYm90aCB0aGUgYFF1YWRyYSBzdHlsZScgKHVzZWQgaW4KKwkgIFF1YWRyYS8gQ2VudHJpcyA2MzAgYW5kIFBlcmZvcm1hIDU4OCBtb2RlbHMpIGFuZCBgUG93ZXJib29rIHN0eWxlJworCSAgKHVzZWQgaW4gdGhlIFBvd2VyYm9vayAxNTAgYW5kIDE5MCBtb2RlbHMpIElERSBpbnRlcmZhY2UuCisKKwkgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYW4gTWFjaW50b3NoIG1vZGVsIGFuZCB3YW50IHRvIHVzZSBJREUKKwkgIGRldmljZXMgKGhhcmQgZGlza3MsIENELVJPTSBkcml2ZXMsIGV0Yy4pIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUKKwkgIGJ1aWx0aW4gSURFIGludGVyZmFjZS4KKworY29uZmlnIEJMS19ERVZfUTQwSURFCisJYm9vbCAiUTQwL1E2MCBJREUgaW50ZXJmYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBRNDAKKwloZWxwCisJICBFbmFibGUgdGhlIG9uLWJvYXJkIElERSBjb250cm9sbGVyIGluIHRoZSBRNDAvUTYwLiAgVGhpcyBzaG91bGQKKwkgIG5vcm1hbGx5IGJlIG9uOyBkaXNhYmxlIGl0IG9ubHkgaWYgeW91IGFyZSBydW5uaW5nIGEgY3VzdG9tIGhhcmQKKwkgIGRyaXZlIHN1YnN5c3RlbSB0aHJvdWdoIGFuIGV4cGFuc2lvbiBjYXJkLgorCitjb25maWcgQkxLX0RFVl9NUEM4eHhfSURFCisJYm9vbCAiTVBDOHh4IElERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gOHh4CisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3IgSURFIG9uIE1vdG9yb2xhIE1QQzh4eCBTeXN0ZW1zLgorCSAgUGxlYXNlIHNlZSAnVHlwZSBvZiBNUEM4eHggSURFIGludGVyZmFjZScgZm9yIGRldGFpbHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2Nob2ljZQorCXByb21wdCAiVHlwZSBvZiBNUEM4eHggSURFIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEJMS19ERVZfTVBDOHh4X0lERQorCWRlZmF1bHQgSURFXzh4eF9QQ0NBUkQKKworY29uZmlnIElERV84eHhfUENDQVJECisJYm9vbCAiOHh4X1BDQ0FSRCIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgaG93IHRoZSBJREUgZGV2aWNlcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBNUEM4eHggc3lzdGVtOgorCisJICA4eHhfUENDQVJEIHVzZXMgdGhlIDh4eCBpbnRlcm5hbCBQQ01DSUEgaW50ZXJmYWNlIGluIGNvbWJpbmF0aW9uCisJICB3aXRoIGEgUEMgQ2FyZCAoZS5nLiBBUkdPU1kgcG9ydGFibGUgSGFyZCBEaXNrIEFkYXB0ZXIpLAorCSAgQVRBIFBDIENhcmQgSEREcyBvciBBVEEgUEMgRmxhc2ggQ2FyZHMgKGV4YW1wbGU6IFRRTTh4eEwKKwkgIHN5c3RlbXMpCisKKwkgIDh4eF9ESVJFQ1QgaXMgdXNlZCBmb3IgZGlyZWN0bHkgY29ubmVjdGVkIElERSBkZXZpY2VzIHVzaW5nIHRoZSA4eHgKKwkgIGludGVybmFsIFBDTUNJQSBpbnRlcmZhY2UgKGV4YW1wbGU6IElWTVM4IHN5c3RlbXMpCisKKwkgIEVYVF9ESVJFQ1QgaXMgdXNlZCBmb3IgSURFIGRldmljZXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSA4eHgKKwkgIGJ1cyB1c2luZyBzb21lIGdsdWUgbG9naWMsIGJ1dCBfbm90XyB0aGUgOHh4IGludGVybmFsCisJICBQQ01DSUEgaW50ZXJmYWNlIChleGFtcGxlOiBJRElGODYwIHN5c3RlbXMpCisKK2NvbmZpZyBJREVfOHh4X0RJUkVDVAorCWJvb2wgIjh4eF9ESVJFQ1QiCisKK2NvbmZpZyBJREVfRVhUX0RJUkVDVAorCWJvb2wgIkVYVF9ESVJFQ1QiCisKK2VuZGNob2ljZQorCisjIG5vIGlzYSAtPiBubyB2bGIKK2NvbmZpZyBJREVfQ0hJUFNFVFMKKwlib29sICJPdGhlciBJREUgY2hpcHNldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGVuaGFuY2VkIHN1cHBvcnQgZm9yIHZhcmlvdXMgSURFCisJICBpbnRlcmZhY2UgY2hpcHNldHMgdXNlZCBvbiBtb3RoZXJib2FyZHMgYW5kIGFkZC1vbiBjYXJkcy4gWW91IGNhbgorCSAgdGhlbiBwaWNrIHlvdXIgcGFydGljdWxhciBJREUgY2hpcCBmcm9tIGFtb25nIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KKwkgIFRoaXMgZW5oYW5jZWQgc3VwcG9ydCBtYXkgYmUgbmVjZXNzYXJ5IGZvciBMaW51eCB0byBiZSBhYmxlIHRvCisJICBhY2Nlc3MgdGhlIDNyZC80dGggZHJpdmVzIGluIHNvbWUgc3lzdGVtcy4gSXQgbWF5IGFsc28gZW5hYmxlCisJICBzZXR0aW5nIG9mIGhpZ2hlciBzcGVlZCBJL08gcmF0ZXMgdG8gaW1wcm92ZSBzeXN0ZW0gcGVyZm9ybWFuY2Ugd2l0aAorCSAgdGhlc2UgY2hpcHNldHMuIE1vc3Qgb2YgdGhlc2UgYWxzbyByZXF1aXJlIHNwZWNpYWwga2VybmVsIGJvb3QKKwkgIHBhcmFtZXRlcnMgdG8gYWN0dWFsbHkgdHVybiBvbiB0aGUgc3VwcG9ydCBhdCBydW50aW1lOyB5b3UgY2FuIGZpbmQKKwkgIGEgbGlzdCBvZiB0aGVzZSBpbiB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+LgorCisJICBQZW9wbGUgd2l0aCBTQ1NJLW9ubHkgc3lzdGVtcyBjYW4gc2F5IE4gaGVyZS4KKworaWYgSURFX0NISVBTRVRTCisKK2NvbW1lbnQgIk5vdGU6IG1vc3Qgb2YgdGhlc2UgYWxzbyByZXF1aXJlIHNwZWNpYWwga2VybmVsIGJvb3QgcGFyYW1ldGVycyIKKworY29uZmlnIEJMS19ERVZfNERSSVZFUworCWJvb2wgIkdlbmVyaWMgNCBkcml2ZXMvcG9ydCBzdXBwb3J0IgorCWhlbHAKKwkgIENlcnRhaW4gb2xkZXIgY2hpcHNldHMsIGluY2x1ZGluZyB0aGUgVGVrcmFtIDY5MENELCB1c2UgYSBzaW5nbGUgc2V0CisJICBvZiBJL08gcG9ydHMgYXQgMHgxZjAgdG8gY29udHJvbCB1cCB0byBmb3VyIGRyaXZlcywgaW5zdGVhZCBvZiB0aGUKKwkgIGN1c3RvbWFyeSB0d28gZHJpdmVzIHBlciBwb3J0LiBTdXBwb3J0IGZvciB0aGlzIGNhbiBiZSBlbmFibGVkIGF0CisJICBydW50aW1lIHVzaW5nIHRoZSAiaWRlMD1mb3VyIiBrZXJuZWwgYm9vdCBwYXJhbWV0ZXIgaWYgeW91IHNheSBZCisJICBoZXJlLgorCitjb25maWcgQkxLX0RFVl9BTEkxNFhYCisJdHJpc3RhdGUgIkFMSSBNMTR4eCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImlkZTA9YWxpMTR4eCIga2VybmVsCisJICBib290IHBhcmFtZXRlci4gIEl0IGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHNlY29uZGFyeSBJREUgaW50ZXJmYWNlCisJICBvZiB0aGUgQUxJIE0xNDM5LzE0NDMvMTQ0NS8xNDg3LzE0ODkgY2hpcHNldHMsIGFuZCBwZXJtaXRzIGZhc3RlcgorCSAgSS9PIHNwZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4gIFNlZSB0aGUgZmlsZXMKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlLnR4dD4gYW5kIDxmaWxlOmRyaXZlcnMvaWRlL2xlZ2FjeS9hbGkxNHh4LmM+IGZvcgorCSAgbW9yZSBpbmZvLgorCitjb25maWcgQkxLX0RFVl9EVEMyMjc4CisJdHJpc3RhdGUgIkRUQy0yMjc4IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZW5hYmxlZCBhdCBydW50aW1lIHVzaW5nIHRoZSAiaWRlMD1kdGMyMjc4IiBrZXJuZWwKKwkgIGJvb3QgcGFyYW1ldGVyLiBJdCBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBzZWNvbmRhcnkgSURFIGludGVyZmFjZQorCSAgb2YgdGhlIERUQy0yMjc4IGNhcmQsIGFuZCBwZXJtaXRzIGZhc3RlciBJL08gc3BlZWRzIHRvIGJlIHNldCBhcworCSAgd2VsbC4gU2VlIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+IGFuZAorCSAgPGZpbGU6ZHJpdmVycy9pZGUvbGVnYWN5L2R0YzIyNzguYz4gZmlsZXMgZm9yIG1vcmUgaW5mby4KKworY29uZmlnIEJMS19ERVZfSFQ2NTYwQgorCXRyaXN0YXRlICJIb2x0ZWsgSFQ2NTYwQiBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImlkZTA9aHQ2NTYwYiIga2VybmVsCisJICBib290IHBhcmFtZXRlci4gSXQgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgc2Vjb25kYXJ5IElERSBpbnRlcmZhY2UKKwkgIG9mIHRoZSBIb2x0ZWsgY2FyZCwgYW5kIHBlcm1pdHMgZmFzdGVyIEkvTyBzcGVlZHMgdG8gYmUgc2V0IGFzIHdlbGwuCisJICBTZWUgdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlLnR4dD4gYW5kCisJICA8ZmlsZTpkcml2ZXJzL2lkZS9sZWdhY3kvaHQ2NTYwYi5jPiBmaWxlcyBmb3IgbW9yZSBpbmZvLgorCitjb25maWcgQkxLX0RFVl9RRDY1WFgKKwl0cmlzdGF0ZSAiUURJIFFENjV4eCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImlkZTA9cWQ2NXh4IiBrZXJuZWwKKwkgIGJvb3QgcGFyYW1ldGVyLiAgSXQgcGVybWl0cyBmYXN0ZXIgSS9PIHNwZWVkcyB0byBiZSBzZXQuICBTZWUgdGhlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lkZS50eHQ+IGFuZCA8ZmlsZTpkcml2ZXJzL2lkZS9sZWdhY3kvcWQ2NXh4LmM+IGZvcgorCSAgbW9yZSBpbmZvLgorCitjb25maWcgQkxLX0RFVl9VTUM4NjcyCisJdHJpc3RhdGUgIlVNQy04NjcyIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZW5hYmxlZCBhdCBydW50aW1lIHVzaW5nIHRoZSAiaWRlMD11bWM4NjcyIiBrZXJuZWwKKwkgIGJvb3QgcGFyYW1ldGVyLiBJdCBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBzZWNvbmRhcnkgSURFIGludGVyZmFjZQorCSAgb2YgdGhlIFVNQy04NjcyLCBhbmQgcGVybWl0cyBmYXN0ZXIgSS9PIHNwZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4KKwkgIFNlZSB0aGUgZmlsZXMgPGZpbGU6RG9jdW1lbnRhdGlvbi9pZGUudHh0PiBhbmQKKwkgIDxmaWxlOmRyaXZlcnMvaWRlL2xlZ2FjeS91bWM4NjcyLmM+IGZvciBtb3JlIGluZm8uCisKK2VuZGlmCisKK2NvbmZpZyBCTEtfREVWX0lERURNQQorCWRlZl9ib29sIEJMS19ERVZfSURFRE1BX1BDSSB8fCBCTEtfREVWX0lERURNQV9QTUFDIHx8IEJMS19ERVZfSURFRE1BX0lDUworCitjb25maWcgSURFRE1BX0lWQgorCWJvb2wgIklHTk9SRSB3b3JkOTMgVmFsaWRhdGlvbiBCSVRTIgorCWRlcGVuZHMgb24gQkxLX0RFVl9JREVETUFfUENJIHx8IEJMS19ERVZfSURFRE1BX1BNQUMgfHwgQkxLX0RFVl9JREVETUFfSUNTCisJLS0taGVscC0tLQorCSAgVGhlcmUgYXJlIHVuY2xlYXIgdGVybXMgaW4gQVRBLTQgYW5kIEFUQS01IHN0YW5kYXJkcyBob3cgY2VydGFpbgorCSAgaGFyZHdhcmUgKGFuIDgwYyByaWJib24pIHNob3VsZCBiZSBkZXRlY3RlZC4gRGlmZmVyZW50IGludGVycHJldGF0aW9ucworCSAgb2YgdGhlIHN0YW5kYXJkcyBoYXZlIGJlZW4gcmVsZWFzZWQgaW4gaGFyZHdhcmUuIFRoaXMgY2F1c2VzIHByb2JsZW1zOgorCSAgZm9yIGV4YW1wbGUsIGEgaG9zdCB3aXRoIFVsdHJhIE1vZGUgNCAob3IgaGlnaGVyKSB3aWxsIG5vdCBydW4KKwkgIGluIHRoYXQgbW9kZSB3aXRoIGFuIDgwYyByaWJib24uCisKKwkgIElmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGNvbXBhdGliaWxpdHkgb3IgcGVyZm9ybWFuY2UgcHJvYmxlbXMsIHlvdQorCSAgTUFZIHRyeSB0byBhbnN3ZXJpbmcgWSBoZXJlLiBIb3dldmVyLCBpdCBkb2VzIG5vdCBuZWNlc3NhcmlseSBzb2x2ZQorCSAgYW55IG9mIHlvdXIgcHJvYmxlbXMsIGl0IGNvdWxkIGV2ZW4gY2F1c2UgbW9yZSBvZiB0aGVtLgorCisJICBJdCBpcyBub3JtYWxseSBzYWZlIHRvIGFuc3dlciBZOyBob3dldmVyLCB0aGUgZGVmYXVsdCBpcyBOLgorCitjb25maWcgSURFRE1BX0FVVE8KKwlkZWZfYm9vbCBJREVETUFfUENJX0FVVE8gfHwgSURFRE1BX0lDU19BVVRPCisKK2VuZGlmCisKK2NvbmZpZyBCTEtfREVWX0hEX09OTFkKKwlib29sICJPbGQgaGFyZCBkaXNrIChNRk0vUkxML0lERSkgZHJpdmVyIgorCWRlcGVuZHMgb24gQkxLX0RFVl9JREU9bgorCWhlbHAKKwkgIFRoZXJlIGFyZSB0d28gZHJpdmVycyBmb3IgTUZNL1JMTC9JREUgaGFyZCBkaXNrcy4gTW9zdCBwZW9wbGUgdXNlCisJICB0aGUgbmV3ZXIgZW5oYW5jZWQgZHJpdmVyLCBidXQgdGhpcyBvbGQgb25lIGlzIHN0aWxsIGFyb3VuZCBmb3IgdHdvCisJICByZWFzb25zLiBTb21lIG9sZGVyIHN5c3RlbXMgaGF2ZSBzdHJhbmdlIHRpbWluZyBwcm9ibGVtcyBhbmQgc2VlbSB0bworCSAgd29yayBvbmx5IHdpdGggdGhlIG9sZCBkcml2ZXIgKHdoaWNoIGl0c2VsZiBkb2VzIG5vdCB3b3JrIHdpdGggc29tZQorCSAgbmV3ZXIgc3lzdGVtcykuIFRoZSBvdGhlciByZWFzb24gaXMgdGhhdCB0aGUgb2xkIGRyaXZlciBpcyBzbWFsbGVyLAorCSAgc2luY2UgaXQgbGFja3MgdGhlIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG5ldyBvbmUuIFRoaXMgbWFrZXMKKwkgIGl0IGEgZ29vZCBjaG9pY2UgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IHRpZ2h0IG1lbW9yeSByZXN0cmljdGlvbnMsIG9yCisJICBmb3Igc3lzdGVtcyB3aXRoIG9ubHkgb2xkZXIgTUZNL1JMTC9FU0RJIGRyaXZlcy4gQ2hvb3NpbmcgdGhlIG9sZAorCSAgZHJpdmVyIGNhbiBzYXZlIDEzIEtCIG9yIHNvIG9mIGtlcm5lbCBtZW1vcnkuCisKKwkgIElmIHlvdSBhcmUgdW5zdXJlLCB0aGVuIGp1c3QgY2hvb3NlIHRoZSBFbmhhbmNlZCBJREUvTUZNL1JMTCBkcml2ZXIKKwkgIGluc3RlYWQgb2YgdGhpcyBvbmUuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCByZWFkIHRoZQorCSAgRGlzay1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKK2NvbmZpZyBCTEtfREVWX0hECisJZGVmX2Jvb2wgQkxLX0RFVl9IRF9JREUgfHwgQkxLX0RFVl9IRF9PTkxZCisKK2VuZGlmCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlOGFkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQpAQCAtMCwwICsxLDU0IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIGF0YSwgYXRhcGksIGFuZCBpZGUgYmxvY2sgZGV2aWNlIGRyaXZlcnMuCisjCisjIDEyIFNlcHRlbWJlciAyMDAwLCBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisjCisjIE5vdGUgOiBhdCB0aGlzIHBvaW50LCB0aGVzZSBmaWxlcyBhcmUgY29tcGlsZWQgb24gYWxsIHN5c3RlbXMuCisjIEluIHRoZSBmdXR1cmUsIHNvbWUgb2YgdGhlc2Ugc2hvdWxkIGJlIGJ1aWx0IGNvbmRpdGlvbmFsbHkuCisjCisjIEZpcnN0IGNvbWUgbW9kdWxlcyB0aGF0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCB0aGUgY29yZQorCitFWFRSQV9DRkxBR1MJCQkJKz0gLUlkcml2ZXJzL2lkZQorCitvYmotJChDT05GSUdfQkxLX0RFVl9JREUpCQkrPSBwY2kvCisKK2lkZS1jb3JlLXkgKz0gaWRlLm8gaWRlLWlvLm8gaWRlLWlvcHMubyBpZGUtbGliLm8gaWRlLXByb2JlLm8gaWRlLXRhc2tmaWxlLm8KKworaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9DTUQ2NDApCSs9IHBjaS9jbWQ2NDAubworCisjIENvcmUgSURFIGNvZGUgLSBtdXN0IGNvbWUgYmVmb3JlIGxlZ2FjeQoraWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVQQ0kpCSs9IHNldHVwLXBjaS5vCitpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERURNQSkJKz0gaWRlLWRtYS5vCitpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERV9UQ1EpCSs9IGlkZS10Y3EubworaWRlLWNvcmUtJChDT05GSUdfUFJPQ19GUykJCSs9IGlkZS1wcm9jLm8KK2lkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfSURFUE5QKQkrPSBpZGUtcG5wLm8KKworIyBidWlsdC1pbiBvbmx5IGRyaXZlcnMgZnJvbSBhcm0vCitpZGUtY29yZS0kKENPTkZJR19JREVfQVJNKQkJKz0gYXJtL2lkZV9hcm0ubworCisjIGJ1aWx0LWluIG9ubHkgZHJpdmVycyBmcm9tIGxlZ2FjeS8KK2lkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfQlVEREhBKQkrPSBsZWdhY3kvYnVkZGhhLm8KK2lkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfRkFMQ09OX0lERSkJKz0gbGVnYWN5L2ZhbGNvbmlkZS5vCitpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0dBWUxFKQkrPSBsZWdhY3kvZ2F5bGUubworaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9NQUNfSURFKQkrPSBsZWdhY3kvbWFjaWRlLm8KK2lkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfUTQwSURFKQkrPSBsZWdhY3kvcTQwaWRlLm8KKworIyBidWlsdC1pbiBvbmx5IGRyaXZlcnMgZnJvbSBwcGMvCitpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX01QQzh4eF9JREUpCSs9IHBwYy9tcGM4eHgubworaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVfUE1BQykJKz0gcHBjL3BtYWMubworCisjIGJ1aWx0LWluIG9ubHkgZHJpdmVycyBmcm9tIGg4MzAwLworaWRlLWNvcmUtJChDT05GSUdfSDgzMDApCQkrPSBoODMwMC9pZGUtaDgzMDAubworCitvYmotJChDT05GSUdfQkxLX0RFVl9JREUpCQkrPSBpZGUtY29yZS5vCitvYmotJChDT05GSUdfSURFX0dFTkVSSUMpCQkrPSBpZGUtZ2VuZXJpYy5vCisKK29iai0kKENPTkZJR19CTEtfREVWX0lERURJU0spCQkrPSBpZGUtZGlzay5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVDRCkJCSs9IGlkZS1jZC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVUQVBFKQkJKz0gaWRlLXRhcGUubworb2JqLSQoQ09ORklHX0JMS19ERVZfSURFRkxPUFBZKQkJKz0gaWRlLWZsb3BweS5vCisKK29iai0kKENPTkZJR19CTEtfREVWX0lERSkJCSs9IGxlZ2FjeS8gYXJtLworb2JqLSQoQ09ORklHX0JMS19ERVZfSEQpCQkrPSBsZWdhY3kvCitvYmotJChDT05GSUdfRVRSQVhfSURFKQkJKz0gY3Jpcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FybS9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL2FybS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc4ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVfSUNTSURFKQkrPSBpY3NpZGUubworb2JqLSQoQ09ORklHX0JMS19ERVZfSURFX1JBUElERSkJKz0gcmFwaWRlLm8KK29iai0kKENPTkZJR19CTEtfREVWX0lERV9CQVNUKQkJKz0gYmFzdC1pZGUubworCitFWFRSQV9DRkxBR1MJOj0gLUlkcml2ZXJzL2lkZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXJtL2Jhc3QtaWRlLmMgYi9kcml2ZXJzL2lkZS9hcm0vYmFzdC1pZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ3NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvYXJtL2Jhc3QtaWRlLmMKQEAgLTAsMCArMSw3MSBAQAorLyogbGludXgvZHJpdmVycy9pZGUvYXJtL2Jhc3QtaWRlLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYmFzdC1pcnEuaD4KKworLyogbGlzdCBvZiByZWdpc3RlcmVkIGludGVyZmFjZXMgKi8KK3N0YXRpYyBpZGVfaHdpZl90ICppZnNbMl07CisKK3N0YXRpYyBpbnQgX19pbml0CitiYXN0aWRlX3JlZ2lzdGVyKHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgYXV4LCBpbnQgaXJxLAorCQkgaWRlX2h3aWZfdCAqKmh3aWYpCit7CisJaHdfcmVnc190IGh3OworCWludCBpOworCisJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7CisKKwliYXNlICs9IEJBU1RfSURFX0NTOworCWF1eCAgKz0gQkFTVF9JREVfQ1M7CisKKwlmb3IgKGkgPSBJREVfREFUQV9PRkZTRVQ7IGkgPD0gSURFX1NUQVRVU19PRkZTRVQ7IGkrKykgeworCQlody5pb19wb3J0c1tpXSA9ICh1bnNpZ25lZCBsb25nKWJhc2U7CisJCWJhc2UgKz0gMHgyMDsKKwl9CisKKwlody5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdID0gYXV4ICsgKDYgKiAweDIwKTsKKwlody5pcnEgPSBpcnE7CisKKwlpZGVfcmVnaXN0ZXJfaHcoJmh3LCBod2lmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBiYXN0aWRlX2luaXQodm9pZCkKK3sKKwkvKiB3ZSBjYW4gdHJlYXQgdGhlIFZSMTAwMCBhbmQgdGhlIEJBU1QgdGhlIHNhbWUgKi8KKworCWlmICghKG1hY2hpbmVfaXNfYmFzdCgpIHx8IG1hY2hpbmVfaXNfdnIxMDAwKCkpKQorCQlyZXR1cm4gMDsKKworCXByaW50aygiQkFTVDogSURFIGRyaXZlciwgKGMpIDIwMDMtMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCisJYmFzdGlkZV9yZWdpc3RlcihCQVNUX1ZBX0lERVBSSSwgQkFTVF9WQV9JREVQUklBVVgsIElSUV9JREUwLCAmaWZzWzBdKTsKKwliYXN0aWRlX3JlZ2lzdGVyKEJBU1RfVkFfSURFU0VDLCBCQVNUX1ZBX0lERVNFQ0FVWCwgSVJRX0lERTEsICZpZnNbMV0pOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChiYXN0aWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXRlYyBCQVNUIC8gVGhvcmNvbSBWUjEwMDAgSURFIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXJtL2ljc2lkZS5jIGIvZHJpdmVycy9pZGUvYXJtL2ljc2lkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODg5N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvYXJtL2ljc2lkZS5jCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvYXJtL2ljc2lkZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgUnVzc2VsbCBLaW5nLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IDMyLWJpdCBJREUgSU8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBJQ1NfSURFTlRfT0ZGU0VUCQkweDIyODAKKworI2RlZmluZSBJQ1NfQVJDSU5fVjVfSU5UUlNUQVQJCTB4MDAwMAorI2RlZmluZSBJQ1NfQVJDSU5fVjVfSU5UUk9GRlNFVAkJMHgwMDA0CisjZGVmaW5lIElDU19BUkNJTl9WNV9JREVPRkZTRVQJCTB4MjgwMAorI2RlZmluZSBJQ1NfQVJDSU5fVjVfSURFQUxUT0ZGU0VUCTB4MmI4MAorI2RlZmluZSBJQ1NfQVJDSU5fVjVfSURFU1RFUFBJTkcJNgorCisjZGVmaW5lIElDU19BUkNJTl9WNl9JREVPRkZTRVRfMQkweDIwMDAKKyNkZWZpbmUgSUNTX0FSQ0lOX1Y2X0lOVFJPRkZTRVRfMQkweDIyMDAKKyNkZWZpbmUgSUNTX0FSQ0lOX1Y2X0lOVFJTVEFUXzEJCTB4MjI5MAorI2RlZmluZSBJQ1NfQVJDSU5fVjZfSURFQUxUT0ZGU0VUXzEJMHgyMzgwCisjZGVmaW5lIElDU19BUkNJTl9WNl9JREVPRkZTRVRfMgkweDMwMDAKKyNkZWZpbmUgSUNTX0FSQ0lOX1Y2X0lOVFJPRkZTRVRfMgkweDMyMDAKKyNkZWZpbmUgSUNTX0FSQ0lOX1Y2X0lOVFJTVEFUXzIJCTB4MzI5MAorI2RlZmluZSBJQ1NfQVJDSU5fVjZfSURFQUxUT0ZGU0VUXzIJMHgzMzgwCisjZGVmaW5lIElDU19BUkNJTl9WNl9JREVTVEVQUElORwk2CisKK3N0cnVjdCBjYXJkaW5mbyB7CisJdW5zaWduZWQgaW50IGRhdGFvZmZzZXQ7CisJdW5zaWduZWQgaW50IGN0cmxvZmZzZXQ7CisJdW5zaWduZWQgaW50IHN0ZXBwaW5nOworfTsKKworc3RhdGljIHN0cnVjdCBjYXJkaW5mbyBpY3NpZGVfY2FyZGluZm9fdjUgPSB7CisJLmRhdGFvZmZzZXQJPSBJQ1NfQVJDSU5fVjVfSURFT0ZGU0VULAorCS5jdHJsb2Zmc2V0CT0gSUNTX0FSQ0lOX1Y1X0lERUFMVE9GRlNFVCwKKwkuc3RlcHBpbmcJPSBJQ1NfQVJDSU5fVjVfSURFU1RFUFBJTkcsCit9OworCitzdGF0aWMgc3RydWN0IGNhcmRpbmZvIGljc2lkZV9jYXJkaW5mb192Nl8xID0geworCS5kYXRhb2Zmc2V0CT0gSUNTX0FSQ0lOX1Y2X0lERU9GRlNFVF8xLAorCS5jdHJsb2Zmc2V0CT0gSUNTX0FSQ0lOX1Y2X0lERUFMVE9GRlNFVF8xLAorCS5zdGVwcGluZwk9IElDU19BUkNJTl9WNl9JREVTVEVQUElORywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FyZGluZm8gaWNzaWRlX2NhcmRpbmZvX3Y2XzIgPSB7CisJLmRhdGFvZmZzZXQJPSBJQ1NfQVJDSU5fVjZfSURFT0ZGU0VUXzIsCisJLmN0cmxvZmZzZXQJPSBJQ1NfQVJDSU5fVjZfSURFQUxUT0ZGU0VUXzIsCisJLnN0ZXBwaW5nCT0gSUNTX0FSQ0lOX1Y2X0lERVNURVBQSU5HLAorfTsKKworc3RydWN0IGljc2lkZV9zdGF0ZSB7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJdW5zaWduZWQgaW50IGVuYWJsZWQ7CisJdm9pZCBfX2lvbWVtICppcnFfcG9ydDsKKwl2b2lkIF9faW9tZW0gKmlvY19iYXNlOworCXVuc2lnbmVkIGludCB0eXBlOworCS8qIHBhcmVudCBkZXZpY2UuLi4gdW50aWwgdGhlIElERSBjb3JlIGdldHMgb25lIG9mIGl0cyBvd24gKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaWRlX2h3aWZfdCAqaHdpZlsyXTsKK307CisKKyNkZWZpbmUgSUNTX1RZUEVfQTNJTgkwCisjZGVmaW5lIElDU19UWVBFX0EzVVNFUgkxCisjZGVmaW5lIElDU19UWVBFX1Y2CTMKKyNkZWZpbmUgSUNTX1RZUEVfVjUJMTUKKyNkZWZpbmUgSUNTX1RZUEVfTk9UWVBFCSgodW5zaWduZWQgaW50KS0xKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tIFZlcnNpb24gNSBQQ0IgU3VwcG9ydCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBQcm90b3R5cGU6IGljc2lkZV9pcnFlbmFibGVfYXJjaW5fdjUgKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKKyAqIFB1cnBvc2UgIDogZW5hYmxlIGludGVycnVwdHMgZnJvbSBjYXJkCisgKi8KK3N0YXRpYyB2b2lkIGljc2lkZV9pcnFlbmFibGVfYXJjaW5fdjUgKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjLT5pcnFfZGF0YTsKKworCXdyaXRlYigwLCBzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjVfSU5UUk9GRlNFVCk7Cit9CisKKy8qIFByb3RvdHlwZTogaWNzaWRlX2lycWRpc2FibGVfYXJjaW5fdjUgKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKKyAqIFB1cnBvc2UgIDogZGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gY2FyZAorICovCitzdGF0aWMgdm9pZCBpY3NpZGVfaXJxZGlzYWJsZV9hcmNpbl92NSAoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWMtPmlycV9kYXRhOworCisJcmVhZGIoc3RhdGUtPmlycV9wb3J0ICsgSUNTX0FSQ0lOX1Y1X0lOVFJPRkZTRVQpOworfQorCitzdGF0aWMgY29uc3QgZXhwYW5zaW9uY2FyZF9vcHNfdCBpY3NpZGVfb3BzX2FyY2luX3Y1ID0geworCS5pcnFlbmFibGUJPSBpY3NpZGVfaXJxZW5hYmxlX2FyY2luX3Y1LAorCS5pcnFkaXNhYmxlCT0gaWNzaWRlX2lycWRpc2FibGVfYXJjaW5fdjUsCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gVmVyc2lvbiA2IFBDQiBTdXBwb3J0IEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFByb3RvdHlwZTogaWNzaWRlX2lycWVuYWJsZV9hcmNpbl92NiAoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQorICogUHVycG9zZSAgOiBlbmFibGUgaW50ZXJydXB0cyBmcm9tIGNhcmQKKyAqLworc3RhdGljIHZvaWQgaWNzaWRlX2lycWVuYWJsZV9hcmNpbl92NiAoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWMtPmlycV9kYXRhOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHN0YXRlLT5pcnFfcG9ydDsKKworCXN0YXRlLT5lbmFibGVkID0gMTsKKworCXN3aXRjaCAoc3RhdGUtPmNoYW5uZWwpIHsKKwljYXNlIDA6CisJCXdyaXRlYigwLCBiYXNlICsgSUNTX0FSQ0lOX1Y2X0lOVFJPRkZTRVRfMSk7CisJCXJlYWRiKGJhc2UgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8yKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl3cml0ZWIoMCwgYmFzZSArIElDU19BUkNJTl9WNl9JTlRST0ZGU0VUXzIpOworCQlyZWFkYihiYXNlICsgSUNTX0FSQ0lOX1Y2X0lOVFJPRkZTRVRfMSk7CisJCWJyZWFrOworCX0KK30KKworLyogUHJvdG90eXBlOiBpY3NpZGVfaXJxZGlzYWJsZV9hcmNpbl92NiAoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQorICogUHVycG9zZSAgOiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSBjYXJkCisgKi8KK3N0YXRpYyB2b2lkIGljc2lkZV9pcnFkaXNhYmxlX2FyY2luX3Y2IChzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBpbnQgaXJxbnIpCit7CisJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBlYy0+aXJxX2RhdGE7CisKKwlzdGF0ZS0+ZW5hYmxlZCA9IDA7CisKKwlyZWFkYihzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8xKTsKKwlyZWFkYihzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8yKTsKK30KKworLyogUHJvdG90eXBlOiBpY3NpZGVfaXJxcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKKyAqIFB1cnBvc2UgIDogZGV0ZWN0IGFuIGFjdGl2ZSBpbnRlcnJ1cHQgZnJvbSBjYXJkCisgKi8KK3N0YXRpYyBpbnQgaWNzaWRlX2lycXBlbmRpbmdfYXJjaW5fdjYoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjLT5pcnFfZGF0YTsKKworCXJldHVybiByZWFkYihzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUlNUQVRfMSkgJiAxIHx8CisJICAgICAgIHJlYWRiKHN0YXRlLT5pcnFfcG9ydCArIElDU19BUkNJTl9WNl9JTlRSU1RBVF8yKSAmIDE7Cit9CisKK3N0YXRpYyBjb25zdCBleHBhbnNpb25jYXJkX29wc190IGljc2lkZV9vcHNfYXJjaW5fdjYgPSB7CisJLmlycWVuYWJsZQk9IGljc2lkZV9pcnFlbmFibGVfYXJjaW5fdjYsCisJLmlycWRpc2FibGUJPSBpY3NpZGVfaXJxZGlzYWJsZV9hcmNpbl92NiwKKwkuaXJxcGVuZGluZwk9IGljc2lkZV9pcnFwZW5kaW5nX2FyY2luX3Y2LAorfTsKKworLyoKKyAqIEhhbmRsZSByb3V0aW5nIG9mIGludGVycnVwdHMuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUKKyAqIHdlIHdyaXRlIHRoZSBjb21tYW5kIHRvIHRoZSBkcml2ZS4KKyAqLworc3RhdGljIHZvaWQgaWNzaWRlX21hc2twcm9jKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1hc2spCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gaHdpZi0+aHdpZl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdGF0ZS0+Y2hhbm5lbCA9IGh3aWYtPmNoYW5uZWw7CisKKwlpZiAoc3RhdGUtPmVuYWJsZWQgJiYgIW1hc2spIHsKKwkJc3dpdGNoIChod2lmLT5jaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCXdyaXRlYigwLCBzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8xKTsKKwkJCXJlYWRiKHN0YXRlLT5pcnFfcG9ydCArIElDU19BUkNJTl9WNl9JTlRST0ZGU0VUXzIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXdyaXRlYigwLCBzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8yKTsKKwkJCXJlYWRiKHN0YXRlLT5pcnFfcG9ydCArIElDU19BUkNJTl9WNl9JTlRST0ZGU0VUXzEpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlyZWFkYihzdGF0ZS0+aXJxX3BvcnQgKyBJQ1NfQVJDSU5fVjZfSU5UUk9GRlNFVF8yKTsKKwkJcmVhZGIoc3RhdGUtPmlycV9wb3J0ICsgSUNTX0FSQ0lOX1Y2X0lOVFJPRkZTRVRfMSk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX0lDUworCisjaWZuZGVmIENPTkZJR19JREVETUFfSUNTX0FVVE8KKyN3YXJuaW5nIENPTkZJR19JREVETUFfSUNTX0FVVE89biBzdXBwb3J0IGlzIG9ic29sZXRlLCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uCisjZW5kaWYKKworLyoKKyAqIFNHLURNQSBzdXBwb3J0LgorICoKKyAqIFNpbWlsYXIgdG8gdGhlIEJNLURNQSwgYnV0IHdlIHVzZSB0aGUgUmlzY1BDcyBJT01EIERNQSBjb250cm9sbGVycy4KKyAqIFRoZXJlIGlzIG9ubHkgb25lIERNQSBjb250cm9sbGVyIHBlciBjYXJkLCB3aGljaCBtZWFucyB0aGF0IG9ubHkKKyAqIG9uZSBkcml2ZSBjYW4gYmUgYWNjZXNzZWQgYXQgb25lIHRpbWUuICBOT1RFISBXZSBkbyBub3QgZW5mb3JjZSB0aGF0CisgKiBoZXJlLCBidXQgd2UgcmVseSBvbiB0aGUgbWFpbiBJREUgZHJpdmVyIHNwb3R0aW5nIHRoYXQgYm90aAorICogaW50ZXJmYWNlcyB1c2UgdGhlIHNhbWUgSVJRLCB3aGljaCBzaG91bGQgZ3VhcmFudGVlIHRoaXMuCisgKi8KKworc3RhdGljIHZvaWQgaWNzaWRlX2J1aWxkX3NnbGlzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBod2lmLT5od2lmX2RhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGh3aWYtPnNnX3RhYmxlOworCisJaWRlX21hcF9zZyhkcml2ZSwgcnEpOworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEKQorCQlod2lmLT5zZ19kbWFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWVsc2UKKwkJaHdpZi0+c2dfZG1hX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisKKwlod2lmLT5zZ19uZW50cyA9IGRtYV9tYXBfc2coc3RhdGUtPmRldiwgc2csIGh3aWYtPnNnX25lbnRzLAorCQkJCSAgICBod2lmLT5zZ19kbWFfZGlyZWN0aW9uKTsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgSU9NRCB0byBnaXZlIHRoZSBhcHByb3ByaWF0ZSB0aW1pbmdzIGZvciB0aGUgdHJhbnNmZXIKKyAqIG1vZGUgYmVpbmcgcmVxdWVzdGVkLiAgV2UgdGFrZSB0aGUgYWR2aWNlIG9mIHRoZSBBVEEgc3RhbmRhcmRzLCBhbmQKKyAqIGNhbGN1bGF0ZSB0aGUgY3ljbGUgdGltZSBiYXNlZCBvbiB0aGUgdHJhbnNmZXIgbW9kZSwgYW5kIHRoZSBFSURFCisgKiBNVyBETUEgc3BlY3MgdGhhdCB0aGUgZHJpdmUgcHJvdmlkZXMgaW4gdGhlIElERU5USUZZIGNvbW1hbmQuCisgKgorICogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIElPTUQgRE1BIG1vZGVzIHRvIGNob29zZSBmcm9tOgorICoKKyAqCVR5cGUJQWN0aXZlCQlSZWNvdmVyeQlDeWNsZQorICoJQQkyNTAgKDI1MCkJMzEyICg1NTApCTU2MiAoODAwKQorICoJQgkxODcJCTI1MAkJNDM3CisgKglDCTEyNSAoMTI1KQkxMjUgKDM3NSkJMjUwICg1MDApCisgKglECTYyCQkxMjUJCTE4NworICoKKyAqIChmaWd1cmVzIGluIGJyYWNrZXRzIGFyZSBhY3R1YWwgbWVhc3VyZWQgdGltaW5ncykKKyAqCisgKiBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoZSByZWFkL3dyaXRlIGFjdGl2ZSBhbmQKKyAqIHJlY292ZXJ5IHRpbWluZ3M6CisgKgorICoJCQlSZWFkCVdyaXRlCisgKiAgCU1vZGUJQWN0aXZlCS0tIFJlY292ZXJ5IC0tCUN5Y2xlCUlPTUQgdHlwZQorICoJTVcwCTIxNQk1MAkyMTUJNDgwCUEKKyAqCU1XMQk4MAk1MAk1MAkxNTAJQworICoJTVcyCTcwCTI1CTI1CTEyMAlDCisgKi8KK3N0YXRpYyBpbnQgaWNzaWRlX3NldF9zcGVlZChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJfbW9kZSkKK3sKKwlpbnQgb24gPSAwLCBjeWNsZV90aW1lID0gMCwgdXNlX2RtYV9pbmZvID0gMDsKKworCS8qCisJICogTGltaXQgdGhlIHRyYW5zZmVyIHNwZWVkIHRvIE1XX0RNQV8yLgorCSAqLworCWlmICh4ZmVyX21vZGUgPiBYRkVSX01XX0RNQV8yKQorCQl4ZmVyX21vZGUgPSBYRkVSX01XX0RNQV8yOworCisJc3dpdGNoICh4ZmVyX21vZGUpIHsKKwljYXNlIFhGRVJfTVdfRE1BXzI6CisJCWN5Y2xlX3RpbWUgPSAyNTA7CisJCXVzZV9kbWFfaW5mbyA9IDE7CisJCWJyZWFrOworCisJY2FzZSBYRkVSX01XX0RNQV8xOgorCQljeWNsZV90aW1lID0gMjUwOworCQl1c2VfZG1hX2luZm8gPSAxOworCQlicmVhazsKKworCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJY3ljbGVfdGltZSA9IDQ4MDsKKwkJYnJlYWs7CisKKwljYXNlIFhGRVJfU1dfRE1BXzI6CisJY2FzZSBYRkVSX1NXX0RNQV8xOgorCWNhc2UgWEZFUl9TV19ETUFfMDoKKwkJY3ljbGVfdGltZSA9IDQ4MDsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBnb2luZyB0byBiZSBkb2luZyBNV19ETUFfMSBvciBNV19ETUFfMiwgd2Ugc2hvdWxkCisJICogdGFrZSBjYXJlIHRvIG5vdGUgdGhlIHZhbHVlcyBpbiB0aGUgSUQuLi4KKwkgKi8KKwlpZiAodXNlX2RtYV9pbmZvICYmIGRyaXZlLT5pZC0+ZWlkZV9kbWFfdGltZSA+IGN5Y2xlX3RpbWUpCisJCWN5Y2xlX3RpbWUgPSBkcml2ZS0+aWQtPmVpZGVfZG1hX3RpbWU7CisKKwlkcml2ZS0+ZHJpdmVfZGF0YSA9IGN5Y2xlX3RpbWU7CisKKwlpZiAoY3ljbGVfdGltZSAmJiBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCB4ZmVyX21vZGUpID09IDApCisJCW9uID0gMTsKKwllbHNlCisJCWRyaXZlLT5kcml2ZV9kYXRhID0gNDgwOworCisJcHJpbnRrKCIlczogJXMgc2VsZWN0ZWQgKHBlYWsgJWRNQi9zKVxuIiwgZHJpdmUtPm5hbWUsCisJCWlkZV94ZmVyX3ZlcmJvc2UoeGZlcl9tb2RlKSwgMjAwMCAvIGRyaXZlLT5kcml2ZV9kYXRhKTsKKworCWRyaXZlLT5jdXJyZW50X3NwZWVkID0geGZlcl9tb2RlOworCisJcmV0dXJuIG9uOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfaG9zdF9vZmYoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfb2ZmX3F1aWV0bHkoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWRyaXZlLT51c2luZ19kbWEgPSAwOworCXJldHVybiBpY3NpZGVfZG1hX2hvc3Rfb2ZmKGRyaXZlKTsKK30KKworc3RhdGljIGludCBpY3NpZGVfZG1hX2hvc3Rfb24oaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfb24oaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWRyaXZlLT51c2luZ19kbWEgPSAxOworCXJldHVybiBpY3NpZGVfZG1hX2hvc3Rfb24oZHJpdmUpOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfY2hlY2soaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaW50IHhmZXJfbW9kZSA9IFhGRVJfUElPXzI7CisJaW50IG9uOworCisJaWYgKCEoaWQtPmNhcGFiaWxpdHkgJiAxKSB8fCAhaHdpZi0+YXV0b2RtYSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIENvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImJhZCIgZHJpdmVzCisJICovCisJaWYgKF9faWRlX2RtYV9iYWRfZHJpdmUoZHJpdmUpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRW5hYmxlIERNQSBvbiBhbnkgZHJpdmUgdGhhdCBoYXMgbXVsdGl3b3JkIERNQQorCSAqLworCWlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7CisJCXhmZXJfbW9kZSA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIENvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImdvb2QiIGRyaXZlcworCSAqLworCWlmIChfX2lkZV9kbWFfZ29vZF9kcml2ZShkcml2ZSkpIHsKKwkJaWYgKGlkLT5laWRlX2RtYV90aW1lID4gMTUwKQorCQkJZ290byBvdXQ7CisJCXhmZXJfbW9kZSA9IFhGRVJfTVdfRE1BXzE7CisJfQorCitvdXQ6CisJb24gPSBpY3NpZGVfc2V0X3NwZWVkKGRyaXZlLCB4ZmVyX21vZGUpOworCisJaWYgKG9uKQorCQlyZXR1cm4gaWNzaWRlX2RtYV9vbihkcml2ZSk7CisJZWxzZQorCQlyZXR1cm4gaWNzaWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWNzaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGh3aWYtPmh3aWZfZGF0YTsKKworCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOworCisJZGlzYWJsZV9kbWEoaHdpZi0+aHcuZG1hKTsKKworCS8qIFRlYXJkb3duIG1hcHBpbmdzIGFmdGVyIERNQSBoYXMgY29tcGxldGVkLiAqLworCWRtYV91bm1hcF9zZyhzdGF0ZS0+ZGV2LCBod2lmLT5zZ190YWJsZSwgaHdpZi0+c2dfbmVudHMsCisJCSAgICAgaHdpZi0+c2dfZG1hX2RpcmVjdGlvbik7CisKKwlyZXR1cm4gZ2V0X2RtYV9yZXNpZHVlKGh3aWYtPmh3LmRtYSkgIT0gMDsKK30KKworc3RhdGljIHZvaWQgaWNzaWRlX2RtYV9zdGFydChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCisJLyogV2UgY2FuIG5vdCBlbmFibGUgRE1BIG9uIGJvdGggY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuICovCisJQlVHX09OKGRtYV9jaGFubmVsX2FjdGl2ZShod2lmLT5ody5kbWEpKTsKKwllbmFibGVfZG1hKGh3aWYtPmh3LmRtYSk7Cit9CisKK3N0YXRpYyBpbnQgaWNzaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXVuc2lnbmVkIGludCBkbWFfbW9kZTsKKworCWlmIChycV9kYXRhX2RpcihycSkpCisJCWRtYV9tb2RlID0gRE1BX01PREVfV1JJVEU7CisJZWxzZQorCQlkbWFfbW9kZSA9IERNQV9NT0RFX1JFQUQ7CisKKwkvKgorCSAqIFdlIGNhbiBub3QgZW5hYmxlIERNQSBvbiBib3RoIGNoYW5uZWxzLgorCSAqLworCUJVR19PTihkbWFfY2hhbm5lbF9hY3RpdmUoaHdpZi0+aHcuZG1hKSk7CisKKwlpY3NpZGVfYnVpbGRfc2dsaXN0KGRyaXZlLCBycSk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IGludGVycnVwdCByb3V0ZWQuCisJICovCisJaWNzaWRlX21hc2twcm9jKGRyaXZlLCAwKTsKKworCS8qCisJICogUm91dGUgdGhlIERNQSBzaWduYWxzIHRvIHRoZSBjb3JyZWN0IGludGVyZmFjZS4KKwkgKi8KKwl3cml0ZWIoaHdpZi0+c2VsZWN0X2RhdGEsIGh3aWYtPmNvbmZpZ19kYXRhKTsKKworCS8qCisJICogU2VsZWN0IHRoZSBjb3JyZWN0IHRpbWluZyBmb3IgdGhpcyBkcml2ZS4KKwkgKi8KKwlzZXRfZG1hX3NwZWVkKGh3aWYtPmh3LmRtYSwgZHJpdmUtPmRyaXZlX2RhdGEpOworCisJLyoKKwkgKiBUZWxsIHRoZSBETUEgZW5naW5lIGFib3V0IHRoZSBTRyB0YWJsZSBhbmQKKwkgKiBkYXRhIGRpcmVjdGlvbi4KKwkgKi8KKwlzZXRfZG1hX3NnKGh3aWYtPmh3LmRtYSwgaHdpZi0+c2dfdGFibGUsIGh3aWYtPnNnX25lbnRzKTsKKwlzZXRfZG1hX21vZGUoaHdpZi0+aHcuZG1hLCBkbWFfbW9kZSk7CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpY3NpZGVfZG1hX2V4ZWNfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQoreworCS8qIGlzc3VlIGNtZCB0byBkcml2ZSAqLworCWlkZV9leGVjdXRlX2NvbW1hbmQoZHJpdmUsIGNtZCwgaWRlX2RtYV9pbnRyLCAyICogV0FJVF9DTUQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGh3aWYtPmh3aWZfZGF0YTsKKworCXJldHVybiByZWFkYihzdGF0ZS0+aXJxX3BvcnQgKworCQkgICAgIChod2lmLT5jaGFubmVsID8KKwkJCUlDU19BUkNJTl9WNl9JTlRSU1RBVF8yIDoKKwkJCUlDU19BUkNJTl9WNl9JTlRSU1RBVF8xKSkgJiAxOworfQorCitzdGF0aWMgaW50IGljc2lkZV9kbWFfdGltZW91dChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIHRpbWVvdXQgb2NjdXJyZWQ6ICIsIGRyaXZlLT5uYW1lKTsKKworCWlmIChpY3NpZGVfZG1hX3Rlc3RfaXJxKGRyaXZlKSkKKwkJcmV0dXJuIDA7CisKKwlpZGVfZHVtcF9zdGF0dXMoZHJpdmUsICJETUEgdGltZW91dCIsCisJCUhXSUYoZHJpdmUpLT5JTkIoSURFX1NUQVRVU19SRUcpKTsKKworCXJldHVybiBpY3NpZGVfZG1hX2VuZChkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWNzaWRlX2RtYV9sb3N0aXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgbG9zdFxuIiwgZHJpdmUtPm5hbWUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpY3NpZGVfZG1hX2luaXQoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpbnQgYXV0b2RtYSA9IDA7CisKKyNpZmRlZiBDT05GSUdfSURFRE1BX0lDU19BVVRPCisJYXV0b2RtYSA9IDE7CisjZW5kaWYKKworCXByaW50aygiICAgICVzOiBTRy1ETUEiLCBod2lmLT5uYW1lKTsKKworCWh3aWYtPmF0YXBpX2RtYQkJPSAxOworCWh3aWYtPm13ZG1hX21hc2sJPSA3OyAvKiBNVzAuLjIgKi8KKwlod2lmLT5zd2RtYV9tYXNrCT0gNzsgLyogU1cwLi4yICovCisKKwlod2lmLT5kbWF0YWJsZV9jcHUJPSBOVUxMOworCWh3aWYtPmRtYXRhYmxlX2RtYQk9IDA7CisJaHdpZi0+c3BlZWRwcm9jCQk9IGljc2lkZV9zZXRfc3BlZWQ7CisJaHdpZi0+YXV0b2RtYQkJPSBhdXRvZG1hOworCisJaHdpZi0+aWRlX2RtYV9jaGVjawk9IGljc2lkZV9kbWFfY2hlY2s7CisJaHdpZi0+aWRlX2RtYV9ob3N0X29mZgk9IGljc2lkZV9kbWFfaG9zdF9vZmY7CisJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseSA9IGljc2lkZV9kbWFfb2ZmX3F1aWV0bHk7CisJaHdpZi0+aWRlX2RtYV9ob3N0X29uCT0gaWNzaWRlX2RtYV9ob3N0X29uOworCWh3aWYtPmlkZV9kbWFfb24JPSBpY3NpZGVfZG1hX29uOworCWh3aWYtPmRtYV9zZXR1cAkJPSBpY3NpZGVfZG1hX3NldHVwOworCWh3aWYtPmRtYV9leGVjX2NtZAk9IGljc2lkZV9kbWFfZXhlY19jbWQ7CisJaHdpZi0+ZG1hX3N0YXJ0CQk9IGljc2lkZV9kbWFfc3RhcnQ7CisJaHdpZi0+aWRlX2RtYV9lbmQJPSBpY3NpZGVfZG1hX2VuZDsKKwlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxCT0gaWNzaWRlX2RtYV90ZXN0X2lycTsKKwlod2lmLT5pZGVfZG1hX3RpbWVvdXQJPSBpY3NpZGVfZG1hX3RpbWVvdXQ7CisJaHdpZi0+aWRlX2RtYV9sb3N0aXJxCT0gaWNzaWRlX2RtYV9sb3N0aXJxOworCisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKworCXByaW50aygiIGNhcGFibGUlc1xuIiwgaHdpZi0+YXV0b2RtYSA/ICIsIGF1dG8tZW5hYmxlIiA6ICIiKTsKK30KKyNlbHNlCisjZGVmaW5lIGljc2lkZV9kbWFfaW5pdChod2lmKQkoMCkKKyNlbmRpZgorCitzdGF0aWMgaWRlX2h3aWZfdCAqaWNzaWRlX2ZpbmRfaHdpZih1bnNpZ25lZCBsb25nIGRhdGFwb3J0KQoreworCWlkZV9od2lmX3QgKmh3aWY7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0hXSUZTOyArK2luZGV4KSB7CisJCWh3aWYgPSAmaWRlX2h3aWZzW2luZGV4XTsKKwkJaWYgKGh3aWYtPmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0gPT0gZGF0YXBvcnQpCisJCQlnb3RvIGZvdW5kOworCX0KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkgeworCQlod2lmID0gJmlkZV9od2lmc1tpbmRleF07CisJCWlmICghaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJaHdpZiA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gaHdpZjsKK30KKworc3RhdGljIGlkZV9od2lmX3QgKgoraWNzaWRlX3NldHVwKHZvaWQgX19pb21lbSAqYmFzZSwgc3RydWN0IGNhcmRpbmZvICppbmZvLCBzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nKWJhc2UgKyBpbmZvLT5kYXRhb2Zmc2V0OworCWlkZV9od2lmX3QgKmh3aWY7CisKKwlod2lmID0gaWNzaWRlX2ZpbmRfaHdpZihwb3J0KTsKKwlpZiAoaHdpZikgeworCQlpbnQgaTsKKworCQltZW1zZXQoJmh3aWYtPmh3LCAwLCBzaXplb2YoaHdfcmVnc190KSk7CisKKwkJLyoKKwkJICogRW5zdXJlIHdlJ3JlIHVzaW5nIE1NSU8KKwkJICovCisJCWRlZmF1bHRfaHdpZl9tbWlvcHMoaHdpZik7CisJCWh3aWYtPm1taW8gPSAyOworCisJCWZvciAoaSA9IElERV9EQVRBX09GRlNFVDsgaSA8PSBJREVfU1RBVFVTX09GRlNFVDsgaSsrKSB7CisJCQlod2lmLT5ody5pb19wb3J0c1tpXSA9IHBvcnQ7CisJCQlod2lmLT5pb19wb3J0c1tpXSA9IHBvcnQ7CisJCQlwb3J0ICs9IDEgPDwgaW5mby0+c3RlcHBpbmc7CisJCX0KKwkJaHdpZi0+aHcuaW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSA9ICh1bnNpZ25lZCBsb25nKWJhc2UgKyBpbmZvLT5jdHJsb2Zmc2V0OworCQlod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdID0gKHVuc2lnbmVkIGxvbmcpYmFzZSArIGluZm8tPmN0cmxvZmZzZXQ7CisJCWh3aWYtPmh3LmlycSAgPSBlYy0+aXJxOworCQlod2lmLT5pcnEgICAgID0gZWMtPmlycTsKKwkJaHdpZi0+bm9wcm9iZSA9IDA7CisJCWh3aWYtPmNoaXBzZXQgPSBpZGVfYWNvcm47CisJCWh3aWYtPmdlbmRldi5wYXJlbnQgPSAmZWMtPmRldjsKKwl9CisKKwlyZXR1cm4gaHdpZjsKK30KKworc3RhdGljIGludCBfX2luaXQKK2ljc2lkZV9yZWdpc3Rlcl92NShzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSwgc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlpZGVfaHdpZl90ICpod2lmOworCXZvaWQgX19pb21lbSAqYmFzZTsKKworCWJhc2UgPSBpb3JlbWFwKGVjYXJkX3Jlc291cmNlX3N0YXJ0KGVjLCBFQ0FSRF9SRVNfTUVNQyksCisJCSAgICAgICBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19NRU1DKSk7CisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLT5pcnFfcG9ydCA9IGJhc2U7CisKKwllYy0+aXJxYWRkciAgPSBiYXNlICsgSUNTX0FSQ0lOX1Y1X0lOVFJTVEFUOworCWVjLT5pcnFtYXNrICA9IDE7CisJZWMtPmlycV9kYXRhID0gc3RhdGU7CisJZWMtPm9wcyAgICAgID0gJmljc2lkZV9vcHNfYXJjaW5fdjU7CisKKwkvKgorCSAqIEJlIG9uIHRoZSBzYWZlIHNpZGUgLSBkaXNhYmxlIGludGVycnVwdHMKKwkgKi8KKwlpY3NpZGVfaXJxZGlzYWJsZV9hcmNpbl92NShlYywgMCk7CisKKwlod2lmID0gaWNzaWRlX3NldHVwKGJhc2UsICZpY3NpZGVfY2FyZGluZm9fdjUsIGVjKTsKKwlpZiAoIWh3aWYpIHsKKwkJaW91bm1hcChiYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3RhdGUtPmh3aWZbMF0gPSBod2lmOworCisJcHJvYmVfaHdpZl9pbml0KGh3aWYpOworCWNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK2ljc2lkZV9yZWdpc3Rlcl92NihzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSwgc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlpZGVfaHdpZl90ICpod2lmLCAqbWF0ZTsKKwl2b2lkIF9faW9tZW0gKmlvY19iYXNlLCAqZWFzaV9iYXNlOworCXVuc2lnbmVkIGludCBzZWwgPSAwOworCWludCByZXQ7CisKKwlpb2NfYmFzZSA9IGlvcmVtYXAoZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKSwKKwkJCSAgIGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX0lPQ0ZBU1QpKTsKKwlpZiAoIWlvY19iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWVhc2lfYmFzZSA9IGlvY19iYXNlOworCisJaWYgKGVjYXJkX3Jlc291cmNlX2ZsYWdzKGVjLCBFQ0FSRF9SRVNfRUFTSSkpIHsKKwkJZWFzaV9iYXNlID0gaW9yZW1hcChlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX0VBU0kpLAorCQkJCSAgICBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19FQVNJKSk7CisJCWlmICghZWFzaV9iYXNlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byB1bm1hcF9zbG90OworCQl9CisKKwkJLyoKKwkJICogRW5hYmxlIGFjY2VzcyB0byB0aGUgRUFTSSByZWdpb24uCisJCSAqLworCQlzZWwgPSAxIDw8IDU7CisJfQorCisJd3JpdGViKHNlbCwgaW9jX2Jhc2UpOworCisJZWMtPmlycV9kYXRhICAgICAgPSBzdGF0ZTsKKwllYy0+b3BzICAgICAgICAgICA9ICZpY3NpZGVfb3BzX2FyY2luX3Y2OworCisJc3RhdGUtPmlycV9wb3J0ICAgPSBlYXNpX2Jhc2U7CisJc3RhdGUtPmlvY19iYXNlICAgPSBpb2NfYmFzZTsKKworCS8qCisJICogQmUgb24gdGhlIHNhZmUgc2lkZSAtIGRpc2FibGUgaW50ZXJydXB0cworCSAqLworCWljc2lkZV9pcnFkaXNhYmxlX2FyY2luX3Y2KGVjLCAwKTsKKworCS8qCisJICogRmluZCBhbmQgcmVnaXN0ZXIgdGhlIGludGVyZmFjZXMuCisJICovCisJaHdpZiA9IGljc2lkZV9zZXR1cChlYXNpX2Jhc2UsICZpY3NpZGVfY2FyZGluZm9fdjZfMSwgZWMpOworCW1hdGUgPSBpY3NpZGVfc2V0dXAoZWFzaV9iYXNlLCAmaWNzaWRlX2NhcmRpbmZvX3Y2XzIsIGVjKTsKKworCWlmICghaHdpZiB8fCAhbWF0ZSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHVubWFwX3BvcnQ7CisJfQorCisJc3RhdGUtPmh3aWZbMF0gICAgPSBod2lmOworCXN0YXRlLT5od2lmWzFdICAgID0gbWF0ZTsKKworCWh3aWYtPm1hc2twcm9jICAgID0gaWNzaWRlX21hc2twcm9jOworCWh3aWYtPmNoYW5uZWwgICAgID0gMDsKKwlod2lmLT5od2lmX2RhdGEgICA9IHN0YXRlOworCWh3aWYtPm1hdGUgICAgICAgID0gbWF0ZTsKKwlod2lmLT5zZXJpYWxpemVkICA9IDE7CisJaHdpZi0+Y29uZmlnX2RhdGEgPSAodW5zaWduZWQgbG9uZylpb2NfYmFzZTsKKwlod2lmLT5zZWxlY3RfZGF0YSA9IHNlbDsKKwlod2lmLT5ody5kbWEgICAgICA9IGVjLT5kbWE7CisKKwltYXRlLT5tYXNrcHJvYyAgICA9IGljc2lkZV9tYXNrcHJvYzsKKwltYXRlLT5jaGFubmVsICAgICA9IDE7CisJbWF0ZS0+aHdpZl9kYXRhICAgPSBzdGF0ZTsKKwltYXRlLT5tYXRlICAgICAgICA9IGh3aWY7CisJbWF0ZS0+c2VyaWFsaXplZCAgPSAxOworCW1hdGUtPmNvbmZpZ19kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW9jX2Jhc2U7CisJbWF0ZS0+c2VsZWN0X2RhdGEgPSBzZWwgfCAxOworCW1hdGUtPmh3LmRtYSAgICAgID0gZWMtPmRtYTsKKworCWlmIChlYy0+ZG1hICE9IE5PX0RNQSAmJiAhcmVxdWVzdF9kbWEoZWMtPmRtYSwgaHdpZi0+bmFtZSkpIHsKKwkJaWNzaWRlX2RtYV9pbml0KGh3aWYpOworCQlpY3NpZGVfZG1hX2luaXQobWF0ZSk7CisJfQorCisJcHJvYmVfaHdpZl9pbml0KGh3aWYpOworCXByb2JlX2h3aWZfaW5pdChtYXRlKTsKKwljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJcmV0dXJuIDA7CisKKyB1bm1hcF9wb3J0OgorCWlmIChlYXNpX2Jhc2UgIT0gaW9jX2Jhc2UpCisJCWlvdW5tYXAoZWFzaV9iYXNlKTsKKyB1bm1hcF9zbG90OgorCWlvdW5tYXAoaW9jX2Jhc2UpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraWNzaWRlX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGU7CisJdm9pZCBfX2lvbWVtICppZG1lbTsKKwlpbnQgcmV0OworCisJcmV0ID0gZWNhcmRfcmVxdWVzdF9yZXNvdXJjZXMoZWMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWNzaWRlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZS0+dHlwZQk9IElDU19UWVBFX05PVFlQRTsKKwlzdGF0ZS0+ZGV2CT0gJmVjLT5kZXY7CisKKwlpZG1lbSA9IGlvcmVtYXAoZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKSwKKwkJCWVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX0lPQ0ZBU1QpKTsKKwlpZiAoaWRtZW0pIHsKKwkJdW5zaWduZWQgaW50IHR5cGU7CisKKwkJdHlwZSA9IHJlYWRiKGlkbWVtICsgSUNTX0lERU5UX09GRlNFVCkgJiAxOworCQl0eXBlIHw9IChyZWFkYihpZG1lbSArIElDU19JREVOVF9PRkZTRVQgKyA0KSAmIDEpIDw8IDE7CisJCXR5cGUgfD0gKHJlYWRiKGlkbWVtICsgSUNTX0lERU5UX09GRlNFVCArIDgpICYgMSkgPDwgMjsKKwkJdHlwZSB8PSAocmVhZGIoaWRtZW0gKyBJQ1NfSURFTlRfT0ZGU0VUICsgMTIpICYgMSkgPDwgMzsKKwkJaW91bm1hcChpZG1lbSk7CisKKwkJc3RhdGUtPnR5cGUgPSB0eXBlOworCX0KKworCXN3aXRjaCAoc3RhdGUtPnR5cGUpIHsKKwljYXNlIElDU19UWVBFX0EzSU46CisJCWRldl93YXJuKCZlYy0+ZGV2LCAiQTNJTiB1bnN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBJQ1NfVFlQRV9BM1VTRVI6CisJCWRldl93YXJuKCZlYy0+ZGV2LCAiQTNVU0VSIHVuc3VwcG9ydGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJYnJlYWs7CisKKwljYXNlIElDU19UWVBFX1Y1OgorCQlyZXQgPSBpY3NpZGVfcmVnaXN0ZXJfdjUoc3RhdGUsIGVjKTsKKwkJYnJlYWs7CisKKwljYXNlIElDU19UWVBFX1Y2OgorCQlyZXQgPSBpY3NpZGVfcmVnaXN0ZXJfdjYoc3RhdGUsIGVjKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmZWMtPmRldiwgInVua25vd24gaW50ZXJmYWNlIHR5cGVcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJZWNhcmRfc2V0X2RydmRhdGEoZWMsIHN0YXRlKTsKKwkJZ290byBvdXQ7CisJfQorCisJa2ZyZWUoc3RhdGUpOworIHJlbGVhc2U6CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaWNzaWRlX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCisJc3dpdGNoIChzdGF0ZS0+dHlwZSkgeworCWNhc2UgSUNTX1RZUEVfVjU6CisJCS8qIEZJWE1FOiB0ZWxsIElERSB0byBzdG9wIHVzaW5nIHRoZSBpbnRlcmZhY2UgKi8KKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwkJaWNzaWRlX2lycWRpc2FibGVfYXJjaW5fdjUoZWMsIDApOworCQlicmVhazsKKworCWNhc2UgSUNTX1RZUEVfVjY6CisJCS8qIEZJWE1FOiB0ZWxsIElERSB0byBzdG9wIHVzaW5nIHRoZSBpbnRlcmZhY2UgKi8KKwkJaWYgKGVjLT5kbWEgIT0gTk9fRE1BKQorCQkJZnJlZV9kbWEoZWMtPmRtYSk7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCWljc2lkZV9pcnFkaXNhYmxlX2FyY2luX3Y2KGVjLCAwKTsKKworCQkvKiBSZXNldCB0aGUgUk9NIHBvaW50ZXIvRUFTSSBzZWxlY3Rpb24gKi8KKwkJd3JpdGViKDAsIHN0YXRlLT5pb2NfYmFzZSk7CisJCWJyZWFrOworCX0KKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwllYy0+b3BzID0gTlVMTDsKKwllYy0+aXJxX2RhdGEgPSBOVUxMOworCisJaWYgKHN0YXRlLT5pb2NfYmFzZSkKKwkJaW91bm1hcChzdGF0ZS0+aW9jX2Jhc2UpOworCWlmIChzdGF0ZS0+aW9jX2Jhc2UgIT0gc3RhdGUtPmlycV9wb3J0KQorCQlpb3VubWFwKHN0YXRlLT5pcnFfcG9ydCk7CisKKwlrZnJlZShzdGF0ZSk7CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgdm9pZCBpY3NpZGVfc2h1dGRvd24oc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMgZnJvbSB0aGlzIGNhcmQuICBXZSBuZWVkIHRvIGRvCisJICogdGhpcyBiZWZvcmUgZGlzYWJsaW5nIEVBU0kgc2luY2Ugd2UgbWF5IGJlIGFjY2Vzc2luZworCSAqIHRoaXMgcmVnaXN0ZXIgdmlhIHRoYXQgcmVnaW9uLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwllYy0+b3BzLT5pcnFkaXNhYmxlKGVjLCAwKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBST00gcG9pbnRlciBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSBST00KKwkgKiBhZnRlciBhIHNvZnQgcmVib290LiAgVGhpcyBhbHNvIGRpc2FibGVzIGFjY2VzcyB0bworCSAqIHRoZSBJREUgdGFza2ZpbGUgdmlhIHRoZSBFQVNJIHJlZ2lvbi4KKwkgKi8KKwlpZiAoc3RhdGUtPmlvY19iYXNlKQorCQl3cml0ZWIoMCwgc3RhdGUtPmlvY19iYXNlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBpY3NpZGVfaWRzW10gPSB7CisJeyBNQU5VX0lDUywgIFBST0RfSUNTX0lERSAgfSwKKwl7IE1BTlVfSUNTMiwgUFJPRF9JQ1MyX0lERSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgaWNzaWRlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaWNzaWRlX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaWNzaWRlX3JlbW92ZSksCisJLnNodXRkb3duCT0gaWNzaWRlX3NodXRkb3duLAorCS5pZF90YWJsZQk9IGljc2lkZV9pZHMsCisJLmRydiA9IHsKKwkJLm5hbWUJPSAiaWNzaWRlIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaWNzaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKCZpY3NpZGVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUNTIElERSBkcml2ZXIiKTsKKworbW9kdWxlX2luaXQoaWNzaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXJtL2lkZV9hcm0uYyBiL2RyaXZlcnMvaWRlL2FybS9pZGVfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0ODhjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2FybS9pZGVfYXJtLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIEFSTS9BUk0yNiBkZWZhdWx0IElERSBob3N0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CisgKiBCYXNlZCBvbiBjb2RlIGJ5OiBSdXNzZWxsIEtpbmcsIElhbiBNb2x0b24gYW5kIEFsZXhhbmRlciBTY2h1bHouCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmZGVmIENPTkZJR19BUk0yNgorIyBkZWZpbmUgSURFX0FSTV9IT1NUCShtYWNoaW5lX2lzX2E1aygpKQorI2Vsc2UKKyMgZGVmaW5lIElERV9BUk1fSE9TVAkoMSkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfQ0xQUzc1MDAKKyMgaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyMKKyMgZGVmaW5lIElERV9BUk1fSU8JKElTQVNMT1RfSU8gKyAweDFmMCkKKyMgZGVmaW5lIElERV9BUk1fSVJRCUlSUV9JU0FfMTQKKyNlbHNlCisjIGRlZmluZSBJREVfQVJNX0lPCTB4MWYwCisjIGRlZmluZSBJREVfQVJNX0lSUQlJUlFfSEFSRERJU0sKKyNlbmRpZgorCit2b2lkIF9faW5pdCBpZGVfYXJtX2luaXQodm9pZCkKK3sKKwlpZiAoSURFX0FSTV9IT1NUKSB7CisJCWh3X3JlZ3NfdCBodzsKKworCQltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKwkJaWRlX3N0ZF9pbml0X3BvcnRzKCZodywgSURFX0FSTV9JTywgSURFX0FSTV9JTyArIDB4MjA2KTsKKwkJaHcuaXJxID0gSURFX0FSTV9JUlE7CisJCWlkZV9yZWdpc3Rlcl9odygmaHcsIE5VTEwpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FybS9yYXBpZGUuYyBiL2RyaXZlcnMvaWRlL2FybS9yYXBpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU4MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvYXJtL3JhcGlkZS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvYXJtL3JhcGlkZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgUnVzc2VsbCBLaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworLyoKKyAqIFNvbWV0aGluZyBsaWtlIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBpbiBnZW5lcmljIGNvZGUsIGJ1dCBpc24ndC4KKyAqLworc3RhdGljIGlkZV9od2lmX3QgKgorcmFwaWRlX2xvY2F0ZV9od2lmKHZvaWQgX19pb21lbSAqYmFzZSwgdm9pZCBfX2lvbWVtICpjdHJsLCB1bnNpZ25lZCBpbnQgc3osIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwlpZGVfaHdpZl90ICpod2lmOworCWludCBpbmRleCwgaTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkgeworCQlod2lmID0gaWRlX2h3aWZzICsgaW5kZXg7CisJCWlmIChod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdID09IHBvcnQpCisJCQlnb3RvIGZvdW5kOworCX0KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkgeworCQlod2lmID0gaWRlX2h3aWZzICsgaW5kZXg7CisJCWlmIChod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdID09IDApCisJCQlnb3RvIGZvdW5kOworCX0KKworCXJldHVybiBOVUxMOworCisgZm91bmQ6CisJZm9yIChpID0gSURFX0RBVEFfT0ZGU0VUOyBpIDw9IElERV9TVEFUVVNfT0ZGU0VUOyBpKyspIHsKKwkJaHdpZi0+aHcuaW9fcG9ydHNbaV0gPSBwb3J0OworCQlod2lmLT5pb19wb3J0c1tpXSA9IHBvcnQ7CisJCXBvcnQgKz0gc3o7CisJfQorCWh3aWYtPmh3LmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0gPSAodW5zaWduZWQgbG9uZyljdHJsOworCWh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0gPSAodW5zaWduZWQgbG9uZyljdHJsOworCWh3aWYtPmh3LmlycSA9IGh3aWYtPmlycSA9IGlycTsKKwlod2lmLT5tbWlvID0gMjsKKwlkZWZhdWx0X2h3aWZfbW1pb3BzKGh3aWYpOworCisJcmV0dXJuIGh3aWY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CityYXBpZGVfcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgY29uc3Qgc3RydWN0IGVjYXJkX2lkICppZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZWNhcmRfcmVxdWVzdF9yZXNvdXJjZXMoZWMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJYmFzZSA9IGlvcmVtYXAoZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19NRU1DKSwKKwkJICAgICAgIGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpKTsKKwlpZiAoIWJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlOworCX0KKworCWh3aWYgPSByYXBpZGVfbG9jYXRlX2h3aWYoYmFzZSwgYmFzZSArIDB4ODE4LCAxIDw8IDYsIGVjLT5pcnEpOworCWlmIChod2lmKSB7CisJCWh3aWYtPmh3aWZfZGF0YSA9IGJhc2U7CisJCWh3aWYtPmdlbmRldi5wYXJlbnQgPSAmZWMtPmRldjsKKwkJaHdpZi0+bm9wcm9iZSA9IDA7CisJCXByb2JlX2h3aWZfaW5pdChod2lmKTsKKwkJY3JlYXRlX3Byb2NfaWRlX2ludGVyZmFjZXMoKTsKKwkJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGh3aWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlpb3VubWFwKGJhc2UpOworIHJlbGVhc2U6CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcmFwaWRlX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgTlVMTCk7CisKKwkvKiB0aGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheSAqLworCWlkZV91bnJlZ2lzdGVyKGh3aWYgLSBpZGVfaHdpZnMpOworCWlvdW5tYXAoaHdpZi0+aHdpZl9kYXRhKTsKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfaWQgcmFwaWRlX2lkc1tdID0geworCXsgTUFOVV9ZRUxMT1dTVE9ORSwgUFJPRF9ZRUxMT1dTVE9ORV9SQVBJREUzMiB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgcmFwaWRlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcmFwaWRlX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocmFwaWRlX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gcmFwaWRlX2lkcywKKwkuZHJ2ID0geworCQkubmFtZQk9ICJyYXBpZGUiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYXBpZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJnJhcGlkZV9kcml2ZXIpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlllbGxvd3N0b25lIFJBUElERSBkcml2ZXIiKTsKKworbW9kdWxlX2luaXQocmFwaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY3Jpcy9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL2NyaXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMjk0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2NyaXMvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitFWFRSQV9DRkxBR1MJCQkJKz0gLUlkcml2ZXJzL2lkZQorCitvYmotJChDT05GSUdfRVRSQVhfQVJDSF9WMTApCQkrPSBpZGUtdjEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NyaXMvaWRlLXYxMC5jIGIvZHJpdmVycy9pZGUvY3Jpcy9pZGUtdjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MDIyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2NyaXMvaWRlLXYxMC5jCkBAIC0wLDAgKzEsODQyIEBACisvKiAkSWQ6IGlkZS5jLHYgMS40IDIwMDQvMTAvMTIgMDc6NTU6NDggc3RhcnZpayBFeHAgJAorICoKKyAqIEV0cmF4IHNwZWNpZmljIElERSBmdW5jdGlvbnMsIGxpa2UgaW5pdCBhbmQgUElPLW1vZGUgc2V0dGluZyBldGMuCisgKiBBbG1vc3QgdGhlIGVudGlyZSBpZGUuYyBpcyB1c2VkIGZvciB0aGUgcmVzdCBvZiB0aGUgRXRyYXggQVRBIGRyaXZlci4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCisgKiBBdXRob3JzOiAgICBCam9ybiBXZXNlbiAgICAgICAgKGluaXRpYWwgdmVyc2lvbikKKyAqICAgICAgICAgICAgIE1pa2FlbCBTdGFydmlrICAgICAocGlvIHNldHVwIHN0dWZmLCBMaW51eCAyLjYgcG9ydCkKKyAqLworCisvKiBSZWdhcmRpbmcgRE1BOgorICoKKyAqIFRoZXJlIGFyZSB0d28gZm9ybXMgb2YgRE1BIC0gIkRNQSBoYW5kc2hha2luZyIgYmV0d2VlbiB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgZHJpdmUsCisgKiBhbmQgRE1BIGJldHdlZW4gdGhlIG1lbW9yeSBhbmQgdGhlIGludGVyZmFjZS4gV2UgY2FuIEFMV0FZUyB1c2UgdGhlIGxhdHRlciwgc2luY2UgaXQncworICogc29tZXRoaW5nIGJ1aWx0LWluIGluIHRoZSBFdHJheC4gSG93ZXZlciBvbmx5IHNvbWUgZHJpdmVzIHN1cHBvcnQgdGhlIERNQS1tb2RlIGhhbmRzaGFraW5nCisgKiBvbiB0aGUgQVRBLWJ1cy4gVGhlIG5vcm1hbCBQQyBkcml2ZXIgYW5kIFRyaXRvbiBpbnRlcmZhY2UgZGlzYWJsZXMgbWVtb3J5LWlmIERNQSB3aGVuIHRoZQorICogZGV2aWNlIGNhbid0IGRvIERNQSBoYW5kc2hha2luZyBmb3Igc29tZSBzdHVwaWQgcmVhc29uLiBXZSBkb24ndCBuZWVkIHRvIGRvIHRoYXQuCisgKi8KKworI3VuZGVmIFJFQUxMWV9TTE9XX0lPICAgICAgICAgICAvKiBtb3N0IHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zdmludG8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKy8qIG51bWJlciBvZiBFdHJheCBETUEgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTUFYX0RNQV9ERVNDUlMgNjQKKworLyogbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGJ1c3ktZmxhZ3Mgd2hlbiByZWFkaW5nL3dyaXRpbmcgSURFLXJlZ2lzdGVycworICogdGhpcyBjYW4ndCBiZSB0b28gaGlnaCBiZWNhdXNlIGEgaHVuZyBoYXJkZGlzayBtaWdodCBjYXVzZSB0aGUgd2F0Y2hkb2cKKyAqIHRvIHRyaWdnZXIgKHNvbWV0aW1lcyBJTkIgYW5kIE9VVEIgYXJlIGNhbGxlZCB3aXRoIGlycSdzIGRpc2FibGVkKQorICovCisKKyNkZWZpbmUgSURFX1JFR0lTVEVSX1RJTUVPVVQgMzAwCisKK3N0YXRpYyBpbnQgZTEwMF9yZWFkX2NvbW1hbmQgPSAwOworCisjZGVmaW5lIExPV0RCKHgpCisjZGVmaW5lIEQoeCkKKworc3RhdGljIGludCBlMTAwX2lkZV9idWlsZF9kbWF0YWJsZSAoaWRlX2RyaXZlX3QgKmRyaXZlKTsKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZXRyYXhfZG1hX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSk7CisKK3ZvaWQKK2V0cmF4MTAwX2lkZV9vdXR3KHVuc2lnbmVkIHNob3J0IGRhdGEsIHVuc2lnbmVkIGxvbmcgcmVnKSB7CisJaW50IHRpbWVsZWZ0OworCUxPV0RCKHByaW50aygib3c6IGRhdGEgMHgleCwgcmVnIDB4JXhcbiIsIGRhdGEsIHJlZykpOworCisJLyogbm90ZSB0aGUgbGFjayBvZiBoYW5kbGluZyBhbnkgdGltZW91dHMuIHdlIHN0b3Agd2FpdGluZywgYnV0IHdlIGRvbid0CisJICogcmVhbGx5IG5vdGlmeSBhbnlib2R5LgorCSAqLworCisJdGltZWxlZnQgPSBJREVfUkVHSVNURVJfVElNRU9VVDsKKwkvKiB3YWl0IGZvciBidXN5IGZsYWcgKi8KKwl3aGlsZSh0aW1lbGVmdCAmJiAoKlJfQVRBX1NUQVRVU19EQVRBICYgSU9fTUFTSyhSX0FUQV9TVEFUVVNfREFUQSwgYnVzeSkpKQorCQl0aW1lbGVmdC0tOworCisJLyoKKwkgKiBGYWxsIHRocm91Z2ggYXQgYSB0aW1lb3V0LCBzbyB0aGUgb25nb2luZyBjb21tYW5kIHdpbGwgYmUKKwkgKiBhYm9ydGVkIGJ5IHRoZSB3cml0ZSBiZWxvdywgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBkdW1teQorCSAqIGNvbW1hbmQgdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIuICBUaGlzIGhhcHBlbnMgd2hlbiBhIGZhdWx0eQorCSAqIGRyaXZlIHRpbWVzIG91dCBvbiBhIGNvbW1hbmQuICBTZWUgY29tbWVudCBvbiB0aW1lb3V0IGluCisJICogSU5CLgorCSAqLworCWlmKCF0aW1lbGVmdCkKKwkJcHJpbnRrKCJBVEEgdGltZW91dCByZWcgMHglbHggOj0gMHgleFxuIiwgcmVnLCBkYXRhKTsKKworCSpSX0FUQV9DVFJMX0RBVEEgPSByZWcgfCBkYXRhOyAvKiB3cml0ZSBkYXRhIHRvIHRoZSBkcml2ZSdzIHJlZ2lzdGVyICovCisKKwl0aW1lbGVmdCA9IElERV9SRUdJU1RFUl9USU1FT1VUOworCS8qIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHJlYWR5ICovCisJd2hpbGUodGltZWxlZnQgJiYgISgqUl9BVEFfU1RBVFVTX0RBVEEgJgorCQkJICAgIElPX01BU0soUl9BVEFfU1RBVFVTX0RBVEEsIHRyX3JkeSkpKQorCQl0aW1lbGVmdC0tOworfQorCit2b2lkCitldHJheDEwMF9pZGVfb3V0Yih1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCWV0cmF4MTAwX2lkZV9vdXR3KGRhdGEsIHJlZyk7Cit9CisKK3ZvaWQKK2V0cmF4MTAwX2lkZV9vdXRic3luYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGFkZHIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlldHJheDEwMF9pZGVfb3V0dyhhZGRyLCBwb3J0KTsKK30KKwordW5zaWduZWQgc2hvcnQKK2V0cmF4MTAwX2lkZV9pbncodW5zaWduZWQgbG9uZyByZWcpIHsKKwlpbnQgc3RhdHVzOworCWludCB0aW1lbGVmdDsKKworCXRpbWVsZWZ0ID0gSURFX1JFR0lTVEVSX1RJTUVPVVQ7CisJLyogd2FpdCBmb3IgYnVzeSBmbGFnICovCisJd2hpbGUodGltZWxlZnQgJiYgKCpSX0FUQV9TVEFUVVNfREFUQSAmIElPX01BU0soUl9BVEFfU1RBVFVTX0RBVEEsIGJ1c3kpKSkKKwkJdGltZWxlZnQtLTsKKworCWlmKCF0aW1lbGVmdCkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBhc2tlZCB0byByZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIsIGxpa2UgZm9yCisJCSAqIGV4YW1wbGUgd2hlbiBhIGNvbW1hbmQgZG9lcyBub3QgY29tcGxldGUgZm9yIGFuCisJCSAqIGV4dGVuZGVkIHRpbWUsIGJ1dCB0aGUgQVRBIGludGVyZmFjZSBpcyBzdHVjayBpbiBhCisJCSAqIGJ1c3kgc3RhdGUgYXQgdGhlICpFVFJBWCogQVRBIGludGVyZmFjZSBsZXZlbCAoYXMgaGFzCisJCSAqIGhhcHBlbmVkIHJlcGVhdGVkbHkgd2l0aCBhdCBsZWFzdCBvbmUgYmFkIGRpc2spLCB0aGVuCisJCSAqIHRoZSBiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHByZXRlbmQgdGhhdCB3ZSByZWFkCisJCSAqICJidXN5IiBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCBzbyB0aGUgSURFIGRyaXZlciB3aWxsCisJCSAqIHRpbWUtb3V0LCBhYm9ydCB0aGUgb25nb2luZyBjb21tYW5kIGFuZCBwZXJmb3JtIGEKKwkJICogcmVzZXQgc2VxdWVuY2UuICBOb3RlIHRoYXQgdGhlIHN1YnNlcXVlbnQgT1VUX0JZVEUKKwkJICogY2FsbCB3aWxsIGFsc28gdGltZW91dCBvbiBidXN5LCBidXQgYXMgbG9uZyBhcyB0aGUKKwkJICogd3JpdGUgaXMgc3RpbGwgcGVyZm9ybWVkLCBldmVyeXRoaW5nIHdpbGwgYmUgZmluZS4KKwkJICovCisJCWlmICgocmVnICYgSU9fTUFTSyAoUl9BVEFfQ1RSTF9EQVRBLCBhZGRyKSkKKwkJICAgID09IElPX0ZJRUxEIChSX0FUQV9DVFJMX0RBVEEsIGFkZHIsIElERV9TVEFUVVNfT0ZGU0VUKSkKKwkJCXJldHVybiBCVVNZX1NUQVQ7CisJCWVsc2UKKwkJCS8qIEZvciBvdGhlciByYXJlIGNhc2VzIHdlIGFzc3VtZSAwIGlzIGdvb2QgZW5vdWdoLiAgKi8KKwkJCXJldHVybiAwOworCX0KKworCSpSX0FUQV9DVFJMX0RBVEEgPSByZWcgfCBJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIHJ3LCByZWFkKTsgLyogcmVhZCBkYXRhICovCisKKwl0aW1lbGVmdCA9IElERV9SRUdJU1RFUl9USU1FT1VUOworCS8qIHdhaXQgZm9yIGF2YWlsYWJsZSAqLworCXdoaWxlKHRpbWVsZWZ0ICYmICEoKHN0YXR1cyA9ICpSX0FUQV9TVEFUVVNfREFUQSkgJgorCQkJICAgIElPX01BU0soUl9BVEFfU1RBVFVTX0RBVEEsIGRhdikpKQorCQl0aW1lbGVmdC0tOworCisJaWYoIXRpbWVsZWZ0KQorCQlyZXR1cm4gMDsKKworCUxPV0RCKHByaW50aygiaW5iOiAweCV4IGZyb20gcmVnIDB4JXhcbiIsIHN0YXR1cyAmIDB4ZmYsIHJlZykpOworCisgICAgICAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpc3RhdHVzOworfQorCit1bnNpZ25lZCBjaGFyCitldHJheDEwMF9pZGVfaW5iKHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXJldHVybiAodW5zaWduZWQgY2hhcilldHJheDEwMF9pZGVfaW53KHJlZyk7Cit9CisKKy8qIFBJTyB0aW1pbmcgKGluIFJfQVRBX0NPTkZJRykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBBRERSRVNTIDogICAgIF9fX19fX19fLworICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fXworICogRElPUiAgICA6ICAgICBfX19fX19fX19fX18vICAgICAgICAgICAgICAgXF9fX19fX19fX18KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX18KKyAqIERBVEEgICAgOiAgICAgWFhYWFhYWFhYWFhYWFhYWF9fX19fX19fX19fX19fX1hYWFhYWFhYCisgKgorICoKKyAqIERJT1IgaXMgdW5idWZmZXJlZCB3aGlsZSBhZGRyZXNzIGFuZCBkYXRhIGlzIGJ1ZmZlcmVkLgorICogVGhpcyBjcmVhdGVzIHR3byBwcm9ibGVtczoKKyAqIDEuIFRoZSBESU9SIHB1bHNlIGlzIHRvIGVhcmx5IChiZWNhdXNlIGl0IGlzIHVuYnVmZmVyZWQpCisgKiAyLiBUaGUgcmlzZSB0aW1lIG9mIERJT1IgaXMgbG9uZworICoKKyAqIFRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZSBkaWZmZXJlbnQgcGxhdXNpYmxlIHNvbHV0aW9ucworICogMS4gVXNlIGEgcGFkIGNhcGFibGUgb2YgbGFyZ2VyIGN1cnJlbnRzIGluIEV0cmF4CisgKiAyLiBVc2UgYW4gZXh0ZXJuYWwgYnVmZmVyCisgKiAzLiBNYWtlIHRoZSBzdHJvYmUgcHVsc2UgbG9uZ2VyCisgKgorICogU29tZSBvZiB0aGUgc3Ryb2JlIHRpbWluZ3MgYmVsb3cgYXJlIG1vZGlmaWVkIHRvIGNvbXBlbnNhdGUKKyAqIGZvciB0aGlzLiBUaGlzIGltcGxpZXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgZGVjcmVhc2UuCisgKgorICogVEhJUyBTSE9VTEQgTkVWRVIgQkUgQ0hBTkdFRCEKKyAqCisgKiBUT0RPOiBJcyB0aGlzIHRydWUgZm9yIHRoZSBsYXRlc3QgTFggYm9hcmRzIHN0aWxsID8KKyAqLworCisjZGVmaW5lIEFUQV9ETUEyX1NUUk9CRSAgNAorI2RlZmluZSBBVEFfRE1BMl9IT0xEICAgIDAKKyNkZWZpbmUgQVRBX0RNQTFfU1RST0JFICA0CisjZGVmaW5lIEFUQV9ETUExX0hPTEQgICAgMQorI2RlZmluZSBBVEFfRE1BMF9TVFJPQkUgMTIKKyNkZWZpbmUgQVRBX0RNQTBfSE9MRCAgICA5CisjZGVmaW5lIEFUQV9QSU80X1NFVFVQICAgMQorI2RlZmluZSBBVEFfUElPNF9TVFJPQkUgIDUKKyNkZWZpbmUgQVRBX1BJTzRfSE9MRCAgICAwCisjZGVmaW5lIEFUQV9QSU8zX1NFVFVQICAgMQorI2RlZmluZSBBVEFfUElPM19TVFJPQkUgIDUKKyNkZWZpbmUgQVRBX1BJTzNfSE9MRCAgICAxCisjZGVmaW5lIEFUQV9QSU8yX1NFVFVQICAgMQorI2RlZmluZSBBVEFfUElPMl9TVFJPQkUgIDYKKyNkZWZpbmUgQVRBX1BJTzJfSE9MRCAgICAyCisjZGVmaW5lIEFUQV9QSU8xX1NFVFVQICAgMgorI2RlZmluZSBBVEFfUElPMV9TVFJPQkUgMTEKKyNkZWZpbmUgQVRBX1BJTzFfSE9MRCAgICA0CisjZGVmaW5lIEFUQV9QSU8wX1NFVFVQICAgNAorI2RlZmluZSBBVEFfUElPMF9TVFJPQkUgMTkKKyNkZWZpbmUgQVRBX1BJTzBfSE9MRCAgICA0CisKK3N0YXRpYyBpbnQgZTEwMF9kbWFfY2hlY2sgKGlkZV9kcml2ZV90ICpkcml2ZSk7CitzdGF0aWMgdm9pZCBlMTAwX2RtYV9zdGFydChpZGVfZHJpdmVfdCAqZHJpdmUpOworc3RhdGljIGludCBlMTAwX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSk7CitzdGF0aWMgdm9pZCBlMTAwX2lkZV9pbnB1dF9kYXRhIChpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIGUxMDBfaWRlX291dHB1dF9kYXRhIChpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIGUxMDBfYXRhcGlfaW5wdXRfYnl0ZXMoaWRlX2RyaXZlX3QgKmRyaXZlLCB2b2lkICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBlMTAwX2F0YXBpX291dHB1dF9ieXRlcyhpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgZTEwMF9kbWFfb2ZmIChpZGVfZHJpdmVfdCAqZHJpdmUpOworCisKKy8qCisgKiBnb29kX2RtYV9kcml2ZXMoKSBsaXN0cyB0aGUgbW9kZWwgbmFtZXMgKGZyb20gImhkcGFybSAtaSIpCisgKiBvZiBkcml2ZXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgbXdvcmQyIERNQSBidXQgd2hpY2ggYXJlCisgKiBrbm93biB0byB3b3JrIGZpbmUgd2l0aCB0aGlzIGludGVyZmFjZSB1bmRlciBMaW51eC4KKyAqLworCitjb25zdCBjaGFyICpnb29kX2RtYV9kcml2ZXNbXSA9IHsiTWljcm9wb2xpcyAyMTEyQSIsCisJCQkJICJDT05ORVIgQ1RNQSA0MDAwIiwKKwkJCQkgIkNPTk5FUiBDVFQ4MDAwLUEiLAorCQkJCSBOVUxMfTsKKworc3RhdGljIHZvaWQgdHVuZV9lMTAwX2lkZShpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgcGlvKQoreworCXBpbyA9IDQ7CisJLyogcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDQsIE5VTEwpOyAqLworCisJLyogc2V0IHBpbyBtb2RlISAqLworCisJc3dpdGNoKHBpbykgeworCQljYXNlIDA6CisJCQkqUl9BVEFfQ09ORklHID0gKCBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBlbmFibGUsICAgICAxICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIGRtYV9zdHJvYmUsIEFUQV9ETUEyX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zZXR1cCwgIEFUQV9QSU8wX1NFVFVQICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zdHJvYmUsIEFUQV9QSU8wX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPMF9IT0xEICkgKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqUl9BVEFfQ09ORklHID0gKCBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBlbmFibGUsICAgICAxICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIGRtYV9zdHJvYmUsIEFUQV9ETUEyX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zZXR1cCwgIEFUQV9QSU8xX1NFVFVQICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zdHJvYmUsIEFUQV9QSU8xX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPMV9IT0xEICkgKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkqUl9BVEFfQ09ORklHID0gKCBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBlbmFibGUsICAgICAxICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIGRtYV9zdHJvYmUsIEFUQV9ETUEyX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zZXR1cCwgIEFUQV9QSU8yX1NFVFVQICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zdHJvYmUsIEFUQV9QSU8yX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPMl9IT0xEICkgKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqUl9BVEFfQ09ORklHID0gKCBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBlbmFibGUsICAgICAxICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIGRtYV9zdHJvYmUsIEFUQV9ETUEyX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zZXR1cCwgIEFUQV9QSU8zX1NFVFVQICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zdHJvYmUsIEFUQV9QSU8zX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPM19IT0xEICkgKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQkqUl9BVEFfQ09ORklHID0gKCBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBlbmFibGUsICAgICAxICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIGRtYV9zdHJvYmUsIEFUQV9ETUEyX1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zZXR1cCwgIEFUQV9QSU80X1NFVFVQICkgfAorCQkJCQkgIElPX0ZJRUxEKCBSX0FUQV9DT05GSUcsIHBpb19zdHJvYmUsIEFUQV9QSU80X1NUUk9CRSApIHwKKwkJCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPNF9IT0xEICkgKTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBlMTAwX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSkgeworCQllMTAwX3JlYWRfY29tbWFuZCA9IDA7CisKKwkJUkVTRVRfRE1BKEFUQV9UWF9ETUFfTkJSKTsgLyogc29tZXRpbWVzIHRoZSBETUEgY2hhbm5lbCBnZXQgc3R1Y2sgc28gd2UgbmVlZCB0byBkbyB0aGlzICovCisJCVdBSVRfRE1BKEFUQV9UWF9ETUFfTkJSKTsKKwl9IGVsc2UgeworCQllMTAwX3JlYWRfY29tbWFuZCA9IDE7CisKKwkJUkVTRVRfRE1BKEFUQV9SWF9ETUFfTkJSKTsgLyogc29tZXRpbWVzIHRoZSBETUEgY2hhbm5lbCBnZXQgc3R1Y2sgc28gd2UgbmVlZCB0byBkbyB0aGlzICovCisJCVdBSVRfRE1BKEFUQV9SWF9ETUFfTkJSKTsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIEV0cmF4IERNQSBkZXNjcmlwdG9ycyAqLworCWlmIChlMTAwX2lkZV9idWlsZF9kbWF0YWJsZShkcml2ZSkpIHsKKwkJaWRlX21hcF9zZyhkcml2ZSwgcnEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZTEwMF9kbWFfZXhlY19jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjb21tYW5kKQoreworCS8qIHNldCB0aGUgaXJxIGhhbmRsZXIgd2hpY2ggd2lsbCBmaW5pc2ggdGhlIHJlcXVlc3Qgd2hlbiBETUEgaXMgZG9uZSAqLworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmV0cmF4X2RtYV9pbnRyLCBXQUlUX0NNRCwgTlVMTCk7CisKKwkvKiBpc3N1ZSBjbWQgdG8gZHJpdmUgKi8KKwlldHJheDEwMF9pZGVfb3V0Yihjb21tYW5kLCBJREVfQ09NTUFORF9SRUcpOworfQorCit2b2lkIF9faW5pdAoraW5pdF9lMTAwX2lkZSAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZHVtbXk7CisJaW50IGg7CisKKwlwcmludGsoImlkZTogRVRSQVggMTAwTFggYnVpbHQtaW4gQVRBIERNQSBjb250cm9sbGVyXG4iKTsKKworCS8qIGZpcnN0IGZpbGwgaW4gc29tZSBzdHVmZiBpbiB0aGUgaWRlX2h3aWZzIGZpZWxkcyAqLworCisJZm9yKGggPSAwOyBoIDwgTUFYX0hXSUZTOyBoKyspIHsKKwkJaWRlX2h3aWZfdCAqaHdpZiA9ICZpZGVfaHdpZnNbaF07CisJCWh3aWYtPm1taW8gPSAyOworCQlod2lmLT5jaGlwc2V0ID0gaWRlX2V0cmF4MTAwOworCQlod2lmLT50dW5lcHJvYyA9ICZ0dW5lX2UxMDBfaWRlOworICAgICAgICAgICAgICAgIGh3aWYtPmF0YV9pbnB1dF9kYXRhID0gJmUxMDBfaWRlX2lucHV0X2RhdGE7CisgICAgICAgICAgICAgICAgaHdpZi0+YXRhX291dHB1dF9kYXRhID0gJmUxMDBfaWRlX291dHB1dF9kYXRhOworICAgICAgICAgICAgICAgIGh3aWYtPmF0YXBpX2lucHV0X2J5dGVzID0gJmUxMDBfYXRhcGlfaW5wdXRfYnl0ZXM7CisgICAgICAgICAgICAgICAgaHdpZi0+YXRhcGlfb3V0cHV0X2J5dGVzID0gJmUxMDBfYXRhcGlfb3V0cHV0X2J5dGVzOworICAgICAgICAgICAgICAgIGh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmZTEwMF9kbWFfY2hlY2s7CisgICAgICAgICAgICAgICAgaHdpZi0+aWRlX2RtYV9lbmQgPSAmZTEwMF9kbWFfZW5kOworCQlod2lmLT5kbWFfc2V0dXAgPSAmZTEwMF9kbWFfc2V0dXA7CisJCWh3aWYtPmRtYV9leGVjX2NtZCA9ICZlMTAwX2RtYV9leGVjX2NtZDsKKwkJaHdpZi0+ZG1hX3N0YXJ0ID0gJmUxMDBfZG1hX3N0YXJ0OworCQlod2lmLT5PVVRCID0gJmV0cmF4MTAwX2lkZV9vdXRiOworCQlod2lmLT5PVVRXID0gJmV0cmF4MTAwX2lkZV9vdXR3OworCQlod2lmLT5PVVRCU1lOQyA9ICZldHJheDEwMF9pZGVfb3V0YnN5bmM7CisJCWh3aWYtPklOQiA9ICZldHJheDEwMF9pZGVfaW5iOworCQlod2lmLT5JTlcgPSAmZXRyYXgxMDBfaWRlX2ludzsKKwkJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseSA9ICZlMTAwX2RtYV9vZmY7CisJfQorCisJLyogYWN0dWFsbHkgcmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgZXRyYXgxMDAgaWRlL2F0YSBpbnRlcmZhY2UgKi8KKworCSpSX0FUQV9DVFJMX0RBVEEgPSAwOworCSpSX0FUQV9UUkFOU0ZFUl9DTlQgPSAwOworCSpSX0FUQV9DT05GSUcgPSAwOworCisJZ2VuY29uZmlnX3NoYWRvdyA9IChnZW5jb25maWdfc2hhZG93ICYKKwkJCSAgICB+SU9fTUFTSyhSX0dFTl9DT05GSUcsIGRtYTIpICYKKwkJCSAgICB+SU9fTUFTSyhSX0dFTl9DT05GSUcsIGRtYTMpICYKKwkJCSAgICB+SU9fTUFTSyhSX0dFTl9DT05GSUcsIGF0YSkpIHwKKwkJKCBJT19TVEFURSggUl9HRU5fQ09ORklHLCBkbWEzLCBhdGEgICAgKSB8CisJCSAgSU9fU1RBVEUoIFJfR0VOX0NPTkZJRywgZG1hMiwgYXRhICAgICkgfAorCQkgIElPX1NUQVRFKCBSX0dFTl9DT05GSUcsIGF0YSwgIHNlbGVjdCApICk7CisKKwkqUl9HRU5fQ09ORklHID0gZ2VuY29uZmlnX3NoYWRvdzsKKworICAgICAgICAvKiBwdWxsIHRoZSBjaG9zZW4gL3Jlc2V0LWxpbmUgbG93ICovCisKKyNpZmRlZiBDT05GSUdfRVRSQVhfSURFX0cyN19SRVNFVAorICAgICAgICBSRUdfU0hBRE9XX1NFVChSX1BPUlRfR19EQVRBLCBwb3J0X2dfZGF0YV9zaGFkb3csIDI3LCAwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FVFJBWF9JREVfQ1NFMV8xNl9SRVNFVAorICAgICAgICBSRUdfU0hBRE9XX1NFVChwb3J0X2NzZTFfYWRkciwgcG9ydF9jc2UxX3NoYWRvdywgMTYsIDApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VUUkFYX0lERV9DU1AwXzhfUkVTRVQKKyAgICAgICAgUkVHX1NIQURPV19TRVQocG9ydF9jc3AwX2FkZHIsIHBvcnRfY3NwMF9zaGFkb3csIDgsIDApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VUUkFYX0lERV9QQjdfUkVTRVQKKwlwb3J0X3BiX2Rpcl9zaGFkb3cgPSBwb3J0X3BiX2Rpcl9zaGFkb3cgfAorCQlJT19TVEFURShSX1BPUlRfUEJfRElSLCBkaXI3LCBvdXRwdXQpOworCSpSX1BPUlRfUEJfRElSID0gcG9ydF9wYl9kaXJfc2hhZG93OworCVJFR19TSEFET1dfU0VUKFJfUE9SVF9QQl9EQVRBLCBwb3J0X3BiX2RhdGFfc2hhZG93LCA3LCAxKTsKKyNlbmRpZgorCisJLyogd2FpdCBzb21lICovCisKKwl1ZGVsYXkoMjUpOworCisJLyogZGUtYXNzZXJ0IGJ1cy1yZXNldCAqLworCisjaWZkZWYgQ09ORklHX0VUUkFYX0lERV9DU0UxXzE2X1JFU0VUCisJUkVHX1NIQURPV19TRVQocG9ydF9jc2UxX2FkZHIsIHBvcnRfY3NlMV9zaGFkb3csIDE2LCAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FVFJBWF9JREVfQ1NQMF84X1JFU0VUCisJUkVHX1NIQURPV19TRVQocG9ydF9jc3AwX2FkZHIsIHBvcnRfY3NwMF9zaGFkb3csIDgsIDEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VUUkFYX0lERV9HMjdfUkVTRVQKKwlSRUdfU0hBRE9XX1NFVChSX1BPUlRfR19EQVRBLCBwb3J0X2dfZGF0YV9zaGFkb3csIDI3LCAxKTsKKyNlbmRpZgorCisJLyogbWFrZSBhIGR1bW15IHJlYWQgdG8gc2V0IHRoZSBhdGEgY29udHJvbGxlciBpbiBhIHByb3BlciBzdGF0ZSAqLworCWR1bW15ID0gKlJfQVRBX1NUQVRVU19EQVRBOworCisJKlJfQVRBX0NPTkZJRyA9ICggSU9fRklFTEQoIFJfQVRBX0NPTkZJRywgZW5hYmxlLCAgICAgMSApIHwKKwkJCSAgSU9fRklFTEQoIFJfQVRBX0NPTkZJRywgZG1hX3N0cm9iZSwgQVRBX0RNQTJfU1RST0JFICkgfAorCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBkbWFfaG9sZCwgICBBVEFfRE1BMl9IT0xEICkgfAorCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9fc2V0dXAsICBBVEFfUElPNF9TRVRVUCApIHwKKwkJCSAgSU9fRklFTEQoIFJfQVRBX0NPTkZJRywgcGlvX3N0cm9iZSwgQVRBX1BJTzRfU1RST0JFICkgfAorCQkJICBJT19GSUVMRCggUl9BVEFfQ09ORklHLCBwaW9faG9sZCwgICBBVEFfUElPNF9IT0xEICkgKTsKKworCSpSX0FUQV9DVFJMX0RBVEEgPSAoIElPX1NUQVRFKCBSX0FUQV9DVFJMX0RBVEEsIHJ3LCAgIHJlYWQpIHwKKwkJCSAgICAgSU9fRklFTEQoIFJfQVRBX0NUUkxfREFUQSwgYWRkciwgMSAgICkgKTsKKworCXdoaWxlKCpSX0FUQV9TVEFUVVNfREFUQSAmIElPX01BU0soUl9BVEFfU1RBVFVTX0RBVEEsIGJ1c3kpKTsgLyogd2FpdCBmb3IgYnVzeSBmbGFnKi8KKworCSpSX0lSUV9NQVNLMF9TRVQgPSAoIElPX1NUQVRFKCBSX0lSUV9NQVNLMF9TRVQsIGF0YV9pcnEwLCBzZXQgKSB8CisJCQkgICAgIElPX1NUQVRFKCBSX0lSUV9NQVNLMF9TRVQsIGF0YV9pcnExLCBzZXQgKSB8CisJCQkgICAgIElPX1NUQVRFKCBSX0lSUV9NQVNLMF9TRVQsIGF0YV9pcnEyLCBzZXQgKSB8CisJCQkgICAgIElPX1NUQVRFKCBSX0lSUV9NQVNLMF9TRVQsIGF0YV9pcnEzLCBzZXQgKSApOworCisJcHJpbnRrKCJpZGU6IHdhaXRpbmcgJWQgc2Vjb25kcyBmb3IgZHJpdmVzIHRvIHJlZ2FpbiBjb25zY2lvdXNuZXNzXG4iLAorCSAgICAgICBDT05GSUdfRVRSQVhfSURFX0RFTEFZKTsKKworCWggPSBqaWZmaWVzICsgKENPTkZJR19FVFJBWF9JREVfREVMQVkgKiBIWik7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaCkpIC8qIG5vdGhpbmcgKi8gOworCisJLyogcmVzZXQgdGhlIGRtYSBjaGFubmVscyB3ZSB3aWxsIHVzZSAqLworCisJUkVTRVRfRE1BKEFUQV9UWF9ETUFfTkJSKTsKKwlSRVNFVF9ETUEoQVRBX1JYX0RNQV9OQlIpOworCVdBSVRfRE1BKEFUQV9UWF9ETUFfTkJSKTsKKwlXQUlUX0RNQShBVEFfUlhfRE1BX05CUik7CisKK30KKworc3RhdGljIGludCBlMTAwX2RtYV9vZmYgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGV0cmF4X2RtYV9kZXNjciBteWRlc2NyOworCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgbWFpbmx5IHVzZWQgYnkgdGhlIEFUQVBJIGRyaXZlcnMuCisgKgorICogVGhlc2Ugcm91dGluZXMgd2lsbCByb3VuZCB1cCBhbnkgcmVxdWVzdCBmb3IgYW4gb2RkIG51bWJlciBvZiBieXRlcywKKyAqIHNvIGlmIGFuIG9kZCBieXRlY291bnQgaXMgc3BlY2lmaWVkLCBiZSBzdXJlIHRoYXQgdGhlcmUncyBhdCBsZWFzdCBvbmUKKyAqIGV4dHJhIGJ5dGUgYWxsb2NhdGVkIGZvciB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZAorZTEwMF9hdGFwaV9pbnB1dF9ieXRlcyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBieXRlY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhX3JlZyA9IElERV9EQVRBX1JFRzsKKworCUQocHJpbnRrKCJhdGFwaV9pbnB1dF9ieXRlcywgZHJlZyAweCV4LCBidWZmZXIgMHgleCwgY291bnQgJWRcbiIsCisJCSBkYXRhX3JlZywgYnVmZmVyLCBieXRlY291bnQpKTsKKworCWlmKGJ5dGVjb3VudCAmIDEpIHsKKwkJcHJpbnRrKCJ3YXJuaW5nLCBvZGQgYnl0ZWNvdW50IGluIGNkcm9tX2luX2J5dGVzID0gJWQuXG4iLCBieXRlY291bnQpOworCQlieXRlY291bnQrKzsgLyogdG8gcm91bmQgb2ZmICovCisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBETUEgY2hhbm5lbCBpcyBhdmFpbGFibGUgKi8KKwlSRVNFVF9ETUEoQVRBX1JYX0RNQV9OQlIpOworCVdBSVRfRE1BKEFUQV9SWF9ETUFfTkJSKTsKKworCS8qIHNldHVwIERNQSBkZXNjcmlwdG9yICovCisKKwlteWRlc2NyLnN3X2xlbiA9IGJ5dGVjb3VudDsKKwlteWRlc2NyLmN0cmwgICA9IGRfZW9sOworCW15ZGVzY3IuYnVmICAgID0gdmlydF90b19waHlzKGJ1ZmZlcik7CisKKwkvKiBzdGFydCB0aGUgZG1hIGNoYW5uZWwgKi8KKworCSpSX0RNQV9DSDNfRklSU1QgPSB2aXJ0X3RvX3BoeXMoJm15ZGVzY3IpOworCSpSX0RNQV9DSDNfQ01EICAgPSBJT19TVEFURShSX0RNQV9DSDNfQ01ELCBjbWQsIHN0YXJ0KTsKKworCS8qIGluaXRpYXRlIGEgbXVsdGkgd29yZCBkbWEgcmVhZCB1c2luZyBQSU8gaGFuZHNoYWtpbmcgKi8KKworCSpSX0FUQV9UUkFOU0ZFUl9DTlQgPSBJT19GSUVMRChSX0FUQV9UUkFOU0ZFUl9DTlQsIGNvdW50LCBieXRlY291bnQgPj4gMSk7CisKKwkqUl9BVEFfQ1RSTF9EQVRBID0gZGF0YV9yZWcgfAorCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIHJ3LCAgICAgICByZWFkKSB8CisJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgc3JjX2RzdCwgIGRtYSkgfAorCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGhhbmRzaCwgICBwaW8pIHwKKwkJSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBtdWx0aSwgICAgb24pIHwKKwkJSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBkbWFfc2l6ZSwgd29yZCk7CisKKwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisKKwlMRURfRElTS19SRUFEKDEpOworCVdBSVRfRE1BKEFUQV9SWF9ETUFfTkJSKTsKKwlMRURfRElTS19SRUFEKDApOworCisjaWYgMAorICAgICAgICAvKiBvbGQgcG9sbGVkIHRyYW5zZmVyIGNvZGUKKwkgKiB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGEgbmV3IGZ1bmN0aW9uIHRoYXQgY2FuIGRvIHBvbGxlZAorCSAqIHRyYW5zZmVycyBpZiBETUEgaXMgbm90IGF2YWlsYWJsZQorCSAqLworCisgICAgICAgIC8qIGluaXRpYXRlIGEgbXVsdGkgd29yZCByZWFkICovCisKKyAgICAgICAgKlJfQVRBX1RSQU5TRkVSX0NOVCA9IHdjb3VudCA8PCAxOworCisgICAgICAgICpSX0FUQV9DVFJMX0RBVEEgPSBkYXRhX3JlZyB8CisgICAgICAgICAgICAgICAgSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBydywgICAgICAgcmVhZCkgfAorICAgICAgICAgICAgICAgIElPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgc3JjX2RzdCwgIHJlZ2lzdGVyKSB8CisgICAgICAgICAgICAgICAgSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBoYW5kc2gsICAgcGlvKSB8CisgICAgICAgICAgICAgICAgSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBtdWx0aSwgICAgb24pIHwKKyAgICAgICAgICAgICAgICBJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGRtYV9zaXplLCB3b3JkKTsKKworICAgICAgICAvKiBzdmludG8gaGFzIGEgbGF0ZW5jeSB1bnRpbCB0aGUgYnVzeSBiaXQgYWN0dWFsbHkgaXMgc2V0ICovCisKKyAgICAgICAgbm9wKCk7IG5vcCgpOworICAgICAgICBub3AoKTsgbm9wKCk7CisgICAgICAgIG5vcCgpOyBub3AoKTsKKyAgICAgICAgbm9wKCk7IG5vcCgpOworICAgICAgICBub3AoKTsgbm9wKCk7CisKKyAgICAgICAgLyogdW5pdCBzaG91bGQgYmUgYnVzeSBkdXJpbmcgbXVsdGkgdHJhbnNmZXIgKi8KKyAgICAgICAgd2hpbGUoKHN0YXR1cyA9ICpSX0FUQV9TVEFUVVNfREFUQSkgJiBJT19NQVNLKFJfQVRBX1NUQVRVU19EQVRBLCBidXN5KSkgeworICAgICAgICAgICAgICAgIHdoaWxlKCEoc3RhdHVzICYgSU9fTUFTSyhSX0FUQV9TVEFUVVNfREFUQSwgZGF2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAqUl9BVEFfU1RBVFVTX0RBVEE7CisgICAgICAgICAgICAgICAgKnB0cisrID0gKHVuc2lnbmVkIHNob3J0KShzdGF0dXMgJiAweGZmZmYpOworICAgICAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2UxMDBfYXRhcGlfb3V0cHV0X2J5dGVzIChpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGJ5dGVjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGFfcmVnID0gSURFX0RBVEFfUkVHOworCisJRChwcmludGsoImF0YXBpX291dHB1dF9ieXRlcywgZHJlZyAweCV4LCBidWZmZXIgMHgleCwgY291bnQgJWRcbiIsCisJCSBkYXRhX3JlZywgYnVmZmVyLCBieXRlY291bnQpKTsKKworCWlmKGJ5dGVjb3VudCAmIDEpIHsKKwkJcHJpbnRrKCJvZGQgYnl0ZWNvdW50ICVkIGluIGF0YXBpX291dF9ieXRlcyFcbiIsIGJ5dGVjb3VudCk7CisJCWJ5dGVjb3VudCsrOworCX0KKworCS8qIG1ha2Ugc3VyZSB0aGUgRE1BIGNoYW5uZWwgaXMgYXZhaWxhYmxlICovCisJUkVTRVRfRE1BKEFUQV9UWF9ETUFfTkJSKTsKKwlXQUlUX0RNQShBVEFfVFhfRE1BX05CUik7CisKKwkvKiBzZXR1cCBETUEgZGVzY3JpcHRvciAqLworCisJbXlkZXNjci5zd19sZW4gPSBieXRlY291bnQ7CisJbXlkZXNjci5jdHJsICAgPSBkX2VvbDsKKwlteWRlc2NyLmJ1ZiAgICA9IHZpcnRfdG9fcGh5cyhidWZmZXIpOworCisJLyogc3RhcnQgdGhlIGRtYSBjaGFubmVsICovCisKKwkqUl9ETUFfQ0gyX0ZJUlNUID0gdmlydF90b19waHlzKCZteWRlc2NyKTsKKwkqUl9ETUFfQ0gyX0NNRCAgID0gSU9fU1RBVEUoUl9ETUFfQ0gyX0NNRCwgY21kLCBzdGFydCk7CisKKwkvKiBpbml0aWF0ZSBhIG11bHRpIHdvcmQgZG1hIHdyaXRlIHVzaW5nIFBJTyBoYW5kc2hha2luZyAqLworCisJKlJfQVRBX1RSQU5TRkVSX0NOVCA9IElPX0ZJRUxEKFJfQVRBX1RSQU5TRkVSX0NOVCwgY291bnQsIGJ5dGVjb3VudCA+PiAxKTsKKworCSpSX0FUQV9DVFJMX0RBVEEgPSBkYXRhX3JlZyB8CisJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgcncsICAgICAgIHdyaXRlKSB8CisJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgc3JjX2RzdCwgIGRtYSkgfAorCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGhhbmRzaCwgICBwaW8pIHwKKwkJSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBtdWx0aSwgICAgb24pIHwKKwkJSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBkbWFfc2l6ZSwgd29yZCk7CisKKwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisKKwlMRURfRElTS19XUklURSgxKTsKKwlXQUlUX0RNQShBVEFfVFhfRE1BX05CUik7CisJTEVEX0RJU0tfV1JJVEUoMCk7CisKKyNpZiAwCisgICAgICAgIC8qIG9sZCBwb2xsZWQgd3JpdGUgY29kZSAtIHNlZSBjb21tZW50IGluIGlucHV0X2J5dGVzICovCisKKwkvKiB3YWl0IGZvciBidXN5IGZsYWcgKi8KKyAgICAgICAgd2hpbGUoKlJfQVRBX1NUQVRVU19EQVRBICYgSU9fTUFTSyhSX0FUQV9TVEFUVVNfREFUQSwgYnVzeSkpOworCisgICAgICAgIC8qIGluaXRpYXRlIGEgbXVsdGkgd29yZCB3cml0ZSAqLworCisgICAgICAgICpSX0FUQV9UUkFOU0ZFUl9DTlQgPSBieXRlY291bnQgPj4gMTsKKworICAgICAgICBjdHJsID0gZGF0YV9yZWcgfAorICAgICAgICAgICAgICAgIElPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgcncsICAgICAgIHdyaXRlKSB8CisgICAgICAgICAgICAgICAgSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBzcmNfZHN0LCAgcmVnaXN0ZXIpIHwKKyAgICAgICAgICAgICAgICBJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGhhbmRzaCwgICBwaW8pIHwKKyAgICAgICAgICAgICAgICBJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIG11bHRpLCAgICBvbikgfAorICAgICAgICAgICAgICAgIElPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgZG1hX3NpemUsIHdvcmQpOworCisgICAgICAgIExFRF9ESVNLX1dSSVRFKDEpOworCisgICAgICAgIC8qIEV0cmF4IHdpbGwgc2V0IGJ1c3kgPSAxIHVudGlsIHRoZSBtdWx0aSBwaW8gdHJhbnNmZXIgaGFzIGZpbmlzaGVkCisgICAgICAgICAqIGFuZCB0cl9yZHkgPSAxIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB3b3JkIHRyYW5zZmVyLgorICAgICAgICAgKiBXaGVuIHRoZSBsYXN0IGJ5dGUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgRXRyYXggd2lsbCBmaXJzdCBzZXQgdHJfdGR5ID0gMQorICAgICAgICAgKiBhbmQgdGhlbiBidXN5ID0gMCAobm90IGluIHRoZSBzYW1lIGN5Y2xlKS4gSWYgd2UgcmVhZCBidXN5IGJlZm9yZSBpdAorICAgICAgICAgKiBoYXMgYmVlbiBzZXQgdG8gMCB3ZSB3aWxsIHRoaW5rIHRoYXQgd2Ugc2hvdWxkIHRyYW5zZmVyIG1vcmUgYnl0ZXMKKyAgICAgICAgICogYW5kIHRoZW4gdHJfcmR5IHdvdWxkIGJlIDAgZm9yZXZlci4gVGhpcyBpcyBzb2x2ZWQgYnkgY2hlY2tpbmcgYnVzeQorICAgICAgICAgKiBpbiB0aGUgaW5uZXIgbG9vcC4KKyAgICAgICAgICovCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpSX0FUQV9DVFJMX0RBVEEgPSBjdHJsIHwgKnB0cisrOworICAgICAgICAgICAgICAgIHdoaWxlKCEoKlJfQVRBX1NUQVRVU19EQVRBICYgSU9fTUFTSyhSX0FUQV9TVEFUVVNfREFUQSwgdHJfcmR5KSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoKlJfQVRBX1NUQVRVU19EQVRBICYgSU9fTUFTSyhSX0FUQV9TVEFUVVNfREFUQSwgYnVzeSkpKTsKKyAgICAgICAgfSB3aGlsZSgqUl9BVEFfU1RBVFVTX0RBVEEgJiBJT19NQVNLKFJfQVRBX1NUQVRVU19EQVRBLCBidXN5KSk7CisKKyAgICAgICAgTEVEX0RJU0tfV1JJVEUoMCk7CisjZW5kaWYKKworfQorCisvKgorICogVGhpcyBpcyB1c2VkIGZvciBtb3N0IFBJTyBkYXRhIHRyYW5zZmVycyAqZnJvbSogdGhlIElERSBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQKK2UxMDBfaWRlX2lucHV0X2RhdGEgKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgd2NvdW50KQoreworCWUxMDBfYXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIGJ1ZmZlciwgd2NvdW50IDw8IDIpOworfQorCisvKgorICogVGhpcyBpcyB1c2VkIGZvciBtb3N0IFBJTyBkYXRhIHRyYW5zZmVycyAqdG8qIHRoZSBJREUgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkCitlMTAwX2lkZV9vdXRwdXRfZGF0YSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCB3Y291bnQpCit7CisJZTEwMF9hdGFwaV9vdXRwdXRfYnl0ZXMoZHJpdmUsIGJ1ZmZlciwgd2NvdW50IDw8IDIpOworfQorCisvKiB3ZSBvbmx5IGhhdmUgb25lIERNQSBjaGFubmVsIG9uIHRoZSBjaGlwIGZvciBBVEEsIHNvIHdlIGNhbiBrZWVwIHRoZXNlIHN0YXRpY2FsbHkgKi8KK3N0YXRpYyBldHJheF9kbWFfZGVzY3IgYXRhX2Rlc2Nyc1tNQVhfRE1BX0RFU0NSU107CitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV90b3Rfc2l6ZTsKKworLyoKKyAqIGUxMDBfaWRlX2J1aWxkX2RtYXRhYmxlKCkgcHJlcGFyZXMgYSBkbWEgcmVxdWVzdC4KKyAqIFJldHVybnMgMCBpZiBhbGwgd2VudCBva2F5LCByZXR1cm5zIDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGUxMDBfaWRlX2J1aWxkX2RtYXRhYmxlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBzY2F0dGVybGlzdCogc2c7CisJc3RydWN0IHJlcXVlc3QgKnJxICA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl1bnNpZ25lZCBsb25nIHNpemUsIGFkZHI7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwlzZyA9IGh3aWYtPnNnX3RhYmxlOworCisJYXRhX3RvdF9zaXplID0gMDsKKworCWlkZV9tYXBfc2coZHJpdmUsIHJxKTsKKworCWkgPSBod2lmLT5zZ19uZW50czsKKworCXdoaWxlKGkpIHsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGFkZHIgYW5kIHNpemUgb2YgbmV4dCBidWZmZXIgYXJlYS4gIFdlIGFzc3VtZSB0aGF0CisJCSAqIGluZGl2aWR1YWwgdmlydHVhbCBidWZmZXJzIGFyZSBhbHdheXMgY29tcG9zZWQgbGluZWFybHkgaW4KKwkJICogcGh5c2ljYWwgbWVtb3J5LiAgRm9yIGV4YW1wbGUsIHdlIGFzc3VtZSB0aGF0IGFueSA4a0IgYnVmZmVyCisJCSAqIGlzIGFsd2F5cyBjb21wb3NlZCBvZiB0d28gYWRqYWNlbnQgcGh5c2ljYWwgNGtCIHBhZ2VzIHJhdGhlcgorCQkgKiB0aGFuIHR3byBwb3NzaWJseSBub24tYWRqYWNlbnQgcGh5c2ljYWwgNGtCIHBhZ2VzLgorCQkgKi8KKwkJLyogZ3JvdXAgc2VxdWVudGlhbCBidWZmZXJzIGludG8gb25lIGxhcmdlIGJ1ZmZlciAqLworCQlhZGRyID0gcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQ7CisJCXNpemUgPSBzZ19kbWFfbGVuKHNnKTsKKwkJd2hpbGUgKHNnKyssIC0taSkgeworCQkJaWYgKChhZGRyICsgc2l6ZSkgIT0gcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQpCisJCQkJYnJlYWs7CisJCQlzaXplICs9IHNnX2RtYV9sZW4oc2cpOworCQl9CisKKwkJLyogZGlkIHdlIHJ1biBvdXQgb2YgZGVzY3JpcHRvcnM/ICovCisKKwkJaWYoY291bnQgPj0gTUFYX0RNQV9ERVNDUlMpIHsKKwkJCXByaW50aygiJXM6IHRvbyBmZXcgRE1BIGRlc2NyaXB0b3JzXG4iLCBkcml2ZS0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIGhvd2V2ZXIsIHRoaXMgY2FzZSBpcyBtb3JlIGRpZmZpY3VsdCAtIFJfQVRBX1RSQU5TRkVSX0NOVCBjYW5ub3QgYmUgbW9yZQorCQkgICB0aGFuIDY1NTM2IHdvcmRzIHBlciB0cmFuc2Zlciwgc28gaW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gZWl0aGVyCisJCSAgIDEpIHVzZSBhIERNQSBpbnRlcnJ1cHQgdG8gcmUtdHJpZ2dlciBSX0FUQV9UUkFOU0ZFUl9DTlQgYW5kIGNvbnRpbnVlIHdpdGgKKwkJICAgICAgdGhlIGRlc2NyaXB0b3JzLCBvcgorCQkgICAyKSBzaW1wbHkgZG8gdGhlIHJlcXVlc3QgaGVyZSwgYW5kIGdldCBkbWFfaW50ciB0byBvbmx5IGlkZV9lbmRfcmVxdWVzdCBvbgorCQkgICAgICB0aG9zZSBibG9ja3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHNldC11cCBmb3IgdHJhbnNmZXIuCisJCSovCisKKwkJaWYoYXRhX3RvdF9zaXplICsgc2l6ZSA+IDEzMTA3MikgeworCQkJcHJpbnRrKCJ0b28gbGFyZ2UgdG90YWwgQVRBIERNQSByZXF1ZXN0LCAlZCArICVkIVxuIiwgYXRhX3RvdF9zaXplLCAoaW50KXNpemUpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBJZiBzaXplID4gNjU1MzYgaXQgaGFzIHRvIGJlIHNwbGl0dGVkIGludG8gbmV3IGRlc2NyaXB0b3JzLiBTaW5jZSB3ZSBkb24ndCBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICBzaXplID4gMTMxMDcyIG9ubHkgb25lIHNwbGl0IGlzIG5lY2Vzc2FyeSAqLworCisJCWlmKHNpemUgPiA2NTUzNikgeworIAkJICAgICAgICAvKiBvayB3ZSB3YW50IHRvIGRvIElPIGF0IGFkZHIsIHNpemUgYnl0ZXMuIHNldCB1cCBhIG5ldyBkZXNjcmlwdG9yIGVudHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBhdGFfZGVzY3JzW2NvdW50XS5zd19sZW4gPSAwOyAgLyogMCBtZWFucyA2NTUzNiwgdGhpcyBpcyBhIDE2LWJpdCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXRhX2Rlc2Nyc1tjb3VudF0uY3RybCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBhdGFfZGVzY3JzW2NvdW50XS5idWYgPSBhZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgYXRhX2Rlc2Nyc1tjb3VudF0ubmV4dCA9IHZpcnRfdG9fcGh5cygmYXRhX2Rlc2Nyc1tjb3VudCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBhdGFfdG90X3NpemUgKz0gNjU1MzY7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIGFuZCBhZGRyIHNob3VsZCByZWZlcmUgdG8gbm90IGhhbmRsZWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSA2NTUzNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgKz0gNjU1MzY7CisgICAgICAgICAgICAgICAgfQorCQkvKiBvayB3ZSB3YW50IHRvIGRvIElPIGF0IGFkZHIsIHNpemUgYnl0ZXMuIHNldCB1cCBhIG5ldyBkZXNjcmlwdG9yIGVudHJ5ICovCisgICAgICAgICAgICAgICAgaWYoc2l6ZSA9PSA2NTUzNikgeworCQkJYXRhX2Rlc2Nyc1tjb3VudF0uc3dfbGVuID0gMDsgIC8qIDAgbWVhbnMgNjU1MzYsIHRoaXMgaXMgYSAxNi1iaXQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJYXRhX2Rlc2Nyc1tjb3VudF0uc3dfbGVuID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisJCWF0YV9kZXNjcnNbY291bnRdLmN0cmwgPSAwOworCQlhdGFfZGVzY3JzW2NvdW50XS5idWYgPSBhZGRyOworCQlhdGFfZGVzY3JzW2NvdW50XS5uZXh0ID0gdmlydF90b19waHlzKCZhdGFfZGVzY3JzW2NvdW50ICsgMV0pOworCQljb3VudCsrOworCQlhdGFfdG90X3NpemUgKz0gc2l6ZTsKKwl9CisKKwlpZiAoY291bnQpIHsKKwkJLyogc2V0IHRoZSBlbmQtb2YtbGlzdCBmbGFnIG9uIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJYXRhX2Rlc2Nyc1tjb3VudCAtIDFdLmN0cmwgfD0gZF9lb2w7CisJCS8qIHJldHVybiBhbmQgc2F5IGFsbCBpcyBvayAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoIiVzOiBlbXB0eSBETUEgdGFibGU/XG4iLCBkcml2ZS0+bmFtZSk7CisJcmV0dXJuIDE7CS8qIGxldCB0aGUgUElPIHJvdXRpbmVzIGhhbmRsZSB0aGlzIHdlaXJkbmVzcyAqLworfQorCitzdGF0aWMgaW50IGNvbmZpZ19kcml2ZV9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisgICAgICAgIGNvbnN0IGNoYXIgKipsaXN0OworICAgICAgICBzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisKKyAgICAgICAgaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpKSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERNQSBvbiBhbnkgZHJpdmUgdGhhdCBzdXBwb3J0cyBtd29yZDIgRE1BICovCisgICAgICAgICAgICAgICAgaWYgKChpZC0+ZmllbGRfdmFsaWQgJiAyKSAmJiAoaWQtPmRtYV9td29yZCAmIDB4NDA0KSA9PSAweDQwNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmUtPnVzaW5nX2RtYSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBETUEgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIENvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImdvb2QiIGRyaXZlcyAqLworICAgICAgICAgICAgICAgIGxpc3QgPSBnb29kX2RtYV9kcml2ZXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgqbGlzdCsrLGlkLT5tb2RlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmUtPnVzaW5nX2RtYSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAvKiBETUEgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsgICAgICAgLyogRE1BIG5vdCBlbmFibGVkICovCit9CisKKy8qCisgKiBldHJheF9kbWFfaW50cigpIGlzIHRoZSBoYW5kbGVyIGZvciBkaXNrIHJlYWQvd3JpdGUgRE1BIGludGVycnVwdHMKKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBldHJheF9kbWFfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCUxFRF9ESVNLX1JFQUQoMCk7CisJTEVEX0RJU0tfV1JJVEUoMCk7CisKKwlyZXR1cm4gaWRlX2RtYV9pbnRyKGRyaXZlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyBiZWxvdyBpbml0aWF0ZXMvYWJvcnRzIERNQSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgb24gYSBkcml2ZS4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBzZWxlY3RlZCB0aGUgZHJpdmUgYW5kIHByb2dyYW1tZWQgdGhlIGRyaXZlJ3MKKyAqIHNlY3RvciBhZGRyZXNzIHVzaW5nIENIUyBvciBMQkEuICBBbGwgdGhhdCByZW1haW5zIGlzIHRvIHByZXBhcmUgZm9yIERNQQorICogYW5kIHRoZW4gaXNzdWUgdGhlIGFjdHVhbCByZWFkL3dyaXRlIERNQS9QSU8gY29tbWFuZCB0byB0aGUgZHJpdmUuCisgKgorICogUmV0dXJucyAwIGlmIGFsbCB3ZW50IHdlbGwuCisgKiBSZXR1cm5zIDEgaWYgRE1BIHJlYWQvd3JpdGUgY291bGQgbm90IGJlIHN0YXJ0ZWQsIGluIHdoaWNoIGNhc2UKKyAqIHRoZSBjYWxsZXIgc2hvdWxkIHJldmVydCB0byBQSU8gZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgKi8KKworc3RhdGljIGludCBlMTAwX2RtYV9jaGVjayhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcmV0dXJuIGNvbmZpZ19kcml2ZV9mb3JfZG1hIChkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwkvKiBUT0RPOiBjaGVjayBpZiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBETUEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZTEwMF9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChlMTAwX3JlYWRfY29tbWFuZCkgeworCQkvKiBiZWdpbiBETUEgKi8KKworCQkvKiBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIFJYIERNQSBkdWUgdG8gYSBjaGlwIGJ1ZworCQkgKiBpdCBpcyBlbm91Z2ggdG8ganVzdCBmbHVzaCB0aGUgcGFydCBvZiB0aGUgY2FjaGUgdGhhdAorCQkgKiBjb3JyZXNwb25kcyB0byB0aGUgYnVmZmVycyB3ZSBzdGFydCwgYnV0IHNpbmNlIEhEIHRyYW5zZmVycworCQkgKiB1c3VhbGx5IGFyZSBtb3JlIHRoYW4gOCBrQiwgaXQgaXMgZWFzaWVyIHRvIG9wdGltaXplIGZvciB0aGUKKwkJICogbm9ybWFsIGNhc2UgYW5kIGp1c3QgZmx1c2ggdGhlIGVudGlyZSBjYWNoZS4gaXRzIHRoZSBvbmx5CisJCSAqIHdheSB0byBiZSBzdXJlISAoT0IgbW92aWUgcXVvdGUpCisJCSAqLworCQlmbHVzaF9ldHJheF9jYWNoZSgpOworCQkqUl9ETUFfQ0gzX0ZJUlNUID0gdmlydF90b19waHlzKGF0YV9kZXNjcnMpOworCQkqUl9ETUFfQ0gzX0NNRCAgID0gSU9fU1RBVEUoUl9ETUFfQ0gzX0NNRCwgY21kLCBzdGFydCk7CisKKwkJLyogaW5pdGlhdGUgYSBtdWx0aSB3b3JkIGRtYSByZWFkIHVzaW5nIERNQSBoYW5kc2hha2luZyAqLworCisJCSpSX0FUQV9UUkFOU0ZFUl9DTlQgPQorCQkJSU9fRklFTEQoUl9BVEFfVFJBTlNGRVJfQ05ULCBjb3VudCwgYXRhX3RvdF9zaXplID4+IDEpOworCisJCSpSX0FUQV9DVFJMX0RBVEEgPQorCQkJSU9fRklFTEQoUl9BVEFfQ1RSTF9EQVRBLCBkYXRhLCBJREVfREFUQV9SRUcpIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgcncsICAgICAgIHJlYWQpIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgc3JjX2RzdCwgIGRtYSkgIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgaGFuZHNoLCAgIGRtYSkgIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgbXVsdGksICAgIG9uKSAgIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgZG1hX3NpemUsIHdvcmQpOworCisJCUxFRF9ESVNLX1JFQUQoMSk7CisKKwkJRChwcmludGsoImRtYSByZWFkIG9mICVkIGJ5dGVzLlxuIiwgYXRhX3RvdF9zaXplKSk7CisKKwl9IGVsc2UgeworCQkvKiB3cml0aW5nICovCisJCS8qIGJlZ2luIERNQSAqLworCisJCSpSX0RNQV9DSDJfRklSU1QgPSB2aXJ0X3RvX3BoeXMoYXRhX2Rlc2Nycyk7CisJCSpSX0RNQV9DSDJfQ01EICAgPSBJT19TVEFURShSX0RNQV9DSDJfQ01ELCBjbWQsIHN0YXJ0KTsKKworCQkvKiBpbml0aWF0ZSBhIG11bHRpIHdvcmQgZG1hIHdyaXRlIHVzaW5nIERNQSBoYW5kc2hha2luZyAqLworCisJCSpSX0FUQV9UUkFOU0ZFUl9DTlQgPQorCQkJSU9fRklFTEQoUl9BVEFfVFJBTlNGRVJfQ05ULCBjb3VudCwgYXRhX3RvdF9zaXplID4+IDEpOworCisJCSpSX0FUQV9DVFJMX0RBVEEgPQorCQkJSU9fRklFTEQoUl9BVEFfQ1RSTF9EQVRBLCBkYXRhLCAgICAgSURFX0RBVEFfUkVHKSB8CisJCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIHJ3LCAgICAgICB3cml0ZSkgfAorCQkJSU9fU1RBVEUoUl9BVEFfQ1RSTF9EQVRBLCBzcmNfZHN0LCAgZG1hKSB8CisJCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGhhbmRzaCwgICBkbWEpIHwKKwkJCUlPX1NUQVRFKFJfQVRBX0NUUkxfREFUQSwgbXVsdGksICAgIG9uKSB8CisJCQlJT19TVEFURShSX0FUQV9DVFJMX0RBVEEsIGRtYV9zaXplLCB3b3JkKTsKKworCQlMRURfRElTS19XUklURSgxKTsKKworCQlEKHByaW50aygiZG1hIHdyaXRlIG9mICVkIGJ5dGVzLlxuIiwgYXRhX3RvdF9zaXplKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaDgzMDAvaWRlLWg4MzAwLmMgYi9kcml2ZXJzL2lkZS9oODMwMC9pZGUtaDgzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjkxY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaDgzMDAvaWRlLWg4MzAwLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBkcml2ZXJzL2lkZS9pZGUtaDgzMDAuYworICogSDgvMzAwIGdlbmVyaWMgSURFIGludGVyZmFjZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgYnN3YXAoZCkgXAorKHsJCQkJCVwKKwl1MTYgcjsJCQkJXAorCV9fYXNtX18oIm1vdi5iICV3MSxyMWhcblx0IglcCisJCSJtb3YuYiAleDEscjFsXG5cdCIJXAorCQkibW92LncgcjEsJTAiCQlcCisJCToiPXIiKHIpCQlcCisJCToiciIoZCkJCQlcCisJCToiZXIxIik7CQlcCisJKHIpOwkJCQlcCit9KQorCitzdGF0aWMgdm9pZCBtbV9vdXR3KHUxNiBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJX19hc21fXygibW92LmIgJXcwLHIyaFxuXHQiCisJCSJtb3YuYiAleDAscjJsXG5cdCIKKwkJIm1vdi53IHIyLEAlMSIKKwkJOgorCQk6InIiKGQpLCJyIihhKQorCQk6ImVyMiIpOworfQorCitzdGF0aWMgdTE2IG1tX2ludyh1bnNpZ25lZCBsb25nIGEpCit7CisJcmVnaXN0ZXIgdTE2IHIgX19hc21fXygiZXIwIik7CisJX19hc21fXygibW92LncgQCUxLHIyXG5cdCIKKwkJIm1vdi5iIHIybCwleDBcblx0IgorCQkibW92LmIgcjJoLCV3MCIKKwkJOiI9ciIocikKKwkJOiJyIihhKQorCQk6ImVyMiIpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBtbV9vdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCAqYnAgPSAodW5zaWduZWQgc2hvcnQgKilidWY7CisJZm9yICg7IGxlbiA+IDA7IGxlbi0tLCBicCsrKQorCQkqKHZvbGF0aWxlIHUxNiAqKWFkZHIgPSBic3dhcCgqYnApOworfQorCitzdGF0aWMgdm9pZCBtbV9pbnN3KHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKQoreworCXVuc2lnbmVkIHNob3J0ICpicCA9ICh1bnNpZ25lZCBzaG9ydCAqKWJ1ZjsKKwlmb3IgKDsgbGVuID4gMDsgbGVuLS0sIGJwKyspCisJCSpicCA9IGJzd2FwKCoodm9sYXRpbGUgdTE2ICopYWRkcik7Cit9CisKKyNkZWZpbmUgSDgzMDBfSURFX0dBUCAoMikKKworc3RhdGljIGlubGluZSB2b2lkIGh3X3NldHVwKGh3X3JlZ3NfdCAqaHcpCit7CisJaW50IGk7CisKKwltZW1zZXQoaHcsIDAsIHNpemVvZihod19yZWdzX3QpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IElERV9TVEFUVVNfT0ZGU0VUOyBpKyspCisJCWh3LT5pb19wb3J0c1tpXSA9IENPTkZJR19IODMwMF9JREVfQkFTRSArIEg4MzAwX0lERV9HQVAqaTsKKwlody0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSA9IENPTkZJR19IODMwMF9JREVfQUxUOworCWh3LT5pcnEgPSBFWFRfSVJRMCArIENPTkZJR19IODMwMF9JREVfSVJROworCWh3LT5kbWEgPSBOT19ETUE7CisJaHctPmNoaXBzZXQgPSBpZGVfZ2VuZXJpYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh3aWZfc2V0dXAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlkZWZhdWx0X2h3aWZfaW9wcyhod2lmKTsKKworCWh3aWYtPm1taW8gID0gMjsKKwlod2lmLT5PVVRXICA9IG1tX291dHc7CisJaHdpZi0+T1VUU1cgPSBtbV9vdXRzdzsKKwlod2lmLT5JTlcgICA9IG1tX2ludzsKKwlod2lmLT5JTlNXICA9IG1tX2luc3c7CisJaHdpZi0+T1VUTCAgPSBOVUxMOworCWh3aWYtPklOTCAgID0gTlVMTDsKKwlod2lmLT5PVVRTTCA9IE5VTEw7CisJaHdpZi0+SU5TTCAgPSBOVUxMOworfQorCit2b2lkIF9faW5pdCBoODMwMF9pZGVfaW5pdCh2b2lkKQoreworCWh3X3JlZ3NfdCBodzsKKwlpZGVfaHdpZl90ICpod2lmOworCWludCBpZHg7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKENPTkZJR19IODMwMF9JREVfQkFTRSwgSDgzMDBfSURFX0dBUCo4LCAiaWRlLWg4MzAwIikpCisJCWdvdG8gb3V0X2J1c3k7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihDT05GSUdfSDgzMDBfSURFX0FMVCwgSDgzMDBfSURFX0dBUCwgImlkZS1oODMwMCIpKSB7CisJCXJlbGVhc2VfcmVnaW9uKENPTkZJR19IODMwMF9JREVfQkFTRSwgSDgzMDBfSURFX0dBUCo4KTsKKwkJZ290byBvdXRfYnVzeTsKKwl9CisKKwlod19zZXR1cCgmaHcpOworCisJLyogcmVnaXN0ZXIgaWYgKi8KKwlpZHggPSBpZGVfcmVnaXN0ZXJfaHcoJmh3LCAmaHdpZik7CisJaWYgKGlkeCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1oODMwMDogSURFIEkvRiByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaHdpZl9zZXR1cChod2lmKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUlZDogSDgvMzAwIGdlbmVyaWMgSURFIGludGVyZmFjZVxuIiwgaWR4KTsKKwlyZXR1cm47CisKK291dF9idXN5OgorCXByaW50ayhLRVJOX0VSUiAiaWRlLWg4MzAwOiBJREUgSS9GIHJlc291cmNlIGFscmVhZHkgdXNlZC5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2EwMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTAsMCArMSwzNTI0IEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvaWRlLWNkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgIHNjb3R0IHNueWRlciAgPHNueWRlckBmbmFsZDAuZm5hbC5nb3Y+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgorICoKKyAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBBVEFQSSBDRC1ST00gZHJpdmVyLiAgVG8gYmUgdXNlZCB3aXRoIGlkZS5jLgorICogU2VlIERvY3VtZW50YXRpb24vY2Ryb20vaWRlLWNkIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBTdWdnZXN0aW9ucyBhcmUgd2VsY29tZS4gUGF0Y2hlcyB0aGF0IHdvcmsgYXJlIG1vcmUgd2VsY29tZSB0aG91Z2guIDstKQorICogRm9yIHRob3NlIHdpc2hpbmcgdG8gd29yayBvbiB0aGlzIGRyaXZlciwgcGxlYXNlIGJlIHN1cmUgeW91IGRvd25sb2FkCisgKiBhbmQgY29tcGx5IHdpdGggdGhlIGxhdGVzdCBNdC4gRnVqaSAoU0ZGODA5MCB2ZXJzaW9uIDQpIGFuZCBBVEFQSSAKKyAqIChTRkYtODAyMGkgcmV2IDIuNikgc3RhbmRhcmRzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIG9idGFpbmVkIGJ5IAorICogYW5vbnltb3VzIGZ0cCBmcm9tOgorICogZnRwOi8vZmlzc2lvbi5kdC53ZGMuY29tL3B1Yi9zdGFuZGFyZHMvU0ZGX2F0YXBpL3NwZWMvU0ZGODAyMC1yMi42L1BTLzgwMjByMjYucHMKKyAqIGZ0cDovL2Z0cC5hdmMtcGlvbmVlci5jb20vTXRmdWppNC9TcGVjL0Z1amk0cjEwLnBkZgorICoKKyAqIERyaXZlcyB0aGF0IGRldmlhdGUgZnJvbSB0aGVzZSBzdGFuZGFyZHMgd2lsbCBiZSBhY2NvbW1vZGF0ZWQgYXMgbXVjaAorICogYXMgcG9zc2libGUgdmlhIGNvbXBpbGUgdGltZSBvciBjb21tYW5kLWxpbmUgb3B0aW9ucy4gIFNpbmNlIEkgb25seSBoYXZlCisgKiBhIGZldyBkcml2ZXMsIHlvdSBnZW5lcmFsbHkgbmVlZCB0byBzZW5kIG1lIHBhdGNoZXMuLi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUTyBETyBMSVNUOgorICogLU1ha2UgaXQgc28gdGhhdCBQaW9uZWVyIENEIERSLUEyNFggYW5kIGZyaWVuZHMgZG9uJ3QgZ2V0IHNjcmV3ZWQgdXAgb24KKyAqICAgYm9vdAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDEuMDAgIE9jdCAzMSwgMTk5NCAtLSBJbml0aWFsIHZlcnNpb24uCisgKiAxLjAxICBOb3YgIDIsIDE5OTQgLS0gRml4ZWQgcHJvYmxlbSB3aXRoIHN0YXJ0aW5nIHJlcXVlc3QgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBjZHJvbV9jaGVja19zdGF0dXMuCisgKiAxLjAzICBOb3YgMjUsIDE5OTQgLS0gbGVhdmluZyB1bm1hc2tfaW50cltdIGFzIGEgdXNlci1zZXR0aW5nIChhcyBmb3IgZGlza3MpCisgKiAoZnJvbSBtbG9yZCkgICAgICAgLS0gbWlub3IgY2hhbmdlcyB0byBjZHJvbV9zZXR1cCgpCisgKiAgICAgICAgICAgICAgICAgICAgLS0gcmVuYW1lZCBpZGVfZGV2X3MgdG8gaWRlX2RyaXZlX3QsIGVuYWJsZSBpcnEgb24gY29tbWFuZAorICogMi4wMCAgTm92IDI3LCAxOTk0IC0tIEdlbmVyYWxpemUgcGFja2V0IGNvbW1hbmQgaW50ZXJmYWNlOworICogICAgICAgICAgICAgICAgICAgICAgIGFkZCBhdWRpbyBpb2N0bHMuCisgKiAyLjAxICBEZWMgIDMsIDE5OTQgLS0gUmV3b3JrIHBhY2tldCBjb21tYW5kIGludGVyZmFjZSB0byBoYW5kbGUgZGV2aWNlcworICogICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHNlbmQgYW4gaW50ZXJydXB0IHdoZW4gcmVhZHkgZm9yIGEgY29tbWFuZC4KKyAqIDIuMDIgIERlYyAxMSwgMTk5NCAtLSBDYWNoZSB0aGUgVE9DIGluIHRoZSBkcml2ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIFNDTURfUExBWUFVRElPX1RJOyBpdCdzIG5vdCBpbmNsdWRlZAorICogICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQVRBUEkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVHJ5IHRvIHVzZSBMQkEgaW5zdGVhZCBvZiB0cmFjayBvciBNU0YgYWRkcmVzc2luZworICogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gcG9zc2libGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3Qgd2FpdCBmb3IgUkVBRFlfU1RBVC4KKyAqIDIuMDMgIEphbiAxMCwgMTk5NSAtLSBSZXdyaXRlIGJsb2NrIHJlYWQgcm91dGluZXMgdG8gaGFuZGxlIGJsb2NrIHNpemVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiAyayBhbmQgdG8gbW92ZSBtdWx0aXBsZSBzZWN0b3JzIGluIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKiAyLjA0ICBBcHIgMjEsIDE5OTUgLS0gQWRkIHdvcmstYXJvdW5kIGZvciBDcmVhdGl2ZSBMYWJzIENEMjIwRSBkcml2ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIE5pY2sgU2F3IDxjd3Nhd0BwdHM3LnB0cy5tb3QuY29tPiBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICBoZWxwIGluIGZpZ3VyaW5nIHRoaXMgb3V0LiAgRGl0dG8gZm9yIEFjZXIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgQXp0ZWNoIGRyaXZlcywgd2hpY2ggc2VlbSB0byBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCisgKiAyLjA0YiBNYXkgMzAsIDE5OTUgLS0gRml4IHRvIG1hdGNoIGNoYW5nZXMgaW4gaWRlLmMgdmVyc2lvbiAzLjE2IC1tbAorICogMi4wNSAgSnVuICA4LCAxOTk1IC0tIERvbid0IGF0dGVtcHQgdG8gcmV0cnkgYWZ0ZXIgYW4gaWxsZWdhbCByZXF1ZXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRhdGEgcHJvdGVjdCBlcnJvci4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2UgSFdJRiBhbmQgREVWX0hXSUYgbWFjcm9zIGFzIGluIGlkZS5jLgorICogICAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyB0cnkgdG8gZG8gYSByZXF1ZXN0X3NlbnNlIGFmdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgZmFpbGVkIGNvbW1hbmQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBhbiBvcHRpb24gdG8gZ2l2ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucworICogICAgICAgICAgICAgICAgICAgICAgICBvZiBBVEFQSSBlcnJvcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4IGEgYnVnIGluIGhhbmRsaW5nIHRoZSBzZWN0b3IgY2FjaGUgd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc2hvd2VkIHVwIGlmIHRoZSBkcml2ZSByZXR1cm5lZCBkYXRhIGluIDUxMiBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAobGlrZSBQaW9uZWVyIGRyaXZlcykuICBUaGFua3MgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgUmljaGFyZCBIaXJzdCA8c3JoQGdwdC5jby51az4gZm9yIGRpYWdub3NpbmcgdGhpcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJseSBzdXBwbHkgdGhlIHBhZ2UgbnVtYmVyIGZpZWxkIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBNT0RFX1NFTEVDVCBjb21tYW5kLgorICogICAgICAgICAgICAgICAgICAgICAgIFBMQVlBVURJTzEyIGlzIGJyb2tlbiBvbiB0aGUgQXp0ZWNoOyB3b3JrIGFyb3VuZCBpdC4KKyAqIDIuMDV4IEF1ZyAxMSwgMTk5NSAtLSBsb3RzIG9mIGRhdGEgc3RydWN0dXJlIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcgaW4gaWRlLmMKKyAqICAgICAgICAgICAgICAgICAgICAgICAobXkgYXBvbG9naWVzIHRvIFNjb3R0LCBidXQgbm93IGlkZS1jZC5jIGlzIGluZGVwZW5kZW50KQorICogMy4wMCAgQXVnIDIyLCAxOTk1IC0tIEltcGxlbWVudCBDRFJPTU1VTFRJU0VTU0lPTiBpb2N0bC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnQgQ0RST01SRUFEQVVESU8gaW9jdGwgKFVOVEVTVEVEKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2UgaW5wdXRfaWRlX2RhdGEoKSBhbmQgb3V0cHV0X2lkZV9kYXRhKCkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkIGRvb3IgbG9ja2luZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggdXNhZ2UgY291bnQgbGVhayBpbiBjZHJvbV9vcGVuLCB3aGljaCBoYXBwZW5lZAorICogICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgcmVhZC13cml0ZSBtb3VudCB3YXMgYXR0ZW1wdGVkLgorICogICAgICAgICAgICAgICAgICAgICAgIFRyeSB0byBsb2FkIHRoZSBkaXNrIG9uIG9wZW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgSW1wbGVtZW50IENEUk9NRUpFQ1RfU1cgaW9jdGwgKG9mZiBieSBkZWZhdWx0KS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBSZWFkIHRvdGFsIGNkcm9tIGNhcGFjaXR5IGR1cmluZyBvcGVuLgorICogICAgICAgICAgICAgICAgICAgICAgIFJlYXJyYW5nZSBsb2dpYyBpbiBjZHJvbV9kZWNvZGVfc3RhdHVzLiAgSXNzdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBzZW5zZSBjb21tYW5kcyBmb3IgZmFpbGVkIHBhY2tldCBjb21tYW5kcworICogICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhlcmUgaW5zdGVhZCBvZiBmcm9tIGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kLgorICogICAgICAgICAgICAgICAgICAgICAgICBGaXggYSByYWNlIGNvbmRpdGlvbiBpbiByZXRyaWV2aW5nIGVycm9yIGluZm9ybWF0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzIHByaW50aW5nIG5vcm1hbCB1bml0IGF0dGVudGlvbiBlcnJvcnMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgZHJpdmUgbm90IHJlYWR5IGVycm9ycy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnQgQ0RST01WT0xSRUFEIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIEltcGxlbWVudCBDRFJPTVJFQURNT0RFMS8yIGlvY3Rscy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggcmFjZSBjb25kaXRpb24gaW4gc2V0dGluZyB1cCBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgYHNlcmlhbGl6ZScgb3B0aW9uIGlzIHVzZWQuCisgKiAzLjAxICBTZXAgIDIsIDE5OTUgLS0gRml4IG9yZGVyaW5nIG9mIHJlZW5hYmxpbmcgaW50ZXJydXB0cyBpbgorICogICAgICAgICAgICAgICAgICAgICAgICBjZHJvbV9xdWV1ZV9yZXF1ZXN0LgorICogICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgdHJ5IGF0IHVzaW5nIGlkZV9baW5wdXQsb3V0cHV0XV9kYXRhLgorICogMy4wMiAgU2VwIDE2LCAxOTk1IC0tIFN0aWNrIHRvdGFsIGRpc2sgY2FwYWNpdHkgaW4gcGFydGl0aW9uIHRhYmxlIGFzIHdlbGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgTWFrZSBWRVJCT1NFX0lERV9DRF9FUlJPUlMgZHVtcCBmYWlsZWQgY29tbWFuZCBhZ2Fpbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICBEdW1wIG91dCBtb3JlIGluZm9ybWF0aW9uIGZvciBJTExFR0FMIFJFUVVFU1QgZXJycy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggaGFuZGxpbmcgb2YgZXJyb3JzIG9jY3VycmluZyBiZWZvcmUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCBjb21tYW5kIGlzIHRyYW5zZmVycmVkLgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCB0cmFuc2ZlcnMgd2l0aCBvZGQgYnl0ZWxlbmd0aHMuCisgKiAzLjAzICBPY3QgMjcsIDE5OTUgLS0gU29tZSBDcmVhdGl2ZSBkcml2ZXMgaGF2ZSBhbiBpZCBvZiBqdXN0IGBDRCcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgYERDSS0yUzEwJyBkcml2ZXMgYXJlIGJyb2tlbiB0b28uCisgKiAzLjA0ICBOb3YgMjAsIDE5OTUgLS0gU28gYXJlIFZlcnRvcyBkcml2ZXMuCisgKiAzLjA1ICBEZWMgIDEsIDE5OTUgLS0gQ2hhbmdlcyB0byBnbyB3aXRoIG92ZXJoYXVsIG9mIGlkZS5jIGFuZCBpZGUtdGFwZS5jCisgKiAzLjA2ICBEZWMgMTYsIDE5OTUgLS0gQWRkIHN1cHBvcnQgbmVlZGVkIGZvciBwYXJ0aXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgIE1vcmUgd29ya2Fyb3VuZHMgZm9yIFZlcnRvcyBidWdzIChiYXNlZCBvbiBwYXRjaGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gSG9sZ2VyIERpZXR6ZSA8ZGlldHplQGFpeDUyMC5pbmZvcm1hdGlrLnVuaS1sZWlwemlnLmRlPikuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVHJ5IHRvIGVsaW1pbmF0ZSBieXRlb3JkZXIgYXNzdW1wdGlvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGF0YXBpX2Nkcm9tX3N1YmNobmwgc3RydWN0IGRlZmluaXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkIFNUQU5EQVJEX0FUQVBJIGNvbXBpbGF0aW9uIG9wdGlvbi4KKyAqIDMuMDcgIEphbiAyOSwgMTk5NiAtLSBNb3JlIHR3aWRkbGluZyBmb3IgYnJva2VuIGRyaXZlczogU29ueSA1NUQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRvcyAzMDAuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkIE5PX0RPT1JfTE9DS0lORyBjb25maWd1cmF0aW9uIG9wdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgZHJpdmVfY21kIHJlcXVlc3RzIHcvTlVMTCBhcmdzIChmb3IgaGRwYXJtIC10KS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBXb3JrIGFyb3VuZCBzcG9yYWRpYyBTb255NTVlIGF1ZGlvIHBsYXkgcHJvYmxlbS4KKyAqIDMuMDdhIEZlYiAxMSwgMTk5NiAtLSBjaGVjayBkcml2ZS0+aWQgZm9yIE5VTEwgYmVmb3JlIGRlcmVmZXJlbmNpbmcsIHRvIGZpeAorICogICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtIHdpdGggImhkZT1jZHJvbSIgd2l0aCBubyBkcml2ZSBwcmVzZW50LiAgLW1sCisgKiAzLjA4ICBNYXIgIDYsIDE5OTYgLS0gTW9yZSBWZXJ0b3Mgd29ya2Fyb3VuZHMuCisgKiAzLjA5ICBBcHIgIDUsIDE5OTYgLS0gQWRkIENEUk9NQ0xPU0VUUkFZIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaCB0byB1c2luZyBNU0YgYWRkcmVzc2luZyBmb3IgYXVkaW8gY29tbWFuZHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgUmVmb3JtYXQgdG8gbWF0Y2gga2VybmVsIHRhYmJpbmcgc3R5bGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkIENEUk9NX0dFVF9VUEMgaW9jdGwuCisgKiAzLjEwICBBcHIgMTAsIDE5OTYgLS0gRml4IGNvbXBpbGF0aW9uIGVycm9yIHdpdGggU1RBTkRBUkRfQVRBUEkuCisgKiAzLjExICBBcHIgMjksIDE5OTYgLS0gUGF0Y2ggZnJvbSBIZWlrbyBFaXNzZmVsZHQgPGhlaWtvQGNvbG9zc3VzLmVzY2FwZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgcmVkdW5kYW50IHZlcmlmeV9hcmVhIGNhbGxzLgorICogMy4xMiAgTWF5ICA3LCAxOTk2IC0tIFJ1ZGltZW50YXJ5IGNoYW5nZXIgc3VwcG9ydC4gIEJhc2VkIG9uIHBhdGNoZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBHZXJoYXJkIFp1YmVyIDx6dWJlckBiZXJsaW4uc25hZnUuZGU+LgorICogICAgICAgICAgICAgICAgICAgICAgIExldCBvcGVuIHN1Y2NlZWQgZXZlbiBpZiB0aGVyZSdzIG5vIGxvYWRlZCBkaXNjLgorICogMy4xMyAgTWF5IDE5LCAxOTk2IC0tIEZpeGVzIGZvciBjaGFuZ2VyIGNvZGUuCisgKiAzLjE0ICBNYXkgMjksIDE5OTYgLS0gQWRkIHdvcmstYXJvdW5kIGZvciBWZXJ0b3MgNjAwLgorICogICAgICAgICAgICAgICAgICAgICAgICAoRnJvbSBIZW5udXMgQmVyZ21hbiA8aGVubnVzQHNreS5vdy5ubD4uKQorICogMy4xNSAgSnVseSAyLCAxOTk2IC0tIEFkZGVkIHN1cHBvcnQgZm9yIFNhbnlvIDMgQ0QgY2hhbmdlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBCZW4gR2FsbGlhcnQgPGJnYWxsaWFAbHVjLmVkdT4gd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCBoZWxwIGZyb20gSmVmZiBMaWdodGZvb3QgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDxqZWZmbWxAcG9ib3guY29tPgorICogMy4xNWEgSnVseSA5LCAxOTk2IC0tIEltcHJvdmVkIFNhbnlvIDMgQ0QgY2hhbmdlciBpZGVudGlmaWNhdGlvbgorICogMy4xNiAgSnVsIDI4LCAxOTk2IC0tIEZpeCBmcm9tIEdhZGkgdG8gcmVkdWNlIGtlcm5lbCBzdGFjayB1c2FnZSBmb3IgaW9jdGwuCisgKiAzLjE3ICBTZXAgMTcsIDE5OTYgLS0gVHdlYWsgYXVkaW8gcmVhZHMgZm9yIHNvbWUgZHJpdmVzLgorICogICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IGNoYW5naW5nIENEUk9NTE9BREZST01TTE9UIHRvIENEUk9NX1NFTEVDVF9ESVNDLgorICogMy4xOCAgT2N0IDMxLCAxOTk2IC0tIEFkZGVkIG1vZHVsZSBhbmQgRE1BIHN1cHBvcnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgCisgKiA0LjAwICBOb3YgNSwgMTk5NiAgIC0tIE5ldyBpZGUtY2QgbWFpbnRhaW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJpayBCLiBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICAgLS0gTmV3ZXIgQ3JlYXRpdmUgZHJpdmVzIGRvbid0IGFsd2F5cyBzZXQgdGhlIGVycm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29ycmVjdGx5LiAgTWFrZSBzdXJlIHdlIHNlZSBtZWRpYSBjaGFuZ2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnYXJkbGVzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgLS0gSW50ZWdyYXRlIHdpdGggZ2VuZXJpYyBjZHJvbSBkcml2ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIENEUk9NR0VUU1BJTkRPV04gYW5kIENEUk9NU0VUU1BJTkRPV04gaW9jdGxzLCBiYXNlZCBvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGEgcGF0Y2ggZnJvbSBDaXJvIENhdHR1dG8gPD4uCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIENhbGwgc2V0X2RldmljZV9yby4KKyAqICAgICAgICAgICAgICAgICAgICAgLS0gSW1wbGVtZW50IENEUk9NTUVDSEFOSVNNU1RBVFVTIGFuZCBDRFJPTVNMT1RUQUJMRQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RscywgYmFzZWQgb24gcGF0Y2ggYnkgRXJpayBBbmRlcnNlbgorICogICAgICAgICAgICAgICAgICAgICAtLSBBZGQgc29tZSBwcm9iZXMgb2YgZHJpdmUgY2FwYWJpbGl0eSBkdXJpbmcgc2V0dXAuCisgKgorICogNC4wMSAgTm92IDExLCAxOTk2ICAtLSBTcGxpdCBpbnRvIGlkZS1jZC5jIGFuZCBpZGUtY2QuaAorICogICAgICAgICAgICAgICAgICAgICAtLSBSZW1vdmVkIENEUk9NTUVDSEFOSVNNU1RBVFVTIGFuZCBDRFJPTVNMT1RUQUJMRSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpb2N0bHMgaW4gZmF2b3Igb2YgYSBnZW5lcmFsaXplZCBhcHByb2FjaCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZ2VuZXJpYyBjZHJvbSBkcml2ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIEZ1bGx5IGludGVncmF0ZWQgd2l0aCB0aGUgMi4xLlgga2VybmVsLgorICogICAgICAgICAgICAgICAgICAgICAtLSBPdGhlciBzdHVmZiB0aGF0IEkgZm9yZ290IChsb3RzIG9mIGNoYW5nZXMpCisgKgorICogNC4wMiAgRGVjIDAxLCAxOTk2ICAtLSBBcHBsaWVkIHBhdGNoIGZyb20gR2FkaSBPeG1hbiA8Z2FkaW9AbmV0dmlzaW9uLm5ldC5pbD4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmaXggdGhlIGRyaXZlIGRvb3IgbG9ja2luZyBwcm9ibGVtcy4KKyAqCisgKiA0LjAzICBEZWMgMDQsIDE5OTYgIC0tIEFkZGVkIERTQyBvdmVybGFwIHN1cHBvcnQuCisgKiA0LjA0ICBEZWMgMjksIDE5OTYgIC0tIEFkZGVkIENEUk9NUkVBRFJBVyBpb2NsdCBiYXNlZCBvbiBwYXRjaCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSBBbGVzIE1ha2Fyb3YgKHhtYWthcm92QHN1bi5mZWxrLmN2dXQuY3opCisgKgorICogNC4wNSAgTm92IDIwLCAxOTk3ICAtLSBNb2RpZmllZCB0byBwcmludCBtb3JlIGRyaXZlIGluZm8gb24gaW5pdAorICogICAgICAgICAgICAgICAgICAgICAgICBNaW5vciBvdGhlciBjaGFuZ2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBlcnJvcnMgb24gQ0RST01TVE9QIChJZiB5b3UgaGF2ZSBhICJEb2xwaGluIiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgbXVzdCBkZWZpbmUgSUhBVkVBRE9MUEhJTikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgaWRlbnRpZmllciBzbyBuZXcgU2FueW8gQ0QtY2hhbmdlciB3b3JrcworICogICAgICAgICAgICAgICAgICAgICAgICBCZXR0ZXIgZGV0ZWN0aW9uIGlmIGRvb3IgbG9ja2luZyBpc24ndCBzdXBwb3J0ZWQKKyAqCisgKiA0LjA2ICBEZWMgMTcsIDE5OTcgIC0tIGZpeGVkIGVuZGxlc3MgInRyYXkgb3BlbiIgbWVzc2FnZXMgIC1tbAorICogNC4wNyAgRGVjIDE3LCAxOTk3ICAtLSBmYWxsYmFjayB0byBzZXQgcGMtPnN0YXQgb24gInRyYXkgb3BlbiIKKyAqIDQuMDggIERlYyAxOCwgMTk5NyAgLS0gc3BldyBsZXNzIG5vaXNlIHdoZW4gdHJheSBpcyBlbXB0eQorICogICAgICAgICAgICAgICAgICAgICAtLSBmaXggc3BlZWQgZGlzcGxheSBmb3IgQUNFUiAyNFgsIDE4WAorICogNC4wOSAgSmFuIDA0LCAxOTk4ICAtLSBmaXggaGFuZGxpbmcgb2YgdGhlIGxhc3QgYmxvY2sgc28gd2UgcmV0dXJuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlbmQgb2YgZmlsZSBpbnN0ZWFkIG9mIGFuIEkvTyBlcnJvciAoR2FkaSkKKyAqIDQuMTAgIEphbiAyNCwgMTk5OCAgLS0gZml4ZWQgYSBidWcgc28gbm93IGNoYW5nZXJzIGNhbiBjaGFuZ2UgdG8gYSBuZXcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Qgd2hlbiB0aGVyZSBpcyBubyBkaXNjIGluIHRoZSBjdXJyZW50IHNsb3QuCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlcmUgaW5mby0+Y2hhbmdlcl9pbmZvIHdhcworICogICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jJ2VkIGJ1dCBuZXZlciBmcmVlJ2Qgd2hlbiBjbG9zaW5nIHRoZSBkZXZpY2UuCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIGdsb2JhbCBuYW1lc3BhY2UgYSBiaXQgYnkgbWFraW5nIG1vcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBzdGF0aWMgdGhhdCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4uCisgKiA0LjExICBNYXIgMTIsIDE5OTggIC0tIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBDRFJPTV9TRUxFQ1RfU1BFRUQgaW9jdGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGEgcGF0Y2ggZm9yIDIuMC4zMyBieSBKZWxsZSBGb2tzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgPGplbGxlQHNjaW50aWxsYS51dHdlbnRlLm5sPiwgYSBwYXRjaCBmb3IgMi4wLjMzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBieSBUb25pIEdpb3JnaW5vIDx0b25pQHBjYXBlMi5waS5pbmZuLml0PiwgdGhlIFNDU0kKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24sIGFuZCBteSBvd24gZWZmb3J0cy4gIC1lcmlrCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIEZpeGVkIGEgc3R1cGlkIGJ1ZyB3aGljaCBlZ2NzIHdhcyBraW5kIGVub3VnaCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtIG1lIG9mIHdoZXJlICJJbGxlZ2FsIG1vZGUgZm9yIHRoaXMgdHJhY2siCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgbmV2ZXIgcmV0dXJuZWQgZHVlIHRvIGEgY29tcGFyaXNvbiBvbiBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBvZiBsaW1pdGVkIHJhbmdlLgorICogNC4xMiAgTWFyIDI5LCAxOTk4ICAtLSBGaXhlZCBidWcgaW4gQ0RST01fU0VMRUNUX1NQRUVEIHNvIHdyaXRlIHNwZWVkIGlzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgbm93IHNldCBpb25seSBmb3IgQ0QtUiBhbmQgQ0QtUlcgZHJpdmVzLiAgSSBoYWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIHRoaXMgc3VwcG9ydCBiZWNhdXNlIGl0IHByb2R1Y2VkIGVycm9ycy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEl0IHByb2R1Y2VkIGVycm9ycyBfb25seV8gZm9yIG5vbi13cml0ZXJzLiBkdWguCisgKiA0LjEzICBNYXkgMDUsIDE5OTggIC0tIFN1cHByZXNzIHVzZWxlc3MgImluIHByb2dyZXNzIG9mIGJlY29taW5nIHJlYWR5IgorICogICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMsIHNpbmNlIHRoaXMgaXMgbm90IGFuIGVycm9yLgorICogICAgICAgICAgICAgICAgICAgICAtLSBDaGFuZ2UgZXJyb3IgbWVzc2FnZXMgdG8gYmUgY29uc3QKKyAqICAgICAgICAgICAgICAgICAgICAgLS0gUmVtb3ZlIGEgIlx0IiB3aGljaCBsb29rcyB1Z2x5IGluIHRoZSBzeXNsb2dzCisgKiA0LjE0ICBKdWx5IDE3LCAxOTk4IC0tIENoYW5nZSB0byBwb2ludGluZyB0byAucHMgdmVyc2lvbiBvZiBBVEFQSSBzcGVjCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgLnBkZiB2ZXJzaW9uIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLi4uCisgKiAgICAgICAgICAgICAgICAgICAgIC0tIFVwZGF0ZWQgdGhlIFRPRE8gbGlzdCB0byBzb21ldGhpbmcgbW9yZSBjdXJyZW50LgorICoKKyAqIDQuMTUgIEF1ZyAyNSwgMTk5OCAgLS0gVXBkYXRlZCBpZGUtY2QuaCB0byByZXNwZWN0IG1lY2hpbmUgZW5kaWFuZXNzLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoIHRoYW5rcyB0byAiRWRkaWUgQy4gRG9zdCIgPGVjZEBza3luZXQuYmU+CisgKgorICogNC41MCAgT2N0IDE5LCAxOTk4ICAtLSBOZXcgbWFpbnRhaW5lcnMhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBKZW5zIEF4Ym9lIDxheGJvZUBpbWFnZS5kaz4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIENocmlzIFp3aWxsaW5nIDxjaHJpc0BjbG91ZG5ldC5jb20+CisgKgorICogNC41MSAgRGVjIDIzLCAxOTk4ICAtLSBKZW5zIEF4Ym9lIDxheGJvZUBpbWFnZS5kaz4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gaWRlX2Nkcm9tX3Jlc2V0IGVuYWJsZWQgc2luY2UgdGhlIGlkZSBzdWJzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgcmVzZXRzIGZpbmUgbm93LiA8YXhib2VAaW1hZ2UuZGs+CisgKiAgICAgICAgICAgICAgICAgICAgICAtIFRyYW5zZmVyIHNpemUgZml4IGZvciBTYW1zdW5nIENELVJPTXMsIHRoYW5rcyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAiVmlsbGUgSGFsbGlrIiA8dmlsbGUuaGFsbGlrQG1haWwuZWU+LgorICogICAgICAgICAgICAgICAgICAgICAgLSBvdGhlciBtaW5vciBzdHVmZi4KKyAqCisgKiA0LjUyICBKYW4gMTksIDE5OTkgIC0tIEplbnMgQXhib2UgPGF4Ym9lQGltYWdlLmRrPgorICogICAgICAgICAgICAgICAgICAgICAgLSBEZXRlY3QgRFZELVJPTS9SQU0gZHJpdmVzCisgKgorICogNC41MyAgRmViIDIyLCAxOTk5ICAgLSBJbmNsdWRlIG90aGVyIG1vZGVsIFNhbXN1bmcgYW5kIG9uZSBHb2xkc3RhcgorICogICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmUgaW4gdHJhbnNmZXIgc2l6ZSBsaW1pdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gRml4IHRoZSBJL08gZXJyb3Igd2hlbiBkb2luZyBlamVjdCB3aXRob3V0IGEgbWVkaXVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgb24gc29tZSBkcml2ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAtIENEUk9NUkVBRE1PREUyIGlzIG5vdyBpbXBsZW1lbnRlZCB0aHJvdWdoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBDRFJPTVJFQURSQVcsIHNpbmNlIG1hbnkgZHJpdmVzIGRvbid0IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1PREUyIChldmVuIHRob3VnaCBBVEFQSSAyLjYgc2F5cyB0aGV5IG11c3QpLgorICogICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCBpZ25vcmUgcGFyYW1ldGVyIHRvIGlkZS1jZCAoYXMgYSBtb2R1bGUpLCBlZworICogICAgICAgICAgICAgICAgICAgICAgICAgCWluc21vZCBpZGUtY2QgaWdub3JlPSdoZGEgaGRiJworICogICAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHdoZW4gdXNpbmcgaWRlLWNkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGlkZS1zY3NpLiBUT0RPOiBub24tbW9kdWxhciB3YXkgb2YgZG9pbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lLgorICoKKyAqIDQuNTQgIEF1ZyA1LCAxOTk5CS0gU3VwcG9ydCBmb3IgTU1DMiBjbGFzcyBjb21tYW5kcyB0aHJvdWdoIHRoZSBnZW5lcmljCisgKgkJCSAgcGFja2V0IGludGVyZmFjZSB0byBjZHJvbS5jLgorICoJCQktIFVuaWZpZWQgYXVkaW8gaW9jdGwgc3VwcG9ydCwgbW9zdCBvZiBpdC4KKyAqCQkJLSBjbGVhbmVkIHVwIHZhcmlvdXMgZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYSgpLgorICoJCQktIEFkZGVkIGlkZV9jZHJvbV9wYWNrZXQoKSBhcyB0aGUgaW50ZXJmYWNlIGZvcgorICoJCQkgIHRoZSBVbmlmb3JtIGdlbmVyaWNfcGFja2V0KCkuCisgKgkJCS0gYnVuY2ggb2Ygb3RoZXIgc3R1ZmYsIHdpbGwgZmlsbCBpbiBsb2dzIGxhdGVyLgorICoJCQktIHJlcG9ydCAxIHNsb3QgZm9yIG5vbi1jaGFuZ2VycywgbGlrZSB0aGUgb3RoZXIKKyAqCQkJICBjZC1yb20gZHJpdmVycy4gZG9uJ3QgcmVwb3J0IHNlbGVjdCBkaXNjIGZvcgorICoJCQkgIG5vbi1jaGFuZ2VycyBhcyB3ZWxsLgorICoJCQktIG1hc2sgb3V0IGF1ZGlvIHBsYXlpbmcsIGlmIHRoZSBkZXZpY2UgY2FuJ3QgZG8gaXQuCisgKgorICogNC41NSAgU2VwIDEsIDE5OTkJLSBFbGltaW5hdGVkIHRoZSByZXN0IG9mIHRoZSBhdWRpbyBpb2N0bHMsIGV4Y2VwdAorICoJCQkgIGZvciBDRFJPTVJFQURUT0NbRU5UUll8SEVBREVSXS4gU29tZSBvZiB0aGUgZHJpdmVycworICoJCQkgIHVzZSB0aGlzIGluZGVwZW5kZW50bHkgb2YgdGhlIGFjdHVhbCBhdWRpbyBoYW5kbGluZy4KKyAqCQkJICBUaGV5IHdpbGwgZGlzYXBwZWFyIGxhdGVyIHdoZW4gSSBnZXQgdGhlIHRpbWUgdG8KKyAqCQkJICBkbyBpdCBjbGVhbmx5LgorICoJCQktIE1pbmltaXplIHRoZSBUT0MgcmVhZGluZyAtIG9ubHkgZG8gaXQgd2hlbiB3ZQorICoJCQkgIGtub3cgYSBtZWRpYSBjaGFuZ2UgaGFzIG9jY3VycmVkLgorICoJCQktIE1vdmVkIGFsbCB0aGUgQ0RST01SRUFEeCBpb2N0bHMgdG8gdGhlIFVuaWZvcm0gbGF5ZXIuCisgKgkJCS0gSGVpa28gRWlzc2ZlbGR0IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+IHN1cHBsaWVkCisgKgkJCSAgc29tZSBmaXhlcyBmb3IgQ0RJLgorICoJCQktIENELVJPTSBsZWF2aW5nIGRvb3IgbG9ja2VkIGZpeCBmcm9tIEFuZHJpZXMKKyAqCQkJICBCcm91d2VyIDxBbmRyaWVzLkJyb3V3ZXJAY3dpLm5sPgorICoJCQktIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQHhtaXNzaW9uLmNvbT4gdW5pZmllZAorICoJCQkgIGNvbW1hbmRzIGFjcm9zcyB0aGUgdmFyaW91cyBkcml2ZXJzIGFuZCBob3cKKyAqCQkJICBzZW5zZSBlcnJvcnMgYXJlIGhhbmRsZWQuCisgKgorICogNC41NiAgU2VwIDEyLCAxOTk5CS0gUmVtb3ZlZCBjaGFuZ2VyIHN1cHBvcnQgLSBpdCBpcyBub3cgaW4gdGhlCisgKgkJCSAgVW5pZm9ybSBsYXllci4KKyAqCQkJLSBBZGRlZCBwYXJ0aXRpb24gYmFzZWQgbXVsdGlzZXNzaW9uIGhhbmRsaW5nLgorICoJCQktIE1vZGUgc2Vuc2UgYW5kIG1vZGUgc2VsZWN0IG1vdmVkIHRvIHRoZQorICoJCQkgIFVuaWZvcm0gbGF5ZXIuCisgKgkJCS0gRml4ZWQgYSBwcm9ibGVtIHdpdGggV1BJIENEUy0zMlggZHJpdmUgLSBpdAorICoJCQkgIGZhaWxlZCB0aGUgY2FwYWJpbGl0aWVzIAorICoKKyAqIDQuNTcgIEFwciA3LCAyMDAwCS0gRml4ZWQgc2Vuc2UgcmVwb3J0aW5nLgorICoJCQktIEZpeGVkIHBvc3NpYmxlIG9vcHMgaW4gaWRlX2Nkcm9tX2dldF9sYXN0X3Nlc3Npb24oKQorICoJCQktIEZpeCBsb2NraW5nIG1hbmlhIGFuZCBtYWtlIGlkZV9jZHJvbV9yZXNldCByZWxvY2sKKyAqCQkJLSBTdG9wIHNwZXdpbmcgZXJyb3JzIHRvIGxvZyB3aGVuIG1hZ2ljZGV2IHBvbGxzIHdpdGgKKyAqCQkJICBURVNUX1VOSVRfUkVBRFkgb24gc29tZSBkcml2ZXMuCisgKgkJCS0gVmFyaW91cyBmaXhlcyBmcm9tIFRvYmlhcyBSaW5nc3Ryb206CisgKgkJCSAgdHJheSBpZiBpdCB3YXMgbG9ja2VkIHByaW9yIHRvIHRoZSByZXNldC4KKyAqCQkJICAtIGNkcm9tX3JlYWRfY2FwYWNpdHkgcmV0dXJucyBvbmUgZnJhbWUgdG9vIGxpdHRsZS4KKyAqCQkJICAtIEZpeCByZWFsIGNhcGFjaXR5IHJlcG9ydGluZy4KKyAqCisgKiA0LjU4ICBNYXkgMSwgMjAwMAktIENsZWFuIHVwIEFDRVI1MCBzdHVmZi4KKyAqCQkJLSBGaXggc21hbGwgcHJvYmxlbSB3aXRoIGlkZV9jZHJvbV9jYXBhY2l0eQorICoKKyAqIDQuNTkgIEF1ZyAxMSwgMjAwMAktIEZpeCBjaGFuZ2VyIHByb2JsZW0gaW4gY2Ryb21fcmVhZF90b2MsIHdlIHdlcmVuJ3QKKyAqCQkJICBjb3JyZWN0bHkgc2Vuc2luZyBhIGRpc2MgY2hhbmdlLgorICoJCQktIFJlYXJyYW5nZWQgc29tZSBjb2RlCisgKgkJCS0gVXNlIGV4dGVuZGVkIHNlbnNlIG9uIGRyaXZlcyB0aGF0IHN1cHBvcnQgaXQgZm9yCisgKgkJCSAgY29ycmVjdGx5IHJlcG9ydGluZyB0cmF5IHN0YXR1cyAtLSBmcm9tCisgKgkJCSAgTWljaGFlbCBEIEpvaG5zb24gPGpvaG5zb21Ab3JzdC5lZHU+CisgKiA0LjYwICBEZWMgMTcsIDIwMDMJLSBBZGQgbXQgcmFpbmllciBzdXBwb3J0CisgKgkJCS0gQnVtcCB0aW1lb3V0IGZvciBwYWNrZXQgY29tbWFuZHMsIG1hdGNoZXMgc3IKKyAqCQkJLSBPZGQgc3R1ZmYKKyAqIDQuNjEgIEphbiAyMiwgMjAwNAktIHN1cHBvcnQgaGFyZHdhcmUgc2VjdG9yIHNpemVzIG90aGVyIHRoYW4gMmtCLAorICoJCQkgIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2RlZmluZSBJREVDRF9WRVJTSU9OICI0LjYxIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4JLyogRm9yIFNDU0kgLT4gQVRBUEkgY29tbWFuZCBjb252ZXJzaW9uICovCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiaWRlLWNkLmgiCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGlkZWNkX3JlZl9zZW0pOworCisjZGVmaW5lIHRvX2lkZV9jZChvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjZHJvbV9pbmZvLCBrcmVmKSAKKworI2RlZmluZSBpZGVfY2RfZyhkaXNrKSBcCisJY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgY2Ryb21faW5mbywgZHJpdmVyKQorCitzdGF0aWMgc3RydWN0IGNkcm9tX2luZm8gKmlkZV9jZF9nZXQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGNkcm9tX2luZm8gKmNkID0gTlVMTDsKKworCWRvd24oJmlkZWNkX3JlZl9zZW0pOworCWNkID0gaWRlX2NkX2coZGlzayk7CisJaWYgKGNkKQorCQlrcmVmX2dldCgmY2QtPmtyZWYpOworCXVwKCZpZGVjZF9yZWZfc2VtKTsKKwlyZXR1cm4gY2Q7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9jZF9yZWxlYXNlKHN0cnVjdCBrcmVmICopOworCitzdGF0aWMgdm9pZCBpZGVfY2RfcHV0KHN0cnVjdCBjZHJvbV9pbmZvICpjZCkKK3sKKwlkb3duKCZpZGVjZF9yZWZfc2VtKTsKKwlrcmVmX3B1dCgmY2QtPmtyZWYsIGlkZV9jZF9yZWxlYXNlKTsKKwl1cCgmaWRlY2RfcmVmX3NlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmljIHBhY2tldCBjb21tYW5kIHN1cHBvcnQgYW5kIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLgorICovCisKKy8qIE1hcmsgdGhhdCB3ZSd2ZSBzZWVuIGEgbWVkaWEgY2hhbmdlLCBhbmQgaW52YWxpZGF0ZSBvdXIgaW50ZXJuYWwKKyAgIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBjZHJvbV9zYXdfbWVkaWFfY2hhbmdlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJCisJQ0RST01fU1RBVEVfRkxBR1MgKGRyaXZlKS0+bWVkaWFfY2hhbmdlZCA9IDE7CisJQ0RST01fU1RBVEVfRkxBR1MgKGRyaXZlKS0+dG9jX3ZhbGlkID0gMDsKKwlpbmZvLT5uc2VjdG9yc19idWZmZXJlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fbG9nX3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJICAgc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnNlbnNlKQoreworCWludCBsb2cgPSAwOworCisJaWYgKCFzZW5zZSB8fCAhcnEgfHwgKHJxLT5mbGFncyAmIFJFUV9RVUlFVCkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzZW5zZS0+c2Vuc2Vfa2V5KSB7CisJCWNhc2UgTk9fU0VOU0U6IGNhc2UgUkVDT1ZFUkVEX0VSUk9SOgorCQkJYnJlYWs7CisJCWNhc2UgTk9UX1JFQURZOgorCQkJLyoKKwkJCSAqIGRvbid0IGNhcmUgYWJvdXQgdHJheSBzdGF0ZSBtZXNzYWdlcyBmb3IKKwkJCSAqIGUuZy4gY2FwYWNpdHkgY29tbWFuZHMgb3IgaW4tcHJvZ3Jlc3Mgb3IKKwkJCSAqIGJlY29taW5nIHJlYWR5CisJCQkgKi8KKwkJCWlmIChzZW5zZS0+YXNjID09IDB4M2EgfHwgc2Vuc2UtPmFzYyA9PSAweDA0KQorCQkJCWJyZWFrOworCQkJbG9nID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCS8qCisJCQkgKiBkb24ndCBsb2cgU1RBUlRfU1RPUCB1bml0IHdpdGggTG9FaiBzZXQsIHNpbmNlCisJCQkgKiB3ZSBjYW5ub3QgcmVsaWFibHkgY2hlY2sgaWYgZHJpdmUgY2FuIGF1dG8tY2xvc2UKKwkJCSAqLworCQkJaWYgKHJxLT5jbWRbMF0gPT0gR1BDTURfU1RBUlRfU1RPUF9VTklUICYmIHNlbnNlLT5hc2MgPT0gMHgyNCkKKwkJCQlsb2cgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVU5JVF9BVFRFTlRJT046CisJCQkvKgorCQkJICogTWFrZSBnb29kIGFuZCBzdXJlIHdlJ3ZlIHNlZW4gdGhpcyBwb3RlbnRpYWwgbWVkaWEKKwkJCSAqIGNoYW5nZS4gU29tZSBkcml2ZXMgKGkuZS4gQ3JlYXRpdmUpIGZhaWwgdG8gcHJlc2VudAorCQkJICogdGhlIGNvcnJlY3Qgc2Vuc2Uga2V5IGluIHRoZSBlcnJvciByZWdpc3Rlci4KKwkJCSAqLworCQkJY2Ryb21fc2F3X21lZGlhX2NoYW5nZShkcml2ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZyA9IDE7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGxvZzsKK30KKworc3RhdGljCit2b2lkIGNkcm9tX2FuYWx5emVfc2Vuc2VfZGF0YShpZGVfZHJpdmVfdCAqZHJpdmUsCisJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqZmFpbGVkX2NvbW1hbmQsCisJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCit7CisJaWYgKCFjZHJvbV9sb2dfc2Vuc2UoZHJpdmUsIGZhaWxlZF9jb21tYW5kLCBzZW5zZSkpCisJCXJldHVybjsKKworCS8qCisJICogSWYgYSByZWFkIHRvYyBpcyBleGVjdXRlZCBmb3IgYSBDRC1SIG9yIENELVJXIG1lZGl1bSB3aGVyZQorCSAqIHRoZSBmaXJzdCB0b2MgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgaXQgd2lsbCBmYWlsIHdpdGgKKwkgKiAwNS8yNC8wMCAod2hpY2ggaXMgYSBjb25mdXNpbmcgZXJyb3IpCisJICovCisJaWYgKGZhaWxlZF9jb21tYW5kICYmIGZhaWxlZF9jb21tYW5kLT5jbWRbMF0gPT0gR1BDTURfUkVBRF9UT0NfUE1BX0FUSVApCisJCWlmIChzZW5zZS0+c2Vuc2Vfa2V5ID09IDB4MDUgJiYgc2Vuc2UtPmFzYyA9PSAweDI0KQorCQkJcmV0dXJuOworCisjaWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCisJeworCQlpbnQgaTsKKwkJY29uc3QgY2hhciAqczsKKwkJY2hhciBidWZbODBdOworCisJCXByaW50ayAoIkFUQVBJIGRldmljZSAlczpcbiIsIGRyaXZlLT5uYW1lKTsKKwkJaWYgKHNlbnNlLT5lcnJvcl9jb2RlPT0weDcwKQorCQkJcHJpbnRrKCIgIEVycm9yOiAiKTsKKwkJZWxzZSBpZiAoc2Vuc2UtPmVycm9yX2NvZGU9PTB4NzEpCisJCQlwcmludGsoIiAgRGVmZXJyZWQgRXJyb3I6ICIpOworCQllbHNlIGlmIChzZW5zZS0+ZXJyb3JfY29kZSA9PSAweDdmKQorCQkJcHJpbnRrKCIgIFZlbmRvci1zcGVjaWZpYyBFcnJvcjogIik7CisJCWVsc2UKKwkJCXByaW50aygiICBVbmtub3duIEVycm9yIFR5cGU6ICIpOworCisJCWlmIChzZW5zZS0+c2Vuc2Vfa2V5IDwgQVJZX0xFTihzZW5zZV9rZXlfdGV4dHMpKQorCQkJcyA9IHNlbnNlX2tleV90ZXh0c1tzZW5zZS0+c2Vuc2Vfa2V5XTsKKwkJZWxzZQorCQkJcyA9ICJiYWQgc2Vuc2Uga2V5ISI7CisKKwkJcHJpbnRrKCIlcyAtLSAoU2Vuc2Uga2V5PTB4JTAyeClcbiIsIHMsIHNlbnNlLT5zZW5zZV9rZXkpOworCisJCWlmIChzZW5zZS0+YXNjID09IDB4NDApIHsKKwkJCXNwcmludGYoYnVmLCAiRGlhZ25vc3RpYyBmYWlsdXJlIG9uIGNvbXBvbmVudCAweCUwMngiLAorCQkJCSBzZW5zZS0+YXNjcSk7CisJCQlzID0gYnVmOworCQl9IGVsc2UgeworCQkJaW50IGxvID0gMCwgbWlkLCBoaSA9IEFSWV9MRU4oc2Vuc2VfZGF0YV90ZXh0cyk7CisJCQl1bnNpZ25lZCBsb25nIGtleSA9IChzZW5zZS0+c2Vuc2Vfa2V5IDw8IDE2KTsKKwkJCWtleSB8PSAoc2Vuc2UtPmFzYyA8PCA4KTsKKwkJCWlmICghKHNlbnNlLT5hc2NxID49IDB4ODAgJiYgc2Vuc2UtPmFzY3EgPD0gMHhkZCkpCisJCQkJa2V5IHw9IHNlbnNlLT5hc2NxOworCQkJcyA9IE5VTEw7CisKKwkJCXdoaWxlIChoaSA+IGxvKSB7CisJCQkJbWlkID0gKGxvICsgaGkpIC8gMjsKKwkJCQlpZiAoc2Vuc2VfZGF0YV90ZXh0c1ttaWRdLmFzY19hc2NxID09IGtleSB8fAorCQkJCSAgICBzZW5zZV9kYXRhX3RleHRzW21pZF0uYXNjX2FzY3EgPT0gKDB4ZmYwMDAwfGtleSkpIHsKKwkJCQkJcyA9IHNlbnNlX2RhdGFfdGV4dHNbbWlkXS50ZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoc2Vuc2VfZGF0YV90ZXh0c1ttaWRdLmFzY19hc2NxID4ga2V5KQorCQkJCQloaSA9IG1pZDsKKwkJCQllbHNlCisJCQkJCWxvID0gbWlkKzE7CisJCQl9CisJCX0KKworCQlpZiAocyA9PSBOVUxMKSB7CisJCQlpZiAoc2Vuc2UtPmFzYyA+IDB4ODApCisJCQkJcyA9ICIodmVuZG9yLXNwZWNpZmljIGVycm9yKSI7CisJCQllbHNlCisJCQkJcyA9ICIocmVzZXJ2ZWQgZXJyb3IgY29kZSkiOworCQl9CisKKwkJcHJpbnRrKEtFUk5fRVJSICIgICVzIC0tIChhc2M9MHglMDJ4LCBhc2NxPTB4JTAyeClcbiIsCisJCQlzLCBzZW5zZS0+YXNjLCBzZW5zZS0+YXNjcSk7CisKKwkJaWYgKGZhaWxlZF9jb21tYW5kICE9IE5VTEwpIHsKKworCQkJaW50IGxvPTAsIG1pZCwgaGk9IEFSWV9MRU4gKHBhY2tldF9jb21tYW5kX3RleHRzKTsKKwkJCXMgPSBOVUxMOworCisJCQl3aGlsZSAoaGkgPiBsbykgeworCQkJCW1pZCA9IChsbyArIGhpKSAvIDI7CisJCQkJaWYgKHBhY2tldF9jb21tYW5kX3RleHRzW21pZF0ucGFja2V0X2NvbW1hbmQgPT0KKwkJCQkgICAgZmFpbGVkX2NvbW1hbmQtPmNtZFswXSkgeworCQkJCQlzID0gcGFja2V0X2NvbW1hbmRfdGV4dHNbbWlkXS50ZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHBhY2tldF9jb21tYW5kX3RleHRzW21pZF0ucGFja2V0X2NvbW1hbmQgPgorCQkJCSAgICBmYWlsZWRfY29tbWFuZC0+Y21kWzBdKQorCQkJCQloaSA9IG1pZDsKKwkJCQllbHNlCisJCQkJCWxvID0gbWlkKzE7CisJCQl9CisKKwkJCXByaW50ayAoS0VSTl9FUlIgIiAgVGhlIGZhaWxlZCBcIiVzXCIgcGFja2V0IGNvbW1hbmQgd2FzOiBcbiAgXCIiLCBzKTsKKwkJCWZvciAoaT0wOyBpPHNpemVvZiAoZmFpbGVkX2NvbW1hbmQtPmNtZCk7IGkrKykKKwkJCQlwcmludGsgKCIlMDJ4ICIsIGZhaWxlZF9jb21tYW5kLT5jbWRbaV0pOworCQkJcHJpbnRrICgiXCJcbiIpOworCQl9CisKKwkJLyogVGhlIFNLU1YgYml0IHNwZWNpZmllcyB2YWxpZGl0eSBvZiB0aGUgc2Vuc2Vfa2V5X3NwZWNpZmljCisJCSAqIGluIHRoZSBuZXh0IHR3byBjb21tYW5kcy4gSXQgaXMgYml0IDcgb2YgdGhlIGZpcnN0IGJ5dGUuCisJCSAqIEluIHRoZSBjYXNlIG9mIE5PVF9SRUFEWSwgaWYgU0tTViBpcyBzZXQgdGhlIGRyaXZlIGNhbgorCQkgKiBnaXZlIHVzIG5pY2UgRVRBIHJlYWRpbmdzLgorCQkgKi8KKwkJaWYgKHNlbnNlLT5zZW5zZV9rZXkgPT0gTk9UX1JFQURZICYmIChzZW5zZS0+c2tzWzBdICYgMHg4MCkpIHsKKwkJCWludCBwcm9ncmVzcyA9IChzZW5zZS0+c2tzWzFdIDw8IDggfCBzZW5zZS0+c2tzWzJdKSAqIDEwMDsKKwkJCXByaW50ayhLRVJOX0VSUiAiICBDb21tYW5kIGlzICUwMmQlJSBjb21wbGV0ZVxuIiwgcHJvZ3Jlc3MgLyAweGZmZmYpOworCisJCX0KKworCQlpZiAoc2Vuc2UtPnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QgJiYKKwkJICAgIChzZW5zZS0+c2tzWzBdICYgMHg4MCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIgIEVycm9yIGluICVzIGJ5dGUgJWQiLAorCQkJCShzZW5zZS0+c2tzWzBdICYgMHg0MCkgIT0gMCA/CisJCQkJImNvbW1hbmQgcGFja2V0IiA6ICJjb21tYW5kIGRhdGEiLAorCQkJCShzZW5zZS0+c2tzWzFdIDw8IDgpICsgc2Vuc2UtPnNrc1syXSk7CisKKwkJCWlmICgoc2Vuc2UtPnNrc1swXSAmIDB4NDApICE9IDApCisJCQkJcHJpbnRrICgiIGJpdCAlZCIsIHNlbnNlLT5za3NbMF0gJiAweDA3KTsKKworCQkJcHJpbnRrICgiXG4iKTsKKwkJfQorCX0KKworI2Vsc2UgLyogbm90IFZFUkJPU0VfSURFX0NEX0VSUk9SUyAqLworCisJLyogU3VwcHJlc3MgcHJpbnRpbmcgdW5pdCBhdHRlbnRpb24gYW5kIGBpbiBwcm9ncmVzcyBvZiBiZWNvbWluZyByZWFkeScKKwkgICBlcnJvcnMgd2hlbiB3ZSdyZSBub3QgYmVpbmcgdmVyYm9zZS4gKi8KKworCWlmIChzZW5zZS0+c2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OIHx8CisJICAgIChzZW5zZS0+c2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSAmJiAoc2Vuc2UtPmFzYyA9PSA0IHx8CisJCQkJCQlzZW5zZS0+YXNjID09IDB4M2EpKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgY29kZTogMHglMDJ4ICBzZW5zZV9rZXk6IDB4JTAyeCAgYXNjOiAweCUwMnggIGFzY3E6IDB4JTAyeFxuIiwKKwkJZHJpdmUtPm5hbWUsCisJCXNlbnNlLT5lcnJvcl9jb2RlLCBzZW5zZS0+c2Vuc2Vfa2V5LAorCQlzZW5zZS0+YXNjLCBzZW5zZS0+YXNjcSk7CisjZW5kaWYgLyogbm90IFZFUkJPU0VfSURFX0NEX0VSUk9SUyAqLworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIGlkZS1jZCBwYWNrZXQgY29tbWFuZCByZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkIGNkcm9tX3ByZXBhcmVfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqY2QgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKwlpZGVfaW5pdF9kcml2ZV9jbWQocnEpOworCXJxLT5mbGFncyA9IFJFUV9QQzsKKwlycS0+cnFfZGlzayA9IGNkLT5kaXNrOworfQorCitzdGF0aWMgdm9pZCBjZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqc2Vuc2UsCisJCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKmZhaWxlZF9jb21tYW5kKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvCQk9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEJCT0gJmluZm8tPnJlcXVlc3Rfc2Vuc2VfcmVxdWVzdDsKKworCWlmIChzZW5zZSA9PSBOVUxMKQorCQlzZW5zZSA9ICZpbmZvLT5zZW5zZV9kYXRhOworCisJLyogc3R1ZmYgdGhlIHNlbnNlIHJlcXVlc3QgaW4gZnJvbnQgb2Ygb3VyIGN1cnJlbnQgcmVxdWVzdCAqLworCWNkcm9tX3ByZXBhcmVfcmVxdWVzdChkcml2ZSwgcnEpOworCisJcnEtPmRhdGEgPSBzZW5zZTsKKwlycS0+Y21kWzBdID0gR1BDTURfUkVRVUVTVF9TRU5TRTsKKwlycS0+Y21kWzRdID0gcnEtPmRhdGFfbGVuID0gMTg7CisKKwlycS0+ZmxhZ3MgPSBSRVFfU0VOU0U7CisKKwkvKiBOT1RFISBTYXZlIHRoZSBmYWlsZWQgY29tbWFuZCBpbiAicnEtPmJ1ZmZlciIgKi8KKwlycS0+YnVmZmVyID0gKHZvaWQgKikgZmFpbGVkX2NvbW1hbmQ7CisKKwkodm9pZCkgaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgcnEsIGlkZV9wcmVlbXB0KTsKK30KKworc3RhdGljIHZvaWQgY2Ryb21fZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlKQoreworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpbnQgbnNlY3RvcnMgPSBycS0+aGFyZF9jdXJfc2VjdG9yczsKKworCWlmICgocnEtPmZsYWdzICYgUkVRX1NFTlNFKSAmJiB1cHRvZGF0ZSkgeworCQkvKgorCQkgKiBGb3IgUkVRX1NFTlNFLCAicnEtPmJ1ZmZlciIgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCBmYWlsZWQKKwkJICogcmVxdWVzdAorCQkgKi8KKwkJc3RydWN0IHJlcXVlc3QgKmZhaWxlZCA9IChzdHJ1Y3QgcmVxdWVzdCAqKSBycS0+YnVmZmVyOworCQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwkJdm9pZCAqc2Vuc2UgPSAmaW5mby0+c2Vuc2VfZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAoZmFpbGVkKSB7CisJCQlpZiAoZmFpbGVkLT5zZW5zZSkgeworCQkJCXNlbnNlID0gZmFpbGVkLT5zZW5zZTsKKwkJCQlmYWlsZWQtPnNlbnNlX2xlbiA9IHJxLT5zZW5zZV9sZW47CisJCQl9CisKKwkJCS8qCisJCQkgKiBub3cgZW5kIGZhaWxlZCByZXF1ZXN0CisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhmYWlsZWQsIDAsIGZhaWxlZC0+ZGF0YV9sZW4pOworCQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGZhaWxlZCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQl9CisKKwkJY2Ryb21fYW5hbHl6ZV9zZW5zZV9kYXRhKGRyaXZlLCBmYWlsZWQsIHNlbnNlKTsKKwl9CisKKwlpZiAoIXJxLT5jdXJyZW50X25yX3NlY3RvcnMgJiYgYmxrX2ZzX3JlcXVlc3QocnEpKQorCQl1cHRvZGF0ZSA9IDE7CisJLyogbWFrZSBzdXJlIGl0J3MgZnVsbHkgZW5kZWQgKi8KKwlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQorCQluc2VjdG9ycyA9IChycS0+ZGF0YV9sZW4gKyA1MTEpID4+IDk7CisJaWYgKCFuc2VjdG9ycykKKwkJbnNlY3RvcnMgPSAxOworCisJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgbnNlY3RvcnMpOworfQorCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIGNvbnRpbnVlZC4KKyAgIFJldHVybnMgMSBpZiB0aGUgcmVxdWVzdCB3YXMgZW5kZWQuICovCitzdGF0aWMgaW50IGNkcm9tX2RlY29kZV9zdGF0dXMoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZ29vZF9zdGF0LCBpbnQgKnN0YXRfcmV0KQoreworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpbnQgc3RhdCwgZXJyLCBzZW5zZV9rZXk7CisJCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwlzdGF0ID0gSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXRfcmV0KQorCQkqc3RhdF9yZXQgPSBzdGF0OworCisJaWYgKE9LX1NUQVQoc3RhdCwgZ29vZF9zdGF0LCBCQURfUl9TVEFUKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgdGhlIElERSBlcnJvciByZWdpc3Rlci4gKi8KKwllcnIgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9FUlJPUl9SRUcpOworCXNlbnNlX2tleSA9IGVyciA+PiA0OworCisJaWYgKHJxID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogbWlzc2luZyBycSBpbiBjZHJvbV9kZWNvZGVfc3RhdHVzXG4iLCBkcml2ZS0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChycS0+ZmxhZ3MgJiBSRVFfU0VOU0UpIHsKKwkJLyogV2UgZ290IGFuIGVycm9yIHRyeWluZyB0byBnZXQgc2Vuc2UgaW5mbworCQkgICBmcm9tIHRoZSBkcml2ZSAocHJvYmFibHkgd2hpbGUgdHJ5aW5nCisJCSAgIHRvIHJlY292ZXIgZnJvbSBhIGZvcm1lciBlcnJvcikuICBKdXN0IGdpdmUgdXAuICovCisKKwkJcnEtPmZsYWdzIHw9IFJFUV9GQUlMRUQ7CisJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwkJaWRlX2Vycm9yKGRyaXZlLCAicmVxdWVzdCBzZW5zZSBmYWlsdXJlIiwgc3RhdCk7CisJCXJldHVybiAxOworCisJfSBlbHNlIGlmIChycS0+ZmxhZ3MgJiAoUkVRX1BDIHwgUkVRX0JMT0NLX1BDKSkgeworCQkvKiBBbGwgb3RoZXIgZnVuY3Rpb25zLCBleGNlcHQgZm9yIFJFQUQuICovCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyoKKwkJICogaWYgd2UgaGF2ZSBhbiBlcnJvciwgcGFzcyBiYWNrIENIRUNLX0NPTkRJVElPTiBhcyB0aGUKKwkJICogc2NzaSBzdGF0dXMgYnl0ZQorCQkgKi8KKwkJaWYgKChycS0+ZmxhZ3MgJiBSRVFfQkxPQ0tfUEMpICYmICFycS0+ZXJyb3JzKQorCQkJcnEtPmVycm9ycyA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKworCQkvKiBDaGVjayBmb3IgdHJheSBvcGVuLiAqLworCQlpZiAoc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkgeworCQkJY2Ryb21fc2F3X21lZGlhX2NoYW5nZSAoZHJpdmUpOworCQl9IGVsc2UgaWYgKHNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikgeworCQkJLyogQ2hlY2sgZm9yIG1lZGlhIGNoYW5nZS4gKi8KKwkJCWNkcm9tX3Nhd19tZWRpYV9jaGFuZ2UgKGRyaXZlKTsKKwkJCS8qcHJpbnRrKCIlczogbWVkaWEgY2hhbmdlZFxuIixkcml2ZS0+bmFtZSk7Ki8KKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKCEocnEtPmZsYWdzICYgUkVRX1FVSUVUKSkgeworCQkJLyogT3RoZXJ3aXNlLCBwcmludCBhbiBlcnJvci4gKi8KKwkJCWlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgInBhY2tldCBjb21tYW5kIGVycm9yIiwgc3RhdCk7CisJCX0KKwkJCisJCXJxLT5mbGFncyB8PSBSRVFfRkFJTEVEOworCisJCS8qCisJCSAqIGluc3RlYWQgb2YgcGxheWluZyBnYW1lcyB3aXRoIG1vdmluZyBjb21wbGV0aW9ucyBhcm91bmQsCisJCSAqIHJlbW92ZSBmYWlsZWQgcmVxdWVzdCBjb21wbGV0ZWx5IGFuZCBlbmQgaXQgd2hlbiB0aGUKKwkJICogcmVxdWVzdCBzZW5zZSBoYXMgY29tcGxldGVkCisJCSAqLworCQlpZiAoc3RhdCAmIEVSUl9TVEFUKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOworCQkJSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwkJCWNkcm9tX3F1ZXVlX3JlcXVlc3Rfc2Vuc2UoZHJpdmUsIHJxLT5zZW5zZSwgcnEpOworCQl9IGVsc2UKKwkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKworCX0gZWxzZSBpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CisJCWludCBkb19lbmRfcmVxdWVzdCA9IDA7CisKKwkJLyogSGFuZGxlIGVycm9ycyBmcm9tIFJFQUQgYW5kIFdSSVRFIHJlcXVlc3RzLiAqLworCisJCWlmIChibGtfbm9yZXRyeV9yZXF1ZXN0KHJxKSkKKwkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKKworCQlpZiAoc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkgeworCQkJLyogVHJheSBvcGVuLiAqLworCQkJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEKSB7CisJCQkJY2Ryb21fc2F3X21lZGlhX2NoYW5nZSAoZHJpdmUpOworCisJCQkJLyogRmFpbCB0aGUgcmVxdWVzdC4gKi8KKwkJCQlwcmludGsgKCIlczogdHJheSBvcGVuXG4iLCBkcml2ZS0+bmFtZSk7CisJCQkJZG9fZW5kX3JlcXVlc3QgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCQkJCS8qIGFsbG93IHRoZSBkcml2ZSA1IHNlY29uZHMgdG8gcmVjb3Zlciwgc29tZQorCQkJCSAqIGRldmljZXMgd2lsbCByZXR1cm4gdGhpcyBlcnJvciB3aGlsZSBmbHVzaGluZworCQkJCSAqIGRhdGEgZnJvbSBjYWNoZSAqLworCQkJCWlmICghcnEtPmVycm9ycykKKwkJCQkJaW5mby0+d3JpdGVfdGltZW91dCA9IGppZmZpZXMgKyBBVEFQSV9XQUlUX1dSSVRFX0JVU1k7CisJCQkJcnEtPmVycm9ycyA9IDE7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgaW5mby0+d3JpdGVfdGltZW91dCkpCisJCQkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJCQkvKgorCQkJCQkgKiB0YWtlIGEgYnJlYXRoZXIgcmVseWluZyBvbiB0aGUKKwkJCQkJICogdW5wbHVnIHRpbWVyIHRvIGtpY2sgdXMgYWdhaW4KKwkJCQkJICovCisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCQkJCQlibGtfcGx1Z19kZXZpY2UoZHJpdmUtPnF1ZXVlKTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssZmxhZ3MpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKSB7CisJCQkvKiBNZWRpYSBjaGFuZ2UuICovCisJCQljZHJvbV9zYXdfbWVkaWFfY2hhbmdlIChkcml2ZSk7CisKKwkJCS8qIEFycmFuZ2UgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCQkgICBCdXQgYmUgc3VyZSB0byBnaXZlIHVwIGlmIHdlJ3ZlIHJldHJpZWQKKwkJCSAgIHRvbyBtYW55IHRpbWVzLiAqLworCQkJaWYgKCsrcnEtPmVycm9ycyA+IEVSUk9SX01BWCkKKwkJCQlkb19lbmRfcmVxdWVzdCA9IDE7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCB8fAorCQkJICAgc2Vuc2Vfa2V5ID09IERBVEFfUFJPVEVDVCkgeworCQkJLyogTm8gcG9pbnQgaW4gcmV0cnlpbmcgYWZ0ZXIgYW4gaWxsZWdhbAorCQkJICAgcmVxdWVzdCBvciBkYXRhIHByb3RlY3QgZXJyb3IuKi8KKwkJCWlkZV9kdW1wX3N0YXR1cyAoZHJpdmUsICJjb21tYW5kIGVycm9yIiwgc3RhdCk7CisJCQlkb19lbmRfcmVxdWVzdCA9IDE7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IE1FRElVTV9FUlJPUikgeworCQkJLyogTm8gcG9pbnQgaW4gcmUtdHJ5aW5nIGEgemlsbGlvbiB0aW1lcyBvbiBhIGJhZCAKKwkJCSAqIHNlY3Rvci4uLiAgSWYgd2UgZ290IGhlcmUgdGhlIGVycm9yIGlzIG5vdCBjb3JyZWN0YWJsZSAqLworCQkJaWRlX2R1bXBfc3RhdHVzIChkcml2ZSwgIm1lZGlhIGVycm9yIChiYWQgc2VjdG9yKSIsIHN0YXQpOworCQkJZG9fZW5kX3JlcXVlc3QgPSAxOworCQl9IGVsc2UgaWYgKHNlbnNlX2tleSA9PSBCTEFOS19DSEVDSykgeworCQkJLyogRGlzayBhcHBlYXJzIGJsYW5rID8/ICovCisJCQlpZGVfZHVtcF9zdGF0dXMgKGRyaXZlLCAibWVkaWEgZXJyb3IgKGJsYW5rKSIsIHN0YXQpOworCQkJZG9fZW5kX3JlcXVlc3QgPSAxOworCQl9IGVsc2UgaWYgKChlcnIgJiB+QUJSVF9FUlIpICE9IDApIHsKKwkJCS8qIEdvIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIKKwkJCSAgIGZvciBvdGhlciBlcnJvcnMuICovCisJCQlpZGVfZXJyb3IoZHJpdmUsICJjZHJvbV9kZWNvZGVfc3RhdHVzIiwgc3RhdCk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmICgoKytycS0+ZXJyb3JzID4gRVJST1JfTUFYKSkgeworCQkJLyogV2UndmUgcmFja2VkIHVwIHRvbyBtYW55IHJldHJpZXMuICBBYm9ydC4gKi8KKwkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKKwkJfQorCisJCWlmIChkb19lbmRfcmVxdWVzdCkKKwkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKworCQkvKiBJZiB3ZSBnb3QgYSBDSEVDS19DT05ESVRJT04gc3RhdHVzLAorCQkgICBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZC4gKi8KKwkJaWYgKChzdGF0ICYgRVJSX1NUQVQpICE9IDApCisJCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBOVUxMLCBOVUxMKTsKKwl9IGVsc2UgeworCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1jZDogYmFkIHJxIik7CisJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwl9CisKKwkvKiBSZXRyeSwgb3IgaGFuZGxlIHRoZSBuZXh0IHJlcXVlc3QuICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdW5zaWduZWQgbG9uZyB3YWl0ID0gMDsKKworCS8qCisJICogU29tZSBjb21tYW5kcyBhcmUgKnNsb3cqIGFuZCBub3JtYWxseSB0YWtlIGEgbG9uZyB0aW1lIHRvCisJICogY29tcGxldGUuIFVzdWFsbHkgd2UgY2FuIHVzZSB0aGUgQVRBUEkgImRpc2Nvbm5lY3QiIHRvIGJ5cGFzcworCSAqIHRoaXMsIGJ1dCBub3QgYWxsIGNvbW1hbmRzL2RyaXZlcyBzdXBwb3J0IHRoYXQuIExldAorCSAqIGlkZV90aW1lcl9leHBpcnkga2VlcCBwb2xsaW5nIHVzIGZvciB0aGVzZS4KKwkgKi8KKwlzd2l0Y2ggKHJxLT5jbWRbMF0pIHsKKwkJY2FzZSBHUENNRF9CTEFOSzoKKwkJY2FzZSBHUENNRF9GT1JNQVRfVU5JVDoKKwkJY2FzZSBHUENNRF9SRVNFUlZFX1JaT05FX1RSQUNLOgorCQljYXNlIEdQQ01EX0NMT1NFX1RSQUNLOgorCQljYXNlIEdQQ01EX0ZMVVNIX0NBQ0hFOgorCQkJd2FpdCA9IEFUQVBJX1dBSVRfUEM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghKHJxLT5mbGFncyAmIFJFUV9RVUlFVCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLWNkOiBjbWQgMHgleCB0aW1lZCBvdXRcbiIsIHJxLT5jbWRbMF0pOworCQkJd2FpdCA9IDA7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHdhaXQ7Cit9CisKKy8qIFNldCB1cCB0aGUgZGV2aWNlIHJlZ2lzdGVycyBmb3IgdHJhbnNmZXJyaW5nIGEgcGFja2V0IGNvbW1hbmQgb24gREVWLAorICAgZXhwZWN0aW5nIHRvIGxhdGVyIHRyYW5zZmVyIFhGRVJMRU4gYnl0ZXMuICBIQU5ETEVSIGlzIHRoZSByb3V0aW5lCisgICB3aGljaCBhY3R1YWxseSB0cmFuc2ZlcnMgdGhlIGNvbW1hbmQgdG8gdGhlIGRyaXZlLiAgSWYgdGhpcyBpcyBhCisgICBkcnFfaW50ZXJydXB0IGRldmljZSwgdGhpcyByb3V0aW5lIHdpbGwgYXJyYW5nZSBmb3IgSEFORExFUiB0byBiZQorICAgY2FsbGVkIHdoZW4gdGhlIGludGVycnVwdCBmcm9tIHRoZSBkcml2ZSBhcnJpdmVzLiAgT3RoZXJ3aXNlLCBIQU5ETEVSCisgICB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZHJpdmUgaXMgcHJlcGFyZWQgZm9yIHRoZSB0cmFuc2Zlci4gKi8KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqZHJpdmUsCisJCQkJCQkgIGludCB4ZmVybGVuLAorCQkJCQkJICBpZGVfaGFuZGxlcl90ICpoYW5kbGVyKQoreworCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3A7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCisJLyogV2FpdCBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gYmUgaWRsZS4gKi8KKwlpZiAoaWRlX3dhaXRfc3RhdCgmc3RhcnRzdG9wLCBkcml2ZSwgMCwgQlVTWV9TVEFULCBXQUlUX1JFQURZKSkKKwkJcmV0dXJuIHN0YXJ0c3RvcDsKKworCWlmIChpbmZvLT5kbWEpCisJCWluZm8tPmRtYSA9ICFod2lmLT5kbWFfc2V0dXAoZHJpdmUpOworCisJLyogU2V0IHVwIHRoZSBjb250cm9sbGVyIHJlZ2lzdGVycy4gKi8KKwkvKiBGSVhNRTogZm9yIFZpcnR1YWwgRE1BIHdlIG11c3QgY2hlY2sgaGFyZGVyICovCisJSFdJRihkcml2ZSktPk9VVEIoaW5mby0+ZG1hLCBJREVfRkVBVFVSRV9SRUcpOworCUhXSUYoZHJpdmUpLT5PVVRCKDAsIElERV9JUkVBU09OX1JFRyk7CisJSFdJRihkcml2ZSktPk9VVEIoMCwgSURFX1NFQ1RPUl9SRUcpOworCisJSFdJRihkcml2ZSktPk9VVEIoeGZlcmxlbiAmIDB4ZmYsIElERV9CQ09VTlRMX1JFRyk7CisJSFdJRihkcml2ZSktPk9VVEIoeGZlcmxlbiA+PiA4ICAsIElERV9CQ09VTlRIX1JFRyk7CisJaWYgKElERV9DT05UUk9MX1JFRykKKwkJSFdJRihkcml2ZSktPk9VVEIoZHJpdmUtPmN0bCwgSURFX0NPTlRST0xfUkVHKTsKKyAKKwlpZiAoQ0RST01fQ09ORklHX0ZMQUdTIChkcml2ZSktPmRycV9pbnRlcnJ1cHQpIHsKKwkJLyogcGFja2V0IGNvbW1hbmQgKi8KKwkJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgV0lOX1BBQ0tFVENNRCwgaGFuZGxlciwgQVRBUElfV0FJVF9QQywgY2Ryb21fdGltZXJfZXhwaXJ5KTsKKwkJcmV0dXJuIGlkZV9zdGFydGVkOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogcGFja2V0IGNvbW1hbmQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCBXSU5fUEFDS0VUQ01ELCBJREVfQ09NTUFORF9SRUcpOworCQluZGVsYXkoNDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKCpoYW5kbGVyKSAoZHJpdmUpOworCX0KK30KKworLyogU2VuZCBhIHBhY2tldCBjb21tYW5kIHRvIERSSVZFIGRlc2NyaWJlZCBieSBDTURfQlVGIGFuZCBDTURfTEVOLgorICAgVGhlIGRldmljZSByZWdpc3RlcnMgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBwcmVwYXJlZAorICAgYnkgY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQuCisgICBIQU5ETEVSIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzCisgICBvciB0aGVyZSdzIGRhdGEgcmVhZHkuICovCisvKgorICogY2hhbmdlZCA1IHBhcmFtZXRlcnMgdG8gMyBmb3IgZHZkLXJhbQorICogc3RydWN0IHBhY2tldF9jb21tYW5kICpwYzsgbm93IHBhY2tldF9jb21tYW5kX3QgKnBjOworICovCisjZGVmaW5lIEFUQVBJX01JTl9DREJfQllURVMgMTIKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQgKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkJCSAgaWRlX2hhbmRsZXJfdCAqaGFuZGxlcikKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaW50IGNtZF9sZW47CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKworCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kcnFfaW50ZXJydXB0KSB7CisJCS8qIEhlcmUgd2Ugc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIGFuIGludGVycnVwdAorCQkgICBmcm9tIHRoZSBkZXZpY2UuICBEUlEgc2hvdWxkIGhvdyBiZSBzZXQuICovCisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIERSUV9TVEFULCBOVUxMKSkKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2UsIHdlIG11c3Qgd2FpdCBmb3IgRFJRIHRvIGdldCBzZXQuICovCisJCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBEUlFfU1RBVCwKKwkJCQlCVVNZX1NUQVQsIFdBSVRfUkVBRFkpKQorCQkJcmV0dXJuIHN0YXJ0c3RvcDsKKwl9CisKKwkvKiBBcm0gdGhlIGludGVycnVwdCBoYW5kbGVyLiAqLworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgcnEtPnRpbWVvdXQsIGNkcm9tX3RpbWVyX2V4cGlyeSk7CisKKwkvKiBBVEFQSSBjb21tYW5kcyBnZXQgcGFkZGVkIG91dCB0byAxMiBieXRlcyBtaW5pbXVtICovCisJY21kX2xlbiA9IENPTU1BTkRfU0laRShycS0+Y21kWzBdKTsKKwlpZiAoY21kX2xlbiA8IEFUQVBJX01JTl9DREJfQllURVMpCisJCWNtZF9sZW4gPSBBVEFQSV9NSU5fQ0RCX0JZVEVTOworCisJLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLiAqLworCUhXSUYoZHJpdmUpLT5hdGFwaV9vdXRwdXRfYnl0ZXMoZHJpdmUsIHJxLT5jbWQsIGNtZF9sZW4pOworCisJLyogU3RhcnQgdGhlIERNQSBpZiBuZWVkIGJlICovCisJaWYgKGluZm8tPmRtYSkKKwkJaHdpZi0+ZG1hX3N0YXJ0KGRyaXZlKTsKKworCXJldHVybiBpZGVfc3RhcnRlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJsb2NrIHJlYWQgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBCdWZmZXIgdXAgdG8gU0VDVE9SU19UT19UUkFOU0ZFUiBzZWN0b3JzIGZyb20gdGhlIGRyaXZlIGluIG91ciBzZWN0b3IKKyAqIGJ1ZmZlci4gIE9uY2UgdGhlIGZpcnN0IHNlY3RvciBpcyBhZGRlZCwgYW55IHN1YnNlcXVlbnQgc2VjdG9ycyBhcmUKKyAqIGFzc3VtZWQgdG8gYmUgY29udGludW91cyAodW50aWwgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkKS4gIEZvciB0aGUgZmlyc3QKKyAqIHNlY3RvciBhZGRlZCwgU0VDVE9SIGlzIGl0cyBzZWN0b3IgbnVtYmVyLiAgKFNFQ1RPUiBpcyB0aGVuIGlnbm9yZWQgdW50aWwKKyAqIHRoZSBidWZmZXIgaXMgY2xlYXJlZC4pCisgKi8KK3N0YXRpYyB2b2lkIGNkcm9tX2J1ZmZlcl9zZWN0b3JzIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgc2VjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN0b3JzX3RvX3RyYW5zZmVyKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJLyogTnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZCBpbnRvIHRoZSBidWZmZXIuICovCisJaW50IHNlY3RvcnNfdG9fYnVmZmVyID0gbWluX3QoaW50LCBzZWN0b3JzX3RvX3RyYW5zZmVyLAorCQkJCSAgICAgKFNFQ1RPUl9CVUZGRVJfU0laRSA+PiBTRUNUT1JfQklUUykgLQorCQkJCSAgICAgICBpbmZvLT5uc2VjdG9yc19idWZmZXJlZCk7CisKKwljaGFyICpkZXN0OworCisJLyogSWYgd2UgY291bGRuJ3QgZ2V0IGEgYnVmZmVyLCBkb24ndCB0cnkgdG8gYnVmZmVyIGFueXRoaW5nLi4uICovCisJaWYgKGluZm8tPmJ1ZmZlciA9PSBOVUxMKQorCQlzZWN0b3JzX3RvX2J1ZmZlciA9IDA7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzZWN0b3IgaW4gdGhlIGJ1ZmZlciwgcmVtZW1iZXIgaXRzIG51bWJlci4gKi8KKwlpZiAoaW5mby0+bnNlY3RvcnNfYnVmZmVyZWQgPT0gMCkKKwkJaW5mby0+c2VjdG9yX2J1ZmZlcmVkID0gc2VjdG9yOworCisJLyogUmVhZCB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIuICovCisJZGVzdCA9IGluZm8tPmJ1ZmZlciArIGluZm8tPm5zZWN0b3JzX2J1ZmZlcmVkICogU0VDVE9SX1NJWkU7CisJd2hpbGUgKHNlY3RvcnNfdG9fYnVmZmVyID4gMCkgeworCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIGRlc3QsIFNFQ1RPUl9TSVpFKTsKKwkJLS1zZWN0b3JzX3RvX2J1ZmZlcjsKKwkJLS1zZWN0b3JzX3RvX3RyYW5zZmVyOworCQkrK2luZm8tPm5zZWN0b3JzX2J1ZmZlcmVkOworCQlkZXN0ICs9IFNFQ1RPUl9TSVpFOworCX0KKworCS8qIFRocm93IGF3YXkgYW55IHJlbWFpbmluZyBkYXRhLiAqLworCXdoaWxlIChzZWN0b3JzX3RvX3RyYW5zZmVyID4gMCkgeworCQlzdGF0aWMgY2hhciBkdW1bU0VDVE9SX1NJWkVdOworCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIGR1bSwgc2l6ZW9mIChkdW0pKTsKKwkJLS1zZWN0b3JzX3RvX3RyYW5zZmVyOworCX0KK30KKworLyoKKyAqIENoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgaW50ZXJydXB0IHJlYXNvbiByZWdpc3RlciBmcm9tIHRoZSBjZHJvbQorICogYW5kIGF0dGVtcHQgdG8gcmVjb3ZlciBpZiB0aGVyZSBhcmUgcHJvYmxlbXMuICBSZXR1cm5zICAwIGlmIGV2ZXJ5dGhpbmcncworICogb2s7IG5vbnplcm8gaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4gdGVybWluYXRlZC4KKyAqLworc3RhdGljIGlubGluZQoraW50IGNkcm9tX3JlYWRfY2hlY2tfaXJlYXNvbiAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbGVuLCBpbnQgaXJlYXNvbikKK3sKKwlpZiAoaXJlYXNvbiA9PSAyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChpcmVhc29uID09IDApIHsKKwkJLyogV2hvb3BzLi4uIFRoZSBkcml2ZSBpcyBleHBlY3RpbmcgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdXMhICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlYWRfaW50cjogRHJpdmUgd2FudHMgdG8gdHJhbnNmZXIgZGF0YSB0aGUgIgorCQkJCQkJIndyb25nIHdheSFcbiIsIGRyaXZlLT5uYW1lKTsKKworCQkvKiBUaHJvdyBzb21lIGRhdGEgYXQgdGhlIGRyaXZlIHNvIGl0IGRvZXNuJ3QgaGFuZworCQkgICBhbmQgcXVpdCB0aGlzIHJlcXVlc3QuICovCisJCXdoaWxlIChsZW4gPiAwKSB7CisJCQlpbnQgZHVtID0gMDsKKwkJCUhXSUYoZHJpdmUpLT5hdGFwaV9vdXRwdXRfYnl0ZXMoZHJpdmUsICZkdW0sIHNpemVvZiAoZHVtKSk7CisJCQlsZW4gLT0gc2l6ZW9mIChkdW0pOworCQl9CisJfSBlbHNlICBpZiAoaXJlYXNvbiA9PSAxKSB7CisJCS8qIFNvbWUgZHJpdmVzIChBU1VTKSBzZWVtIHRvIHRlbGwgdXMgdGhhdCBzdGF0dXMKKwkJICogaW5mbyBpcyBhdmFpbGFibGUuIGp1c3QgZ2V0IGl0IGFuZCBpZ25vcmUuCisJCSAqLworCQkodm9pZCkgSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIERyaXZlIHdhbnRzIGEgY29tbWFuZCBwYWNrZXQsIG9yIGludmFsaWQgaXJlYXNvbi4uLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkX2ludHI6IGJhZCBpbnRlcnJ1cHQgcmVhc29uICV4XG4iLCBkcml2ZS0+bmFtZSwKKwkJCQkJCQkJaXJlYXNvbik7CisJfQorCisJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIEludGVycnVwdCByb3V0aW5lLiAgQ2FsbGVkIHdoZW4gYSByZWFkIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9yZWFkX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpbnQgc3RhdDsKKwlpbnQgaXJlYXNvbiwgbGVuLCBzZWN0b3JzX3RvX3RyYW5zZmVyLCBuc2tpcDsKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwl1OCBsb3djeWwgPSAwLCBoaWdoY3lsID0gMDsKKwlpbnQgZG1hID0gaW5mby0+ZG1hLCBkbWFfZXJyb3IgPSAwOworCisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCisJLyoKKwkgKiBoYW5kbGUgZG1hIGNhc2UKKwkgKi8KKwlpZiAoZG1hKSB7CisJCWluZm8tPmRtYSA9IDA7CisJCWlmICgoZG1hX2Vycm9yID0gSFdJRihkcml2ZSktPmlkZV9kbWFfZW5kKGRyaXZlKSkpCisJCQlfX2lkZV9kbWFfb2ZmKGRyaXZlKTsKKwl9CisKKwlpZiAoY2Ryb21fZGVjb2RlX3N0YXR1cyhkcml2ZSwgMCwgJnN0YXQpKQorCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisKKwlpZiAoZG1hKSB7CisJCWlmICghZG1hX2Vycm9yKSB7CisJCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHJxLT5ucl9zZWN0b3JzKTsKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gaWRlX2Vycm9yKGRyaXZlLCAiZG1hIGVycm9yIiwgc3RhdCk7CisJfQorCisJLyogUmVhZCB0aGUgaW50ZXJydXB0IHJlYXNvbiBhbmQgdGhlIHRyYW5zZmVyIGxlbmd0aC4gKi8KKwlpcmVhc29uID0gSFdJRihkcml2ZSktPklOQihJREVfSVJFQVNPTl9SRUcpICYgMHgzOworCWxvd2N5bCAgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9CQ09VTlRMX1JFRyk7CisJaGlnaGN5bCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0JDT1VOVEhfUkVHKTsKKworCWxlbiA9IGxvd2N5bCArICgyNTYgKiBoaWdoY3lsKTsKKworCS8qIElmIERSUSBpcyBjbGVhciwgdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4gKi8KKwlpZiAoKHN0YXQgJiBEUlFfU1RBVCkgPT0gMCkgeworCQkvKiBJZiB3ZSdyZSBub3QgZG9uZSBmaWxsaW5nIHRoZSBjdXJyZW50IGJ1ZmZlciwgY29tcGxhaW4uCisJCSAgIE90aGVyd2lzZSwgY29tcGxldGUgdGhlIGNvbW1hbmQgbm9ybWFsbHkuICovCisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID4gMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IGNkcm9tX3JlYWRfaW50cjogZGF0YSB1bmRlcnJ1biAoJWQgYmxvY2tzKVxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJCQlycS0+ZmxhZ3MgfD0gUkVRX0ZBSUxFRDsKKwkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwkJfSBlbHNlCisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSBkcml2ZSBpcyBleHBlY3RpbmcgdG8gZG8gdGhlIHNhbWUgdGhpbmcgd2UgYXJlLiAqLworCWlmIChjZHJvbV9yZWFkX2NoZWNrX2lyZWFzb24gKGRyaXZlLCBsZW4sIGlyZWFzb24pKQorCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgZHJpdmUgd2lsbCBhbHdheXMgcHJvdmlkZSBkYXRhIGluIG11bHRpcGxlcworCSAgIG9mIGF0IGxlYXN0IFNFQ1RPUl9TSVpFLCBhcyBpdCBnZXRzIGhhaXJ5IHRvIGtlZXAgdHJhY2sKKwkgICBvZiB0aGUgdHJhbnNmZXJzIG90aGVyd2lzZS4gKi8KKwlpZiAoKGxlbiAlIFNFQ1RPUl9TSVpFKSAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBjZHJvbV9yZWFkX2ludHI6IEJhZCB0cmFuc2ZlciBzaXplICVkXG4iLAorCQkJZHJpdmUtPm5hbWUsIGxlbik7CisJCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5saW1pdF9uZnJhbWVzKQorCQkJcHJpbnRrIChLRVJOX0VSUiAiICBUaGlzIGRyaXZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXJcbiIpOworCQllbHNlIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIiAgVHJ5aW5nIHRvIGxpbWl0IHRyYW5zZmVyIHNpemVzXG4iKTsKKwkJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmxpbWl0X25mcmFtZXMgPSAxOworCQl9CisJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCS8qIFRoZSBudW1iZXIgb2Ygc2VjdG9ycyB3ZSBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgZHJpdmUuICovCisJc2VjdG9yc190b190cmFuc2ZlciA9IGxlbiAvIFNFQ1RPUl9TSVpFOworCisJLyogRmlyc3QsIGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byBiaXQtYnVja2V0CisJICAgYW55IG9mIHRoZSBsZWFkaW5nIHNlY3RvcnMuICovCisJbnNraXAgPSBtaW5fdChpbnQsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMgLSBiaW9fY3VyX3NlY3RvcnMocnEtPmJpbyksIHNlY3RvcnNfdG9fdHJhbnNmZXIpOworCisJd2hpbGUgKG5za2lwID4gMCkgeworCQkvKiBXZSBuZWVkIHRvIHRocm93IGF3YXkgYSBzZWN0b3IuICovCisJCXN0YXRpYyBjaGFyIGR1bVtTRUNUT1JfU0laRV07CisJCUhXSUYoZHJpdmUpLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgZHVtLCBzaXplb2YgKGR1bSkpOworCisJCS0tcnEtPmN1cnJlbnRfbnJfc2VjdG9yczsKKwkJLS1uc2tpcDsKKwkJLS1zZWN0b3JzX3RvX3RyYW5zZmVyOworCX0KKworCS8qIE5vdyBsb29wIHdoaWxlIHdlIHN0aWxsIGhhdmUgZGF0YSB0byByZWFkIGZyb20gdGhlIGRyaXZlLiAqLworCXdoaWxlIChzZWN0b3JzX3RvX3RyYW5zZmVyID4gMCkgeworCQlpbnQgdGhpc190cmFuc2ZlcjsKKworCQkvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIHByZXNlbnQgYnVmZmVyIGJ1dCB0aGVyZSdzIGFub3RoZXIKKwkJICAgY2hhaW5lZCBidWZmZXIgYWZ0ZXIgaXQsIG1vdmUgb24uICovCisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID09IDAgJiYgcnEtPm5yX3NlY3RvcnMpCisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CisKKwkJLyogSWYgdGhlIGJ1ZmZlcnMgYXJlIGZ1bGwsIGNhY2hlIHRoZSByZXN0IG9mIHRoZSBkYXRhIGluIG91cgorCQkgICBpbnRlcm5hbCBidWZmZXIuICovCisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID09IDApIHsKKwkJCWNkcm9tX2J1ZmZlcl9zZWN0b3JzKGRyaXZlLCBycS0+c2VjdG9yLCBzZWN0b3JzX3RvX3RyYW5zZmVyKTsKKwkJCXNlY3RvcnNfdG9fdHJhbnNmZXIgPSAwOworCQl9IGVsc2UgeworCQkJLyogVHJhbnNmZXIgZGF0YSB0byB0aGUgYnVmZmVycy4KKwkJCSAgIEZpZ3VyZSBvdXQgaG93IG1hbnkgc2VjdG9ycyB3ZSBjYW4gdHJhbnNmZXIKKwkJCSAgIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4gKi8KKwkJCXRoaXNfdHJhbnNmZXIgPSBtaW5fdChpbnQsIHNlY3RvcnNfdG9fdHJhbnNmZXIsCisJCQkJCSAgICAgcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisKKwkJCS8qIFJlYWQgdGhpc190cmFuc2ZlciBzZWN0b3JzCisJCQkgICBpbnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4gKi8KKwkJCXdoaWxlICh0aGlzX3RyYW5zZmVyID4gMCkgeworCQkJCUhXSUYoZHJpdmUpLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgcnEtPmJ1ZmZlciwgU0VDVE9SX1NJWkUpOworCQkJCXJxLT5idWZmZXIgKz0gU0VDVE9SX1NJWkU7CisJCQkJLS1ycS0+bnJfc2VjdG9yczsKKwkJCQktLXJxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCQkJKytycS0+c2VjdG9yOworCQkJCS0tdGhpc190cmFuc2ZlcjsKKwkJCQktLXNlY3RvcnNfdG9fdHJhbnNmZXI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEb25lIG1vdmluZyBkYXRhISAgV2FpdCBmb3IgYW5vdGhlciBpbnRlcnJ1cHQuICovCisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmY2Ryb21fcmVhZF9pbnRyLCBBVEFQSV9XQUlUX1BDLCBOVUxMKTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKKy8qCisgKiBUcnkgdG8gc2F0aXNmeSBzb21lIG9mIHRoZSBjdXJyZW50IHJlYWQgcmVxdWVzdCBmcm9tIG91ciBjYWNoZWQgZGF0YS4KKyAqIFJldHVybnMgbm9uemVybyBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGNkcm9tX3JlYWRfZnJvbV9idWZmZXIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yc19wZXJfZnJhbWU7CisKKwlzZWN0b3JzX3Blcl9mcmFtZSA9IHF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUzsKKworCS8qIENhbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlJ3Mgbm8gYnVmZmVyLiAqLworCWlmIChpbmZvLT5idWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKwkvKiBMb29wIHdoaWxlIHRoaXMgcmVxdWVzdCBuZWVkcyBkYXRhIGFuZCB0aGUgbmV4dCBibG9jayBpcyBwcmVzZW50CisJICAgaW4gb3VyIGNhY2hlLiAqLworCXdoaWxlIChycS0+bnJfc2VjdG9ycyA+IDAgJiYKKwkgICAgICAgcnEtPnNlY3RvciA+PSBpbmZvLT5zZWN0b3JfYnVmZmVyZWQgJiYKKwkgICAgICAgcnEtPnNlY3RvciA8IGluZm8tPnNlY3Rvcl9idWZmZXJlZCArIGluZm8tPm5zZWN0b3JzX2J1ZmZlcmVkKSB7CisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID09IDApCisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CisKKwkJbWVtY3B5IChycS0+YnVmZmVyLAorCQkJaW5mby0+YnVmZmVyICsKKwkJCShycS0+c2VjdG9yIC0gaW5mby0+c2VjdG9yX2J1ZmZlcmVkKSAqIFNFQ1RPUl9TSVpFLAorCQkJU0VDVE9SX1NJWkUpOworCQlycS0+YnVmZmVyICs9IFNFQ1RPUl9TSVpFOworCQktLXJxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCS0tcnEtPm5yX3NlY3RvcnM7CisJCSsrcnEtPnNlY3RvcjsKKwl9CisKKwkvKiBJZiB3ZSd2ZSBzYXRpc2ZpZWQgdGhlIGN1cnJlbnQgcmVxdWVzdCwKKwkgICB0ZXJtaW5hdGUgaXQgc3VjY2Vzc2Z1bGx5LiAqLworCWlmIChycS0+bnJfc2VjdG9ycyA9PSAwKSB7CisJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE1vdmUgb24gdG8gdGhlIG5leHQgYnVmZmVyIGlmIG5lZWRlZC4gKi8KKwlpZiAocnEtPmN1cnJlbnRfbnJfc2VjdG9ycyA9PSAwKQorCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CisKKwkvKiBJZiB0aGlzIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLCB0aGVuIHRoZSBrbHVnZSBpIHVzZSB0bworCSAgIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YgYSB0cmFuc2ZlcgorCSAgIHdpbGwgZmFpbC4gIEkgdGhpbmsgdGhhdCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuLCBidXQgbGV0J3MgYmUKKwkgICBwYXJhbm9pZCBhbmQgY2hlY2suICovCisJaWYgKHJxLT5jdXJyZW50X25yX3NlY3RvcnMgPCBiaW9fY3VyX3NlY3RvcnMocnEtPmJpbykgJiYKKwkgICAgKHJxLT5zZWN0b3IgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Ryb21fcmVhZF9mcm9tX2J1ZmZlcjogYnVmZmVyIGJvdGNoICglbGQpXG4iLAorCQkJZHJpdmUtPm5hbWUsIChsb25nKXJxLT5zZWN0b3IpOworCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJvdXRpbmUgdG8gc2VuZCBhIHJlYWQgcGFja2V0IGNvbW1hbmQgdG8gdGhlIGRyaXZlLgorICogVGhpcyBpcyB1c3VhbGx5IGNhbGxlZCBkaXJlY3RseSBmcm9tIGNkcm9tX3N0YXJ0X3JlYWQuCisgKiBIb3dldmVyLCBmb3IgZHJxX2ludGVycnVwdCBkZXZpY2VzLCBpdCBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQKKyAqIHdoZW4gdGhlIGRyaXZlIGlzIHJlYWR5IHRvIGFjY2VwdCB0aGUgY29tbWFuZC4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF9yZWFkX2NvbnRpbnVhdGlvbiAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl1bnNpZ25lZCBzaG9ydCBzZWN0b3JzX3Blcl9mcmFtZTsKKwlpbnQgbnNraXA7CisKKwlzZWN0b3JzX3Blcl9mcmFtZSA9IHF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUzsKKworCS8qIElmIHRoZSByZXF1ZXN0ZWQgc2VjdG9yIGRvZXNuJ3Qgc3RhcnQgb24gYSBjZHJvbSBibG9jayBib3VuZGFyeSwKKwkgICB3ZSBtdXN0IGFkanVzdCB0aGUgc3RhcnQgb2YgdGhlIHRyYW5zZmVyIHNvIHRoYXQgaXQgZG9lcywKKwkgICBhbmQgcmVtZW1iZXIgdG8gc2tpcCB0aGUgZmlyc3QgZmV3IHNlY3RvcnMuCisJICAgSWYgdGhlIENVUlJFTlRfTlJfU0VDVE9SUyBmaWVsZCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZQorCSAgIG9mIHRoZSBidWZmZXIsIGl0IHdpbGwgbWVhbiB0aGF0IHdlJ3JlIHRvIHNraXAgYSBudW1iZXIKKwkgICBvZiBzZWN0b3JzIGVxdWFsIHRvIHRoZSBhbW91bnQgYnkgd2hpY2ggQ1VSUkVOVF9OUl9TRUNUT1JTCisJICAgaXMgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplLiAqLworCW5za2lwID0gcnEtPnNlY3RvciAmIChzZWN0b3JzX3Blcl9mcmFtZSAtIDEpOworCWlmIChuc2tpcCA+IDApIHsKKwkJLyogU2FuaXR5IGNoZWNrLi4uICovCisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzICE9IGJpb19jdXJfc2VjdG9ycyhycS0+YmlvKSAmJgorCQkJKHJxLT5zZWN0b3IgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNkcm9tX3N0YXJ0X3JlYWRfY29udGludWF0aW9uOiBidWZmZXIgYm90Y2ggKCV1KVxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJCX0KKwkJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyArPSBuc2tpcDsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGNvbW1hbmQgKi8KKwlycS0+dGltZW91dCA9IEFUQVBJX1dBSVRfUEM7CisKKwkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkcml2ZSBhbmQgcmV0dXJuLiAqLworCXJldHVybiBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChkcml2ZSwgcnEsICZjZHJvbV9yZWFkX2ludHIpOworfQorCisKKyNkZWZpbmUgSURFQ0RfU0VFS19USFJFU0hPTEQJKDEwMDApCQkJLyogMTAwMCBibG9ja3MgKi8KKyNkZWZpbmUgSURFQ0RfU0VFS19USU1FUgkoNSAqIFdBSVRfTUlOX1NMRUVQKQkvKiAxMDAgbXMgKi8KKyNkZWZpbmUgSURFQ0RfU0VFS19USU1FT1VUCSgyICogV0FJVF9DTUQpCQkvKiAyMCBzZWMgKi8KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zZWVrX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpbnQgc3RhdDsKKwlzdGF0aWMgaW50IHJldHJ5ID0gMTA7CisKKwlpZiAoY2Ryb21fZGVjb2RlX3N0YXR1cyhkcml2ZSwgMCwgJnN0YXQpKQorCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+c2Vla2luZyA9IDE7CisKKwlpZiAocmV0cnkgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBpbmZvLT5zdGFydF9zZWVrICsgSURFQ0RfU0VFS19USU1FUikpIHsKKwkJaWYgKC0tcmV0cnkgPT0gMCkgeworCQkJLyoKKwkJCSAqIHRoaXMgY29uZGl0aW9uIGlzIGZhciB0b28gY29tbW9uLCB0byBib3RoZXIKKwkJCSAqIHVzZXJzIGFib3V0IGl0CisJCQkgKi8KKwkJCS8qIHByaW50aygiJXM6IGRpc2FibGVkIERTQyBzZWVrIG92ZXJsYXBcbiIsIGRyaXZlLT5uYW1lKTsqLyAKKwkJCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3N0YXJ0X3NlZWtfY29udGludWF0aW9uIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXNlY3Rvcl90IGZyYW1lID0gcnEtPnNlY3RvcjsKKworCXNlY3Rvcl9kaXYoZnJhbWUsIHF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUyk7CisKKwltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKKwlycS0+Y21kWzBdID0gR1BDTURfU0VFSzsKKwlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGZyYW1lKSwgKHVuc2lnbmVkIGludCAqKSAmcnEtPmNtZFsyXSk7CisKKwlycS0+dGltZW91dCA9IEFUQVBJX1dBSVRfUEM7CisJcmV0dXJuIGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGRyaXZlLCBycSwgJmNkcm9tX3NlZWtfaW50cik7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fc3RhcnRfc2VlayAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgYmxvY2spCit7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKwlpbmZvLT5kbWEgPSAwOworCWluZm8tPmNtZCA9IDA7CisJaW5mby0+c3RhcnRfc2VlayA9IGppZmZpZXM7CisJcmV0dXJuIGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGRyaXZlLCAwLCBjZHJvbV9zdGFydF9zZWVrX2NvbnRpbnVhdGlvbik7Cit9CisKKy8qIEZpeCB1cCBhIHBvc3NpYmx5IHBhcnRpYWxseS1wcm9jZXNzZWQgcmVxdWVzdCBzbyB0aGF0IHdlIGNhbgorICAgc3RhcnQgaXQgb3ZlciBlbnRpcmVseSwgb3IgZXZlbiBwdXQgaXQgYmFjayBvbiB0aGUgcmVxdWVzdCBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfcmVxdWVzdCAoc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlmIChycS0+YnVmZmVyICE9IGJpb19kYXRhKHJxLT5iaW8pKSB7CisJCXNlY3Rvcl90IG4gPSAocnEtPmJ1ZmZlciAtIChjaGFyICopIGJpb19kYXRhKHJxLT5iaW8pKSAvIFNFQ1RPUl9TSVpFOworCisJCXJxLT5idWZmZXIgPSBiaW9fZGF0YShycS0+YmlvKTsKKwkJcnEtPm5yX3NlY3RvcnMgKz0gbjsKKwkJcnEtPnNlY3RvciAtPSBuOworCX0KKwlycS0+aGFyZF9jdXJfc2VjdG9ycyA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBiaW9fY3VyX3NlY3RvcnMocnEtPmJpbyk7CisJcnEtPmhhcmRfbnJfc2VjdG9ycyA9IHJxLT5ucl9zZWN0b3JzOworCXJxLT5oYXJkX3NlY3RvciA9IHJxLT5zZWN0b3I7CisJcnEtPnEtPnByZXBfcnFfZm4ocnEtPnEsIHJxKTsKK30KKworLyoKKyAqIFN0YXJ0IGEgcmVhZCByZXF1ZXN0IGZyb20gdGhlIENELVJPTS4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF9yZWFkIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yc19wZXJfZnJhbWU7CisKKwlzZWN0b3JzX3Blcl9mcmFtZSA9IHF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUzsKKworCS8qIFdlIG1heSBiZSByZXRyeWluZyB0aGlzIHJlcXVlc3QgYWZ0ZXIgYW4gZXJyb3IuICBGaXggdXAKKwkgICBhbnkgd2VpcmRuZXNzIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIHJlcXVlc3QgcGFja2V0LiAqLworCXJlc3RvcmVfcmVxdWVzdChycSk7CisKKwkvKiBTYXRpc2Z5IHdoYXRldmVyIHdlIGNhbiBvZiB0aGlzIHJlcXVlc3QgZnJvbSBvdXIgY2FjaGVkIHNlY3Rvci4gKi8KKwlpZiAoY2Ryb21fcmVhZF9mcm9tX2J1ZmZlcihkcml2ZSkpCisJCXJldHVybiBpZGVfc3RvcHBlZDsKKworCWJsa19hdHRlbXB0X3JlbWVyZ2UoZHJpdmUtPnF1ZXVlLCBycSk7CisKKwkvKiBDbGVhciB0aGUgbG9jYWwgc2VjdG9yIGJ1ZmZlci4gKi8KKwlpbmZvLT5uc2VjdG9yc19idWZmZXJlZCA9IDA7CisKKwkvKiB1c2UgZG1hLCBpZiBwb3NzaWJsZS4gKi8KKwlpbmZvLT5kbWEgPSBkcml2ZS0+dXNpbmdfZG1hOworCWlmICgocnEtPnNlY3RvciAmIChzZWN0b3JzX3Blcl9mcmFtZSAtIDEpKSB8fAorCSAgICAocnEtPm5yX3NlY3RvcnMgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkpCisJCWluZm8tPmRtYSA9IDA7CisKKwlpbmZvLT5jbWQgPSBSRUFEOworCisJLyogU3RhcnQgc2VuZGluZyB0aGUgcmVhZCByZXF1ZXN0IHRvIHRoZSBkcml2ZS4gKi8KKwlyZXR1cm4gY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQoZHJpdmUsIDMyNzY4LCBjZHJvbV9zdGFydF9yZWFkX2NvbnRpbnVhdGlvbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeGVjdXRlIGFsbCBvdGhlciBwYWNrZXQgY29tbWFuZHMuCisgKi8KKworLyogSW50ZXJydXB0IHJvdXRpbmUgZm9yIHBhY2tldCBjb21tYW5kIGNvbXBsZXRpb24uICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3BjX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpbnQgaXJlYXNvbiwgbGVuLCB0aGlzbGVuOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl1OCBsb3djeWwgPSAwLCBoaWdoY3lsID0gMDsKKwlpbnQgc3RhdDsKKworCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIDAsICZzdGF0KSkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJLyogUmVhZCB0aGUgaW50ZXJydXB0IHJlYXNvbiBhbmQgdGhlIHRyYW5zZmVyIGxlbmd0aC4gKi8KKwlpcmVhc29uID0gSFdJRihkcml2ZSktPklOQihJREVfSVJFQVNPTl9SRUcpOworCWxvd2N5bCAgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9CQ09VTlRMX1JFRyk7CisJaGlnaGN5bCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0JDT1VOVEhfUkVHKTsKKworCWxlbiA9IGxvd2N5bCArICgyNTYgKiBoaWdoY3lsKTsKKworCS8qIElmIERSUSBpcyBjbGVhciwgdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgICBDb21wbGFpbiBpZiB3ZSBzdGlsbCBoYXZlIGRhdGEgbGVmdCB0byB0cmFuc2Zlci4gKi8KKwlpZiAoKHN0YXQgJiBEUlFfU1RBVCkgPT0gMCkgeworCQkvKiBTb21lIG9mIHRoZSB0cmFpbGluZyByZXF1ZXN0IHNlbnNlIGZpZWxkcyBhcmUgb3B0aW9uYWwsIGFuZAorCQkgICBzb21lIGRyaXZlcyBkb24ndCBzZW5kIHRoZW0uICBTaWdoLiAqLworCQlpZiAocnEtPmNtZFswXSA9PSBHUENNRF9SRVFVRVNUX1NFTlNFICYmCisJCSAgICBycS0+ZGF0YV9sZW4gPiAwICYmCisJCSAgICBycS0+ZGF0YV9sZW4gPD0gNSkgeworCQkJd2hpbGUgKHJxLT5kYXRhX2xlbiA+IDApIHsKKwkJCQkqKHVuc2lnbmVkIGNoYXIgKilycS0+ZGF0YSsrID0gMDsKKwkJCQktLXJxLT5kYXRhX2xlbjsKKwkJCX0KKwkJfQorCisJCWlmIChycS0+ZGF0YV9sZW4gPT0gMCkKKwkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAxKTsKKwkJZWxzZSB7CisJCQkvKiBDb21tZW50IHRoaXMgb3V0LCBiZWNhdXNlIHRoaXMgYWx3YXlzIGhhcHBlbnMgCisJCQkgICByaWdodCBhZnRlciBhIHJlc2V0IG9jY3VycywgYW5kIGl0IGlzIGFubm95aW5nIHRvIAorCQkJICAgYWx3YXlzIHByaW50IGV4cGVjdGVkIHN0dWZmLiAgKi8KKwkJCS8qCisJCQlwcmludGsgKCIlczogY2Ryb21fcGNfaW50cjogZGF0YSB1bmRlcnJ1biAlZFxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgcGMtPmJ1Zmxlbik7CisJCQkqLworCQkJcnEtPmZsYWdzIHw9IFJFUV9GQUlMRUQ7CisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJCX0KKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggZGF0YSB0byB0cmFuc2Zlci4gKi8KKwl0aGlzbGVuID0gcnEtPmRhdGFfbGVuOworCWlmICh0aGlzbGVuID4gbGVuKSB0aGlzbGVuID0gbGVuOworCisJLyogVGhlIGRyaXZlIHdhbnRzIHRvIGJlIHdyaXR0ZW4gdG8uICovCisJaWYgKChpcmVhc29uICYgMykgPT0gMCkgeworCQlpZiAoIXJxLT5kYXRhKSB7CisJCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImNkcm9tX3BjX2ludHIsIHdyaXRlIik7CisJCQlnb3RvIGNvbmZ1c2VkOworCQl9CisJCS8qIFRyYW5zZmVyIHRoZSBkYXRhLiAqLworCQlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBycS0+ZGF0YSwgdGhpc2xlbik7CisKKwkJLyogSWYgd2UgaGF2ZW4ndCBtb3ZlZCBlbm91Z2ggZGF0YSB0byBzYXRpc2Z5IHRoZSBkcml2ZSwKKwkJICAgYWRkIHNvbWUgcGFkZGluZy4gKi8KKwkJd2hpbGUgKGxlbiA+IHRoaXNsZW4pIHsKKwkJCWludCBkdW0gPSAwOworCQkJSFdJRihkcml2ZSktPmF0YXBpX291dHB1dF9ieXRlcyhkcml2ZSwgJmR1bSwgc2l6ZW9mKGR1bSkpOworCQkJbGVuIC09IHNpemVvZihkdW0pOworCQl9CisKKwkJLyogS2VlcCBjb3VudCBvZiBob3cgbXVjaCBkYXRhIHdlJ3ZlIG1vdmVkLiAqLworCQlycS0+ZGF0YSArPSB0aGlzbGVuOworCQlycS0+ZGF0YV9sZW4gLT0gdGhpc2xlbjsKKwl9CisKKwkvKiBTYW1lIGRyaWxsIGZvciByZWFkaW5nLiAqLworCWVsc2UgaWYgKChpcmVhc29uICYgMykgPT0gMikgeworCQlpZiAoIXJxLT5kYXRhKSB7CisJCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImNkcm9tX3BjX2ludHIsIHdyaXRlIik7CisJCQlnb3RvIGNvbmZ1c2VkOworCQl9CisJCS8qIFRyYW5zZmVyIHRoZSBkYXRhLiAqLworCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIHJxLT5kYXRhLCB0aGlzbGVuKTsKKworCQkvKiBJZiB3ZSBoYXZlbid0IG1vdmVkIGVub3VnaCBkYXRhIHRvIHNhdGlzZnkgdGhlIGRyaXZlLAorCQkgICBhZGQgc29tZSBwYWRkaW5nLiAqLworCQl3aGlsZSAobGVuID4gdGhpc2xlbikgeworCQkJaW50IGR1bSA9IDA7CisJCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsICZkdW0sIHNpemVvZihkdW0pKTsKKwkJCWxlbiAtPSBzaXplb2YoZHVtKTsKKwkJfQorCisJCS8qIEtlZXAgY291bnQgb2YgaG93IG11Y2ggZGF0YSB3ZSd2ZSBtb3ZlZC4gKi8KKwkJcnEtPmRhdGEgKz0gdGhpc2xlbjsKKwkJcnEtPmRhdGFfbGVuIC09IHRoaXNsZW47CisKKwkJaWYgKHJxLT5mbGFncyAmIFJFUV9TRU5TRSkKKwkJCXJxLT5zZW5zZV9sZW4gKz0gdGhpc2xlbjsKKwl9IGVsc2UgeworY29uZnVzZWQ6CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBjZHJvbV9wY19pbnRyOiBUaGUgZHJpdmUgIgorCQkJImFwcGVhcnMgY29uZnVzZWQgKGlyZWFzb24gPSAweCUwMngpXG4iLAorCQkJZHJpdmUtPm5hbWUsIGlyZWFzb24pOworCQlycS0+ZmxhZ3MgfD0gUkVRX0ZBSUxFRDsKKwl9CisKKwkvKiBOb3cgd2Ugd2FpdCBmb3IgYW5vdGhlciBpbnRlcnJ1cHQuICovCisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmY2Ryb21fcGNfaW50ciwgQVRBUElfV0FJVF9QQywgY2Ryb21fdGltZXJfZXhwaXJ5KTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fZG9fcGNfY29udGludWF0aW9uIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBBVEFQSV9XQUlUX1BDOworCisJLyogU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgZHJpdmUgYW5kIHJldHVybi4gKi8KKwlyZXR1cm4gY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoZHJpdmUsIHJxLCAmY2Ryb21fcGNfaW50cik7Cit9CisKKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9kb19wYWNrZXRfY29tbWFuZCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludCBsZW47CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJaW5mby0+ZG1hID0gMDsKKwlpbmZvLT5jbWQgPSAwOworCXJxLT5mbGFncyAmPSB+UkVRX0ZBSUxFRDsKKwlsZW4gPSBycS0+ZGF0YV9sZW47CisKKwkvKiBTdGFydCBzZW5kaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBkcml2ZS4gKi8KKwlyZXR1cm4gY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQoZHJpdmUsIGxlbiwgY2Ryb21fZG9fcGNfY29udGludWF0aW9uKTsKK30KKworCitzdGF0aWMKK2ludCBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKKwlpbnQgcmV0cmllcyA9IDEwOworCXVuc2lnbmVkIGludCBmbGFncyA9IHJxLT5mbGFnczsKKworCWlmIChycS0+c2Vuc2UgPT0gTlVMTCkKKwkJcnEtPnNlbnNlID0gJnNlbnNlOworCisJLyogU3RhcnQgb2YgcmV0cnkgbG9vcC4gKi8KKwlkbyB7CisJCWludCBlcnJvcjsKKwkJdW5zaWduZWQgbG9uZyB0aW1lID0gamlmZmllczsKKwkJcnEtPmZsYWdzID0gZmxhZ3M7CisKKwkJZXJyb3IgPSBpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCBycSwgaWRlX3dhaXQpOworCQl0aW1lID0gamlmZmllcyAtIHRpbWU7CisKKwkJLyogRklYTUU6IHdlIHNob3VsZCBwcm9iYWJseSBhYm9ydC9yZXRyeSBvciBzb21ldGhpbmcgCisJCSAqIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCQlpZiAocnEtPmZsYWdzICYgUkVRX0ZBSUxFRCkgeworCQkJLyogVGhlIHJlcXVlc3QgZmFpbGVkLiAgUmV0cnkgaWYgaXQgd2FzIGR1ZSB0byBhIHVuaXQKKwkJCSAgIGF0dGVudGlvbiBzdGF0dXMKKwkJCSAgICh1c3VhbGx5IG1lYW5zIG1lZGlhIHdhcyBjaGFuZ2VkKS4gKi8KKwkJCXN0cnVjdCByZXF1ZXN0X3NlbnNlICpyZXFidWYgPSBycS0+c2Vuc2U7CisKKwkJCWlmIChyZXFidWYtPnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikKKwkJCQljZHJvbV9zYXdfbWVkaWFfY2hhbmdlKGRyaXZlKTsKKwkJCWVsc2UgaWYgKHJlcWJ1Zi0+c2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSAmJgorCQkJCSByZXFidWYtPmFzYyA9PSA0ICYmIHJlcWJ1Zi0+YXNjcSAhPSA0KSB7CisJCQkJLyogVGhlIGRyaXZlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcKKwkJCQkgICBhIGRpc2suICBSZXRyeSwgYnV0IHdhaXQgYSBsaXR0bGUgdG8gZ2l2ZQorCQkJCSAgIHRoZSBkcml2ZSB0aW1lIHRvIGNvbXBsZXRlIHRoZSBsb2FkLiAqLworCQkJCXNzbGVlcCgyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogT3RoZXJ3aXNlLCBkb24ndCByZXRyeS4gKi8KKwkJCQlyZXRyaWVzID0gMDsKKwkJCX0KKwkJCS0tcmV0cmllczsKKwkJfQorCisJCS8qIEVuZCBvZiByZXRyeSBsb29wLiAqLworCX0gd2hpbGUgKChycS0+ZmxhZ3MgJiBSRVFfRkFJTEVEKSAmJiByZXRyaWVzID49IDApOworCisJLyogUmV0dXJuIGFuIGVycm9yIGlmIHRoZSBjb21tYW5kIGZhaWxlZC4gKi8KKwlyZXR1cm4gKHJxLT5mbGFncyAmIFJFUV9GQUlMRUQpID8gLUVJTyA6IDA7Cit9CisKKy8qCisgKiBXcml0ZSBoYW5kbGluZworICovCitzdGF0aWMgaW5saW5lIGludCBjZHJvbV93cml0ZV9jaGVja19pcmVhc29uKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGxlbiwgaW50IGlyZWFzb24pCit7CisJLyogVHdvIG5vdGVzIGFib3V0IElERSBpbnRlcnJ1cHQgcmVhc29uIGhlcmUgLSAwIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmUgd2FudHMgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdXMsIDIgbWVhbnMgdGhhdAorCSAqIHRoZSBkcml2ZSBpcyBleHBlY3RpbmcgdG8gdHJhbnNmZXIgZGF0YSB0byB1cy4KKwkgKi8KKwlpZiAoaXJlYXNvbiA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChpcmVhc29uID09IDIpIHsKKwkJLyogV2hvb3BzLi4uIFRoZSBkcml2ZSB3YW50cyB0byBzZW5kIGRhdGEuICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyaXRlX2ludHI6IHdyb25nIHRyYW5zZmVyIGRpcmVjdGlvbiFcbiIsCisJCQkJCQkJZHJpdmUtPm5hbWUpOworCisJCXdoaWxlIChsZW4gPiAwKSB7CisJCQlpbnQgZHVtID0gMDsKKwkJCUhXSUYoZHJpdmUpLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgJmR1bSwgc2l6ZW9mKGR1bSkpOworCQkJbGVuIC09IHNpemVvZihkdW0pOworCQl9CisJfSBlbHNlIHsKKwkJLyogRHJpdmUgd2FudHMgYSBjb21tYW5kIHBhY2tldCwgb3IgaW52YWxpZCBpcmVhc29uLi4uICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyaXRlX2ludHI6IGJhZCBpbnRlcnJ1cHQgcmVhc29uICV4XG4iLAorCQkJCQkJCWRyaXZlLT5uYW1lLCBpcmVhc29uKTsKKwl9CisKKwljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3RfdHJhbnNmb3JtX2NvbW1hbmQoc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwl1OCAqYyA9IHJlcS0+Y21kOworCWNoYXIgKmlidWY7CisKKwlpZiAoIWJsa19wY19yZXF1ZXN0KHJlcSkpCisJCXJldHVybjsKKworCWlmIChyZXEtPmJpbykKKwkJaWJ1ZiA9IGJpb19kYXRhKHJlcS0+YmlvKTsKKwllbHNlCisJCWlidWYgPSByZXEtPmRhdGE7CisKKwlpZiAoIWlidWYpCisJCXJldHVybjsKKworCS8qCisJICogc2V0IGFuc2ktcmV2aXNpb24gYW5kIHJlc3BvbnNlIGRhdGEgYXMgYXRhcGkKKwkgKi8KKwlpZiAoY1swXSA9PSBHUENNRF9JTlFVSVJZKSB7CisJCWlidWZbMl0gfD0gMjsKKwkJaWJ1ZlszXSA9IChpYnVmWzNdICYgMHhmMCkgfCAyOworCX0KK30KKwordHlwZWRlZiB2b2lkICh4ZmVyX2Z1bmNfdCkoaWRlX2RyaXZlX3QgKiwgdm9pZCAqLCB1MzIpOworCisvKgorICogYmVzdCB3YXkgdG8gZGVhbCB3aXRoIGRtYSB0aGF0IGlzIG5vdCBzZWN0b3IgYWxpZ25lZCByaWdodCBub3cuLi4gbm90ZQorICogdGhhdCBpbiB0aGlzIHBhdGggd2UgYXJlIG5vdCB1c2luZyAtPmRhdGEgb3IgLT5idWZmZXIgYXQgYWxsLiB0aGlzIGlycworICogY2FuIHJlcGxhY2UgY2Ryb21fcGNfaW50ciwgY2Ryb21fcmVhZF9pbnRyLCBhbmQgY2Ryb21fd3JpdGVfaW50ciBpbiB0aGUKKyAqIGZ1dHVyZS4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9uZXdwY19pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJaW50IGRtYV9lcnJvciwgZG1hLCBzdGF0LCBpcmVhc29uLCBsZW4sIHRoaXNsZW47CisJdTggbG93Y3lsLCBoaWdoY3lsOworCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwlkbWFfZXJyb3IgPSAwOworCWRtYSA9IGluZm8tPmRtYTsKKwlpZiAoZG1hKSB7CisJCWluZm8tPmRtYSA9IDA7CisJCWRtYV9lcnJvciA9IEhXSUYoZHJpdmUpLT5pZGVfZG1hX2VuZChkcml2ZSk7CisJfQorCisJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIDAsICZzdGF0KSkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJLyoKKwkgKiB1c2luZyBkbWEsIHRyYW5zZmVyIGlzIGNvbXBsZXRlIG5vdworCSAqLworCWlmIChkbWEpIHsKKwkJaWYgKGRtYV9lcnJvcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtY2Q6IGRtYSBlcnJvclxuIik7CisJCQlfX2lkZV9kbWFfb2ZmKGRyaXZlKTsKKwkJCXJldHVybiBpZGVfZXJyb3IoZHJpdmUsICJkbWEgZXJyb3IiLCBzdGF0KTsKKwkJfQorCisJCWVuZF90aGF0X3JlcXVlc3RfY2h1bmsocnEsIDEsIHJxLT5kYXRhX2xlbik7CisJCXJxLT5kYXRhX2xlbiA9IDA7CisJCWdvdG8gZW5kX3JlcXVlc3Q7CisJfQorCisJLyoKKwkgKiBvayB3ZSBmYWxsIHRvIHBpbyA6LworCSAqLworCWlyZWFzb24gPSBIV0lGKGRyaXZlKS0+SU5CKElERV9JUkVBU09OX1JFRykgJiAweDM7CisJbG93Y3lsICA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0JDT1VOVExfUkVHKTsKKwloaWdoY3lsID0gSFdJRihkcml2ZSktPklOQihJREVfQkNPVU5USF9SRUcpOworCisJbGVuID0gbG93Y3lsICsgKDI1NiAqIGhpZ2hjeWwpOworCXRoaXNsZW4gPSBycS0+ZGF0YV9sZW47CisJaWYgKHRoaXNsZW4gPiBsZW4pCisJCXRoaXNsZW4gPSBsZW47CisKKwkvKgorCSAqIElmIERSUSBpcyBjbGVhciwgdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoKHN0YXQgJiBEUlFfU1RBVCkgPT0gMCkKKwkJZ290byBlbmRfcmVxdWVzdDsKKworCS8qCisJICogY2hlY2sgd2hpY2ggd2F5IHRvIHRyYW5zZmVyIGRhdGEKKwkgKi8KKwlpZiAocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKSB7CisJCS8qCisJCSAqIHdyaXRlIHRvIGRyaXZlCisJCSAqLworCQlpZiAoY2Ryb21fd3JpdGVfY2hlY2tfaXJlYXNvbihkcml2ZSwgbGVuLCBpcmVhc29uKSkKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKworCQl4ZmVyZnVuYyA9IEhXSUYoZHJpdmUpLT5hdGFwaV9vdXRwdXRfYnl0ZXM7CisJfSBlbHNlICB7CisJCS8qCisJCSAqIHJlYWQgZnJvbSBkcml2ZQorCQkgKi8KKwkJaWYgKGNkcm9tX3JlYWRfY2hlY2tfaXJlYXNvbihkcml2ZSwgbGVuLCBpcmVhc29uKSkKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKworCQl4ZmVyZnVuYyA9IEhXSUYoZHJpdmUpLT5hdGFwaV9pbnB1dF9ieXRlczsKKwl9CisKKwkvKgorCSAqIHRyYW5zZmVyIGRhdGEKKwkgKi8KKwl3aGlsZSAodGhpc2xlbiA+IDApIHsKKwkJaW50IGJsZW4gPSBibGVuID0gcnEtPmRhdGFfbGVuOworCQljaGFyICpwdHIgPSBycS0+ZGF0YTsKKworCQkvKgorCQkgKiBiaW8gYmFja2VkPworCQkgKi8KKwkJaWYgKHJxLT5iaW8pIHsKKwkJCXB0ciA9IGJpb19kYXRhKHJxLT5iaW8pOworCQkJYmxlbiA9IGJpb19pb3ZlYyhycS0+YmlvKS0+YnZfbGVuOworCQl9CisKKwkJaWYgKCFwdHIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbmZ1c2VkLCBtaXNzaW5nIGRhdGFcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJsZW4gPiB0aGlzbGVuKQorCQkJYmxlbiA9IHRoaXNsZW47CisKKwkJeGZlcmZ1bmMoZHJpdmUsIHB0ciwgYmxlbik7CisKKwkJdGhpc2xlbiAtPSBibGVuOworCQlsZW4gLT0gYmxlbjsKKwkJcnEtPmRhdGFfbGVuIC09IGJsZW47CisKKwkJaWYgKHJxLT5iaW8pCisJCQllbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJxLCAxLCBibGVuKTsKKwkJZWxzZQorCQkJcnEtPmRhdGEgKz0gYmxlbjsKKwl9CisKKwkvKgorCSAqIHBhZCwgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKGxlbiA+IDApIHsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBwYWQgPSAwOworCisJCQl4ZmVyZnVuYyhkcml2ZSwgJnBhZCwgc2l6ZW9mKHBhZCkpOworCQkJbGVuIC09IHNpemVvZihwYWQpOworCQl9CisJfQorCisJaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCisJCUJVRygpOworCisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCBjZHJvbV9uZXdwY19pbnRyLCBycS0+dGltZW91dCwgTlVMTCk7CisJcmV0dXJuIGlkZV9zdGFydGVkOworCitlbmRfcmVxdWVzdDoKKwlpZiAoIXJxLT5kYXRhX2xlbikKKwkJcG9zdF90cmFuc2Zvcm1fY29tbWFuZChycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEpOworCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fd3JpdGVfaW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaW50IHN0YXQsIGlyZWFzb24sIGxlbiwgc2VjdG9yc190b190cmFuc2ZlciwgdXB0b2RhdGU7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaW50IGRtYV9lcnJvciA9IDAsIGRtYSA9IGluZm8tPmRtYTsKKwl1OCBsb3djeWwgPSAwLCBoaWdoY3lsID0gMDsKKworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKworCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJaWYgKGRtYSkgeworCQlpbmZvLT5kbWEgPSAwOworCQlpZiAoKGRtYV9lcnJvciA9IEhXSUYoZHJpdmUpLT5pZGVfZG1hX2VuZChkcml2ZSkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlkZS1jZDogd3JpdGUgZG1hIGVycm9yXG4iKTsKKwkJCV9faWRlX2RtYV9vZmYoZHJpdmUpOworCQl9CisJfQorCisJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIDAsICZzdGF0KSkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJLyoKKwkgKiB1c2luZyBkbWEsIHRyYW5zZmVyIGlzIGNvbXBsZXRlIG5vdworCSAqLworCWlmIChkbWEpIHsKKwkJaWYgKGRtYV9lcnJvcikKKwkJCXJldHVybiBpZGVfZXJyb3IoZHJpdmUsICJkbWEgZXJyb3IiLCBzdGF0KTsKKworCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHJxLT5ucl9zZWN0b3JzKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCS8qIFJlYWQgdGhlIGludGVycnVwdCByZWFzb24gYW5kIHRoZSB0cmFuc2ZlciBsZW5ndGguICovCisJaXJlYXNvbiA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0lSRUFTT05fUkVHKTsKKwlsb3djeWwgID0gSFdJRihkcml2ZSktPklOQihJREVfQkNPVU5UTF9SRUcpOworCWhpZ2hjeWwgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9CQ09VTlRIX1JFRyk7CisKKwlsZW4gPSBsb3djeWwgKyAoMjU2ICogaGlnaGN5bCk7CisKKwkvKiBJZiBEUlEgaXMgY2xlYXIsIHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQuICovCisJaWYgKChzdGF0ICYgRFJRX1NUQVQpID09IDApIHsKKwkJLyogSWYgd2UncmUgbm90IGRvbmUgd3JpdGluZywgY29tcGxhaW4uCisJCSAqIE90aGVyd2lzZSwgY29tcGxldGUgdGhlIGNvbW1hbmQgbm9ybWFsbHkuCisJCSAqLworCQl1cHRvZGF0ZSA9IDE7CisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID4gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogd3JpdGVfaW50cjogZGF0YSB1bmRlcnJ1biAoJWQgYmxvY2tzKVxuIiwKKwkJCWRyaXZlLT5uYW1lLCBycS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKwkJCXVwdG9kYXRlID0gMDsKKwkJfQorCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgZHJpdmUgaXMgZXhwZWN0aW5nIHRvIGRvIHRoZSBzYW1lIHRoaW5nIHdlIGFyZS4gKi8KKwlpZiAoY2Ryb21fd3JpdGVfY2hlY2tfaXJlYXNvbihkcml2ZSwgbGVuLCBpcmVhc29uKSkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJc2VjdG9yc190b190cmFuc2ZlciA9IGxlbiAvIFNFQ1RPUl9TSVpFOworCisJLyoKKwkgKiBub3cgbG9vcCBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhCisJICovCisJd2hpbGUgKHNlY3RvcnNfdG9fdHJhbnNmZXIgPiAwKSB7CisJCWludCB0aGlzX3RyYW5zZmVyOworCisJCWlmICghcnEtPmN1cnJlbnRfbnJfc2VjdG9ycykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtY2Q6IHdyaXRlX2ludHI6IG9vcHNcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IHNlY3RvcnMgd2UgY2FuIHRyYW5zZmVyCisJCSAqLworCQl0aGlzX3RyYW5zZmVyID0gbWluX3QoaW50LCBzZWN0b3JzX3RvX3RyYW5zZmVyLCBycS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKworCQl3aGlsZSAodGhpc190cmFuc2ZlciA+IDApIHsKKwkJCUhXSUYoZHJpdmUpLT5hdGFwaV9vdXRwdXRfYnl0ZXMoZHJpdmUsIHJxLT5idWZmZXIsIFNFQ1RPUl9TSVpFKTsKKwkJCXJxLT5idWZmZXIgKz0gU0VDVE9SX1NJWkU7CisJCQktLXJxLT5ucl9zZWN0b3JzOworCQkJLS1ycS0+Y3VycmVudF9ucl9zZWN0b3JzOworCQkJKytycS0+c2VjdG9yOworCQkJLS10aGlzX3RyYW5zZmVyOworCQkJLS1zZWN0b3JzX3RvX3RyYW5zZmVyOworCQl9CisKKwkJLyoKKwkJICogY3VycmVudCBidWZmZXIgY29tcGxldGUsIG1vdmUgb24KKwkJICovCisJCWlmIChycS0+Y3VycmVudF9ucl9zZWN0b3JzID09IDAgJiYgcnEtPm5yX3NlY3RvcnMpCisJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CisJfQorCisJLyogcmUtYXJtIGhhbmRsZXIgKi8KKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZjZHJvbV93cml0ZV9pbnRyLCBBVEFQSV9XQUlUX1BDLCBOVUxMKTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fc3RhcnRfd3JpdGVfY29udChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCisjaWYgMAkvKiB0aGUgaW1tZWRpYXRlIGJpdCAqLworCXJxLT5jbWRbMV0gPSAxIDw8IDM7CisjZW5kaWYKKwlycS0+dGltZW91dCA9IEFUQVBJX1dBSVRfUEM7CisKKwlyZXR1cm4gY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoZHJpdmUsIHJxLCBjZHJvbV93cml0ZV9pbnRyKTsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF93cml0ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGluZm8tPmRpc2s7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yc19wZXJfZnJhbWUgPSBxdWV1ZV9oYXJkc2VjdF9zaXplKGRyaXZlLT5xdWV1ZSkgPj4gU0VDVE9SX0JJVFM7CisKKwkvKgorCSAqIHdyaXRlcyAqbXVzdCogYmUgaGFyZHdhcmUgZnJhbWUgYWxpZ25lZAorCSAqLworCWlmICgocnEtPm5yX3NlY3RvcnMgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkgfHwKKwkgICAgKHJxLT5zZWN0b3IgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkpIHsKKwkJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJLyoKKwkgKiBkaXNrIGhhcyBiZWNvbWUgd3JpdGUgcHJvdGVjdGVkCisJICovCisJaWYgKGctPnBvbGljeSkgeworCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwkvKgorCSAqIGZvciBkdmQtcmFtIGFuZCBzdWNoIG1lZGlhLCBpdCdzIGEgcmVhbGx5IGJpZyBkZWFsIHRvIGdldAorCSAqIGJpZyB3cml0ZXMgYWxsIHRoZSB0aW1lLiBzbyBzY291ciB0aGUgcXVldWUgYW5kIGF0dGVtcHQgdG8KKwkgKiByZW1lcmdlIHJlcXVlc3RzLCBvZnRlbiB0aGUgcGx1Z2dpbmcgd2lsbCBub3QgaGF2ZSBoYWQgdGltZQorCSAqIHRvIGRvIHRoaXMgcHJvcGVybHkKKwkgKi8KKwlibGtfYXR0ZW1wdF9yZW1lcmdlKGRyaXZlLT5xdWV1ZSwgcnEpOworCisJaW5mby0+bnNlY3RvcnNfYnVmZmVyZWQgPSAwOworCisJLyogdXNlIGRtYSwgaWYgcG9zc2libGUuIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgbW9yZSwgc2luY2Ugd2UKKwkgKiBrbm93IHRoYXQgdGhlIHRyYW5zZmVyIGlzIGFsd2F5cyAoYXQgbGVhc3QhKSBmcmFtZSBhbGlnbmVkICovCisJaW5mby0+ZG1hID0gZHJpdmUtPnVzaW5nX2RtYSA/IDEgOiAwOworCWluZm8tPmNtZCA9IFdSSVRFOworCisJaW5mby0+ZGV2aW5mby5tZWRpYV93cml0dGVuID0gMTsKKworCS8qIFN0YXJ0IHNlbmRpbmcgdGhlIHdyaXRlIHJlcXVlc3QgdG8gdGhlIGRyaXZlLiAqLworCXJldHVybiBjZHJvbV9zdGFydF9wYWNrZXRfY29tbWFuZChkcml2ZSwgMzI3NjgsIGNkcm9tX3N0YXJ0X3dyaXRlX2NvbnQpOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX2RvX25ld3BjX2NvbnQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQVRBUElfV0FJVF9QQzsKKworCXJldHVybiBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChkcml2ZSwgcnEsIGNkcm9tX25ld3BjX2ludHIpOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX2RvX2Jsb2NrX3BjKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJcnEtPmZsYWdzIHw9IFJFUV9RVUlFVDsKKworCWluZm8tPmRtYSA9IDA7CisJaW5mby0+Y21kID0gMDsKKworCS8qCisJICogc2cgcmVxdWVzdAorCSAqLworCWlmIChycS0+YmlvKSB7CisJCWludCBtYXNrID0gZHJpdmUtPnF1ZXVlLT5kbWFfYWxpZ25tZW50OworCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKGJpb19wYWdlKHJxLT5iaW8pKTsKKworCQlpbmZvLT5jbWQgPSBycV9kYXRhX2RpcihycSk7CisJCWluZm8tPmRtYSA9IGRyaXZlLT51c2luZ19kbWE7CisKKwkJLyoKKwkJICogY2hlY2sgaWYgZG1hIGlzIHNhZmUKKwkJICovCisJCWlmICgocnEtPmRhdGFfbGVuICYgbWFzaykgfHwgKGFkZHIgJiBtYXNrKSkKKwkJCWluZm8tPmRtYSA9IDA7CisJfQorCisJLyogU3RhcnQgc2VuZGluZyB0aGUgY29tbWFuZCB0byB0aGUgZHJpdmUuICovCisJcmV0dXJuIGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGRyaXZlLCBycS0+ZGF0YV9sZW4sIGNkcm9tX2RvX25ld3BjX2NvbnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2Ryb20gZHJpdmVyIHJlcXVlc3Qgcm91dGluZS4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdAoraWRlX2RvX3J3X2Nkcm9tIChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgc2VjdG9yX3QgYmxvY2spCit7CisJaWRlX3N0YXJ0c3RvcF90IGFjdGlvbjsKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlmIChibGtfZnNfcmVxdWVzdChycSkpIHsKKwkJaWYgKENEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnNlZWtpbmcpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCA9IGppZmZpZXMgLSBpbmZvLT5zdGFydF9zZWVrOworCQkJaW50IHN0YXQgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9TVEFUVVNfUkVHKTsKKworCQkJaWYgKChzdGF0ICYgU0VFS19TVEFUKSAhPSBTRUVLX1NUQVQpIHsKKwkJCQlpZiAoZWxhcHNlZCA8IElERUNEX1NFRUtfVElNRU9VVCkgeworCQkJCQlpZGVfc3RhbGxfcXVldWUoZHJpdmUsIElERUNEX1NFRUtfVElNRVIpOworCQkJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJCQkJfQorCQkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBEU0MgdGltZW91dFxuIiwgZHJpdmUtPm5hbWUpOworCQkJfQorCQkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+c2Vla2luZyA9IDA7CisJCX0KKwkJaWYgKChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkgJiYgSURFX0xBUkdFX1NFRUsoaW5mby0+bGFzdF9ibG9jaywgYmxvY2ssIElERUNEX1NFRUtfVEhSRVNIT0xEKSAmJiBkcml2ZS0+ZHNjX292ZXJsYXApIHsKKwkJCWFjdGlvbiA9IGNkcm9tX3N0YXJ0X3NlZWsoZHJpdmUsIGJsb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkKKwkJCQlhY3Rpb24gPSBjZHJvbV9zdGFydF9yZWFkKGRyaXZlLCBibG9jayk7CisJCQllbHNlCisJCQkJYWN0aW9uID0gY2Ryb21fc3RhcnRfd3JpdGUoZHJpdmUsIHJxKTsKKwkJfQorCQlpbmZvLT5sYXN0X2Jsb2NrID0gYmxvY2s7CisJCXJldHVybiBhY3Rpb247CisJfSBlbHNlIGlmIChycS0+ZmxhZ3MgJiAoUkVRX1BDIHwgUkVRX1NFTlNFKSkgeworCQlyZXR1cm4gY2Ryb21fZG9fcGFja2V0X2NvbW1hbmQoZHJpdmUpOworCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSB7CisJCXJldHVybiBjZHJvbV9kb19ibG9ja19wYyhkcml2ZSwgcnEpOworCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX1NQRUNJQUwpIHsKKwkJLyoKKwkJICogcmlnaHQgbm93IHRoaXMgY2FuIG9ubHkgYmUgYSByZXNldC4uLgorCQkgKi8KKwkJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDEpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJYmxrX2R1bXBfcnFfZmxhZ3MocnEsICJpZGUtY2QgYmFkIGZsYWdzIik7CisJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJb2N0bCBoYW5kbGluZy4KKyAqCisgKiBSb3V0aW5lcyB3aGljaCBxdWV1ZSBwYWNrZXQgY29tbWFuZHMgdGFrZSBhcyBhIGZpbmFsIGFyZ3VtZW50IGEgcG9pbnRlcgorICogdG8gYSByZXF1ZXN0X3NlbnNlIHN0cnVjdC4gIElmIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZCByZXN1bHRzCisgKiBpbiBhbiBlcnJvciB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cywgdGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBmaWxsZWQKKyAqIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHN1YnNlcXVlbnQgcmVxdWVzdCBzZW5zZSBjb21tYW5kLiAgVGhlIHBvaW50ZXIKKyAqIGNhbiBhbHNvIGJlIE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8gc2Vuc2UgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuCisgKi8KKworI2lmICEgU1RBTkRBUkRfQVRBUEkKK3N0YXRpYyBpbmxpbmUKK2ludCBiaW4yYmNkIChpbnQgeCkKK3sKKwlyZXR1cm4gKHglMTApIHwgKCh4LzEwKSA8PCA0KTsKK30KKworCitzdGF0aWMgaW5saW5lCitpbnQgYmNkMmJpbiAoaW50IHgpCit7CisJcmV0dXJuICh4ID4+IDQpICogMTAgKyAoeCAmIDB4MGYpOworfQorCitzdGF0aWMKK3ZvaWQgbXNmX2Zyb21fYmNkIChzdHJ1Y3QgYXRhcGlfbXNmICptc2YpCit7CisJbXNmLT5taW51dGUgPSBiY2QyYmluIChtc2YtPm1pbnV0ZSk7CisJbXNmLT5zZWNvbmQgPSBiY2QyYmluIChtc2YtPnNlY29uZCk7CisJbXNmLT5mcmFtZSAgPSBiY2QyYmluIChtc2YtPmZyYW1lKTsKK30KKworI2VuZGlmIC8qIG5vdCBTVEFOREFSRF9BVEFQSSAqLworCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbGJhX3RvX21zZiAoaW50IGxiYSwgYnl0ZSAqbSwgYnl0ZSAqcywgYnl0ZSAqZikKK3sKKwlsYmEgKz0gQ0RfTVNGX09GRlNFVDsKKwlsYmEgJj0gMHhmZmZmZmY7ICAvKiBuZWdhdGl2ZSBsYmFzIHVzZSBvbmx5IDI0IGJpdHMgKi8KKwkqbSA9IGxiYSAvIChDRF9TRUNTICogQ0RfRlJBTUVTKTsKKwlsYmEgJT0gKENEX1NFQ1MgKiBDRF9GUkFNRVMpOworCSpzID0gbGJhIC8gQ0RfRlJBTUVTOworCSpmID0gbGJhICUgQ0RfRlJBTUVTOworfQorCisKK3N0YXRpYyBpbmxpbmUKK2ludCBtc2ZfdG9fbGJhIChieXRlIG0sIGJ5dGUgcywgYnl0ZSBmKQoreworCXJldHVybiAoKChtICogQ0RfU0VDUykgKyBzKSAqIENEX0ZSQU1FUyArIGYpIC0gQ0RfTVNGX09GRlNFVDsKK30KKworc3RhdGljIGludCBjZHJvbV9jaGVja19zdGF0dXMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCit7CisJc3RydWN0IHJlcXVlc3QgcmVxOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpID0gJmluZm8tPmRldmluZm87CisKKwljZHJvbV9wcmVwYXJlX3JlcXVlc3QoZHJpdmUsICZyZXEpOworCisJcmVxLnNlbnNlID0gc2Vuc2U7CisJcmVxLmNtZFswXSA9IEdQQ01EX1RFU1RfVU5JVF9SRUFEWTsKKwlyZXEuZmxhZ3MgfD0gUkVRX1FVSUVUOworCisjaWYgISBTVEFOREFSRF9BVEFQSQorICAgICAgICAvKiB0aGUgU2FueW8gMyBDRCBjaGFuZ2VyIHVzZXMgYnl0ZSA3IG9mIFRFU1RfVU5JVF9SRUFEWSB0byAKKyAgICAgICAgICAgc3dpdGNoIENEcyBpbnN0ZWFkIG9mIHN1cHBvcnRpbmcgdGhlIExPQURfVU5MT0FEIG9wY29kZSAgICovCisKKwlyZXEuY21kWzddID0gY2RpLT5zYW55b19zbG90ICUgMzsKKyNlbmRpZiAvKiBub3QgU1RBTkRBUkRfQVRBUEkgKi8KKworCXJldHVybiBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChkcml2ZSwgJnJlcSk7Cit9CisKKworLyogTG9jayB0aGUgZG9vciBpZiBMT0NLRkxBRyBpcyBub256ZXJvOyB1bmxvY2sgaXQgb3RoZXJ3aXNlLiAqLworc3RhdGljIGludAorY2Ryb21fbG9ja2Rvb3IoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbG9ja2ZsYWcsIHN0cnVjdCByZXF1ZXN0X3NlbnNlICpzZW5zZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBteV9zZW5zZTsKKwlzdHJ1Y3QgcmVxdWVzdCByZXE7CisJaW50IHN0YXQ7CisKKwlpZiAoc2Vuc2UgPT0gTlVMTCkKKwkJc2Vuc2UgPSAmbXlfc2Vuc2U7CisKKwkvKiBJZiB0aGUgZHJpdmUgY2Fubm90IGxvY2sgdGhlIGRvb3IsIGp1c3QgcHJldGVuZC4gKi8KKwlpZiAoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bm9fZG9vcmxvY2spIHsKKwkJc3RhdCA9IDA7CisJfSBlbHNlIHsKKwkJY2Ryb21fcHJlcGFyZV9yZXF1ZXN0KGRyaXZlLCAmcmVxKTsKKwkJcmVxLnNlbnNlID0gc2Vuc2U7CisJCXJlcS5jbWRbMF0gPSBHUENNRF9QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMOworCQlyZXEuY21kWzRdID0gbG9ja2ZsYWcgPyAxIDogMDsKKwkJc3RhdCA9IGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGRyaXZlLCAmcmVxKTsKKwl9CisKKwkvKiBJZiB3ZSBnb3QgYW4gaWxsZWdhbCBmaWVsZCBlcnJvciwgdGhlIGRyaXZlCisJICAgcHJvYmFibHkgY2Fubm90IGxvY2sgdGhlIGRvb3IuICovCisJaWYgKHN0YXQgIT0gMCAmJgorCSAgICBzZW5zZS0+c2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJgorCSAgICAoc2Vuc2UtPmFzYyA9PSAweDI0IHx8IHNlbnNlLT5hc2MgPT0gMHgyMCkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IGRvb3IgbG9ja2luZyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJZHJpdmUtPm5hbWUpOworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5ub19kb29ybG9jayA9IDE7CisJCXN0YXQgPSAwOworCX0KKwkKKwkvKiBubyBtZWRpdW0sIHRoYXQncyBhbHJpZ2h0LiAqLworCWlmIChzdGF0ICE9IDAgJiYgc2Vuc2UtPnNlbnNlX2tleSA9PSBOT1RfUkVBRFkgJiYgc2Vuc2UtPmFzYyA9PSAweDNhKQorCQlzdGF0ID0gMDsKKworCWlmIChzdGF0ID09IDApCisJCUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+ZG9vcl9sb2NrZWQgPSBsb2NrZmxhZzsKKworCXJldHVybiBzdGF0OworfQorCisKKy8qIEVqZWN0IHRoZSBkaXNrIGlmIEVKRUNURkxBRyBpcyAwLgorICAgSWYgRUpFQ1RGTEFHIGlzIDEsIHRyeSB0byByZWxvYWQgdGhlIGRpc2suICovCitzdGF0aWMgaW50IGNkcm9tX2VqZWN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGVqZWN0ZmxhZywKKwkJICAgICAgIHN0cnVjdCByZXF1ZXN0X3NlbnNlICpzZW5zZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCByZXE7CisJY2hhciBsb2VqID0gMHgwMjsKKworCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5ub19lamVjdCAmJiAhZWplY3RmbGFnKQorCQlyZXR1cm4gLUVEUklWRV9DQU5UX0RPX1RISVM7CisJCisJLyogcmVsb2FkIGZhaWxzIG9uIHNvbWUgZHJpdmVzLCBpZiB0aGUgdHJheSBpcyBsb2NrZWQgKi8KKwlpZiAoQ0RST01fU1RBVEVfRkxBR1MoZHJpdmUpLT5kb29yX2xvY2tlZCAmJiBlamVjdGZsYWcpCisJCXJldHVybiAwOworCisJY2Ryb21fcHJlcGFyZV9yZXF1ZXN0KGRyaXZlLCAmcmVxKTsKKworCS8qIG9ubHkgdGVsbCBkcml2ZSB0byBjbG9zZSB0cmF5IGlmIG9wZW4sIGlmIGl0IGNhbiBkbyB0aGF0ICovCisJaWYgKGVqZWN0ZmxhZyAmJiAhQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2xvc2VfdHJheSkKKwkJbG9laiA9IDA7CisKKwlyZXEuc2Vuc2UgPSBzZW5zZTsKKwlyZXEuY21kWzBdID0gR1BDTURfU1RBUlRfU1RPUF9VTklUOworCXJlcS5jbWRbNF0gPSBsb2VqIHwgKGVqZWN0ZmxhZyAhPSAwKTsKKwlyZXR1cm4gY2Ryb21fcXVldWVfcGFja2V0X2NvbW1hbmQoZHJpdmUsICZyZXEpOworfQorCitzdGF0aWMgaW50IGNkcm9tX3JlYWRfY2FwYWNpdHkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nICpjYXBhY2l0eSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzZWN0b3JzX3Blcl9mcmFtZSwKKwkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCit7CisJc3RydWN0IHsKKwkJX191MzIgbGJhOworCQlfX3UzMiBibG9ja2xlbjsKKwl9IGNhcGJ1ZjsKKworCWludCBzdGF0OworCXN0cnVjdCByZXF1ZXN0IHJlcTsKKworCWNkcm9tX3ByZXBhcmVfcmVxdWVzdChkcml2ZSwgJnJlcSk7CisKKwlyZXEuc2Vuc2UgPSBzZW5zZTsKKwlyZXEuY21kWzBdID0gR1BDTURfUkVBRF9DRFZEX0NBUEFDSVRZOworCXJlcS5kYXRhID0gKGNoYXIgKikmY2FwYnVmOworCXJlcS5kYXRhX2xlbiA9IHNpemVvZihjYXBidWYpOworCisJc3RhdCA9IGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGRyaXZlLCAmcmVxKTsKKwlpZiAoc3RhdCA9PSAwKSB7CisJCSpjYXBhY2l0eSA9IDEgKyBiZTMyX3RvX2NwdShjYXBidWYubGJhKTsKKwkJKnNlY3RvcnNfcGVyX2ZyYW1lID0KKwkJCWJlMzJfdG9fY3B1KGNhcGJ1Zi5ibG9ja2xlbikgPj4gU0VDVE9SX0JJVFM7CisJfQorCisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fcmVhZF90b2NlbnRyeShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB0cmFja25vLCBpbnQgbXNmX2ZsYWcsCisJCQkJaW50IGZvcm1hdCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuLAorCQkJCXN0cnVjdCByZXF1ZXN0X3NlbnNlICpzZW5zZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCByZXE7CisKKwljZHJvbV9wcmVwYXJlX3JlcXVlc3QoZHJpdmUsICZyZXEpOworCisJcmVxLnNlbnNlID0gc2Vuc2U7CisJcmVxLmRhdGEgPSAgYnVmOworCXJlcS5kYXRhX2xlbiA9IGJ1ZmxlbjsKKwlyZXEuZmxhZ3MgfD0gUkVRX1FVSUVUOworCXJlcS5jbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKKwlyZXEuY21kWzZdID0gdHJhY2tubzsKKwlyZXEuY21kWzddID0gKGJ1ZmxlbiA+PiA4KTsKKwlyZXEuY21kWzhdID0gKGJ1ZmxlbiAmIDB4ZmYpOworCXJlcS5jbWRbOV0gPSAoZm9ybWF0IDw8IDYpOworCisJaWYgKG1zZl9mbGFnKQorCQlyZXEuY21kWzFdID0gMjsKKworCXJldHVybiBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChkcml2ZSwgJnJlcSk7Cit9CisKKworLyogVHJ5IHRvIHJlYWQgdGhlIGVudGlyZSBUT0MgZm9yIHRoZSBkaXNrIGludG8gb3VyIGludGVybmFsIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgY2Ryb21fcmVhZF90b2MoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCit7CisJaW50IHN0YXQsIG50cmFja3MsIGk7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkgPSAmaW5mby0+ZGV2aW5mbzsKKwlzdHJ1Y3QgYXRhcGlfdG9jICp0b2MgPSBpbmZvLT50b2M7CisJc3RydWN0IHsKKwkJc3RydWN0IGF0YXBpX3RvY19oZWFkZXIgaGRyOworCQlzdHJ1Y3QgYXRhcGlfdG9jX2VudHJ5ICBlbnQ7CisJfSBtc190bXA7CisJbG9uZyBsYXN0X3dyaXR0ZW47CisJdW5zaWduZWQgbG9uZyBzZWN0b3JzX3Blcl9mcmFtZSA9IFNFQ1RPUlNfUEVSX0ZSQU1FOworCisJaWYgKHRvYyA9PSBOVUxMKSB7CisJCS8qIFRyeSB0byBhbGxvY2F0ZSBzcGFjZS4gKi8KKwkJdG9jID0gKHN0cnVjdCBhdGFwaV90b2MgKikga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYXRhcGlfdG9jKSwKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaW5mby0+dG9jID0gdG9jOworCQlpZiAodG9jID09IE5VTEwpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBObyBjZHJvbSBUT0MgYnVmZmVyIVxuIiwgZHJpdmUtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGV4aXN0aW5nIGRhdGEgaXMgc3RpbGwgdmFsaWQuCisJICAgSWYgaXQgaXMsIGp1c3QgcmV0dXJuLiAqLworCSh2b2lkKSBjZHJvbV9jaGVja19zdGF0dXMoZHJpdmUsIHNlbnNlKTsKKworCWlmIChDRFJPTV9TVEFURV9GTEFHUyhkcml2ZSktPnRvY192YWxpZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBUcnkgdG8gZ2V0IHRoZSB0b3RhbCBjZHJvbSBjYXBhY2l0eSBhbmQgc2VjdG9yIHNpemUuICovCisJc3RhdCA9IGNkcm9tX3JlYWRfY2FwYWNpdHkoZHJpdmUsICZ0b2MtPmNhcGFjaXR5LCAmc2VjdG9yc19wZXJfZnJhbWUsCisJCQkJICAgc2Vuc2UpOworCWlmIChzdGF0KQorCQl0b2MtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CisKKwlzZXRfY2FwYWNpdHkoaW5mby0+ZGlzaywgdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lKTsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShkcml2ZS0+cXVldWUsCisJCQkJc2VjdG9yc19wZXJfZnJhbWUgPDwgU0VDVE9SX0JJVFMpOworCisJLyogRmlyc3QgcmVhZCBqdXN0IHRoZSBoZWFkZXIsIHNvIHdlIGtub3cgaG93IGxvbmcgdGhlIFRPQyBpcy4gKi8KKwlzdGF0ID0gY2Ryb21fcmVhZF90b2NlbnRyeShkcml2ZSwgMCwgMSwgMCwgKGNoYXIgKikgJnRvYy0+aGRyLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0YXBpX3RvY19oZWFkZXIpLCBzZW5zZSk7CisJaWYgKHN0YXQpIHJldHVybiBzdGF0OworCisjaWYgISBTVEFOREFSRF9BVEFQSQorCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT50b2N0cmFja3NfYXNfYmNkKSB7CisJCXRvYy0+aGRyLmZpcnN0X3RyYWNrID0gYmNkMmJpbih0b2MtPmhkci5maXJzdF90cmFjayk7CisJCXRvYy0+aGRyLmxhc3RfdHJhY2sgID0gYmNkMmJpbih0b2MtPmhkci5sYXN0X3RyYWNrKTsKKwl9CisjZW5kaWYgIC8qIG5vdCBTVEFOREFSRF9BVEFQSSAqLworCisJbnRyYWNrcyA9IHRvYy0+aGRyLmxhc3RfdHJhY2sgLSB0b2MtPmhkci5maXJzdF90cmFjayArIDE7CisJaWYgKG50cmFja3MgPD0gMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG50cmFja3MgPiBNQVhfVFJBQ0tTKQorCQludHJhY2tzID0gTUFYX1RSQUNLUzsKKworCS8qIE5vdyByZWFkIHRoZSB3aG9sZSBzY2htZWVyLiAqLworCXN0YXQgPSBjZHJvbV9yZWFkX3RvY2VudHJ5KGRyaXZlLCB0b2MtPmhkci5maXJzdF90cmFjaywgMSwgMCwKKwkJCQkgIChjaGFyICopJnRvYy0+aGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgYXRhcGlfdG9jX2hlYWRlcikgKworCQkJCSAgIChudHJhY2tzICsgMSkgKgorCQkJCSAgIHNpemVvZihzdHJ1Y3QgYXRhcGlfdG9jX2VudHJ5KSwgc2Vuc2UpOworCisJaWYgKHN0YXQgJiYgdG9jLT5oZHIuZmlyc3RfdHJhY2sgPiAxKSB7CisJCS8qIENkcyB3aXRoIENESSB0cmFja3Mgb25seSBkb24ndCBoYXZlIGFueSBUT0MgZW50cmllcywKKwkJICAgZGVzcGl0ZSBvZiB0aGlzIHRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlCisJCSAgIGZpcnN0X3RyYWNrID09IGxhc3RfdHJhY2sgPSBudW1iZXIgb2YgQ0RJIHRyYWNrcyArIDEsCisJCSAgIHNvIHRoYXQgdGhpcyBjYXNlIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHNhbWUKKwkJICAgbGF5b3V0IHBsdXMgYW4gYWRkaXRpb25hbCBhdWRpbyB0cmFjay4KKwkJICAgSWYgd2UgZ2V0IGFuIGVycm9yIGZvciB0aGUgcmVndWxhciBjYXNlLCB3ZSBhc3N1bWUKKwkJICAgYSBDREkgd2l0aG91dCBhZGRpdGlvbmFsIGF1ZGlvIHRyYWNrcy4gSW4gdGhpcyBjYXNlCisJCSAgIHRoZSByZWFkYWJsZSBUT0MgaXMgZW1wdHkgKENESSB0cmFja3MgYXJlIG5vdCBpbmNsdWRlZCkKKwkJICAgYW5kIG9ubHkgaG9sZHMgdGhlIExlYWRvdXQgZW50cnkuIEhlaWtvIEVp32ZlbGR0ICovCisJCW50cmFja3MgPSAwOworCQlzdGF0ID0gY2Ryb21fcmVhZF90b2NlbnRyeShkcml2ZSwgQ0RST01fTEVBRE9VVCwgMSwgMCwKKwkJCQkJICAgKGNoYXIgKikmdG9jLT5oZHIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgYXRhcGlfdG9jX2hlYWRlcikgKworCQkJCQkgICAobnRyYWNrcyArIDEpICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBhdGFwaV90b2NfZW50cnkpLAorCQkJCQkgICBzZW5zZSk7CisJCWlmIChzdGF0KSB7CisJCQlyZXR1cm4gc3RhdDsKKwkJfQorI2lmICEgU1RBTkRBUkRfQVRBUEkKKwkJaWYgKENEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnRvY3RyYWNrc19hc19iY2QpIHsKKwkJCXRvYy0+aGRyLmZpcnN0X3RyYWNrID0gYmluMmJjZChDRFJPTV9MRUFET1VUKTsKKwkJCXRvYy0+aGRyLmxhc3RfdHJhY2sgPSBiaW4yYmNkKENEUk9NX0xFQURPVVQpOworCQl9IGVsc2UKKyNlbmRpZiAgLyogbm90IFNUQU5EQVJEX0FUQVBJICovCisJCXsKKwkJCXRvYy0+aGRyLmZpcnN0X3RyYWNrID0gQ0RST01fTEVBRE9VVDsKKwkJCXRvYy0+aGRyLmxhc3RfdHJhY2sgPSBDRFJPTV9MRUFET1VUOworCQl9CisJfQorCisJaWYgKHN0YXQpCisJCXJldHVybiBzdGF0OworCisJdG9jLT5oZHIudG9jX2xlbmd0aCA9IG50b2hzICh0b2MtPmhkci50b2NfbGVuZ3RoKTsKKworI2lmICEgU1RBTkRBUkRfQVRBUEkKKwlpZiAoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+dG9jdHJhY2tzX2FzX2JjZCkgeworCQl0b2MtPmhkci5maXJzdF90cmFjayA9IGJjZDJiaW4odG9jLT5oZHIuZmlyc3RfdHJhY2spOworCQl0b2MtPmhkci5sYXN0X3RyYWNrICA9IGJjZDJiaW4odG9jLT5oZHIubGFzdF90cmFjayk7CisJfQorI2VuZGlmICAvKiBub3QgU1RBTkRBUkRfQVRBUEkgKi8KKworCWZvciAoaT0wOyBpPD1udHJhY2tzOyBpKyspIHsKKyNpZiAhIFNUQU5EQVJEX0FUQVBJCisJCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT50b2NhZGRyX2FzX2JjZCkgeworCQkJaWYgKENEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnRvY3RyYWNrc19hc19iY2QpCisJCQkJdG9jLT5lbnRbaV0udHJhY2sgPSBiY2QyYmluKHRvYy0+ZW50W2ldLnRyYWNrKTsKKwkJCW1zZl9mcm9tX2JjZCgmdG9jLT5lbnRbaV0uYWRkci5tc2YpOworCQl9CisjZW5kaWYgIC8qIG5vdCBTVEFOREFSRF9BVEFQSSAqLworCQl0b2MtPmVudFtpXS5hZGRyLmxiYSA9IG1zZl90b19sYmEgKHRvYy0+ZW50W2ldLmFkZHIubXNmLm1pbnV0ZSwKKwkJCQkJCSAgIHRvYy0+ZW50W2ldLmFkZHIubXNmLnNlY29uZCwKKwkJCQkJCSAgIHRvYy0+ZW50W2ldLmFkZHIubXNmLmZyYW1lKTsKKwl9CisKKwkvKiBSZWFkIHRoZSBtdWx0aXNlc3Npb24gaW5mb3JtYXRpb24uICovCisJaWYgKHRvYy0+aGRyLmZpcnN0X3RyYWNrICE9IENEUk9NX0xFQURPVVQpIHsKKwkJLyogUmVhZCB0aGUgbXVsdGlzZXNzaW9uIGluZm9ybWF0aW9uLiAqLworCQlzdGF0ID0gY2Ryb21fcmVhZF90b2NlbnRyeShkcml2ZSwgMCwgMCwgMSwgKGNoYXIgKikmbXNfdG1wLAorCQkJCQkgICBzaXplb2YobXNfdG1wKSwgc2Vuc2UpOworCQlpZiAoc3RhdCkgcmV0dXJuIHN0YXQ7CisKKwkJdG9jLT5sYXN0X3Nlc3Npb25fbGJhID0gYmUzMl90b19jcHUobXNfdG1wLmVudC5hZGRyLmxiYSk7CisJfSBlbHNlIHsKKwkJbXNfdG1wLmhkci5maXJzdF90cmFjayA9IG1zX3RtcC5oZHIubGFzdF90cmFjayA9IENEUk9NX0xFQURPVVQ7CisJCXRvYy0+bGFzdF9zZXNzaW9uX2xiYSA9IG1zZl90b19sYmEoMCwgMiwgMCk7IC8qIDBtIDJzIDBmICovCisJfQorCisjaWYgISBTVEFOREFSRF9BVEFQSQorCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT50b2NhZGRyX2FzX2JjZCkgeworCQkvKiBSZS1yZWFkIG11bHRpc2Vzc2lvbiBpbmZvcm1hdGlvbiB1c2luZyBNU0YgZm9ybWF0ICovCisJCXN0YXQgPSBjZHJvbV9yZWFkX3RvY2VudHJ5KGRyaXZlLCAwLCAxLCAxLCAoY2hhciAqKSZtc190bXAsCisJCQkJCSAgIHNpemVvZihtc190bXApLCBzZW5zZSk7CisJCWlmIChzdGF0KQorCQkJcmV0dXJuIHN0YXQ7CisKKwkJbXNmX2Zyb21fYmNkICgmbXNfdG1wLmVudC5hZGRyLm1zZik7CisJCXRvYy0+bGFzdF9zZXNzaW9uX2xiYSA9IG1zZl90b19sYmEobXNfdG1wLmVudC5hZGRyLm1zZi5taW51dGUsCisJCQkJCSAgCSAgIG1zX3RtcC5lbnQuYWRkci5tc2Yuc2Vjb25kLAorCQkJCQkJICAgbXNfdG1wLmVudC5hZGRyLm1zZi5mcmFtZSk7CisJfQorI2VuZGlmICAvKiBub3QgU1RBTkRBUkRfQVRBUEkgKi8KKworCXRvYy0+eGFfZmxhZyA9IChtc190bXAuaGRyLmZpcnN0X3RyYWNrICE9IG1zX3RtcC5oZHIubGFzdF90cmFjayk7CisKKwkvKiBOb3cgdHJ5IHRvIGdldCB0aGUgdG90YWwgY2Ryb20gY2FwYWNpdHkuICovCisJc3RhdCA9IGNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oY2RpLCAmbGFzdF93cml0dGVuKTsKKwlpZiAoIXN0YXQgJiYgKGxhc3Rfd3JpdHRlbiA+IHRvYy0+Y2FwYWNpdHkpKSB7CisJCXRvYy0+Y2FwYWNpdHkgPSBsYXN0X3dyaXR0ZW47CisJCXNldF9jYXBhY2l0eShpbmZvLT5kaXNrLCB0b2MtPmNhcGFjaXR5ICogc2VjdG9yc19wZXJfZnJhbWUpOworCX0KKworCS8qIFJlbWVtYmVyIHRoYXQgd2UndmUgcmVhZCB0aGlzIHN0dWZmLiAqLworCUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+dG9jX3ZhbGlkID0gMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2Ryb21fcmVhZF9zdWJjaGFubmVsKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGZvcm1hdCwgY2hhciAqYnVmLAorCQkJCSBpbnQgYnVmbGVuLCBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCit7CisJc3RydWN0IHJlcXVlc3QgcmVxOworCisJY2Ryb21fcHJlcGFyZV9yZXF1ZXN0KGRyaXZlLCAmcmVxKTsKKworCXJlcS5zZW5zZSA9IHNlbnNlOworCXJlcS5kYXRhID0gYnVmOworCXJlcS5kYXRhX2xlbiA9IGJ1ZmxlbjsKKwlyZXEuY21kWzBdID0gR1BDTURfUkVBRF9TVUJDSEFOTkVMOworCXJlcS5jbWRbMV0gPSAyOyAgICAgLyogTVNGIGFkZHJlc3NpbmcgKi8KKwlyZXEuY21kWzJdID0gMHg0MDsgIC8qIHJlcXVlc3Qgc3ViUSBkYXRhICovCisJcmVxLmNtZFszXSA9IGZvcm1hdDsKKwlyZXEuY21kWzddID0gKGJ1ZmxlbiA+PiA4KTsKKwlyZXEuY21kWzhdID0gKGJ1ZmxlbiAmIDB4ZmYpOworCXJldHVybiBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChkcml2ZSwgJnJlcSk7Cit9CisKKy8qIEFUQVBJIGNkcm9tIGRyaXZlcyBhcmUgZnJlZSB0byBzZWxlY3QgdGhlIHNwZWVkIHlvdSByZXF1ZXN0IG9yIGFueSBzbG93ZXIKKyAgIHJhdGUgOi0oIFJlcXVlc3RpbmcgdG9vIGZhc3QgYSBzcGVlZCB3aWxsIF9ub3RfIHByb2R1Y2UgYW4gZXJyb3IuICovCitzdGF0aWMgaW50IGNkcm9tX3NlbGVjdF9zcGVlZChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBzcGVlZCwKKwkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NlbnNlICpzZW5zZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCByZXE7CisJY2Ryb21fcHJlcGFyZV9yZXF1ZXN0KGRyaXZlLCAmcmVxKTsKKworCXJlcS5zZW5zZSA9IHNlbnNlOworCWlmIChzcGVlZCA9PSAwKQorCQlzcGVlZCA9IDB4ZmZmZjsgLyogc2V0IHRvIG1heCAqLworCWVsc2UKKwkJc3BlZWQgKj0gMTc3OyAgIC8qIE54IHRvIGtieXRlcy9zICovCisKKwlyZXEuY21kWzBdID0gR1BDTURfU0VUX1NQRUVEOworCS8qIFJlYWQgRHJpdmUgc3BlZWQgaW4ga2J5dGVzL3NlY29uZCBNU0IgKi8KKwlyZXEuY21kWzJdID0gKHNwZWVkID4+IDgpICYgMHhmZjsJCisJLyogUmVhZCBEcml2ZSBzcGVlZCBpbiBrYnl0ZXMvc2Vjb25kIExTQiAqLworCXJlcS5jbWRbM10gPSBzcGVlZCAmIDB4ZmY7CisJaWYgKENEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmNkX3IgfHwKKwkgICAgQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2RfcncgfHwKKwkgICAgQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+ZHZkX3IpIHsKKwkJLyogV3JpdGUgRHJpdmUgc3BlZWQgaW4ga2J5dGVzL3NlY29uZCBNU0IgKi8KKwkJcmVxLmNtZFs0XSA9IChzcGVlZCA+PiA4KSAmIDB4ZmY7CisJCS8qIFdyaXRlIERyaXZlIHNwZWVkIGluIGtieXRlcy9zZWNvbmQgTFNCICovCisJCXJlcS5jbWRbNV0gPSBzcGVlZCAmIDB4ZmY7CisgICAgICAgfQorCisJcmV0dXJuIGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGRyaXZlLCAmcmVxKTsKK30KKworc3RhdGljIGludCBjZHJvbV9wbGF5X2F1ZGlvKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGxiYV9zdGFydCwgaW50IGxiYV9lbmQpCit7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CisJc3RydWN0IHJlcXVlc3QgcmVxOworCisJY2Ryb21fcHJlcGFyZV9yZXF1ZXN0KGRyaXZlLCAmcmVxKTsKKworCXJlcS5zZW5zZSA9ICZzZW5zZTsKKwlyZXEuY21kWzBdID0gR1BDTURfUExBWV9BVURJT19NU0Y7CisJbGJhX3RvX21zZihsYmFfc3RhcnQsICZyZXEuY21kWzNdLCAmcmVxLmNtZFs0XSwgJnJlcS5jbWRbNV0pOworCWxiYV90b19tc2YobGJhX2VuZC0xLCAmcmVxLmNtZFs2XSwgJnJlcS5jbWRbN10sICZyZXEuY21kWzhdKTsKKworCXJldHVybiBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChkcml2ZSwgJnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fZ2V0X3RvY19lbnRyeShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB0cmFjaywKKwkJCQlzdHJ1Y3QgYXRhcGlfdG9jX2VudHJ5ICoqZW50KQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhdGFwaV90b2MgKnRvYyA9IGluZm8tPnRvYzsKKwlpbnQgbnRyYWNrczsKKworCS8qCisJICogZG9uJ3Qgc2VydmUgY2FjaGVkIGRhdGEsIGlmIHRoZSB0b2MgaXNuJ3QgdmFsaWQKKwkgKi8KKwlpZiAoIUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+dG9jX3ZhbGlkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENoZWNrIHZhbGlkaXR5IG9mIHJlcXVlc3RlZCB0cmFjayBudW1iZXIuICovCisJbnRyYWNrcyA9IHRvYy0+aGRyLmxhc3RfdHJhY2sgLSB0b2MtPmhkci5maXJzdF90cmFjayArIDE7CisJaWYgKHRvYy0+aGRyLmZpcnN0X3RyYWNrID09IENEUk9NX0xFQURPVVQpIG50cmFja3MgPSAwOworCWlmICh0cmFjayA9PSBDRFJPTV9MRUFET1VUKQorCQkqZW50ID0gJnRvYy0+ZW50W250cmFja3NdOworCWVsc2UgaWYgKHRyYWNrIDwgdG9jLT5oZHIuZmlyc3RfdHJhY2sgfHwKKwkJIHRyYWNrID4gdG9jLT5oZHIubGFzdF90cmFjaykKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQkqZW50ID0gJnRvYy0+ZW50W3RyYWNrIC0gdG9jLT5oZHIuZmlyc3RfdHJhY2tdOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBnZW5lcmljIHBhY2tldCBpbnRlcmZhY2UgdG8gY2Ryb20uYyAqLworc3RhdGljIGludCBpZGVfY2Ryb21fcGFja2V0KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJICAgIHN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQoreworCXN0cnVjdCByZXF1ZXN0IHJlcTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSAoaWRlX2RyaXZlX3QqKSBjZGktPmhhbmRsZTsKKworCWlmIChjZ2MtPnRpbWVvdXQgPD0gMCkKKwkJY2djLT50aW1lb3V0ID0gQVRBUElfV0FJVF9QQzsKKworCS8qIGhlcmUgd2UgcXVldWUgdGhlIGNvbW1hbmRzIGZyb20gdGhlIHVuaWZvcm0gQ0QtUk9NCisJICAgbGF5ZXIuIHRoZSBwYWNrZXQgbXVzdCBiZSBjb21wbGV0ZSwgYXMgd2UgZG8gbm90CisJICAgdG91Y2ggaXQgYXQgYWxsLiAqLworCWNkcm9tX3ByZXBhcmVfcmVxdWVzdChkcml2ZSwgJnJlcSk7CisJbWVtY3B5KHJlcS5jbWQsIGNnYy0+Y21kLCBDRFJPTV9QQUNLRVRfU0laRSk7CisJaWYgKGNnYy0+c2Vuc2UpCisJCW1lbXNldChjZ2MtPnNlbnNlLCAwLCBzaXplb2Yoc3RydWN0IHJlcXVlc3Rfc2Vuc2UpKTsKKwlyZXEuZGF0YSA9IGNnYy0+YnVmZmVyOworCXJlcS5kYXRhX2xlbiA9IGNnYy0+YnVmbGVuOworCXJlcS50aW1lb3V0ID0gY2djLT50aW1lb3V0OworCisJaWYgKGNnYy0+cXVpZXQpCisJCXJlcS5mbGFncyB8PSBSRVFfUVVJRVQ7CisKKwlyZXEuc2Vuc2UgPSBjZ2MtPnNlbnNlOworCWNnYy0+c3RhdCA9IGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGRyaXZlLCAmcmVxKTsKKwlpZiAoIWNnYy0+c3RhdCkKKwkJY2djLT5idWZsZW4gLT0gcmVxLmRhdGFfbGVuOworCXJldHVybiBjZ2MtPnN0YXQ7Cit9CisKK3N0YXRpYworaW50IGlkZV9jZHJvbV9kZXZfaW9jdGwgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJY2hhciBidWZmZXJbMTZdOworCWludCBzdGF0OworCisJaW5pdF9jZHJvbV9jb21tYW5kKCZjZ2MsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIENHQ19EQVRBX1VOS05PV04pOworCisJLyogVGhlc2Ugd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBVbmlmb3JtIGxheWVyIHNob3J0bHkuLi4gKi8KKwlzd2l0Y2ggKGNtZCkgeworIAljYXNlIENEUk9NU0VUU1BJTkRPV046IHsKKyAJCWNoYXIgc3BpbmRvd247CisgCisgCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwaW5kb3duLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY2hhcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgCisgICAgICAgICAgICAgICAgaWYgKChzdGF0ID0gY2Ryb21fbW9kZV9zZW5zZShjZGksICZjZ2MsIEdQTU9ERV9DRFJPTV9QQUdFLCAwKSkpCisJCQlyZXR1cm4gc3RhdDsKKworIAkJYnVmZmVyWzExXSA9IChidWZmZXJbMTFdICYgMHhmMCkgfCAoc3BpbmRvd24gJiAweDBmKTsKKworIAkJcmV0dXJuIGNkcm9tX21vZGVfc2VsZWN0KGNkaSwgJmNnYyk7CisgCX0gCisgCisgCWNhc2UgQ0RST01HRVRTUElORE9XTjogeworIAkJY2hhciBzcGluZG93bjsKKyAKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXQgPSBjZHJvbV9tb2RlX3NlbnNlKGNkaSwgJmNnYywgR1BNT0RFX0NEUk9NX1BBR0UsIDApKSkKKwkJCXJldHVybiBzdGF0OworIAorIAkJc3BpbmRvd24gPSBidWZmZXJbMTFdICYgMHgwZjsKKyAKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmc3BpbmRvd24sIHNpemVvZiAoY2hhcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgCisgCQlyZXR1cm4gMDsKKyAJfQorICAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK30KKworc3RhdGljCitpbnQgaWRlX2Nkcm9tX2F1ZGlvX2lvY3RsIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKKwkJCSAgIAoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IChpZGVfZHJpdmVfdCopIGNkaS0+aGFuZGxlOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWludCBzdGF0OworCisJc3dpdGNoIChjbWQpIHsKKwkvKgorCSAqIGVtdWxhdGUgUExBWV9BVURJT19USSBjb21tYW5kIHdpdGggUExBWV9BVURJT18xMCwgc2luY2UKKwkgKiBhdGFwaSBkb2Vzbid0IHN1cHBvcnQgaXQKKwkgKi8KKwljYXNlIENEUk9NUExBWVRSS0lORDogeworCQl1bnNpZ25lZCBsb25nIGxiYV9zdGFydCwgbGJhX2VuZDsKKwkJc3RydWN0IGNkcm9tX3RpICp0aSA9IChzdHJ1Y3QgY2Ryb21fdGkgKilhcmc7CisJCXN0cnVjdCBhdGFwaV90b2NfZW50cnkgKmZpcnN0X3RvYywgKmxhc3RfdG9jOworCisJCXN0YXQgPSBjZHJvbV9nZXRfdG9jX2VudHJ5KGRyaXZlLCB0aS0+Y2R0aV90cmswLCAmZmlyc3RfdG9jKTsKKwkJaWYgKHN0YXQpCisJCQlyZXR1cm4gc3RhdDsKKworCQlzdGF0ID0gY2Ryb21fZ2V0X3RvY19lbnRyeShkcml2ZSwgdGktPmNkdGlfdHJrMSwgJmxhc3RfdG9jKTsKKwkJaWYgKHN0YXQpCisJCQlyZXR1cm4gc3RhdDsKKworCQlpZiAodGktPmNkdGlfdHJrMSAhPSBDRFJPTV9MRUFET1VUKQorCQkJKytsYXN0X3RvYzsKKwkJbGJhX3N0YXJ0ID0gZmlyc3RfdG9jLT5hZGRyLmxiYTsKKwkJbGJhX2VuZCAgID0gbGFzdF90b2MtPmFkZHIubGJhOworCisJCWlmIChsYmFfZW5kIDw9IGxiYV9zdGFydCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBjZHJvbV9wbGF5X2F1ZGlvKGRyaXZlLCBsYmFfc3RhcnQsIGxiYV9lbmQpOworCX0KKworCWNhc2UgQ0RST01SRUFEVE9DSERSOiB7CisJCXN0cnVjdCBjZHJvbV90b2NoZHIgKnRvY2hkciA9IChzdHJ1Y3QgY2Ryb21fdG9jaGRyICopIGFyZzsKKwkJc3RydWN0IGF0YXBpX3RvYyAqdG9jOworCisJCS8qIE1ha2Ugc3VyZSBvdXIgc2F2ZWQgVE9DIGlzIHZhbGlkLiAqLworCQlzdGF0ID0gY2Ryb21fcmVhZF90b2MoZHJpdmUsIE5VTEwpOworCQlpZiAoc3RhdCkgcmV0dXJuIHN0YXQ7CisKKwkJdG9jID0gaW5mby0+dG9jOworCQl0b2NoZHItPmNkdGhfdHJrMCA9IHRvYy0+aGRyLmZpcnN0X3RyYWNrOworCQl0b2NoZHItPmNkdGhfdHJrMSA9IHRvYy0+aGRyLmxhc3RfdHJhY2s7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBDRFJPTVJFQURUT0NFTlRSWTogeworCQlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgKnRvY2VudHJ5ID0gKHN0cnVjdCBjZHJvbV90b2NlbnRyeSopIGFyZzsKKwkJc3RydWN0IGF0YXBpX3RvY19lbnRyeSAqdG9jZTsKKworCQlzdGF0ID0gY2Ryb21fZ2V0X3RvY19lbnRyeShkcml2ZSwgdG9jZW50cnktPmNkdGVfdHJhY2ssICZ0b2NlKTsKKwkJaWYgKHN0YXQpIHJldHVybiBzdGF0OworCisJCXRvY2VudHJ5LT5jZHRlX2N0cmwgPSB0b2NlLT5jb250cm9sOworCQl0b2NlbnRyeS0+Y2R0ZV9hZHIgID0gdG9jZS0+YWRyOworCQlpZiAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgeworCQkJbGJhX3RvX21zZiAodG9jZS0+YWRkci5sYmEsCisJCQkJICAgJnRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKKwkJCQkgICAmdG9jZW50cnktPmNkdGVfYWRkci5tc2Yuc2Vjb25kLAorCQkJCSAgICZ0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5mcmFtZSk7CisJCX0gZWxzZQorCQkJdG9jZW50cnktPmNkdGVfYWRkci5sYmEgPSB0b2NlLT5hZGRyLmxiYTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYworaW50IGlkZV9jZHJvbV9yZXNldCAoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gKGlkZV9kcml2ZV90KikgY2RpLT5oYW5kbGU7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CisJc3RydWN0IHJlcXVlc3QgcmVxOworCWludCByZXQ7CisKKwljZHJvbV9wcmVwYXJlX3JlcXVlc3QoZHJpdmUsICZyZXEpOworCXJlcS5mbGFncyA9IFJFUV9TUEVDSUFMIHwgUkVRX1FVSUVUOworCXJldCA9IGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsICZyZXEsIGlkZV93YWl0KTsKKworCS8qCisJICogQSByZXNldCB3aWxsIHVubG9jayB0aGUgZG9vci4gSWYgaXQgd2FzIHByZXZpb3VzbHkgbG9ja2VkLAorCSAqIGxvY2sgaXQgYWdhaW4uCisJICovCisJaWYgKENEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+ZG9vcl9sb2NrZWQpCisJCSh2b2lkKSBjZHJvbV9sb2NrZG9vcihkcml2ZSwgMSwgJnNlbnNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljCitpbnQgaWRlX2Nkcm9tX3RyYXlfbW92ZSAoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBwb3NpdGlvbikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSAoaWRlX2RyaXZlX3QqKSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKKworCWlmIChwb3NpdGlvbikgeworCQlpbnQgc3RhdCA9IGNkcm9tX2xvY2tkb29yKGRyaXZlLCAwLCAmc2Vuc2UpOworCQlpZiAoc3RhdCkgcmV0dXJuIHN0YXQ7CisJfQorCisJcmV0dXJuIGNkcm9tX2VqZWN0KGRyaXZlLCAhcG9zaXRpb24sICZzZW5zZSk7Cit9CisKK3N0YXRpYworaW50IGlkZV9jZHJvbV9sb2NrX2Rvb3IgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgbG9jaykKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSAoaWRlX2RyaXZlX3QqKSBjZGktPmhhbmRsZTsKKwlyZXR1cm4gY2Ryb21fbG9ja2Rvb3IoZHJpdmUsIGxvY2ssIE5VTEwpOworfQorCitzdGF0aWMKK2ludCBpZGVfY2Ryb21fc2VsZWN0X3NwZWVkIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgaW50IHNwZWVkKQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IChpZGVfZHJpdmVfdCopIGNkaS0+aGFuZGxlOworCXN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlOworCWludCBzdGF0OworCisJaWYgKChzdGF0ID0gY2Ryb21fc2VsZWN0X3NwZWVkKGRyaXZlLCBzcGVlZCwgJnNlbnNlKSkgPCAwKQorCQlyZXR1cm4gc3RhdDsKKworICAgICAgICBjZGktPnNwZWVkID0gQ0RST01fU1RBVEVfRkxBR1MoZHJpdmUpLT5jdXJyZW50X3NwZWVkOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIGFkZCBsb2dpYyB0byB0cnkgR0VUX0VWRU5UIGNvbW1hbmQgZmlyc3QgdG8gY2hlY2sgZm9yIG1lZGlhIGFuZCB0cmF5CisgKiBzdGF0dXMuIHRoaXMgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBuZXdlciBjZC1yL3cgYW5kIGFsbCBEVkQgZXRjCisgKiBkcml2ZXMKKyAqLworc3RhdGljCitpbnQgaWRlX2Nkcm9tX2RyaXZlX3N0YXR1cyAoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzbG90X25yKQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IChpZGVfZHJpdmVfdCopIGNkaS0+aGFuZGxlOworCXN0cnVjdCBtZWRpYV9ldmVudF9kZXNjIG1lZDsKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKKwlpbnQgc3RhdDsKKworCWlmIChzbG90X25yICE9IENEU0xfQ1VSUkVOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0ID0gY2Ryb21fY2hlY2tfc3RhdHVzKGRyaXZlLCAmc2Vuc2UpOworCWlmICghc3RhdCB8fCBzZW5zZS5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCisJCXJldHVybiBDRFNfRElTQ19PSzsKKworCWlmICghY2Ryb21fZ2V0X21lZGlhX2V2ZW50KGNkaSwgJm1lZCkpIHsKKwkJaWYgKG1lZC5tZWRpYV9wcmVzZW50KQorCQkJcmV0dXJuIENEU19ESVNDX09LOworCQllbHNlIGlmIChtZWQuZG9vcl9vcGVuKQorCQkJcmV0dXJuIENEU19UUkFZX09QRU47CisJCWVsc2UKKwkJCXJldHVybiBDRFNfTk9fRElTQzsKKwl9CisKKwlpZiAoc2Vuc2Uuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSAmJiBzZW5zZS5hc2MgPT0gMHgwNCAmJiBzZW5zZS5hc2NxID09IDB4MDQpCisJCXJldHVybiBDRFNfRElTQ19PSzsKKworCS8qCisJICogSWYgbm90IHVzaW5nIE10IEZ1amkgZXh0ZW5kZWQgbWVkaWEgdHJheSByZXBvcnRzLAorCSAqIGp1c3QgcmV0dXJuIFRSQVlfT1BFTiBzaW5jZSBBVEFQSSBkb2Vzbid0IHByb3ZpZGUKKwkgKiBhbnkgb3RoZXIgd2F5IHRvIGRldGVjdCB0aGlzLi4uCisJICovCisJaWYgKHNlbnNlLnNlbnNlX2tleSA9PSBOT1RfUkVBRFkpIHsKKwkJaWYgKHNlbnNlLmFzYyA9PSAweDNhKSB7CisJCQlpZiAoc2Vuc2UuYXNjcSA9PSAxKQorCQkJCXJldHVybiBDRFNfTk9fRElTQzsKKwkJCWVsc2UgaWYgKHNlbnNlLmFzY3EgPT0gMCB8fCBzZW5zZS5hc2NxID09IDIpCisJCQkJcmV0dXJuIENEU19UUkFZX09QRU47CisJCX0KKwl9CisKKwlyZXR1cm4gQ0RTX0RSSVZFX05PVF9SRUFEWTsKK30KKworc3RhdGljCitpbnQgaWRlX2Nkcm9tX2dldF9sYXN0X3Nlc3Npb24gKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gKm1zX2luZm8pCit7CisJc3RydWN0IGF0YXBpX3RvYyAqdG9jOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IChpZGVfZHJpdmVfdCopIGNkaS0+aGFuZGxlOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlOworCWludCByZXQ7CisKKwlpZiAoIUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+dG9jX3ZhbGlkIHx8IGluZm8tPnRvYyA9PSBOVUxMKQorCQlpZiAoKHJldCA9IGNkcm9tX3JlYWRfdG9jKGRyaXZlLCAmc2Vuc2UpKSkKKwkJCXJldHVybiByZXQ7CisKKwl0b2MgPSBpbmZvLT50b2M7CisJbXNfaW5mby0+YWRkci5sYmEgPSB0b2MtPmxhc3Rfc2Vzc2lvbl9sYmE7CisJbXNfaW5mby0+eGFfZmxhZyA9IHRvYy0+eGFfZmxhZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMKK2ludCBpZGVfY2Ryb21fZ2V0X21jbiAoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCSAgICAgICBzdHJ1Y3QgY2Ryb21fbWNuICptY25faW5mbykKK3sKKwlpbnQgc3RhdDsKKwljaGFyIG1jbmJ1ZlsyNF07CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gKGlkZV9kcml2ZV90KikgY2RpLT5oYW5kbGU7CisKKy8qIGdldCBNQ04gKi8KKwlpZiAoKHN0YXQgPSBjZHJvbV9yZWFkX3N1YmNoYW5uZWwoZHJpdmUsIDIsIG1jbmJ1Ziwgc2l6ZW9mIChtY25idWYpLCBOVUxMKSkpCisJCXJldHVybiBzdGF0OworCisJbWVtY3B5IChtY25faW5mby0+bWVkaXVtX2NhdGFsb2dfbnVtYmVyLCBtY25idWYrOSwKKwkJc2l6ZW9mIChtY25faW5mby0+bWVkaXVtX2NhdGFsb2dfbnVtYmVyKS0xKTsKKwltY25faW5mby0+bWVkaXVtX2NhdGFsb2dfbnVtYmVyW3NpemVvZiAobWNuX2luZm8tPm1lZGl1bV9jYXRhbG9nX251bWJlciktMV0KKwkJPSAnXDAnOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3RoZXIgZHJpdmVyIHJlcXVlc3RzIChvcGVuLCBjbG9zZSwgY2hlY2sgbWVkaWEgY2hhbmdlKS4KKyAqLworCitzdGF0aWMKK2ludCBpZGVfY2Ryb21fY2hlY2tfbWVkaWFfY2hhbmdlX3JlYWwgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCSAgICAgICBpbnQgc2xvdF9ucikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSAoaWRlX2RyaXZlX3QqKSBjZGktPmhhbmRsZTsKKwlpbnQgcmV0dmFsOworCQorCWlmIChzbG90X25yID09IENEU0xfQ1VSUkVOVCkgeworCQkodm9pZCkgY2Ryb21fY2hlY2tfc3RhdHVzKGRyaXZlLCBOVUxMKTsKKwkJcmV0dmFsID0gQ0RST01fU1RBVEVfRkxBR1MoZHJpdmUpLT5tZWRpYV9jaGFuZ2VkOworCQlDRFJPTV9TVEFURV9GTEFHUyhkcml2ZSktPm1lZGlhX2NoYW5nZWQgPSAwOworCQlyZXR1cm4gcmV0dmFsOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMKK2ludCBpZGVfY2Ryb21fb3Blbl9yZWFsIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgaW50IHB1cnBvc2UpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9zZSBkb3duIHRoZSBkZXZpY2UuICBJbnZhbGlkYXRlIGFsbCBjYWNoZWQgYmxvY2tzLgorICovCisKK3N0YXRpYwordm9pZCBpZGVfY2Ryb21fcmVsZWFzZV9yZWFsIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSkKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBjZGktPmhhbmRsZTsKKworCWlmICghY2RpLT51c2VfY291bnQpCisJCUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+dG9jX3ZhbGlkID0gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyBpZGVfY2Ryb21fZG9wcyA9IHsKKwkub3BlbgkJCT0gaWRlX2Nkcm9tX29wZW5fcmVhbCwKKwkucmVsZWFzZQkJPSBpZGVfY2Ryb21fcmVsZWFzZV9yZWFsLAorCS5kcml2ZV9zdGF0dXMJCT0gaWRlX2Nkcm9tX2RyaXZlX3N0YXR1cywKKwkubWVkaWFfY2hhbmdlZAkJPSBpZGVfY2Ryb21fY2hlY2tfbWVkaWFfY2hhbmdlX3JlYWwsCisJLnRyYXlfbW92ZQkJPSBpZGVfY2Ryb21fdHJheV9tb3ZlLAorCS5sb2NrX2Rvb3IJCT0gaWRlX2Nkcm9tX2xvY2tfZG9vciwKKwkuc2VsZWN0X3NwZWVkCQk9IGlkZV9jZHJvbV9zZWxlY3Rfc3BlZWQsCisJLmdldF9sYXN0X3Nlc3Npb24JPSBpZGVfY2Ryb21fZ2V0X2xhc3Rfc2Vzc2lvbiwKKwkuZ2V0X21jbgkJPSBpZGVfY2Ryb21fZ2V0X21jbiwKKwkucmVzZXQJCQk9IGlkZV9jZHJvbV9yZXNldCwKKwkuYXVkaW9faW9jdGwJCT0gaWRlX2Nkcm9tX2F1ZGlvX2lvY3RsLAorCS5kZXZfaW9jdGwJCT0gaWRlX2Nkcm9tX2Rldl9pb2N0bCwKKwkuY2FwYWJpbGl0eQkJPSBDRENfQ0xPU0VfVFJBWSB8IENEQ19PUEVOX1RSQVkgfCBDRENfTE9DSyB8CisJCQkJQ0RDX1NFTEVDVF9TUEVFRCB8IENEQ19TRUxFQ1RfRElTQyB8CisJCQkJQ0RDX01VTFRJX1NFU1NJT04gfCBDRENfTUNOIHwKKwkJCQlDRENfTUVESUFfQ0hBTkdFRCB8IENEQ19QTEFZX0FVRElPIHwgQ0RDX1JFU0VUIHwKKwkJCQlDRENfSU9DVExTIHwgQ0RDX0RSSVZFX1NUQVRVUyB8IENEQ19DRF9SIHwKKwkJCQlDRENfQ0RfUlcgfCBDRENfRFZEIHwgQ0RDX0RWRF9SfCBDRENfRFZEX1JBTSB8CisJCQkJQ0RDX0dFTkVSSUNfUEFDS0VUIHwgQ0RDX01PX0RSSVZFIHwgQ0RDX01SVyB8CisJCQkJQ0RDX01SV19XIHwgQ0RDX1JBTSwKKwkuZ2VuZXJpY19wYWNrZXQJCT0gaWRlX2Nkcm9tX3BhY2tldCwKK307CisKK3N0YXRpYyBpbnQgaWRlX2Nkcm9tX3JlZ2lzdGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBuc2xvdHMpCit7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpkZXZpbmZvID0gJmluZm8tPmRldmluZm87CisKKwlkZXZpbmZvLT5vcHMgPSAmaWRlX2Nkcm9tX2RvcHM7CisJZGV2aW5mby0+bWFzayA9IDA7CisJZGV2aW5mby0+c3BlZWQgPSBDRFJPTV9TVEFURV9GTEFHUyhkcml2ZSktPmN1cnJlbnRfc3BlZWQ7CisJZGV2aW5mby0+Y2FwYWNpdHkgPSBuc2xvdHM7CisJZGV2aW5mby0+aGFuZGxlID0gKHZvaWQgKikgZHJpdmU7CisJc3RyY3B5KGRldmluZm8tPm5hbWUsIGRyaXZlLT5uYW1lKTsKKwkKKwkvKiBzZXQgY2FwYWJpbGl0eSBtYXNrIHRvIG1hdGNoIHRoZSBwcm9iZS4gKi8KKwlpZiAoIUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmNkX3IpCisJCWRldmluZm8tPm1hc2sgfD0gQ0RDX0NEX1I7CisJaWYgKCFDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jZF9ydykKKwkJZGV2aW5mby0+bWFzayB8PSBDRENfQ0RfUlc7CisJaWYgKCFDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kdmQpCisJCWRldmluZm8tPm1hc2sgfD0gQ0RDX0RWRDsKKwlpZiAoIUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZF9yKQorCQlkZXZpbmZvLT5tYXNrIHw9IENEQ19EVkRfUjsKKwlpZiAoIUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZF9yYW0pCisJCWRldmluZm8tPm1hc2sgfD0gQ0RDX0RWRF9SQU07CisJaWYgKCFDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5pc19jaGFuZ2VyKQorCQlkZXZpbmZvLT5tYXNrIHw9IENEQ19TRUxFQ1RfRElTQzsKKwlpZiAoIUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmF1ZGlvX3BsYXkpCisJCWRldmluZm8tPm1hc2sgfD0gQ0RDX1BMQVlfQVVESU87CisJaWYgKCFDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jbG9zZV90cmF5KQorCQlkZXZpbmZvLT5tYXNrIHw9IENEQ19DTE9TRV9UUkFZOworCWlmICghQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bW9fZHJpdmUpCisJCWRldmluZm8tPm1hc2sgfD0gQ0RDX01PX0RSSVZFOworCisJZGV2aW5mby0+ZGlzayA9IGluZm8tPmRpc2s7CisJcmV0dXJuIHJlZ2lzdGVyX2Nkcm9tKGRldmluZm8pOworfQorCitzdGF0aWMKK2ludCBpZGVfY2Ryb21fZ2V0X2NhcGFiaWxpdGllcyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBhdGFwaV9jYXBhYmlsaXRpZXNfcGFnZSAqY2FwKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpID0gJmluZm8tPmRldmluZm87CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgc3RhdCwgYXR0ZW1wdHMgPSAzLCBzaXplID0gc2l6ZW9mKCpjYXApOworCisJLyoKKwkgKiBBQ0VSNTAgKGFuZCBvdGhlcnM/KSByZXF1aXJlIHRoZSBmdWxsIHNwZWMgbGVuZ3RoIG1vZGUgc2Vuc2UKKwkgKiBwYWdlIGNhcGFiaWxpdGllcyBzaXplLCBidXQgb2xkZXIgZHJpdmVzIGJyZWFrLgorCSAqLworCWlmICghKCFzdHJjbXAoZHJpdmUtPmlkLT5tb2RlbCwgIkFUQVBJIENEIFJPTSBEUklWRSA1MFggTUFYIikgfHwKKwkgICAgIXN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiV1BJIENEUy0zMlgiKSkpCisJCXNpemUgLT0gc2l6ZW9mKGNhcC0+cGFkKTsKKworCWluaXRfY2Ryb21fY29tbWFuZCgmY2djLCBjYXAsIHNpemUsIENHQ19EQVRBX1VOS05PV04pOworCWRvIHsgLyogd2Ugc2VlbSB0byBnZXQgc3RhdD0weDAxLGVycj0weDAwIHRoZSBmaXJzdCB0aW1lICg/PykgKi8KKwkJc3RhdCA9IGNkcm9tX21vZGVfc2Vuc2UoY2RpLCAmY2djLCBHUE1PREVfQ0FQQUJJTElUSUVTX1BBR0UsIDApOworCQlpZiAoIXN0YXQpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWF0dGVtcHRzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljCitpbnQgaWRlX2Nkcm9tX3Byb2JlX2NhcGFiaWxpdGllcyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpID0gJmluZm8tPmRldmluZm87CisJc3RydWN0IGF0YXBpX2NhcGFiaWxpdGllc19wYWdlIGNhcDsKKwlpbnQgbnNsb3RzID0gMTsKKworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpIHsKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bW9fZHJpdmUgPSAxOworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5yYW0gPSAxOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBVEFQSSBtYWduZXRvLW9wdGljYWwgZHJpdmVcbiIsIGRyaXZlLT5uYW1lKTsKKwkJcmV0dXJuIG5zbG90czsKKwl9CisKKwlpZiAoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bmVjMjYwIHx8CisJICAgICFzdHJjbXAoZHJpdmUtPmlkLT5tb2RlbCwiU1RJTkdSQVkgODQyMiBJREUgOFggQ0QtUk9NIDctMjctOTUiKSkgeworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5ub19lamVjdCA9IDA7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmF1ZGlvX3BsYXkgPSAxOworCQlyZXR1cm4gbnNsb3RzOworCX0KKworCS8qCisJICogd2UgaGF2ZSB0byBjaGVhdCBhIGxpdHRsZSBoZXJlLiB0aGUgcGFja2V0IHdpbGwgZXZlbnR1YWxseQorCSAqIGJlIHF1ZXVlZCB3aXRoIGlkZV9jZHJvbV9wYWNrZXQoKSwgd2hpY2ggZXh0cmFjdHMgdGhlCisJICogZHJpdmUgZnJvbSBjZGktPmhhbmRsZS4gU2luY2UgdGhpcyBkZXZpY2UgaGFzbid0IGJlZW4KKwkgKiByZWdpc3RlcmVkIHdpdGggdGhlIFVuaWZvcm0gbGF5ZXIgeWV0LCBpdCBjYW4ndCBkbyB0aGlzLgorCSAqIFNhbWUgZ29lcyBmb3IgY2RpLT5vcHMuCisJICovCisJY2RpLT5oYW5kbGUgPSAoaWRlX2RyaXZlX3QgKikgZHJpdmU7CisJY2RpLT5vcHMgPSAmaWRlX2Nkcm9tX2RvcHM7CisKKwlpZiAoaWRlX2Nkcm9tX2dldF9jYXBhYmlsaXRpZXMoZHJpdmUsICZjYXApKQorCQlyZXR1cm4gMDsKKworCWlmIChjYXAubG9jayA9PSAwKQorCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5ub19kb29ybG9jayA9IDE7CisJaWYgKGNhcC5lamVjdCkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bm9fZWplY3QgPSAwOworCWlmIChjYXAuY2Rfcl93cml0ZSkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2RfciA9IDE7CisJaWYgKGNhcC5jZF9yd193cml0ZSkgeworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jZF9ydyA9IDE7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnJhbSA9IDE7CisJfQorCWlmIChjYXAudGVzdF93cml0ZSkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+dGVzdF93cml0ZSA9IDE7CisJaWYgKGNhcC5kdmRfcmFtX3JlYWQgfHwgY2FwLmR2ZF9yX3JlYWQgfHwgY2FwLmR2ZF9yb20pCisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZCA9IDE7CisJaWYgKGNhcC5kdmRfcmFtX3dyaXRlKSB7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZF9yYW0gPSAxOworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5yYW0gPSAxOworCX0KKwlpZiAoY2FwLmR2ZF9yX3dyaXRlKQorCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kdmRfciA9IDE7CisJaWYgKGNhcC5hdWRpb19wbGF5KQorCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5hdWRpb19wbGF5ID0gMTsKKwlpZiAoY2FwLm1lY2h0eXBlID09IG1lY2h0eXBlX2NhZGR5IHx8IGNhcC5tZWNodHlwZSA9PSBtZWNodHlwZV9wb3B1cCkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2xvc2VfdHJheSA9IDA7CisKKwkvKiBTb21lIGRyaXZlcyB1c2VkIGJ5IEFwcGxlIGRvbid0IGFkdmVydGlzZSBhdWRpbyBwbGF5CisJICogYnV0IHRoZXkgZG8gc3VwcG9ydCByZWFkaW5nIFRPQyAmIGF1ZGlvIGRhdGFzCisJICovCisJaWYgKHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiTUFUU0hJVEFEVkQtUk9NIFNSLTgxODciKSA9PSAwIHx8CisJICAgIHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiTUFUU0hJVEFEVkQtUk9NIFNSLTgxODYiKSA9PSAwIHx8CisJICAgIHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiTUFUU0hJVEFEVkQtUk9NIFNSLTgxNzYiKSA9PSAwIHx8CisJICAgIHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiTUFUU0hJVEFEVkQtUk9NIFNSLTgxNzQiKSA9PSAwKQorCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5hdWRpb19wbGF5ID0gMTsKKworI2lmICEgU1RBTkRBUkRfQVRBUEkKKwlpZiAoY2RpLT5zYW55b19zbG90ID4gMCkgeworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5pc19jaGFuZ2VyID0gMTsKKwkJbnNsb3RzID0gMzsKKwl9CisKKwllbHNlCisjZW5kaWYgLyogbm90IFNUQU5EQVJEX0FUQVBJICovCisJaWYgKGNhcC5tZWNodHlwZSA9PSBtZWNodHlwZV9pbmRpdmlkdWFsX2NoYW5nZXIgfHwKKwkgICAgY2FwLm1lY2h0eXBlID09IG1lY2h0eXBlX2NhcnRyaWRnZV9jaGFuZ2VyKSB7CisJCWlmICgobnNsb3RzID0gY2Ryb21fbnVtYmVyX29mX3Nsb3RzKGNkaSkpID4gMSkgeworCQkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+aXNfY2hhbmdlciA9IDE7CisJCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5zdXBwX2Rpc2NfcHJlc2VudCA9IDE7CisJCX0KKwl9CisKKwkvKiBUaGUgQUNFUi9BT3BlbiAyNFggY2Ryb20gaGFzIHRoZSBzcGVlZCBmaWVsZHMgYnl0ZS1zd2FwcGVkICovCisJaWYgKCFkcml2ZS0+aWQtPm1vZGVsWzBdICYmCisJICAgICFzdHJuY21wKGRyaXZlLT5pZC0+ZndfcmV2LCAiMjQxTiIsIDQpKSB7CisJCUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+Y3VycmVudF9zcGVlZCAgPSAKKwkJCSgoKHVuc2lnbmVkIGludCljYXAuY3Vyc3BlZWQpICsgKDE3Ni8yKSkgLyAxNzY7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPm1heF9zcGVlZCA9IAorCQkJKCgodW5zaWduZWQgaW50KWNhcC5tYXhzcGVlZCkgKyAoMTc2LzIpKSAvIDE3NjsKKwl9IGVsc2UgeworCQlDRFJPTV9TVEFURV9GTEFHUyhkcml2ZSktPmN1cnJlbnRfc3BlZWQgID0gCisJCQkobnRvaHMoY2FwLmN1cnNwZWVkKSArICgxNzYvMikpIC8gMTc2OworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5tYXhfc3BlZWQgPSAKKwkJCShudG9ocyhjYXAubWF4c3BlZWQpICsgKDE3Ni8yKSkgLyAxNzY7CisJfQorCisJLyogZG9uJ3QgcHJpbnQgc3BlZWQgaWYgdGhlIGRyaXZlIHJlcG9ydGVkIDAuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFUQVBJIiwgZHJpdmUtPm5hbWUpOworCWlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5tYXhfc3BlZWQpCisJCXByaW50aygiICVkWCIsIENEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPm1heF9zcGVlZCk7CisJcHJpbnRrKCIgJXMiLCBDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kdmQgPyAiRFZELVJPTSIgOiAiQ0QtUk9NIik7CisKKwlpZiAoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+ZHZkX3J8Q0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+ZHZkX3JhbSkKKyAgICAgICAgCXByaW50aygiIERWRCVzJXMiLCAKKyAgICAgICAgCShDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kdmRfcik/ICItUiIgOiAiIiwgCisgICAgICAgIAkoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+ZHZkX3JhbSk/ICItUkFNIiA6ICIiKTsKKworICAgICAgICBpZiAoQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2RfcnxDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jZF9ydykgCisgICAgICAgIAlwcmludGsoIiBDRCVzJXMiLCAKKyAgICAgICAgCShDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jZF9yKT8gIi1SIiA6ICIiLCAKKyAgICAgICAgCShDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5jZF9ydyk/ICIvUlciIDogIiIpOworCisgICAgICAgIGlmIChDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5pc19jaGFuZ2VyKSAKKyAgICAgICAgCXByaW50aygiIGNoYW5nZXIgdy8lZCBzbG90cyIsIG5zbG90cyk7CisgICAgICAgIGVsc2UgCQorICAgICAgICAJcHJpbnRrKCIgZHJpdmUiKTsKKworCXByaW50aygiLCAlZGtCIENhY2hlIiwgYmUxNl90b19jcHUoY2FwLmJ1ZmZlcl9zaXplKSk7CisKKwlpZiAoZHJpdmUtPnVzaW5nX2RtYSkKKwkJaWRlX2RtYV92ZXJib3NlKGRyaXZlKTsKKworCXByaW50aygiXG4iKTsKKworCXJldHVybiBuc2xvdHM7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9jZHJvbV9hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImRzY19vdmVybGFwIiwJCVNFVFRJTkdfUlcsIC0xLCAtMSwgVFlQRV9CWVRFLCAwLCAxLCAxLAkxLCAmZHJpdmUtPmRzY19vdmVybGFwLCBOVUxMKTsKK30KKworLyoKKyAqIHN0YW5kYXJkIHByZXBfcnFfZm4gdGhhdCBidWlsZHMgMTAgYnl0ZSBjbWRzCisgKi8KK3N0YXRpYyBpbnQgaWRlX2Nkcm9tX3ByZXBfZnMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaW50IGhhcmRfc2VjdCA9IHF1ZXVlX2hhcmRzZWN0X3NpemUocSk7CisJbG9uZyBibG9jayA9IChsb25nKXJxLT5oYXJkX3NlY3RvciAvIChoYXJkX3NlY3QgPj4gOSk7CisJdW5zaWduZWQgbG9uZyBibG9ja3MgPSBycS0+aGFyZF9ucl9zZWN0b3JzIC8gKGhhcmRfc2VjdCA+PiA5KTsKKworCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEKQorCQlycS0+Y21kWzBdID0gR1BDTURfUkVBRF8xMDsKKwllbHNlCisJCXJxLT5jbWRbMF0gPSBHUENNRF9XUklURV8xMDsKKworCS8qCisJICogZmlsbCBpbiBsYmEKKwkgKi8KKwlycS0+Y21kWzJdID0gKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJcnEtPmNtZFszXSA9IChibG9jayA+PiAxNikgJiAweGZmOworCXJxLT5jbWRbNF0gPSAoYmxvY2sgPj4gIDgpICYgMHhmZjsKKwlycS0+Y21kWzVdID0gYmxvY2sgJiAweGZmOworCisJLyoKKwkgKiBhbmQgdHJhbnNmZXIgbGVuZ3RoCisJICovCisJcnEtPmNtZFs3XSA9IChibG9ja3MgPj4gOCkgJiAweGZmOworCXJxLT5jbWRbOF0gPSBibG9ja3MgJiAweGZmOworCXJxLT5jbWRfbGVuID0gMTA7CisJcmV0dXJuIEJMS1BSRVBfT0s7Cit9CisKKy8qCisgKiBNb3N0IG9mIHRoZSBTQ1NJIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQgZGlyZWN0bHkgYnkgQVRBUEkgZGV2aWNlcy4KKyAqIFRoaXMgdHJhbnNmb3JtIGhhbmRsZXMgdGhlIGZldyBleGNlcHRpb25zLgorICovCitzdGF0aWMgaW50IGlkZV9jZHJvbV9wcmVwX3BjKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwl1OCAqYyA9IHJxLT5jbWQ7CisKKwkvKgorCSAqIFRyYW5zZm9ybSA2LWJ5dGUgcmVhZC93cml0ZSBjb21tYW5kcyB0byB0aGUgMTAtYnl0ZSB2ZXJzaW9uCisJICovCisJaWYgKGNbMF0gPT0gUkVBRF82IHx8IGNbMF0gPT0gV1JJVEVfNikgeworCQljWzhdID0gY1s0XTsKKwkJY1s1XSA9IGNbM107CisJCWNbNF0gPSBjWzJdOworCQljWzNdID0gY1sxXSAmIDB4MWY7CisJCWNbMl0gPSAwOworCQljWzFdICY9IDB4ZTA7CisJCWNbMF0gKz0gKFJFQURfMTAgLSBSRUFEXzYpOworCQlycS0+Y21kX2xlbiA9IDEwOworCQlyZXR1cm4gQkxLUFJFUF9PSzsKKwl9CisKKwkvKgorCSAqIGl0J3Mgc2lsbHkgdG8gcHJldGVuZCB3ZSB1bmRlcnN0YW5kIDYtYnl0ZSBzZW5zZSBjb21tYW5kcywganVzdAorCSAqIHJlamVjdCB3aXRoIElMTEVHQUxfUkVRVUVTVCBhbmQgdGhlIGNhbGxlciBzaG91bGQgdGFrZSB0aGUKKwkgKiBhcHByb3ByaWF0ZSBhY3Rpb24KKwkgKi8KKwlpZiAoY1swXSA9PSBNT0RFX1NFTlNFIHx8IGNbMF0gPT0gTU9ERV9TRUxFQ1QpIHsKKwkJcnEtPmVycm9ycyA9IElMTEVHQUxfUkVRVUVTVDsKKwkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwl9CisJCisJcmV0dXJuIEJMS1BSRVBfT0s7Cit9CisKK3N0YXRpYyBpbnQgaWRlX2Nkcm9tX3ByZXBfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWYgKHJxLT5mbGFncyAmIFJFUV9DTUQpCisJCXJldHVybiBpZGVfY2Ryb21fcHJlcF9mcyhxLCBycSk7CisJZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0JMT0NLX1BDKQorCQlyZXR1cm4gaWRlX2Nkcm9tX3ByZXBfcGMocnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworaW50IGlkZV9jZHJvbV9zZXR1cCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpID0gJmluZm8tPmRldmluZm87CisJaW50IG5zbG90czsKKworCWJsa19xdWV1ZV9wcmVwX3JxKGRyaXZlLT5xdWV1ZSwgaWRlX2Nkcm9tX3ByZXBfZm4pOworCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KGRyaXZlLT5xdWV1ZSwgMzEpOworCWRyaXZlLT5xdWV1ZS0+dW5wbHVnX2RlbGF5ID0gKDEgKiBIWikgLyAxMDAwOworCWlmICghZHJpdmUtPnF1ZXVlLT51bnBsdWdfZGVsYXkpCisJCWRyaXZlLT5xdWV1ZS0+dW5wbHVnX2RlbGF5ID0gMTsKKworCWRyaXZlLT5zcGVjaWFsLmFsbAk9IDA7CisKKwlDRFJPTV9TVEFURV9GTEFHUyhkcml2ZSktPm1lZGlhX2NoYW5nZWQgPSAxOworCUNEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKS0+dG9jX3ZhbGlkICAgICA9IDA7CisJQ0RST01fU1RBVEVfRkxBR1MoZHJpdmUpLT5kb29yX2xvY2tlZCAgID0gMDsKKworI2lmIE5PX0RPT1JfTE9DS0lORworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPm5vX2Rvb3Jsb2NrID0gMTsKKyNlbHNlCisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bm9fZG9vcmxvY2sgPSAwOworI2VuZGlmCisKKwlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5kcnFfaW50ZXJydXB0ID0gKChkcml2ZS0+aWQtPmNvbmZpZyAmIDB4MDA2MCkgPT0gMHgyMCk7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+aXNfY2hhbmdlciA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2RfciA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2RfcncgPSAwOworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnRlc3Rfd3JpdGUgPSAwOworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZCA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+ZHZkX3IgPSAwOworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmR2ZF9yYW0gPSAwOworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPm5vX2VqZWN0ID0gMTsKKwlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5zdXBwX2Rpc2NfcHJlc2VudCA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+YXVkaW9fcGxheSA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+Y2xvc2VfdHJheSA9IDE7CisJCisJLyogbGltaXQgdHJhbnNmZXIgc2l6ZSBwZXIgaW50ZXJydXB0LiAqLworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPmxpbWl0X25mcmFtZXMgPSAwOworCS8qIGEgdGVzdGFtZW50IHRvIHRoZSBuaWNlIHF1YWxpdHkgb2YgU2Ftc3VuZyBkcml2ZXMuLi4gKi8KKwlpZiAoIXN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiU0FNU1VORyBDRC1ST00gU0NSLTI0MzAiKSkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bGltaXRfbmZyYW1lcyA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiU0FNU1VORyBDRC1ST00gU0NSLTI0MzIiKSkKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bGltaXRfbmZyYW1lcyA9IDE7CisJLyogdGhlIDMyMzEgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU0VUX0NEX1NQRUVEIGNvbW1hbmQgKi8KKwllbHNlIGlmICghc3RyY21wKGRyaXZlLT5pZC0+bW9kZWwsICJTQU1TVU5HIENELVJPTSBTQ1ItMzIzMSIpKQorCQljZGktPm1hc2sgfD0gQ0RDX1NFTEVDVF9TUEVFRDsKKworI2lmICEgU1RBTkRBUkRfQVRBUEkKKwkvKiBieSBkZWZhdWx0IFNhbnlvIDMgQ0QgY2hhbmdlciBzdXBwb3J0IGlzIHR1cm5lZCBvZmYgYW5kCisgICAgICAgICAgIEFUQVBJIFJldiAyLjIrIHN0YW5kYXJkIHN1cHBvcnQgZm9yIENEIGNoYW5nZXJzIGlzIHVzZWQgKi8KKwljZGktPnNhbnlvX3Nsb3QgPSAwOworCisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bmVjMjYwID0gMDsKKwlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT50b2N0cmFja3NfYXNfYmNkID0gMDsKKwlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT50b2NhZGRyX2FzX2JjZCA9IDA7CisJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+cGxheW1zZl9hc19iY2QgPSAwOworCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnN1YmNoYW5fYXNfYmNkID0gMDsKKworCWlmIChzdHJjbXAgKGRyaXZlLT5pZC0+bW9kZWwsICJWMDAzUzBEUyIpID09IDAgJiYKKwkgICAgZHJpdmUtPmlkLT5md19yZXZbNF0gPT0gJzEnICYmCisJICAgIGRyaXZlLT5pZC0+ZndfcmV2WzZdIDw9ICcyJykgeworCQkvKiBWZXJ0b3MgMzAwLgorCQkgICBTb21lIHZlcnNpb25zIG9mIHRoaXMgZHJpdmUgbGlrZSB0byB0YWxrIEJDRC4gKi8KKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+dG9jdHJhY2tzX2FzX2JjZCA9IDE7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnRvY2FkZHJfYXNfYmNkID0gMTsKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+cGxheW1zZl9hc19iY2QgPSAxOworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5zdWJjaGFuX2FzX2JjZCA9IDE7CisJfQorCisJZWxzZSBpZiAoc3RyY21wIChkcml2ZS0+aWQtPm1vZGVsLCAiVjAwNkUwRFMiKSA9PSAwICYmCisJICAgIGRyaXZlLT5pZC0+ZndfcmV2WzRdID09ICcxJyAmJgorCSAgICBkcml2ZS0+aWQtPmZ3X3Jldls2XSA8PSAnMicpIHsKKwkJLyogVmVydG9zIDYwMCBFU0QuICovCisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnRvY3RyYWNrc19hc19iY2QgPSAxOworCX0KKwllbHNlIGlmIChzdHJjbXAoZHJpdmUtPmlkLT5tb2RlbCwgIk5FQyBDRC1ST00gRFJJVkU6MjYwIikgPT0gMCAmJgorCQkgc3RybmNtcChkcml2ZS0+aWQtPmZ3X3JldiwgIjEuMDEiLCA0KSA9PSAwKSB7IC8qIEZJWE1FICovCisJCS8qIE9sZCBORUMyNjAgKG5vdCBSKS4KKwkJICAgVGhpcyBkcml2ZSB3YXMgcmVsZWFzZWQgYmVmb3JlIHRoZSAxLjIgdmVyc2lvbgorCQkgICBvZiB0aGUgc3BlYy4gKi8KKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+dG9jYWRkcl9hc19iY2QgPSAxOworCQlDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpLT5wbGF5bXNmX2FzX2JjZCA9IDE7CisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnN1YmNoYW5fYXNfYmNkID0gMTsKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bmVjMjYwICAgICAgICAgPSAxOworCX0KKwllbHNlIGlmIChzdHJjbXAoZHJpdmUtPmlkLT5tb2RlbCwgIldFQVJORVMgQ0RELTEyMCIpID09IDAgJiYKKwkJIHN0cm5jbXAoZHJpdmUtPmlkLT5md19yZXYsICJBMS4xIiwgNCkgPT0gMCkgeyAvKiBGSVhNRSAqLworCQkvKiBXZWFybmVzICovCisJCUNEUk9NX0NPTkZJR19GTEFHUyhkcml2ZSktPnBsYXltc2ZfYXNfYmNkID0gMTsKKwkJQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+c3ViY2hhbl9hc19iY2QgPSAxOworCX0KKyAgICAgICAgLyogU2FueW8gMyBDRCBjaGFuZ2VyIHVzZXMgYSBub24tc3RhbmRhcmQgY29tbWFuZAorICAgICAgICAgICBmb3IgQ0QgY2hhbmdpbmcgKi8KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiQ0QtUk9NIENEUi1DMyBHIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiQ0QtUk9NIENEUi1DM0ciKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGRyaXZlLT5pZC0+bW9kZWwsICJDRC1ST00gQ0RSX0MzNiIpID09IDApKSB7CisgICAgICAgICAgICAgICAgIC8qIHVzZXMgQ0QgaW4gc2xvdCAwIHdoZW4gdmFsdWUgaXMgc2V0IHRvIDMgKi8KKyAgICAgICAgICAgICAgICAgY2RpLT5zYW55b19zbG90ID0gMzsKKyAgICAgICAgfQorI2VuZGlmIC8qIG5vdCBTVEFOREFSRF9BVEFQSSAqLworCisJaW5mby0+dG9jCQk9IE5VTEw7CisJaW5mby0+YnVmZmVyCQk9IE5VTEw7CisJaW5mby0+c2VjdG9yX2J1ZmZlcmVkCT0gMDsKKwlpbmZvLT5uc2VjdG9yc19idWZmZXJlZAk9IDA7CisJaW5mby0+Y2hhbmdlcl9pbmZvICAgICAgPSBOVUxMOworCWluZm8tPmxhc3RfYmxvY2sJPSAwOworCWluZm8tPnN0YXJ0X3NlZWsJPSAwOworCisJbnNsb3RzID0gaWRlX2Nkcm9tX3Byb2JlX2NhcGFiaWxpdGllcyAoZHJpdmUpOworCisJLyoKKwkgKiBzZXQgY29ycmVjdCBibG9jayBzaXplCisJICovCisJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlLCBDRF9GUkFNRVNJWkUpOworCisJaWYgKGRyaXZlLT5hdXRvdHVuZSA9PSBJREVfVFVORV9ERUZBVUxUIHx8CisJICAgIGRyaXZlLT5hdXRvdHVuZSA9PSBJREVfVFVORV9BVVRPKQorCQlkcml2ZS0+ZHNjX292ZXJsYXAgPSAoZHJpdmUtPm5leHQgIT0gZHJpdmUpOworI2lmIDAKKwlkcml2ZS0+ZHNjX292ZXJsYXAgPSAoSFdJRihkcml2ZSktPm5vX2RzYykgPyAwIDogMTsKKwlpZiAoSFdJRihkcml2ZSktPm5vX2RzYykgeworCQlwcmludGsoS0VSTl9JTkZPICJpZGUtY2Q6ICVzOiBkaXNhYmxpbmcgRFNDIG92ZXJsYXBcbiIsCisJCQlkcml2ZS0+bmFtZSk7CisJCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7CisJfQorI2VuZGlmCisKKwlpZiAoaWRlX2Nkcm9tX3JlZ2lzdGVyKGRyaXZlLCBuc2xvdHMpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBpZGVfY2Ryb21fc2V0dXAgZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIHRoZSBjZHJvbSBkcml2ZXIuXG4iLCBkcml2ZS0+bmFtZSk7CisJCWluZm8tPmRldmluZm8uaGFuZGxlID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCWlkZV9jZHJvbV9hZGRfc2V0dGluZ3MoZHJpdmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMKK3NlY3Rvcl90IGlkZV9jZHJvbV9jYXBhY2l0eSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIHNlY3RvcnNfcGVyX2ZyYW1lOworCisJaWYgKGNkcm9tX3JlYWRfY2FwYWNpdHkoZHJpdmUsICZjYXBhY2l0eSwgJnNlY3RvcnNfcGVyX2ZyYW1lLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2FwYWNpdHkgKiBzZWN0b3JzX3Blcl9mcmFtZTsKK30KKworc3RhdGljCitpbnQgaWRlX2Nkcm9tX2NsZWFudXAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJaWYgKGlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcihkcml2ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGZhaWxlZCB0byBpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXJcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRyaXZlLT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGVsX2dlbmRpc2soaW5mby0+ZGlzayk7CisKKwlpZGVfY2RfcHV0KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9jZF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gdG9faWRlX2NkKGtyZWYpOworCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqZGV2aW5mbyA9ICZpbmZvLT5kZXZpbmZvOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGluZm8tPmRyaXZlOworCXN0cnVjdCBnZW5kaXNrICpnID0gaW5mby0+ZGlzazsKKworCWlmIChpbmZvLT5idWZmZXIgIT0gTlVMTCkKKwkJa2ZyZWUoaW5mby0+YnVmZmVyKTsKKwlpZiAoaW5mby0+dG9jICE9IE5VTEwpCisJCWtmcmVlKGluZm8tPnRvYyk7CisJaWYgKGluZm8tPmNoYW5nZXJfaW5mbyAhPSBOVUxMKQorCQlrZnJlZShpbmZvLT5jaGFuZ2VyX2luZm8pOworCWlmIChkZXZpbmZvLT5oYW5kbGUgPT0gZHJpdmUgJiYgdW5yZWdpc3Rlcl9jZHJvbShkZXZpbmZvKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZmFpbGVkIHRvIHVucmVnaXN0ZXIgZGV2aWNlIGZyb20gdGhlIGNkcm9tICIKKwkJCQkiZHJpdmVyLlxuIiwgX19GVU5DVElPTl9fLCBkcml2ZS0+bmFtZSk7CisJZHJpdmUtPmRzY19vdmVybGFwID0gMDsKKwlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCWJsa19xdWV1ZV9wcmVwX3JxKGRyaXZlLT5xdWV1ZSwgTlVMTCk7CisJZy0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlwdXRfZGlzayhnKTsKKwlrZnJlZShpbmZvKTsKK30KKworc3RhdGljIGludCBpZGVfY2Ryb21fYXR0YWNoIChpZGVfZHJpdmVfdCAqZHJpdmUpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgcHJvY19pZGVjZF9yZWFkX2NhcGFjaXR5CisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90KmRyaXZlID0gKGlkZV9kcml2ZV90ICopZGF0YTsKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCIlbGx1XG4iLCAobG9uZyBsb25nKWlkZV9jZHJvbV9jYXBhY2l0eShkcml2ZSkpOworCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZixsZW4pOworfQorCitzdGF0aWMgaWRlX3Byb2NfZW50cnlfdCBpZGVjZF9wcm9jW10gPSB7CisJeyAiY2FwYWNpdHkiLCBTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlY2RfcmVhZF9jYXBhY2l0eSwgTlVMTCB9LAorCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Cit9OworI2Vsc2UKKyMgZGVmaW5lIGlkZWNkX3Byb2MJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpZGVfZHJpdmVyX3QgaWRlX2Nkcm9tX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiaWRlLWNkcm9tIiwKKwkudmVyc2lvbgkJPSBJREVDRF9WRVJTSU9OLAorCS5tZWRpYQkJCT0gaWRlX2Nkcm9tLAorCS5idXN5CQkJPSAwLAorCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDEsCisJLmNsZWFudXAJCT0gaWRlX2Nkcm9tX2NsZWFudXAsCisJLmRvX3JlcXVlc3QJCT0gaWRlX2RvX3J3X2Nkcm9tLAorCS5lbmRfcmVxdWVzdAkJPSBpZGVfZW5kX3JlcXVlc3QsCisJLmVycm9yCQkJPSBfX2lkZV9lcnJvciwKKwkuYWJvcnQJCQk9IF9faWRlX2Fib3J0LAorCS5wcm9jCQkJPSBpZGVjZF9wcm9jLAorCS5hdHRhY2gJCQk9IGlkZV9jZHJvbV9hdHRhY2gsCisJLmRyaXZlcwkJCT0gTElTVF9IRUFEX0lOSVQoaWRlX2Nkcm9tX2RyaXZlci5kcml2ZXMpLAorfTsKKworc3RhdGljIGludCBpZGVjZF9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvOworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJaWYgKCEoaW5mbyA9IGlkZV9jZF9nZXQoZGlzaykpKQorCQlyZXR1cm4gLUVOWElPOworCisJZHJpdmUgPSBpbmZvLT5kcml2ZTsKKworCWRyaXZlLT51c2FnZSsrOworCisJaWYgKCFpbmZvLT5idWZmZXIpCisJCWluZm8tPmJ1ZmZlciA9IGttYWxsb2MoU0VDVE9SX0JVRkZFUl9TSVpFLAorCQkJCQlHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CisgICAgICAgIGlmICghaW5mby0+YnVmZmVyIHx8IChyYyA9IGNkcm9tX29wZW4oJmluZm8tPmRldmluZm8sIGlub2RlLCBmaWxlKSkpCisJCWRyaXZlLT51c2FnZS0tOworCisJaWYgKHJjIDwgMCkKKwkJaWRlX2NkX3B1dChpbmZvKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpZGVjZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gaWRlX2NkX2coZGlzayk7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gaW5mby0+ZHJpdmU7CisKKwljZHJvbV9yZWxlYXNlICgmaW5mby0+ZGV2aW5mbywgZmlsZSk7CisJZHJpdmUtPnVzYWdlLS07CisKKwlpZGVfY2RfcHV0KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRlY2RfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGlub2RlLT5pX2JkZXY7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBpZGVfY2RfZyhiZGV2LT5iZF9kaXNrKTsKKwlpbnQgZXJyOworCisJZXJyICA9IGdlbmVyaWNfaWRlX2lvY3RsKGluZm8tPmRyaXZlLCBmaWxlLCBiZGV2LCBjbWQsIGFyZyk7CisJaWYgKGVyciA9PSAtRUlOVkFMKQorCQllcnIgPSBjZHJvbV9pb2N0bChmaWxlLCAmaW5mby0+ZGV2aW5mbywgaW5vZGUsIGNtZCwgYXJnKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWRlY2RfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGlkZV9jZF9nKGRpc2spOworCXJldHVybiBjZHJvbV9tZWRpYV9jaGFuZ2VkKCZpbmZvLT5kZXZpbmZvKTsKK30KKworc3RhdGljIGludCBpZGVjZF9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBpZGVfY2RfZyhkaXNrKTsKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKKwljZHJvbV9yZWFkX3RvYyhpbmZvLT5kcml2ZSwgJnNlbnNlKTsKKwlyZXR1cm4gIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgaWRlY2Rfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpZGVjZF9vcGVuLAorCS5yZWxlYXNlCT0gaWRlY2RfcmVsZWFzZSwKKwkuaW9jdGwJCT0gaWRlY2RfaW9jdGwsCisJLm1lZGlhX2NoYW5nZWQJPSBpZGVjZF9tZWRpYV9jaGFuZ2VkLAorCS5yZXZhbGlkYXRlX2Rpc2s9IGlkZWNkX3JldmFsaWRhdGVfZGlzaworfTsKKworLyogb3B0aW9ucyAqLworc3RhdGljIGNoYXIgKmlnbm9yZSA9IE5VTEw7CisKK21vZHVsZV9wYXJhbShpZ25vcmUsIGNoYXJwLCAwNDAwKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVRBUEkgQ0QtUk9NIERyaXZlciIpOworCitzdGF0aWMgaW50IGlkZV9jZHJvbV9hdHRhY2ggKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZ2VuZGlzayAqZzsKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKKworCWlmICghc3Ryc3RyKCJpZGUtY2Ryb20iLCBkcml2ZS0+ZHJpdmVyX3JlcSkpCisJCWdvdG8gZmFpbGVkOworCWlmICghZHJpdmUtPnByZXNlbnQpCisJCWdvdG8gZmFpbGVkOworCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Nkcm9tICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfb3B0aWNhbCkKKwkJZ290byBmYWlsZWQ7CisJLyogc2tpcCBkcml2ZXMgdGhhdCB3ZSB3ZXJlIHRvbGQgdG8gaWdub3JlICovCisJaWYgKGlnbm9yZSAhPSBOVUxMKSB7CisJCWlmIChzdHJzdHIoaWdub3JlLCBkcml2ZS0+bmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImlkZS1jZDogaWdub3JpbmcgZHJpdmUgJXNcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJfQorCWlmIChkcml2ZS0+c2NzaSkgeworCQlwcmludGsoS0VSTl9JTkZPICJpZGUtY2Q6IHBhc3NpbmcgZHJpdmUgJXMgdG8gaWRlLXNjc2kgZW11bGF0aW9uLlxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaW5mbyA9IChzdHJ1Y3QgY2Ryb21faW5mbyAqKSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBjZHJvbV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBhbGxvY2F0ZSBhIGNkcm9tIHN0cnVjdHVyZVxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlnID0gYWxsb2NfZGlzaygxIDw8IFBBUlROX0JJVFMpOworCWlmICghZykKKwkJZ290byBvdXRfZnJlZV9jZDsKKworCWlkZV9pbml0X2Rpc2soZywgZHJpdmUpOworCisJaWYgKGlkZV9yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsICZpZGVfY2Ryb21fZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIGlkZS5jXG4iLAorCQkJZHJpdmUtPm5hbWUpOworCQlnb3RvIG91dF9wdXRfZGlzazsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZiAoc3RydWN0IGNkcm9tX2luZm8pKTsKKworCWtyZWZfaW5pdCgmaW5mby0+a3JlZik7CisKKwlpbmZvLT5kcml2ZSA9IGRyaXZlOworCWluZm8tPmRyaXZlciA9ICZpZGVfY2Ryb21fZHJpdmVyOworCWluZm8tPmRpc2sgPSBnOworCisJZy0+cHJpdmF0ZV9kYXRhID0gJmluZm8tPmRyaXZlcjsKKworCWRyaXZlLT5kcml2ZXJfZGF0YSA9IGluZm87CisKKwlEUklWRVIoZHJpdmUpLT5idXN5Kys7CisJZy0+bWlub3JzID0gMTsKKwlzbnByaW50ZihnLT5kZXZmc19uYW1lLCBzaXplb2YoZy0+ZGV2ZnNfbmFtZSksCisJCQkiJXMvY2QiLCBkcml2ZS0+ZGV2ZnNfbmFtZSk7CisJZy0+ZHJpdmVyZnNfZGV2ID0gJmRyaXZlLT5nZW5kZXY7CisJZy0+ZmxhZ3MgPSBHRU5IRF9GTF9DRCB8IEdFTkhEX0ZMX1JFTU9WQUJMRTsKKwlpZiAoaWRlX2Nkcm9tX3NldHVwKGRyaXZlKSkgeworCQlzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmRldmluZm8gPSAmaW5mby0+ZGV2aW5mbzsKKwkJRFJJVkVSKGRyaXZlKS0+YnVzeS0tOworCQlpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUpOworCQlpZiAoaW5mby0+YnVmZmVyICE9IE5VTEwpCisJCQlrZnJlZShpbmZvLT5idWZmZXIpOworCQlpZiAoaW5mby0+dG9jICE9IE5VTEwpCisJCQlrZnJlZShpbmZvLT50b2MpOworCQlpZiAoaW5mby0+Y2hhbmdlcl9pbmZvICE9IE5VTEwpCisJCQlrZnJlZShpbmZvLT5jaGFuZ2VyX2luZm8pOworCQlpZiAoZGV2aW5mby0+aGFuZGxlID09IGRyaXZlICYmIHVucmVnaXN0ZXJfY2Ryb20oZGV2aW5mbykpCisJCQlwcmludGsgKEtFUk5fRVJSICIlczogaWRlX2Nkcm9tX2NsZWFudXAgZmFpbGVkIHRvIHVucmVnaXN0ZXIgZGV2aWNlIGZyb20gdGhlIGNkcm9tIGRyaXZlci5cbiIsIGRyaXZlLT5uYW1lKTsKKwkJa2ZyZWUoaW5mbyk7CisJCWRyaXZlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWdvdG8gZmFpbGVkOworCX0KKwlEUklWRVIoZHJpdmUpLT5idXN5LS07CisKKwljZHJvbV9yZWFkX3RvYyhkcml2ZSwgJnNlbnNlKTsKKwlnLT5mb3BzID0gJmlkZWNkX29wczsKKwlnLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEU7CisJYWRkX2Rpc2soZyk7CisJcmV0dXJuIDA7CisKK291dF9wdXRfZGlzazoKKwlwdXRfZGlzayhnKTsKK291dF9mcmVlX2NkOgorCWtmcmVlKGluZm8pOworZmFpbGVkOgorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWRlX2Nkcm9tX2V4aXQodm9pZCkKK3sKKwlpZGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmlkZV9jZHJvbV9kcml2ZXIpOworfQorIAorc3RhdGljIGludCBpZGVfY2Ryb21faW5pdCh2b2lkKQoreworCWlkZV9yZWdpc3Rlcl9kcml2ZXIoJmlkZV9jZHJvbV9kcml2ZXIpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpZGVfY2Ryb21faW5pdCk7Cittb2R1bGVfZXhpdChpZGVfY2Ryb21fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuaCBiL2RyaXZlcnMvaWRlL2lkZS1jZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTNlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuaApAQCAtMCwwICsxLDc0NiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9pZGVfY2QuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtOTggIEVyaWsgQW5kZXJzZW4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBKZW5zIEF4Ym9lCisgKi8KKyNpZm5kZWYgX0lERV9DRF9ICisjZGVmaW5lIF9JREVfQ0RfSAorCisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qIFR1cm4gdGhpcyBvbiB0byBoYXZlIHRoZSBkcml2ZXIgcHJpbnQgb3V0IHRoZSBtZWFuaW5ncyBvZiB0aGUKKyAgIEFUQVBJIGVycm9yIGNvZGVzLiAgVGhpcyB3aWxsIHVzZSB1cCBhZGRpdGlvbmFsIGtlcm5lbC1zcGFjZQorICAgbWVtb3J5LCB0aG91Z2guICovCisKKyNpZm5kZWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCisjZGVmaW5lIFZFUkJPU0VfSURFX0NEX0VSUk9SUyAxCisjZW5kaWYKKworCisvKiBUdXJuaW5nIHRoaXMgb24gd2lsbCByZW1vdmUgY29kZSB0byB3b3JrIGFyb3VuZCB2YXJpb3VzIG5vbnN0YW5kYXJkCisgICBBVEFQSSBpbXBsZW1lbnRhdGlvbnMuICBJZiB5b3Uga25vdyB5b3VyIGRyaXZlIGZvbGxvd3MgdGhlIHN0YW5kYXJkLAorICAgdGhpcyB3aWxsIGdpdmUgeW91IGEgc2xpZ2h0bHkgc21hbGxlciBrZXJuZWwuICovCisKKyNpZm5kZWYgU1RBTkRBUkRfQVRBUEkKKyNkZWZpbmUgU1RBTkRBUkRfQVRBUEkgMAorI2VuZGlmCisKKworLyogVHVybmluZyB0aGlzIG9uIHdpbGwgZGlzYWJsZSB0aGUgZG9vci1sb2NraW5nIGZ1bmN0aW9uYWxpdHkuCisgICBUaGlzIGlzIGFwcGFyZW50bHkgbmVlZGVkIGZvciBzdXBlcm1vdW50LiAqLworCisjaWZuZGVmIE5PX0RPT1JfTE9DS0lORworI2RlZmluZSBOT19ET09SX0xPQ0tJTkcgMAorI2VuZGlmCisKKy8qCisgKiB0eXBpY2FsIHRpbWVvdXQgZm9yIHBhY2tldCBjb21tYW5kCisgKi8KKyNkZWZpbmUgQVRBUElfV0FJVF9QQwkJKDYwICogSFopCisjZGVmaW5lIEFUQVBJX1dBSVRfV1JJVEVfQlVTWQkoMTAgKiBIWikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTRUNUT1JfQklUUyAJCTkKKyNpZm5kZWYgU0VDVE9SX1NJWkUKKyNkZWZpbmUgU0VDVE9SX1NJWkUJCSgxIDw8IFNFQ1RPUl9CSVRTKQorI2VuZGlmCisjZGVmaW5lIFNFQ1RPUlNfUEVSX0ZSQU1FCShDRF9GUkFNRVNJWkUgPj4gU0VDVE9SX0JJVFMpCisjZGVmaW5lIFNFQ1RPUl9CVUZGRVJfU0laRQkoQ0RfRlJBTUVTSVpFICogMzIpCisjZGVmaW5lIFNFQ1RPUlNfQlVGRkVSCQkoU0VDVE9SX0JVRkZFUl9TSVpFID4+IFNFQ1RPUl9CSVRTKQorI2RlZmluZSBTRUNUT1JTX01BWAkJKDEzMTA3MiA+PiBTRUNUT1JfQklUUykKKworI2RlZmluZSBCTE9DS1NfUEVSX0ZSQU1FCShDRF9GUkFNRVNJWkUgLyBCTE9DS19TSVpFKQorCisvKiBzcGVjaWFsIGNvbW1hbmQgY29kZXMgZm9yIHN0cmF0ZWd5IHJvdXRpbmUuICovCisjZGVmaW5lIFBBQ0tFVF9DT01NQU5EICAgICAgICA0MzE1CisjZGVmaW5lIFJFUVVFU1RfU0VOU0VfQ09NTUFORCA0MzE2CisjZGVmaW5lIFJFU0VUX0RSSVZFX0NPTU1BTkQgICA0MzE3CisKKworLyogQ29uZmlndXJhdGlvbiBmbGFncy4gIFRoZXNlIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRyaXZlLgorICAgVGhleSBnZW5lcmFsbHkgZG8gbm90IGNoYW5nZSBhZnRlciBpbml0aWFsaXphdGlvbiwgdW5sZXNzIHdlIGxlYXJuCisgICBtb3JlIGFib3V0IHRoZSBkcml2ZSBmcm9tIHN0dWZmIGZhaWxpbmcuICovCitzdHJ1Y3QgaWRlX2NkX2NvbmZpZ19mbGFncyB7CisJX191OCBkcnFfaW50ZXJydXB0CTogMTsgLyogRGV2aWNlIHNlbmRzIGFuIGludGVycnVwdCB3aGVuIHJlYWR5CisJCQkJCWZvciBhIHBhY2tldCBjb21tYW5kLiAqLworCV9fdTggbm9fZG9vcmxvY2sJOiAxOyAvKiBEcml2ZSBjYW5ub3QgbG9jayB0aGUgZG9vci4gKi8KKwlfX3U4IG5vX2VqZWN0CQk6IDE7IC8qIERyaXZlIGNhbm5vdCBlamVjdCB0aGUgZGlzYy4gKi8KKwlfX3U4IG5lYzI2MAkJOiAxOyAvKiBEcml2ZSBpcyBhIHByZS0xLjIgTkVDIDI2MCBkcml2ZS4gKi8KKwlfX3U4IHBsYXltc2ZfYXNfYmNkCTogMTsgLyogUExBWU1TRiBjb21tYW5kIHRha2VzIEJDRCBhcmdzLiAqLworCV9fdTggdG9jYWRkcl9hc19iY2QJOiAxOyAvKiBUT0MgYWRkcmVzc2VzIGFyZSBpbiBCQ0QuICovCisJX191OCB0b2N0cmFja3NfYXNfYmNkCTogMTsgLyogVE9DIHRyYWNrIG51bWJlcnMgYXJlIGluIEJDRC4gKi8KKwlfX3U4IHN1YmNoYW5fYXNfYmNkCTogMTsgLyogU3ViY2hhbm5lbCBpbmZvIGlzIGluIEJDRC4gKi8KKwlfX3U4IGlzX2NoYW5nZXIJCTogMTsgLyogRHJpdmUgaXMgYSBjaGFuZ2VyLiAqLworCV9fdTggY2RfcgkJOiAxOyAvKiBEcml2ZSBjYW4gd3JpdGUgdG8gQ0QtUiBtZWRpYSAuICovCisJX191OCBjZF9ydwkJOiAxOyAvKiBEcml2ZSBjYW4gd3JpdGUgdG8gQ0QtUi9XIG1lZGlhIC4gKi8KKwlfX3U4IGR2ZAkJOiAxOyAvKiBEcml2ZSBpcyBhIERWRC1ST00gKi8KKwlfX3U4IGR2ZF9yCQk6IDE7IC8qIERyaXZlIGNhbiB3cml0ZSBEVkQtUiAqLworCV9fdTggZHZkX3JhbQkJOiAxOyAvKiBEcml2ZSBjYW4gd3JpdGUgRFZELVJBTSAqLworCV9fdTggcmFtCQk6IDE7IC8qIGdlbmVyaWMgV1JJVEUgKGR2ZC1yYW0vbXJ3KSAqLworCV9fdTggdGVzdF93cml0ZQkJOiAxOyAvKiBEcml2ZSBjYW4gZmFrZSB3cml0ZXMgKi8KKwlfX3U4IHN1cHBfZGlzY19wcmVzZW50CTogMTsgLyogQ2hhbmdlciBjYW4gcmVwb3J0IGV4YWN0IGNvbnRlbnRzCisJCQkJCW9mIHNsb3RzLiAqLworCV9fdTggbGltaXRfbmZyYW1lcwk6IDE7IC8qIERyaXZlIGRvZXMgbm90IHByb3ZpZGUgZGF0YSBpbgorCQkJCQltdWx0aXBsZXMgb2YgU0VDVE9SX1NJWkUgd2hlbiBtb3JlCisJCQkJCXRoYW4gb25lIGludGVycnVwdCBpcyBuZWVkZWQuICovCisJX191OCBzZWVraW5nCQk6IDE7IC8qIFNlZWtpbmcgaW4gcHJvZ3Jlc3MgKi8KKwlfX3U4IGF1ZGlvX3BsYXkJCTogMTsgLyogY2FuIGRvIGF1ZGlvIHJlbGF0ZWQgY29tbWFuZHMgKi8KKwlfX3U4IGNsb3NlX3RyYXkJCTogMTsgLyogY2FuIGNsb3NlIHRoZSB0cmF5ICovCisJX191OCB3cml0aW5nCQk6IDE7IC8qIHBzZXVkbyB3cml0ZSBpbiBwcm9ncmVzcyAqLworCV9fdTggbW9fZHJpdmUJCTogMTsgLyogZHJpdmUgaXMgYW4gTU8gZGV2aWNlICovCisJX191OCByZXNlcnZlZAkJOiAyOworCWJ5dGUgbWF4X3NwZWVkOwkJICAgICAvKiBNYXggc3BlZWQgb2YgdGhlIGRyaXZlICovCit9OworI2RlZmluZSBDRFJPTV9DT05GSUdfRkxBR1MoZHJpdmUpICgmKCgoc3RydWN0IGNkcm9tX2luZm8gKikoZHJpdmUtPmRyaXZlcl9kYXRhKSktPmNvbmZpZ19mbGFncykpCisKKyAKKy8qIFN0YXRlIGZsYWdzLiAgVGhlc2UgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgIGRyaXZlLCBhbmQgd2lsbCBjaGFuZ2UgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24uICovCitzdHJ1Y3QgaWRlX2NkX3N0YXRlX2ZsYWdzIHsKKwlfX3U4IG1lZGlhX2NoYW5nZWQgOiAxOyAvKiBEcml2ZXIgaGFzIG5vdGljZWQgYSBtZWRpYSBjaGFuZ2UuICovCisJX191OCB0b2NfdmFsaWQgICAgIDogMTsgLyogU2F2ZWQgVE9DIGluZm9ybWF0aW9uIGlzIGN1cnJlbnQuICovCisJX191OCBkb29yX2xvY2tlZCAgIDogMTsgLyogV2UgdGhpbmsgdGhhdCB0aGUgZHJpdmUgZG9vciBpcyBsb2NrZWQuICovCisJX191OCB3cml0aW5nICAgICAgIDogMTsgLyogdGhlIGRyaXZlIGlzIGN1cnJlbnRseSB3cml0aW5nICovCisJX191OCByZXNlcnZlZCAgICAgIDogNDsKKwlieXRlIGN1cnJlbnRfc3BlZWQ7CS8qIEN1cnJlbnQgc3BlZWQgb2YgdGhlIGRyaXZlICovCit9OworCisjZGVmaW5lIENEUk9NX1NUQVRFX0ZMQUdTKGRyaXZlKSAoJigoKHN0cnVjdCBjZHJvbV9pbmZvICopKGRyaXZlLT5kcml2ZXJfZGF0YSkpLT5zdGF0ZV9mbGFncykpCisKKy8qIFN0cnVjdHVyZSBvZiBhIE1TRiBjZHJvbSBhZGRyZXNzLiAqLworc3RydWN0IGF0YXBpX21zZiB7CisJYnl0ZSByZXNlcnZlZDsKKwlieXRlIG1pbnV0ZTsKKwlieXRlIHNlY29uZDsKKwlieXRlIGZyYW1lOworfTsKKworLyogU3BhY2UgdG8gaG9sZCB0aGUgZGlzayBUT0MuICovCisjZGVmaW5lIE1BWF9UUkFDS1MgOTkKK3N0cnVjdCBhdGFwaV90b2NfaGVhZGVyIHsKKwl1bnNpZ25lZCBzaG9ydCB0b2NfbGVuZ3RoOworCWJ5dGUgZmlyc3RfdHJhY2s7CisJYnl0ZSBsYXN0X3RyYWNrOworfTsKKworc3RydWN0IGF0YXBpX3RvY19lbnRyeSB7CisJYnl0ZSByZXNlcnZlZDE7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCBhZHIgICAgIDogNDsKKwlfX3U4IGNvbnRyb2wgOiA0OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBjb250cm9sIDogNDsKKwlfX3U4IGFkciAgICAgOiA0OworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCWJ5dGUgdHJhY2s7CisJYnl0ZSByZXNlcnZlZDI7CisJdW5pb24geworCQl1bnNpZ25lZCBsYmE7CisJCXN0cnVjdCBhdGFwaV9tc2YgbXNmOworCX0gYWRkcjsKK307CisKK3N0cnVjdCBhdGFwaV90b2MgeworCWludCAgICBsYXN0X3Nlc3Npb25fbGJhOworCWludCAgICB4YV9mbGFnOworCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7CisJc3RydWN0IGF0YXBpX3RvY19oZWFkZXIgaGRyOworCXN0cnVjdCBhdGFwaV90b2NfZW50cnkgIGVudFtNQVhfVFJBQ0tTKzFdOworCSAgLyogT25lIGV4dHJhIGZvciB0aGUgbGVhZG91dC4gKi8KK307CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgYW5ub3lpbmdseSBjbG9zZSB0bywgYnV0IG5vdCBpZGVudGljYWwgd2l0aCwKKyAgIHRoZSBjZHJvbV9zdWJjaG5sIHN0cnVjdHVyZSBmcm9tIGNkcm9tLmguICovCitzdHJ1Y3QgYXRhcGlfY2Ryb21fc3ViY2hubCB7CisgCXVfY2hhciAgYWNkc2NfcmVzZXJ2ZWQ7CisgCXVfY2hhciAgYWNkc2NfYXVkaW9zdGF0dXM7CisgCXVfc2hvcnQgYWNkc2NfbGVuZ3RoOworCXVfY2hhciAgYWNkc2NfZm9ybWF0OworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdV9jaGFyICBhY2RzY19jdHJsOiAgICAgNDsKKwl1X2NoYXIgIGFjZHNjX2FkcjogICAgICA0OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdV9jaGFyICBhY2RzY19hZHI6CTQ7CisJdV9jaGFyICBhY2RzY19jdHJsOgk0OworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCXVfY2hhciAgYWNkc2NfdHJrOworCXVfY2hhciAgYWNkc2NfaW5kOworCXVuaW9uIHsKKwkJc3RydWN0IGF0YXBpX21zZiBtc2Y7CisJCWludAlsYmE7CisJfSBhY2RzY19hYnNhZGRyOworCXVuaW9uIHsKKwkJc3RydWN0IGF0YXBpX21zZiBtc2Y7CisJCWludAlsYmE7CisJfSBhY2RzY19yZWxhZGRyOworfTsKKworCisKKy8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGdvIGludG8gY2Ryb20uaCBhbG9uZyB3aXRoIHRoZSBvdGhlcgorICogZ2VuZXJpYyBzdHVmZiBub3cgaW4gdGhlIE10LiBGdWppIHNwZWMuCisgKi8KK3N0cnVjdCBhdGFwaV9jYXBhYmlsaXRpZXNfcGFnZSB7CisJc3RydWN0IG1vZGVfcGFnZV9oZWFkZXIgaGVhZGVyOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcGFyYW1ldGVyc19zYXZlYWJsZSA6IDE7CisJX191OCByZXNlcnZlZDEgICAgICAgICAgIDogMTsKKwlfX3U4IHBhZ2VfY29kZSAgICAgICAgICAgOiA2OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBwYWdlX2NvZGUgICAgICAgICAgIDogNjsKKwlfX3U4IHJlc2VydmVkMSAgICAgICAgICAgOiAxOworCV9fdTggcGFyYW1ldGVyc19zYXZlYWJsZSA6IDE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKwlieXRlICAgICBwYWdlX2xlbmd0aDsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQyICAgICAgICAgICA6IDI7CisJLyogRHJpdmUgc3VwcG9ydHMgcmVhZGluZyBvZiBEVkQtUkFNIGRpc2NzICovCisJX191OCBkdmRfcmFtX3JlYWQgICAgICAgIDogMTsKKwkvKiBEcml2ZSBzdXBwb3J0cyByZWFkaW5nIG9mIERWRC1SIGRpc2NzICovCisJX191OCBkdmRfcl9yZWFkICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBzdXBwb3J0cyByZWFkaW5nIG9mIERWRC1ST00gZGlzY3MgKi8KKwlfX3U4IGR2ZF9yb20gICAgICAgICAgICAgOiAxOworCS8qIERyaXZlIHN1cHBvcnRzIHJlYWRpbmcgQ0QtUiBkaXNjcyB3aXRoIGFkZHJlc3NpbmcgbWV0aG9kIDIgKi8KKwlfX3U4IG1ldGhvZDIgICAgICAgICAgICAgOiAxOyAvKiByZXNlcnZlZCBpbiAxLjIgKi8KKwkvKiBEcml2ZSBjYW4gcmVhZCBmcm9tIENELVIvVyAoQ0QtRSkgZGlzY3MgKG9yYW5nZSBib29rLCBwYXJ0IElJSSkgKi8KKwlfX3U4IGNkX3J3X3JlYWQJCSA6IDE7IC8qIHJlc2VydmVkIGluIDEuMiAqLworCS8qIERyaXZlIHN1cHBvcnRzIHJlYWQgZnJvbSBDRC1SIGRpc2NzIChvcmFuZ2UgYm9vaywgcGFydCBJSSkgKi8KKwlfX3U4IGNkX3JfcmVhZCAgICAgICAgICAgOiAxOyAvKiByZXNlcnZlZCBpbiAxLjIgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCS8qIERyaXZlIHN1cHBvcnRzIHJlYWQgZnJvbSBDRC1SIGRpc2NzIChvcmFuZ2UgYm9vaywgcGFydCBJSSkgKi8KKwlfX3U4IGNkX3JfcmVhZCAgICAgICAgICAgOiAxOyAvKiByZXNlcnZlZCBpbiAxLjIgKi8KKwkvKiBEcml2ZSBjYW4gcmVhZCBmcm9tIENELVIvVyAoQ0QtRSkgZGlzY3MgKG9yYW5nZSBib29rLCBwYXJ0IElJSSkgKi8KKwlfX3U4IGNkX3J3X3JlYWQgICAgICAgICAgOiAxOyAvKiByZXNlcnZlZCBpbiAxLjIgKi8KKwkvKiBEcml2ZSBzdXBwb3J0cyByZWFkaW5nIENELVIgZGlzY3Mgd2l0aCBhZGRyZXNzaW5nIG1ldGhvZCAyICovCisJX191OCBtZXRob2QyICAgICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBzdXBwb3J0cyByZWFkaW5nIG9mIERWRC1ST00gZGlzY3MgKi8KKwlfX3U4IGR2ZF9yb20gICAgICAgICAgICAgOiAxOworCS8qIERyaXZlIHN1cHBvcnRzIHJlYWRpbmcgb2YgRFZELVIgZGlzY3MgKi8KKwlfX3U4IGR2ZF9yX3JlYWQgICAgICAgICAgOiAxOworCS8qIERyaXZlIHN1cHBvcnRzIHJlYWRpbmcgb2YgRFZELVJBTSBkaXNjcyAqLworCV9fdTggZHZkX3JhbV9yZWFkICAgICAgICA6IDE7CisJX191OCByZXNlcnZlZDIJCSA6IDI7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMyAgICAgICAgICAgOiAyOworCS8qIERyaXZlIGNhbiB3cml0ZSBEVkQtUkFNIGRpc2NzICovCisJX191OCBkdmRfcmFtX3dyaXRlICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gd3JpdGUgRFZELVIgZGlzY3MgKi8KKwlfX3U4IGR2ZF9yX3dyaXRlICAgICAgICAgOiAxOworCV9fdTggcmVzZXJ2ZWQzYSAgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIGZha2Ugd3JpdGVzICovCisJX191OCB0ZXN0X3dyaXRlICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gd3JpdGUgdG8gQ0QtUi9XIChDRC1FKSBkaXNjcyAob3JhbmdlIGJvb2ssIHBhcnQgSUlJKSAqLworCV9fdTggY2Rfcndfd3JpdGUJIDogMTsgLyogcmVzZXJ2ZWQgaW4gMS4yICovCisJLyogRHJpdmUgc3VwcG9ydHMgd3JpdGUgdG8gQ0QtUiBkaXNjcyAob3JhbmdlIGJvb2ssIHBhcnQgSUkpICovCisJX191OCBjZF9yX3dyaXRlICAgICAgICAgIDogMTsgLyogcmVzZXJ2ZWQgaW4gMS4yICovCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkvKiBEcml2ZSBjYW4gd3JpdGUgdG8gQ0QtUiBkaXNjcyAob3JhbmdlIGJvb2ssIHBhcnQgSUkpICovCisJX191OCBjZF9yX3dyaXRlICAgICAgICAgIDogMTsgLyogcmVzZXJ2ZWQgaW4gMS4yICovCisJLyogRHJpdmUgY2FuIHdyaXRlIHRvIENELVIvVyAoQ0QtRSkgZGlzY3MgKG9yYW5nZSBib29rLCBwYXJ0IElJSSkgKi8KKwlfX3U4IGNkX3J3X3dyaXRlCSA6IDE7IC8qIHJlc2VydmVkIGluIDEuMiAqLworCS8qIERyaXZlIGNhbiBmYWtlIHdyaXRlcyAqLworCV9fdTggdGVzdF93cml0ZSAgICAgICAgICA6IDE7CisJX191OCByZXNlcnZlZDNhICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gd3JpdGUgRFZELVIgZGlzY3MgKi8KKwlfX3U4IGR2ZF9yX3dyaXRlICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiB3cml0ZSBEVkQtUkFNIGRpc2NzICovCisJX191OCBkdmRfcmFtX3dyaXRlICAgICAgIDogMTsKKwlfX3U4IHJlc2VydmVkMyAgICAgICAgICAgOiAyOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDQgICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gcmVhZCBtdWx0aXNlc3Npb24gZGlzY3MuICovCisJX191OCBtdWx0aXNlc3Npb24gICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gcmVhZCBtb2RlIDIsIGZvcm0gMiBkYXRhLiAqLworCV9fdTggbW9kZTJfZm9ybTIgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIHJlYWQgbW9kZSAyLCBmb3JtIDEgKFhBKSBkYXRhLiAqLworCV9fdTggbW9kZTJfZm9ybTEgICAgICAgICA6IDE7CisJLyogRHJpdmUgc3VwcG9ydHMgZGlnaXRhbCBvdXRwdXQgb24gcG9ydCAyLiAqLworCV9fdTggZGlncG9ydDIgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgc3VwcG9ydHMgZGlnaXRhbCBvdXRwdXQgb24gcG9ydCAxLiAqLworCV9fdTggZGlncG9ydDEgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIGRlbGl2ZXIgYSBjb21wb3NpdGUgYXVkaW8vdmlkZW8gZGF0YSBzdHJlYW0uICovCisJX191OCBjb21wb3NpdGUgICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBzdXBwb3J0cyBhdWRpbyBwbGF5IG9wZXJhdGlvbnMuICovCisJX191OCBhdWRpb19wbGF5ICAgICAgICAgIDogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCS8qIERyaXZlIHN1cHBvcnRzIGF1ZGlvIHBsYXkgb3BlcmF0aW9ucy4gKi8KKwlfX3U4IGF1ZGlvX3BsYXkgICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiBkZWxpdmVyIGEgY29tcG9zaXRlIGF1ZGlvL3ZpZGVvIGRhdGEgc3RyZWFtLiAqLworCV9fdTggY29tcG9zaXRlICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgc3VwcG9ydHMgZGlnaXRhbCBvdXRwdXQgb24gcG9ydCAxLiAqLworCV9fdTggZGlncG9ydDEgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgc3VwcG9ydHMgZGlnaXRhbCBvdXRwdXQgb24gcG9ydCAyLiAqLworCV9fdTggZGlncG9ydDIgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIHJlYWQgbW9kZSAyLCBmb3JtIDEgKFhBKSBkYXRhLiAqLworCV9fdTggbW9kZTJfZm9ybTEgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIHJlYWQgbW9kZSAyLCBmb3JtIDIgZGF0YS4gKi8KKwlfX3U4IG1vZGUyX2Zvcm0yICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiByZWFkIG11bHRpc2Vzc2lvbiBkaXNjcy4gKi8KKwlfX3U4IG11bHRpc2Vzc2lvbiAgICAgICAgOiAxOworCV9fdTggcmVzZXJ2ZWQ0ICAgICAgICAgICA6IDE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkNSAgICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiByZXR1cm4gTWVkaWEgQ2F0YWxvZyBOdW1iZXIgKFVQQykgaW5mby4gKi8KKwlfX3U4IHVwYyAgICAgICAgICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiByZXR1cm4gSW50ZXJuYXRpb25hbCBTdGFuZGFyZCBSZWNvcmRpbmcgQ29kZSBpbmZvLiAqLworCV9fdTggaXNyYyAgICAgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgc3VwcG9ydHMgQzIgZXJyb3IgcG9pbnRlcnMuICovCisJX191OCBjMl9wb2ludGVycyAgICAgICAgIDogMTsKKwkvKiBSLVcgZGF0YSB3aWxsIGJlIHJldHVybmVkIGRlaW50ZXJsZWF2ZWQgYW5kIGVycm9yIGNvcnJlY3RlZC4gKi8KKwlfX3U4IHJ3X2NvcnIgICAgICAgICAgICAgOiAxOworCS8qIFN1YmNoYW5uZWwgcmVhZHMgY2FuIHJldHVybiBjb21iaW5lZCBSLVcgaW5mb3JtYXRpb24uICovCisJX191OCByd19zdXBwb3J0ZWQgICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gY29udGludWUgYSByZWFkIGNkZGEgb3BlcmF0aW9uIGZyb20gYSBsb3NzIG9mIHN0cmVhbWluZy4qLworCV9fdTggY2RkYV9hY2N1cmF0ZSAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIHJlYWQgUmVkIEJvb2sgYXVkaW8gZGF0YS4gKi8KKwlfX3U4IGNkZGEgICAgICAgICAgICAgICAgOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJLyogRHJpdmUgY2FuIHJlYWQgUmVkIEJvb2sgYXVkaW8gZGF0YS4gKi8KKwlfX3U4IGNkZGEgICAgICAgICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiBjb250aW51ZSBhIHJlYWQgY2RkYSBvcGVyYXRpb24gZnJvbSBhIGxvc3Mgb2Ygc3RyZWFtaW5nLiovCisJX191OCBjZGRhX2FjY3VyYXRlICAgICAgIDogMTsKKwkvKiBTdWJjaGFubmVsIHJlYWRzIGNhbiByZXR1cm4gY29tYmluZWQgUi1XIGluZm9ybWF0aW9uLiAqLworCV9fdTggcndfc3VwcG9ydGVkICAgICAgICA6IDE7CisJLyogUi1XIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBkZWludGVybGVhdmVkIGFuZCBlcnJvciBjb3JyZWN0ZWQuICovCisJX191OCByd19jb3JyICAgICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBzdXBwb3J0cyBDMiBlcnJvciBwb2ludGVycy4gKi8KKwlfX3U4IGMyX3BvaW50ZXJzICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiByZXR1cm4gSW50ZXJuYXRpb25hbCBTdGFuZGFyZCBSZWNvcmRpbmcgQ29kZSBpbmZvLiAqLworCV9fdTggaXNyYyAgICAgICAgICAgICAgICA6IDE7CisJLyogRHJpdmUgY2FuIHJldHVybiBNZWRpYSBDYXRhbG9nIE51bWJlciAoVVBDKSBpbmZvLiAqLworCV9fdTggdXBjICAgICAgICAgICAgICAgICA6IDE7CisJX191OCByZXNlcnZlZDUgICAgICAgICAgIDogMTsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCS8qIERyaXZlIG1lY2hhbmlzbSB0eXBlcy4gKi8KKwltZWNodHlwZV90IG1lY2h0eXBlCSA6IDM7CisJX191OCByZXNlcnZlZDYgICAgICAgICAgIDogMTsKKwkvKiBEcml2ZSBjYW4gZWplY3QgYSBkaXNjIG9yIGNoYW5nZXIgY2FydHJpZGdlLiAqLworCV9fdTggZWplY3QgICAgICAgICAgICAgICA6IDE7CisJLyogU3RhdGUgb2YgcHJldmVudC9hbGxvdyBqdW1wZXIuICovCisJX191OCBwcmV2ZW50X2p1bXBlciAgICAgIDogMTsKKwkvKiBQcmVzZW50IHN0YXRlIG9mIGRvb3IgbG9jay4gKi8KKwlfX3U4IGxvY2tfc3RhdGUgICAgICAgICAgOiAxOworCS8qIERyaXZlIGNhbiBsb2NrIHRoZSBkb29yLiAqLworCV9fdTggbG9jayAgICAgICAgICAgICAgICA6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKworCS8qIERyaXZlIGNhbiBsb2NrIHRoZSBkb29yLiAqLworCV9fdTggbG9jayAgICAgICAgICAgICAgICA6IDE7CisJLyogUHJlc2VudCBzdGF0ZSBvZiBkb29yIGxvY2suICovCisJX191OCBsb2NrX3N0YXRlICAgICAgICAgIDogMTsKKwkvKiBTdGF0ZSBvZiBwcmV2ZW50L2FsbG93IGp1bXBlci4gKi8KKwlfX3U4IHByZXZlbnRfanVtcGVyICAgICAgOiAxOworCS8qIERyaXZlIGNhbiBlamVjdCBhIGRpc2Mgb3IgY2hhbmdlciBjYXJ0cmlkZ2UuICovCisJX191OCBlamVjdCAgICAgICAgICAgICAgIDogMTsKKwlfX3U4IHJlc2VydmVkNiAgICAgICAgICAgOiAxOworCS8qIERyaXZlIG1lY2hhbmlzbSB0eXBlcy4gKi8KKwltZWNodHlwZV90IG1lY2h0eXBlCSA6IDM7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkNyAgICAgICAgICAgOiA0OworCS8qIERyaXZlIHN1cHBvcnRzIHNvZnR3YXJlIHNsb3Qgc2VsZWN0aW9uLiAqLworCV9fdTggc3NzICAgICAgICAgICAgICAgICA6IDE7ICAvKiByZXNlcnZlZCBpbiAxLjIgKi8KKwkvKiBDaGFuZ2VyIGNhbiByZXBvcnQgZXhhY3QgY29udGVudHMgb2Ygc2xvdHMuICovCisJX191OCBkaXNjX3ByZXNlbnQgICAgICAgIDogMTsgIC8qIHJlc2VydmVkIGluIDEuMiAqLworCS8qIEF1ZGlvIGZvciBlYWNoIGNoYW5uZWwgY2FuIGJlIG11dGVkIGluZGVwZW5kZW50bHkuICovCisJX191OCBzZXBhcmF0ZV9tdXRlICAgICAgIDogMTsKKwkvKiBBdWRpbyBsZXZlbCBmb3IgZWFjaCBjaGFubmVsIGNhbiBiZSBjb250cm9sbGVkIGluZGVwZW5kZW50bHkuICovCisJX191OCBzZXBhcmF0ZV92b2x1bWUgICAgIDogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCisJLyogQXVkaW8gbGV2ZWwgZm9yIGVhY2ggY2hhbm5lbCBjYW4gYmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5LiAqLworCV9fdTggc2VwYXJhdGVfdm9sdW1lICAgICA6IDE7CisJLyogQXVkaW8gZm9yIGVhY2ggY2hhbm5lbCBjYW4gYmUgbXV0ZWQgaW5kZXBlbmRlbnRseS4gKi8KKwlfX3U4IHNlcGFyYXRlX211dGUgICAgICAgOiAxOworCS8qIENoYW5nZXIgY2FuIHJlcG9ydCBleGFjdCBjb250ZW50cyBvZiBzbG90cy4gKi8KKwlfX3U4IGRpc2NfcHJlc2VudCAgICAgICAgOiAxOyAgLyogcmVzZXJ2ZWQgaW4gMS4yICovCisJLyogRHJpdmUgc3VwcG9ydHMgc29mdHdhcmUgc2xvdCBzZWxlY3Rpb24uICovCisJX191OCBzc3MgICAgICAgICAgICAgICAgIDogMTsgIC8qIHJlc2VydmVkIGluIDEuMiAqLworCV9fdTggcmVzZXJ2ZWQ3ICAgICAgICAgICA6IDQ7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisKKwkvKiBOb3RlOiB0aGUgZm9sbG93aW5nIGZvdXIgZmllbGRzIGFyZSByZXR1cm5lZCBpbiBiaWctZW5kaWFuIGZvcm0uICovCisJLyogTWF4aW11bSBzcGVlZCAoaW4ga0IvcykuICovCisJdW5zaWduZWQgc2hvcnQgbWF4c3BlZWQ7CisJLyogTnVtYmVyIG9mIGRpc2NyZXRlIHZvbHVtZSBsZXZlbHMuICovCisJdW5zaWduZWQgc2hvcnQgbl92b2xfbGV2ZWxzOworCS8qIFNpemUgb2YgY2FjaGUgaW4gZHJpdmUsIGluIGtCLiAqLworCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9zaXplOworCS8qIEN1cnJlbnQgc3BlZWQgKGluIGtCL3MpLiAqLworCXVuc2lnbmVkIHNob3J0IGN1cnNwZWVkOworCWNoYXIgcGFkWzRdOworfTsKKworCitzdHJ1Y3QgYXRhcGlfbWVjaHN0YXRfaGVhZGVyIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGZhdWx0ICAgICAgICAgOiAxOworCV9fdTggY2hhbmdlcl9zdGF0ZSA6IDI7CisJX191OCBjdXJzbG90ICAgICAgIDogNTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggY3Vyc2xvdCAgICAgICA6IDU7CisJX191OCBjaGFuZ2VyX3N0YXRlIDogMjsKKwlfX3U4IGZhdWx0ICAgICAgICAgOiAxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCBtZWNoX3N0YXRlICAgIDogMzsKKwlfX3U4IGRvb3Jfb3BlbiAgICAgOiAxOworCV9fdTggcmVzZXJ2ZWQxICAgICA6IDQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMSAgICAgOiA0OworCV9fdTggZG9vcl9vcGVuICAgICA6IDE7CisJX191OCBtZWNoX3N0YXRlICAgIDogMzsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKworCWJ5dGUgICAgIGN1cmxiYVszXTsKKwlieXRlICAgICBuc2xvdHM7CisJX191MTYJIHNsb3RfdGFibGVsZW47Cit9OworCisKK3N0cnVjdCBhdGFwaV9zbG90IHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGRpc2NfcHJlc2VudCA6IDE7CisJX191OCByZXNlcnZlZDEgICAgOiA2OworCV9fdTggY2hhbmdlICAgICAgIDogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggY2hhbmdlICAgICAgIDogMTsKKwlfX3U4IHJlc2VydmVkMSAgICA6IDY7CisJX191OCBkaXNjX3ByZXNlbnQgOiAxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCisJYnl0ZSByZXNlcnZlZDJbM107Cit9OworCitzdHJ1Y3QgYXRhcGlfY2hhbmdlcl9pbmZvIHsKKwlzdHJ1Y3QgYXRhcGlfbWVjaHN0YXRfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgYXRhcGlfc2xvdCBzbG90c1swXTsKK307CisKKy8qIEV4dHJhIHBlci1kZXZpY2UgaW5mbyBmb3IgY2Ryb20gZHJpdmVzLiAqLworc3RydWN0IGNkcm9tX2luZm8geworCWlkZV9kcml2ZV90CSpkcml2ZTsKKwlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKKwlzdHJ1Y3Qga3JlZglrcmVmOworCisJLyogQnVmZmVyIGZvciB0YWJsZSBvZiBjb250ZW50cy4gIE5VTEwgaWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQKKwkgICBhIFRPQyBidWZmZXIgZm9yIHRoaXMgZGV2aWNlIHlldC4gKi8KKworCXN0cnVjdCBhdGFwaV90b2MgKnRvYzsKKworCXVuc2lnbmVkIGxvbmcJc2VjdG9yX2J1ZmZlcmVkOworCXVuc2lnbmVkIGxvbmcJbnNlY3RvcnNfYnVmZmVyZWQ7CisJdW5zaWduZWQgY2hhcgkqYnVmZmVyOworCisJLyogVGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorCSAgIG9uIHRoaXMgZGV2aWNlLiAqLworCXN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlX2RhdGE7CisKKwlzdHJ1Y3QgcmVxdWVzdCByZXF1ZXN0X3NlbnNlX3JlcXVlc3Q7CisJaW50IGRtYTsKKwlpbnQgY21kOworCXVuc2lnbmVkIGxvbmcgbGFzdF9ibG9jazsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3NlZWs7CisJLyogQnVmZmVyIHRvIGhvbGQgbWVjaGFuaXNtIHN0YXR1cyBhbmQgY2hhbmdlciBzbG90IHRhYmxlLiAqLworCXN0cnVjdCBhdGFwaV9jaGFuZ2VyX2luZm8gKmNoYW5nZXJfaW5mbzsKKworCXN0cnVjdCBpZGVfY2RfY29uZmlnX2ZsYWdzCWNvbmZpZ19mbGFnczsKKwlzdHJ1Y3QgaWRlX2NkX3N0YXRlX2ZsYWdzCXN0YXRlX2ZsYWdzOworCisgICAgICAgIC8qIFBlci1kZXZpY2UgaW5mbyBuZWVkZWQgYnkgY2Ryb20uYyBnZW5lcmljIGRyaXZlci4gKi8KKyAgICAgICAgc3RydWN0IGNkcm9tX2RldmljZV9pbmZvIGRldmluZm87CisKKwl1bnNpZ25lZCBsb25nIHdyaXRlX3RpbWVvdXQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVzY3JpcHRpb25zIG9mIEFUQVBJIGVycm9yIGNvZGVzLgorICovCisKKyNkZWZpbmUgQVJZX0xFTihhKSAoKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkpCisKKy8qIFRoaXMgc3R1ZmYgc2hvdWxkIGJlIGluIGNkcm9tLmgsIHNpbmNlIGl0IGlzIG5vdyBnZW5lcmljLi4uICovCisKKy8qIEFUQVBJIHNlbnNlIGtleXMgKGZyb20gdGFibGUgMTQwIG9mIEFUQVBJIDIuNikgKi8KKyNkZWZpbmUgTk9fU0VOU0UgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRUNPVkVSRURfRVJST1IgICAgICAgICAweDAxCisjZGVmaW5lIE5PVF9SRUFEWSAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUVESVVNX0VSUk9SICAgICAgICAgICAgMHgwMworI2RlZmluZSBIQVJEV0FSRV9FUlJPUiAgICAgICAgICAweDA0CisjZGVmaW5lIElMTEVHQUxfUkVRVUVTVCAgICAgICAgIDB4MDUKKyNkZWZpbmUgVU5JVF9BVFRFTlRJT04gICAgICAgICAgMHgwNgorI2RlZmluZSBEQVRBX1BST1RFQ1QgICAgICAgICAgICAweDA3CisjZGVmaW5lIEJMQU5LX0NIRUNLICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQUJPUlRFRF9DT01NQU5EICAgICAgICAgMHgwYgorI2RlZmluZSBNSVNDT01QQVJFICAgICAgICAgICAgICAweDBlCisKKyAKKworLyogVGhpcyBzdHVmZiBzaG91bGQgYmUgaW4gY2Ryb20uaCwgc2luY2UgaXQgaXMgbm93IGdlbmVyaWMuLi4gKi8KKyNpZiBWRVJCT1NFX0lERV9DRF9FUlJPUlMKKworIC8qIFRoZSBnZW5lcmljIHBhY2tldCBjb21tYW5kIG9wY29kZXMgZm9yIENEL0RWRCBMb2dpY2FsIFVuaXRzLAorICogRnJvbSBUYWJsZSA1NyBvZiB0aGUgU0ZGODA5MCBWZXIuIDMgKE10LiBGdWppKSBkcmFmdCBzdGFuZGFyZC4gKi8gCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBwYWNrZXRfY29tbWFuZDsKKwljb25zdCBjaGFyICogY29uc3QgdGV4dDsKK30gcGFja2V0X2NvbW1hbmRfdGV4dHNbXSA9IHsKKwl7IEdQQ01EX1RFU1RfVU5JVF9SRUFEWSwgIlRlc3QgVW5pdCBSZWFkeSIgfSwKKwl7IEdQQ01EX1JFUVVFU1RfU0VOU0UsICJSZXF1ZXN0IFNlbnNlIiB9LAorCXsgR1BDTURfRk9STUFUX1VOSVQsICJGb3JtYXQgVW5pdCIgfSwKKwl7IEdQQ01EX0lOUVVJUlksICJJbnF1aXJ5IiB9LAorCXsgR1BDTURfU1RBUlRfU1RPUF9VTklULCAiU3RhcnQvU3RvcCBVbml0IiB9LAorCXsgR1BDTURfUFJFVkVOVF9BTExPV19NRURJVU1fUkVNT1ZBTCwgIlByZXZlbnQvQWxsb3cgTWVkaXVtIFJlbW92YWwiIH0sCisJeyBHUENNRF9SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTLCAiUmVhZCBGb3JtYXQgQ2FwYWNpdGllcyIgfSwKKwl7IEdQQ01EX1JFQURfQ0RWRF9DQVBBQ0lUWSwgIlJlYWQgQ2QvRHZkIENhcGFjaXR5IiB9LAorCXsgR1BDTURfUkVBRF8xMCwgIlJlYWQgMTAiIH0sCisJeyBHUENNRF9XUklURV8xMCwgIldyaXRlIDEwIiB9LAorCXsgR1BDTURfU0VFSywgIlNlZWsiIH0sCisJeyBHUENNRF9XUklURV9BTkRfVkVSSUZZXzEwLCAiV3JpdGUgYW5kIFZlcmlmeSAxMCIgfSwKKwl7IEdQQ01EX1ZFUklGWV8xMCwgIlZlcmlmeSAxMCIgfSwKKwl7IEdQQ01EX0ZMVVNIX0NBQ0hFLCAiRmx1c2ggQ2FjaGUiIH0sCisJeyBHUENNRF9SRUFEX1NVQkNIQU5ORUwsICJSZWFkIFN1YmNoYW5uZWwiIH0sCisJeyBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUCwgIlJlYWQgVGFibGUgb2YgQ29udGVudHMiIH0sCisJeyBHUENNRF9SRUFEX0hFQURFUiwgIlJlYWQgSGVhZGVyIiB9LAorCXsgR1BDTURfUExBWV9BVURJT18xMCwgIlBsYXkgQXVkaW8gMTAiIH0sCisJeyBHUENNRF9HRVRfQ09ORklHVVJBVElPTiwgIkdldCBDb25maWd1cmF0aW9uIiB9LAorCXsgR1BDTURfUExBWV9BVURJT19NU0YsICJQbGF5IEF1ZGlvIE1TRiIgfSwKKwl7IEdQQ01EX1BMQVlBVURJT19USSwgIlBsYXkgQXVkaW8gVHJhY2tJbmRleCIgfSwKKwl7IEdQQ01EX0dFVF9FVkVOVF9TVEFUVVNfTk9USUZJQ0FUSU9OLCAiR2V0IEV2ZW50IFN0YXR1cyBOb3RpZmljYXRpb24iIH0sCisJeyBHUENNRF9QQVVTRV9SRVNVTUUsICJQYXVzZS9SZXN1bWUiIH0sCisJeyBHUENNRF9TVE9QX1BMQVlfU0NBTiwgIlN0b3AgUGxheS9TY2FuIiB9LAorCXsgR1BDTURfUkVBRF9ESVNDX0lORk8sICJSZWFkIERpc2MgSW5mbyIgfSwKKwl7IEdQQ01EX1JFQURfVFJBQ0tfUlpPTkVfSU5GTywgIlJlYWQgVHJhY2sgUnpvbmUgSW5mbyIgfSwKKwl7IEdQQ01EX1JFU0VSVkVfUlpPTkVfVFJBQ0ssICJSZXNlcnZlIFJ6b25lIFRyYWNrIiB9LAorCXsgR1BDTURfU0VORF9PUEMsICJTZW5kIE9QQyIgfSwKKwl7IEdQQ01EX01PREVfU0VMRUNUXzEwLCAiTW9kZSBTZWxlY3QgMTAiIH0sCisJeyBHUENNRF9SRVBBSVJfUlpPTkVfVFJBQ0ssICJSZXBhaXIgUnpvbmUgVHJhY2siIH0sCisJeyBHUENNRF9NT0RFX1NFTlNFXzEwLCAiTW9kZSBTZW5zZSAxMCIgfSwKKwl7IEdQQ01EX0NMT1NFX1RSQUNLLCAiQ2xvc2UgVHJhY2siIH0sCisJeyBHUENNRF9CTEFOSywgIkJsYW5rIiB9LAorCXsgR1BDTURfU0VORF9FVkVOVCwgIlNlbmQgRXZlbnQiIH0sCisJeyBHUENNRF9TRU5EX0tFWSwgIlNlbmQgS2V5IiB9LAorCXsgR1BDTURfUkVQT1JUX0tFWSwgIlJlcG9ydCBLZXkiIH0sCisJeyBHUENNRF9MT0FEX1VOTE9BRCwgIkxvYWQvVW5sb2FkIiB9LAorCXsgR1BDTURfU0VUX1JFQURfQUhFQUQsICJTZXQgUmVhZC1haGVhZCIgfSwKKwl7IEdQQ01EX1JFQURfMTIsICJSZWFkIDEyIiB9LAorCXsgR1BDTURfR0VUX1BFUkZPUk1BTkNFLCAiR2V0IFBlcmZvcm1hbmNlIiB9LAorCXsgR1BDTURfU0VORF9EVkRfU1RSVUNUVVJFLCAiU2VuZCBEVkQgU3RydWN0dXJlIiB9LAorCXsgR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFLCAiUmVhZCBEVkQgU3RydWN0dXJlIiB9LAorCXsgR1BDTURfU0VUX1NUUkVBTUlORywgIlNldCBTdHJlYW1pbmciIH0sCisJeyBHUENNRF9SRUFEX0NEX01TRiwgIlJlYWQgQ0QgTVNGIiB9LAorCXsgR1BDTURfU0NBTiwgIlNjYW4iIH0sCisJeyBHUENNRF9TRVRfU1BFRUQsICJTZXQgU3BlZWQiIH0sCisJeyBHUENNRF9QTEFZX0NELCAiUGxheSBDRCIgfSwKKwl7IEdQQ01EX01FQ0hBTklTTV9TVEFUVVMsICJNZWNoYW5pc20gU3RhdHVzIiB9LAorCXsgR1BDTURfUkVBRF9DRCwgIlJlYWQgQ0QiIH0sCit9OworCisKKworLyogRnJvbSBUYWJsZSAzMDMgb2YgdGhlIFNGRjgwOTAgVmVyLiAzIChNdC4gRnVqaSkgZHJhZnQgc3RhbmRhcmQuICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlbnNlX2tleV90ZXh0c1sxNl0gPSB7CisJIk5vIHNlbnNlIGRhdGEiLAorCSJSZWNvdmVyZWQgZXJyb3IiLAorCSJOb3QgcmVhZHkiLAorCSJNZWRpdW0gZXJyb3IiLAorCSJIYXJkd2FyZSBlcnJvciIsCisJIklsbGVnYWwgcmVxdWVzdCIsCisJIlVuaXQgYXR0ZW50aW9uIiwKKwkiRGF0YSBwcm90ZWN0IiwKKwkiQmxhbmsgY2hlY2siLAorCSIocmVzZXJ2ZWQpIiwKKwkiKHJlc2VydmVkKSIsCisJIkFib3J0ZWQgY29tbWFuZCIsCisJIihyZXNlcnZlZCkiLAorCSIocmVzZXJ2ZWQpIiwKKwkiTWlzY29tcGFyZSIsCisJIihyZXNlcnZlZCkiLAorfTsKKworLyogRnJvbSBUYWJsZSAzMDQgb2YgdGhlIFNGRjgwOTAgVmVyLiAzIChNdC4gRnVqaSkgZHJhZnQgc3RhbmRhcmQuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFzY19hc2NxOworCWNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0OworfSBzZW5zZV9kYXRhX3RleHRzW10gPSB7CisJeyAweDAwMDAwMCwgIk5vIGFkZGl0aW9uYWwgc2Vuc2UgaW5mb3JtYXRpb24iIH0sCisJeyAweDAwMDAxMSwgIlBsYXkgb3BlcmF0aW9uIGluIHByb2dyZXNzIiB9LAorCXsgMHgwMDAwMTIsICJQbGF5IG9wZXJhdGlvbiBwYXVzZWQiIH0sCisJeyAweDAwMDAxMywgIlBsYXkgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQiIH0sCisJeyAweDAwMDAxNCwgIlBsYXkgb3BlcmF0aW9uIHN0b3BwZWQgZHVlIHRvIGVycm9yIiB9LAorCXsgMHgwMDAwMTUsICJObyBjdXJyZW50IGF1ZGlvIHN0YXR1cyB0byByZXR1cm4iIH0sCisJeyAweDAxMGMwYSwgIldyaXRlIGVycm9yIC0gcGFkZGluZyBibG9ja3MgYWRkZWQiIH0sCisJeyAweDAxMTcwMCwgIlJlY292ZXJlZCBkYXRhIHdpdGggbm8gZXJyb3IgY29ycmVjdGlvbiBhcHBsaWVkIiB9LAorCXsgMHgwMTE3MDEsICJSZWNvdmVyZWQgZGF0YSB3aXRoIHJldHJpZXMiIH0sCisJeyAweDAxMTcwMiwgIlJlY292ZXJlZCBkYXRhIHdpdGggcG9zaXRpdmUgaGVhZCBvZmZzZXQiIH0sCisJeyAweDAxMTcwMywgIlJlY292ZXJlZCBkYXRhIHdpdGggbmVnYXRpdmUgaGVhZCBvZmZzZXQiIH0sCisJeyAweDAxMTcwNCwgIlJlY292ZXJlZCBkYXRhIHdpdGggcmV0cmllcyBhbmQvb3IgQ0lSQyBhcHBsaWVkIiB9LAorCXsgMHgwMTE3MDUsICJSZWNvdmVyZWQgZGF0YSB1c2luZyBwcmV2aW91cyBzZWN0b3IgSUQiIH0sCisJeyAweDAxMTgwMCwgIlJlY292ZXJlZCBkYXRhIHdpdGggZXJyb3IgY29ycmVjdGlvbiBhcHBsaWVkIiB9LAorCXsgMHgwMTE4MDEsICJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnJlY3Rpb24gYW5kIHJldHJpZXMgYXBwbGllZCJ9LAorCXsgMHgwMTE4MDIsICJSZWNvdmVyZWQgZGF0YSAtIHRoZSBkYXRhIHdhcyBhdXRvLXJlYWxsb2NhdGVkIiB9LAorCXsgMHgwMTE4MDMsICJSZWNvdmVyZWQgZGF0YSB3aXRoIENJUkMiIH0sCisJeyAweDAxMTgwNCwgIlJlY292ZXJlZCBkYXRhIHdpdGggTC1FQyIgfSwKKwl7IDB4MDE1ZDAwLCAKKwkgICAgIkZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQgLSBQcmVkaWN0ZWQgbG9naWNhbCB1bml0IGZhaWx1cmUiIH0sCisJeyAweDAxNWQwMSwgCisJICAgICJGYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIC0gUHJlZGljdGVkIG1lZGlhIGZhaWx1cmUiIH0sCisJeyAweDAxNWRmZiwgIkZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQgLSBGYWxzZSIgfSwKKwl7IDB4MDE3MzAxLCAiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBhbG1vc3QgZnVsbCIgfSwKKwl7IDB4MDIwNDAwLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSAtIGNhdXNlIG5vdCByZXBvcnRhYmxlIiB9LAorCS8qIEZvbGxvd2luZyBpcyBtaXNzcGVsbGVkIGluIEFUQVBJIDIuNiwgX2FuZF8gaW4gTXQuIEZ1amkgKi8KKwl7IDB4MDIwNDAxLAorCSAgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHkgLSBpbiBwcm9ncmVzcyBbc2ljXSBvZiBiZWNvbWluZyByZWFkeSIgfSwKKwl7IDB4MDIwNDAyLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSAtIGluaXRpYWxpemluZyBjb21tYW5kIHJlcXVpcmVkIiB9LAorCXsgMHgwMjA0MDMsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5IC0gbWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZCIgfSwKKwl7IDB4MDIwNDA0LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSAtIGZvcm1hdCBpbiBwcm9ncmVzcyIgfSwKKwl7IDB4MDIwNDA3LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSAtIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyIgfSwKKwl7IDB4MDIwNDA4LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSAtIGxvbmcgd3JpdGUgaW4gcHJvZ3Jlc3MiIH0sCisJeyAweDAyMDYwMCwgIk5vIHJlZmVyZW5jZSBwb3NpdGlvbiBmb3VuZCAobWVkaWEgbWF5IGJlIHVwc2lkZSBkb3duKSIgfSwKKwl7IDB4MDIzMDAwLCAiSW5jb21wYXRpYmxlIG1lZGl1bSBpbnN0YWxsZWQiIH0sCisJeyAweDAyM2EwMCwgIk1lZGl1bSBub3QgcHJlc2VudCIgfSwKKwl7IDB4MDI1MzAwLCAiTWVkaWEgbG9hZCBvciBlamVjdCBmYWlsZWQiIH0sCisJeyAweDAyNTcwMCwgIlVuYWJsZSB0byByZWNvdmVyIHRhYmxlIG9mIGNvbnRlbnRzIiB9LAorCXsgMHgwMzAzMDAsICJQZXJpcGhlcmFsIGRldmljZSB3cml0ZSBmYXVsdCIgfSwKKwl7IDB4MDMwMzAxLCAiTm8gd3JpdGUgY3VycmVudCIgfSwKKwl7IDB4MDMwMzAyLCAiRXhjZXNzaXZlIHdyaXRlIGVycm9ycyIgfSwKKwl7IDB4MDMwYzAwLCAiV3JpdGUgZXJyb3IiIH0sCisJeyAweDAzMGMwMSwgIldyaXRlIGVycm9yIC0gUmVjb3ZlcmVkIHdpdGggYXV0byByZWFsbG9jYXRpb24iIH0sCisJeyAweDAzMGMwMiwgIldyaXRlIGVycm9yIC0gYXV0byByZWFsbG9jYXRpb24gZmFpbGVkIiB9LAorCXsgMHgwMzBjMDMsICJXcml0ZSBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiIH0sCisJeyAweDAzMGMwNCwgIkNvbXByZXNzaW9uIGNoZWNrIG1pc2NvbXBhcmUgZXJyb3IiIH0sCisJeyAweDAzMGMwNSwgIkRhdGEgZXhwYW5zaW9uIG9jY3VycmVkIGR1cmluZyBjb21wcmVzcyIgfSwKKwl7IDB4MDMwYzA2LCAiQmxvY2sgbm90IGNvbXByZXNzaWJsZSIgfSwKKwl7IDB4MDMwYzA3LCAiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBuZWVkZWQiIH0sCisJeyAweDAzMGMwOCwgIldyaXRlIGVycm9yIC0gcmVjb3ZlcnkgZmFpbGVkIiB9LAorCXsgMHgwMzBjMDksICJXcml0ZSBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIiB9LAorCXsgMHgwMzExMDAsICJVbnJlY292ZXJlZCByZWFkIGVycm9yIiB9LAorCXsgMHgwMzExMDYsICJDSVJDIHVucmVjb3ZlcmVkIGVycm9yIiB9LAorCXsgMHgwMzMxMDEsICJGb3JtYXQgY29tbWFuZCBmYWlsZWQiIH0sCisJeyAweDAzMzIwMCwgIk5vIGRlZmVjdCBzcGFyZSBsb2NhdGlvbiBhdmFpbGFibGUiIH0sCisJeyAweDAzMzIwMSwgIkRlZmVjdCBsaXN0IHVwZGF0ZSBmYWlsdXJlIiB9LAorCXsgMHgwMzUxMDAsICJFcmFzZSBmYWlsdXJlIiB9LAorCXsgMHgwMzcyMDAsICJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIiB9LAorCXsgMHgwMzcyMDEsICJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIHdyaXRpbiBsZWFkLWluIiB9LAorCXsgMHgwMzcyMDIsICJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIHdyaXRpbiBsZWFkLW91dCIgfSwKKwl7IDB4MDM3MzAwLCAiQ0QgY29udHJvbCBlcnJvciIgfSwKKwl7IDB4MDM3MzAyLCAiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBpcyBmdWxsIiB9LAorCXsgMHgwMzczMDMsICJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGVycm9yIiB9LAorCXsgMHgwMzczMDQsICJQcm9ncmFtIG1lbW9yeSBhcmVhIC8gUk1BIHVwZGF0ZSBmYWlsdXJlIiB9LAorCXsgMHgwMzczMDUsICJQcm9ncmFtIG1lbW9yeSBhcmVhIC8gUk1BIGlzIGZ1bGwiIH0sCisJeyAweDAzNzMwNiwgIlByb2dyYW0gbWVtb3J5IGFyZWEgLyBSTUEgaXMgKGFsbW9zdCkgZnVsbCIgfSwKKworCXsgMHgwNDAyMDAsICJObyBzZWVrIGNvbXBsZXRlIiB9LAorCXsgMHgwNDAzMDAsICJXcml0ZSBmYXVsdCIgfSwKKwl7IDB4MDQwOTAwLCAiVHJhY2sgZm9sbG93aW5nIGVycm9yIiB9LAorCXsgMHgwNDA5MDEsICJUcmFja2luZyBzZXJ2byBmYWlsdXJlIiB9LAorCXsgMHgwNDA5MDIsICJGb2N1cyBzZXJ2byBmYWlsdXJlIiB9LAorCXsgMHgwNDA5MDMsICJTcGluZGxlIHNlcnZvIGZhaWx1cmUiIH0sCisJeyAweDA0MTUwMCwgIlJhbmRvbSBwb3NpdGlvbmluZyBlcnJvciIgfSwKKwl7IDB4MDQxNTAxLCAiTWVjaGFuaWNhbCBwb3NpdGlvbmluZyBvciBjaGFuZ2VyIGVycm9yIiB9LAorCXsgMHgwNDE1MDIsICJQb3NpdGlvbmluZyBlcnJvciBkZXRlY3RlZCBieSByZWFkIG9mIG1lZGl1bSIgfSwKKwl7IDB4MDQzYzAwLCAiTWVjaGFuaWNhbCBwb3NpdGlvbmluZyBvciBjaGFuZ2VyIGVycm9yIiB9LAorCXsgMHgwNDQwMDAsICJEaWFnbm9zdGljIGZhaWx1cmUgb24gY29tcG9uZW50IChBU0NRKSIgfSwKKwl7IDB4MDQ0NDAwLCAiSW50ZXJuYWwgQ0QvRFZEIGxvZ2ljYWwgdW5pdCBmYWlsdXJlIiB9LAorCXsgMHgwNGI2MDAsICJNZWRpYSBsb2FkIG1lY2hhbmlzbSBmYWlsZWQiIH0sCisJeyAweDA1MWEwMCwgIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciIgfSwKKwl7IDB4MDUyMDAwLCAiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIiB9LAorCXsgMHgwNTIxMDAsICJMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlIiB9LAorCXsgMHgwNTIxMDIsICJJbnZhbGlkIGFkZHJlc3MgZm9yIHdyaXRlIiB9LAorCXsgMHgwNTI0MDAsICJJbnZhbGlkIGZpZWxkIGluIGNvbW1hbmQgcGFja2V0IiB9LAorCXsgMHgwNTI2MDAsICJJbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0IiB9LAorCXsgMHgwNTI2MDEsICJQYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCIgfSwKKwl7IDB4MDUyNjAyLCAiUGFyYW1ldGVyIHZhbHVlIGludmFsaWQiIH0sCisJeyAweDA1MjcwMCwgIldyaXRlIHByb3RlY3RlZCBtZWRpYSIgfSwKKwl7IDB4MDUyYzAwLCAiQ29tbWFuZCBzZXF1ZW5jZSBlcnJvciIgfSwKKwl7IDB4MDUyYzAzLCAiQ3VycmVudCBwcm9ncmFtIGFyZWEgaXMgbm90IGVtcHR5IiB9LAorCXsgMHgwNTJjMDQsICJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBlbXB0eSIgfSwKKwl7IDB4MDUzMDAxLCAiQ2Fubm90IHJlYWQgbWVkaXVtIC0gdW5rbm93biBmb3JtYXQiIH0sCisJeyAweDA1MzAwMiwgIkNhbm5vdCByZWFkIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiIH0sCisJeyAweDA1MzkwMCwgIlNhdmluZyBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyAweDA1NGUwMCwgIk92ZXJsYXBwZWQgY29tbWFuZHMgYXR0ZW1wdGVkIiB9LAorCXsgMHgwNTUzMDIsICJNZWRpdW0gcmVtb3ZhbCBwcmV2ZW50ZWQiIH0sCisJeyAweDA1NTUwMCwgIlN5c3RlbSByZXNvdXJjZSBmYWlsdXJlIiB9LAorCXsgMHgwNTYzMDAsICJFbmQgb2YgdXNlciBhcmVhIGVuY291bnRlcmVkIG9uIHRoaXMgdHJhY2siIH0sCisJeyAweDA1NjQwMCwgIklsbGVnYWwgbW9kZSBmb3IgdGhpcyB0cmFjayBvciBpbmNvbXBhdGlibGUgbWVkaXVtIiB9LAorCXsgMHgwNTZmMDAsICJDb3B5IHByb3RlY3Rpb24ga2V5IGV4Y2hhbmdlIGZhaWx1cmUgLSBBdXRoZW50aWNhdGlvbiBmYWlsdXJlIiB9LAorCXsgMHgwNTZmMDEsICJDb3B5IHByb3RlY3Rpb24ga2V5IGV4Y2hhbmdlIGZhaWx1cmUgLSBLZXkgbm90IHByZXNlbnQiIH0sCisJeyAweDA1NmYwMiwgIkNvcHkgcHJvdGVjdGlvbiBrZXkgZXhjaGFuZ2UgZmFpbHVyZSAtIEtleSBub3QgZXN0YWJsaXNoZWQiIH0sCisJeyAweDA1NmYwMywgIlJlYWQgb2Ygc2NyYW1ibGVkIHNlY3RvciB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIiB9LAorCXsgMHgwNTZmMDQsICJNZWRpYSByZWdpb24gY29kZSBpcyBtaXNtYXRjaGVkIHRvIGxvZ2ljYWwgdW5pdCIgfSwKKwl7IDB4MDU2ZjA1LCAgIkRyaXZlIHJlZ2lvbiBtdXN0IGJlIHBlcm1hbmVudCAvIHJlZ2lvbiByZXNldCBjb3VudCBlcnJvciIgfSwKKwl7IDB4MDU3MjAzLCAiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciAtIGluY29tcGxldGUgdHJhY2sgaW4gc2Vzc2lvbiIgfSwKKwl7IDB4MDU3MjA0LCAiRW1wdHkgb3IgcGFydGlhbGx5IHdyaXR0ZW4gcmVzZXJ2ZWQgdHJhY2siIH0sCisJeyAweDA1NzIwNSwgIk5vIG1vcmUgUlpPTkUgcmVzZXJ2YXRpb25zIGFyZSBhbGxvd2VkIiB9LAorCXsgMHgwNWJmMDAsICJMb3NzIG9mIHN0cmVhbWluZyIgfSwKKwl7IDB4MDYyODAwLCAiTm90IHJlYWR5IHRvIHJlYWR5IHRyYW5zaXRpb24sIG1lZGl1bSBtYXkgaGF2ZSBjaGFuZ2VkIiB9LAorCXsgMHgwNjI5MDAsICJQb3dlciBvbiwgcmVzZXQgb3IgaGFyZHdhcmUgcmVzZXQgb2NjdXJyZWQiIH0sCisJeyAweDA2MmEwMCwgIlBhcmFtZXRlcnMgY2hhbmdlZCIgfSwKKwl7IDB4MDYyYTAxLCAiTW9kZSBwYXJhbWV0ZXJzIGNoYW5nZWQiIH0sCisJeyAweDA2MmUwMCwgIkluc3VmZmljaWVudCB0aW1lIGZvciBvcGVyYXRpb24iIH0sCisJeyAweDA2M2YwMCwgIkxvZ2ljYWwgdW5pdCBvcGVyYXRpbmcgY29uZGl0aW9ucyBoYXZlIGNoYW5nZWQiIH0sCisJeyAweDA2M2YwMSwgIk1pY3JvY29kZSBoYXMgYmVlbiBjaGFuZ2VkIiB9LAorCXsgMHgwNjVhMDAsICJPcGVyYXRvciByZXF1ZXN0IG9yIHN0YXRlIGNoYW5nZSBpbnB1dCAodW5zcGVjaWZpZWQpIiB9LAorCXsgMHgwNjVhMDEsICJPcGVyYXRvciBtZWRpdW0gcmVtb3ZhbCByZXF1ZXN0IiB9LAorCXsgMHgwYmI5MDAsICJQbGF5IG9wZXJhdGlvbiBhYm9ydGVkIiB9LAorCisJLyogSGVyZSB3ZSB1c2UgMHhmZiBmb3IgdGhlIGtleSAobm90IGEgdmFsaWQga2V5KSB0byBzaWduaWZ5CisJICogdGhhdCB0aGVzZSBjYW4gaGF2ZSBfYW55XyBrZXkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZW0uLi4gKi8KKwl7IDB4ZmYwNDAxLCAiTG9naWNhbCB1bml0IGlzIGluIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHkiIH0sCisJeyAweGZmMDQwMCwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGNhdXNlIG5vdCByZXBvcnRhYmxlIiB9LAorCXsgMHhmZjA0MDIsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY29tbWFuZCByZXF1aXJlZCIgfSwKKwl7IDB4ZmYwNDAzLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZCIgfSwKKwl7IDB4ZmYwNTAwLCAiTG9naWNhbCB1bml0IGRvZXMgbm90IHJlc3BvbmQgdG8gc2VsZWN0aW9uIiB9LAorCXsgMHhmZjA4MDAsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBmYWlsdXJlIiB9LAorCXsgMHhmZjA4MDIsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBwYXJpdHkgZXJyb3IiIH0sCisJeyAweGZmMDgwMSwgIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHRpbWUtb3V0IiB9LAorCXsgMHhmZjI1MDAsICJMb2dpY2FsIHVuaXQgbm90IHN1cHBvcnRlZCIgfSwKKwl7IDB4ZmY0YzAwLCAiTG9naWNhbCB1bml0IGZhaWxlZCBzZWxmLWNvbmZpZ3VyYXRpb24iIH0sCisJeyAweGZmM2UwMCwgIkxvZ2ljYWwgdW5pdCBoYXMgbm90IHNlbGYtY29uZmlndXJlZCB5ZXQiIH0sCit9OworI2VuZGlmCisKKworI2VuZGlmIC8qIF9JREVfQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NGY3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKQEAgLTAsMCArMSwxMjgwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMJVmVyc2lvbiAxLjE4CU1hciAwNSwgMjAwMworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCAgTGludXMgVG9ydmFsZHMgJiBhdXRob3JzIChzZWUgYmVsb3cpCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIgIExpbnV4IEFUQSBEZXZlbG9wbWVudAorICoJCQkJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJICAgICBSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworLyoKKyAqICBNb3N0bHkgd3JpdHRlbiBieSBNYXJrIExvcmQgPG1sb3JkQHBvYm94LmNvbT4KKyAqICAgICAgICAgICAgICAgIGFuZCBHYWRpIE94bWFuIDxnYWRpb0BuZXR2aXNpb24ubmV0LmlsPgorICogICAgICAgICAgICAgICAgYW5kIEFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKgorICogVGhpcyBpcyB0aGUgSURFL0FUQSBkaXNrIGRyaXZlciwgYXMgZXZvbHZlZCBmcm9tIGhkLmMgYW5kIGlkZS5jLgorICoKKyAqIFZlcnNpb24gMS4wMAkJbW92ZSBkaXNrIG9ubHkgY29kZSBmcm9tIGlkZS5jIHRvIGlkZS1kaXNrLmMKKyAqCQkJc3VwcG9ydCBvcHRpb25hbCBieXRlLXN3YXBwaW5nIG9mIGFsbCBkYXRhCisgKiBWZXJzaW9uIDEuMDEJCWZpeCBwcmV2aW91cyBieXRlLXN3YXBwaW5nIGNvZGUKKyAqIFZlcnNpb24gMS4wMgkJcmVtb3ZlICIsIExCQSIgZnJvbSBkcml2ZSBpZGVudGlmaWNhdGlvbiBtc2dzCisgKiBWZXJzaW9uIDEuMDMJCWZpeCBkaXNwbGF5IG9mIGlkLT5idWZfc2l6ZSBmb3IgYmlnLWVuZGlhbgorICogVmVyc2lvbiAxLjA0CQlhZGQgL3Byb2MgY29uZmlndXJhYmxlIHNldHRpbmdzIGFuZCBTLk0uQS5SLlQgc3VwcG9ydAorICogVmVyc2lvbiAxLjA1CQlhZGQgY2FwYWNpdHkgc3VwcG9ydCBmb3IgQVRBMyA+PSA4R0IKKyAqIFZlcnNpb24gMS4wNgkJZ2V0IGJvb3QtdXAgbWVzc2FnZXMgdG8gc2hvdyBmdWxsIGN5bCBjb3VudAorICogVmVyc2lvbiAxLjA3CQlkaXNhYmxlIGRvb3ItbG9ja2luZyBpZiBpdCBmYWlscworICogVmVyc2lvbiAxLjA4CQlmaXhlZCBDSFMvTEJBIHRyYW5zbGF0aW9ucyBmb3IgQVRBNCA+IDhHQiwKKyAqCQkJcHJvY2VzcyBvZiBhZGRpbmcgbmV3IEFUQTQgY29tcGxpYW5jZS4KKyAqCQkJZml4ZWQgcHJvYmxlbXMgaW4gYWxsb3dpbmcgZmRpc2sgdG8gc2VlCisgKgkJCXRoZSBlbnRpcmUgZGlzay4KKyAqIFZlcnNpb24gMS4wOQkJYWRkZWQgaW5jcmVtZW50IG9mIHJxLT5zZWN0b3IgaW4gaWRlX211bHR3cml0ZQorICoJCQlhZGRlZCBVRE1BIDMvNCByZXBvcnRpbmcKKyAqIFZlcnNpb24gMS4xMAkJcmVxdWVzdCBxdWV1ZSBjaGFuZ2VzLCBVbHRyYSBETUEgMTAwCisgKiBWZXJzaW9uIDEuMTEJCWFkZGVkIDQ4LWJpdCBsYmEKKyAqIFZlcnNpb24gMS4xMgkJYWRkaW5nIHRhc2tmaWxlIGlvIGFjY2VzcyBtZXRob2QKKyAqIFZlcnNpb24gMS4xMwkJYWRkZWQgc3RhbmRieSBhbmQgZmx1c2gtY2FjaGUgZm9yIG5vdGlmaWVyCisgKiBWZXJzaW9uIDEuMTQJCWFkZGVkIGFjb3VzdGljLXdjYWNoZQorICogVmVyc2lvbiAxLjE1CQljb252ZXJ0IGFsbCBjYWxscyB0byBpZGVfcmF3X3Rhc2tmaWxlCisgKgkJCQlzaW5jZSBhcmdzIHdpbGwgcmV0dXJuIHJlZ2lzdGVyIGNvbnRlbnQuCisgKiBWZXJzaW9uIDEuMTYJCWFkZGVkIHN1c3BlbmQtcmVzdW1lLWNoZWNrcG93ZXIKKyAqIFZlcnNpb24gMS4xNwkJZG8gZmx1c2ggb24gc3RhbmR5LCBkbyBmbHVzaCBvbiBBVEEgPCBBVEE2CisgKgkJCWZpeCB3Y2FjaGUgc2V0dXAuCisgKi8KKworI2RlZmluZSBJREVESVNLX1ZFUlNJT04JIjEuMTgiCisKKyN1bmRlZiBSRUFMTFlfU0xPV19JTwkJLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisvLyNkZWZpbmUgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIF9JREVfRElTSworCisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKK3N0cnVjdCBpZGVfZGlza19vYmogeworCWlkZV9kcml2ZV90CSpkcml2ZTsKKwlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKKwlzdHJ1Y3Qga3JlZglrcmVmOworfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaWRlZGlza19yZWZfc2VtKTsKKworI2RlZmluZSB0b19pZGVfZGlzayhvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBpZGVfZGlza19vYmosIGtyZWYpCisKKyNkZWZpbmUgaWRlX2Rpc2tfZyhkaXNrKSBcCisJY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaWRlX2Rpc2tfb2JqLCBkcml2ZXIpCisKK3N0YXRpYyBzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGVfZGlza19nZXQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IE5VTEw7CisKKwlkb3duKCZpZGVkaXNrX3JlZl9zZW0pOworCWlka3AgPSBpZGVfZGlza19nKGRpc2spOworCWlmIChpZGtwKQorCQlrcmVmX2dldCgmaWRrcC0+a3JlZik7CisJdXAoJmlkZWRpc2tfcmVmX3NlbSk7CisJcmV0dXJuIGlka3A7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9kaXNrX3JlbGVhc2Uoc3RydWN0IGtyZWYgKik7CisKK3N0YXRpYyB2b2lkIGlkZV9kaXNrX3B1dChzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwKQoreworCWRvd24oJmlkZWRpc2tfcmVmX3NlbSk7CisJa3JlZl9wdXQoJmlka3AtPmtyZWYsIGlkZV9kaXNrX3JlbGVhc2UpOworCXVwKCZpZGVkaXNrX3JlZl9zZW0pOworfQorCisvKgorICogbGJhX2NhcGFjaXR5X2lzX29rKCkgcGVyZm9ybXMgYSBzYW5pdHkgY2hlY2sgb24gdGhlIGNsYWltZWQgImxiYV9jYXBhY2l0eSIKKyAqIHZhbHVlIGZvciB0aGlzIGRyaXZlIChmcm9tIGl0cyByZXBvcnRlZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbikuCisgKgorICogUmV0dXJuczoJMSBpZiBsYmFfY2FwYWNpdHkgbG9va3Mgc2Vuc2libGUKKyAqCQkwIG90aGVyd2lzZQorICoKKyAqIEl0IGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggZHJpdmUuCisgKi8KK3N0YXRpYyBpbnQgbGJhX2NhcGFjaXR5X2lzX29rIChzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBsYmFfc2VjdHMsIGNoc19zZWN0cywgaGVhZCwgdGFpbDsKKworCS8qCisJICogVGhlIEFUQSBzcGVjIHRlbGxzIGxhcmdlIGRyaXZlcyB0byByZXR1cm4KKwkgKiBDL0gvUyA9IDE2MzgzLzE2LzYzIGluZGVwZW5kZW50IG9mIHRoZWlyIHNpemUuCisJICogU29tZSBkcml2ZXMgY2FuIGJlIGp1bXBlcmVkIHRvIHVzZSAxNSBoZWFkcyBpbnN0ZWFkIG9mIDE2LgorCSAqIFNvbWUgZHJpdmVzIGNhbiBiZSBqdW1wZXJlZCB0byB1c2UgNDA5MiBjeWxzIGluc3RlYWQgb2YgMTYzODMuCisJICovCisJaWYgKChpZC0+Y3lscyA9PSAxNjM4MworCSAgICAgfHwgKGlkLT5jeWxzID09IDQwOTIgJiYgaWQtPmN1cl9jeWxzID09IDE2MzgzKSkgJiYKKwkgICAgaWQtPnNlY3RvcnMgPT0gNjMgJiYKKwkgICAgKGlkLT5oZWFkcyA9PSAxNSB8fCBpZC0+aGVhZHMgPT0gMTYpICYmCisJICAgIChpZC0+bGJhX2NhcGFjaXR5ID49IDE2MzgzKjYzKmlkLT5oZWFkcykpCisJCXJldHVybiAxOworCisJbGJhX3NlY3RzICAgPSBpZC0+bGJhX2NhcGFjaXR5OworCWNoc19zZWN0cyAgID0gaWQtPmN5bHMgKiBpZC0+aGVhZHMgKiBpZC0+c2VjdG9yczsKKworCS8qIHBlcmZvcm0gYSByb3VnaCBzYW5pdHkgY2hlY2sgb24gbGJhX3NlY3RzOiAgd2l0aGluIDEwJSBpcyBPSyAqLworCWlmICgobGJhX3NlY3RzIC0gY2hzX3NlY3RzKSA8IGNoc19zZWN0cy8xMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBzb21lIGRyaXZlcyBoYXZlIHRoZSB3b3JkIG9yZGVyIHJldmVyc2VkICovCisJaGVhZCA9ICgobGJhX3NlY3RzID4+IDE2KSAmIDB4ZmZmZik7CisJdGFpbCA9IChsYmFfc2VjdHMgJiAweGZmZmYpOworCWxiYV9zZWN0cyA9IChoZWFkIHwgKHRhaWwgPDwgMTYpKTsKKwlpZiAoKGxiYV9zZWN0cyAtIGNoc19zZWN0cykgPCBjaHNfc2VjdHMvMTApIHsKKwkJaWQtPmxiYV9jYXBhY2l0eSA9IGxiYV9zZWN0czsKKwkJcmV0dXJuIDE7CS8qIGxiYV9jYXBhY2l0eSBpcyAobm93KSBnb29kICovCisJfQorCisJcmV0dXJuIDA7CS8qIGxiYV9jYXBhY2l0eSB2YWx1ZSBtYXkgYmUgYmFkICovCit9CisKKy8qCisgKiBfX2lkZV9kb19yd19kaXNrKCkgaXNzdWVzIFJFQUQgYW5kIFdSSVRFIGNvbW1hbmRzIHRvIGEgZGlzaywKKyAqIHVzaW5nIExCQSBpZiBzdXBwb3J0ZWQsIG9yIENIUyBvdGhlcndpc2UsIHRvIGFkZHJlc3Mgc2VjdG9ycy4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBfX2lkZV9kb19yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBzZWN0b3JfdCBibG9jaykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdW5zaWduZWQgaW50IGRtYQk9IGRyaXZlLT51c2luZ19kbWE7CisJdTggbGJhNDgJCT0gKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpID8gMSA6IDA7CisJdGFza19pb3JlZ190IGNvbW1hbmQJPSBXSU5fTk9QOworCWF0YV9uc2VjdG9yX3QJCW5zZWN0b3JzOworCisJbnNlY3RvcnMuYWxsCQk9ICh1MTYpIHJxLT5ucl9zZWN0b3JzOworCisJaWYgKGh3aWYtPm5vX2xiYTQ4X2RtYSAmJiBsYmE0OCAmJiBkbWEpIHsKKwkJaWYgKGJsb2NrICsgcnEtPm5yX3NlY3RvcnMgPiAxVUxMIDw8IDI4KQorCQkJZG1hID0gMDsKKwkJZWxzZQorCQkJbGJhNDggPSAwOworCX0KKworCWlmICghZG1hKSB7CisJCWlkZV9pbml0X3NnX2NtZChkcml2ZSwgcnEpOworCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisJfQorCisJaWYgKElERV9DT05UUk9MX1JFRykKKwkJaHdpZi0+T1VUQihkcml2ZS0+Y3RsLCBJREVfQ09OVFJPTF9SRUcpOworCisJLyogRklYTUU6IFNFTEVDVF9NQVNLKGRyaXZlLCAwKSA/ICovCisKKwlpZiAoZHJpdmUtPnNlbGVjdC5iLmxiYSkgeworCQlpZiAobGJhNDgpIHsKKwkJCXRhc2tfaW9yZWdfdCB0YXNrbGV0c1sxMF07CisKKwkJCXByX2RlYnVnKCIlczogTEJBPTB4JTAxMmxseFxuIiwgZHJpdmUtPm5hbWUsIGJsb2NrKTsKKworCQkJdGFza2xldHNbMF0gPSAwOworCQkJdGFza2xldHNbMV0gPSAwOworCQkJdGFza2xldHNbMl0gPSBuc2VjdG9ycy5iLmxvdzsKKwkJCXRhc2tsZXRzWzNdID0gbnNlY3RvcnMuYi5oaWdoOworCQkJdGFza2xldHNbNF0gPSAodGFza19pb3JlZ190KSBibG9jazsKKwkJCXRhc2tsZXRzWzVdID0gKHRhc2tfaW9yZWdfdCkgKGJsb2NrPj44KTsKKwkJCXRhc2tsZXRzWzZdID0gKHRhc2tfaW9yZWdfdCkgKGJsb2NrPj4xNik7CisJCQl0YXNrbGV0c1s3XSA9ICh0YXNrX2lvcmVnX3QpIChibG9jaz4+MjQpOworCQkJaWYgKHNpemVvZihibG9jaykgPT0gNCkgeworCQkJCXRhc2tsZXRzWzhdID0gKHRhc2tfaW9yZWdfdCkgMDsKKwkJCQl0YXNrbGV0c1s5XSA9ICh0YXNrX2lvcmVnX3QpIDA7CisJCQl9IGVsc2UgeworCQkJCXRhc2tsZXRzWzhdID0gKHRhc2tfaW9yZWdfdCkoKHU2NClibG9jayA+PiAzMik7CisJCQkJdGFza2xldHNbOV0gPSAodGFza19pb3JlZ190KSgodTY0KWJsb2NrID4+IDQwKTsKKwkJCX0KKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKCIlczogMHglMDJ4JTAyeCAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgdGFza2xldHNbM10sIHRhc2tsZXRzWzJdLAorCQkJCXRhc2tsZXRzWzldLCB0YXNrbGV0c1s4XSwgdGFza2xldHNbN10sCisJCQkJdGFza2xldHNbNl0sIHRhc2tsZXRzWzVdLCB0YXNrbGV0c1s0XSk7CisjZW5kaWYKKwkJCWh3aWYtPk9VVEIodGFza2xldHNbMV0sIElERV9GRUFUVVJFX1JFRyk7CisJCQlod2lmLT5PVVRCKHRhc2tsZXRzWzNdLCBJREVfTlNFQ1RPUl9SRUcpOworCQkJaHdpZi0+T1VUQih0YXNrbGV0c1s3XSwgSURFX1NFQ1RPUl9SRUcpOworCQkJaHdpZi0+T1VUQih0YXNrbGV0c1s4XSwgSURFX0xDWUxfUkVHKTsKKwkJCWh3aWYtPk9VVEIodGFza2xldHNbOV0sIElERV9IQ1lMX1JFRyk7CisKKwkJCWh3aWYtPk9VVEIodGFza2xldHNbMF0sIElERV9GRUFUVVJFX1JFRyk7CisJCQlod2lmLT5PVVRCKHRhc2tsZXRzWzJdLCBJREVfTlNFQ1RPUl9SRUcpOworCQkJaHdpZi0+T1VUQih0YXNrbGV0c1s0XSwgSURFX1NFQ1RPUl9SRUcpOworCQkJaHdpZi0+T1VUQih0YXNrbGV0c1s1XSwgSURFX0xDWUxfUkVHKTsKKwkJCWh3aWYtPk9VVEIodGFza2xldHNbNl0sIElERV9IQ1lMX1JFRyk7CisJCQlod2lmLT5PVVRCKDB4MDB8ZHJpdmUtPnNlbGVjdC5hbGwsSURFX1NFTEVDVF9SRUcpOworCQl9IGVsc2UgeworCQkJaHdpZi0+T1VUQigweDAwLCBJREVfRkVBVFVSRV9SRUcpOworCQkJaHdpZi0+T1VUQihuc2VjdG9ycy5iLmxvdywgSURFX05TRUNUT1JfUkVHKTsKKwkJCWh3aWYtPk9VVEIoYmxvY2ssIElERV9TRUNUT1JfUkVHKTsKKwkJCWh3aWYtPk9VVEIoYmxvY2s+Pj04LCBJREVfTENZTF9SRUcpOworCQkJaHdpZi0+T1VUQihibG9jaz4+PTgsIElERV9IQ1lMX1JFRyk7CisJCQlod2lmLT5PVVRCKCgoYmxvY2s+PjgpJjB4MGYpfGRyaXZlLT5zZWxlY3QuYWxsLElERV9TRUxFQ1RfUkVHKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBzZWN0LGhlYWQsY3lsLHRyYWNrOworCQl0cmFjayA9IChpbnQpYmxvY2sgLyBkcml2ZS0+c2VjdDsKKwkJc2VjdCAgPSAoaW50KWJsb2NrICUgZHJpdmUtPnNlY3QgKyAxOworCQlod2lmLT5PVVRCKHNlY3QsIElERV9TRUNUT1JfUkVHKTsKKwkJaGVhZCAgPSB0cmFjayAlIGRyaXZlLT5oZWFkOworCQljeWwgICA9IHRyYWNrIC8gZHJpdmUtPmhlYWQ7CisKKwkJcHJfZGVidWcoIiVzOiBDSFM9JXUvJXUvJXVcbiIsIGRyaXZlLT5uYW1lLCBjeWwsIGhlYWQsIHNlY3QpOworCisJCWh3aWYtPk9VVEIoMHgwMCwgSURFX0ZFQVRVUkVfUkVHKTsKKwkJaHdpZi0+T1VUQihuc2VjdG9ycy5iLmxvdywgSURFX05TRUNUT1JfUkVHKTsKKwkJaHdpZi0+T1VUQihjeWwsIElERV9MQ1lMX1JFRyk7CisJCWh3aWYtPk9VVEIoY3lsPj44LCBJREVfSENZTF9SRUcpOworCQlod2lmLT5PVVRCKGhlYWR8ZHJpdmUtPnNlbGVjdC5hbGwsSURFX1NFTEVDVF9SRUcpOworCX0KKworCWlmIChkbWEpIHsKKwkJaWYgKCFod2lmLT5kbWFfc2V0dXAoZHJpdmUpKSB7CisJCQlpZiAocnFfZGF0YV9kaXIocnEpKSB7CisJCQkJY29tbWFuZCA9IGxiYTQ4ID8gV0lOX1dSSVRFRE1BX0VYVCA6IFdJTl9XUklURURNQTsKKwkJCQlpZiAoZHJpdmUtPnZkbWEpCisJCQkJCWNvbW1hbmQgPSBsYmE0OCA/IFdJTl9XUklURV9FWFQ6IFdJTl9XUklURTsKKwkJCX0gZWxzZSB7CisJCQkJY29tbWFuZCA9IGxiYTQ4ID8gV0lOX1JFQURETUFfRVhUIDogV0lOX1JFQURETUE7CisJCQkJaWYgKGRyaXZlLT52ZG1hKQorCQkJCQljb21tYW5kID0gbGJhNDggPyBXSU5fUkVBRF9FWFQ6IFdJTl9SRUFEOworCQkJfQorCQkJaHdpZi0+ZG1hX2V4ZWNfY21kKGRyaXZlLCBjb21tYW5kKTsKKwkJCWh3aWYtPmRtYV9zdGFydChkcml2ZSk7CisJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJCX0KKwkJLyogZmFsbGJhY2sgdG8gUElPICovCisJCWlkZV9pbml0X3NnX2NtZChkcml2ZSwgcnEpOworCX0KKworCWlmIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkgeworCisJCWlmIChkcml2ZS0+bXVsdF9jb3VudCkgeworCQkJaHdpZi0+ZGF0YV9waGFzZSA9IFRBU0tGSUxFX01VTFRJX0lOOworCQkJY29tbWFuZCA9IGxiYTQ4ID8gV0lOX01VTFRSRUFEX0VYVCA6IFdJTl9NVUxUUkVBRDsKKwkJfSBlbHNlIHsKKwkJCWh3aWYtPmRhdGFfcGhhc2UgPSBUQVNLRklMRV9JTjsKKwkJCWNvbW1hbmQgPSBsYmE0OCA/IFdJTl9SRUFEX0VYVCA6IFdJTl9SRUFEOworCQl9CisKKwkJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgY29tbWFuZCwgJnRhc2tfaW5faW50ciwgV0FJVF9DTUQsIE5VTEwpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfSBlbHNlIHsKKwkJaWYgKGRyaXZlLT5tdWx0X2NvdW50KSB7CisJCQlod2lmLT5kYXRhX3BoYXNlID0gVEFTS0ZJTEVfTVVMVElfT1VUOworCQkJY29tbWFuZCA9IGxiYTQ4ID8gV0lOX01VTFRXUklURV9FWFQgOiBXSU5fTVVMVFdSSVRFOworCQl9IGVsc2UgeworCQkJaHdpZi0+ZGF0YV9waGFzZSA9IFRBU0tGSUxFX09VVDsKKwkJCWNvbW1hbmQgPSBsYmE0OCA/IFdJTl9XUklURV9FWFQgOiBXSU5fV1JJVEU7CisJCX0KKworCQkvKiBGSVhNRTogLT5PVVRCU1lOQyA/ICovCisJCWh3aWYtPk9VVEIoY29tbWFuZCwgSURFX0NPTU1BTkRfUkVHKTsKKworCQlyZXR1cm4gcHJlX3Rhc2tfb3V0X2ludHIoZHJpdmUsIHJxKTsKKwl9Cit9CisKKy8qCisgKiAyNjg0MzU0NTUgID09IDEzNzQzOSBNQiBvciAyOGJpdCBsaW1pdAorICogMzIwMTczMDU2ICA9PSAxNjM5MjkgTUIgb3IgNDhiaXQgYWRkcmVzc2luZworICogMTA3Mzc0MTgyMiA9PSA1NDk3NTYgTUIgb3IgNDhiaXQgYWRkcmVzc2luZyBmYWtlIGRyaXZlCisgKi8KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZG9fcndfZGlzayAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHNlY3Rvcl90IGJsb2NrKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKworCUJVR19PTihkcml2ZS0+YmxvY2tlZCk7CisKKwlpZiAoIWJsa19mc19yZXF1ZXN0KHJxKSkgeworCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZV9kb19yd19kaXNrIC0gYmFkIGNvbW1hbmQiKTsKKwkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCXByX2RlYnVnKCIlczogJXNpbmc6IGJsb2NrPSVsbHUsIHNlY3RvcnM9JWx1LCBidWZmZXI9MHglMDhseFxuIiwKKwkJIGRyaXZlLT5uYW1lLCBycV9kYXRhX2RpcihycSkgPT0gUkVBRCA/ICJyZWFkIiA6ICJ3cml0IiwKKwkJIGJsb2NrLCBycS0+bnJfc2VjdG9ycywgKHVuc2lnbmVkIGxvbmcpcnEtPmJ1ZmZlcik7CisKKwlpZiAoaHdpZi0+cndfZGlzaykKKwkJaHdpZi0+cndfZGlzayhkcml2ZSwgcnEpOworCisJcmV0dXJuIF9faWRlX2RvX3J3X2Rpc2soZHJpdmUsIHJxLCBibG9jayk7Cit9CisKKy8qCisgKiBRdWVyaWVzIGZvciB0cnVlIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIGRyaXZlLgorICogUmV0dXJucyBtYXhpbXVtIExCQSBhZGRyZXNzICg+IDApIG9mIHRoZSBkcml2ZSwgMCBpZiBmYWlsZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlkZWRpc2tfcmVhZF9uYXRpdmVfbWF4X2FkZHJlc3MoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV90YXNrX3QgYXJnczsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOworCisJLyogQ3JlYXRlIElERS9BVEEgY29tbWFuZCByZXF1ZXN0IHN0cnVjdHVyZSAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX1NFTEVDVF9PRkZTRVRdCT0gMHg0MDsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXQk9IFdJTl9SRUFEX05BVElWRV9NQVg7CisJYXJncy5jb21tYW5kX3R5cGUJCQk9IElERV9EUklWRV9UQVNLX05PX0RBVEE7CisJYXJncy5oYW5kbGVyCQkJCT0gJnRhc2tfbm9fZGF0YV9pbnRyOworCS8qIHN1Ym1pdCBjb21tYW5kIHJlcXVlc3QgKi8KKwlpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCk7CisKKwkvKiBpZiBPSywgY29tcHV0ZSBtYXhpbXVtIGFkZHJlc3MgdmFsdWUgKi8KKwlpZiAoKGFyZ3MudGZSZWdpc3RlcltJREVfU1RBVFVTX09GRlNFVF0gJiAweDAxKSA9PSAwKSB7CisJCWFkZHIgPSAoKGFyZ3MudGZSZWdpc3RlcltJREVfU0VMRUNUX09GRlNFVF0gJiAweDBmKSA8PCAyNCkKKwkJICAgICB8ICgoYXJncy50ZlJlZ2lzdGVyWyAgSURFX0hDWUxfT0ZGU0VUXSAgICAgICApIDw8IDE2KQorCQkgICAgIHwgKChhcmdzLnRmUmVnaXN0ZXJbICBJREVfTENZTF9PRkZTRVRdICAgICAgICkgPDwgIDgpCisJCSAgICAgfCAoKGFyZ3MudGZSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF0gICAgICAgKSk7CisJCWFkZHIrKzsJLyogc2luY2UgdGhlIHJldHVybiB2YWx1ZSBpcyAobWF4bGJhIC0gMSksIHdlIGFkZCAxICovCisJfQorCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGlkZWRpc2tfcmVhZF9uYXRpdmVfbWF4X2FkZHJlc3NfZXh0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfdGFza190IGFyZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHIgPSAwOworCisJLyogQ3JlYXRlIElERS9BVEEgY29tbWFuZCByZXF1ZXN0IHN0cnVjdHVyZSAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKworCWFyZ3MudGZSZWdpc3RlcltJREVfU0VMRUNUX09GRlNFVF0JPSAweDQwOworCWFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdCT0gV0lOX1JFQURfTkFUSVZFX01BWF9FWFQ7CisJYXJncy5jb21tYW5kX3R5cGUJCQk9IElERV9EUklWRV9UQVNLX05PX0RBVEE7CisJYXJncy5oYW5kbGVyCQkJCT0gJnRhc2tfbm9fZGF0YV9pbnRyOworICAgICAgICAvKiBzdWJtaXQgY29tbWFuZCByZXF1ZXN0ICovCisgICAgICAgIGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBOVUxMKTsKKworCS8qIGlmIE9LLCBjb21wdXRlIG1heGltdW0gYWRkcmVzcyB2YWx1ZSAqLworCWlmICgoYXJncy50ZlJlZ2lzdGVyW0lERV9TVEFUVVNfT0ZGU0VUXSAmIDB4MDEpID09IDApIHsKKwkJdTMyIGhpZ2ggPSAoYXJncy5ob2JSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdIDw8IDE2KSB8CisJCQkgICAoYXJncy5ob2JSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdIDw8ICA4KSB8CisJCQkgICAgYXJncy5ob2JSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF07CisJCXUzMiBsb3cgID0gKChhcmdzLnRmUmVnaXN0ZXJbSURFX0hDWUxfT0ZGU0VUXSk8PDE2KSB8CisJCQkgICAoKGFyZ3MudGZSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdKTw8OCkgfAorCQkJICAgIChhcmdzLnRmUmVnaXN0ZXJbSURFX1NFQ1RPUl9PRkZTRVRdKTsKKwkJYWRkciA9ICgoX191NjQpaGlnaCA8PCAyNCkgfCBsb3c7CisJCWFkZHIrKzsJLyogc2luY2UgdGhlIHJldHVybiB2YWx1ZSBpcyAobWF4bGJhIC0gMSksIHdlIGFkZCAxICovCisJfQorCXJldHVybiBhZGRyOworfQorCisvKgorICogU2V0cyBtYXhpbXVtIHZpcnR1YWwgTEJBIGFkZHJlc3Mgb2YgdGhlIGRyaXZlLgorICogUmV0dXJucyBuZXcgbWF4aW11bSB2aXJ0dWFsIExCQSBhZGRyZXNzICg+IDApIG9yIDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaWRlZGlza19zZXRfbWF4X2FkZHJlc3MoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIGFkZHJfcmVxKQoreworCWlkZV90YXNrX3QgYXJnczsKKwl1bnNpZ25lZCBsb25nIGFkZHJfc2V0ID0gMDsKKwkKKwlhZGRyX3JlcS0tOworCS8qIENyZWF0ZSBJREUvQVRBIGNvbW1hbmQgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9TRUNUT1JfT0ZGU0VUXQk9ICgoYWRkcl9yZXEgPj4gIDApICYgMHhmZik7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9MQ1lMX09GRlNFVF0JPSAoKGFkZHJfcmVxID4+ICA4KSAmIDB4ZmYpOworCWFyZ3MudGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdCT0gKChhZGRyX3JlcSA+PiAxNikgJiAweGZmKTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX1NFTEVDVF9PRkZTRVRdCT0gKChhZGRyX3JlcSA+PiAyNCkgJiAweDBmKSB8IDB4NDA7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0JPSBXSU5fU0VUX01BWDsKKwlhcmdzLmNvbW1hbmRfdHlwZQkJCT0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKwlhcmdzLmhhbmRsZXIJCQkJPSAmdGFza19ub19kYXRhX2ludHI7CisJLyogc3VibWl0IGNvbW1hbmQgcmVxdWVzdCAqLworCWlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBOVUxMKTsKKwkvKiBpZiBPSywgcmVhZCBuZXcgbWF4aW11bSBhZGRyZXNzIHZhbHVlICovCisJaWYgKChhcmdzLnRmUmVnaXN0ZXJbSURFX1NUQVRVU19PRkZTRVRdICYgMHgwMSkgPT0gMCkgeworCQlhZGRyX3NldCA9ICgoYXJncy50ZlJlZ2lzdGVyW0lERV9TRUxFQ1RfT0ZGU0VUXSAmIDB4MGYpIDw8IDI0KQorCQkJIHwgKChhcmdzLnRmUmVnaXN0ZXJbICBJREVfSENZTF9PRkZTRVRdICAgICAgICkgPDwgMTYpCisJCQkgfCAoKGFyZ3MudGZSZWdpc3RlclsgIElERV9MQ1lMX09GRlNFVF0gICAgICAgKSA8PCAgOCkKKwkJCSB8ICgoYXJncy50ZlJlZ2lzdGVyW0lERV9TRUNUT1JfT0ZGU0VUXSAgICAgICApKTsKKwkJYWRkcl9zZXQrKzsKKwl9CisJcmV0dXJuIGFkZHJfc2V0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGlkZWRpc2tfc2V0X21heF9hZGRyZXNzX2V4dChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyX3JlcSkKK3sKKwlpZGVfdGFza190IGFyZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHJfc2V0ID0gMDsKKworCWFkZHJfcmVxLS07CisJLyogQ3JlYXRlIElERS9BVEEgY29tbWFuZCByZXF1ZXN0IHN0cnVjdHVyZSAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX1NFQ1RPUl9PRkZTRVRdCT0gKChhZGRyX3JlcSA+PiAgMCkgJiAweGZmKTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0xDWUxfT0ZGU0VUXQk9ICgoYWRkcl9yZXEgPj49IDgpICYgMHhmZik7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9IQ1lMX09GRlNFVF0JPSAoKGFkZHJfcmVxID4+PSA4KSAmIDB4ZmYpOworCWFyZ3MudGZSZWdpc3RlcltJREVfU0VMRUNUX09GRlNFVF0gICAgICA9IDB4NDA7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0JPSBXSU5fU0VUX01BWF9FWFQ7CisJYXJncy5ob2JSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF0JPSAoYWRkcl9yZXEgPj49IDgpICYgMHhmZjsKKwlhcmdzLmhvYlJlZ2lzdGVyW0lERV9MQ1lMX09GRlNFVF0JPSAoYWRkcl9yZXEgPj49IDgpICYgMHhmZjsKKwlhcmdzLmhvYlJlZ2lzdGVyW0lERV9IQ1lMX09GRlNFVF0JPSAoYWRkcl9yZXEgPj49IDgpICYgMHhmZjsKKwlhcmdzLmhvYlJlZ2lzdGVyW0lERV9TRUxFQ1RfT0ZGU0VUXQk9IDB4NDA7CisJYXJncy5ob2JSZWdpc3RlcltJREVfQ09OVFJPTF9PRkZTRVRfSE9CXT0gKGRyaXZlLT5jdGx8MHg4MCk7CisJYXJncy5jb21tYW5kX3R5cGUJCQk9IElERV9EUklWRV9UQVNLX05PX0RBVEE7CisJYXJncy5oYW5kbGVyCQkJCT0gJnRhc2tfbm9fZGF0YV9pbnRyOworCS8qIHN1Ym1pdCBjb21tYW5kIHJlcXVlc3QgKi8KKwlpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCk7CisJLyogaWYgT0ssIGNvbXB1dGUgbWF4aW11bSBhZGRyZXNzIHZhbHVlICovCisJaWYgKChhcmdzLnRmUmVnaXN0ZXJbSURFX1NUQVRVU19PRkZTRVRdICYgMHgwMSkgPT0gMCkgeworCQl1MzIgaGlnaCA9IChhcmdzLmhvYlJlZ2lzdGVyW0lERV9IQ1lMX09GRlNFVF0gPDwgMTYpIHwKKwkJCSAgIChhcmdzLmhvYlJlZ2lzdGVyW0lERV9MQ1lMX09GRlNFVF0gPDwgIDgpIHwKKwkJCSAgICBhcmdzLmhvYlJlZ2lzdGVyW0lERV9TRUNUT1JfT0ZGU0VUXTsKKwkJdTMyIGxvdyAgPSAoKGFyZ3MudGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdKTw8MTYpIHwKKwkJCSAgICgoYXJncy50ZlJlZ2lzdGVyW0lERV9MQ1lMX09GRlNFVF0pPDw4KSB8CisJCQkgICAgKGFyZ3MudGZSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF0pOworCQlhZGRyX3NldCA9ICgoX191NjQpaGlnaCA8PCAyNCkgfCBsb3c7CisJCWFkZHJfc2V0Kys7CisJfQorCXJldHVybiBhZGRyX3NldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzZWN0b3JzX3RvX01CKHVuc2lnbmVkIGxvbmcgbG9uZyBuKQoreworCW4gPDw9IDk7CQkvKiBtYWtlIGl0IGJ5dGVzICovCisJZG9fZGl2KG4sIDEwMDAwMDApOwkvKiBtYWtlIGl0IE1CICovCisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBCaXRzIDEwIG9mIGNvbW1hbmRfc2V0XzEgYW5kIGNmc19lbmFibGVfMSBtdXN0IGJlIGVxdWFsLAorICogc28gb24gbm9uLWJ1Z2d5IGRyaXZlcyB3ZSBuZWVkIHRlc3Qgb25seSBvbmUuCisgKiBIb3dldmVyLCB3ZSBzaG91bGQgYWxzbyBjaGVjayB3aGV0aGVyIHRoZXNlIGZpZWxkcyBhcmUgdmFsaWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlkZWRpc2tfc3VwcG9ydHNfaHBhKGNvbnN0IHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKwlyZXR1cm4gKGlkLT5jb21tYW5kX3NldF8xICYgMHgwNDAwKSAmJiAoaWQtPmNmc19lbmFibGVfMSAmIDB4MDQwMCk7Cit9CisKKy8qCisgKiBUaGUgc2FtZSBoZXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpZGVkaXNrX3N1cHBvcnRzX2xiYTQ4KGNvbnN0IHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKwlyZXR1cm4gKGlkLT5jb21tYW5kX3NldF8yICYgMHgwNDAwKSAmJiAoaWQtPmNmc19lbmFibGVfMiAmIDB4MDQwMCkKKwkgICAgICAgJiYgaWQtPmxiYV9jYXBhY2l0eV8yOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlZGlza19jaGVja19ocGEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjYXBhY2l0eSwgc2V0X21heDsKKwlpbnQgbGJhNDggPSBpZGVkaXNrX3N1cHBvcnRzX2xiYTQ4KGRyaXZlLT5pZCk7CisKKwljYXBhY2l0eSA9IGRyaXZlLT5jYXBhY2l0eTY0OworCWlmIChsYmE0OCkKKwkJc2V0X21heCA9IGlkZWRpc2tfcmVhZF9uYXRpdmVfbWF4X2FkZHJlc3NfZXh0KGRyaXZlKTsKKwllbHNlCisJCXNldF9tYXggPSBpZGVkaXNrX3JlYWRfbmF0aXZlX21heF9hZGRyZXNzKGRyaXZlKTsKKworCWlmIChzZXRfbWF4IDw9IGNhcGFjaXR5KQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSG9zdCBQcm90ZWN0ZWQgQXJlYSBkZXRlY3RlZC5cbiIKKwkJCSAiXHRjdXJyZW50IGNhcGFjaXR5IGlzICVsbHUgc2VjdG9ycyAoJWxsdSBNQilcbiIKKwkJCSAiXHRuYXRpdmUgIGNhcGFjaXR5IGlzICVsbHUgc2VjdG9ycyAoJWxsdSBNQilcbiIsCisJCQkgZHJpdmUtPm5hbWUsCisJCQkgY2FwYWNpdHksIHNlY3RvcnNfdG9fTUIoY2FwYWNpdHkpLAorCQkJIHNldF9tYXgsIHNlY3RvcnNfdG9fTUIoc2V0X21heCkpOworCisJaWYgKGxiYTQ4KQorCQlzZXRfbWF4ID0gaWRlZGlza19zZXRfbWF4X2FkZHJlc3NfZXh0KGRyaXZlLCBzZXRfbWF4KTsKKwllbHNlCisJCXNldF9tYXggPSBpZGVkaXNrX3NldF9tYXhfYWRkcmVzcyhkcml2ZSwgc2V0X21heCk7CisJaWYgKHNldF9tYXgpIHsKKwkJZHJpdmUtPmNhcGFjaXR5NjQgPSBzZXRfbWF4OworCQlwcmludGsoS0VSTl9JTkZPICIlczogSG9zdCBQcm90ZWN0ZWQgQXJlYSBkaXNhYmxlZC5cbiIsCisJCQkJIGRyaXZlLT5uYW1lKTsKKwl9Cit9CisKKy8qCisgKiBDb21wdXRlIGRyaXZlLT5jYXBhY2l0eSwgdGhlIGZ1bGwgY2FwYWNpdHkgb2YgdGhlIGRyaXZlCisgKiBDYWxsZWQgd2l0aCBkcml2ZS0+aWQgIT0gTlVMTC4KKyAqCisgKiBUbyBjb21wdXRlIGNhcGFjaXR5LCB0aGlzIHVzZXMgZWl0aGVyIG9mCisgKgorICogICAgMS4gQ0hTIHZhbHVlIHNldCBieSB1c2VyICAgICAgICh3aGF0ZXZlciB1c2VyIHNldHMgd2lsbCBiZSB0cnVzdGVkKQorICogICAgMi4gTEJBIHZhbHVlIGZyb20gdGFyZ2V0IGRyaXZlIChyZXF1aXJlIG5ldyBBVEEgZmVhdHVyZSkKKyAqICAgIDMuIExCQSB2YWx1ZSBmcm9tIHN5c3RlbSBCSU9TICAobmV3IG9uZSBpcyBPSywgb2xkIG9uZSBtYXkgYnJlYWspCisgKiAgICA0LiBDSFMgdmFsdWUgZnJvbSBzeXN0ZW0gQklPUyAgKHRyYWRpdGlvbmFsIHN0eWxlKQorICoKKyAqIGluIGFib3ZlIG9yZGVyIChpLmUuLCBpZiB2YWx1ZSBvZiBoaWdoZXIgcHJpb3JpdHkgaXMgYXZhaWxhYmxlLAorICogcmVzZXQgd2lsbCBiZSBpZ25vcmVkKS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9pZGVkaXNrX2NhcGFjaXR5IChpZGVfZHJpdmVfdCAgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwkvKgorCSAqIElmIHRoaXMgZHJpdmUgc3VwcG9ydHMgdGhlIEhvc3QgUHJvdGVjdGVkIEFyZWEgZmVhdHVyZSBzZXQsCisJICogdGhlbiB3ZSBtYXkgbmVlZCB0byBjaGFuZ2Ugb3VyIG9waW5pb24gYWJvdXQgdGhlIGRyaXZlJ3MgY2FwYWNpdHkuCisJICovCisJaW50IGhwYSA9IGlkZWRpc2tfc3VwcG9ydHNfaHBhKGlkKTsKKworCWlmIChpZGVkaXNrX3N1cHBvcnRzX2xiYTQ4KGlkKSkgeworCQkvKiBkcml2ZSBzcGVha3MgNDgtYml0IExCQSAqLworCQlkcml2ZS0+c2VsZWN0LmIubGJhID0gMTsKKwkJZHJpdmUtPmNhcGFjaXR5NjQgPSBpZC0+bGJhX2NhcGFjaXR5XzI7CisJCWlmIChocGEpCisJCQlpZGVkaXNrX2NoZWNrX2hwYShkcml2ZSk7CisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiAyKSAmJiBsYmFfY2FwYWNpdHlfaXNfb2soaWQpKSB7CisJCS8qIGRyaXZlIHNwZWFrcyAyOC1iaXQgTEJBICovCisJCWRyaXZlLT5zZWxlY3QuYi5sYmEgPSAxOworCQlkcml2ZS0+Y2FwYWNpdHk2NCA9IGlkLT5sYmFfY2FwYWNpdHk7CisJCWlmIChocGEpCisJCQlpZGVkaXNrX2NoZWNrX2hwYShkcml2ZSk7CisJfSBlbHNlIHsKKwkJLyogZHJpdmUgc3BlYWtzIGJvcmluZyBvbGQgMjgtYml0IENIUyAqLworCQlkcml2ZS0+Y2FwYWNpdHk2NCA9IGRyaXZlLT5jeWwgKiBkcml2ZS0+aGVhZCAqIGRyaXZlLT5zZWN0OworCX0KK30KKworc3RhdGljIHNlY3Rvcl90IGlkZWRpc2tfY2FwYWNpdHkgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gZHJpdmUtPmNhcGFjaXR5NjQgLSBkcml2ZS0+c2VjdDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IHNtYXJ0X2VuYWJsZShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX3Rhc2tfdCBhcmdzOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOworCWFyZ3MudGZSZWdpc3RlcltJREVfRkVBVFVSRV9PRkZTRVRdCT0gU01BUlRfRU5BQkxFOworCWFyZ3MudGZSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdCT0gU01BUlRfTENZTF9QQVNTOworCWFyZ3MudGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdCT0gU01BUlRfSENZTF9QQVNTOworCWFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdCT0gV0lOX1NNQVJUOworCWFyZ3MuY29tbWFuZF90eXBlCQkJPSBJREVfRFJJVkVfVEFTS19OT19EQVRBOworCWFyZ3MuaGFuZGxlcgkJCQk9ICZ0YXNrX25vX2RhdGFfaW50cjsKKwlyZXR1cm4gaWRlX3Jhd190YXNrZmlsZShkcml2ZSwgJmFyZ3MsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGdldF9zbWFydF92YWx1ZXMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCAqYnVmKQoreworCWlkZV90YXNrX3QgYXJnczsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0ZFQVRVUkVfT0ZGU0VUXQk9IFNNQVJUX1JFQURfVkFMVUVTOworCWFyZ3MudGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdCT0gMHgwMTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0xDWUxfT0ZGU0VUXQk9IFNNQVJUX0xDWUxfUEFTUzsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0hDWUxfT0ZGU0VUXQk9IFNNQVJUX0hDWUxfUEFTUzsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXQk9IFdJTl9TTUFSVDsKKwlhcmdzLmNvbW1hbmRfdHlwZQkJCT0gSURFX0RSSVZFX1RBU0tfSU47CisJYXJncy5kYXRhX3BoYXNlCQkJCT0gVEFTS0ZJTEVfSU47CisJYXJncy5oYW5kbGVyCQkJCT0gJnRhc2tfaW5faW50cjsKKwkodm9pZCkgc21hcnRfZW5hYmxlKGRyaXZlKTsKKwlyZXR1cm4gaWRlX3Jhd190YXNrZmlsZShkcml2ZSwgJmFyZ3MsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NtYXJ0X3RocmVzaG9sZHMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCAqYnVmKQoreworCWlkZV90YXNrX3QgYXJnczsKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9GRUFUVVJFX09GRlNFVF0JPSBTTUFSVF9SRUFEX1RIUkVTSE9MRFM7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9OU0VDVE9SX09GRlNFVF0JPSAweDAxOworCWFyZ3MudGZSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdCT0gU01BUlRfTENZTF9QQVNTOworCWFyZ3MudGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdCT0gU01BUlRfSENZTF9QQVNTOworCWFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdCT0gV0lOX1NNQVJUOworCWFyZ3MuY29tbWFuZF90eXBlCQkJPSBJREVfRFJJVkVfVEFTS19JTjsKKwlhcmdzLmRhdGFfcGhhc2UJCQkJPSBUQVNLRklMRV9JTjsKKwlhcmdzLmhhbmRsZXIJCQkJPSAmdGFza19pbl9pbnRyOworCSh2b2lkKSBzbWFydF9lbmFibGUoZHJpdmUpOworCXJldHVybiBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgYnVmKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9jYWNoZQorCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKKwljaGFyCQkqb3V0ID0gcGFnZTsKKwlpbnQJCWxlbjsKKworCWlmIChkcml2ZS0+aWRfcmVhZCkKKwkJbGVuID0gc3ByaW50ZihvdXQsIiVpXG4iLCBkcml2ZS0+aWQtPmJ1Zl9zaXplIC8gMik7CisJZWxzZQorCQlsZW4gPSBzcHJpbnRmKG91dCwiKG5vbmUpXG4iKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9jYXBhY2l0eQorCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfZHJpdmVfdCpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwiJWxsdVxuIiwgKGxvbmcgbG9uZylpZGVkaXNrX2NhcGFjaXR5KGRyaXZlKSk7CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVkaXNrX3JlYWRfc21hcnRfdGhyZXNob2xkcworCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKilkYXRhOworCWludAkJbGVuID0gMCwgaSA9IDA7CisKKwlpZiAoIWdldF9zbWFydF90aHJlc2hvbGRzKGRyaXZlLCBwYWdlKSkgeworCQl1bnNpZ25lZCBzaG9ydCAqdmFsID0gKHVuc2lnbmVkIHNob3J0ICopIHBhZ2U7CisJCWNoYXIgKm91dCA9ICgoY2hhciAqKXZhbCkgKyAoU0VDVE9SX1dPUkRTICogNCk7CisJCXBhZ2UgPSBvdXQ7CisJCWRvIHsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUwNHglYyIsIGxlMTZfdG9fY3B1KCp2YWwpLCAoKytpICYgNykgPyAnICcgOiAnXG4nKTsKKwkJCXZhbCArPSAxOworCQl9IHdoaWxlIChpIDwgKFNFQ1RPUl9XT1JEUyAqIDIpKTsKKwkJbGVuID0gb3V0IC0gcGFnZTsKKwl9CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVkaXNrX3JlYWRfc21hcnRfdmFsdWVzCisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJaW50CQlsZW4gPSAwLCBpID0gMDsKKworCWlmICghZ2V0X3NtYXJ0X3ZhbHVlcyhkcml2ZSwgcGFnZSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgKnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBwYWdlOworCQljaGFyICpvdXQgPSAoKGNoYXIgKil2YWwpICsgKFNFQ1RPUl9XT1JEUyAqIDQpOworCQlwYWdlID0gb3V0OworCQlkbyB7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDR4JWMiLCBsZTE2X3RvX2NwdSgqdmFsKSwgKCsraSAmIDcpID8gJyAnIDogJ1xuJyk7CisJCQl2YWwgKz0gMTsKKwkJfSB3aGlsZSAoaSA8IChTRUNUT1JfV09SRFMgKiAyKSk7CisJCWxlbiA9IG91dCAtIHBhZ2U7CisJfQorCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZixsZW4pOworfQorCitzdGF0aWMgaWRlX3Byb2NfZW50cnlfdCBpZGVkaXNrX3Byb2NbXSA9IHsKKwl7ICJjYWNoZSIsCQlTX0lGUkVHfFNfSVJVR08sCXByb2NfaWRlZGlza19yZWFkX2NhY2hlLAkJTlVMTCB9LAorCXsgImNhcGFjaXR5IiwJCVNfSUZSRUd8U19JUlVHTywJcHJvY19pZGVkaXNrX3JlYWRfY2FwYWNpdHksCQlOVUxMIH0sCisJeyAiZ2VvbWV0cnkiLAkJU19JRlJFR3xTX0lSVUdPLAlwcm9jX2lkZV9yZWFkX2dlb21ldHJ5LAkJCU5VTEwgfSwKKwl7ICJzbWFydF92YWx1ZXMiLAlTX0lGUkVHfFNfSVJVU1IsCXByb2NfaWRlZGlza19yZWFkX3NtYXJ0X3ZhbHVlcywJCU5VTEwgfSwKKwl7ICJzbWFydF90aHJlc2hvbGRzIiwJU19JRlJFR3xTX0lSVVNSLAlwcm9jX2lkZWRpc2tfcmVhZF9zbWFydF90aHJlc2hvbGRzLAlOVUxMIH0sCisJeyBOVUxMLCAwLCBOVUxMLCBOVUxMIH0KK307CisKKyNlbHNlCisKKyNkZWZpbmUJaWRlZGlza19wcm9jCU5VTEwKKworI2VuZGlmCS8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyB2b2lkIGlkZWRpc2tfZW5kX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKmZsdXNoX3JxKQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBmbHVzaF9ycS0+ZW5kX2lvX2RhdGE7CisJaW50IGdvb2Rfc2VjdG9ycyA9IHJxLT5oYXJkX25yX3NlY3RvcnM7CisJaW50IGJhZF9zZWN0b3JzOworCXNlY3Rvcl90IHNlY3RvcjsKKworCWlmIChmbHVzaF9ycS0+ZXJyb3JzICYgQUJSVF9FUlIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFycmllciBzdXBwb3J0IGRvZXNuJ3Qgd29ya1xuIiwgZHJpdmUtPm5hbWUpOworCQlibGtfcXVldWVfb3JkZXJlZChkcml2ZS0+cXVldWUsIFFVRVVFX09SREVSRURfTk9ORSk7CisJCWJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihkcml2ZS0+cXVldWUsIE5VTEwpOworCQlnb29kX3NlY3RvcnMgPSAwOworCX0gZWxzZSBpZiAoZmx1c2hfcnEtPmVycm9ycykgeworCQlnb29kX3NlY3RvcnMgPSAwOworCQlpZiAoYmxrX2JhcnJpZXJfcHJlZmx1c2gocnEpKSB7CisJCQlzZWN0b3IgPSBpZGVfZ2V0X2Vycm9yX2xvY2F0aW9uKGRyaXZlLGZsdXNoX3JxLT5idWZmZXIpOworCQkJaWYgKChzZWN0b3IgPj0gcnEtPmhhcmRfc2VjdG9yKSAmJgorCQkJICAgIChzZWN0b3IgPCBycS0+aGFyZF9zZWN0b3IgKyBycS0+aGFyZF9ucl9zZWN0b3JzKSkKKwkJCQlnb29kX3NlY3RvcnMgPSBzZWN0b3IgLSBycS0+aGFyZF9zZWN0b3I7CisJCX0KKwl9CisKKwlpZiAoZmx1c2hfcnEtPmVycm9ycykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGJhcnJpZXIgd3JpdGU6ICIKKwkJCQkic2VjdG9yPSVMeChnb29kPSVkL2JhZD0lZClcbiIsCisJCQkJZHJpdmUtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpcnEtPnNlY3RvciwKKwkJCQlnb29kX3NlY3RvcnMsCisJCQkJKGludCkgKHJxLT5oYXJkX25yX3NlY3RvcnMtZ29vZF9zZWN0b3JzKSk7CisKKwliYWRfc2VjdG9ycyA9IHJxLT5oYXJkX25yX3NlY3RvcnMgLSBnb29kX3NlY3RvcnM7CisKKwlpZiAoZ29vZF9zZWN0b3JzKQorCQlfX2lkZV9lbmRfcmVxdWVzdChkcml2ZSwgcnEsIDEsIGdvb2Rfc2VjdG9ycyk7CisJaWYgKGJhZF9zZWN0b3JzKQorCQlfX2lkZV9lbmRfcmVxdWVzdChkcml2ZSwgcnEsIDAsIGJhZF9zZWN0b3JzKTsKK30KKworc3RhdGljIGludCBpZGVkaXNrX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gcS0+cXVldWVkYXRhOworCisJaWYgKCFkcml2ZS0+d2NhY2hlKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOworCisJaWYgKGlkZV9pZF9oYXNfZmx1c2hfY2FjaGVfZXh0KGRyaXZlLT5pZCkgJiYKKwkgICAgKGRyaXZlLT5jYXBhY2l0eTY0ID49ICgxVUwgPDwgMjgpKSkKKwkJcnEtPmNtZFswXSA9IFdJTl9GTFVTSF9DQUNIRV9FWFQ7CisJZWxzZQorCQlycS0+Y21kWzBdID0gV0lOX0ZMVVNIX0NBQ0hFOworCisKKwlycS0+ZmxhZ3MgfD0gUkVRX0RSSVZFX1RBU0sgfCBSRVFfU09GVEJBUlJJRVI7CisJcnEtPmJ1ZmZlciA9IHJxLT5jbWQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaWRlZGlza19pc3N1ZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorCQkJICAgICAgIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlpbnQgcmV0OworCisJaWYgKCFkcml2ZS0+d2NhY2hlKQorCQlyZXR1cm4gMDsKKworCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFdSSVRFLCBfX0dGUF9XQUlUKTsKKworCWlkZWRpc2tfcHJlcGFyZV9mbHVzaChxLCBycSk7CisKKwlyZXQgPSBibGtfZXhlY3V0ZV9ycShxLCBkaXNrLCBycSk7CisKKwkvKgorCSAqIGlmIHdlIGZhaWxlZCBhbmQgY2FsbGVyIHdhbnRzIGVycm9yIG9mZnNldCwgZ2V0IGl0CisJICovCisJaWYgKHJldCAmJiBlcnJvcl9zZWN0b3IpCisJCSplcnJvcl9zZWN0b3IgPSBpZGVfZ2V0X2Vycm9yX2xvY2F0aW9uKGRyaXZlLCBycS0+Y21kKTsKKworCWJsa19wdXRfcmVxdWVzdChycSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGlnaHRseSB3b3ZlbiBpbnRvIHRoZSBkcml2ZXItPmRvX3NwZWNpYWwgY2FuIG5vdCB0b3VjaC4KKyAqIERPTidUIGRvIGl0IGFnYWluIHVudGlsIGEgdG90YWwgcGVyc29uYWxpdHkgcmV3cml0ZSBpcyBjb21taXR0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2V0X211bHRjb3VudChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCit7CisJc3RydWN0IHJlcXVlc3QgcnE7CisKKwlpZiAoZHJpdmUtPnNwZWNpYWwuYi5zZXRfbXVsdG1vZGUpCisJCXJldHVybiAtRUJVU1k7CisJaWRlX2luaXRfZHJpdmVfY21kICgmcnEpOworCXJxLmZsYWdzID0gUkVRX0RSSVZFX0NNRDsKKwlkcml2ZS0+bXVsdF9yZXEgPSBhcmc7CisJZHJpdmUtPnNwZWNpYWwuYi5zZXRfbXVsdG1vZGUgPSAxOworCSh2b2lkKSBpZGVfZG9fZHJpdmVfY21kIChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7CisJcmV0dXJuIChkcml2ZS0+bXVsdF9jb3VudCA9PSBhcmcpID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgc2V0X25vd2VycihpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCit7CisJaWYgKGlkZV9zcGluX3dhaXRfaHdncm91cChkcml2ZSkpCisJCXJldHVybiAtRUJVU1k7CisJZHJpdmUtPm5vd2VyciA9IGFyZzsKKwlkcml2ZS0+YmFkX3dzdGF0ID0gYXJnID8gQkFEX1JfU1RBVCA6IEJBRF9XX1NUQVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY2FjaGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQoreworCWlkZV90YXNrX3QgYXJnczsKKwlpbnQgZXJyOworCisJaWYgKCFpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlKGRyaXZlLT5pZCkpCisJCXJldHVybiAxOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOworCWFyZ3MudGZSZWdpc3RlcltJREVfRkVBVFVSRV9PRkZTRVRdCT0gKGFyZykgPworCQkJU0VURkVBVFVSRVNfRU5fV0NBQ0hFIDogU0VURkVBVFVSRVNfRElTX1dDQUNIRTsKKwlhcmdzLnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXQk9IFdJTl9TRVRGRUFUVVJFUzsKKwlhcmdzLmNvbW1hbmRfdHlwZQkJCT0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKwlhcmdzLmhhbmRsZXIJCQkJPSAmdGFza19ub19kYXRhX2ludHI7CisKKwllcnIgPSBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRyaXZlLT53Y2FjaGUgPSBhcmc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9faWRlZGlza19mbHVzaGNhY2hlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX3Rhc2tfdCBhcmdzOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOworCWlmIChpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlX2V4dChkcml2ZS0+aWQpKQorCQlhcmdzLnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXQk9IFdJTl9GTFVTSF9DQUNIRV9FWFQ7CisJZWxzZQorCQlhcmdzLnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXQk9IFdJTl9GTFVTSF9DQUNIRTsKKwlhcmdzLmNvbW1hbmRfdHlwZQkJCT0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKwlhcmdzLmhhbmRsZXIJCQkJPSAmdGFza19ub19kYXRhX2ludHI7CisJcmV0dXJuIGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzZXRfYWNvdXN0aWMgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKK3sKKwlpZGVfdGFza190IGFyZ3M7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9GRUFUVVJFX09GRlNFVF0JPSAoYXJnKSA/IFNFVEZFQVRVUkVTX0VOX0FBTSA6CisJCQkJCQkJICBTRVRGRUFUVVJFU19ESVNfQUFNOworCWFyZ3MudGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdCT0gYXJnOworCWFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdCT0gV0lOX1NFVEZFQVRVUkVTOworCWFyZ3MuY29tbWFuZF90eXBlID0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKwlhcmdzLmhhbmRsZXIJICA9ICZ0YXNrX25vX2RhdGFfaW50cjsKKwlpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCk7CisJZHJpdmUtPmFjb3VzdGljID0gYXJnOworCXJldHVybiAwOworfQorCisvKgorICogZHJpdmUtPmFkZHJlc3Npbmc6CisgKgkwOiAyOC1iaXQKKyAqCTE6IDQ4LWJpdAorICoJMjogNDgtYml0IGNhcGFibGUgZG9pbmcgMjgtYml0CisgKi8KK3N0YXRpYyBpbnQgc2V0X2xiYV9hZGRyZXNzaW5nKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKK3sKKwlkcml2ZS0+YWRkcmVzc2luZyA9ICAwOworCisJaWYgKEhXSUYoZHJpdmUpLT5ub19sYmE0OCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWlkZWRpc2tfc3VwcG9ydHNfbGJhNDgoZHJpdmUtPmlkKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKwlkcml2ZS0+YWRkcmVzc2luZyA9IGFyZzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWRlZGlza19hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3NfY3lsIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0lOVCwJMCwJNjU1MzUsCQkJCTEsCTEsCSZkcml2ZS0+Ymlvc19jeWwsCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJiaW9zX2hlYWQiLAkJU0VUVElOR19SVywJCQkJCS0xLAkJCS0xLAkJCVRZUEVfQllURSwJMCwJMjU1LAkJCQkxLAkxLAkmZHJpdmUtPmJpb3NfaGVhZCwJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3Nfc2VjdCIsCQlTRVRUSU5HX1JXLAkJCQkJLTEsCQkJLTEsCQkJVFlQRV9CWVRFLAkwLAk2MywJCQkJMSwJMSwJJmRyaXZlLT5iaW9zX3NlY3QsCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJhZGRyZXNzIiwJCVNFVFRJTkdfUlcsCQkJCQlIRElPX0dFVF9BRERSRVNTLAlIRElPX1NFVF9BRERSRVNTLAlUWVBFX0lOVEEsCTAsCTIsCQkJCTEsCTEsCSZkcml2ZS0+YWRkcmVzc2luZywJc2V0X2xiYV9hZGRyZXNzaW5nKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJic3dhcCIsCQlTRVRUSU5HX1JFQUQsCQkJCQktMSwJCQktMSwJCQlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCTEsCSZkcml2ZS0+YnN3YXAsCQkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibXVsdGNvdW50IiwJCWlkID8gU0VUVElOR19SVyA6IFNFVFRJTkdfUkVBRCwJCQlIRElPX0dFVF9NVUxUQ09VTlQsCUhESU9fU0VUX01VTFRDT1VOVCwJVFlQRV9CWVRFLAkwLAlpZCA/IGlkLT5tYXhfbXVsdHNlY3QgOiAwLAkxLAkxLAkmZHJpdmUtPm11bHRfY291bnQsCQlzZXRfbXVsdGNvdW50KTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJub3dlcnIiLAkJU0VUVElOR19SVywJCQkJCUhESU9fR0VUX05PV0VSUiwJSERJT19TRVRfTk9XRVJSLAlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCTEsCSZkcml2ZS0+bm93ZXJyLAkJCXNldF9ub3dlcnIpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImx1biIsCQkJU0VUVElOR19SVywJCQkJCS0xLAkJCS0xLAkJCVRZUEVfSU5ULAkwLAk3LAkJCQkxLAkxLAkmZHJpdmUtPmx1biwJCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJ3Y2FjaGUiLAkJU0VUVElOR19SVywJCQkJCUhESU9fR0VUX1dDQUNIRSwJSERJT19TRVRfV0NBQ0hFLAlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCTEsCSZkcml2ZS0+d2NhY2hlLAkJCXdyaXRlX2NhY2hlKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJhY291c3RpYyIsCQlTRVRUSU5HX1JXLAkJCQkJSERJT19HRVRfQUNPVVNUSUMsCUhESU9fU0VUX0FDT1VTVElDLAlUWVBFX0JZVEUsCTAsCTI1NCwJCQkJMSwJMSwJJmRyaXZlLT5hY291c3RpYywJCXNldF9hY291c3RpYyk7CisgCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImZhaWx1cmVzIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0lOVCwJMCwJNjU1MzUsCQkJCTEsCTEsCSZkcml2ZS0+ZmFpbHVyZXMsCQlOVUxMKTsKKyAJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibWF4X2ZhaWx1cmVzIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0lOVCwJMCwJNjU1MzUsCQkJCTEsCTEsCSZkcml2ZS0+bWF4X2ZhaWx1cmVzLAkJTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZWRpc2tfc2V0dXAgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGNhcGFjaXR5OworCWludCBiYXJyaWVyOworCisJaWRlZGlza19hZGRfc2V0dGluZ3MoZHJpdmUpOworCisJaWYgKGRyaXZlLT5pZF9yZWFkID09IDApCisJCXJldHVybjsKKworCS8qCisJICogQ29tcGFjdEZsYXNoIGNhcmRzIGFuZCB0aGVpciBicmV0aGVybiBsb29rIGp1c3QgbGlrZSBoYXJkIGRyaXZlcworCSAqIHRvIHVzLCBidXQgdGhleSBhcmUgcmVtb3ZhYmxlIGFuZCBkb24ndCBoYXZlIGEgZG9vcmxvY2sgbWVjaGFuaXNtLgorCSAqLworCWlmIChkcml2ZS0+cmVtb3ZhYmxlICYmICEoZHJpdmUtPmlzX2ZsYXNoKSkgeworCQkvKgorCQkgKiBSZW1vdmFibGUgZGlza3MgKGVnLiBTWVFVRVNUKTsgaWdub3JlICdXRCcgZHJpdmVzIAorCQkgKi8KKwkJaWYgKGlkLT5tb2RlbFswXSAhPSAnVycgfHwgaWQtPm1vZGVsWzFdICE9ICdEJykgeworCQkJZHJpdmUtPmRvb3Jsb2NraW5nID0gMTsKKwkJfQorCX0KKworCSh2b2lkKXNldF9sYmFfYWRkcmVzc2luZyhkcml2ZSwgMSk7CisKKwlpZiAoZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgeworCQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJCWludCBtYXhfcyA9IDIwNDg7CisKKwkJaWYgKG1heF9zID4gaHdpZi0+cnFzaXplKQorCQkJbWF4X3MgPSBod2lmLT5ycXNpemU7CisKKwkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGRyaXZlLT5xdWV1ZSwgbWF4X3MpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBtYXggcmVxdWVzdCBzaXplOiAlZEtpQlxuIiwgZHJpdmUtPm5hbWUsIGRyaXZlLT5xdWV1ZS0+bWF4X3NlY3RvcnMgLyAyKTsKKworCS8qIGNhbGN1bGF0ZSBkcml2ZSBjYXBhY2l0eSwgYW5kIHNlbGVjdCBMQkEgaWYgcG9zc2libGUgKi8KKwlpbml0X2lkZWRpc2tfY2FwYWNpdHkgKGRyaXZlKTsKKworCS8qIGxpbWl0IGRyaXZlIGNhcGFjaXR5IHRvIDEzN0dCIGlmIExCQTQ4IGNhbm5vdCBiZSB1c2VkICovCisJaWYgKGRyaXZlLT5hZGRyZXNzaW5nID09IDAgJiYgZHJpdmUtPmNhcGFjaXR5NjQgPiAxVUxMIDw8IDI4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW5ub3QgdXNlIExCQTQ4IC0gZnVsbCBjYXBhY2l0eSAiCisJCSAgICAgICAiJWxsdSBzZWN0b3JzICglbGx1IE1CKVxuIiwKKwkJICAgICAgIGRyaXZlLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWRyaXZlLT5jYXBhY2l0eTY0LAorCQkgICAgICAgc2VjdG9yc190b19NQihkcml2ZS0+Y2FwYWNpdHk2NCkpOworCQlkcml2ZS0+Y2FwYWNpdHk2NCA9IDFVTEwgPDwgMjg7CisJfQorCisJaWYgKGRyaXZlLT5od2lmLT5ub19sYmE0OF9kbWEgJiYgZHJpdmUtPmFkZHJlc3NpbmcpIHsKKwkJaWYgKGRyaXZlLT5jYXBhY2l0eTY0ID4gMVVMTCA8PCAyOCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbm5vdCB1c2UgTEJBNDggRE1BIC0gUElPIG1vZGUgd2lsbCIKKwkJCQkJICIgYmUgdXNlZCBmb3IgYWNjZXNzaW5nIHNlY3RvcnMgPiAldVxuIiwKKwkJCQkJIGRyaXZlLT5uYW1lLCAxIDw8IDI4KTsKKwkJfSBlbHNlCisJCQlkcml2ZS0+YWRkcmVzc2luZyA9IDA7CisJfQorCisJLyoKKwkgKiBpZiBwb3NzaWJsZSwgZ2l2ZSBmZGlzayBhY2Nlc3MgdG8gbW9yZSBvZiB0aGUgZHJpdmUsCisJICogYnkgY29ycmVjdGluZyBiaW9zX2N5bHM6CisJICovCisJY2FwYWNpdHkgPSBpZGVkaXNrX2NhcGFjaXR5IChkcml2ZSk7CisJaWYgKCFkcml2ZS0+Zm9yY2VkX2dlb20pIHsKKworCQlpZiAoaWRlZGlza19zdXBwb3J0c19sYmE0OChkcml2ZS0+aWQpKSB7CisJCQkvKiBjb21wYXRpYmlsaXR5ICovCisJCQlkcml2ZS0+Ymlvc19zZWN0ID0gNjM7CisJCQlkcml2ZS0+Ymlvc19oZWFkID0gMjU1OworCQl9CisKKwkJaWYgKGRyaXZlLT5iaW9zX3NlY3QgJiYgZHJpdmUtPmJpb3NfaGVhZCkgeworCQkJdW5zaWduZWQgaW50IGNhcDAgPSBjYXBhY2l0eTsgLyogdHJ1bmNhdGUgdG8gMzIgYml0cyAqLworCQkJdW5zaWduZWQgaW50IGN5bHN6LCBjeWw7CisKKwkJCWlmIChjYXAwICE9IGNhcGFjaXR5KQorCQkJCWRyaXZlLT5iaW9zX2N5bCA9IDY1NTM1OworCQkJZWxzZSB7CisJCQkJY3lsc3ogPSBkcml2ZS0+Ymlvc19zZWN0ICogZHJpdmUtPmJpb3NfaGVhZDsKKwkJCQljeWwgPSBjYXAwIC8gY3lsc3o7CisJCQkJaWYgKGN5bCA+IDY1NTM1KQorCQkJCQljeWwgPSA2NTUzNTsKKwkJCQlpZiAoY3lsID4gZHJpdmUtPmJpb3NfY3lsKQorCQkJCQlkcml2ZS0+Ymlvc19jeWwgPSBjeWw7CisJCQl9CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVsbHUgc2VjdG9ycyAoJWxsdSBNQikiLAorCQkJIGRyaXZlLT5uYW1lLCBjYXBhY2l0eSwgc2VjdG9yc190b19NQihjYXBhY2l0eSkpOworCisJLyogT25seSBwcmludCBjYWNoZSBzaXplIHdoZW4gaXQgd2FzIHNwZWNpZmllZCAqLworCWlmIChpZC0+YnVmX3NpemUpCisJCXByaW50ayAoIiB3LyVkS2lCIENhY2hlIiwgaWQtPmJ1Zl9zaXplLzIpOworCisJcHJpbnRrKCIsIENIUz0lZC8lZC8lZCIsIAorCSAgICAgICBkcml2ZS0+Ymlvc19jeWwsIGRyaXZlLT5iaW9zX2hlYWQsIGRyaXZlLT5iaW9zX3NlY3QpOworCWlmIChkcml2ZS0+dXNpbmdfZG1hKQorCQlpZGVfZG1hX3ZlcmJvc2UoZHJpdmUpOworCXByaW50aygiXG4iKTsKKworCWRyaXZlLT5ub19pb18zMmJpdCA9IGlkLT5kd29yZF9pbyA/IDEgOiAwOworCisJLyogd3JpdGUgY2FjaGUgZW5hYmxlZD8gKi8KKwlpZiAoKGlkLT5jc2ZvICYgMSkgfHwgKGlkLT5jZnNfZW5hYmxlXzEgJiAoMSA8PCA1KSkpCisJCWRyaXZlLT53Y2FjaGUgPSAxOworCisJd3JpdGVfY2FjaGUoZHJpdmUsIDEpOworCisJLyoKKwkgKiBXZSBtdXN0IGF2b2lkIGlzc3VpbmcgY29tbWFuZHMgYSBkcml2ZSBkb2VzIG5vdCB1bmRlcnN0YW5kCisJICogb3Igd2UgbWF5IGNyYXNoIGl0LiBXZSBjaGVjayBmbHVzaCBjYWNoZSBpcyBzdXBwb3J0ZWQuIFdlIGFsc28KKwkgKiBjaGVjayB3ZSBoYXZlIHRoZSBMQkE0OCBmbHVzaCBjYWNoZSBpZiB0aGUgZHJpdmUgY2FwYWNpdHkgaXMKKwkgKiB0b28gbGFyZ2UuIEJ5IHRoaXMgdGltZSB3ZSBoYXZlIHRyaW1tZWQgdGhlIGRyaXZlIGNhcGFjaXR5IGlmCisJICogTEJBNDggaXMgbm90IGF2YWlsYWJsZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlY2hlY2sgdGhhdC4KKwkgKi8KKwliYXJyaWVyID0gMDsKKwlpZiAoaWRlX2lkX2hhc19mbHVzaF9jYWNoZShpZCkpCisJCWJhcnJpZXIgPSAxOworCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKSB7CisJCS8qIENhbid0IGlzc3VlIHRoZSBjb3JyZWN0IGZsdXNoID8gKi8KKwkJaWYgKGNhcGFjaXR5ID4gKDFVTEwgPDwgMjgpICYmICFpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlX2V4dChpZCkpCisJCQliYXJyaWVyID0gMDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2FjaGUgZmx1c2hlcyAlc3N1cHBvcnRlZFxuIiwKKwkJZHJpdmUtPm5hbWUsIGJhcnJpZXIgPyAiIiA6ICJub3QgIik7CisJaWYgKGJhcnJpZXIpIHsKKwkJYmxrX3F1ZXVlX29yZGVyZWQoZHJpdmUtPnF1ZXVlLCBRVUVVRV9PUkRFUkVEX0ZMVVNIKTsKKwkJZHJpdmUtPnF1ZXVlLT5wcmVwYXJlX2ZsdXNoX2ZuID0gaWRlZGlza19wcmVwYXJlX2ZsdXNoOworCQlkcml2ZS0+cXVldWUtPmVuZF9mbHVzaF9mbiA9IGlkZWRpc2tfZW5kX2ZsdXNoOworCQlibGtfcXVldWVfaXNzdWVfZmx1c2hfZm4oZHJpdmUtPnF1ZXVlLCBpZGVkaXNrX2lzc3VlX2ZsdXNoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9jYWNoZWZsdXNoX3AoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmICghZHJpdmUtPndjYWNoZSB8fCAhaWRlX2lkX2hhc19mbHVzaF9jYWNoZShkcml2ZS0+aWQpKQorCQlyZXR1cm47CisKKwlpZiAoZG9faWRlZGlza19mbHVzaGNhY2hlKGRyaXZlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdjYWNoZSBmbHVzaCBmYWlsZWQhXG4iLCBkcml2ZS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgaWRlZGlza19jbGVhbnVwIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGlka3AtPmRpc2s7CisKKwlpZGVfY2FjaGVmbHVzaF9wKGRyaXZlKTsKKwlpZiAoaWRlX3VucmVnaXN0ZXJfc3ViZHJpdmVyKGRyaXZlKSkKKwkJcmV0dXJuIDE7CisJZGVsX2dlbmRpc2soZyk7CisKKwlpZGVfZGlza19wdXQoaWRrcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWRlX2Rpc2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gdG9faWRlX2Rpc2soa3JlZik7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gaWRrcC0+ZHJpdmU7CisJc3RydWN0IGdlbmRpc2sgKmcgPSBpZGtwLT5kaXNrOworCisJZHJpdmUtPmRyaXZlcl9kYXRhID0gTlVMTDsKKwlkcml2ZS0+ZGV2ZnNfbmFtZVswXSA9ICdcMCc7CisJZy0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlwdXRfZGlzayhnKTsKKwlrZnJlZShpZGtwKTsKK30KKworc3RhdGljIGludCBpZGVkaXNrX2F0dGFjaChpZGVfZHJpdmVfdCAqZHJpdmUpOworCitzdGF0aWMgdm9pZCBpZGVfZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBjb250YWluZXJfb2YoZGV2LCBpZGVfZHJpdmVfdCwgZ2VuZGV2KTsKKworI2lmZGVmCUNPTkZJR19BTFBIQQorCS8qIE9uIEFscGhhLCBoYWx0KDgpIGRvZXNuJ3QgYWN0dWFsbHkgdHVybiB0aGUgbWFjaGluZSBvZmYsCisJICAgaXQgcHV0cyB5b3UgaW50byB0aGUgc29ydCBvZiBmaXJtd2FyZSBtb25pdG9yLiBUeXBpY2FsbHksCisJICAgaXQncyB1c2VkIHRvIGJvb3QgYW5vdGhlciBrZXJuZWwgaW1hZ2UsIHNvIGl0J3Mgbm90IG11Y2gKKwkgICBkaWZmZXJlbnQgZnJvbSByZWJvb3QoOCkuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0bworCSAgIHNwaW4gZG93biB0aGUgZGlzayBpbiB0aGlzIGNhc2UsIGVzcGVjaWFsbHkgc2luY2UgQWxwaGEKKwkgICBmaXJtd2FyZSBkb2Vzbid0IGhhbmRsZSBkaXNrcyBpbiBzdGFuZGJ5IG1vZGUgcHJvcGVybHkuCisJICAgT24gdGhlIG90aGVyIGhhbmQsIGl0J3MgcmVhc29uYWJseSBzYWZlIHRvIHR1cm4gdGhlIHBvd2VyCisJICAgb2ZmIHdoZW4gdGhlIHNodXRkb3duIHByb2Nlc3MgcmVhY2hlcyB0aGUgZmlybXdhcmUgcHJvbXB0LAorCSAgIGFzIHRoZSBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiB0YWtlcyByYXRoZXIgbG9uZyB0aW1lIC0KKwkgICBhdCBsZWFzdCAxMCBzZWNvbmRzLCB3aGljaCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IKKwkgICB0aGUgZGlzayB0byBleHBpcmUgaXRzIHdyaXRlIGNhY2hlLiAqLworCWlmIChzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX1BPV0VSX09GRikgeworI2Vsc2UKKwlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SRVNUQVJUKSB7CisjZW5kaWYKKwkJaWRlX2NhY2hlZmx1c2hfcChkcml2ZSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoIlNodXRkb3duOiAlc1xuIiwgZHJpdmUtPm5hbWUpOworCWRldi0+YnVzLT5zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKK30KKworLyoKKyAqICAgICAgSURFIHN1YmRyaXZlciBmdW5jdGlvbnMsIHJlZ2lzdGVyZWQgd2l0aCBpZGUuYworICovCitzdGF0aWMgaWRlX2RyaXZlcl90IGlkZWRpc2tfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdlbl9kcml2ZXIgPSB7CisJCS5zaHV0ZG93bgk9IGlkZV9kZXZpY2Vfc2h1dGRvd24sCisJfSwKKwkubmFtZQkJCT0gImlkZS1kaXNrIiwKKwkudmVyc2lvbgkJPSBJREVESVNLX1ZFUlNJT04sCisJLm1lZGlhCQkJPSBpZGVfZGlzaywKKwkuYnVzeQkJCT0gMCwKKwkuc3VwcG9ydHNfZHNjX292ZXJsYXAJPSAwLAorCS5jbGVhbnVwCQk9IGlkZWRpc2tfY2xlYW51cCwKKwkuZG9fcmVxdWVzdAkJPSBpZGVfZG9fcndfZGlzaywKKwkuZW5kX3JlcXVlc3QJCT0gaWRlX2VuZF9yZXF1ZXN0LAorCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCisJLmFib3J0CQkJPSBfX2lkZV9hYm9ydCwKKwkucHJvYwkJCT0gaWRlZGlza19wcm9jLAorCS5hdHRhY2gJCQk9IGlkZWRpc2tfYXR0YWNoLAorCS5kcml2ZXMJCQk9IExJU1RfSEVBRF9JTklUKGlkZWRpc2tfZHJpdmVyLmRyaXZlcyksCit9OworCitzdGF0aWMgaW50IGlkZWRpc2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcDsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisKKwlpZiAoIShpZGtwID0gaWRlX2Rpc2tfZ2V0KGRpc2spKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRyaXZlID0gaWRrcC0+ZHJpdmU7CisKKwlkcml2ZS0+dXNhZ2UrKzsKKwlpZiAoZHJpdmUtPnJlbW92YWJsZSAmJiBkcml2ZS0+dXNhZ2UgPT0gMSkgeworCQlpZGVfdGFza190IGFyZ3M7CisJCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwkJYXJncy50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0gPSBXSU5fRE9PUkxPQ0s7CisJCWFyZ3MuY29tbWFuZF90eXBlID0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKwkJYXJncy5oYW5kbGVyCSAgPSAmdGFza19ub19kYXRhX2ludHI7CisJCWNoZWNrX2Rpc2tfY2hhbmdlKGlub2RlLT5pX2JkZXYpOworCQkvKgorCQkgKiBJZ25vcmUgdGhlIHJldHVybiBjb2RlIGZyb20gZG9vcl9sb2NrLAorCQkgKiBzaW5jZSB0aGUgb3BlbigpIGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCwKKwkJICogYW5kIHRoZSBkb29yX2xvY2sgaXMgaXJyZWxldmFudCBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJaWYgKGRyaXZlLT5kb29ybG9ja2luZyAmJiBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCkpCisJCQlkcml2ZS0+ZG9vcmxvY2tpbmcgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVkaXNrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBpZGVfZGlza19vYmogKmlka3AgPSBpZGVfZGlza19nKGRpc2spOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGlka3AtPmRyaXZlOworCisJaWYgKGRyaXZlLT51c2FnZSA9PSAxKQorCQlpZGVfY2FjaGVmbHVzaF9wKGRyaXZlKTsKKwlpZiAoZHJpdmUtPnJlbW92YWJsZSAmJiBkcml2ZS0+dXNhZ2UgPT0gMSkgeworCQlpZGVfdGFza190IGFyZ3M7CisJCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwkJYXJncy50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0gPSBXSU5fRE9PUlVOTE9DSzsKKwkJYXJncy5jb21tYW5kX3R5cGUgPSBJREVfRFJJVkVfVEFTS19OT19EQVRBOworCQlhcmdzLmhhbmRsZXIJICA9ICZ0YXNrX25vX2RhdGFfaW50cjsKKwkJaWYgKGRyaXZlLT5kb29ybG9ja2luZyAmJiBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgTlVMTCkpCisJCQlkcml2ZS0+ZG9vcmxvY2tpbmcgPSAwOworCX0KKwlkcml2ZS0+dXNhZ2UtLTsKKworCWlkZV9kaXNrX3B1dChpZGtwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZWRpc2tfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gaWRlX2Rpc2tfZyhiZGV2LT5iZF9kaXNrKTsKKwlyZXR1cm4gZ2VuZXJpY19pZGVfaW9jdGwoaWRrcC0+ZHJpdmUsIGZpbGUsIGJkZXYsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBpZGVkaXNrX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGlkZV9kaXNrX2coZGlzayk7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gaWRrcC0+ZHJpdmU7CisKKwkvKiBkbyBub3Qgc2NhbiBwYXJ0aXRpb25zIHR3aWNlIGlmIHRoaXMgaXMgYSByZW1vdmFibGUgZGV2aWNlICovCisJaWYgKGRyaXZlLT5hdHRhY2gpIHsKKwkJZHJpdmUtPmF0dGFjaCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKiBpZiByZW1vdmFibGUsIGFsd2F5cyBhc3N1bWUgaXQgd2FzIGNoYW5nZWQgKi8KKwlyZXR1cm4gZHJpdmUtPnJlbW92YWJsZTsKK30KKworc3RhdGljIGludCBpZGVkaXNrX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gaWRlX2Rpc2tfZyhkaXNrKTsKKwlzZXRfY2FwYWNpdHkoZGlzaywgaWRlZGlza19jYXBhY2l0eShpZGtwLT5kcml2ZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGlkZWRpc2tfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpZGVkaXNrX29wZW4sCisJLnJlbGVhc2UJPSBpZGVkaXNrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGlkZWRpc2tfaW9jdGwsCisJLm1lZGlhX2NoYW5nZWQJPSBpZGVkaXNrX21lZGlhX2NoYW5nZWQsCisJLnJldmFsaWRhdGVfZGlzaz0gaWRlZGlza19yZXZhbGlkYXRlX2Rpc2sKK307CisKK01PRFVMRV9ERVNDUklQVElPTigiQVRBIERJU0sgRHJpdmVyIik7CisKK3N0YXRpYyBpbnQgaWRlZGlza19hdHRhY2goaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBpZGVfZGlza19vYmogKmlka3A7CisJc3RydWN0IGdlbmRpc2sgKmc7CisKKwkvKiBzdHJzdHIoImZvbyIsICIiKSBpcyBub24tTlVMTCAqLworCWlmICghc3Ryc3RyKCJpZGUtZGlzayIsIGRyaXZlLT5kcml2ZXJfcmVxKSkKKwkJZ290byBmYWlsZWQ7CisJaWYgKCFkcml2ZS0+cHJlc2VudCkKKwkJZ290byBmYWlsZWQ7CisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJZ290byBmYWlsZWQ7CisKKwlpZGtwID0ga21hbGxvYyhzaXplb2YoKmlka3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlka3ApCisJCWdvdG8gZmFpbGVkOworCisJZyA9IGFsbG9jX2Rpc2soMSA8PCBQQVJUTl9CSVRTKTsKKwlpZiAoIWcpCisJCWdvdG8gb3V0X2ZyZWVfaWRrcDsKKworCWlkZV9pbml0X2Rpc2soZywgZHJpdmUpOworCisJaWYgKGlkZV9yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsICZpZGVkaXNrX2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLWRpc2s6ICVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIGlkZS5jXG4iLCBkcml2ZS0+bmFtZSk7CisJCWdvdG8gb3V0X3B1dF9kaXNrOworCX0KKworCW1lbXNldChpZGtwLCAwLCBzaXplb2YoKmlka3ApKTsKKworCWtyZWZfaW5pdCgmaWRrcC0+a3JlZik7CisKKwlpZGtwLT5kcml2ZSA9IGRyaXZlOworCWlka3AtPmRyaXZlciA9ICZpZGVkaXNrX2RyaXZlcjsKKwlpZGtwLT5kaXNrID0gZzsKKworCWctPnByaXZhdGVfZGF0YSA9ICZpZGtwLT5kcml2ZXI7CisKKwlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBpZGtwOworCisJRFJJVkVSKGRyaXZlKS0+YnVzeSsrOworCWlkZWRpc2tfc2V0dXAoZHJpdmUpOworCWlmICgoIWRyaXZlLT5oZWFkIHx8IGRyaXZlLT5oZWFkID4gMTYpICYmICFkcml2ZS0+c2VsZWN0LmIubGJhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IElOVkFMSUQgR0VPTUVUUlk6ICVkIFBIWVNJQ0FMIEhFQURTP1xuIiwKKwkJCWRyaXZlLT5uYW1lLCBkcml2ZS0+aGVhZCk7CisJCWRyaXZlLT5hdHRhY2ggPSAwOworCX0gZWxzZQorCQlkcml2ZS0+YXR0YWNoID0gMTsKKwlEUklWRVIoZHJpdmUpLT5idXN5LS07CisJZy0+bWlub3JzID0gMSA8PCBQQVJUTl9CSVRTOworCXN0cmNweShnLT5kZXZmc19uYW1lLCBkcml2ZS0+ZGV2ZnNfbmFtZSk7CisJZy0+ZHJpdmVyZnNfZGV2ID0gJmRyaXZlLT5nZW5kZXY7CisJZy0+ZmxhZ3MgPSBkcml2ZS0+cmVtb3ZhYmxlID8gR0VOSERfRkxfUkVNT1ZBQkxFIDogMDsKKwlzZXRfY2FwYWNpdHkoZywgaWRlZGlza19jYXBhY2l0eShkcml2ZSkpOworCWctPmZvcHMgPSAmaWRlZGlza19vcHM7CisJYWRkX2Rpc2soZyk7CisJcmV0dXJuIDA7CisKK291dF9wdXRfZGlzazoKKwlwdXRfZGlzayhnKTsKK291dF9mcmVlX2lka3A6CisJa2ZyZWUoaWRrcCk7CitmYWlsZWQ6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpZGVkaXNrX2V4aXQgKHZvaWQpCit7CisJaWRlX3VucmVnaXN0ZXJfZHJpdmVyKCZpZGVkaXNrX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgaWRlZGlza19pbml0ICh2b2lkKQoreworCXJldHVybiBpZGVfcmVnaXN0ZXJfZHJpdmVyKCZpZGVkaXNrX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlkZWRpc2tfaW5pdCk7Cittb2R1bGVfZXhpdChpZGVkaXNrX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmVlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pZGUvaWRlLWRtYS5jCQlWZXJzaW9uIDQuMTAJSnVuZSA5LCAyMDAwCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiAgTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqICBTcGVjaWFsIFRoYW5rcyB0byBNYXJrIGZvciBoaXMgU2l4IHllYXJzIG9mIHdvcmsuCisgKgorICogIENvcHlyaWdodCAoYykgMTk5NS0xOTk4ICBNYXJrIExvcmQKKyAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGJ1cy1tYXN0ZXIgSURFIERNQSBmdW5jdGlvbnMKKyAqIG9mIHZhcmlvdXMgUENJIGNoaXBzZXRzLCBpbmNsdWRpbmcgdGhlIEludGVsIFBJSVggKGk4MjM3MUZCIGZvcgorICogdGhlIDQzMCBGWCBjaGlwc2V0KSwgdGhlIFBJSVgzIChpODIzNzFTQiBmb3IgdGhlIDQzMCBIWC9WWCBhbmQgCisgKiA0NDAgY2hpcHNldHMpLCBhbmQgdGhlIFBJSVg0IChpODIzNzFBQiBmb3IgdGhlIDQzMCBUWCBjaGlwc2V0KQorICogKCJQSUlYIiBzdGFuZHMgZm9yICJQQ0kgSVNBIElERSBYY2VsbGVyYXRvciIpLgorICoKKyAqIFByZXR0eSBtdWNoIHRoZSBzYW1lIGNvZGUgd29ya3MgZm9yIG90aGVyIElERSBQQ0kgYnVzLW1hc3RlcmluZyBjaGlwc2V0cy4KKyAqCisgKiBETUEgaXMgc3VwcG9ydGVkIGZvciBhbGwgSURFIGRldmljZXMgKGRpc2sgZHJpdmVzLCBjZHJvbXMsIHRhcGVzLCBmbG9wcGllcykuCisgKgorICogQnkgZGVmYXVsdCwgRE1BIHN1cHBvcnQgaXMgcHJlcGFyZWQgZm9yIHVzZSwgYnV0IGlzIGN1cnJlbnRseSBlbmFibGVkIG9ubHkKKyAqIGZvciBkcml2ZXMgd2hpY2ggYWxyZWFkeSBoYXZlIERNQSBlbmFibGVkIChVbHRyYURNQSBvciBtb2RlIDIgbXVsdGkvc2luZ2xlKSwKKyAqIG9yIHdoaWNoIGFyZSByZWNvZ25pemVkIGFzICJnb29kIiAoc2VlIHRhYmxlIGJlbG93KS4gIERyaXZlcyB3aXRoIG9ubHkgbW9kZTAKKyAqIG9yIG1vZGUxIChtdWx0aS9zaW5nbGUpIERNQSBzaG91bGQgYWxzbyB3b3JrIHdpdGggdGhpcyBjaGlwc2V0L2RyaXZlcgorICogKGVnLiBNQzIxMTJBKSBidXQgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCisgKgorICogVXNlICJoZHBhcm0gLWkiIHRvIHZpZXcgbW9kZXMgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZHJpdmUuCisgKgorICogVGhlIGhkcGFybS0zLjUgKG9yIGxhdGVyKSB1dGlsaXR5IGNhbiBiZSB1c2VkIGZvciBtYW51YWxseSBlbmFibGluZy9kaXNhYmxpbmcKKyAqIERNQSBzdXBwb3J0LCBidXQgbXVzdCBiZSAocmUtKWNvbXBpbGVkIGFnYWluc3QgdGhpcyBrZXJuZWwgdmVyc2lvbiBvciBsYXRlci4KKyAqCisgKiBUbyBlbmFibGUgRE1BLCB1c2UgImhkcGFybSAtZDEgL2Rldi9oZD8iIG9uIGEgcGVyLWRyaXZlIGJhc2lzIGFmdGVyIGJvb3RpbmcuCisgKiBJZiBwcm9ibGVtcyBhcmlzZSwgaWRlLmMgd2lsbCBkaXNhYmxlIERNQSBvcGVyYXRpb24gYWZ0ZXIgYSBmZXcgcmV0cmllcy4KKyAqIFRoaXMgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtIHdvcmtzIGFuZCBoYXMgYmVlbiBleHRyZW1lbHkgd2VsbCBleGVyY2lzZWQuCisgKgorICogSURFIGRyaXZlcywgZGVwZW5kaW5nIG9uIHRoZWlyIHZpbnRhZ2UsIG1heSBzdXBwb3J0IHNldmVyYWwgZGlmZmVyZW50IG1vZGVzCisgKiBvZiBETUEgb3BlcmF0aW9uLiAgVGhlIGJvb3QtdGltZSBtb2RlcyBhcmUgaW5kaWNhdGVkIHdpdGggYSAiKiIgaW4KKyAqIHRoZSAiaGRwYXJtIC1pIiBsaXN0aW5nLCBhbmQgY2FuIGJlIGNoYW5nZWQgd2l0aCAqa25vd2xlZGdlYWJsZSogdXNlIG9mCisgKiB0aGUgImhkcGFybSAtWCIgZmVhdHVyZS4gIFRoZXJlIGlzIHNlbGRvbSBhIG5lZWQgdG8gZG8gdGhpcywgYXMgZHJpdmVzCisgKiBub3JtYWxseSBwb3dlci11cCB3aXRoIHRoZWlyICJiZXN0IiBQSU8vRE1BIG1vZGVzIGVuYWJsZWQuCisgKgorICogVGVzdGluZyBoYXMgYmVlbiBkb25lIHdpdGggYSByYXRoZXIgZXh0ZW5zaXZlIG51bWJlciBvZiBkcml2ZXMsCisgKiB3aXRoIFF1YW50dW0gJiBXZXN0ZXJuIERpZ2l0YWwgbW9kZWxzIGdlbmVyYWxseSBvdXRwZXJmb3JtaW5nIHRoZSBwYWNrLAorICogYW5kIEZ1aml0c3UgJiBDb25uZXIgKGFuZCBzb21lIFNlYWdhdGUgd2hpY2ggYXJlIHJlYWxseSBDb25uZXIpIGRyaXZlcworICogc2hvd2luZyBtb3JlIGxhY2tsdXN0ZXIgdGhyb3VnaHB1dC4KKyAqCisgKiBLZWVwIGFuIGV5ZSBvbiAvdmFyL2FkbS9tZXNzYWdlcyBmb3IgIkRNQSBkaXNhYmxlZCIgbWVzc2FnZXMuCisgKgorICogU29tZSBwZW9wbGUgaGF2ZSByZXBvcnRlZCB0cm91YmxlIHdpdGggSW50ZWwgWmFwcGEgbW90aGVyYm9hcmRzLgorICogVGhpcyBjYW4gYmUgZml4ZWQgYnkgdXBncmFkaW5nIHRoZSBBTUkgQklPUyB0byB2ZXJzaW9uIDEuMDAuMDQuQlMwLAorICogYXZhaWxhYmxlIGZyb20gZnRwOi8vZnRwLmludGVsLmNvbS9wdWIvYmlvcy8xMDAwNGJzMC5leGUKKyAqICh0aGFua3MgdG8gR2xlbiBNb3JyZWxsIDxnbGVuQHNwaW4uU3RhbmZvcmQuZWR1PiBmb3IgcmVzZWFyY2hpbmcgdGhpcykuCisgKgorICogVGhhbmtzIHRvICJDaHJpc3RvcGhlciBKLiBSZWltZXIiIDxyZWltZXJAZG9lLmNhcmxldG9uLmNhPiBmb3IKKyAqIGZpeGluZyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBCSU9TIG9uIHNvbWUgQWNlciBtb3RoZXJib2FyZHMuCisgKgorICogVGhhbmtzIHRvICJCZW5vaXQgUG91bG90LUNhemFqb3VzIiA8cG91bG90QGNob3J1cy5mcj4gZm9yIHRlc3RpbmcKKyAqICJUWCIgY2hpcHNldCBjb21wYXRpYmlsaXR5IGFuZCBmb3IgcHJvdmlkaW5nIHBhdGNoZXMgZm9yIHRoZSAiVFgiIGNoaXBzZXQuCisgKgorICogVGhhbmtzIHRvIENocmlzdGlhbiBCcnVubmVyIDxjaGJAbXVjLmRlPiBmb3IgdGFraW5nIGEgZ29vZCBmaXJzdCBjcmFjaworICogYXQgZ2VuZXJpYyBETUEgLS0gaGlzIHBhdGNoZXMgd2VyZSByZWZlcnJlZCB0byB3aGVuIHByZXBhcmluZyB0aGlzIGNvZGUuCisgKgorICogTW9zdCBpbXBvcnRhbnRseSwgdGhhbmtzIHRvIFJvYmVydCBCcmluZ21hbiA8cm9iQG1hcnMudHJpb24uY29tPgorICogZm9yIHN1cHBseWluZyBhIFByb21pc2UgVURNQSBib2FyZCAmIFdEIFVETUEgZHJpdmUgZm9yIHRoaXMgd29yayEKKyAqCisgKiBBbmQsIHllcywgSW50ZWwgWmFwcGEgYm9hcmRzIHJlYWxseSAqZG8qIHVzZSBib3RoIFBJSVggSURFIHBvcnRzLgorICoKKyAqIEFUQS02Ni8xMDAgYW5kIHJlY292ZXJ5IGZ1bmN0aW9ucywgSSBmb3Jnb3QgdGhlIHJlc3QuLi4uLi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKK3N0cnVjdCBkcml2ZV9saXN0X2VudHJ5IHsKKwljb25zdCBjaGFyICppZF9tb2RlbDsKKwljb25zdCBjaGFyICppZF9maXJtd2FyZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVfbGlzdF9lbnRyeSBkcml2ZV93aGl0ZWxpc3QgW10gPSB7CisKKwl7ICJNaWNyb3BvbGlzIDIxMTJBIgksICAgICAgICJBTEwiCQl9LAorCXsgIkNPTk5FUiBDVE1BIDQwMDAiCSwgICAgICAgIkFMTCIJCX0sCisJeyAiQ09OTkVSIENUVDgwMDAtQSIJLCAgICAgICAiQUxMIgkJfSwKKwl7ICJTVDM0MzQyQSIJCSwJIkFMTCIJCX0sCisJeyBOVUxMCQkJLAlOVUxMCQl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlX2xpc3RfZW50cnkgZHJpdmVfYmxhY2tsaXN0IFtdID0geworCisJeyAiV0RDIEFDMTEwMDBIIgksCSJBTEwiCQl9LAorCXsgIldEQyBBQzIyMTAwSCIJLAkiQUxMIgkJfSwKKwl7ICJXREMgQUMzMjUwMEgiCSwJIkFMTCIJCX0sCisJeyAiV0RDIEFDMzMxMDBIIgksCSJBTEwiCQl9LAorCXsgIldEQyBBQzMxNjAwSCIJLAkiQUxMIgkJfSwKKwl7ICJXREMgQUMzMjEwMEgiCSwJIjI0LjA5UDA3Igl9LAorCXsgIldEQyBBQzIzMjAwTCIJLAkiMjEuMTBOMjEiCX0sCisJeyAiQ29tcGFxIENSRC04MjQxQiIJLAkiQUxMIgkJfSwKKwl7ICJDUkQtODQwMEIiCQksCSJBTEwiCQl9LAorCXsgIkNSRC04NDgwQiIsCQkJIkFMTCIJCX0sCisJeyAiQ1JELTg0ODJCIiwJCQkiQUxMIgkJfSwKKyAJeyAiQ1JELTg0IgkJLAkiQUxMIgkJfSwKKwl7ICJTYW5EaXNrIFNEUDNCIgksCSJBTEwiCQl9LAorCXsgIlNhbkRpc2sgU0RQM0ItNjQiCSwJIkFMTCIJCX0sCisJeyAiU0FOWU8gQ0QtUk9NIENSRCIJLAkiQUxMIgkJfSwKKwl7ICJISVRBQ0hJIENEUi04IgksCSJBTEwiCQl9LAorCXsgIkhJVEFDSEkgQ0RSLTgzMzUiCSwJIkFMTCIJCX0sCisJeyAiSElUQUNISSBDRFItODQzNSIJLAkiQUxMIgkJfSwKKwl7ICJUb3NoaWJhIENELVJPTSBYTS02MjAyQiIJLAkiQUxMIgkJfSwKKwl7ICJDRC01MzJFLUEiCQksCSJBTEwiCQl9LAorCXsgIkUtSURFIENELVJPTSBDUi04NDAiLAkiQUxMIgkJfSwKKwl7ICJDRC1ST00gRHJpdmUvRjVBIiwJIkFMTCIJCX0sCisJeyAiV1BJIENERC04MjAiLAkJIkFMTCIJCX0sCisJeyAiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsCSJBTEwiCQl9LAorCXsgIlNBTVNVTkcgQ0QtUk9NIFNDIiwJIkFMTCIJCX0sCisJeyAiU2FuRGlzayBTRFAzQi02NCIJLAkiQUxMIgkJfSwKKwl7ICJTQU1TVU5HIENELVJPTSBTTi0xMjQiLAkiQUxMIgkJfSwKKwl7ICJBVEFQSSBDRC1ST00gRFJJVkUgNDBYIE1BWElNVU0iLAkiQUxMIgkJfSwKKwl7ICJfTkVDIERWNTgwMEEiLCAgICAgICAgICAgICAgICJBTEwiICAgICAgICAgICB9LCAgCisJeyBOVUxMCQkJLAlOVUxMCQl9CisKK307CisKKy8qKgorICoJaW5fZHJpdmVfbGlzdAktCWxvb2sgZm9yIGRyaXZlIGluIGJsYWNrL3doaXRlIGxpc3QKKyAqCUBpZDogZHJpdmUgaWRlbnRpZmllcgorICoJQGRyaXZlX3RhYmxlOiBsaXN0IHRvIGluc3BlY3QKKyAqCisgKglMb29rIGZvciBhIGRyaXZlIGluIHRoZSBibGFja2xpc3QgYW5kIHRoZSB3aGl0ZWxpc3QgdGFibGVzCisgKglSZXR1cm5zIDEgaWYgdGhlIGRyaXZlIGlzIGZvdW5kIGluIHRoZSB0YWJsZS4KKyAqLworCitzdGF0aWMgaW50IGluX2RyaXZlX2xpc3Qoc3RydWN0IGhkX2RyaXZlaWQgKmlkLCBjb25zdCBzdHJ1Y3QgZHJpdmVfbGlzdF9lbnRyeSAqZHJpdmVfdGFibGUpCit7CisJZm9yICggOyBkcml2ZV90YWJsZS0+aWRfbW9kZWwgOyBkcml2ZV90YWJsZSsrKQorCQlpZiAoKCFzdHJjbXAoZHJpdmVfdGFibGUtPmlkX21vZGVsLCBpZC0+bW9kZWwpKSAmJgorCQkgICAgKChzdHJzdHIoZHJpdmVfdGFibGUtPmlkX2Zpcm13YXJlLCBpZC0+ZndfcmV2KSkgfHwKKwkJICAgICAoIXN0cmNtcChkcml2ZV90YWJsZS0+aWRfZmlybXdhcmUsICJBTEwiKSkpKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaWRlX2RtYV9pbnRyCS0JSURFIERNQSBpbnRlcnJ1cHQgaGFuZGxlcgorICoJQGRyaXZlOiB0aGUgZHJpdmUgdGhlIGludGVycnVwdCBpcyBmb3IKKyAqCisgKglIYW5kbGUgYW4gaW50ZXJydXB0IGNvbXBsZXRpbmcgYSByZWFkL3dyaXRlIERNQSB0cmFuc2ZlciBvbiBhbiAKKyAqCUlERSBkZXZpY2UKKyAqLworIAoraWRlX3N0YXJ0c3RvcF90IGlkZV9kbWFfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IHN0YXQgPSAwLCBkbWFfc3RhdCA9IDA7CisKKwlkbWFfc3RhdCA9IEhXSUYoZHJpdmUpLT5pZGVfZG1hX2VuZChkcml2ZSk7CisJc3RhdCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX1NUQVRVU19SRUcpOwkvKiBnZXQgZHJpdmUgc3RhdHVzICovCisJaWYgKE9LX1NUQVQoc3RhdCxEUklWRV9SRUFEWSxkcml2ZS0+YmFkX3dzdGF0fERSUV9TVEFUKSkgeworCQlpZiAoIWRtYV9zdGF0KSB7CisJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisKKwkJCWlmIChycS0+cnFfZGlzaykgeworCQkJCWlkZV9kcml2ZXJfdCAqZHJ2OworCisJCQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTs7CisJCQkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMSwgcnEtPm5yX3NlY3RvcnMpOworCQkJfSBlbHNlCisJCQkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCBycS0+bnJfc2VjdG9ycyk7CisJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZG1hX2ludHI6IGJhZCBETUEgc3RhdHVzIChkbWFfc3RhdD0leClcbiIsIAorCQkgICAgICAgZHJpdmUtPm5hbWUsIGRtYV9zdGF0KTsKKwl9CisJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgImRtYV9pbnRyIiwgc3RhdCk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfaW50cik7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJCisvKioKKyAqCWlkZV9idWlsZF9zZ2xpc3QJLQltYXAgSURFIHNjYXR0ZXIgZ2F0aGVyIGZvciBETUEgSS9PCisgKglAZHJpdmU6IHRoZSBkcml2ZSB0byBidWlsZCB0aGUgRE1BIHRhYmxlIGZvcgorICoJQHJxOiB0aGUgcmVxdWVzdCBob2xkaW5nIHRoZSBzZyBsaXN0CisgKgorICoJUGVyZm9ybSB0aGUgUENJIG1hcHBpbmcgbWFnaWMgbmVjZXNzYXJ5IHRvIGFjY2VzcyB0aGUgc291cmNlIG9yCisgKgl0YXJnZXQgYnVmZmVycyBvZiBhIHJlcXVlc3QgdmlhIFBDSSBETUEuIFRoZSBsb3dlciBsYXllcnMgb2YgdGhlCisgKglrZXJuZWwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNhY2hlIG1hbmFnZW1lbnQgc28gdGhhdCB3ZSBjYW4KKyAqCW9wZXJhdGUgaW4gYSBwb3J0YWJsZSBmYXNoaW9uCisgKi8KKworaW50IGlkZV9idWlsZF9zZ2xpc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBod2lmLT5zZ190YWJsZTsKKworCWlmICgocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0tGSUxFKSAmJiBycS0+bnJfc2VjdG9ycyA+IDI1NikKKwkJQlVHKCk7CisKKwlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisKKwlpZiAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpCisJCWh3aWYtPnNnX2RtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisJZWxzZQorCQlod2lmLT5zZ19kbWFfZGlyZWN0aW9uID0gUENJX0RNQV9UT0RFVklDRTsKKworCXJldHVybiBwY2lfbWFwX3NnKGh3aWYtPnBjaV9kZXYsIHNnLCBod2lmLT5zZ19uZW50cywgaHdpZi0+c2dfZG1hX2RpcmVjdGlvbik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9idWlsZF9zZ2xpc3QpOworCisvKioKKyAqCWlkZV9idWlsZF9kbWF0YWJsZQktCWJ1aWxkIElERSBETUEgdGFibGUKKyAqCisgKglpZGVfYnVpbGRfZG1hdGFibGUoKSBwcmVwYXJlcyBhIGRtYSByZXF1ZXN0LiBXZSBtYXAgdGhlIGNvbW1hbmQKKyAqCXRvIGdldCB0aGUgcGNpIGJ1cyBhZGRyZXNzZXMgb2YgdGhlIGJ1ZmZlcnMgYW5kIHRoZW4gYnVpbGQgdXAKKyAqCXRoZSBQUkQgdGFibGUgdGhhdCB0aGUgSURFIGxheWVyIHdhbnRzIHRvIGJlIGZlZC4gVGhlIGNvZGUKKyAqCWtub3dzIGFib3V0IHRoZSA2NEsgd3JhcCBidWcgaW4gdGhlIENTNTUzMC4KKyAqCisgKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVpbHQgUFJEIGVudHJpZXMgaWYgYWxsIHdlbnQgb2theSwKKyAqCXJldHVybnMgMCBvdGhlcndpc2UuCisgKgorICoJTWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHRybTI5MC5jCisgKi8KKyAKK2ludCBpZGVfYnVpbGRfZG1hdGFibGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBpbnQgKnRhYmxlCT0gaHdpZi0+ZG1hdGFibGVfY3B1OworCXVuc2lnbmVkIGludCBpc190cm0yOTAJPSAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfdHJtMjkwKSA/IDEgOiAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCWh3aWYtPnNnX25lbnRzID0gaSA9IGlkZV9idWlsZF9zZ2xpc3QoZHJpdmUsIHJxKTsKKworCWlmICghaSkKKwkJcmV0dXJuIDA7CisKKwlzZyA9IGh3aWYtPnNnX3RhYmxlOworCXdoaWxlIChpKSB7CisJCXUzMiBjdXJfYWRkcjsKKwkJdTMyIGN1cl9sZW47CisKKwkJY3VyX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWN1cl9sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBkbWEgdGFibGUsIHdpdGhvdXQgY3Jvc3NpbmcgYW55IDY0a0IgYm91bmRhcmllcy4KKwkJICogTW9zdCBoYXJkd2FyZSByZXF1aXJlcyAxNi1iaXQgYWxpZ25tZW50IG9mIGFsbCBibG9ja3MsCisJCSAqIGJ1dCB0aGUgdHJtMjkwIHJlcXVpcmVzIDMyLWJpdCBhbGlnbm1lbnQuCisJCSAqLworCisJCXdoaWxlIChjdXJfbGVuKSB7CisJCQlpZiAoY291bnQrKyA+PSBQUkRfRU5UUklFUykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSB0YWJsZSB0b28gc21hbGxcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCQlnb3RvIHVzZV9waW9faW5zdGVhZDsKKwkJCX0gZWxzZSB7CisJCQkJdTMyIHhjb3VudCwgYmNvdW50ID0gMHgxMDAwMCAtIChjdXJfYWRkciAmIDB4ZmZmZik7CisKKwkJCQlpZiAoYmNvdW50ID4gY3VyX2xlbikKKwkJCQkJYmNvdW50ID0gY3VyX2xlbjsKKwkJCQkqdGFibGUrKyA9IGNwdV90b19sZTMyKGN1cl9hZGRyKTsKKwkJCQl4Y291bnQgPSBiY291bnQgJiAweGZmZmY7CisJCQkJaWYgKGlzX3RybTI5MCkKKwkJCQkJeGNvdW50ID0gKCh4Y291bnQgPj4gMikgLSAxKSA8PCAxNjsKKwkJCQlpZiAoeGNvdW50ID09IDB4MDAwMCkgeworCS8qIAorCSAqIE1vc3QgY2hpcHNldHMgY29ycmVjdGx5IGludGVycHJldCBhIGxlbmd0aCBvZiAweDAwMDAgYXMgNjRLQiwKKwkgKiBidXQgYXQgbGVhc3Qgb25lIChlLmcuIENTNTUzMCkgbWlzaW50ZXJwcmV0cyBpdCBhcyB6ZXJvICghKS4KKwkgKiBTbyBoZXJlIHdlIGJyZWFrIHRoZSA2NEtCIGVudHJ5IGludG8gdHdvIDMyS0IgZW50cmllcyBpbnN0ZWFkLgorCSAqLworCQkJCQlpZiAoY291bnQrKyA+PSBQUkRfRU5UUklFUykgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIHRhYmxlIHRvbyBzbWFsbFxuIiwgZHJpdmUtPm5hbWUpOworCQkJCQkJZ290byB1c2VfcGlvX2luc3RlYWQ7CisJCQkJCX0KKwkJCQkJKnRhYmxlKysgPSBjcHVfdG9fbGUzMigweDgwMDApOworCQkJCQkqdGFibGUrKyA9IGNwdV90b19sZTMyKGN1cl9hZGRyICsgMHg4MDAwKTsKKwkJCQkJeGNvdW50ID0gMHg4MDAwOworCQkJCX0KKwkJCQkqdGFibGUrKyA9IGNwdV90b19sZTMyKHhjb3VudCk7CisJCQkJY3VyX2FkZHIgKz0gYmNvdW50OworCQkJCWN1cl9sZW4gLT0gYmNvdW50OworCQkJfQorCQl9CisKKwkJc2crKzsKKwkJaS0tOworCX0KKworCWlmIChjb3VudCkgeworCQlpZiAoIWlzX3RybTI5MCkKKwkJCSotLXRhYmxlIHw9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQlyZXR1cm4gY291bnQ7CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXM6IGVtcHR5IERNQSB0YWJsZT9cbiIsIGRyaXZlLT5uYW1lKTsKK3VzZV9waW9faW5zdGVhZDoKKwlwY2lfdW5tYXBfc2coaHdpZi0+cGNpX2RldiwKKwkJICAgICBod2lmLT5zZ190YWJsZSwKKwkJICAgICBod2lmLT5zZ19uZW50cywKKwkJICAgICBod2lmLT5zZ19kbWFfZGlyZWN0aW9uKTsKKwlyZXR1cm4gMDsgLyogcmV2ZXJ0IHRvIFBJTyBmb3IgdGhpcyByZXF1ZXN0ICovCit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9idWlsZF9kbWF0YWJsZSk7CisKKy8qKgorICoJaWRlX2Rlc3Ryb3lfZG1hdGFibGUJLQljbGVhbiB1cCBETUEgbWFwcGluZworICoJQGRyaXZlOiBUaGUgZHJpdmUgdG8gdW5tYXAKKyAqCisgKglUZWFyZG93biBtYXBwaW5ncyBhZnRlciBETUEgaGFzIGNvbXBsZXRlZC4gVGhpcyBtdXN0IGJlIGNhbGxlZAorICoJYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgZWFjaCB1c2Ugb2YgaWRlX2J1aWxkX2RtYXRhYmxlIGFuZCBiZWZvcmUKKyAqCXRoZSBuZXh0IHVzZSBvZiBpZGVfYnVpbGRfZG1hdGFibGUuIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZQorICoJYW4gb29wcyBhcyBvbmx5IG9uZSBtYXBwaW5nIGNhbiBiZSBsaXZlIGZvciBlYWNoIHRhcmdldCBhdCBhIGdpdmVuCisgKgl0aW1lLgorICovCisgCit2b2lkIGlkZV9kZXN0cm95X2RtYXRhYmxlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBIV0lGKGRyaXZlKS0+c2dfdGFibGU7CisJaW50IG5lbnRzID0gSFdJRihkcml2ZSktPnNnX25lbnRzOworCisJcGNpX3VubWFwX3NnKGRldiwgc2csIG5lbnRzLCBIV0lGKGRyaXZlKS0+c2dfZG1hX2RpcmVjdGlvbik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kZXN0cm95X2RtYXRhYmxlKTsKKworLyoqCisgKgljb25maWdfZHJpdmVfZm9yX2RtYQktCWF0dGVtcHQgdG8gYWN0aXZhdGUgSURFIERNQQorICoJQGRyaXZlOiB0aGUgZHJpdmUgdG8gcGxhY2UgaW4gRE1BIG1vZGUKKyAqCisgKglJZiB0aGUgZHJpdmUgc3VwcG9ydHMgYXQgbGVhc3QgbW9kZSAyIERNQSBvciBVRE1BIG9mIGFueSBraW5kCisgKgl0aGVuIGF0dGVtcHQgdG8gcGxhY2UgaXQgaW50byBETUEgbW9kZS4gRHJpdmVzIHRoYXQgYXJlIGtub3duIHRvCisgKglzdXBwb3J0IERNQSBidXQgcHJlZGF0ZSB0aGUgRE1BIHByb3BlcnRpZXMgb3IgdGhhdCBhcmUga25vd24KKyAqCXRvIGhhdmUgRE1BIGhhbmRsaW5nIGJ1Z3MgYXJlIGFsc28gc2V0IHVwIGFwcHJvcHJpYXRlbHkgYmFzZWQKKyAqCW9uIHRoZSBnb29kL2JhZCBkcml2ZSBsaXN0cy4KKyAqLworIAorc3RhdGljIGludCBjb25maWdfZHJpdmVfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisKKwlpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgaHdpZi0+YXV0b2RtYSkgeworCQkvKgorCQkgKiBFbmFibGUgRE1BIG9uIGFueSBkcml2ZSB0aGF0IGhhcworCQkgKiBVbHRyYURNQSAobW9kZSAwLzEvMi8zLzQvNS82KSBlbmFibGVkCisJCSAqLworCQlpZiAoKGlkLT5maWVsZF92YWxpZCAmIDQpICYmICgoaWQtPmRtYV91bHRyYSA+PiA4KSAmIDB4N2YpKQorCQkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCQkvKgorCQkgKiBFbmFibGUgRE1BIG9uIGFueSBkcml2ZSB0aGF0IGhhcyBtb2RlMiBETUEKKwkJICogKG11bHRpIG9yIHNpbmdsZSkgZW5hYmxlZAorCQkgKi8KKwkJaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpCS8qIHJlZ3VsYXIgRE1BICovCisJCQlpZiAoKGlkLT5kbWFfbXdvcmQgJiAweDQwNCkgPT0gMHg0MDQgfHwKKwkJCSAgICAoaWQtPmRtYV8xd29yZCAmIDB4NDA0KSA9PSAweDQwNCkKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisKKwkJLyogQ29uc3VsdCB0aGUgbGlzdCBvZiBrbm93biAiZ29vZCIgZHJpdmVzICovCisJCWlmIChfX2lkZV9kbWFfZ29vZF9kcml2ZShkcml2ZSkpCisJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJfQorLy8JaWYgKGh3aWYtPnR1bmVwcm9jICE9IE5VTEwpIGh3aWYtPnR1bmVwcm9jKGRyaXZlLCAyNTUpOworCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKK30KKworLyoqCisgKglkbWFfdGltZXJfZXhwaXJ5CS0JaGFuZGxlIGEgRE1BIHRpbWVvdXQKKyAqCUBkcml2ZTogRHJpdmUgdGhhdCB0aW1lZCBvdXQKKyAqCisgKglBbiBJREUgRE1BIHRyYW5zZmVyIHRpbWVkIG91dC4gSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIHdlIGFzaworICoJdGhlIGRyaXZlciB0byByZXNvbHZlIHRoZSBwcm9ibGVtLCBpZiBhIERNQSB0cmFuc2ZlciBpcyBzdGlsbAorICoJaW4gcHJvZ3Jlc3Mgd2UgY29udGludWUgdG8gd2FpdCAoYXJndWFibHkgd2UgbmVlZCB0byBhZGQgYSAKKyAqCXNlY29uZGFyeSAnSSBkb24ndCBjYXJlIHdoYXQgdGhlIGRyaXZlIHRoaW5rcycgdGltZW91dCBoZXJlKQorICoJRmluYWxseSBpZiB3ZSBoYXZlIGFuIGludGVycnVwdCB3ZSBsZXQgaXQgY29tcGxldGUgdGhlIEkvTy4KKyAqCUJ1dCBvbmx5IG9uZSB0aW1lIC0gd2UgY2xlYXIgZXhwaXJ5IGFuZCBpZiBpdCdzIHN0aWxsIG5vdAorICoJY29tcGxldGVkIGFmdGVyIFdBSVRfQ01ELCB3ZSBlcnJvciBhbmQgcmV0cnkgaW4gUElPLgorICoJVGhpcyBjYW4gb2NjdXIgaWYgYW4gaW50ZXJydXB0IGlzIGxvc3Qgb3IgZHVlIHRvIGhhbmcgb3IgYnVncy4KKyAqLworIAorc3RhdGljIGludCBkbWFfdGltZXJfZXhwaXJ5IChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXU4IGRtYV9zdGF0CQk9IGh3aWYtPklOQihod2lmLT5kbWFfc3RhdHVzKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkbWFfdGltZXJfZXhwaXJ5OiBkbWEgc3RhdHVzID09IDB4JTAyeFxuIiwKKwkJZHJpdmUtPm5hbWUsIGRtYV9zdGF0KTsKKworCWlmICgoZG1hX3N0YXQgJiAweDE4KSA9PSAweDE4KQkvKiBCVVNZIFN0dXBpZCBFYXJseSBUaW1lciAhISAqLworCQlyZXR1cm4gV0FJVF9DTUQ7CisKKwlIV0dST1VQKGRyaXZlKS0+ZXhwaXJ5ID0gTlVMTDsJLyogb25lIGZyZWUgcmlkZSBmb3Igbm93ICovCisKKwkvKiAxIGRtYWluZywgMiBlcnJvciwgNCBpbnRyICovCisJaWYgKGRtYV9zdGF0ICYgMikJLyogRVJST1IgKi8KKwkJcmV0dXJuIC0xOworCisJaWYgKGRtYV9zdGF0ICYgMSkJLyogRE1BaW5nICovCisJCXJldHVybiBXQUlUX0NNRDsKKworCWlmIChkbWFfc3RhdCAmIDQpCS8qIEdvdCBhbiBJbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIFdBSVRfQ01EOworCisJcmV0dXJuIDA7CS8qIFN0YXR1cyBpcyB1bmtub3duIC0tIHJlc2V0IHRoZSBidXMgKi8KK30KKworLyoqCisgKglfX2lkZV9kbWFfaG9zdF9vZmYJLQlHZW5lcmljIERNQSBraWxsCisgKglAZHJpdmU6IGRyaXZlIHRvIGNvbnRyb2wKKyAqCisgKglQZXJmb3JtIHRoZSBnZW5lcmljIElERSBjb250cm9sbGVyIERNQSBvZmYgb3BlcmF0aW9uLiBUaGlzCisgKgl3b3JrcyBmb3IgbW9zdCBJREUgYnVzIG1hc3RlcmluZyBjb250cm9sbGVycworICovCisKK2ludCBfX2lkZV9kbWFfaG9zdF9vZmYgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggdW5pdAkJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggZG1hX3N0YXQJCT0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCisJaHdpZi0+T1VUQigoZG1hX3N0YXQgJiB+KDE8PCg1K3VuaXQpKSksIGh3aWYtPmRtYV9zdGF0dXMpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKF9faWRlX2RtYV9ob3N0X29mZik7CisKKy8qKgorICoJX19pZGVfZG1hX2hvc3Rfb2ZmX3F1aWV0bHkJLQlHZW5lcmljIERNQSBraWxsCisgKglAZHJpdmU6IGRyaXZlIHRvIGNvbnRyb2wKKyAqCisgKglUdXJuIG9mZiB0aGUgY3VycmVudCBETUEgb24gdGhpcyBJREUgY29udHJvbGxlci4gCisgKi8KKworaW50IF9faWRlX2RtYV9vZmZfcXVpZXRseSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWRyaXZlLT51c2luZ19kbWEgPSAwOworCWlkZV90b2dnbGVfYm91bmNlKGRyaXZlLCAwKTsKKworCWlmIChIV0lGKGRyaXZlKS0+aWRlX2RtYV9ob3N0X29mZihkcml2ZSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pZGVfZG1hX29mZl9xdWlldGx5KTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJICovCisKKy8qKgorICoJX19pZGVfZG1hX29mZgktCWRpc2FibGUgRE1BIG9uIGEgZGV2aWNlCisgKglAZHJpdmU6IGRyaXZlIHRvIGRpc2FibGUgRE1BIG9uCisgKgorICoJRGlzYWJsZSBJREUgRE1BIGZvciBhIGRldmljZSBvbiB0aGlzIElERSBjb250cm9sbGVyLgorICoJSW5mb3JtIHRoZSB1c2VyIHRoYXQgRE1BIGhhcyBiZWVuIGRpc2FibGVkLgorICovCisKK2ludCBfX2lkZV9kbWFfb2ZmIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERNQSBkaXNhYmxlZFxuIiwgZHJpdmUtPm5hbWUpOworCXJldHVybiBIV0lGKGRyaXZlKS0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pZGVfZG1hX29mZik7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJCisvKioKKyAqCV9faWRlX2RtYV9ob3N0X29uCS0JRW5hYmxlIERNQSBvbiBhIGhvc3QKKyAqCUBkcml2ZTogZHJpdmUgdG8gZW5hYmxlIGZvciBETUEKKyAqCisgKglFbmFibGUgRE1BIG9uIGFuIElERSBjb250cm9sbGVyIGZvbGxvd2luZyBnZW5lcmljIGJ1cyBtYXN0ZXJpbmcKKyAqCUlERSBjb250cm9sbGVyIGJlaGF2aW91cgorICovCisgCitpbnQgX19pZGVfZG1hX2hvc3Rfb24gKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAoZHJpdmUtPnVzaW5nX2RtYSkgeworCQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJCXU4IHVuaXQJCQk9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOworCQl1OCBkbWFfc3RhdAkJPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisKKwkJaHdpZi0+T1VUQigoZG1hX3N0YXR8KDE8PCg1K3VuaXQpKSksIGh3aWYtPmRtYV9zdGF0dXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pZGVfZG1hX2hvc3Rfb24pOworCisvKioKKyAqCV9faWRlX2RtYV9vbgkJLQlFbmFibGUgRE1BIG9uIGEgZGV2aWNlCisgKglAZHJpdmU6IGRyaXZlIHRvIGVuYWJsZSBETUEgb24KKyAqCisgKglFbmFibGUgSURFIERNQSBmb3IgYSBkZXZpY2Ugb24gdGhpcyBJREUgY29udHJvbGxlci4KKyAqLworIAoraW50IF9faWRlX2RtYV9vbiAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCS8qIGNvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImJhZCIgZHJpdmVzICovCisJaWYgKF9faWRlX2RtYV9iYWRfZHJpdmUoZHJpdmUpKQorCQlyZXR1cm4gMTsKKworCWRyaXZlLT51c2luZ19kbWEgPSAxOworCWlkZV90b2dnbGVfYm91bmNlKGRyaXZlLCAxKTsKKworCWlmIChIV0lGKGRyaXZlKS0+aWRlX2RtYV9ob3N0X29uKGRyaXZlKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChfX2lkZV9kbWFfb24pOworCisvKioKKyAqCV9faWRlX2RtYV9jaGVjawkJLQljaGVjayBETUEgc2V0dXAKKyAqCUBkcml2ZTogZHJpdmUgdG8gY2hlY2sKKyAqCisgKglEb24ndCB1c2UgLSBkdWUgZm9yIGV4dGVybWluYXRpb24KKyAqLworIAoraW50IF9faWRlX2RtYV9jaGVjayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiBjb25maWdfZHJpdmVfZm9yX2RtYShkcml2ZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pZGVfZG1hX2NoZWNrKTsKKworLyoqCisgKglpZGVfZG1hX3NldHVwCS0JYmVnaW4gYSBETUEgcGhhc2UKKyAqCUBkcml2ZTogdGFyZ2V0IGRldmljZQorICoKKyAqCUJ1aWxkIGFuIElERSBETUEgUFJEIChJREUgc3BlYWsgZm9yIHNjYXR0ZXIgZ2F0aGVyIHRhYmxlKQorICoJYW5kIHRoZW4gc2V0IHVwIHRoZSBETUEgdHJhbnNmZXIgcmVnaXN0ZXJzIGZvciBhIGRldmljZQorICoJdGhhdCBmb2xsb3dzIGdlbmVyaWMgSURFIFBDSSBETUEgYmVoYXZpb3VyLiBDb250cm9sbGVycyBjYW4KKyAqCW92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaWYgdGhleSBuZWVkIHRvCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIElmIGEgUElPIGZhbGxiYWNrIGlzIHJlcXVpcmVkIHRoZW4gMQorICoJaXMgcmV0dXJuZWQuIAorICovCisKK2ludCBpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXVuc2lnbmVkIGludCByZWFkaW5nOworCXU4IGRtYV9zdGF0OworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSkKKwkJcmVhZGluZyA9IDA7CisJZWxzZQorCQlyZWFkaW5nID0gMSA8PCAzOworCisJLyogZmFsbCBiYWNrIHRvIHBpbyEgKi8KKwlpZiAoIWlkZV9idWlsZF9kbWF0YWJsZShkcml2ZSwgcnEpKSB7CisJCWlkZV9tYXBfc2coZHJpdmUsIHJxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUFJEIHRhYmxlICovCisJaHdpZi0+T1VUTChod2lmLT5kbWF0YWJsZV9kbWEsIGh3aWYtPmRtYV9wcmR0YWJsZSk7CisKKwkvKiBzcGVjaWZ5IHIvdyAqLworCWh3aWYtPk9VVEIocmVhZGluZywgaHdpZi0+ZG1hX2NvbW1hbmQpOworCisJLyogcmVhZCBkbWFfc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KKwlkbWFfc3RhdCA9IGh3aWYtPklOQihod2lmLT5kbWFfc3RhdHVzKTsKKworCS8qIGNsZWFyIElOVFIgJiBFUlJPUiBmbGFncyAqLworCWh3aWYtPk9VVEIoZG1hX3N0YXR8NiwgaHdpZi0+ZG1hX3N0YXR1cyk7CisJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfc2V0dXApOworCitzdGF0aWMgdm9pZCBpZGVfZG1hX2V4ZWNfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY29tbWFuZCkKK3sKKwkvKiBpc3N1ZSBjbWQgdG8gZHJpdmUgKi8KKwlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBjb21tYW5kLCAmaWRlX2RtYV9pbnRyLCAyKldBSVRfQ01ELCBkbWFfdGltZXJfZXhwaXJ5KTsKK30KKwordm9pZCBpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggZG1hX2NtZAkJPSBod2lmLT5JTkIoaHdpZi0+ZG1hX2NvbW1hbmQpOworCisJLyogTm90ZSB0aGF0IHRoaXMgaXMgZG9uZSAqYWZ0ZXIqIHRoZSBjbWQgaGFzCisJICogYmVlbiBpc3N1ZWQgdG8gdGhlIGRyaXZlLCBhcyBwZXIgdGhlIEJNLUlERSBzcGVjLgorCSAqIFRoZSBQcm9taXNlIFVsdHJhMzMgZG9lc24ndCB3b3JrIGNvcnJlY3RseSB3aGVuCisJICogd2UgZG8gdGhpcyBwYXJ0IGJlZm9yZSBpc3N1aW5nIHRoZSBkcml2ZSBjbWQuCisJICovCisJLyogc3RhcnQgRE1BICovCisJaHdpZi0+T1VUQihkbWFfY21kfDEsIGh3aWYtPmRtYV9jb21tYW5kKTsKKwlod2lmLT5kbWEgPSAxOworCXdtYigpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX3N0YXJ0KTsKKworLyogcmV0dXJucyAxIG9uIGVycm9yLCAwIG90aGVyd2lzZSAqLworaW50IF9faWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKKworCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOworCS8qIGdldCBkbWFfY29tbWFuZCBtb2RlICovCisJZG1hX2NtZCA9IGh3aWYtPklOQihod2lmLT5kbWFfY29tbWFuZCk7CisJLyogc3RvcCBETUEgKi8KKwlod2lmLT5PVVRCKGRtYV9jbWQmfjEsIGh3aWYtPmRtYV9jb21tYW5kKTsKKwkvKiBnZXQgRE1BIHN0YXR1cyAqLworCWRtYV9zdGF0ID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLworCWh3aWYtPk9VVEIoZG1hX3N0YXR8NiwgaHdpZi0+ZG1hX3N0YXR1cyk7CisJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCisJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOworCS8qIHZlcmlmeSBnb29kIERNQSBzdGF0dXMgKi8KKwlod2lmLT5kbWEgPSAwOworCXdtYigpOworCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0ID8gKDB4MTAgfCBkbWFfc3RhdCkgOiAwOworfQorCitFWFBPUlRfU1lNQk9MKF9faWRlX2RtYV9lbmQpOworCisvKiByZXR1cm5zIDEgaWYgZG1hIGlycSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IF9faWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXU4IGRtYV9zdGF0CQk9IGh3aWYtPklOQihod2lmLT5kbWFfc3RhdHVzKTsKKworI2lmIDAgIC8qIGRvIG5vdCBzZXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyAqLworCWlmIChkbWFfc3RhdCAmIDQpIHsKKwkJdTggc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyk7CisJCWh3aWYtPk9VVEIoaHdpZi0+ZG1hX3N0YXR1cywgZG1hX3N0YXQgJiAweEU0KTsKKwl9CisjZW5kaWYKKwkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCisJaWYgKChkbWFfc3RhdCAmIDQpID09IDQpCisJCXJldHVybiAxOworCWlmICghZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICglcykgY2FsbGVkIHdoaWxlIG5vdCB3YWl0aW5nXG4iLAorCQkJZHJpdmUtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BX1BDSSAqLworCitpbnQgX19pZGVfZG1hX2JhZF9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworCWludCBibGFja2xpc3QgPSBpbl9kcml2ZV9saXN0KGlkLCBkcml2ZV9ibGFja2xpc3QpOworCWlmIChibGFja2xpc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERpc2FibGluZyAoVSlETUEgZm9yICVzIChibGFja2xpc3RlZClcbiIsCisJCQkJICAgIGRyaXZlLT5uYW1lLCBpZC0+bW9kZWwpOworCQlyZXR1cm4gYmxhY2tsaXN0OworCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChfX2lkZV9kbWFfYmFkX2RyaXZlKTsKKworaW50IF9faWRlX2RtYV9nb29kX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCXJldHVybiBpbl9kcml2ZV9saXN0KGlkLCBkcml2ZV93aGl0ZWxpc3QpOworfQorCitFWFBPUlRfU1lNQk9MKF9faWRlX2RtYV9nb29kX2RyaXZlKTsKKworaW50IGlkZV91c2VfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCisJLyogY29uc3VsdCB0aGUgbGlzdCBvZiBrbm93biAiYmFkIiBkcml2ZXMgKi8KKwlpZiAoX19pZGVfZG1hX2JhZF9kcml2ZShkcml2ZSkpCisJCXJldHVybiAwOworCisJLyogY2FwYWJsZSBvZiBVbHRyYURNQSBtb2RlcyAqLworCWlmIChpZC0+ZmllbGRfdmFsaWQgJiA0KSB7CisJCWlmIChod2lmLT51bHRyYV9tYXNrICYgaWQtPmRtYV91bHRyYSkKKwkJCXJldHVybiAxOworCX0KKworCS8qIGNhcGFibGUgb2YgcmVndWxhciBETUEgbW9kZXMgKi8KKwlpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgeworCQlpZiAoaHdpZi0+bXdkbWFfbWFzayAmIGlkLT5kbWFfbXdvcmQpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGh3aWYtPnN3ZG1hX21hc2sgJiBpZC0+ZG1hXzF3b3JkKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogY29uc3VsdCB0aGUgbGlzdCBvZiBrbm93biAiZ29vZCIgZHJpdmVzICovCisJaWYgKF9faWRlX2RtYV9nb29kX2RyaXZlKGRyaXZlKSAmJiBpZC0+ZWlkZV9kbWFfdGltZSA8IDE1MCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3VzZV9kbWEpOworCit2b2lkIGlkZV9kbWFfdmVyYm9zZShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKworCWlmIChpZC0+ZmllbGRfdmFsaWQgJiA0KSB7CisJCWlmICgoaWQtPmRtYV91bHRyYSA+PiA4KSAmJiAoaWQtPmRtYV9td29yZCA+PiA4KSkKKwkJCWdvdG8gYnVnX2RtYV9vZmY7CisJCWlmIChpZC0+ZG1hX3VsdHJhICYgKChpZC0+ZG1hX3VsdHJhID4+IDgpICYgaHdpZi0+dWx0cmFfbWFzaykpIHsKKwkJCWlmICgoKGlkLT5kbWFfdWx0cmEgPj4gMTEpICYgMHgxRikgJiYKKwkJCSAgICBlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpKSB7CisJCQkJaWYgKChpZC0+ZG1hX3VsdHJhID4+IDE1KSAmIDEpIHsKKwkJCQkJcHJpbnRrKCIsIFVETUEobW9kZSA3KSIpOworCQkJCX0gZWxzZSBpZiAoKGlkLT5kbWFfdWx0cmEgPj4gMTQpICYgMSkgeworCQkJCQlwcmludGsoIiwgVURNQSgxMzMpIik7CisJCQkJfSBlbHNlIGlmICgoaWQtPmRtYV91bHRyYSA+PiAxMykgJiAxKSB7CisJCQkJCXByaW50aygiLCBVRE1BKDEwMCkiKTsKKwkJCQl9IGVsc2UgaWYgKChpZC0+ZG1hX3VsdHJhID4+IDEyKSAmIDEpIHsKKwkJCQkJcHJpbnRrKCIsIFVETUEoNjYpIik7CisJCQkJfSBlbHNlIGlmICgoaWQtPmRtYV91bHRyYSA+PiAxMSkgJiAxKSB7CisJCQkJCXByaW50aygiLCBVRE1BKDQ0KSIpOworCQkJCX0gZWxzZQorCQkJCQlnb3RvIG1vZGVfdHdvOworCQkJfSBlbHNlIHsKKwkJbW9kZV90d286CisJCQkJaWYgKChpZC0+ZG1hX3VsdHJhID4+IDEwKSAmIDEpIHsKKwkJCQkJcHJpbnRrKCIsIFVETUEoMzMpIik7CisJCQkJfSBlbHNlIGlmICgoaWQtPmRtYV91bHRyYSA+PiA5KSAmIDEpIHsKKwkJCQkJcHJpbnRrKCIsIFVETUEoMjUpIik7CisJCQkJfSBlbHNlIGlmICgoaWQtPmRtYV91bHRyYSA+PiA4KSAmIDEpIHsKKwkJCQkJcHJpbnRrKCIsIFVETUEoMTYpIik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKCIsIChVKURNQSIpOwkvKiBDYW4gYmUgQklPUy1lbmFibGVkISAqLworCQl9CisJfSBlbHNlIGlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7CisJCWlmICgoaWQtPmRtYV9td29yZCA+PiA4KSAmJiAoaWQtPmRtYV8xd29yZCA+PiA4KSkKKwkJCWdvdG8gYnVnX2RtYV9vZmY7CisJCXByaW50aygiLCBETUEiKTsKKwl9IGVsc2UgaWYgKGlkLT5maWVsZF92YWxpZCAmIDEpIHsKKwkJcHJpbnRrKCIsIEJVRyIpOworCX0KKwlyZXR1cm47CitidWdfZG1hX29mZjoKKwlwcmludGsoIiwgQlVHIERNQSBPRkYiKTsKKwlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2RtYV92ZXJib3NlKTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QQ0kKK2ludCBfX2lkZV9kbWFfbG9zdGlycSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXByaW50aygiJXM6IERNQSBpbnRlcnJ1cHQgcmVjb3ZlcnlcbiIsIGRyaXZlLT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworRVhQT1JUX1NZTUJPTChfX2lkZV9kbWFfbG9zdGlycSk7CisKK2ludCBfX2lkZV9kbWFfdGltZW91dCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgRE1BXG4iLCBkcml2ZS0+bmFtZSk7CisJaWYgKEhXSUYoZHJpdmUpLT5pZGVfZG1hX3Rlc3RfaXJxKGRyaXZlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gSFdJRihkcml2ZSktPmlkZV9kbWFfZW5kKGRyaXZlKTsKK30KKworRVhQT1JUX1NZTUJPTChfX2lkZV9kbWFfdGltZW91dCk7CisKKy8qCisgKiBOZWVkZWQgZm9yIGFsbG93aW5nIGZ1bGwgbW9kdWxhciBzdXBwb3J0IG9mIGlkZS1kcml2ZXIKKyAqLworc3RhdGljIGludCBpZGVfcmVsZWFzZV9kbWFfZW5naW5lKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWYgKGh3aWYtPmRtYXRhYmxlX2NwdSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGh3aWYtPnBjaV9kZXYsCisJCQkJICAgIFBSRF9FTlRSSUVTICogUFJEX0JZVEVTLAorCQkJCSAgICBod2lmLT5kbWF0YWJsZV9jcHUsCisJCQkJICAgIGh3aWYtPmRtYXRhYmxlX2RtYSk7CisJCWh3aWYtPmRtYXRhYmxlX2NwdSA9IE5VTEw7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlkZV9yZWxlYXNlX2lvbWlvX2RtYShpZGVfaHdpZl90ICpod2lmKQoreworCWlmICgoaHdpZi0+ZG1hX2V4dHJhKSAmJiAoaHdpZi0+Y2hhbm5lbCA9PSAwKSkKKwkJcmVsZWFzZV9yZWdpb24oKGh3aWYtPmRtYV9iYXNlICsgMTYpLCBod2lmLT5kbWFfZXh0cmEpOworCXJlbGVhc2VfcmVnaW9uKGh3aWYtPmRtYV9iYXNlLCA4KTsKKwlpZiAoaHdpZi0+ZG1hX2Jhc2UyKQorCQlyZWxlYXNlX3JlZ2lvbihod2lmLT5kbWFfYmFzZSwgOCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBOZWVkZWQgZm9yIGFsbG93aW5nIGZ1bGwgbW9kdWxhciBzdXBwb3J0IG9mIGlkZS1kcml2ZXIKKyAqLworaW50IGlkZV9yZWxlYXNlX2RtYSAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZiAoaHdpZi0+bW1pbyA9PSAyKQorCQlyZXR1cm4gMTsKKwlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfZXRyYXgxMDApCisJCXJldHVybiAxOworCisJaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShod2lmKTsKKwlyZXR1cm4gaWRlX3JlbGVhc2VfaW9taW9fZG1hKGh3aWYpOworfQorCitzdGF0aWMgaW50IGlkZV9hbGxvY2F0ZV9kbWFfZW5naW5lKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+ZG1hdGFibGVfY3B1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaHdpZi0+cGNpX2RldiwKKwkJCQkJCSAgUFJEX0VOVFJJRVMgKiBQUkRfQllURVMsCisJCQkJCQkgICZod2lmLT5kbWF0YWJsZV9kbWEpOworCisJaWYgKGh3aWYtPmRtYXRhYmxlX2NwdSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiAtLSBFcnJvciwgdW5hYmxlIHRvIGFsbG9jYXRlJXMgRE1BIHRhYmxlKHMpLlxuIiwKKwkJCWh3aWYtPmNkcy0+bmFtZSwgIWh3aWYtPmRtYXRhYmxlX2NwdSA/ICIgQ1BVIiA6ICIiKTsKKworCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaWRlX21hcHBlZF9tbWlvX2RtYShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIgICAgJXM6IE1NSU8tRE1BICIsIGh3aWYtPm5hbWUpOworCisJaHdpZi0+ZG1hX2Jhc2UgPSBiYXNlOworCWlmIChod2lmLT5jZHMtPmV4dHJhICYmIGh3aWYtPmNoYW5uZWwgPT0gMCkKKwkJaHdpZi0+ZG1hX2V4dHJhID0gaHdpZi0+Y2RzLT5leHRyYTsKKworCWlmKGh3aWYtPm1hdGUpCisJCWh3aWYtPmRtYV9tYXN0ZXIgPSAoaHdpZi0+Y2hhbm5lbCkgPyBod2lmLT5tYXRlLT5kbWFfYmFzZSA6IGJhc2U7CisJZWxzZQorCQlod2lmLT5kbWFfbWFzdGVyID0gYmFzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVfaW9taW9fZG1hKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgaW50IHBvcnRzKQoreworCXByaW50ayhLRVJOX0lORk8gIiAgICAlczogQk0tRE1BIGF0IDB4JTA0bHgtMHglMDRseCIsCisJCWh3aWYtPm5hbWUsIGJhc2UsIGJhc2UgKyBwb3J0cyAtIDEpOworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgcG9ydHMsIGh3aWYtPm5hbWUpKSB7CisJCXByaW50aygiIC0tIEVycm9yLCBwb3J0cyBpbiB1c2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWh3aWYtPmRtYV9iYXNlID0gYmFzZTsKKwlpZiAoKGh3aWYtPmNkcy0+ZXh0cmEpICYmIChod2lmLT5jaGFubmVsID09IDApKSB7CisJCXJlcXVlc3RfcmVnaW9uKGJhc2UrMTYsIGh3aWYtPmNkcy0+ZXh0cmEsIGh3aWYtPmNkcy0+bmFtZSk7CisJCWh3aWYtPmRtYV9leHRyYSA9IGh3aWYtPmNkcy0+ZXh0cmE7CisJfQorCQorCWlmKGh3aWYtPm1hdGUpCisJCWh3aWYtPmRtYV9tYXN0ZXIgPSAoaHdpZi0+Y2hhbm5lbCkgPyBod2lmLT5tYXRlLT5kbWFfYmFzZSA6IGJhc2U7CisJZWxzZQorCQlod2lmLT5kbWFfbWFzdGVyID0gYmFzZTsKKwlpZiAoaHdpZi0+ZG1hX2Jhc2UyKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oaHdpZi0+ZG1hX2Jhc2UyLCBwb3J0cywgaHdpZi0+bmFtZSkpCisJCXsKKwkJCXByaW50aygiIC0tIEVycm9yLCBzZWNvbmRhcnkgcG9ydHMgaW4gdXNlLlxuIik7CisJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCBwb3J0cyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVfZG1hX2lvYmFzZShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0cykKK3sKKwlpZiAoaHdpZi0+bW1pbyA9PSAyKQorCQlyZXR1cm4gaWRlX21hcHBlZF9tbWlvX2RtYShod2lmLCBiYXNlLHBvcnRzKTsKKwlCVUdfT04oaHdpZi0+bW1pbyA9PSAxKTsKKwlyZXR1cm4gaWRlX2lvbWlvX2RtYShod2lmLCBiYXNlLCBwb3J0cyk7Cit9CisKKy8qCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGEgZHluYW1pY2FsbHkgaW5zdGFsbGVkIGludGVyZmFjZS4gRG9uJ3QgX19pbml0IGl0CisgKi8KK3ZvaWQgaWRlX3NldHVwX2RtYSAoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFfYmFzZSwgdW5zaWduZWQgaW50IG51bV9wb3J0cykKK3sKKwlpZiAoaWRlX2RtYV9pb2Jhc2UoaHdpZiwgZG1hX2Jhc2UsIG51bV9wb3J0cykpCisJCXJldHVybjsKKworCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkgeworCQlpZGVfcmVsZWFzZV9kbWEoaHdpZik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShod2lmLT5kbWFfY29tbWFuZCkpCisJCWh3aWYtPmRtYV9jb21tYW5kCT0gaHdpZi0+ZG1hX2Jhc2U7CisJaWYgKCEoaHdpZi0+ZG1hX3ZlbmRvcjEpKQorCQlod2lmLT5kbWFfdmVuZG9yMQk9IChod2lmLT5kbWFfYmFzZSArIDEpOworCWlmICghKGh3aWYtPmRtYV9zdGF0dXMpKQorCQlod2lmLT5kbWFfc3RhdHVzCT0gKGh3aWYtPmRtYV9iYXNlICsgMik7CisJaWYgKCEoaHdpZi0+ZG1hX3ZlbmRvcjMpKQorCQlod2lmLT5kbWFfdmVuZG9yMwk9IChod2lmLT5kbWFfYmFzZSArIDMpOworCWlmICghKGh3aWYtPmRtYV9wcmR0YWJsZSkpCisJCWh3aWYtPmRtYV9wcmR0YWJsZQk9IChod2lmLT5kbWFfYmFzZSArIDQpOworCisJaWYgKCFod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KQorCQlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5ID0gJl9faWRlX2RtYV9vZmZfcXVpZXRseTsKKwlpZiAoIWh3aWYtPmlkZV9kbWFfaG9zdF9vZmYpCisJCWh3aWYtPmlkZV9kbWFfaG9zdF9vZmYgPSAmX19pZGVfZG1hX2hvc3Rfb2ZmOworCWlmICghaHdpZi0+aWRlX2RtYV9vbikKKwkJaHdpZi0+aWRlX2RtYV9vbiA9ICZfX2lkZV9kbWFfb247CisJaWYgKCFod2lmLT5pZGVfZG1hX2hvc3Rfb24pCisJCWh3aWYtPmlkZV9kbWFfaG9zdF9vbiA9ICZfX2lkZV9kbWFfaG9zdF9vbjsKKwlpZiAoIWh3aWYtPmlkZV9kbWFfY2hlY2spCisJCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmX19pZGVfZG1hX2NoZWNrOworCWlmICghaHdpZi0+ZG1hX3NldHVwKQorCQlod2lmLT5kbWFfc2V0dXAgPSAmaWRlX2RtYV9zZXR1cDsKKwlpZiAoIWh3aWYtPmRtYV9leGVjX2NtZCkKKwkJaHdpZi0+ZG1hX2V4ZWNfY21kID0gJmlkZV9kbWFfZXhlY19jbWQ7CisJaWYgKCFod2lmLT5kbWFfc3RhcnQpCisJCWh3aWYtPmRtYV9zdGFydCA9ICZpZGVfZG1hX3N0YXJ0OworCWlmICghaHdpZi0+aWRlX2RtYV9lbmQpCisJCWh3aWYtPmlkZV9kbWFfZW5kID0gJl9faWRlX2RtYV9lbmQ7CisJaWYgKCFod2lmLT5pZGVfZG1hX3Rlc3RfaXJxKQorCQlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJl9faWRlX2RtYV90ZXN0X2lycTsKKwlpZiAoIWh3aWYtPmlkZV9kbWFfdGltZW91dCkKKwkJaHdpZi0+aWRlX2RtYV90aW1lb3V0ID0gJl9faWRlX2RtYV90aW1lb3V0OworCWlmICghaHdpZi0+aWRlX2RtYV9sb3N0aXJxKQorCQlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmX19pZGVfZG1hX2xvc3RpcnE7CisKKwlpZiAoaHdpZi0+Y2hpcHNldCAhPSBpZGVfdHJtMjkwKSB7CisJCXU4IGRtYV9zdGF0ID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCQlwcmludGsoIiwgQklPUyBzZXR0aW5nczogJXM6JXMsICVzOiVzIiwKKwkJICAgICAgIGh3aWYtPmRyaXZlc1swXS5uYW1lLCAoZG1hX3N0YXQgJiAweDIwKSA/ICJETUEiIDogInBpbyIsCisJCSAgICAgICBod2lmLT5kcml2ZXNbMV0ubmFtZSwgKGRtYV9zdGF0ICYgMHg0MCkgPyAiRE1BIiA6ICJwaW8iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisJaWYgKCEoaHdpZi0+ZG1hX21hc3RlcikpCisJCUJVRygpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfc2V0dXBfZG1hKTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjMGI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtMCwwICsxLDIyMTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMJVmVyc2lvbiAwLjk5CUZlYiAyNCAyMDAyCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IC0gMTk5OSBHYWRpIE94bWFuIDxnYWRpb0BuZXR2aXNpb24ubmV0LmlsPgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwMiBQYXVsIEJyaXN0b3cgPHBhdWxAcGF1bGJyaXN0b3cubmV0PgorICovCisKKy8qCisgKiBJREUgQVRBUEkgZmxvcHB5IGRyaXZlci4KKyAqCisgKiBUaGUgZHJpdmVyIGN1cnJlbnRseSBkb2Vzbid0IGhhdmUgYW55IGZhbmN5IGZlYXR1cmVzLCBqdXN0IHRoZSBiYXJlCisgKiBtaW5pbXVtIHJlYWQvd3JpdGUgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIElERSBmbG9wcHkgZHJpdmVzOgorICoKKyAqIExTLTEyMC8yNDAgU3VwZXJEaXNrCisgKiBJb21lZ2EgWmlwIDEwMC8yNTAKKyAqIElvbWVnYSBQQyBDYXJkIENsaWshL1BvY2tldFppcAorICoKKyAqIE1hbnkgdGhhbmtzIHRvIExvZGUgTGVyb3kgPExvZGUuTGVyb3lAd3d3LmliYXNlLmJlPiwgd2hvIHRlc3RlZCBzbyBtYW55CisgKiBBTFBIQSBwYXRjaGVzIHRvIHRoaXMgZHJpdmVyIG9uIGFuIEVBU1lTVE9SIExTLTEyMCBBVEFQSSBmbG9wcHkgZHJpdmUuCisgKgorICogVmVyIDAuMSAgIE9jdCAxNyA5NiAgIEluaXRpYWwgdGVzdCB2ZXJzaW9uLCBtb3N0bHkgYmFzZWQgb24gaWRlLXRhcGUuYy4KKyAqIFZlciAwLjIgICBPY3QgMzEgOTYgICBNaW5vciBjaGFuZ2VzLgorICogVmVyIDAuMyAgIERlYyAgMiA5NiAgIEZpeGVkIGVycm9yIHJlY292ZXJ5IGJ1Zy4KKyAqIFZlciAwLjQgICBKYW4gMjYgOTcgICBBZGQgc3VwcG9ydCBmb3IgdGhlIEhESU9fR0VUR0VPIGlvY3RsLgorICogVmVyIDAuNSAgIEZlYiAyMSA5NyAgIEFkZCBwYXJ0aXRpb25zIHN1cHBvcnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBtaW5pbXVtIG9mIHRoZSBMQkEgYW5kIENIUyBjYXBhY2l0aWVzLgorICogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIGh3Z3JvdXAtPnJxID09IE5VTEwgb24gdGhlIGxhc3QgaXJxLgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBwb3RlbnRpYWwgbnVsbCBkZXJlZmVyZW5jaW5nIHdpdGggREVCVUdfTE9HLgorICogVmVyIDAuOCAgIERlYyAgNyA5NyAgIEluY3JlYXNlIGlycSB0aW1lb3V0IGZyb20gMTAgdG8gNTAgc2Vjb25kcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGQgbWVkaWEgd3JpdGUtcHJvdGVjdCBkZXRlY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgU1RBUlQgY29tbWFuZCBvbmx5IGlmIFRFU1QgVU5JVCBSRUFEWSBmYWlscy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGQgd29yay1hcm91bmQgZm9yIElPTUVHQSBaSVAgcmV2aXNpb24gMjEuRC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgaWRlZmxvcHB5X2dldF9jYXBhYmlsaXRpZXMoKS4KKyAqIFZlciAwLjkgICBKdWwgIDQgOTkgICBGaXggYSBidWcgd2hpY2ggbWlnaHQgaGF2ZSBjYXVzZWQgdGhlIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICBieXRlcyByZXF1ZXN0ZWQgb24gZWFjaCBpbnRlcnJ1cHQgdG8gYmUgemVyby4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIDxzaGFub3NAZXMuY28ubno+IGZvciBwb2ludGluZyB0aGlzIG91dC4KKyAqIFZlciAwLjkuc3YgSmFuIDYgMDEgICBTYW0gVmFyc2hhdmNoaWsgPG1yc2FtQGNvdXJpZXItbXRhLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnQgbG93IGxldmVsIGZvcm1hdHRpbmcuICBSZWltcGxlbWVudGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFLCBzaW5jZSB3ZSBuZWVkIHRoZSBzcmZwCisgKiAgICAgICAgICAgICAgICAgICAgICAgYml0LiAgTXkgTFMtMTIwIGRyaXZlIGJhcmZzIG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFLCBidXQgbWF5YmUgaXQncyBqdXN0IG1lLgorICogICAgICAgICAgICAgICAgICAgICAgIENvbXByb21pc2UgYnkgbm90IHJlcG9ydGluZyBhIGZhaWx1cmUgdG8gZ2V0IHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHBhZ2UuICBJbXBsZW1lbnRlZCBmb3VyIElPQ1RMcyBpbiBvcmRlciB0bworICogICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCBmb3JtYXR0aW5nLiAgSU9DVGxzIGJlZ2luIHdpdGggMHg0NjAwLAorICogICAgICAgICAgICAgICAgICAgICAgIDB4NDYgaXMgJ0YnIGFzIGluIEZvcm1hdC4KKyAqICAgICAgICAgICAgSmFuIDkgMDEgICBVc2VybGFuZCBvcHRpb24gdG8gc2VsZWN0IGZvcm1hdCB2ZXJpZnkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUENfU1VQUFJFU1NfRVJST1IgZmxhZyAtIHNvbWUgaWRlZmxvcHB5IGRyaXZlcworICogICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBpbXBsZW1lbnQgSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFLCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSBzZW5zZSBlcnJvci4gIFN1cHByZXNzIGVycm9yIHJlcG9ydGluZyBpbgorICogICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGFydGljdWxhciBjYXNlIGluIG9yZGVyIHRvIGF2b2lkIHNwdXJpb3VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIGluIHN5c2xvZy4gIFRoZSBjdWxwcml0IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgaWRlZmxvcHB5X2dldF9jYXBhYmlsaXR5X3BhZ2UoKSwgc28gbW92ZSBpdCB0bworICogICAgICAgICAgICAgICAgICAgICAgIGlkZWZsb3BweV9iZWdpbl9mb3JtYXQoKSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZHJpdmUgZG9lcyBub3Qgc3VwcG9ydCBmb3JtYXQgcHJvZ3Jlc3MgaW5kaWNhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgdGhlIGRzYyBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3Rlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBbHNvLCBPX05ERUxBWSBvbiBvcGVuIHdpbGwgYWxsb3cgdGhlIGRldmljZSB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZCB3aXRob3V0IGEgZGlzayBhdmFpbGFibGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBhbiB1bmZvcm1hdHRlZCBkaXNrLCBvciBnZXQgdGhlIGRldmljZSBjYXBhY2l0eS4KKyAqIFZlciAwLjkxICBEZWMgMTEgOTkgICBBZGRlZCBJT01FR0EgQ2xpayEgZHJpdmUgc3VwcG9ydCBieSAKKyAqICAgICAJCSAgIDxwYXVsQHBhdWxicmlzdG93Lm5ldD4KKyAqIFZlciAwLjkyICBPY3QgMjIgMDAgICBQYXVsIEJyaXN0b3cgYmVjYW1lIG9mZmljaWFsIG1haW50YWluZXIgZm9yIHRoaXMgCisgKiAgICAgICAgICAgCQkgICBkcml2ZXIuICBJbmNsdWRlZCBQb3dlcmJvb2sgaW50ZXJuYWwgemlwIGtsdWRnZS4KKyAqIFZlciAwLjkzICBPY3QgMjQgMDAgICBGaXhlZCBidWdzIGZvciBDbGlrISBkcml2ZQorICogICAgICAgICAgICAgICAgICAgICAgICBubyBkaXNrIG9uIGluc2VydCBhbmQgZGlzayBjaGFuZ2Ugbm93IHdvcmtzCisgKiBWZXIgMC45NCAgT2N0IDI3IDAwICAgVGlkaWVkIHVwIHRvIHJlbW92ZSBzdHJzdHIoQ2xpaykgZXZlcnl3aGVyZQorICogVmVyIDAuOTUgIE5vdiAgNyAwMCAgIEJyb3VnaHQgYWNyb3NzIHRvIGtlcm5lbCAyLjQKKyAqIFZlciAwLjk2ICBKYW4gIDcgMDEgICBBY3R1YWxseSBpbiBsaW5lIHdpdGggcmVsZWFzZSB2ZXJzaW9uIG9mIDIuNC4wCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHNldF9iaXQgcGF0Y2ggZnJvbSBSdXN0eSBSdXNzZWxsCisgKiBWZXIgMC45NyAgSnVsIDIyIDAxICAgTWVyZ2UgMC45MS0wLjk2IG9udG8gMC45LnN2IGZvciBhYyBzZXJpZXMKKyAqIFZlciAwLjk3LnN2IEF1ZyAzIDAxICBCYWNrcG9ydGVkIGZyb20gMi40LjctYWMzCisgKiBWZXIgMC45OCAgT2N0IDI2IDAxICAgU3BsaXQgaWRlZmxvcHB5X3RyYW5zZmVyX3BjIGludG8gdHdvIHBpZWNlcyB0bworICogICAgICAgICAgICAgICAgICAgICAgICBmaXggYSBsb3N0IGludGVycnVwdCBwcm9ibGVtLiBJdCBhcHBlYXJzIHRoZSBidXN5CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJpdCB3YXMgYmVpbmcgZGVhc3NlcnRlZCBieSBteSBJT01FR0EgQVRBUEkgWklQIDEwMAorICogICAgICAgICAgICAgICAgICAgICAgICBkcml2ZSBiZWZvcmUgdGhlIGRyaXZlIHdhcyBhY3R1YWxseSByZWFkeS4KKyAqIFZlciAwLjk4YSBPY3QgMjkgMDEgICBFeHBvc2UgZGVsYXkgdmFsdWUgc28gd2UgY2FuIHBsYXkuCisgKiBWZXIgMC45OSAgRmViIDI0IDAyICAgUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlLCBtb2RpZnkgY2xpayEgZGV0ZWN0aW9uIGNvZGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBvcnQgbmV3IFBvY2tldFppcCBkcml2ZXMgCisgKi8KKworI2RlZmluZSBJREVGTE9QUFlfVkVSU0lPTiAiMC45OS5uZXdpZGUiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZGVidWcgdGhlIGRyaXZlci4KKyAqLworI2RlZmluZSBJREVGTE9QUFlfREVCVUdfTE9HCQkwCisjZGVmaW5lIElERUZMT1BQWV9ERUJVR19JTkZPCQkwCisjZGVmaW5lIElERUZMT1BQWV9ERUJVR19CVUdTCQkxCisKKy8qICNkZWZpbmUgSURFRkxPUFBZX0RFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyBmbXQsICMjIGFyZ3MpICovCisjZGVmaW5lIElERUZMT1BQWV9ERUJVRyggZm10LCBhcmdzLi4uICkKKworI2lmIElERUZMT1BQWV9ERUJVR19MT0cKKyNkZWZpbmUgZGVidWdfbG9nIHByaW50aworI2Vsc2UKKyNkZWZpbmUgZGVidWdfbG9nKGZtdCwgYXJncy4uLiApIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworCisvKgorICoJU29tZSBkcml2ZXMgcmVxdWlyZSBhIGxvbmdlciBpcnEgdGltZW91dC4KKyAqLworI2RlZmluZSBJREVGTE9QUFlfV0FJVF9DTUQJCSg1ICogV0FJVF9DTUQpCisKKy8qCisgKglBZnRlciBlYWNoIGZhaWxlZCBwYWNrZXQgY29tbWFuZCB3ZSBpc3N1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorICoJYW5kIHJldHJ5IHRoZSBwYWNrZXQgY29tbWFuZCBJREVGTE9QUFlfTUFYX1BDX1JFVFJJRVMgdGltZXMuCisgKi8KKyNkZWZpbmUgSURFRkxPUFBZX01BWF9QQ19SRVRSSUVTCTMKKworLyoKKyAqCVdpdGggZWFjaCBwYWNrZXQgY29tbWFuZCwgd2UgYWxsb2NhdGUgYSBidWZmZXIgb2YKKyAqCUlERUZMT1BQWV9QQ19CVUZGRVJfU0laRSBieXRlcy4KKyAqLworI2RlZmluZSBJREVGTE9QUFlfUENfQlVGRkVSX1NJWkUJMjU2CisKKy8qCisgKglJbiB2YXJpb3VzIHBsYWNlcyBpbiB0aGUgZHJpdmVyLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHN0b3JhZ2UKKyAqCWZvciBwYWNrZXQgY29tbWFuZHMgYW5kIHJlcXVlc3RzLCB3aGljaCB3aWxsIHJlbWFpbiB2YWxpZCB3aGlsZQorICoJd2UgbGVhdmUgdGhlIGRyaXZlciB0byB3YWl0IGZvciBhbiBpbnRlcnJ1cHQgb3IgYSB0aW1lb3V0IGV2ZW50LgorICovCisjZGVmaW5lIElERUZMT1BQWV9QQ19TVEFDSwkJKDEwICsgSURFRkxPUFBZX01BWF9QQ19SRVRSSUVTKQorCisvKgorICoJT3VyIHZpZXcgb2YgYSBwYWNrZXQgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWRlZmxvcHB5X3BhY2tldF9jb21tYW5kX3MgeworCXU4IGNbMTJdOwkJCQkvKiBBY3R1YWwgcGFja2V0IGJ5dGVzICovCisJaW50IHJldHJpZXM7CQkJCS8qIE9uIGVhY2ggcmV0cnksIHdlIGluY3JlbWVudCByZXRyaWVzICovCisJaW50IGVycm9yOwkJCQkvKiBFcnJvciBjb2RlICovCisJaW50IHJlcXVlc3RfdHJhbnNmZXI7CQkJLyogQnl0ZXMgdG8gdHJhbnNmZXIgKi8KKwlpbnQgYWN0dWFsbHlfdHJhbnNmZXJyZWQ7CQkvKiBCeXRlcyBhY3R1YWxseSB0cmFuc2ZlcnJlZCAqLworCWludCBidWZmZXJfc2l6ZTsJCQkvKiBTaXplIG9mIG91ciBkYXRhIGJ1ZmZlciAqLworCWludCBiX2NvdW50OwkJCQkvKiBNaXNzaW5nL0F2YWlsYWJsZSBkYXRhIG9uIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCXN0cnVjdCByZXF1ZXN0ICpycTsJCQkvKiBUaGUgY29ycmVzcG9uZGluZyByZXF1ZXN0ICovCisJdTggKmJ1ZmZlcjsJCQkJLyogRGF0YSBidWZmZXIgKi8KKwl1OCAqY3VycmVudF9wb3NpdGlvbjsJCQkvKiBQb2ludGVyIGludG8gdGhlIGFib3ZlIGJ1ZmZlciAqLworCXZvaWQgKCpjYWxsYmFjaykgKGlkZV9kcml2ZV90ICopOwkvKiBDYWxsZWQgd2hlbiB0aGlzIHBhY2tldCBjb21tYW5kIGlzIGNvbXBsZXRlZCAqLworCXU4IHBjX2J1ZmZlcltJREVGTE9QUFlfUENfQlVGRkVSX1NJWkVdOwkvKiBUZW1wb3JhcnkgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkvKiBTdGF0dXMvQWN0aW9uIGJpdCBmbGFnczogbG9uZyBmb3Igc2V0X2JpdCAqLworfSBpZGVmbG9wcHlfcGNfdDsKKworLyoKKyAqCVBhY2tldCBjb21tYW5kIGZsYWcgYml0cy4KKyAqLworI2RlZmluZQlQQ19BQk9SVAkJCTAJLyogU2V0IHdoZW4gYW4gZXJyb3IgaXMgY29uc2lkZXJlZCBub3JtYWwgLSBXZSB3b24ndCByZXRyeSAqLworI2RlZmluZSBQQ19ETUFfUkVDT01NRU5ERUQJCTIJLyogMSB3aGVuIHdlIHByZWZlciB0byB1c2UgRE1BIGlmIHBvc3NpYmxlICovCisjZGVmaW5lCVBDX0RNQV9JTl9QUk9HUkVTUwkJMwkvKiAxIHdoaWxlIERNQSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlQQ19ETUFfRVJST1IJCQk0CS8qIDEgd2hlbiBlbmNvdW50ZXJlZCBwcm9ibGVtIGR1cmluZyBETUEgKi8KKyNkZWZpbmUJUENfV1JJVElORwkJCTUJLyogRGF0YSBkaXJlY3Rpb24gKi8KKworI2RlZmluZQlQQ19TVVBQUkVTU19FUlJPUgkJNgkvKiBTdXBwcmVzcyBlcnJvciByZXBvcnRpbmcgKi8KKworLyoKKyAqCVJlbW92YWJsZSBCbG9jayBBY2Nlc3MgQ2FwYWJpbGl0aWVzIFBhZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXBhZ2VfY29kZQk6NjsJLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MWIgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDFfNgk6MTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlwcwkJOjE7CS8qIFNob3VsZCBiZSAwICovCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZAlwcwkJOjE7CS8qIFNob3VsZCBiZSAwICovCisJdW5zaWduZWQJcmVzZXJ2ZWQxXzYJOjE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcGFnZV9jb2RlCTo2OwkvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgxYiAqLworI2Vsc2UKKyNlcnJvciAiQml0ZmllbGQgZW5kaWFubmVzcyBub3QgZGVmaW5lZCEgQ2hlY2sgeW91ciBieXRlb3JkZXIuaCIKKyNlbmRpZgorCXU4CQlwYWdlX2xlbmd0aDsJCS8qIFBhZ2UgTGVuZ3RoIC0gU2hvdWxkIGJlIDB4YSAqLworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXJlc2VydmVkMgk6NjsKKwl1bnNpZ25lZAlzcmZwCQk6MTsJLyogU3VwcG9ydHMgcmVwb3J0aW5nIHByb2dyZXNzIG9mIGZvcm1hdCAqLworCXVuc2lnbmVkCXNmbHAJCToxOwkvKiBTeXN0ZW0gZmxvcHB5IHR5cGUgZGV2aWNlICovCisJdW5zaWduZWQJdGx1bgkJOjM7CS8qIFRvdGFsIGxvZ2ljYWwgdW5pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDMJOjM7CisJdW5zaWduZWQJc21sCQk6MTsJLyogU2luZ2xlIC8gTXVsdGlwbGUgbHVuIHN1cHBvcnRlZCAqLworCXVuc2lnbmVkCW5jZAkJOjE7CS8qIE5vbiBjZCBvcHRpY2FsIGRldmljZSAqLworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQJc2ZscAkJOjE7CS8qIFN5c3RlbSBmbG9wcHkgdHlwZSBkZXZpY2UgKi8KKwl1bnNpZ25lZAlzcmZwCQk6MTsJLyogU3VwcG9ydHMgcmVwb3J0aW5nIHByb2dyZXNzIG9mIGZvcm1hdCAqLworCXVuc2lnbmVkCXJlc2VydmVkMgk6NjsKKwl1bnNpZ25lZAluY2QJCToxOwkvKiBOb24gY2Qgb3B0aWNhbCBkZXZpY2UgKi8KKwl1bnNpZ25lZAlzbWwJCToxOwkvKiBTaW5nbGUgLyBNdWx0aXBsZSBsdW4gc3VwcG9ydGVkICovCisJdW5zaWduZWQJcmVzZXJ2ZWQzCTozOworCXVuc2lnbmVkCXRsdW4JCTozOwkvKiBUb3RhbCBsb2dpY2FsIHVuaXRzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlICovCisjZWxzZQorI2Vycm9yICJCaXRmaWVsZCBlbmRpYW5uZXNzIG5vdCBkZWZpbmVkISBDaGVjayB5b3VyIGJ5dGVvcmRlci5oIgorI2VuZGlmCisJdTgJCXJlc2VydmVkWzhdOworfSBpZGVmbG9wcHlfY2FwYWJpbGl0aWVzX3BhZ2VfdDsKKworLyoKKyAqCUZsZXhpYmxlIGRpc2sgcGFnZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXBhZ2VfY29kZQk6NjsJLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4NSAqLworCXVuc2lnbmVkCXJlc2VydmVkMV82CToxOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXBzCQk6MTsJLyogVGhlIGRldmljZSBpcyBjYXBhYmxlIG9mIHNhdmluZyB0aGUgcGFnZSAqLworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQJcHMJCToxOwkvKiBUaGUgZGV2aWNlIGlzIGNhcGFibGUgb2Ygc2F2aW5nIHRoZSBwYWdlICovCisJdW5zaWduZWQJcmVzZXJ2ZWQxXzYJOjE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcGFnZV9jb2RlCTo2OwkvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHg1ICovCisjZWxzZQorI2Vycm9yICJCaXRmaWVsZCBlbmRpYW5uZXNzIG5vdCBkZWZpbmVkISBDaGVjayB5b3VyIGJ5dGVvcmRlci5oIgorI2VuZGlmCisJdTgJCXBhZ2VfbGVuZ3RoOwkJLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMHgxZSAqLworCXUxNgkJdHJhbnNmZXJfcmF0ZTsJCS8qIEluIGtpbG9iaXRzIHBlciBzZWNvbmQgKi8KKwl1OAkJaGVhZHMsIHNlY3RvcnM7CQkvKiBOdW1iZXIgb2YgaGVhZHMsIE51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjayAqLworCXUxNgkJc2VjdG9yX3NpemU7CQkvKiBCeWVzIHBlciBzZWN0b3IgKi8KKwl1MTYJCWN5bHM7CQkJLyogTnVtYmVyIG9mIGN5bGluZGVycyAqLworCXU4CQlyZXNlcnZlZDEwWzEwXTsKKwl1OAkJbW90b3JfZGVsYXk7CQkvKiBNb3RvciBvZmYgZGVsYXkgKi8KKwl1OAkJcmVzZXJ2ZWQyMVs3XTsKKwl1MTYJCXJwbTsJCQkvKiBSb3RhdGlvbnMgcGVyIG1pbnV0ZSAqLworCXU4CQlyZXNlcnZlZDMwWzJdOworfSBpZGVmbG9wcHlfZmxleGlibGVfZGlza19wYWdlX3Q7CisgCisvKgorICoJRm9ybWF0IGNhcGFjaXR5CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OAkJcmVzZXJ2ZWRbM107CisJdTgJCWxlbmd0aDsJCQkvKiBMZW5ndGggb2YgdGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBpbiBieXRlcyAqLworfSBpZGVmbG9wcHlfY2FwYWNpdHlfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIJCWJsb2NrczsJCQkvKiBOdW1iZXIgb2YgYmxvY2tzICovCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQJZGMJCToyOwkvKiBEZXNjcmlwdG9yIENvZGUgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZAk6NjsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXJlc2VydmVkCTo2OworCXVuc2lnbmVkCWRjCQk6MjsJLyogRGVzY3JpcHRvciBDb2RlICovCisjZWxzZQorI2Vycm9yICJCaXRmaWVsZCBlbmRpYW5uZXNzIG5vdCBkZWZpbmVkISBDaGVjayB5b3VyIGJ5dGVvcmRlci5oIgorI2VuZGlmCisJdTgJCWxlbmd0aF9tc2I7CQkvKiBCbG9jayBMZW5ndGggKE1TQikqLworCXUxNgkJbGVuZ3RoOwkJCS8qIEJsb2NrIExlbmd0aCAqLworfSBpZGVmbG9wcHlfY2FwYWNpdHlfZGVzY3JpcHRvcl90OworCisjZGVmaW5lIENBUEFDSVRZX0lOVkFMSUQJMHgwMAorI2RlZmluZSBDQVBBQ0lUWV9VTkZPUk1BVFRFRAkweDAxCisjZGVmaW5lIENBUEFDSVRZX0NVUlJFTlQJMHgwMgorI2RlZmluZSBDQVBBQ0lUWV9OT19DQVJUUklER0UJMHgwMworCisvKgorICoJTW9zdCBvZiBvdXIgZ2xvYmFsIGRhdGEgd2hpY2ggd2UgbmVlZCB0byBzYXZlIGV2ZW4gYXMgd2UgbGVhdmUgdGhlCisgKglkcml2ZXIgZHVlIHRvIGFuIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50IGlzIHN0b3JlZCBpbiBhIHZhcmlhYmxlCisgKglvZiB0eXBlIGlkZWZsb3BweV9mbG9wcHlfdCwgZGVmaW5lZCBiZWxvdy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogeworCWlkZV9kcml2ZV90CSpkcml2ZTsKKwlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKKwlzdHJ1Y3Qga3JlZglrcmVmOworCisJLyogQ3VycmVudCBwYWNrZXQgY29tbWFuZCAqLworCWlkZWZsb3BweV9wY190ICpwYzsKKwkvKiBMYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCAqLworCWlkZWZsb3BweV9wY190ICpmYWlsZWRfcGM7CisJLyogUGFja2V0IGNvbW1hbmQgc3RhY2sgKi8KKwlpZGVmbG9wcHlfcGNfdCBwY19zdGFja1tJREVGTE9QUFlfUENfU1RBQ0tdOworCS8qIE5leHQgZnJlZSBwYWNrZXQgY29tbWFuZCBzdG9yYWdlIHNwYWNlICovCisJaW50IHBjX3N0YWNrX2luZGV4OworCXN0cnVjdCByZXF1ZXN0IHJxX3N0YWNrW0lERUZMT1BQWV9QQ19TVEFDS107CisJLyogV2UgaW1wbGVtZW50IGEgY2lyY3VsYXIgYXJyYXkgKi8KKwlpbnQgcnFfc3RhY2tfaW5kZXg7CisKKwkvKgorCSAqCUxhc3QgZXJyb3IgaW5mb3JtYXRpb24KKwkgKi8KKwl1OCBzZW5zZV9rZXksIGFzYywgYXNjcTsKKwkvKiBkZWxheSB0aGlzIGxvbmcgYmVmb3JlIHNlbmRpbmcgcGFja2V0IGNvbW1hbmQgKi8KKwl1OCB0aWNrczsKKwlpbnQgcHJvZ3Jlc3NfaW5kaWNhdGlvbjsKKworCS8qCisJICoJRGV2aWNlIGluZm9ybWF0aW9uCisJICovCisJLyogQ3VycmVudCBmb3JtYXQgKi8KKwlpbnQgYmxvY2tzLCBibG9ja19zaXplLCBic19mYWN0b3I7CisJLyogTGFzdCBmb3JtYXQgY2FwYWNpdHkgKi8KKwlpZGVmbG9wcHlfY2FwYWNpdHlfZGVzY3JpcHRvcl90IGNhcGFjaXR5OworCS8qIENvcHkgb2YgdGhlIGZsZXhpYmxlIGRpc2sgcGFnZSAqLworCWlkZWZsb3BweV9mbGV4aWJsZV9kaXNrX3BhZ2VfdCBmbGV4aWJsZV9kaXNrX3BhZ2U7CisJLyogV3JpdGUgcHJvdGVjdCAqLworCWludCB3cDsKKwkvKiBTdXBwb3J0cyBmb3JtYXQgcHJvZ3Jlc3MgcmVwb3J0ICovCisJaW50IHNyZnA7CisJLyogU3RhdHVzL0FjdGlvbiBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9IGlkZWZsb3BweV9mbG9wcHlfdDsKKworI2RlZmluZSBJREVGTE9QUFlfVElDS1NfREVMQVkJMwkvKiBkZWZhdWx0IGRlbGF5IGZvciBaSVAgMTAwICovCisKKy8qCisgKglGbG9wcHkgZmxhZyBiaXRzIHZhbHVlcy4KKyAqLworI2RlZmluZSBJREVGTE9QUFlfRFJRX0lOVEVSUlVQVAkJMAkvKiBEUlEgaW50ZXJydXB0IGRldmljZSAqLworI2RlZmluZSBJREVGTE9QUFlfTUVESUFfQ0hBTkdFRAkJMQkvKiBNZWRpYSBtYXkgaGF2ZSBjaGFuZ2VkICovCisjZGVmaW5lIElERUZMT1BQWV9VU0VfUkVBRDEyCQkyCS8qIFVzZSBSRUFEMTIvV1JJVEUxMiBvciBSRUFEMTAvV1JJVEUxMCAqLworI2RlZmluZQlJREVGTE9QUFlfRk9STUFUX0lOX1BST0dSRVNTCTMJLyogRm9ybWF0IGluIHByb2dyZXNzICovCisjZGVmaW5lIElERUZMT1BQWV9DTElLX0RSSVZFCSAgICAgICAgNCAgICAgICAvKiBBdm9pZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkIGluIENsaWsgZHJpdmUgKi8KKyNkZWZpbmUgSURFRkxPUFBZX1pJUF9EUklWRQkJNQkvKiBSZXF1aXJlcyBCSCBhbGdvcml0aG0gZm9yIHBhY2tldHMgKi8KKworLyoKKyAqCUFUQVBJIGZsb3BweSBkcml2ZSBwYWNrZXQgY29tbWFuZHMKKyAqLworI2RlZmluZSBJREVGTE9QUFlfRk9STUFUX1VOSVRfQ01ECTB4MDQKKyNkZWZpbmUgSURFRkxPUFBZX0lOUVVJUllfQ01ECQkweDEyCisjZGVmaW5lIElERUZMT1BQWV9NT0RFX1NFTEVDVF9DTUQJMHg1NQorI2RlZmluZSBJREVGTE9QUFlfTU9ERV9TRU5TRV9DTUQJMHg1YQorI2RlZmluZSBJREVGTE9QUFlfUkVBRDEwX0NNRAkJMHgyOAorI2RlZmluZSBJREVGTE9QUFlfUkVBRDEyX0NNRAkJMHhhOAorI2RlZmluZSBJREVGTE9QUFlfUkVBRF9DQVBBQ0lUWV9DTUQJMHgyMworI2RlZmluZSBJREVGTE9QUFlfUkVRVUVTVF9TRU5TRV9DTUQJMHgwMworI2RlZmluZSBJREVGTE9QUFlfUFJFVkVOVF9SRU1PVkFMX0NNRAkweDFlCisjZGVmaW5lIElERUZMT1BQWV9TRUVLX0NNRAkJMHgyYgorI2RlZmluZSBJREVGTE9QUFlfU1RBUlRfU1RPUF9DTUQJMHgxYgorI2RlZmluZSBJREVGTE9QUFlfVEVTVF9VTklUX1JFQURZX0NNRAkweDAwCisjZGVmaW5lIElERUZMT1BQWV9WRVJJRllfQ01ECQkweDJmCisjZGVmaW5lIElERUZMT1BQWV9XUklURTEwX0NNRAkJMHgyYQorI2RlZmluZSBJREVGTE9QUFlfV1JJVEUxMl9DTUQJCTB4YWEKKyNkZWZpbmUgSURFRkxPUFBZX1dSSVRFX1ZFUklGWV9DTUQJMHgyZQorCisvKgorICoJRGVmaW5lcyBmb3IgdGhlIG1vZGUgc2Vuc2UgY29tbWFuZAorICovCisjZGVmaW5lIE1PREVfU0VOU0VfQ1VSUkVOVAkJMHgwMAorI2RlZmluZSBNT0RFX1NFTlNFX0NIQU5HRUFCTEUJCTB4MDEKKyNkZWZpbmUgTU9ERV9TRU5TRV9ERUZBVUxUCQkweDAyIAorI2RlZmluZSBNT0RFX1NFTlNFX1NBVkVECQkweDAzCisKKy8qCisgKglJT0NUTHMgdXNlZCBpbiBsb3ctbGV2ZWwgZm9ybWF0dGluZy4KKyAqLworCisjZGVmaW5lCUlERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1VQUE9SVEVECTB4NDYwMAorI2RlZmluZQlJREVGTE9QUFlfSU9DVExfRk9STUFUX0dFVF9DQVBBQ0lUWQkweDQ2MDEKKyNkZWZpbmUJSURFRkxPUFBZX0lPQ1RMX0ZPUk1BVF9TVEFSVAkJMHg0NjAyCisjZGVmaW5lIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX1BST0dSRVNTCTB4NDYwMworCisjaWYgMAorLyoKKyAqCVNwZWNpYWwgcmVxdWVzdHMgZm9yIG91ciBibG9jayBkZXZpY2Ugc3RyYXRlZ3kgcm91dGluZS4KKyAqLworI2RlZmluZQlJREVGTE9QUFlfRklSU1RfUlEJOTAKKworLyoKKyAqIAlJREVGTE9QUFlfUENfUlEgaXMgdXNlZCB0byBxdWV1ZSBhIHBhY2tldCBjb21tYW5kIGluIHRoZSByZXF1ZXN0IHF1ZXVlLgorICovCisjZGVmaW5lCUlERUZMT1BQWV9QQ19SUQkJOTAKKworI2RlZmluZSBJREVGTE9QUFlfTEFTVF9SUQk5MAorCisvKgorICoJQSBtYWNybyB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBhIGdpdmVuIHJlcXVlc3QgY29tbWFuZAorICoJb3JpZ2luYXRlZCBpbiB0aGUgZHJpdmVyIG9yIGluIHRoZSBidWZmZXIgY2FjaGUgbGF5ZXIuCisgKi8KKyNkZWZpbmUgSURFRkxPUFBZX1JRX0NNRChjbWQpIAkoKGNtZCA+PSBJREVGTE9QUFlfRklSU1RfUlEpICYmIChjbWQgPD0gSURFRkxPUFBZX0xBU1RfUlEpKQorCisjZW5kaWYKKworLyoKKyAqCUVycm9yIGNvZGVzIHdoaWNoIGFyZSByZXR1cm5lZCBpbiBycS0+ZXJyb3JzIHRvIHRoZSBoaWdoZXIgcGFydAorICoJb2YgdGhlIGRyaXZlci4KKyAqLworI2RlZmluZQlJREVGTE9QUFlfRVJST1JfR0VORVJBTAkJMTAxCisKKy8qCisgKglUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gZm9ybWF0IHRoZSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gd29yZCBvZgorICoJdGhlIEFUQVBJIElERU5USUZZIERFVklDRSBjb21tYW5kLgorICovCitzdHJ1Y3QgaWRlZmxvcHB5X2lkX2djdyB7CQorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkIHBhY2tldF9zaXplCQk6MjsJLyogUGFja2V0IFNpemUgKi8KKwl1bnNpZ25lZCByZXNlcnZlZDIzNAkJOjM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgZHJxX3R5cGUJCToyOwkvKiBDb21tYW5kIHBhY2tldCBEUlEgdHlwZSAqLworCXVuc2lnbmVkIHJlbW92YWJsZQkJOjE7CS8qIFJlbW92YWJsZSBtZWRpYSAqLworCXVuc2lnbmVkIGRldmljZV90eXBlCQk6NTsJLyogRGV2aWNlIHR5cGUgKi8KKwl1bnNpZ25lZCByZXNlcnZlZDEzCQk6MTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBwcm90b2NvbAkJOjI7CS8qIFByb3RvY29sIHR5cGUgKi8KKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkIHByb3RvY29sCQk6MjsJLyogUHJvdG9jb2wgdHlwZSAqLworCXVuc2lnbmVkIHJlc2VydmVkMTMJCToxOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkIGRldmljZV90eXBlCQk6NTsJLyogRGV2aWNlIHR5cGUgKi8KKwl1bnNpZ25lZCByZW1vdmFibGUJCToxOwkvKiBSZW1vdmFibGUgbWVkaWEgKi8KKwl1bnNpZ25lZCBkcnFfdHlwZQkJOjI7CS8qIENvbW1hbmQgcGFja2V0IERSUSB0eXBlICovCisJdW5zaWduZWQgcmVzZXJ2ZWQyMzQJCTozOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkIHBhY2tldF9zaXplCQk6MjsJLyogUGFja2V0IFNpemUgKi8KKyNlbHNlCisjZXJyb3IgIkJpdGZpZWxkIGVuZGlhbm5lc3Mgbm90IGRlZmluZWQhIENoZWNrIHlvdXIgYnl0ZW9yZGVyLmgiCisjZW5kaWYKK307CisKKy8qCisgKglJTlFVSVJZIHBhY2tldCBjb21tYW5kIC0gRGF0YSBGb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCWRldmljZV90eXBlCTo1OwkvKiBQZXJpcGhlcmFsIERldmljZSBUeXBlICovCisJdW5zaWduZWQJcmVzZXJ2ZWQwXzc2NQk6MzsJLyogUGVyaXBoZXJhbCBRdWFsaWZpZXIgLSBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXJlc2VydmVkMV82dDAJOjc7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcm1iCQk6MTsJLyogUmVtb3ZhYmxlIE1lZGl1bSBCaXQgKi8KKwl1bnNpZ25lZAlhbnNpX3ZlcnNpb24JOjM7CS8qIEFOU0kgVmVyc2lvbiAqLworCXVuc2lnbmVkCWVjbWFfdmVyc2lvbgk6MzsJLyogRUNNQSBWZXJzaW9uICovCisJdW5zaWduZWQJaXNvX3ZlcnNpb24JOjI7CS8qIElTTyBWZXJzaW9uICovCisJdW5zaWduZWQJcmVzcG9uc2VfZm9ybWF0IDo0OwkvKiBSZXNwb25zZSBEYXRhIEZvcm1hdCAqLworCXVuc2lnbmVkCXJlc2VydmVkM180NQk6MjsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNgk6MTsJLyogVHJtSU9QIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNwk6MTsJLyogQUVOQyAtIFJlc2VydmVkICovCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZAlyZXNlcnZlZDBfNzY1CTozOwkvKiBQZXJpcGhlcmFsIFF1YWxpZmllciAtIFJlc2VydmVkICovCisJdW5zaWduZWQJZGV2aWNlX3R5cGUJOjU7CS8qIFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUgKi8KKwl1bnNpZ25lZAlybWIJCToxOwkvKiBSZW1vdmFibGUgTWVkaXVtIEJpdCAqLworCXVuc2lnbmVkCXJlc2VydmVkMV82dDAJOjc7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJaXNvX3ZlcnNpb24JOjI7CS8qIElTTyBWZXJzaW9uICovCisJdW5zaWduZWQJZWNtYV92ZXJzaW9uCTozOwkvKiBFQ01BIFZlcnNpb24gKi8KKwl1bnNpZ25lZAlhbnNpX3ZlcnNpb24JOjM7CS8qIEFOU0kgVmVyc2lvbiAqLworCXVuc2lnbmVkCXJlc2VydmVkM183CToxOwkvKiBBRU5DIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNgk6MTsJLyogVHJtSU9QIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNDUJOjI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVzcG9uc2VfZm9ybWF0IDo0OwkvKiBSZXNwb25zZSBEYXRhIEZvcm1hdCAqLworI2Vsc2UKKyNlcnJvciAiQml0ZmllbGQgZW5kaWFubmVzcyBub3QgZGVmaW5lZCEgQ2hlY2sgeW91ciBieXRlb3JkZXIuaCIKKyNlbmRpZgorCXU4CQlhZGRpdGlvbmFsX2xlbmd0aDsJLyogQWRkaXRpb25hbCBMZW5ndGggKHRvdGFsX2xlbmd0aC00KSAqLworCXU4CQlyc3Y1LCByc3Y2LCByc3Y3OwkvKiBSZXNlcnZlZCAqLworCXU4CQl2ZW5kb3JfaWRbOF07CQkvKiBWZW5kb3IgSWRlbnRpZmljYXRpb24gKi8KKwl1OAkJcHJvZHVjdF9pZFsxNl07CQkvKiBQcm9kdWN0IElkZW50aWZpY2F0aW9uICovCisJdTgJCXJldmlzaW9uX2xldmVsWzRdOwkvKiBSZXZpc2lvbiBMZXZlbCAqLworCXU4CQl2ZW5kb3Jfc3BlY2lmaWNbMjBdOwkvKiBWZW5kb3IgU3BlY2lmaWMgLSBPcHRpb25hbCAqLworCXU4CQlyZXNlcnZlZDU2dDk1WzQwXTsJLyogUmVzZXJ2ZWQgLSBPcHRpb25hbCAqLworCQkJCQkJLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgcmV0dXJuZWQgKi8KK30gaWRlZmxvcHB5X2lucXVpcnlfcmVzdWx0X3Q7CisKKy8qCisgKglSRVFVRVNUIFNFTlNFIHBhY2tldCBjb21tYW5kIHJlc3VsdCAtIERhdGEgRm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQJZXJyb3JfY29kZQk6NzsJLyogQ3VycmVudCBlcnJvciAoMHg3MCkgKi8KKwl1bnNpZ25lZAl2YWxpZAkJOjE7CS8qIFRoZSBpbmZvcm1hdGlvbiBmaWVsZCBjb25mb3JtcyB0byBTRkYtODA3MGkgKi8KKwl1OAkJcmVzZXJ2ZWQxCTo4OwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXNlbnNlX2tleQk6NDsJLyogU2Vuc2UgS2V5ICovCisJdW5zaWduZWQJcmVzZXJ2ZWQyXzQJOjE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJaWxpCQk6MTsJLyogSW5jb3JyZWN0IExlbmd0aCBJbmRpY2F0b3IgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDJfNjcJOjI7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZAl2YWxpZAkJOjE7CS8qIFRoZSBpbmZvcm1hdGlvbiBmaWVsZCBjb25mb3JtcyB0byBTRkYtODA3MGkgKi8KKwl1bnNpZ25lZAllcnJvcl9jb2RlCTo3OwkvKiBDdXJyZW50IGVycm9yICgweDcwKSAqLworCXU4CQlyZXNlcnZlZDEJOjg7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVzZXJ2ZWQyXzY3CToyOworCXVuc2lnbmVkCWlsaQkJOjE7CS8qIEluY29ycmVjdCBMZW5ndGggSW5kaWNhdG9yICovCisJdW5zaWduZWQJcmVzZXJ2ZWQyXzQJOjE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJc2Vuc2Vfa2V5CTo0OwkvKiBTZW5zZSBLZXkgKi8KKyNlbHNlCisjZXJyb3IgIkJpdGZpZWxkIGVuZGlhbm5lc3Mgbm90IGRlZmluZWQhIENoZWNrIHlvdXIgYnl0ZW9yZGVyLmgiCisjZW5kaWYKKwl1MzIJCWluZm9ybWF0aW9uIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1OAkJYXNsOwkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoIChuLTcpICovCisJdTMyCQljb21tYW5kX3NwZWNpZmljOwkvKiBBZGRpdGlvbmFsIGNvbW1hbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwl1OAkJYXNjOwkJCS8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSAqLworCXU4CQlhc2NxOwkJCS8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSBRdWFsaWZpZXIgKi8KKwl1OAkJcmVwbGFjZWFibGVfdW5pdF9jb2RlOwkvKiBGaWVsZCBSZXBsYWNlYWJsZSBVbml0IENvZGUgKi8KKwl1OAkJc2tzdlszXTsKKwl1OAkJcGFkWzJdOwkJCS8qIFBhZGRpbmcgdG8gMjAgYnl0ZXMgKi8KK30gaWRlZmxvcHB5X3JlcXVlc3Rfc2Vuc2VfcmVzdWx0X3Q7CisKKy8qCisgKglQYWdlcyBvZiB0aGUgU0VMRUNUIFNFTlNFIC8gTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZHMuCisgKi8KKyNkZWZpbmUJSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFCTB4MWIKKyNkZWZpbmUgSURFRkxPUFBZX0ZMRVhJQkxFX0RJU0tfUEFHRQkweDA1CisKKy8qCisgKglNb2RlIFBhcmFtZXRlciBIZWFkZXIgZm9yIHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYJCW1vZGVfZGF0YV9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEgdHJhbnNmZXIgKi8KKwl1OAkJbWVkaXVtX3R5cGU7CQkvKiBNZWRpdW0gVHlwZSAqLworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXJlc2VydmVkMwk6NzsKKwl1bnNpZ25lZAl3cAkJOjE7CS8qIFdyaXRlIHByb3RlY3QgKi8KKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkCXdwCQk6MTsJLyogV3JpdGUgcHJvdGVjdCAqLworCXVuc2lnbmVkCXJlc2VydmVkMwk6NzsKKyNlbHNlCisjZXJyb3IgIkJpdGZpZWxkIGVuZGlhbm5lc3Mgbm90IGRlZmluZWQhIENoZWNrIHlvdXIgYnl0ZW9yZGVyLmgiCisjZW5kaWYKKwl1OAkJcmVzZXJ2ZWRbNF07Cit9IGlkZWZsb3BweV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdDsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaWRlZmxvcHB5X3JlZl9zZW0pOworCisjZGVmaW5lIHRvX2lkZV9mbG9wcHkob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgaWRlX2Zsb3BweV9vYmosIGtyZWYpCisKKyNkZWZpbmUgaWRlX2Zsb3BweV9nKGRpc2spIFwKKwljb250YWluZXJfb2YoKGRpc2spLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBpZGVfZmxvcHB5X29iaiwgZHJpdmVyKQorCitzdGF0aWMgc3RydWN0IGlkZV9mbG9wcHlfb2JqICppZGVfZmxvcHB5X2dldChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IE5VTEw7CisKKwlkb3duKCZpZGVmbG9wcHlfcmVmX3NlbSk7CisJZmxvcHB5ID0gaWRlX2Zsb3BweV9nKGRpc2spOworCWlmIChmbG9wcHkpCisJCWtyZWZfZ2V0KCZmbG9wcHktPmtyZWYpOworCXVwKCZpZGVmbG9wcHlfcmVmX3NlbSk7CisJcmV0dXJuIGZsb3BweTsKK30KKworc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9yZWxlYXNlKHN0cnVjdCBrcmVmICopOworCitzdGF0aWMgdm9pZCBpZGVfZmxvcHB5X3B1dChzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSkKK3sKKwlkb3duKCZpZGVmbG9wcHlfcmVmX3NlbSk7CisJa3JlZl9wdXQoJmZsb3BweS0+a3JlZiwgaWRlX2Zsb3BweV9yZWxlYXNlKTsKKwl1cCgmaWRlZmxvcHB5X3JlZl9zZW0pOworfQorCisvKgorICoJVG9vIGJhZC4gVGhlIGRyaXZlIHdhbnRzIHRvIHNlbmQgdXMgZGF0YSB3aGljaCB3ZSBhcmUgbm90IHJlYWR5IHRvIGFjY2VwdC4KKyAqCUp1c3QgdGhyb3cgaXQgYXdheS4KKyAqLworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2Rpc2NhcmRfZGF0YSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgYmNvdW50KQoreworCXdoaWxlIChiY291bnQtLSkKKwkJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIoSURFX0RBVEFfUkVHKTsKK30KKworI2lmIElERUZMT1BQWV9ERUJVR19CVUdTCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfd3JpdGVfemVyb3MgKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IGJjb3VudCkKK3sKKwl3aGlsZSAoYmNvdW50LS0pCisJCUhXSUYoZHJpdmUpLT5PVVRCKDAsIElERV9EQVRBX1JFRyk7Cit9CisjZW5kaWYgLyogSURFRkxPUFBZX0RFQlVHX0JVR1MgKi8KKworCisvKgorICoJaWRlZmxvcHB5X2RvX2VuZF9yZXF1ZXN0IGlzIHVzZWQgdG8gZmluaXNoIHNlcnZpY2luZyBhIHJlcXVlc3QuCisgKgorICoJRm9yIHJlYWQvd3JpdGUgcmVxdWVzdHMsIHdlIHdpbGwgY2FsbCBpZGVfZW5kX3JlcXVlc3QgdG8gcGFzcyB0byB0aGUKKyAqCW5leHQgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5zZWNzKQoreworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpbnQgZXJyb3I7CisKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJSZWFjaGVkIGlkZWZsb3BweV9lbmRfcmVxdWVzdFxuIik7CisKKwlzd2l0Y2ggKHVwdG9kYXRlKSB7CisJCWNhc2UgMDogZXJyb3IgPSBJREVGTE9QUFlfRVJST1JfR0VORVJBTDsgYnJlYWs7CisJCWNhc2UgMTogZXJyb3IgPSAwOyBicmVhazsKKwkJZGVmYXVsdDogZXJyb3IgPSB1cHRvZGF0ZTsKKwl9CisJaWYgKGVycm9yKQorCQlmbG9wcHktPmZhaWxlZF9wYyA9IE5VTEw7CisJLyogV2h5IGRvZXMgdGhpcyBoYXBwZW4/ICovCisJaWYgKCFycSkKKwkJcmV0dXJuIDA7CisJaWYgKCEocnEtPmZsYWdzICYgUkVRX1NQRUNJQUwpKSB7IC8vaWYgKCFJREVGTE9QUFlfUlFfQ01EIChycS0+Y21kKSkgeworCQkvKiBvdXIgcmVhbCBsb2NhbCBlbmQgcmVxdWVzdCBmdW5jdGlvbiAqLworCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIHVwdG9kYXRlLCBuc2Vjcyk7CisJCXJldHVybiAwOworCX0KKwlycS0+ZXJyb3JzID0gZXJyb3I7CisJLyogZml4bWU6IG5lZWQgdG8gbW92ZSB0aGlzIGxvY2FsIGFsc28gKi8KKwlpZGVfZW5kX2RyaXZlX2NtZChkcml2ZSwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlkZWZsb3BweV9pbnB1dF9idWZmZXJzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZWZsb3BweV9wY190ICpwYywgdW5zaWduZWQgaW50IGJjb3VudCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBwYy0+cnE7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IGJpbyAqYmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqZGF0YTsKKwlpbnQgY291bnQsIGksIGRvbmUgPSAwOworCisJcnFfZm9yX2VhY2hfYmlvKGJpbywgcnEpIHsKKwkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJCQlpZiAoIWJjb3VudCkKKwkJCQlicmVhazsKKworCQkJY291bnQgPSBtaW4oYnZlYy0+YnZfbGVuLCBiY291bnQpOworCisJCQlkYXRhID0gYnZlY19rbWFwX2lycShidmVjLCAmZmxhZ3MpOworCQkJZHJpdmUtPmh3aWYtPmF0YXBpX2lucHV0X2J5dGVzKGRyaXZlLCBkYXRhLCBjb3VudCk7CisJCQlidmVjX2t1bm1hcF9pcnEoZGF0YSwgJmZsYWdzKTsKKworCQkJYmNvdW50IC09IGNvdW50OworCQkJcGMtPmJfY291bnQgKz0gY291bnQ7CisJCQlkb25lICs9IGNvdW50OworCQl9CisJfQorCisJaWRlZmxvcHB5X2RvX2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCBkb25lID4+IDkpOworCisJaWYgKGJjb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsZWZ0b3ZlciBkYXRhIGluIGlkZWZsb3BweV9pbnB1dF9idWZmZXJzLCBiY291bnQgPT0gJWRcbiIsIGRyaXZlLT5uYW1lLCBiY291bnQpOworCQlpZGVmbG9wcHlfZGlzY2FyZF9kYXRhKGRyaXZlLCBiY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X291dHB1dF9idWZmZXJzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZWZsb3BweV9wY190ICpwYywgdW5zaWduZWQgaW50IGJjb3VudCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBwYy0+cnE7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCBpLCBkb25lID0gMDsKKwljaGFyICpkYXRhOworCisJcnFfZm9yX2VhY2hfYmlvKGJpbywgcnEpIHsKKwkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJCQlpZiAoIWJjb3VudCkKKwkJCQlicmVhazsKKworCQkJY291bnQgPSBtaW4oYnZlYy0+YnZfbGVuLCBiY291bnQpOworCisJCQlkYXRhID0gYnZlY19rbWFwX2lycShidmVjLCAmZmxhZ3MpOworCQkJZHJpdmUtPmh3aWYtPmF0YXBpX291dHB1dF9ieXRlcyhkcml2ZSwgZGF0YSwgY291bnQpOworCQkJYnZlY19rdW5tYXBfaXJxKGRhdGEsICZmbGFncyk7CisKKwkJCWJjb3VudCAtPSBjb3VudDsKKwkJCXBjLT5iX2NvdW50ICs9IGNvdW50OworCQkJZG9uZSArPSBjb3VudDsKKwkJfQorCX0KKworCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMSwgZG9uZSA+PiA5KTsKKworCWlmIChiY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbGVmdG92ZXIgZGF0YSBpbiBpZGVmbG9wcHlfb3V0cHV0X2J1ZmZlcnMsIGJjb3VudCA9PSAlZFxuIiwgZHJpdmUtPm5hbWUsIGJjb3VudCk7CisJCWlkZWZsb3BweV93cml0ZV96ZXJvcyhkcml2ZSwgYmNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlkZWZsb3BweV91cGRhdGVfYnVmZmVycyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVmbG9wcHlfcGNfdCAqcGMpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gcGMtPnJxOworCXN0cnVjdCBiaW8gKmJpbyA9IHJxLT5iaW87CisKKwl3aGlsZSAoKGJpbyA9IHJxLT5iaW8pICE9IE5VTEwpCisJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMSwgMCk7Cit9CisKKy8qCisgKglpZGVmbG9wcHlfcXVldWVfcGNfaGVhZCBnZW5lcmF0ZXMgYSBuZXcgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCBpbiBmcm9udAorICoJb2YgdGhlIHJlcXVlc3QgcXVldWUsIGJlZm9yZSB0aGUgY3VycmVudCByZXF1ZXN0LCBzbyB0aGF0IGl0IHdpbGwgYmUKKyAqCXByb2Nlc3NlZCBpbW1lZGlhdGVseSwgb24gdGhlIG5leHQgcGFzcyB0aHJvdWdoIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGlkZWZsb3BweV9xdWV1ZV9wY19oZWFkIChpZGVfZHJpdmVfdCAqZHJpdmUsaWRlZmxvcHB5X3BjX3QgKnBjLHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlkZV9pbml0X2RyaXZlX2NtZChycSk7CisJcnEtPmJ1ZmZlciA9IChjaGFyICopIHBjOworCXJxLT5mbGFncyA9IFJFUV9TUEVDSUFMOwkvL3JxLT5jbWQgPSBJREVGTE9QUFlfUENfUlE7CisJcnEtPnJxX2Rpc2sgPSBmbG9wcHktPmRpc2s7CisJKHZvaWQpIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsIHJxLCBpZGVfcHJlZW1wdCk7Cit9CisKK3N0YXRpYyBpZGVmbG9wcHlfcGNfdCAqaWRlZmxvcHB5X25leHRfcGNfc3RvcmFnZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJaWYgKGZsb3BweS0+cGNfc3RhY2tfaW5kZXggPT0gSURFRkxPUFBZX1BDX1NUQUNLKQorCQlmbG9wcHktPnBjX3N0YWNrX2luZGV4PTA7CisJcmV0dXJuICgmZmxvcHB5LT5wY19zdGFja1tmbG9wcHktPnBjX3N0YWNrX2luZGV4KytdKTsKK30KKworc3RhdGljIHN0cnVjdCByZXF1ZXN0ICppZGVmbG9wcHlfbmV4dF9ycV9zdG9yYWdlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoZmxvcHB5LT5ycV9zdGFja19pbmRleCA9PSBJREVGTE9QUFlfUENfU1RBQ0spCisJCWZsb3BweS0+cnFfc3RhY2tfaW5kZXggPSAwOworCXJldHVybiAoJmZsb3BweS0+cnFfc3RhY2tbZmxvcHB5LT5ycV9zdGFja19pbmRleCsrXSk7Cit9CisKKy8qCisgKglpZGVmbG9wcHlfYW5hbHl6ZV9lcnJvciBpcyBjYWxsZWQgb24gZWFjaCBmYWlsZWQgcGFja2V0IGNvbW1hbmQgcmV0cnkKKyAqCXRvIGFuYWx5emUgdGhlIHJlcXVlc3Qgc2Vuc2UuCisgKi8KK3N0YXRpYyB2b2lkIGlkZWZsb3BweV9hbmFseXplX2Vycm9yIChpZGVfZHJpdmVfdCAqZHJpdmUsaWRlZmxvcHB5X3JlcXVlc3Rfc2Vuc2VfcmVzdWx0X3QgKnJlc3VsdCkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWZsb3BweS0+c2Vuc2Vfa2V5ID0gcmVzdWx0LT5zZW5zZV9rZXk7CisJZmxvcHB5LT5hc2MgPSByZXN1bHQtPmFzYzsKKwlmbG9wcHktPmFzY3EgPSByZXN1bHQtPmFzY3E7CisJZmxvcHB5LT5wcm9ncmVzc19pbmRpY2F0aW9uID0gcmVzdWx0LT5za3N2WzBdICYgMHg4MCA/CisJCSh1MTYpZ2V0X3VuYWxpZ25lZCgodTE2ICopKHJlc3VsdC0+c2tzdisxKSk6MHgxMDAwMDsKKwlpZiAoZmxvcHB5LT5mYWlsZWRfcGMpCisJCWRlYnVnX2xvZyhLRVJOX0lORk8gImlkZS1mbG9wcHk6IHBjID0gJXgsIHNlbnNlIGtleSA9ICV4LCAiCisJCQkiYXNjID0gJXgsIGFzY3EgPSAleFxuIiwgZmxvcHB5LT5mYWlsZWRfcGMtPmNbMF0sCisJCQlyZXN1bHQtPnNlbnNlX2tleSwgcmVzdWx0LT5hc2MsIHJlc3VsdC0+YXNjcSk7CisJZWxzZQorCQlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiBzZW5zZSBrZXkgPSAleCwgYXNjID0gJXgsICIKKwkJCSJhc2NxID0gJXhcbiIsIHJlc3VsdC0+c2Vuc2Vfa2V5LAorCQkJcmVzdWx0LT5hc2MsIHJlc3VsdC0+YXNjcSk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZWZsb3BweV9yZXF1ZXN0X3NlbnNlX2NhbGxiYWNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiBSZWFjaGVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCWlmICghZmxvcHB5LT5wYy0+ZXJyb3IpIHsKKwkJaWRlZmxvcHB5X2FuYWx5emVfZXJyb3IoZHJpdmUsKGlkZWZsb3BweV9yZXF1ZXN0X3NlbnNlX3Jlc3VsdF90ICopIGZsb3BweS0+cGMtPmJ1ZmZlcik7CisJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMSwgMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiBSRVFVRVNUIFNFTlNFIGl0c2VsZiAtIEFib3J0aW5nIHJlcXVlc3QhXG4iKTsKKwkJaWRlZmxvcHB5X2RvX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKKwl9Cit9CisKKy8qCisgKglHZW5lcmFsIHBhY2tldCBjb21tYW5kIGNhbGxiYWNrIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfcGNfY2FsbGJhY2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwkKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiBSZWFjaGVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWRlZmxvcHB5X2RvX2VuZF9yZXF1ZXN0KGRyaXZlLCBmbG9wcHktPnBjLT5lcnJvciA/IDAgOiAxLCAwKTsKK30KKworLyoKKyAqCWlkZWZsb3BweV9pbml0X3BjIGluaXRpYWxpemVzIGEgcGFja2V0IGNvbW1hbmQuCisgKi8KK3N0YXRpYyB2b2lkIGlkZWZsb3BweV9pbml0X3BjIChpZGVmbG9wcHlfcGNfdCAqcGMpCit7CisJbWVtc2V0KHBjLT5jLCAwLCAxMik7CisJcGMtPnJldHJpZXMgPSAwOworCXBjLT5mbGFncyA9IDA7CisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSAwOworCXBjLT5idWZmZXIgPSBwYy0+cGNfYnVmZmVyOworCXBjLT5idWZmZXJfc2l6ZSA9IElERUZMT1BQWV9QQ19CVUZGRVJfU0laRTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRlZmxvcHB5X3BjX2NhbGxiYWNrOworfQorCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kIChpZGVmbG9wcHlfcGNfdCAqcGMpCit7CisJaWRlZmxvcHB5X2luaXRfcGMocGMpOwkKKwlwYy0+Y1swXSA9IElERUZMT1BQWV9SRVFVRVNUX1NFTlNFX0NNRDsKKwlwYy0+Y1s0XSA9IDI1NTsKKwlwYy0+cmVxdWVzdF90cmFuc2ZlciA9IDE4OworCXBjLT5jYWxsYmFjayA9ICZpZGVmbG9wcHlfcmVxdWVzdF9zZW5zZV9jYWxsYmFjazsKK30KKworLyoKKyAqCWlkZWZsb3BweV9yZXRyeV9wYyBpcyBjYWxsZWQgd2hlbiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQgZHVyaW5nIHRoZQorICoJbGFzdCBwYWNrZXQgY29tbWFuZC4gV2UgcXVldWUgYSByZXF1ZXN0IHNlbnNlIHBhY2tldCBjb21tYW5kIGluCisgKgl0aGUgaGVhZCBvZiB0aGUgcmVxdWVzdCBsaXN0LgorICovCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfcmV0cnlfcGMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfcGNfdCAqcGM7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCWF0YXBpX2Vycm9yX3QgZXJyb3I7CisKKwllcnJvci5hbGwgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9FUlJPUl9SRUcpOworCXBjID0gaWRlZmxvcHB5X25leHRfcGNfc3RvcmFnZShkcml2ZSk7CisJcnEgPSBpZGVmbG9wcHlfbmV4dF9ycV9zdG9yYWdlKGRyaXZlKTsKKwlpZGVmbG9wcHlfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kKHBjKTsKKwlpZGVmbG9wcHlfcXVldWVfcGNfaGVhZChkcml2ZSwgcGMsIHJxKTsKK30KKworLyoKKyAqCWlkZWZsb3BweV9wY19pbnRyIGlzIHRoZSB1c3VhbCBpbnRlcnJ1cHQgaGFuZGxlciB3aGljaCB3aWxsIGJlIGNhbGxlZAorICoJZHVyaW5nIGEgcGFja2V0IGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlZmxvcHB5X3BjX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlhdGFwaV9zdGF0dXNfdCBzdGF0dXM7CisJYXRhcGlfYmNvdW50X3QgYmNvdW50OworCWF0YXBpX2lyZWFzb25fdCBpcmVhc29uOworCWlkZWZsb3BweV9wY190ICpwYyA9IGZsb3BweS0+cGM7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gcGMtPnJxOworCXVuc2lnbmVkIGludCB0ZW1wOworCisJZGVidWdfbG9nKEtFUk5fSU5GTyAiaWRlLWZsb3BweTogUmVhY2hlZCAlcyBpbnRlcnJ1cHQgaGFuZGxlclxuIiwKKwkJX19GVU5DVElPTl9fKTsKKworCWlmICh0ZXN0X2JpdChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpKSB7CisJCWlmIChIV0lGKGRyaXZlKS0+aWRlX2RtYV9lbmQoZHJpdmUpKSB7CisJCQlzZXRfYml0KFBDX0RNQV9FUlJPUiwgJnBjLT5mbGFncyk7CisJCX0gZWxzZSB7CisJCQlwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgPSBwYy0+cmVxdWVzdF90cmFuc2ZlcjsKKwkJCWlkZWZsb3BweV91cGRhdGVfYnVmZmVycyhkcml2ZSwgcGMpOworCQl9CisJCWRlYnVnX2xvZyhLRVJOX0lORk8gImlkZS1mbG9wcHk6IERNQSBmaW5pc2hlZFxuIik7CisJfQorCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCXN0YXR1cy5hbGwgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9TVEFUVVNfUkVHKTsKKworCWlmICghc3RhdHVzLmIuZHJxKSB7CQkJLyogTm8gbW9yZSBpbnRlcnJ1cHRzICovCisJCWRlYnVnX2xvZyhLRVJOX0lORk8gIlBhY2tldCBjb21tYW5kIGNvbXBsZXRlZCwgJWQgYnl0ZXMgIgorCQkJInRyYW5zZmVycmVkXG4iLCBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQpOworCQljbGVhcl9iaXQoUENfRE1BX0lOX1BST0dSRVNTLCAmcGMtPmZsYWdzKTsKKworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJaWYgKHN0YXR1cy5iLmNoZWNrIHx8IHRlc3RfYml0KFBDX0RNQV9FUlJPUiwgJnBjLT5mbGFncykpIHsKKwkJCS8qIEVycm9yIGRldGVjdGVkICovCisJCQlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiAlczogSS9PIGVycm9yXG4iLAorCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXJxLT5lcnJvcnMrKzsKKwkJCWlmIChwYy0+Y1swXSA9PSBJREVGTE9QUFlfUkVRVUVTVF9TRU5TRV9DTUQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IEkvTyBlcnJvciBpbiAiCisJCQkJCSJyZXF1ZXN0IHNlbnNlIGNvbW1hbmRcbiIpOworCQkJCXJldHVybiBpZGVfZG9fcmVzZXQoZHJpdmUpOworCQkJfQorCQkJLyogUmV0cnkgb3BlcmF0aW9uICovCisJCQlpZGVmbG9wcHlfcmV0cnlfcGMoZHJpdmUpOworCQkJLyogcXVldWVkLCBidXQgbm90IHN0YXJ0ZWQgKi8KKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfQorCQlwYy0+ZXJyb3IgPSAwOworCQlpZiAoZmxvcHB5LT5mYWlsZWRfcGMgPT0gcGMpCisJCQlmbG9wcHktPmZhaWxlZF9wYyA9IE5VTEw7CisJCS8qIENvbW1hbmQgZmluaXNoZWQgLSBDYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworCQlwYy0+Y2FsbGJhY2soZHJpdmUpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogVGhlIGZsb3BweSB3YW50cyB0byBpc3N1ZSAiCisJCQkibW9yZSBpbnRlcnJ1cHRzIGluIERNQSBtb2RlXG4iKTsKKwkJKHZvaWQpX19pZGVfZG1hX29mZihkcml2ZSk7CisJCXJldHVybiBpZGVfZG9fcmVzZXQoZHJpdmUpOworCX0KKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyICovCisJYmNvdW50LmIuaGlnaCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0JDT1VOVEhfUkVHKTsKKwliY291bnQuYi5sb3cgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9CQ09VTlRMX1JFRyk7CisJLyogb24gdGhpcyBpbnRlcnJ1cHQgKi8KKwlpcmVhc29uLmFsbCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0lSRUFTT05fUkVHKTsKKworCWlmIChpcmVhc29uLmIuY29kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogQ29EICE9IDAgaW4gaWRlZmxvcHB5X3BjX2ludHJcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwl9CisJaWYgKGlyZWFzb24uYi5pbyA9PSB0ZXN0X2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKSkgeworCQkvKiBIb3BlZnVsbHksIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBXZSB3YW50ZWQgdG8gJXMsICIsCisJCQlpcmVhc29uLmIuaW8gPyAiV3JpdGUiOiJSZWFkIik7CisJCXByaW50ayhLRVJOX0VSUiAiYnV0IHRoZSBmbG9wcHkgd2FudHMgdXMgdG8gJXMgIVxuIiwKKwkJCWlyZWFzb24uYi5pbyA/ICJSZWFkIjoiV3JpdGUiKTsKKwkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CisJfQorCWlmICghdGVzdF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncykpIHsKKwkJLyogUmVhZGluZyAtIENoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgKi8KKwkJdGVtcCA9IHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCArIGJjb3VudC5hbGw7CisJCWlmICh0ZW1wID4gcGMtPnJlcXVlc3RfdHJhbnNmZXIpIHsKKwkJCWlmICh0ZW1wID4gcGMtPmJ1ZmZlcl9zaXplKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBUaGUgZmxvcHB5IHdhbnRzICIKKwkJCQkJInRvIHNlbmQgdXMgbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgIgorCQkJCQkiLSBkaXNjYXJkaW5nIGRhdGFcbiIpOworCQkJCWlkZWZsb3BweV9kaXNjYXJkX2RhdGEoZHJpdmUsYmNvdW50LmFsbCk7CisJCQkJaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCisJCQkJCUJVRygpOworCQkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwKKwkJCQkJCSZpZGVmbG9wcHlfcGNfaW50ciwKKwkJCQkJCUlERUZMT1BQWV9XQUlUX0NNRCwKKwkJCQkJCU5VTEwpOworCQkJCXJldHVybiBpZGVfc3RhcnRlZDsKKwkJCX0KKwkJCWRlYnVnX2xvZyhLRVJOX05PVElDRSAiaWRlLWZsb3BweTogVGhlIGZsb3BweSB3YW50cyB0byAiCisJCQkJInNlbmQgdXMgbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgLSAiCisJCQkJImFsbG93aW5nIHRyYW5zZmVyXG4iKTsKKwkJfQorCX0KKwlpZiAodGVzdF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncykpIHsKKwkJaWYgKHBjLT5idWZmZXIgIT0gTlVMTCkKKwkJCS8qIFdyaXRlIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJSFdJRihkcml2ZSktPmF0YXBpX291dHB1dF9ieXRlcyhkcml2ZSwKKwkJCQkJCXBjLT5jdXJyZW50X3Bvc2l0aW9uLAorCQkJCQkJYmNvdW50LmFsbCk7CisJCWVsc2UKKwkJCWlkZWZsb3BweV9vdXRwdXRfYnVmZmVycyhkcml2ZSwgcGMsIGJjb3VudC5hbGwpOworCX0gZWxzZSB7CisJCWlmIChwYy0+YnVmZmVyICE9IE5VTEwpCisJCQkvKiBSZWFkIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJSFdJRihkcml2ZSktPmF0YXBpX2lucHV0X2J5dGVzKGRyaXZlLAorCQkJCQkJcGMtPmN1cnJlbnRfcG9zaXRpb24sCisJCQkJCQliY291bnQuYWxsKTsKKwkJZWxzZQorCQkJaWRlZmxvcHB5X2lucHV0X2J1ZmZlcnMoZHJpdmUsIHBjLCBiY291bnQuYWxsKTsKKwl9CisJLyogVXBkYXRlIHRoZSBjdXJyZW50IHBvc2l0aW9uICovCisJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkICs9IGJjb3VudC5hbGw7CisJcGMtPmN1cnJlbnRfcG9zaXRpb24gKz0gYmNvdW50LmFsbDsKKworCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQorCQlCVUcoKTsKKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVmbG9wcHlfcGNfaW50ciwgSURFRkxPUFBZX1dBSVRfQ01ELCBOVUxMKTsJCS8qIEFuZCBzZXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGFnYWluICovCisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCisvKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgcm91dGluZSB0aGF0IGRpZCB0aGUgcGFja2V0IHRyYW5zZmVyLgorICogSXQgZmFpbHMgYXQgaGlnaCBzcGVlZHMgb24gdGhlIElvbWVnYSBaSVAgZHJpdmUsIHNvIHRoZXJlJ3MgYSBzbG93ZXIgdmVyc2lvbgorICogZm9yIHRoYXQgZHJpdmUgYmVsb3cuIFRoZSBhbGdvcml0aG0gaXMgY2hvc2VuIGJhc2VkIG9uIGRyaXZlIHR5cGUKKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVmbG9wcHlfdHJhbnNmZXJfcGMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWF0YXBpX2lyZWFzb25fdCBpcmVhc29uOworCisJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIERSUV9TVEFULCBCVVNZX1NUQVQsIFdBSVRfUkVBRFkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogU3RyYW5nZSwgcGFja2V0IGNvbW1hbmQgIgorCQkJCSJpbml0aWF0ZWQgeWV0IERSUSBpc24ndCBhc3NlcnRlZFxuIik7CisJCXJldHVybiBzdGFydHN0b3A7CisJfQorCWlyZWFzb24uYWxsID0gSFdJRihkcml2ZSktPklOQihJREVfSVJFQVNPTl9SRUcpOworCWlmICghaXJlYXNvbi5iLmNvZCB8fCBpcmVhc29uLmIuaW8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiAoSU8sQ29EKSAhPSAoMCwxKSB3aGlsZSAiCisJCQkJImlzc3VpbmcgYSBwYWNrZXQgY29tbWFuZFxuIik7CisJCXJldHVybiBpZGVfZG9fcmVzZXQoZHJpdmUpOworCX0KKwlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKKwkJQlVHKCk7CisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZWZsb3BweV9wY19pbnRyLCBJREVGTE9QUFlfV0FJVF9DTUQsIE5VTEwpOworCS8qIFNlbmQgdGhlIGFjdHVhbCBwYWNrZXQgKi8KKwlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBmbG9wcHktPnBjLT5jLCAxMik7CisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCisKKy8qCisgKiBXaGF0IHdlIGhhdmUgaGVyZSBpcyBhIGNsYXNzaWMgY2FzZSBvZiBhIHRvcCBoYWxmIC8gYm90dG9tIGhhbGYKKyAqIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuIEluIGludGVycnVwdCBtb2RlLCB0aGUgZGV2aWNlIHNlbmRzCisgKiBhbiBpbnRlcnJ1cHQgdG8gc2lnbmFsIGl0J3MgcmVhZHkgdG8gcmVjZWl2ZSBhIHBhY2tldC4gSG93ZXZlciwKKyAqIHdlIG5lZWQgdG8gZGVsYXkgYWJvdXQgMi0zIHRpY2tzIGJlZm9yZSBpc3N1aW5nIHRoZSBwYWNrZXQgb3Igd2UKKyAqIGdldHMgaW4gdHJvdWJsZS4KKyAqCisgKiBTbywgZm9sbG93IGNhcmVmdWxseS4gdHJhbnNmZXJfcGMxIGlzIGNhbGxlZCBhcyBhbiBpbnRlcnJ1cHQgKG9yCisgKiBkaXJlY3RseSkuIEluIGVpdGhlciBjYXNlLCB3aGVuIHRoZSBkZXZpY2Ugc2F5cyBpdCdzIHJlYWR5IGZvciBhIAorICogcGFja2V0LCB3ZSBzY2hlZHVsZSB0aGUgcGFja2V0IHRyYW5zZmVyIHRvIG9jY3VyIGFib3V0IDItMyB0aWNrcworICogbGF0ZXIgaW4gdHJhbnNmZXJfcGMyLgorICovCitzdGF0aWMgaW50IGlkZWZsb3BweV90cmFuc2Zlcl9wYzIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCS8qIFNlbmQgdGhlIGFjdHVhbCBwYWNrZXQgKi8KKwlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBmbG9wcHktPnBjLT5jLCAxMik7CisJLyogVGltZW91dCBmb3IgdGhlIHBhY2tldCBjb21tYW5kICovCisJcmV0dXJuIElERUZMT1BQWV9XQUlUX0NNRDsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVmbG9wcHlfdHJhbnNmZXJfcGMxIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKwlhdGFwaV9pcmVhc29uX3QgaXJlYXNvbjsKKworCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBEUlFfU1RBVCwgQlVTWV9TVEFULCBXQUlUX1JFQURZKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IFN0cmFuZ2UsIHBhY2tldCBjb21tYW5kICIKKwkJCQkiaW5pdGlhdGVkIHlldCBEUlEgaXNuJ3QgYXNzZXJ0ZWRcbiIpOworCQlyZXR1cm4gc3RhcnRzdG9wOworCX0KKwlpcmVhc29uLmFsbCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0lSRUFTT05fUkVHKTsKKwlpZiAoIWlyZWFzb24uYi5jb2QgfHwgaXJlYXNvbi5iLmlvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogKElPLENvRCkgIT0gKDAsMSkgIgorCQkJCSJ3aGlsZSBpc3N1aW5nIGEgcGFja2V0IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwl9CisJLyogCisJICogVGhlIGZvbGxvd2luZyBkZWxheSBzb2x2ZXMgYSBwcm9ibGVtIHdpdGggQVRBUEkgWmlwIDEwMCBkcml2ZXMKKwkgKiB3aGVyZSB0aGUgQnVzeSBmbGFnIHdhcyBhcHBhcmVudGx5IGJlaW5nIGRlYXNzZXJ0ZWQgYmVmb3JlIHRoZQorCSAqIHVuaXQgd2FzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YS4gVGhpcyB3YXMgaGFwcGVuaW5nIG9uIGEKKwkgKiAxMjAwIE1IeiBBdGhsb24gc3lzdGVtLiAxMC8yNi8wMSAyNW1zZWMgaXMgdG9vIHNob3J0LAorCSAqIDQwIGFuZCA1MG1zZWMgd29yayB3ZWxsLiBpZGVmbG9wcHlfcGNfaW50ciB3aWxsIG5vdCBiZSBhY3R1YWxseQorCSAqIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHBhY2tldCBpcyBtb3ZlZCBpbiBhYm91dCA1MCBtc2VjLgorCSAqLworCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQorCQlCVUcoKTsKKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIAorCSAgJmlkZWZsb3BweV9wY19pbnRyLCAJCS8qIHNlcnZpY2Ugcm91dGluZSBmb3IgcGFja2V0IGNvbW1hbmQgKi8KKwkgIGZsb3BweS0+dGlja3MsCQkvKiB3YWl0IHRoaXMgbG9uZyBiZWZvcmUgImZhaWxpbmciICovCisJICAmaWRlZmxvcHB5X3RyYW5zZmVyX3BjMik7CS8qIGZhaWwgPT0gdHJhbnNmZXJfcGMyICovCisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCisvKioKKyAqIGlkZWZsb3BweV9zaG91bGRfcmVwb3J0X2Vycm9yKCkKKyAqCisgKiBTdXByZXNzZXMgZXJyb3IgbWVzc2FnZXMgcmVzdWx0aW5nIGZyb20gTWVkaXVtIG5vdCBwcmVzZW50CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlkZWZsb3BweV9zaG91bGRfcmVwb3J0X2Vycm9yKGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5KQoreworCWlmIChmbG9wcHktPnNlbnNlX2tleSA9PSAweDAyICYmCisJICAgIGZsb3BweS0+YXNjICAgICAgID09IDB4M2EgJiYKKwkgICAgZmxvcHB5LT5hc2NxICAgICAgPT0gMHgwMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglJc3N1ZSBhIHBhY2tldCBjb21tYW5kCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlZmxvcHB5X2lzc3VlX3BjIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZWZsb3BweV9wY190ICpwYykKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJYXRhcGlfZmVhdHVyZV90IGZlYXR1cmU7CisJYXRhcGlfYmNvdW50X3QgYmNvdW50OworCWlkZV9oYW5kbGVyX3QgKnBrdF94ZmVyX3JvdXRpbmU7CisKKyNpZiBJREVGTE9QUFlfREVCVUdfQlVHUworCWlmIChmbG9wcHktPnBjLT5jWzBdID09IElERUZMT1BQWV9SRVFVRVNUX1NFTlNFX0NNRCAmJgorCSAgICBwYy0+Y1swXSA9PSBJREVGTE9QUFlfUkVRVUVTVF9TRU5TRV9DTUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBwb3NzaWJsZSBpZGUtZmxvcHB5LmMgYnVnIC0gIgorCQkJIlR3byByZXF1ZXN0IHNlbnNlIGluIHNlcmlhbCB3ZXJlIGlzc3VlZFxuIik7CisJfQorI2VuZGlmIC8qIElERUZMT1BQWV9ERUJVR19CVUdTICovCisKKwlpZiAoZmxvcHB5LT5mYWlsZWRfcGMgPT0gTlVMTCAmJgorCSAgICBwYy0+Y1swXSAhPSBJREVGTE9QUFlfUkVRVUVTVF9TRU5TRV9DTUQpCisJCWZsb3BweS0+ZmFpbGVkX3BjID0gcGM7CisJLyogU2V0IHRoZSBjdXJyZW50IHBhY2tldCBjb21tYW5kICovCisJZmxvcHB5LT5wYyA9IHBjOworCisJaWYgKHBjLT5yZXRyaWVzID4gSURFRkxPUFBZX01BWF9QQ19SRVRSSUVTIHx8CisJICAgIHRlc3RfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKSkgeworCQkvKgorCQkgKglXZSB3aWxsICJhYm9ydCIgcmV0cnlpbmcgYSBwYWNrZXQgY29tbWFuZCBpbiBjYXNlCisJCSAqCWEgbGVnaXRpbWF0ZSBlcnJvciBjb2RlIHdhcyByZWNlaXZlZC4KKwkJICovCisJCWlmICghdGVzdF9iaXQoUENfQUJPUlQsICZwYy0+ZmxhZ3MpKSB7CisJCQlpZiAoIXRlc3RfYml0KFBDX1NVUFBSRVNTX0VSUk9SLCAmcGMtPmZsYWdzKSkgeworCQkJCWlmIChpZGVmbG9wcHlfc2hvdWxkX3JlcG9ydF9lcnJvcihmbG9wcHkpKQorCQkJCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6ICVzOiBJL08gZXJyb3IsICIKKwkJCQkJICAgICAgICJwYyA9ICUyeCwga2V5ID0gJTJ4LCAiCisJCQkJCSAgICAgICAiYXNjID0gJTJ4LCBhc2NxID0gJTJ4XG4iLAorCQkJCQkgICAgICAgZHJpdmUtPm5hbWUsIHBjLT5jWzBdLAorCQkJCQkgICAgICAgZmxvcHB5LT5zZW5zZV9rZXksCisJCQkJCSAgICAgICBmbG9wcHktPmFzYywgZmxvcHB5LT5hc2NxKTsKKwkJCX0KKwkJCS8qIEdpdmluZyB1cCAqLworCQkJcGMtPmVycm9yID0gSURFRkxPUFBZX0VSUk9SX0dFTkVSQUw7CisJCX0KKwkJZmxvcHB5LT5mYWlsZWRfcGMgPSBOVUxMOworCQlwYy0+Y2FsbGJhY2soZHJpdmUpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJZGVidWdfbG9nKEtFUk5fSU5GTyAiUmV0cnkgbnVtYmVyIC0gJWRcbiIscGMtPnJldHJpZXMpOworCisJcGMtPnJldHJpZXMrKzsKKwkvKiBXZSBoYXZlbid0IHRyYW5zZmVycmVkIGFueSBkYXRhIHlldCAqLworCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCA9IDA7CisJcGMtPmN1cnJlbnRfcG9zaXRpb24gPSBwYy0+YnVmZmVyOworCWJjb3VudC5hbGwgPSBtaW4ocGMtPnJlcXVlc3RfdHJhbnNmZXIsIDYzICogMTAyNCk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBDX0RNQV9FUlJPUiwgJnBjLT5mbGFncykpIHsKKwkJKHZvaWQpX19pZGVfZG1hX29mZihkcml2ZSk7CisJfQorCWZlYXR1cmUuYWxsID0gMDsKKworCWlmICh0ZXN0X2JpdChQQ19ETUFfUkVDT01NRU5ERUQsICZwYy0+ZmxhZ3MpICYmIGRyaXZlLT51c2luZ19kbWEpCisJCWZlYXR1cmUuYi5kbWEgPSAhaHdpZi0+ZG1hX3NldHVwKGRyaXZlKTsKKworCWlmIChJREVfQ09OVFJPTF9SRUcpCisJCUhXSUYoZHJpdmUpLT5PVVRCKGRyaXZlLT5jdGwsIElERV9DT05UUk9MX1JFRyk7CisJLyogVXNlIFBJTy9ETUEgKi8KKwlIV0lGKGRyaXZlKS0+T1VUQihmZWF0dXJlLmFsbCwgSURFX0ZFQVRVUkVfUkVHKTsKKwlIV0lGKGRyaXZlKS0+T1VUQihiY291bnQuYi5oaWdoLCBJREVfQkNPVU5USF9SRUcpOworCUhXSUYoZHJpdmUpLT5PVVRCKGJjb3VudC5iLmxvdywgSURFX0JDT1VOVExfUkVHKTsKKwlIV0lGKGRyaXZlKS0+T1VUQihkcml2ZS0+c2VsZWN0LmFsbCwgSURFX1NFTEVDVF9SRUcpOworCisJaWYgKGZlYXR1cmUuYi5kbWEpIHsJLyogQmVnaW4gRE1BLCBpZiBuZWNlc3NhcnkgKi8KKwkJc2V0X2JpdChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpOworCQlod2lmLT5kbWFfc3RhcnQoZHJpdmUpOworCX0KKworCS8qIENhbiB3ZSB0cmFuc2ZlciB0aGUgcGFja2V0IHdoZW4gd2UgZ2V0IHRoZSBpbnRlcnJ1cHQgb3Igd2FpdD8gKi8KKwlpZiAodGVzdF9iaXQoSURFRkxPUFBZX1pJUF9EUklWRSwgJmZsb3BweS0+ZmxhZ3MpKSB7CisJCS8qIHdhaXQgKi8KKwkJcGt0X3hmZXJfcm91dGluZSA9ICZpZGVmbG9wcHlfdHJhbnNmZXJfcGMxOworCX0gZWxzZSB7CisJCS8qIGltbWVkaWF0ZSAqLworCQlwa3RfeGZlcl9yb3V0aW5lID0gJmlkZWZsb3BweV90cmFuc2Zlcl9wYzsKKwl9CisJCisJaWYgKHRlc3RfYml0IChJREVGTE9QUFlfRFJRX0lOVEVSUlVQVCwgJmZsb3BweS0+ZmxhZ3MpKSB7CisJCS8qIElzc3VlIHRoZSBwYWNrZXQgY29tbWFuZCAqLworCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBXSU5fUEFDS0VUQ01ELAorCQkJCXBrdF94ZmVyX3JvdXRpbmUsCisJCQkJSURFRkxPUFBZX1dBSVRfQ01ELAorCQkJCU5VTEwpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgdGhlIHBhY2tldCBjb21tYW5kICovCisJCUhXSUYoZHJpdmUpLT5PVVRCKFdJTl9QQUNLRVRDTUQsIElERV9DT01NQU5EX1JFRyk7CisJCXJldHVybiAoKnBrdF94ZmVyX3JvdXRpbmUpIChkcml2ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfcndfY2FsbGJhY2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiBSZWFjaGVkIGlkZWZsb3BweV9yd19jYWxsYmFja1xuIik7CisKKwlpZGVmbG9wcHlfZG9fZW5kX3JlcXVlc3QoZHJpdmUsIDEsIDApOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9wcmV2ZW50X2NtZCAoaWRlZmxvcHB5X3BjX3QgKnBjLCBpbnQgcHJldmVudCkKK3sKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJpZGUtZmxvcHB5OiBjcmVhdGluZyBwcmV2ZW50IHJlbW92YWwgY29tbWFuZCwgIgorCQkicHJldmVudCA9ICVkXG4iLCBwcmV2ZW50KTsKKworCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERUZMT1BQWV9QUkVWRU5UX1JFTU9WQUxfQ01EOworCXBjLT5jWzRdID0gcHJldmVudDsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZCAoaWRlZmxvcHB5X3BjX3QgKnBjKQoreworCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERUZMT1BQWV9SRUFEX0NBUEFDSVRZX0NNRDsKKwlwYy0+Y1s3XSA9IDI1NTsKKwlwYy0+Y1s4XSA9IDI1NTsKKwlwYy0+cmVxdWVzdF90cmFuc2ZlciA9IDI1NTsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9mb3JtYXRfdW5pdF9jbWQgKGlkZWZsb3BweV9wY190ICpwYywgaW50IGIsIGludCBsLAorCQkJCQkgICAgICBpbnQgZmxhZ3MpCit7CisJaWRlZmxvcHB5X2luaXRfcGMocGMpOworCXBjLT5jWzBdID0gSURFRkxPUFBZX0ZPUk1BVF9VTklUX0NNRDsKKwlwYy0+Y1sxXSA9IDB4MTc7CisKKwltZW1zZXQocGMtPmJ1ZmZlciwgMCwgMTIpOworCXBjLT5idWZmZXJbMV0gPSAweEEyOworCS8qIERlZmF1bHQgZm9ybWF0IGxpc3QgaGVhZGVyLCB1OCAxOiBGT1YvRENSVC9JTU0gYml0cyBzZXQgKi8KKworCWlmIChmbGFncyAmIDEpCQkJCS8qIFZlcmlmeSBiaXQgb24uLi4gKi8KKwkJcGMtPmJ1ZmZlclsxXSBePSAweDIwOwkJLyogLi4uIHR1cm4gb2ZmIERDUlQgYml0ICovCisJcGMtPmJ1ZmZlclszXSA9IDg7CisKKwlwdXRfdW5hbGlnbmVkKGh0b25sKGIpLCAodW5zaWduZWQgaW50ICopKCZwYy0+YnVmZmVyWzRdKSk7CisJcHV0X3VuYWxpZ25lZChodG9ubChsKSwgKHVuc2lnbmVkIGludCAqKSgmcGMtPmJ1ZmZlcls4XSkpOworCXBjLT5idWZmZXJfc2l6ZT0xMjsKKwlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworfQorCisvKgorICoJQSBtb2RlIHNlbnNlIGNvbW1hbmQgaXMgdXNlZCB0byAic2Vuc2UiIGZsb3BweSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX21vZGVfc2Vuc2VfY21kIChpZGVmbG9wcHlfcGNfdCAqcGMsIHU4IHBhZ2VfY29kZSwgdTggdHlwZSkKK3sKKwl1MTYgbGVuZ3RoID0gc2l6ZW9mKGlkZWZsb3BweV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCk7CisJCisJaWRlZmxvcHB5X2luaXRfcGMocGMpOworCXBjLT5jWzBdID0gSURFRkxPUFBZX01PREVfU0VOU0VfQ01EOworCXBjLT5jWzFdID0gMDsKKwlwYy0+Y1syXSA9IHBhZ2VfY29kZSArICh0eXBlIDw8IDYpOworCisJc3dpdGNoIChwYWdlX2NvZGUpIHsKKwkJY2FzZSBJREVGTE9QUFlfQ0FQQUJJTElUSUVTX1BBR0U6CisJCQlsZW5ndGggKz0gMTI7CisJCQlicmVhazsKKwkJY2FzZSBJREVGTE9QUFlfRkxFWElCTEVfRElTS19QQUdFOgorCQkJbGVuZ3RoICs9IDMyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IHVuc3VwcG9ydGVkIHBhZ2UgY29kZSAiCisJCQkJImluIGNyZWF0ZV9tb2RlX3NlbnNlX2NtZFxuIik7CisJfQorCXB1dF91bmFsaWduZWQoaHRvbnMobGVuZ3RoKSwgKHUxNiAqKSAmcGMtPmNbN10pOworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX3N0YXJ0X3N0b3BfY21kIChpZGVmbG9wcHlfcGNfdCAqcGMsIGludCBzdGFydCkKK3sKKwlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVGTE9QUFlfU1RBUlRfU1RPUF9DTUQ7CisJcGMtPmNbNF0gPSBzdGFydDsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV90ZXN0X3VuaXRfcmVhZHlfY21kKGlkZWZsb3BweV9wY190ICpwYykKK3sKKwlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVGTE9QUFlfVEVTVF9VTklUX1JFQURZX0NNRDsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9yd19jbWQgKGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LCBpZGVmbG9wcHlfcGNfdCAqcGMsIHN0cnVjdCByZXF1ZXN0ICpycSwgdW5zaWduZWQgbG9uZyBzZWN0b3IpCit7CisJaW50IGJsb2NrID0gc2VjdG9yIC8gZmxvcHB5LT5ic19mYWN0b3I7CisJaW50IGJsb2NrcyA9IHJxLT5ucl9zZWN0b3JzIC8gZmxvcHB5LT5ic19mYWN0b3I7CisJaW50IGNtZCA9IHJxX2RhdGFfZGlyKHJxKTsKKworCWRlYnVnX2xvZygiY3JlYXRlX3J3MSVkX2NtZDogYmxvY2sgPT0gJWQsIGJsb2NrcyA9PSAlZFxuIiwKKwkJMiAqIHRlc3RfYml0IChJREVGTE9QUFlfVVNFX1JFQUQxMiwgJmZsb3BweS0+ZmxhZ3MpLAorCQlibG9jaywgYmxvY2tzKTsKKworCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwlpZiAodGVzdF9iaXQoSURFRkxPUFBZX1VTRV9SRUFEMTIsICZmbG9wcHktPmZsYWdzKSkgeworCQlwYy0+Y1swXSA9IGNtZCA9PSBSRUFEID8gSURFRkxPUFBZX1JFQUQxMl9DTUQgOiBJREVGTE9QUFlfV1JJVEUxMl9DTUQ7CisJCXB1dF91bmFsaWduZWQoaHRvbmwoYmxvY2tzKSwgKHVuc2lnbmVkIGludCAqKSAmcGMtPmNbNl0pOworCX0gZWxzZSB7CisJCXBjLT5jWzBdID0gY21kID09IFJFQUQgPyBJREVGTE9QUFlfUkVBRDEwX0NNRCA6IElERUZMT1BQWV9XUklURTEwX0NNRDsKKwkJcHV0X3VuYWxpZ25lZChodG9ucyhibG9ja3MpLCAodW5zaWduZWQgc2hvcnQgKikgJnBjLT5jWzddKTsKKwl9CisJcHV0X3VuYWxpZ25lZChodG9ubChibG9jayksICh1bnNpZ25lZCBpbnQgKikgJnBjLT5jWzJdKTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRlZmxvcHB5X3J3X2NhbGxiYWNrOworCXBjLT5ycSA9IHJxOworCXBjLT5iX2NvdW50ID0gY21kID09IFJFQUQgPyAwIDogcnEtPmJpby0+Ymlfc2l6ZTsKKwlpZiAocnEtPmZsYWdzICYgUkVRX1JXKQorCQlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCXBjLT5idWZmZXIgPSBOVUxMOworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gcGMtPmJ1ZmZlcl9zaXplID0gYmxvY2tzICogZmxvcHB5LT5ibG9ja19zaXplOworCXNldF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKTsKK30KKworc3RhdGljIGludAoraWRlZmxvcHB5X2Jsb2NrcGNfY21kKGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LCBpZGVmbG9wcHlfcGNfdCAqcGMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwkvKgorCSAqIGp1c3Qgc3VwcG9ydCBlamVjdCBmb3Igbm93LCBpdCB3b3VsZCBub3QgYmUgaGFyZCB0byBtYWtlIHRoZQorCSAqIFJFUV9CTE9DS19QQyBzdXBwb3J0IGZ1bGx5LWZlYXR1cmVkCisJICovCisJaWYgKHJxLT5jbWRbMF0gIT0gSURFRkxPUFBZX1NUQVJUX1NUT1BfQ01EKQorCQlyZXR1cm4gMTsKKworCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwltZW1jcHkocGMtPmMsIHJxLT5jbWQsIHNpemVvZihwYy0+YykpOworCXJldHVybiAwOworfQorCisvKgorICoJaWRlZmxvcHB5X2RvX3JlcXVlc3QgaXMgb3VyIHJlcXVlc3QgaGFuZGxpbmcgZnVuY3Rpb24uCQorICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZWZsb3BweV9kb19yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgc2VjdG9yX3QgYmxvY2tfcykKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGVmbG9wcHlfcGNfdCAqcGM7CisJdW5zaWduZWQgbG9uZyBibG9jayA9ICh1bnNpZ25lZCBsb25nKWJsb2NrX3M7CisKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJycV9zdGF0dXM6ICVkLCBkZXY6ICVzLCBmbGFnczogJWx4LCBlcnJvcnM6ICVkXG4iLAorCQkJcnEtPnJxX3N0YXR1cywKKwkJCXJxLT5ycV9kaXNrID8gcnEtPnJxX2Rpc2stPmRpc2tfbmFtZSA/ICI/IiwKKwkJCXJxLT5mbGFncywgcnEtPmVycm9ycyk7CisJZGVidWdfbG9nKEtFUk5fSU5GTyAic2VjdG9yOiAlbGQsIG5yX3NlY3RvcnM6ICVsZCwgIgorCQkJImN1cnJlbnRfbnJfc2VjdG9yczogJWRcbiIsIChsb25nKXJxLT5zZWN0b3IsCisJCQlycS0+bnJfc2VjdG9ycywgcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisKKwlpZiAocnEtPmVycm9ycyA+PSBFUlJPUl9NQVgpIHsKKwkJaWYgKGZsb3BweS0+ZmFpbGVkX3BjICE9IE5VTEwpIHsKKwkJCWlmIChpZGVmbG9wcHlfc2hvdWxkX3JlcG9ydF9lcnJvcihmbG9wcHkpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogJXM6IEkvTyBlcnJvciwgcGMgPSAlMngsIgorCQkJCSAgICAgICAiIGtleSA9ICUyeCwgYXNjID0gJTJ4LCBhc2NxID0gJTJ4XG4iLAorCQkJCSAgICAgICBkcml2ZS0+bmFtZSwgZmxvcHB5LT5mYWlsZWRfcGMtPmNbMF0sCisJCQkJICAgICAgIGZsb3BweS0+c2Vuc2Vfa2V5LCBmbG9wcHktPmFzYywgZmxvcHB5LT5hc2NxKTsKKwkJfQorCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6ICVzOiBJL08gZXJyb3JcbiIsCisJCQkJZHJpdmUtPm5hbWUpOworCQlpZGVmbG9wcHlfZG9fZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCWlmIChycS0+ZmxhZ3MgJiBSRVFfQ01EKSB7CisJCWlmICgoKGxvbmcpcnEtPnNlY3RvciAlIGZsb3BweS0+YnNfZmFjdG9yKSB8fAorCQkgICAgKHJxLT5ucl9zZWN0b3JzICUgZmxvcHB5LT5ic19mYWN0b3IpKSB7CisJCQlwcmludGsoIiVzOiB1bnN1cHBvcnRlZCByL3cgcmVxdWVzdCBzaXplXG4iLAorCQkJCWRyaXZlLT5uYW1lKTsKKwkJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CisJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJCX0KKwkJcGMgPSBpZGVmbG9wcHlfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJaWRlZmxvcHB5X2NyZWF0ZV9yd19jbWQoZmxvcHB5LCBwYywgcnEsIGJsb2NrKTsKKwl9IGVsc2UgaWYgKHJxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSB7CisJCXBjID0gKGlkZWZsb3BweV9wY190ICopIHJxLT5idWZmZXI7CisJfSBlbHNlIGlmIChycS0+ZmxhZ3MgJiBSRVFfQkxPQ0tfUEMpIHsKKwkJcGMgPSBpZGVmbG9wcHlfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJaWYgKGlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSkpIHsKKwkJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CisJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJCX0KKwl9IGVsc2UgeworCQlibGtfZHVtcF9ycV9mbGFncyhycSwKKwkJCSJpZGUtZmxvcHB5OiB1bnN1cHBvcnRlZCBjb21tYW5kIGluIHF1ZXVlIik7CisJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwlwYy0+cnEgPSBycTsKKwlyZXR1cm4gaWRlZmxvcHB5X2lzc3VlX3BjKGRyaXZlLCBwYyk7Cit9CisKKy8qCisgKglpZGVmbG9wcHlfcXVldWVfcGNfdGFpbCBhZGRzIGEgc3BlY2lhbCBwYWNrZXQgY29tbWFuZCByZXF1ZXN0IHRvIHRoZQorICoJdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBzZXJ2aWNlZC4KKyAqLworc3RhdGljIGludCBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbCAoaWRlX2RyaXZlX3QgKmRyaXZlLGlkZWZsb3BweV9wY190ICpwYykKK3sKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCBycTsKKworCWlkZV9pbml0X2RyaXZlX2NtZCAoJnJxKTsKKwlycS5idWZmZXIgPSAoY2hhciAqKSBwYzsKKwlycS5mbGFncyA9IFJFUV9TUEVDSUFMOwkJLy8JcnEuY21kID0gSURFRkxPUFBZX1BDX1JROworCXJxLnJxX2Rpc2sgPSBmbG9wcHktPmRpc2s7CisKKwlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7Cit9CisKKy8qCisgKglMb29rIGF0IHRoZSBmbGV4aWJsZSBkaXNrIHBhZ2UgcGFyYW1ldGVycy4gV2Ugd2lsbCBpZ25vcmUgdGhlIENIUworICoJY2FwYWNpdHkgcGFyYW1ldGVycyBhbmQgdXNlIHRoZSBMQkEgcGFyYW1ldGVycyBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IGlkZWZsb3BweV9nZXRfZmxleGlibGVfZGlza19wYWdlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlZmxvcHB5X3BjX3QgcGM7CisJaWRlZmxvcHB5X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90ICpoZWFkZXI7CisJaWRlZmxvcHB5X2ZsZXhpYmxlX2Rpc2tfcGFnZV90ICpwYWdlOworCWludCBjYXBhY2l0eSwgbGJhX2NhcGFjaXR5OworCisJaWRlZmxvcHB5X2NyZWF0ZV9tb2RlX3NlbnNlX2NtZCgmcGMsIElERUZMT1BQWV9GTEVYSUJMRV9ESVNLX1BBR0UsIE1PREVfU0VOU0VfQ1VSUkVOVCk7CisJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCZwYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBDYW4ndCBnZXQgZmxleGlibGUgZGlzayAiCisJCQkicGFnZSBwYXJhbWV0ZXJzXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWhlYWRlciA9IChpZGVmbG9wcHlfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QgKikgcGMuYnVmZmVyOworCWZsb3BweS0+d3AgPSBoZWFkZXItPndwOworCXNldF9kaXNrX3JvKGZsb3BweS0+ZGlzaywgZmxvcHB5LT53cCk7CisJcGFnZSA9IChpZGVmbG9wcHlfZmxleGlibGVfZGlza19wYWdlX3QgKikgKGhlYWRlciArIDEpOworCisJcGFnZS0+dHJhbnNmZXJfcmF0ZSA9IG50b2hzKHBhZ2UtPnRyYW5zZmVyX3JhdGUpOworCXBhZ2UtPnNlY3Rvcl9zaXplID0gbnRvaHMocGFnZS0+c2VjdG9yX3NpemUpOworCXBhZ2UtPmN5bHMgPSBudG9ocyhwYWdlLT5jeWxzKTsKKwlwYWdlLT5ycG0gPSBudG9ocyhwYWdlLT5ycG0pOworCWNhcGFjaXR5ID0gcGFnZS0+Y3lscyAqIHBhZ2UtPmhlYWRzICogcGFnZS0+c2VjdG9ycyAqIHBhZ2UtPnNlY3Rvcl9zaXplOworCWlmIChtZW1jbXAgKHBhZ2UsICZmbG9wcHktPmZsZXhpYmxlX2Rpc2tfcGFnZSwgc2l6ZW9mIChpZGVmbG9wcHlfZmxleGlibGVfZGlza19wYWdlX3QpKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVka0IsICVkLyVkLyVkIENIUywgJWQga0JwcywgIgorCQkJCSIlZCBzZWN0b3Igc2l6ZSwgJWQgcnBtXG4iLAorCQkJZHJpdmUtPm5hbWUsIGNhcGFjaXR5IC8gMTAyNCwgcGFnZS0+Y3lscywKKwkJCXBhZ2UtPmhlYWRzLCBwYWdlLT5zZWN0b3JzLAorCQkJcGFnZS0+dHJhbnNmZXJfcmF0ZSAvIDgsIHBhZ2UtPnNlY3Rvcl9zaXplLCBwYWdlLT5ycG0pOworCisJZmxvcHB5LT5mbGV4aWJsZV9kaXNrX3BhZ2UgPSAqcGFnZTsKKwlkcml2ZS0+Ymlvc19jeWwgPSBwYWdlLT5jeWxzOworCWRyaXZlLT5iaW9zX2hlYWQgPSBwYWdlLT5oZWFkczsKKwlkcml2ZS0+Ymlvc19zZWN0ID0gcGFnZS0+c2VjdG9yczsKKwlsYmFfY2FwYWNpdHkgPSBmbG9wcHktPmJsb2NrcyAqIGZsb3BweS0+YmxvY2tfc2l6ZTsKKwlpZiAoY2FwYWNpdHkgPCBsYmFfY2FwYWNpdHkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVGhlIGRpc2sgcmVwb3J0cyBhIGNhcGFjaXR5IG9mICVkICIKKwkJCSJieXRlcywgYnV0IHRoZSBkcml2ZSBvbmx5IGhhbmRsZXMgJWRcbiIsCisJCQlkcml2ZS0+bmFtZSwgbGJhX2NhcGFjaXR5LCBjYXBhY2l0eSk7CisJCWZsb3BweS0+YmxvY2tzID0gZmxvcHB5LT5ibG9ja19zaXplID8gY2FwYWNpdHkgLyBmbG9wcHktPmJsb2NrX3NpemUgOiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVmbG9wcHlfZ2V0X2NhcGFiaWxpdHlfcGFnZShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlZmxvcHB5X3BjX3QgcGM7CisJaWRlZmxvcHB5X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90ICpoZWFkZXI7CisJaWRlZmxvcHB5X2NhcGFiaWxpdGllc19wYWdlX3QgKnBhZ2U7CisKKwlmbG9wcHktPnNyZnAgPSAwOworCWlkZWZsb3BweV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVGTE9QUFlfQ0FQQUJJTElUSUVTX1BBR0UsCisJCQkJCQkgTU9ERV9TRU5TRV9DVVJSRU5UKTsKKworCXNldF9iaXQoUENfU1VQUFJFU1NfRVJST1IsICZwYy5mbGFncyk7CisJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCZwYykpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJaGVhZGVyID0gKGlkZWZsb3BweV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqKSBwYy5idWZmZXI7CisJcGFnZT0gKGlkZWZsb3BweV9jYXBhYmlsaXRpZXNfcGFnZV90ICopKGhlYWRlcisxKTsKKwlmbG9wcHktPnNyZnAgPSBwYWdlLT5zcmZwOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKglEZXRlcm1pbmUgaWYgYSBtZWRpYSBpcyBwcmVzZW50IGluIHRoZSBmbG9wcHkgZHJpdmUsIGFuZCBpZiBzbywKKyAqCWl0cyBMQkEgY2FwYWNpdHkuCisgKi8KK3N0YXRpYyBpbnQgaWRlZmxvcHB5X2dldF9jYXBhY2l0eSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZWZsb3BweV9wY190IHBjOworCWlkZWZsb3BweV9jYXBhY2l0eV9oZWFkZXJfdCAqaGVhZGVyOworCWlkZWZsb3BweV9jYXBhY2l0eV9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3I7CisJaW50IGksIGRlc2NyaXB0b3JzLCByYyA9IDEsIGJsb2NrcywgbGVuZ3RoOworCQorCWRyaXZlLT5iaW9zX2N5bCA9IDA7CisJZHJpdmUtPmJpb3NfaGVhZCA9IGRyaXZlLT5iaW9zX3NlY3QgPSAwOworCWZsb3BweS0+YmxvY2tzID0gZmxvcHB5LT5ic19mYWN0b3IgPSAwOworCXNldF9jYXBhY2l0eShmbG9wcHktPmRpc2ssIDApOworCisJaWRlZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZCgmcGMpOworCWlmIChpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IENhbid0IGdldCBmbG9wcHkgcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiAxOworCX0KKwloZWFkZXIgPSAoaWRlZmxvcHB5X2NhcGFjaXR5X2hlYWRlcl90ICopIHBjLmJ1ZmZlcjsKKwlkZXNjcmlwdG9ycyA9IGhlYWRlci0+bGVuZ3RoIC8gc2l6ZW9mKGlkZWZsb3BweV9jYXBhY2l0eV9kZXNjcmlwdG9yX3QpOworCWRlc2NyaXB0b3IgPSAoaWRlZmxvcHB5X2NhcGFjaXR5X2Rlc2NyaXB0b3JfdCAqKSAoaGVhZGVyICsgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVzY3JpcHRvcnM7IGkrKywgZGVzY3JpcHRvcisrKSB7CisJCWJsb2NrcyA9IGRlc2NyaXB0b3ItPmJsb2NrcyA9IG50b2hsKGRlc2NyaXB0b3ItPmJsb2Nrcyk7CisJCWxlbmd0aCA9IGRlc2NyaXB0b3ItPmxlbmd0aCA9IG50b2hzKGRlc2NyaXB0b3ItPmxlbmd0aCk7CisKKwkJaWYgKCFpKSAKKwkJeworCQlzd2l0Y2ggKGRlc2NyaXB0b3ItPmRjKSB7CisJCS8qIENsaWshIGRyaXZlIHJldHVybnMgdGhpcyBpbnN0ZWFkIG9mIENBUEFDSVRZX0NVUlJFTlQgKi8KKwkJY2FzZSBDQVBBQ0lUWV9VTkZPUk1BVFRFRDoKKwkJCWlmICghdGVzdF9iaXQoSURFRkxPUFBZX0NMSUtfRFJJVkUsICZmbG9wcHktPmZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKwkJCQkgKiBJZiBpdCBpcyBub3QgYSBjbGlrIGRyaXZlLCBicmVhayBvdXQKKwkJCQkgKiAobWFpbnRhaW5zIHByZXZpb3VzIGRyaXZlciBiZWhhdmlvdXIpCisJCQkJICovCisJCQkJYnJlYWs7CisJCWNhc2UgQ0FQQUNJVFlfQ1VSUkVOVDoKKwkJCS8qIE5vcm1hbCBaaXAvTFMtMTIwIGRpc2tzICovCisJCQlpZiAobWVtY21wKGRlc2NyaXB0b3IsICZmbG9wcHktPmNhcGFjaXR5LCBzaXplb2YgKGlkZWZsb3BweV9jYXBhY2l0eV9kZXNjcmlwdG9yX3QpKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJWRrQiwgJWQgYmxvY2tzLCAlZCAiCisJCQkJCSJzZWN0b3Igc2l6ZVxuIiwgZHJpdmUtPm5hbWUsCisJCQkJCWJsb2NrcyAqIGxlbmd0aCAvIDEwMjQsIGJsb2NrcywgbGVuZ3RoKTsKKwkJCWZsb3BweS0+Y2FwYWNpdHkgPSAqZGVzY3JpcHRvcjsKKwkJCWlmICghbGVuZ3RoIHx8IGxlbmd0aCAlIDUxMikgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICVkIGJ5dGVzIGJsb2NrIHNpemUgIgorCQkJCQkibm90IHN1cHBvcnRlZFxuIiwgZHJpdmUtPm5hbWUsIGxlbmd0aCk7CisJCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9wcHktPmJsb2NrcyA9IGJsb2NrczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvcHB5LT5ibG9ja19zaXplID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsb3BweS0+YnNfZmFjdG9yID0gbGVuZ3RoIC8gNTEyKSAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHdhcm5pbmc6IG5vbiAiCisJCQkJCQkiNTEyIGJ5dGVzIGJsb2NrIHNpemUgbm90ICIKKwkJCQkJCSJmdWxseSBzdXBwb3J0ZWRcbiIsCisJCQkJCQlkcml2ZS0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENBUEFDSVRZX05PX0NBUlRSSURHRToKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgS0VSTl9FUlIgc28gaXQgYXBwZWFycyBvbiBzY3JlZW4KKwkJCSAqIGZvciB0aGUgdXNlciB0byBzZWUKKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gZGlzayBpbiBkcml2ZVxuIiwgZHJpdmUtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FQQUNJVFlfSU5WQUxJRDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgY2FwYWNpdHkgZm9yIGRpc2sgIgorCQkJCSJpbiBkcml2ZVxuIiwgZHJpdmUtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCQlpZiAoIWkpIHsKKwkJCWRlYnVnX2xvZyggIkRlc2NyaXB0b3IgMCBDb2RlOiAlZFxuIiwKKwkJCQlkZXNjcmlwdG9yLT5kYyk7CisJCX0KKwkJZGVidWdfbG9nKCAiRGVzY3JpcHRvciAlZDogJWRrQiwgJWQgYmxvY2tzLCAlZCAiCisJCQkic2VjdG9yIHNpemVcbiIsIGksIGJsb2NrcyAqIGxlbmd0aCAvIDEwMjQsIGJsb2NrcywKKwkJCWxlbmd0aCk7CisJfQorCisJLyogQ2xpayEgZGlzayBkb2VzIG5vdCBzdXBwb3J0IGdldF9mbGV4aWJsZV9kaXNrX3BhZ2UgKi8KKyAgICAgICAgaWYgKCF0ZXN0X2JpdChJREVGTE9QUFlfQ0xJS19EUklWRSwgJmZsb3BweS0+ZmxhZ3MpKSB7CisJCSh2b2lkKSBpZGVmbG9wcHlfZ2V0X2ZsZXhpYmxlX2Rpc2tfcGFnZShkcml2ZSk7CisJfQorCisJc2V0X2NhcGFjaXR5KGZsb3BweS0+ZGlzaywgZmxvcHB5LT5ibG9ja3MgKiBmbG9wcHktPmJzX2ZhY3Rvcik7CisJcmV0dXJuIHJjOworfQorCisvKgorKiogT2J0YWluIHRoZSBsaXN0IG9mIGZvcm1hdHRhYmxlIGNhcGFjaXRpZXMuCisqKiBWZXJ5IHNpbWlsYXIgdG8gaWRlZmxvcHB5X2dldF9jYXBhY2l0eSwgZXhjZXB0IHRoYXQgd2UgcHVzaCB0aGUgY2FwYWNpdHkKKyoqIGRlc2NyaXB0b3JzIHRvIHVzZXJsYW5kLCBpbnN0ZWFkIG9mIG91ciBvd24gc3RydWN0dXJlcy4KKyoqCisqKiBVc2VybGFuZCBnaXZlcyB1cyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyoqCisqKiBzdHJ1Y3QgaWRlZmxvcHB5X2Zvcm1hdF9jYXBhY2l0aWVzIHsKKyoqICAgICAgICBpbnQgbmZvcm1hdHM7CisqKiAgICAgICAgc3RydWN0IHsKKyoqICAgICAgICAgICAgICAgIGludCBuYmxvY2tzOworKiogICAgICAgICAgICAgICAgaW50IGJsb2Nrc2l6ZTsKKyoqICAgICAgICAgICAgICAgIH0gZm9ybWF0c1tdOworKiogICAgICAgIH0gOworKioKKyoqIHVzZXJsYW5kIGluaXRpYWxpemVzIG5mb3JtYXRzIHRvIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGZvcm1hdHNbXQorKiogcmVjb3Jkcy4gIE9uIGV4aXQgd2Ugc2V0IG5mb3JtYXRzIHRvIHRoZSBudW1iZXIgb2YgcmVjb3JkcyB3ZSd2ZQorKiogYWN0dWFsbHkgaW5pdGlhbGl6ZWQuCisqKgorKi8KKworc3RhdGljIGludCBpZGVmbG9wcHlfZ2V0X2Zvcm1hdF9jYXBhY2l0aWVzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IF9fdXNlciAqYXJnKQoreworICAgICAgICBpZGVmbG9wcHlfcGNfdCBwYzsKKwlpZGVmbG9wcHlfY2FwYWNpdHlfaGVhZGVyX3QgKmhlYWRlcjsKKyAgICAgICAgaWRlZmxvcHB5X2NhcGFjaXR5X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcjsKKwlpbnQgaSwgZGVzY3JpcHRvcnMsIGJsb2NrcywgbGVuZ3RoOworCWludCB1X2FycmF5X3NpemU7CisJaW50IHVfaW5kZXg7CisJaW50IF9fdXNlciAqYXJncDsKKworCWlmIChnZXRfdXNlcih1X2FycmF5X3NpemUsIGFyZykpCisJCXJldHVybiAoLUVGQVVMVCk7CisKKwlpZiAodV9hcnJheV9zaXplIDw9IDApCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlpZGVmbG9wcHlfY3JlYXRlX3JlYWRfY2FwYWNpdHlfY21kKCZwYyk7CisJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogQ2FuJ3QgZ2V0IGZsb3BweSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC1FSU8pOworICAgICAgICB9CisgICAgICAgIGhlYWRlciA9IChpZGVmbG9wcHlfY2FwYWNpdHlfaGVhZGVyX3QgKikgcGMuYnVmZmVyOworICAgICAgICBkZXNjcmlwdG9ycyA9IGhlYWRlci0+bGVuZ3RoIC8KKwkJc2l6ZW9mKGlkZWZsb3BweV9jYXBhY2l0eV9kZXNjcmlwdG9yX3QpOworCWRlc2NyaXB0b3IgPSAoaWRlZmxvcHB5X2NhcGFjaXR5X2Rlc2NyaXB0b3JfdCAqKSAoaGVhZGVyICsgMSk7CisKKwl1X2luZGV4ID0gMDsKKwlhcmdwID0gYXJnICsgMTsKKworCS8qCisJKiogV2UgYWx3YXlzIHNraXAgdGhlIGZpcnN0IGNhcGFjaXR5IGRlc2NyaXB0b3IuICBUaGF0J3MgdGhlCisJKiogY3VycmVudCBjYXBhY2l0eS4gIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSByZW1haW5pbmcgZGVzY3JpcHRvcnMsCisJKiogdGhlIGZvcm1hdHRhYmxlIGNhcGFjaXRpZXMuCisJKi8KKworCWZvciAoaT0wOyBpPGRlc2NyaXB0b3JzOyBpKyssIGRlc2NyaXB0b3IrKykgeworCQlpZiAodV9pbmRleCA+PSB1X2FycmF5X3NpemUpCisJCQlicmVhazsJLyogVXNlci1zdXBwbGllZCBidWZmZXIgdG9vIHNtYWxsICovCisJCWlmIChpID09IDApCisJCQljb250aW51ZTsJLyogU2tpcCB0aGUgZmlyc3QgZGVzY3JpcHRvciAqLworCisJCWJsb2NrcyA9IG50b2hsKGRlc2NyaXB0b3ItPmJsb2Nrcyk7CisJCWxlbmd0aCA9IG50b2hzKGRlc2NyaXB0b3ItPmxlbmd0aCk7CisKKwkJaWYgKHB1dF91c2VyKGJsb2NrcywgYXJncCkpCisJCQlyZXR1cm4oLUVGQVVMVCk7CisJCSsrYXJncDsKKworCQlpZiAocHV0X3VzZXIobGVuZ3RoLCBhcmdwKSkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCSsrYXJncDsKKworCQkrK3VfaW5kZXg7CisJfQorCisJaWYgKHB1dF91c2VyKHVfaW5kZXgsIGFyZykpCisJCXJldHVybiAoLUVGQVVMVCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyoqIFNlbmQgQVRBUElfRk9STUFUX1VOSVQgdG8gdGhlIGRyaXZlLgorKioKKyoqIFVzZXJsYW5kIGdpdmVzIHVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorKioKKyoqIHN0cnVjdCBpZGVmbG9wcHlfZm9ybWF0X2NvbW1hbmQgeworKiogICAgICAgIGludCBuYmxvY2tzOworKiogICAgICAgIGludCBibG9ja3NpemU7CisqKiAgICAgICAgaW50IGZsYWdzOworKiogICAgICAgIH0gOworKioKKyoqIGZsYWdzIGlzIGEgYml0bWFzaywgY3VycmVudGx5LCB0aGUgb25seSBkZWZpbmVkIGZsYWcgaXM6CisqKgorKiogICAgICAgIDB4MDEgLSB2ZXJpZnkgbWVkaWEgYWZ0ZXIgZm9ybWF0LgorKi8KKworc3RhdGljIGludCBpZGVmbG9wcHlfYmVnaW5fZm9ybWF0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IF9fdXNlciAqYXJnKQoreworCWludCBibG9ja3M7CisJaW50IGxlbmd0aDsKKwlpbnQgZmxhZ3M7CisJaWRlZmxvcHB5X3BjX3QgcGM7CisKKwlpZiAoZ2V0X3VzZXIoYmxvY2tzLCBhcmcpIHx8CisJICAgIGdldF91c2VyKGxlbmd0aCwgYXJnKzEpIHx8CisJICAgIGdldF91c2VyKGZsYWdzLCBhcmcrMikpIHsKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwl9CisKKwkvKiBHZXQgdGhlIFNGUlAgYml0ICovCisJKHZvaWQpIGlkZWZsb3BweV9nZXRfY2FwYWJpbGl0eV9wYWdlKGRyaXZlKTsKKwlpZGVmbG9wcHlfY3JlYXRlX2Zvcm1hdF91bml0X2NtZCgmcGMsIGJsb2NrcywgbGVuZ3RoLCBmbGFncyk7CisJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKgorKiogR2V0IEFUQVBJX0ZPUk1BVF9VTklUIHByb2dyZXNzIGluZGljYXRpb24uCisqKgorKiogVXNlcmxhbmQgZ2l2ZXMgYSBwb2ludGVyIHRvIGFuIGludC4gIFRoZSBpbnQgaXMgc2V0IHRvIGEgcHJvZ3Jlc3NzCisqKiBpbmRpY2F0b3IgMC02NTUzNiwgd2l0aCA2NTUzNj0xMDAlLgorKioKKyoqIElmIHRoZSBkcml2ZSBkb2VzIG5vdCBzdXBwb3J0IGZvcm1hdCBwcm9ncmVzcyBpbmRpY2F0aW9uLCB3ZSBqdXN0IGNoZWNrCisqKiB0aGUgZHNjIGJpdCwgYW5kIHJldHVybiBlaXRoZXIgMCBvciA2NTUzNi4KKyovCisKK3N0YXRpYyBpbnQgaWRlZmxvcHB5X2dldF9mb3JtYXRfcHJvZ3Jlc3MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgX191c2VyICphcmcpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlZmxvcHB5X3BjX3QgcGM7CisJaW50IHByb2dyZXNzX2luZGljYXRpb24gPSAweDEwMDAwOworCisJaWYgKGZsb3BweS0+c3JmcCkgeworCQlpZGVmbG9wcHlfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kKCZwYyk7CisJCWlmIChpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgeworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCisJCWlmIChmbG9wcHktPnNlbnNlX2tleSA9PSAyICYmCisJCSAgICBmbG9wcHktPmFzYyA9PSA0ICYmCisJCSAgICBmbG9wcHktPmFzY3EgPT0gNCkgeworCQkJcHJvZ3Jlc3NfaW5kaWNhdGlvbiA9IGZsb3BweS0+cHJvZ3Jlc3NfaW5kaWNhdGlvbjsKKwkJfQorCQkvKiBFbHNlIGFzc3VtZSBmb3JtYXRfdW5pdCBoYXMgZmluaXNoZWQsIGFuZCB3ZSdyZQorCQkqKiBhdCAweDEwMDAwICovCisJfSBlbHNlIHsKKwkJYXRhcGlfc3RhdHVzX3Qgc3RhdHVzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJc3RhdHVzLmFsbCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX1NUQVRVU19SRUcpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJcHJvZ3Jlc3NfaW5kaWNhdGlvbiA9ICFzdGF0dXMuYi5kc2MgPyAwIDogMHgxMDAwMDsKKwl9CisJaWYgKHB1dF91c2VyKHByb2dyZXNzX2luZGljYXRpb24sIGFyZykpCisJCXJldHVybiAoLUVGQVVMVCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJUmV0dXJuIHRoZSBjdXJyZW50IGZsb3BweSBjYXBhY2l0eS4KKyAqLworc3RhdGljIHNlY3Rvcl90IGlkZWZsb3BweV9jYXBhY2l0eSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHkgPSBmbG9wcHktPmJsb2NrcyAqIGZsb3BweS0+YnNfZmFjdG9yOworCisJcmV0dXJuIGNhcGFjaXR5OworfQorCisvKgorICoJaWRlZmxvcHB5X2lkZW50aWZ5X2RldmljZSBjaGVja3MgaWYgd2UgY2FuIHN1cHBvcnQgYSBkcml2ZSwKKyAqCWJhc2VkIG9uIHRoZSBBVEFQSSBJREVOVElGWSBjb21tYW5kIHJlc3VsdHMuCisgKi8KK3N0YXRpYyBpbnQgaWRlZmxvcHB5X2lkZW50aWZ5X2RldmljZSAoaWRlX2RyaXZlX3QgKmRyaXZlLHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKwlzdHJ1Y3QgaWRlZmxvcHB5X2lkX2djdyBnY3c7CisjaWYgSURFRkxPUFBZX0RFQlVHX0lORk8KKwl1MTYgbWFzayxpOworCWNoYXIgYnVmZmVyWzgwXTsKKyNlbmRpZiAvKiBJREVGTE9QUFlfREVCVUdfSU5GTyAqLworCisJKigodTE2ICopICZnY3cpID0gaWQtPmNvbmZpZzsKKworI2lmZGVmIENPTkZJR19QUEMKKwkvKiBrbHVkZ2UgZm9yIEFwcGxlIFBvd2VyQm9vayBpbnRlcm5hbCB6aXAgKi8KKwlpZiAoKGdjdy5kZXZpY2VfdHlwZSA9PSA1KSAmJgorCSAgICAhc3Ryc3RyKGlkLT5tb2RlbCwgIkNELVJPTSIpICYmCisJICAgIHN0cnN0cihpZC0+bW9kZWwsICJaSVAiKSkKKwkJZ2N3LmRldmljZV90eXBlID0gMDsJCQkKKyNlbmRpZgorCisjaWYgSURFRkxPUFBZX0RFQlVHX0lORk8KKwlwcmludGsoS0VSTl9JTkZPICJEdW1waW5nIEFUQVBJIElkZW50aWZ5IERldmljZSBmbG9wcHkgcGFyYW1ldGVyc1xuIik7CisJc3dpdGNoIChnY3cucHJvdG9jb2wpIHsKKwkJY2FzZSAwOiBjYXNlIDE6IHNwcmludGYoYnVmZmVyLCAiQVRBIik7YnJlYWs7CisJCWNhc2UgMjoJc3ByaW50ZihidWZmZXIsICJBVEFQSSIpO2JyZWFrOworCQljYXNlIDM6IHNwcmludGYoYnVmZmVyLCAiUmVzZXJ2ZWQgKFVua25vd24gdG8gaWRlLWZsb3BweSkiKTticmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvdG9jb2wgVHlwZTogJXNcbiIsIGJ1ZmZlcik7CisJc3dpdGNoIChnY3cuZGV2aWNlX3R5cGUpIHsKKwkJY2FzZSAwOiBzcHJpbnRmKGJ1ZmZlciwgIkRpcmVjdC1hY2Nlc3MgRGV2aWNlIik7YnJlYWs7CisJCWNhc2UgMTogc3ByaW50ZihidWZmZXIsICJTdHJlYW1pbmcgVGFwZSBEZXZpY2UiKTticmVhazsKKwkJY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogc3ByaW50ZiAoYnVmZmVyLCAiUmVzZXJ2ZWQiKTticmVhazsKKwkJY2FzZSA1OiBzcHJpbnRmKGJ1ZmZlciwgIkNELVJPTSBEZXZpY2UiKTticmVhazsKKwkJY2FzZSA2OiBzcHJpbnRmKGJ1ZmZlciwgIlJlc2VydmVkIik7CisJCWNhc2UgNzogc3ByaW50ZihidWZmZXIsICJPcHRpY2FsIG1lbW9yeSBEZXZpY2UiKTticmVhazsKKwkJY2FzZSAweDFmOiBzcHJpbnRmKGJ1ZmZlciwgIlVua25vd24gb3Igbm8gRGV2aWNlIHR5cGUiKTticmVhazsKKwkJZGVmYXVsdDogc3ByaW50ZihidWZmZXIsICJSZXNlcnZlZCIpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgVHlwZTogJXggLSAlc1xuIiwgZ2N3LmRldmljZV90eXBlLCBidWZmZXIpOworCXByaW50ayhLRVJOX0lORk8gIlJlbW92YWJsZTogJXNcbiIsZ2N3LnJlbW92YWJsZSA/ICJZZXMiOiJObyIpOwkKKwlzd2l0Y2ggKGdjdy5kcnFfdHlwZSkgeworCQljYXNlIDA6IHNwcmludGYoYnVmZmVyLCAiTWljcm9wcm9jZXNzb3IgRFJRIik7YnJlYWs7CisJCWNhc2UgMTogc3ByaW50ZihidWZmZXIsICJJbnRlcnJ1cHQgRFJRIik7YnJlYWs7CisJCWNhc2UgMjogc3ByaW50ZihidWZmZXIsICJBY2NlbGVyYXRlZCBEUlEiKTticmVhazsKKwkJY2FzZSAzOiBzcHJpbnRmKGJ1ZmZlciwgIlJlc2VydmVkIik7YnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkNvbW1hbmQgUGFja2V0IERSUSBUeXBlOiAlc1xuIiwgYnVmZmVyKTsKKwlzd2l0Y2ggKGdjdy5wYWNrZXRfc2l6ZSkgeworCQljYXNlIDA6IHNwcmludGYoYnVmZmVyLCAiMTIgYnl0ZXMiKTticmVhazsKKwkJY2FzZSAxOiBzcHJpbnRmKGJ1ZmZlciwgIjE2IGJ5dGVzIik7YnJlYWs7CisJCWRlZmF1bHQ6IHNwcmludGYoYnVmZmVyLCAiUmVzZXJ2ZWQiKTticmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiQ29tbWFuZCBQYWNrZXQgU2l6ZTogJXNcbiIsIGJ1ZmZlcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTW9kZWw6ICUuNDBzXG4iLGlkLT5tb2RlbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRmlybXdhcmUgUmV2aXNpb246ICUuOHNcbiIsaWQtPmZ3X3Jldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU2VyaWFsIE51bWJlcjogJS4yMHNcbiIsaWQtPnNlcmlhbF9ubyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiV3JpdGUgYnVmZmVyIHNpemUoPyk6ICVkIGJ5dGVzXG4iLGlkLT5idWZfc2l6ZSo1MTIpOworCXByaW50ayhLRVJOX0lORk8gIkRNQTogJXMiLGlkLT5jYXBhYmlsaXR5ICYgMHgwMSA/ICJZZXNcbiI6Ik5vXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJMQkE6ICVzIixpZC0+Y2FwYWJpbGl0eSAmIDB4MDIgPyAiWWVzXG4iOiJOb1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiSU9SRFkgY2FuIGJlIGRpc2FibGVkOiAlcyIsaWQtPmNhcGFiaWxpdHkgJiAweDA0ID8gIlllc1xuIjoiTm9cbiIpOworCXByaW50ayhLRVJOX0lORk8gIklPUkRZIHN1cHBvcnRlZDogJXMiLGlkLT5jYXBhYmlsaXR5ICYgMHgwOCA/ICJZZXNcbiI6IlVua25vd25cbiIpOworCXByaW50ayhLRVJOX0lORk8gIkFUQVBJIG92ZXJsYXAgc3VwcG9ydGVkOiAlcyIsaWQtPmNhcGFiaWxpdHkgJiAweDIwID8gIlllc1xuIjoiTm9cbiIpOworCXByaW50ayhLRVJOX0lORk8gIlBJTyBDeWNsZSBUaW1pbmcgQ2F0ZWdvcnk6ICVkXG4iLGlkLT50UElPKTsKKwlwcmludGsoS0VSTl9JTkZPICJETUEgQ3ljbGUgVGltaW5nIENhdGVnb3J5OiAlZFxuIixpZC0+dERNQSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiU2luZ2xlIFdvcmQgRE1BIHN1cHBvcnRlZCBtb2RlczpcbiIpOworCWZvciAoaT0wLG1hc2s9MTtpPDg7aSsrLG1hc2s9bWFzayA8PCAxKSB7CisJCWlmIChpZC0+ZG1hXzF3b3JkICYgbWFzaykKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgIE1vZGUgJWQlc1xuIiwgaSwKKwkJCShpZC0+ZG1hXzF3b3JkICYgKG1hc2sgPDwgOCkpID8gIiAoYWN0aXZlKSIgOiAiIik7CisJfQorCXByaW50ayhLRVJOX0lORk8gIk11bHRpIFdvcmQgRE1BIHN1cHBvcnRlZCBtb2RlczpcbiIpOworCWZvciAoaT0wLG1hc2s9MTtpPDg7aSsrLG1hc2s9bWFzayA8PCAxKSB7CisJCWlmIChpZC0+ZG1hX213b3JkICYgbWFzaykKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgIE1vZGUgJWQlc1xuIiwgaSwKKwkJCShpZC0+ZG1hX213b3JkICYgKG1hc2sgPDwgOCkpID8gIiAoYWN0aXZlKSIgOiAiIik7CisJfQorCWlmIChpZC0+ZmllbGRfdmFsaWQgJiAweDAwMDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRW5oYW5jZWQgUElPIE1vZGVzOiAlc1xuIiwKKwkJCWlkLT5laWRlX3Bpb19tb2RlcyAmIDEgPyAiTW9kZSAzIjoiTm9uZSIpOworCQlpZiAoaWQtPmVpZGVfZG1hX21pbiA9PSAwKQorCQkJc3ByaW50ZihidWZmZXIsICJOb3Qgc3VwcG9ydGVkIik7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmZmVyLCAiJWQgbnMiLGlkLT5laWRlX2RtYV9taW4pOworCQlwcmludGsoS0VSTl9JTkZPICJNaW5pbXVtIE11bHRpLXdvcmQgRE1BIGN5Y2xlIHBlciB3b3JkOiAlc1xuIiwgYnVmZmVyKTsKKwkJaWYgKGlkLT5laWRlX2RtYV90aW1lID09IDApCisJCQlzcHJpbnRmKGJ1ZmZlciwgIk5vdCBzdXBwb3J0ZWQiKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWZmZXIsICIlZCBucyIsaWQtPmVpZGVfZG1hX3RpbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJNYW51ZmFjdHVyZXJcJ3MgUmVjb21tZW5kZWQgTXVsdGktd29yZCBjeWNsZTogJXNcbiIsIGJ1ZmZlcik7CisJCWlmIChpZC0+ZWlkZV9waW8gPT0gMCkKKwkJCXNwcmludGYoYnVmZmVyLCAiTm90IHN1cHBvcnRlZCIpOworCQllbHNlCisJCQlzcHJpbnRmKGJ1ZmZlciwgIiVkIG5zIixpZC0+ZWlkZV9waW8pOworCQlwcmludGsoS0VSTl9JTkZPICJNaW5pbXVtIFBJTyBjeWNsZSB3aXRob3V0IElPUkRZOiAlc1xuIiwKKwkJCWJ1ZmZlcik7CisJCWlmIChpZC0+ZWlkZV9waW9faW9yZHkgPT0gMCkKKwkJCXNwcmludGYoYnVmZmVyLCAiTm90IHN1cHBvcnRlZCIpOworCQllbHNlCisJCQlzcHJpbnRmKGJ1ZmZlciwgIiVkIG5zIixpZC0+ZWlkZV9waW9faW9yZHkpOworCQlwcmludGsoS0VSTl9JTkZPICJNaW5pbXVtIFBJTyBjeWNsZSB3aXRoIElPUkRZOiAlc1xuIiwgYnVmZmVyKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UsIGZpZWxkcyA2NC03MCBhcmUgbm90IHZhbGlkLlxuIik7CisjZW5kaWYgLyogSURFRkxPUFBZX0RFQlVHX0lORk8gKi8KKworCWlmIChnY3cucHJvdG9jb2wgIT0gMikKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBQcm90b2NvbCBpcyBub3QgQVRBUElcbiIpOworCWVsc2UgaWYgKGdjdy5kZXZpY2VfdHlwZSAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IERldmljZSB0eXBlIGlzIG5vdCBzZXQgdG8gZmxvcHB5XG4iKTsKKwllbHNlIGlmICghZ2N3LnJlbW92YWJsZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBUaGUgcmVtb3ZhYmxlIGZsYWcgaXMgbm90IHNldFxuIik7CisJZWxzZSBpZiAoZ2N3LmRycV90eXBlID09IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBTb3JyeSwgRFJRIHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwgZ2N3LmRycV90eXBlKTsKKwl9IGVsc2UgaWYgKGdjdy5wYWNrZXRfc2l6ZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogUGFja2V0IHNpemUgaXMgbm90IDEyIGJ5dGVzIGxvbmdcbiIpOworCX0gZWxzZQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWRlZmxvcHB5X2FkZF9zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKy8qCisgKgkJCWRyaXZlCXNldHRpbmcgbmFtZQlyZWFkL3dyaXRlCWlvY3RsCWlvY3RsCQlkYXRhIHR5cGUJbWluCW1heAltdWxfZmFjdG9yCWRpdl9mYWN0b3IJZGF0YSBwb2ludGVyCQlzZXQgZnVuY3Rpb24KKyAqLworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3NfY3lsIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0lOVCwJMCwJMTAyMywJCQkJMSwJMSwJJmRyaXZlLT5iaW9zX2N5bCwJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3NfaGVhZCIsCQlTRVRUSU5HX1JXLAkJCQkJLTEsCQkJLTEsCQkJVFlQRV9CWVRFLAkwLAkyNTUsCQkJCTEsCTEsCSZkcml2ZS0+Ymlvc19oZWFkLAkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYmlvc19zZWN0IiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0JZVEUsCTAsCTYzLAkJCQkxLAkxLAkmZHJpdmUtPmJpb3Nfc2VjdCwJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInRpY2tzIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0JZVEUsCTAsCTI1NSwJCQkJMSwJMSwJJmZsb3BweS0+dGlja3MsCQlOVUxMKTsKK30KKworLyoKKyAqCURyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWRlZmxvcHB5X3NldHVwIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5KQoreworCXN0cnVjdCBpZGVmbG9wcHlfaWRfZ2N3IGdjdzsKKworCSooKHUxNiAqKSAmZ2N3KSA9IGRyaXZlLT5pZC0+Y29uZmlnOworCWZsb3BweS0+cGMgPSBmbG9wcHktPnBjX3N0YWNrOworCWlmIChnY3cuZHJxX3R5cGUgPT0gMSkKKwkJc2V0X2JpdChJREVGTE9QUFlfRFJRX0lOVEVSUlVQVCwgJmZsb3BweS0+ZmxhZ3MpOworCS8qCisJICoJV2UgdXNlZCB0byBjaGVjayByZXZpc2lvbnMgaGVyZS4gQXQgdGhpcyBwb2ludCBob3dldmVyCisJICoJSSdtIGdpdmluZyB1cC4gSnVzdCBhc3N1bWUgdGhleSBhcmUgYWxsIGJyb2tlbiwgaXRzIGVhc2llci4KKwkgKgorCSAqCVRoZSBhY3R1YWwgcmVhc29uIGZvciB0aGUgd29ya2Fyb3VuZHMgd2FzIGxpa2VseQorCSAqCWEgZHJpdmVyIGJ1ZyBhZnRlciBhbGwgcmF0aGVyIHRoYW4gYSBmaXJtd2FyZSBidWcsCisJICoJYW5kIHRoZSB3b3JrYXJvdW5kIGJlbG93IHVzZWQgdG8gaGlkZSBpdC4gSXQgc2hvdWxkCisJICoJYmUgZml4ZWQgYXMgb2YgdmVyc2lvbiAxLjksIGJ1dCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCisJICoJd2UnbGwgbGVhdmUgdGhlIGxpbWl0YXRpb24gYmVsb3cgZm9yIHRoZSAyLjIueCB0cmVlLgorCSAqLworCisJaWYgKCFzdHJuY21wKGRyaXZlLT5pZC0+bW9kZWwsICJJT01FR0EgWklQIDEwMCBBVEFQSSIsIDIwKSkgeworCQlzZXRfYml0KElERUZMT1BQWV9aSVBfRFJJVkUsICZmbG9wcHktPmZsYWdzKTsKKwkJLyogVGhpcyB2YWx1ZSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIC9wcm9jL2lkZS9oZHgvc2V0dGluZ3MgKi8KKwkJZmxvcHB5LT50aWNrcyA9IElERUZMT1BQWV9USUNLU19ERUxBWTsKKwkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGRyaXZlLT5xdWV1ZSwgNjQpOworCX0KKworCS8qCisJKiAgICAgIEd1ZXNzIHdoYXQ/ICBUaGUgSU9NRUdBIENsaWshIGRyaXZlIGFsc28gbmVlZHMgdGhlCisJKiAgICAgIGFib3ZlIGZpeC4gIEl0IG1ha2VzIG5hc3R5IGNsaWNraW5nIG5vaXNlcyB3aXRob3V0CisJKiAgICAgIGl0LCBzbyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMuCisJKi8KKwlpZiAoc3RybmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiSU9NRUdBIENsaWshIiwgMTEpID09IDApIHsKKwkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGRyaXZlLT5xdWV1ZSwgNjQpOworCQlzZXRfYml0KElERUZMT1BQWV9DTElLX0RSSVZFLCAmZmxvcHB5LT5mbGFncyk7CisJfQorCisKKwkodm9pZCkgaWRlZmxvcHB5X2dldF9jYXBhY2l0eShkcml2ZSk7CisJaWRlZmxvcHB5X2FkZF9zZXR0aW5ncyhkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWRlZmxvcHB5X2NsZWFudXAgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGZsb3BweS0+ZGlzazsKKworCWlmIChpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUpKQorCQlyZXR1cm4gMTsKKworCWRlbF9nZW5kaXNrKGcpOworCisJaWRlX2Zsb3BweV9wdXQoZmxvcHB5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpZGVfZmxvcHB5X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSB0b19pZGVfZmxvcHB5KGtyZWYpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CisJc3RydWN0IGdlbmRpc2sgKmcgPSBmbG9wcHktPmRpc2s7CisKKwlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCWctPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcHV0X2Rpc2soZyk7CisJa2ZyZWUoZmxvcHB5KTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBpbnQgcHJvY19pZGVmbG9wcHlfcmVhZF9jYXBhY2l0eQorCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfZHJpdmVfdCpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwiJWxsdVxuIiwgKGxvbmcgbG9uZylpZGVmbG9wcHlfY2FwYWNpdHkoZHJpdmUpKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGlkZV9wcm9jX2VudHJ5X3QgaWRlZmxvcHB5X3Byb2NbXSA9IHsKKwl7ICJjYXBhY2l0eSIsCVNfSUZSRUd8U19JUlVHTywJcHJvY19pZGVmbG9wcHlfcmVhZF9jYXBhY2l0eSwgTlVMTCB9LAorCXsgImdlb21ldHJ5IiwJU19JRlJFR3xTX0lSVUdPLAlwcm9jX2lkZV9yZWFkX2dlb21ldHJ5LAlOVUxMIH0sCisJeyBOVUxMLCAwLCBOVUxMLCBOVUxMIH0KK307CisKKyNlbHNlCisKKyNkZWZpbmUJaWRlZmxvcHB5X3Byb2MJTlVMTAorCisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIGludCBpZGVmbG9wcHlfYXR0YWNoKGlkZV9kcml2ZV90ICpkcml2ZSk7CisKKy8qCisgKglJREUgc3ViZHJpdmVyIGZ1bmN0aW9ucywgcmVnaXN0ZXJlZCB3aXRoIGlkZS5jCisgKi8KK3N0YXRpYyBpZGVfZHJpdmVyX3QgaWRlZmxvcHB5X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiaWRlLWZsb3BweSIsCisJLnZlcnNpb24JCT0gSURFRkxPUFBZX1ZFUlNJT04sCisJLm1lZGlhCQkJPSBpZGVfZmxvcHB5LAorCS5idXN5CQkJPSAwLAorCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDAsCisJLmNsZWFudXAJCT0gaWRlZmxvcHB5X2NsZWFudXAsCisJLmRvX3JlcXVlc3QJCT0gaWRlZmxvcHB5X2RvX3JlcXVlc3QsCisJLmVuZF9yZXF1ZXN0CQk9IGlkZWZsb3BweV9kb19lbmRfcmVxdWVzdCwKKwkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAorCS5hYm9ydAkJCT0gX19pZGVfYWJvcnQsCisJLnByb2MJCQk9IGlkZWZsb3BweV9wcm9jLAorCS5hdHRhY2gJCQk9IGlkZWZsb3BweV9hdHRhY2gsCisJLmRyaXZlcwkJCT0gTElTVF9IRUFEX0lOSVQoaWRlZmxvcHB5X2RyaXZlci5kcml2ZXMpLAorfTsKKworc3RhdGljIGludCBpZGVmbG9wcHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHk7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWlkZWZsb3BweV9wY190IHBjOworCWludCByZXQgPSAwOworCisJZGVidWdfbG9nKEtFUk5fSU5GTyAiUmVhY2hlZCBpZGVmbG9wcHlfb3BlblxuIik7CisKKwlpZiAoIShmbG9wcHkgPSBpZGVfZmxvcHB5X2dldChkaXNrKSkpCisJCXJldHVybiAtRU5YSU87CisKKwlkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CisKKwlkcml2ZS0+dXNhZ2UrKzsKKworCWlmIChkcml2ZS0+dXNhZ2UgPT0gMSkgeworCQljbGVhcl9iaXQoSURFRkxPUFBZX0ZPUk1BVF9JTl9QUk9HUkVTUywgJmZsb3BweS0+ZmxhZ3MpOworCQkvKiBKdXN0IGluIGNhc2UgKi8KKworCQlpZGVmbG9wcHlfY3JlYXRlX3Rlc3RfdW5pdF9yZWFkeV9jbWQoJnBjKTsKKwkJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisJCQlpZGVmbG9wcHlfY3JlYXRlX3N0YXJ0X3N0b3BfY21kKCZwYywgMSk7CisJCQkodm9pZCkgaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCX0KKworCQlpZiAoaWRlZmxvcHB5X2dldF9jYXBhY2l0eSAoZHJpdmUpCisJCSAgICYmIChmaWxwLT5mX2ZsYWdzICYgT19OREVMQVkpID09IDAKKwkJICAgIC8qCisJCSAgICAqKiBBbGxvdyBPX05ERUxBWSB0byBvcGVuIGEgZHJpdmUgd2l0aG91dCBhIGRpc2ssIG9yIHdpdGgKKwkJICAgICoqIGFuIHVucmVhZGFibGUgZGlzaywgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBmb3JtYXQKKwkJICAgICoqIGNhcGFjaXR5IG9mIHRoZSBkcml2ZSBvciBiZWdpbiB0aGUgZm9ybWF0IC0gU2FtCisJCSAgICAqLworCQkgICAgKSB7CisJCQlkcml2ZS0+dXNhZ2UtLTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dF9wdXRfZmxvcHB5OworCQl9CisKKwkJaWYgKGZsb3BweS0+d3AgJiYgKGZpbHAtPmZfbW9kZSAmIDIpKSB7CisJCQlkcml2ZS0+dXNhZ2UtLTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0X3B1dF9mbG9wcHk7CisJCX0KKwkJc2V0X2JpdChJREVGTE9QUFlfTUVESUFfQ0hBTkdFRCwgJmZsb3BweS0+ZmxhZ3MpOworCQkvKiBJT01FR0EgQ2xpayEgZHJpdmVzIGRvIG5vdCBzdXBwb3J0IGxvY2svdW5sb2NrIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgaWYgKCF0ZXN0X2JpdChJREVGTE9QUFlfQ0xJS19EUklWRSwgJmZsb3BweS0+ZmxhZ3MpKSB7CisJCQlpZGVmbG9wcHlfY3JlYXRlX3ByZXZlbnRfY21kKCZwYywgMSk7CisJCQkodm9pZCkgaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCX0KKwkJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChJREVGTE9QUFlfRk9STUFUX0lOX1BST0dSRVNTLCAmZmxvcHB5LT5mbGFncykpIHsKKwkJZHJpdmUtPnVzYWdlLS07CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfcHV0X2Zsb3BweTsKKwl9CisJcmV0dXJuIDA7CisKK291dF9wdXRfZmxvcHB5OgorCWlkZV9mbG9wcHlfcHV0KGZsb3BweSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZGVmbG9wcHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSBpZGVfZmxvcHB5X2coZGlzayk7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gZmxvcHB5LT5kcml2ZTsKKwlpZGVmbG9wcHlfcGNfdCBwYzsKKwkKKwlkZWJ1Z19sb2coS0VSTl9JTkZPICJSZWFjaGVkIGlkZWZsb3BweV9yZWxlYXNlXG4iKTsKKworCWlmIChkcml2ZS0+dXNhZ2UgPT0gMSkgeworCQkvKiBJT01FR0EgQ2xpayEgZHJpdmVzIGRvIG5vdCBzdXBwb3J0IGxvY2svdW5sb2NrIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgaWYgKCF0ZXN0X2JpdChJREVGTE9QUFlfQ0xJS19EUklWRSwgJmZsb3BweS0+ZmxhZ3MpKSB7CisJCQlpZGVmbG9wcHlfY3JlYXRlX3ByZXZlbnRfY21kKCZwYywgMCk7CisJCQkodm9pZCkgaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCX0KKworCQljbGVhcl9iaXQoSURFRkxPUFBZX0ZPUk1BVF9JTl9QUk9HUkVTUywgJmZsb3BweS0+ZmxhZ3MpOworCX0KKwlkcml2ZS0+dXNhZ2UtLTsKKworCWlkZV9mbG9wcHlfcHV0KGZsb3BweSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVmbG9wcHlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGlkZV9mbG9wcHlfZyhiZGV2LT5iZF9kaXNrKTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBmbG9wcHktPmRyaXZlOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBlcnIgPSBnZW5lcmljX2lkZV9pb2N0bChkcml2ZSwgZmlsZSwgYmRldiwgY21kLCBhcmcpOworCWludCBwcmV2ZW50ID0gKGFyZykgPyAxIDogMDsKKwlpZGVmbG9wcHlfcGNfdCBwYzsKKwlpZiAoZXJyICE9IC1FSU5WQUwpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ0RST01FSkVDVDoKKwkJcHJldmVudCA9IDA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgQ0RST01fTE9DS0RPT1I6CisJCWlmIChkcml2ZS0+dXNhZ2UgPiAxKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQkvKiBUaGUgSU9NRUdBIENsaWshIERyaXZlIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQgLSBubyByb29tIGZvciBhbiBlamVjdCBtZWNoYW5pc20gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXRlc3RfYml0KElERUZMT1BQWV9DTElLX0RSSVZFLCAmZmxvcHB5LT5mbGFncykpIHsKKwkJCWlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQoJnBjLCBwcmV2ZW50KTsKKwkJCSh2b2lkKSBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJfQorCQlpZiAoY21kID09IENEUk9NRUpFQ1QpIHsKKwkJCWlkZWZsb3BweV9jcmVhdGVfc3RhcnRfc3RvcF9jbWQoJnBjLCAyKTsKKwkJCSh2b2lkKSBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1VQUE9SVEVEOgorCQlyZXR1cm4gMDsKKwljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX0NBUEFDSVRZOgorCQlyZXR1cm4gaWRlZmxvcHB5X2dldF9mb3JtYXRfY2FwYWNpdGllcyhkcml2ZSwgYXJncCk7CisJY2FzZSBJREVGTE9QUFlfSU9DVExfRk9STUFUX1NUQVJUOgorCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIDIpKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZHJpdmUtPnVzYWdlID4gMSkgeworCQkJLyogRG9uJ3QgZm9ybWF0IGlmIHNvbWVvbmUgaXMgdXNpbmcgdGhlIGRpc2sgKi8KKworCQkJY2xlYXJfYml0KElERUZMT1BQWV9GT1JNQVRfSU5fUFJPR1JFU1MsCisJCQkJICAmZmxvcHB5LT5mbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJc2V0X2JpdChJREVGTE9QUFlfRk9STUFUX0lOX1BST0dSRVNTLCAmZmxvcHB5LT5mbGFncyk7CisKKwkJZXJyID0gaWRlZmxvcHB5X2JlZ2luX2Zvcm1hdChkcml2ZSwgYXJncCk7CisJCWlmIChlcnIpCisJCQljbGVhcl9iaXQoSURFRkxPUFBZX0ZPUk1BVF9JTl9QUk9HUkVTUywgJmZsb3BweS0+ZmxhZ3MpOworCQlyZXR1cm4gZXJyOworCQkvKgorCQkqKiBOb3RlLCB0aGUgYml0IHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBkZXZpY2UgaXMKKwkJKiogY2xvc2VkLiAgVGhpcyBpcyB0aGUgY2xlYW5lc3Qgd2F5IHRvIGhhbmRsZSB0aGUKKwkJKiogc2l0dWF0aW9uIHdoZXJlIHRoZSBkcml2ZSBkb2VzIG5vdCBzdXBwb3J0CisJCSoqIGZvcm1hdCBwcm9ncmVzcyByZXBvcnRpbmcuCisJCSovCisJY2FzZSBJREVGTE9QUFlfSU9DVExfRk9STUFUX0dFVF9QUk9HUkVTUzoKKwkJcmV0dXJuIGlkZWZsb3BweV9nZXRfZm9ybWF0X3Byb2dyZXNzKGRyaXZlLCBhcmdwKTsKKwl9CisgCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGlkZWZsb3BweV9tZWRpYV9jaGFuZ2VkKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gaWRlX2Zsb3BweV9nKGRpc2spOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CisKKwkvKiBkbyBub3Qgc2NhbiBwYXJ0aXRpb25zIHR3aWNlIGlmIHRoaXMgaXMgYSByZW1vdmFibGUgZGV2aWNlICovCisJaWYgKGRyaXZlLT5hdHRhY2gpIHsKKwkJZHJpdmUtPmF0dGFjaCA9IDA7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KElERUZMT1BQWV9NRURJQV9DSEFOR0VELCAmZmxvcHB5LT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaWRlZmxvcHB5X3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGlkZV9mbG9wcHlfZyhkaXNrKTsKKwlzZXRfY2FwYWNpdHkoZGlzaywgaWRlZmxvcHB5X2NhcGFjaXR5KGZsb3BweS0+ZHJpdmUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBpZGVmbG9wcHlfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpZGVmbG9wcHlfb3BlbiwKKwkucmVsZWFzZQk9IGlkZWZsb3BweV9yZWxlYXNlLAorCS5pb2N0bAkJPSBpZGVmbG9wcHlfaW9jdGwsCisJLm1lZGlhX2NoYW5nZWQJPSBpZGVmbG9wcHlfbWVkaWFfY2hhbmdlZCwKKwkucmV2YWxpZGF0ZV9kaXNrPSBpZGVmbG9wcHlfcmV2YWxpZGF0ZV9kaXNrCit9OworCitzdGF0aWMgaW50IGlkZWZsb3BweV9hdHRhY2ggKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZzsKKworCWlmICghc3Ryc3RyKCJpZGUtZmxvcHB5IiwgZHJpdmUtPmRyaXZlcl9yZXEpKQorCQlnb3RvIGZhaWxlZDsKKwlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQlnb3RvIGZhaWxlZDsKKwlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9mbG9wcHkpCisJCWdvdG8gZmFpbGVkOworCWlmICghaWRlZmxvcHB5X2lkZW50aWZ5X2RldmljZSAoZHJpdmUsIGRyaXZlLT5pZCkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLWZsb3BweTogJXM6IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIGlkZS1mbG9wcHlcbiIsIGRyaXZlLT5uYW1lKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmIChkcml2ZS0+c2NzaSkgeworCQlwcmludGsoImlkZS1mbG9wcHk6IHBhc3NpbmcgZHJpdmUgJXMgdG8gaWRlLXNjc2kgZW11bGF0aW9uLlxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWYgKChmbG9wcHkgPSAoaWRlZmxvcHB5X2Zsb3BweV90ICopIGttYWxsb2MgKHNpemVvZiAoaWRlZmxvcHB5X2Zsb3BweV90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLWZsb3BweTogJXM6IENhbid0IGFsbG9jYXRlIGEgZmxvcHB5IHN0cnVjdHVyZVxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlnID0gYWxsb2NfZGlzaygxIDw8IFBBUlROX0JJVFMpOworCWlmICghZykKKwkJZ290byBvdXRfZnJlZV9mbG9wcHk7CisKKwlpZGVfaW5pdF9kaXNrKGcsIGRyaXZlKTsKKworCWlmIChpZGVfcmVnaXN0ZXJfc3ViZHJpdmVyKGRyaXZlLCAmaWRlZmxvcHB5X2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLWZsb3BweTogJXM6IEZhaWxlZCB0byByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggaWRlLmNcbiIsIGRyaXZlLT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X2Rpc2s7CisJfQorCisJbWVtc2V0KGZsb3BweSwgMCwgc2l6ZW9mKCpmbG9wcHkpKTsKKworCWtyZWZfaW5pdCgmZmxvcHB5LT5rcmVmKTsKKworCWZsb3BweS0+ZHJpdmUgPSBkcml2ZTsKKwlmbG9wcHktPmRyaXZlciA9ICZpZGVmbG9wcHlfZHJpdmVyOworCWZsb3BweS0+ZGlzayA9IGc7CisKKwlnLT5wcml2YXRlX2RhdGEgPSAmZmxvcHB5LT5kcml2ZXI7CisKKwlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBmbG9wcHk7CisKKwlEUklWRVIoZHJpdmUpLT5idXN5Kys7CisJaWRlZmxvcHB5X3NldHVwIChkcml2ZSwgZmxvcHB5KTsKKwlEUklWRVIoZHJpdmUpLT5idXN5LS07CisJZy0+bWlub3JzID0gMSA8PCBQQVJUTl9CSVRTOworCWctPmRyaXZlcmZzX2RldiA9ICZkcml2ZS0+Z2VuZGV2OworCXN0cmNweShnLT5kZXZmc19uYW1lLCBkcml2ZS0+ZGV2ZnNfbmFtZSk7CisJZy0+ZmxhZ3MgPSBkcml2ZS0+cmVtb3ZhYmxlID8gR0VOSERfRkxfUkVNT1ZBQkxFIDogMDsKKwlnLT5mb3BzID0gJmlkZWZsb3BweV9vcHM7CisJZHJpdmUtPmF0dGFjaCA9IDE7CisJYWRkX2Rpc2soZyk7CisJcmV0dXJuIDA7CisKK291dF9wdXRfZGlzazoKKwlwdXRfZGlzayhnKTsKK291dF9mcmVlX2Zsb3BweToKKwlrZnJlZShmbG9wcHkpOworZmFpbGVkOgorCXJldHVybiAxOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFUQVBJIEZMT1BQWSBEcml2ZXIiKTsKKworc3RhdGljIHZvaWQgX19leGl0IGlkZWZsb3BweV9leGl0ICh2b2lkKQoreworCWlkZV91bnJlZ2lzdGVyX2RyaXZlcigmaWRlZmxvcHB5X2RyaXZlcik7Cit9CisKKy8qCisgKglpZGVmbG9wcHlfaW5pdCB3aWxsIHJlZ2lzdGVyIHRoZSBkcml2ZXIgZm9yIGVhY2ggZmxvcHB5LgorICovCitzdGF0aWMgaW50IGlkZWZsb3BweV9pbml0ICh2b2lkKQoreworCXByaW50aygiaWRlLWZsb3BweSBkcml2ZXIgIiBJREVGTE9QUFlfVkVSU0lPTiAiXG4iKTsKKwlpZGVfcmVnaXN0ZXJfZHJpdmVyKCZpZGVmbG9wcHlfZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoaWRlZmxvcHB5X2luaXQpOworbW9kdWxlX2V4aXQoaWRlZmxvcHB5X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWdlbmVyaWMuYyBiL2RyaXZlcnMvaWRlL2lkZS1nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1nZW5lcmljLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGdlbmVyaWMvZGVmYXVsdCBJREUgaG9zdCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQmFydGxvbWllaiBab2xuaWVya2lld2ljegorICogVGhpcyBjb2RlIHdhcyBzcGxpdCBvZmYgZnJvbSBpZGUuYy4gIFNlZSBpdCBmb3Igb3JpZ2luYWwgY29weXJpZ2h0cy4KKyAqCisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKworc3RhdGljIGludCBfX2luaXQgaWRlX2dlbmVyaWNfaW5pdCh2b2lkKQoreworCWlmIChpZGVfaHdpZnNbMF0uaW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSkKKwkJaWRlX2dldF9sb2NrKE5VTEwsIE5VTEwpOyAvKiBmb3IgYXRhcmkgb25seSAqLworCisJKHZvaWQpaWRlcHJvYmVfaW5pdCgpOworCisJaWYgKGlkZV9od2lmc1swXS5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdKQorCQlpZGVfcmVsZWFzZV9sb2NrKCk7CS8qIGZvciBhdGFyaSBvbmx5ICovCisKKwljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGlkZV9nZW5lcmljX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGUzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwpAQCAtMCwwICsxLDE2ODEgQEAKKy8qCisgKglJREUgSS9PIGZ1bmN0aW9ucworICoKKyAqCUJhc2ljIFBJTyBhbmQgY29tbWFuZCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkuCisgKgorICogVGhpcyBjb2RlIHdhcyBzcGxpdCBvZmYgZnJvbSBpZGUuYy4gU2VlIGlkZS5jIGZvciBoaXN0b3J5IGFuZCBvcmlnaW5hbAorICogY29weXJpZ2h0cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqLworIAorIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCitpbnQgX19pZGVfZW5kX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB1cHRvZGF0ZSwKKwkJICAgICAgaW50IG5yX3NlY3RvcnMpCit7CisJaW50IHJldCA9IDE7CisKKwlCVUdfT04oIShycS0+ZmxhZ3MgJiBSRVFfU1RBUlRFRCkpOworCisJLyoKKwkgKiBpZiBmYWlsZmFzdCBpcyBzZXQgb24gYSByZXF1ZXN0LCBvdmVycmlkZSBudW1iZXIgb2Ygc2VjdG9ycyBhbmQKKwkgKiBjb21wbGV0ZSB0aGUgd2hvbGUgcmVxdWVzdCByaWdodCBub3cKKwkgKi8KKwlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChycSkgJiYgZW5kX2lvX2Vycm9yKHVwdG9kYXRlKSkKKwkJbnJfc2VjdG9ycyA9IHJxLT5oYXJkX25yX3NlY3RvcnM7CisKKwlpZiAoIWJsa19mc19yZXF1ZXN0KHJxKSAmJiBlbmRfaW9fZXJyb3IodXB0b2RhdGUpICYmICFycS0+ZXJyb3JzKQorCQlycS0+ZXJyb3JzID0gLUVJTzsKKworCS8qCisJICogZGVjaWRlIHdoZXRoZXIgdG8gcmVlbmFibGUgRE1BIC0tIDMgaXMgYSByYW5kb20gbWFnaWMgZm9yIG5vdywKKwkgKiBpZiB3ZSBETUEgdGltZW91dCBtb3JlIHRoYW4gMyB0aW1lcywganVzdCBzdGF5IGluIFBJTworCSAqLworCWlmIChkcml2ZS0+c3RhdGUgPT0gRE1BX1BJT19SRVRSWSAmJiBkcml2ZS0+cmV0cnlfcGlvIDw9IDMpIHsKKwkJZHJpdmUtPnN0YXRlID0gMDsKKwkJSFdHUk9VUChkcml2ZSktPmh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCX0KKworCWlmICghZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2RhdGUsIG5yX3NlY3RvcnMpKSB7CisJCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOworCisJCWlmIChibGtfcnFfdGFnZ2VkKHJxKSkKKwkJCWJsa19xdWV1ZV9lbmRfdGFnKGRyaXZlLT5xdWV1ZSwgcnEpOworCisJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOworCQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEpOworCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChfX2lkZV9lbmRfcmVxdWVzdCk7CisKKy8qKgorICoJaWRlX2VuZF9yZXF1ZXN0CQktCWNvbXBsZXRlIGFuIElERSBJL08KKyAqCUBkcml2ZTogSURFIGRldmljZSBmb3IgdGhlIEkvTworICoJQHVwdG9kYXRlOgorICoJQG5yX3NlY3RvcnM6IG51bWJlciBvZiBzZWN0b3JzIGNvbXBsZXRlZAorICoKKyAqCVRoaXMgaXMgb3VyIGVuZF9yZXF1ZXN0IHdyYXBwZXIgZnVuY3Rpb24uIFdlIGNvbXBsZXRlIHRoZSBJL08KKyAqCXVwZGF0ZSByYW5kb20gbnVtYmVyIGlucHV0IGFuZCBkZXF1ZXVlIHRoZSByZXF1ZXN0LCB3aGljaCBpZgorICoJaXQgd2FzIHRhZ2dlZCBtYXkgYmUgb3V0IG9mIG9yZGVyLgorICovCisKK2ludCBpZGVfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdG9ycykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCisJaWYgKCFucl9zZWN0b3JzKQorCQlucl9zZWN0b3JzID0gcnEtPmhhcmRfY3VyX3NlY3RvcnM7CisKKwlpZiAoYmxrX2NvbXBsZXRlX2JhcnJpZXJfcnFfbG9ja2VkKGRyaXZlLT5xdWV1ZSwgcnEsIG5yX3NlY3RvcnMpKQorCQlyZXQgPSBycS0+bnJfc2VjdG9ycyAhPSAwOworCWVsc2UKKwkJcmV0ID0gX19pZGVfZW5kX3JlcXVlc3QoZHJpdmUsIHJxLCB1cHRvZGF0ZSwgbnJfc2VjdG9ycyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlkZV9lbmRfcmVxdWVzdCk7CisKKy8qCisgKiBQb3dlciBNYW5hZ2VtZW50IHN0YXRlIG1hY2hpbmUuIFRoaXMgb25lIGlzIHJhdGhlciB0cml2aWFsIGZvciBub3csCisgKiB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIG1vcmUsIGxpa2Ugc3dpdGNoaW5nIGJhY2sgdG8gUElPIG9uIHN1c3BlbmQKKyAqIHRvIGhlbHAgc29tZSBCSU9TZXMsIHJlLWRvIHRoZSBkb29yIGxvY2tpbmcgb24gcmVzdW1lLCBldGMuLi4KKyAqLworCitlbnVtIHsKKwlpZGVfcG1fZmx1c2hfY2FjaGUJPSBpZGVfcG1fc3RhdGVfc3RhcnRfc3VzcGVuZCwKKwlpZGVkaXNrX3BtX3N0YW5kYnksCisKKwlpZGVkaXNrX3BtX2lkbGUJCT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZSwKKwlpZGVfcG1fcmVzdG9yZV9kbWEsCit9OworCitzdGF0aWMgdm9pZCBpZGVfY29tcGxldGVfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyb3IpCit7CisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJcmV0dXJuOworCisJc3dpdGNoIChycS0+cG0tPnBtX3N0ZXApIHsKKwljYXNlIGlkZV9wbV9mbHVzaF9jYWNoZToJLyogU3VzcGVuZCBzdGVwIDEgKGZsdXNoIGNhY2hlKSBjb21wbGV0ZSAqLworCQlpZiAocnEtPnBtLT5wbV9zdGF0ZSA9PSA0KQorCQkJcnEtPnBtLT5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZDsKKwkJZWxzZQorCQkJcnEtPnBtLT5wbV9zdGVwID0gaWRlZGlza19wbV9zdGFuZGJ5OworCQlicmVhazsKKwljYXNlIGlkZWRpc2tfcG1fc3RhbmRieToJLyogU3VzcGVuZCBzdGVwIDIgKHN0YW5kYnkpIGNvbXBsZXRlICovCisJCXJxLT5wbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CisJCWJyZWFrOworCWNhc2UgaWRlZGlza19wbV9pZGxlOgkJLyogUmVzdW1lIHN0ZXAgMSAoaWRsZSkgY29tcGxldGUgKi8KKwkJcnEtPnBtLT5wbV9zdGVwID0gaWRlX3BtX3Jlc3RvcmVfZG1hOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX3N0YXJ0X3Bvd2VyX3N0ZXAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWRlX3Rhc2tfdCAqYXJncyA9IHJxLT5zcGVjaWFsOworCisJbWVtc2V0KGFyZ3MsIDAsIHNpemVvZigqYXJncykpOworCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCQkvKiBza2lwIGlkZWRpc2tfcG1faWRsZSBmb3IgQVRBUEkgZGV2aWNlcyAqLworCQlpZiAocnEtPnBtLT5wbV9zdGVwID09IGlkZWRpc2tfcG1faWRsZSkKKwkJCXJxLT5wbS0+cG1fc3RlcCA9IGlkZV9wbV9yZXN0b3JlX2RtYTsKKwl9CisKKwlzd2l0Y2ggKHJxLT5wbS0+cG1fc3RlcCkgeworCWNhc2UgaWRlX3BtX2ZsdXNoX2NhY2hlOgkvKiBTdXNwZW5kIHN0ZXAgMSAoZmx1c2ggY2FjaGUpICovCisJCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCisJCQlicmVhazsKKwkJLyogTm90IHN1cHBvcnRlZD8gU3dpdGNoIHRvIG5leHQgc3RlcCBub3cuICovCisJCWlmICghZHJpdmUtPndjYWNoZSB8fCAhaWRlX2lkX2hhc19mbHVzaF9jYWNoZShkcml2ZS0+aWQpKSB7CisJCQlpZGVfY29tcGxldGVfcG93ZXJfc3RlcChkcml2ZSwgcnEsIDAsIDApOworCQkJcmV0dXJuIGlkZV9zdG9wcGVkOworCQl9CisJCWlmIChpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlX2V4dChkcml2ZS0+aWQpKQorCQkJYXJncy0+dGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdID0gV0lOX0ZMVVNIX0NBQ0hFX0VYVDsKKwkJZWxzZQorCQkJYXJncy0+dGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdID0gV0lOX0ZMVVNIX0NBQ0hFOworCQlhcmdzLT5jb21tYW5kX3R5cGUgPSBJREVfRFJJVkVfVEFTS19OT19EQVRBOworCQlhcmdzLT5oYW5kbGVyCSAgID0gJnRhc2tfbm9fZGF0YV9pbnRyOworCQlyZXR1cm4gZG9fcndfdGFza2ZpbGUoZHJpdmUsIGFyZ3MpOworCisJY2FzZSBpZGVkaXNrX3BtX3N0YW5kYnk6CS8qIFN1c3BlbmQgc3RlcCAyIChzdGFuZGJ5KSAqLworCQlhcmdzLT50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0gPSBXSU5fU1RBTkRCWU5PVzE7CisJCWFyZ3MtPmNvbW1hbmRfdHlwZSA9IElERV9EUklWRV9UQVNLX05PX0RBVEE7CisJCWFyZ3MtPmhhbmRsZXIJICAgPSAmdGFza19ub19kYXRhX2ludHI7CisJCXJldHVybiBkb19yd190YXNrZmlsZShkcml2ZSwgYXJncyk7CisKKwljYXNlIGlkZWRpc2tfcG1faWRsZToJCS8qIFJlc3VtZSBzdGVwIDEgKGlkbGUpICovCisJCWFyZ3MtPnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXSA9IFdJTl9JRExFSU1NRURJQVRFOworCQlhcmdzLT5jb21tYW5kX3R5cGUgPSBJREVfRFJJVkVfVEFTS19OT19EQVRBOworCQlhcmdzLT5oYW5kbGVyID0gdGFza19ub19kYXRhX2ludHI7CisJCXJldHVybiBkb19yd190YXNrZmlsZShkcml2ZSwgYXJncyk7CisKKwljYXNlIGlkZV9wbV9yZXN0b3JlX2RtYToJLyogUmVzdW1lIHN0ZXAgMiAocmVzdG9yZSBETUEpICovCisJCS8qCisJCSAqIFJpZ2h0IG5vdywgYWxsIHdlIGRvIGlzIGNhbGwgaHdpZi0+aWRlX2RtYV9jaGVjayhkcml2ZSksCisJCSAqIHdlIGNvdWxkIGJlIHNtYXJ0ZXIgYW5kIGNoZWNrIGZvciBjdXJyZW50IHhmZXJfc3BlZWQKKwkJICogaW4gc3RydWN0IGRyaXZlIGV0Yy4uLgorCQkgKi8KKwkJaWYgKChkcml2ZS0+aWQtPmNhcGFiaWxpdHkgJiAxKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChkcml2ZS0+aHdpZi0+aWRlX2RtYV9jaGVjayA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWRyaXZlLT5od2lmLT5pZGVfZG1hX2NoZWNrKGRyaXZlKTsKKwkJYnJlYWs7CisJfQorCXJxLT5wbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCisvKioKKyAqCWlkZV9jb21wbGV0ZV9wbV9yZXF1ZXN0IC0gZW5kIHRoZSBjdXJyZW50IFBvd2VyIE1hbmFnZW1lbnQgcmVxdWVzdAorICoJQGRyaXZlOiB0YXJnZXQgZHJpdmUKKyAqCUBycTogcmVxdWVzdAorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBjdXJyZW50IFBNIHJlcXVlc3QgYW5kIHN0b3BzIHRoZSBxdWV1ZQorICoJaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZCBpZGVfY29tcGxldGVfcG1fcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX1BNCisJcHJpbnRrKCIlczogY29tcGxldGluZyBQTSByZXF1ZXN0LCAlc1xuIiwgZHJpdmUtPm5hbWUsCisJICAgICAgIGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpID8gInN1c3BlbmQiIDogInJlc3VtZSIpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpKSB7CisJCWJsa19zdG9wX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7CisJfSBlbHNlIHsKKwkJZHJpdmUtPmJsb2NrZWQgPSAwOworCQlibGtfc3RhcnRfcXVldWUoZHJpdmUtPnF1ZXVlKTsKKwl9CisJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7CisJSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGSVhNRTogcHJvYmFibHkgbW92ZSB0aGlzIHNvbWV3aGVyZSBlbHNlLCBuYW1lIGlzIGJhZCB0b28gOikKKyAqLwordTY0IGlkZV9nZXRfZXJyb3JfbG9jYXRpb24oaWRlX2RyaXZlX3QgKmRyaXZlLCBjaGFyICphcmdzKQoreworCXUzMiBoaWdoLCBsb3c7CisJdTggaGN5bCwgbGN5bCwgc2VjdDsKKwl1NjQgc2VjdG9yOworCisJaGlnaCA9IDA7CisJaGN5bCA9IGFyZ3NbNV07CisJbGN5bCA9IGFyZ3NbNF07CisJc2VjdCA9IGFyZ3NbM107CisKKwlpZiAoaWRlX2lkX2hhc19mbHVzaF9jYWNoZV9leHQoZHJpdmUtPmlkKSkgeworCQlsb3cgPSAoaGN5bCA8PCAxNikgfCAobGN5bCA8PCA4KSB8IHNlY3Q7CisJCUhXSUYoZHJpdmUpLT5PVVRCKGRyaXZlLT5jdGx8MHg4MCwgSURFX0NPTlRST0xfUkVHKTsKKwkJaGlnaCA9IGlkZV9yZWFkXzI0KGRyaXZlKTsKKwl9IGVsc2UgeworCQl1OCBjdXIgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9TRUxFQ1RfUkVHKTsKKwkJaWYgKGN1ciAmIDB4NDApIHsKKwkJCWhpZ2ggPSBjdXIgJiAweGY7CisJCQlsb3cgPSAoaGN5bCA8PCAxNikgfCAobGN5bCA8PCA4KSB8IHNlY3Q7CisJCX0gZWxzZSB7CisJCQlsb3cgPSBoY3lsICogZHJpdmUtPmhlYWQgKiBkcml2ZS0+c2VjdDsKKwkJCWxvdyArPSBsY3lsICogZHJpdmUtPnNlY3Q7CisJCQlsb3cgKz0gc2VjdCAtIDE7CisJCX0KKwl9CisKKwlzZWN0b3IgPSAoKHU2NCkgaGlnaCA8PCAyNCkgfCBsb3c7CisJcmV0dXJuIHNlY3RvcjsKK30KK0VYUE9SVF9TWU1CT0woaWRlX2dldF9lcnJvcl9sb2NhdGlvbik7CisKKy8qKgorICoJaWRlX2VuZF9kcml2ZV9jbWQJLQllbmQgYW4gZXhwbGljaXQgZHJpdmUgY29tbWFuZAorICoJQGRyaXZlOiBjb21tYW5kIAorICoJQHN0YXQ6IHN0YXR1cyBiaXRzCisgKglAZXJyOiBlcnJvciBiaXRzCisgKgorICoJQ2xlYW4gdXAgYWZ0ZXIgc3VjY2Vzcy9mYWlsdXJlIG9mIGFuIGV4cGxpY2l0IGRyaXZlIGNvbW1hbmQuCisgKglUaGVzZSBnZXQgdGhyb3duIG9udG8gdGhlIHF1ZXVlIHNvIHRoZXkgYXJlIHN5bmNocm9uaXplZCB3aXRoCisgKglyZWFsIEkvTyBvcGVyYXRpb25zIG9uIHRoZSBkcml2ZS4KKyAqCisgKglJbiBMQkE0OCBtb2RlIHdlIGhhdmUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgc2V0IHR3aWNlIHRvIGdldAorICoJYWxsIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBvdXQuCisgKi8KKyAKK3ZvaWQgaWRlX2VuZF9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3RhdCwgdTggZXJyKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX0NNRCkgeworCQl1OCAqYXJncyA9ICh1OCAqKSBycS0+YnVmZmVyOworCQlpZiAocnEtPmVycm9ycyA9PSAwKQorCQkJcnEtPmVycm9ycyA9ICFPS19TVEFUKHN0YXQsUkVBRFlfU1RBVCxCQURfU1RBVCk7CisKKwkJaWYgKGFyZ3MpIHsKKwkJCWFyZ3NbMF0gPSBzdGF0OworCQkJYXJnc1sxXSA9IGVycjsKKwkJCWFyZ3NbMl0gPSBod2lmLT5JTkIoSURFX05TRUNUT1JfUkVHKTsKKwkJfQorCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0spIHsKKwkJdTggKmFyZ3MgPSAodTggKikgcnEtPmJ1ZmZlcjsKKwkJaWYgKHJxLT5lcnJvcnMgPT0gMCkKKwkJCXJxLT5lcnJvcnMgPSAhT0tfU1RBVChzdGF0LFJFQURZX1NUQVQsQkFEX1NUQVQpOworCisJCWlmIChhcmdzKSB7CisJCQlhcmdzWzBdID0gc3RhdDsKKwkJCWFyZ3NbMV0gPSBlcnI7CisJCQlhcmdzWzJdID0gaHdpZi0+SU5CKElERV9OU0VDVE9SX1JFRyk7CisJCQlhcmdzWzNdID0gaHdpZi0+SU5CKElERV9TRUNUT1JfUkVHKTsKKwkJCWFyZ3NbNF0gPSBod2lmLT5JTkIoSURFX0xDWUxfUkVHKTsKKwkJCWFyZ3NbNV0gPSBod2lmLT5JTkIoSURFX0hDWUxfUkVHKTsKKwkJCWFyZ3NbNl0gPSBod2lmLT5JTkIoSURFX1NFTEVDVF9SRUcpOworCQl9CisJfSBlbHNlIGlmIChycS0+ZmxhZ3MgJiBSRVFfRFJJVkVfVEFTS0ZJTEUpIHsKKwkJaWRlX3Rhc2tfdCAqYXJncyA9IChpZGVfdGFza190ICopIHJxLT5zcGVjaWFsOworCQlpZiAocnEtPmVycm9ycyA9PSAwKQorCQkJcnEtPmVycm9ycyA9ICFPS19TVEFUKHN0YXQsUkVBRFlfU1RBVCxCQURfU1RBVCk7CisJCQkKKwkJaWYgKGFyZ3MpIHsKKwkJCWlmIChhcmdzLT50Zl9pbl9mbGFncy5iLmRhdGEpIHsKKwkJCQl1MTYgZGF0YQkJCQk9IGh3aWYtPklOVyhJREVfREFUQV9SRUcpOworCQkJCWFyZ3MtPnRmUmVnaXN0ZXJbSURFX0RBVEFfT0ZGU0VUXQk9IChkYXRhKSAmIDB4RkY7CisJCQkJYXJncy0+aG9iUmVnaXN0ZXJbSURFX0RBVEFfT0ZGU0VUXQk9IChkYXRhID4+IDgpICYgMHhGRjsKKwkJCX0KKwkJCWFyZ3MtPnRmUmVnaXN0ZXJbSURFX0VSUk9SX09GRlNFVF0gICA9IGVycjsKKwkJCS8qIGJlIHN1cmUgd2UncmUgbG9va2luZyBhdCB0aGUgbG93IG9yZGVyIGJpdHMgKi8KKwkJCWh3aWYtPk9VVEIoZHJpdmUtPmN0bCAmIH4weDgwLCBJREVfQ09OVFJPTF9SRUcpOworCQkJYXJncy0+dGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdID0gaHdpZi0+SU5CKElERV9OU0VDVE9SX1JFRyk7CisJCQlhcmdzLT50ZlJlZ2lzdGVyW0lERV9TRUNUT1JfT0ZGU0VUXSAgPSBod2lmLT5JTkIoSURFX1NFQ1RPUl9SRUcpOworCQkJYXJncy0+dGZSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdICAgID0gaHdpZi0+SU5CKElERV9MQ1lMX1JFRyk7CisJCQlhcmdzLT50ZlJlZ2lzdGVyW0lERV9IQ1lMX09GRlNFVF0gICAgPSBod2lmLT5JTkIoSURFX0hDWUxfUkVHKTsKKwkJCWFyZ3MtPnRmUmVnaXN0ZXJbSURFX1NFTEVDVF9PRkZTRVRdICA9IGh3aWYtPklOQihJREVfU0VMRUNUX1JFRyk7CisJCQlhcmdzLT50ZlJlZ2lzdGVyW0lERV9TVEFUVVNfT0ZGU0VUXSAgPSBzdGF0OworCisJCQlpZiAoZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgeworCQkJCWh3aWYtPk9VVEIoZHJpdmUtPmN0bHwweDgwLCBJREVfQ09OVFJPTF9SRUcpOworCQkJCWFyZ3MtPmhvYlJlZ2lzdGVyW0lERV9GRUFUVVJFX09GRlNFVF0JPSBod2lmLT5JTkIoSURFX0ZFQVRVUkVfUkVHKTsKKwkJCQlhcmdzLT5ob2JSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdCT0gaHdpZi0+SU5CKElERV9OU0VDVE9SX1JFRyk7CisJCQkJYXJncy0+aG9iUmVnaXN0ZXJbSURFX1NFQ1RPUl9PRkZTRVRdCT0gaHdpZi0+SU5CKElERV9TRUNUT1JfUkVHKTsKKwkJCQlhcmdzLT5ob2JSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdCT0gaHdpZi0+SU5CKElERV9MQ1lMX1JFRyk7CisJCQkJYXJncy0+aG9iUmVnaXN0ZXJbSURFX0hDWUxfT0ZGU0VUXQk9IGh3aWYtPklOQihJREVfSENZTF9SRUcpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChibGtfcG1fcmVxdWVzdChycSkpIHsKKyNpZmRlZiBERUJVR19QTQorCQlwcmludGsoIiVzOiBjb21wbGV0ZV9wb3dlcl9zdGVwKHN0ZXA6ICVkLCBzdGF0OiAleCwgZXJyOiAleClcbiIsCisJCQlkcml2ZS0+bmFtZSwgcnEtPnBtLT5wbV9zdGVwLCBzdGF0LCBlcnIpOworI2VuZGlmCisJCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKKwkJaWYgKHJxLT5wbS0+cG1fc3RlcCA9PSBpZGVfcG1fc3RhdGVfY29tcGxldGVkKQorCQkJaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QoZHJpdmUsIHJxKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOworCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisJcnEtPmVycm9ycyA9IGVycjsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2VuZF9kcml2ZV9jbWQpOworCisvKioKKyAqCXRyeV90b19mbHVzaF9sZWZ0b3Zlcl9kYXRhCS0JZmx1c2gganVuaworICoJQGRyaXZlOiBkcml2ZSB0byBmbHVzaAorICoKKyAqCXRyeV90b19mbHVzaF9sZWZ0b3Zlcl9kYXRhKCkgaXMgaW52b2tlZCBpbiByZXNwb25zZSB0byBhIGRyaXZlCisgKgl1bmV4cGVjdGVkbHkgaGF2aW5nIGl0cyBEUlFfU1RBVCBiaXQgc2V0LiAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8KKyAqCXJlc2V0dGluZyB0aGUgZHJpdmUsIHRoaXMgcm91dGluZSB0cmllcyB0byBjbGVhciB0aGUgY29uZGl0aW9uCisgKglieSByZWFkIGEgc2VjdG9yJ3Mgd29ydGggb2YgZGF0YSBmcm9tIHRoZSBkcml2ZS4gIE9mIGNvdXJzZSwKKyAqCXRoaXMgbWF5IG5vdCBoZWxwIGlmIHRoZSBkcml2ZSBpcyAqd2FpdGluZyogZm9yIGRhdGEgZnJvbSAqdXMqLgorICovCitzdGF0aWMgdm9pZCB0cnlfdG9fZmx1c2hfbGVmdG92ZXJfZGF0YSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludCBpID0gKGRyaXZlLT5tdWx0X2NvdW50ID8gZHJpdmUtPm11bHRfY291bnQgOiAxKSAqIFNFQ1RPUl9XT1JEUzsKKworCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCisJCXJldHVybjsKKwl3aGlsZSAoaSA+IDApIHsKKwkJdTMyIGJ1ZmZlclsxNl07CisJCXUzMiB3Y291bnQgPSAoaSA+IDE2KSA/IDE2IDogaTsKKworCQlpIC09IHdjb3VudDsKKwkJSFdJRihkcml2ZSktPmF0YV9pbnB1dF9kYXRhKGRyaXZlLCBidWZmZXIsIHdjb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGVfa2lsbF9ycShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZiAocnEtPnJxX2Rpc2spIHsKKwkJaWRlX2RyaXZlcl90ICpkcnY7CisKKwkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CisJfSBlbHNlCisJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2F0YV9lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKworCWlmIChzdGF0ICYgQlVTWV9TVEFUIHx8ICgoc3RhdCAmIFdSRVJSX1NUQVQpICYmICFkcml2ZS0+bm93ZXJyKSkgeworCQkvKiBvdGhlciBiaXRzIGFyZSB1c2VsZXNzIHdoZW4gQlVTWSAqLworCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFU0VUOworCX0gZWxzZSBpZiAoc3RhdCAmIEVSUl9TVEFUKSB7CisJCS8qIGVyciBoYXMgZGlmZmVyZW50IG1lYW5pbmcgb24gY2Ryb20gYW5kIHRhcGUgKi8KKwkJaWYgKGVyciA9PSBBQlJUX0VSUikgeworCQkJaWYgKGRyaXZlLT5zZWxlY3QuYi5sYmEgJiYKKwkJCSAgICAvKiBzb21lIG5ld2VyIGRyaXZlcyBkb24ndCBzdXBwb3J0IFdJTl9TUEVDSUZZICovCisJCQkgICAgaHdpZi0+SU5CKElERV9DT01NQU5EX1JFRykgPT0gV0lOX1NQRUNJRlkpCisJCQkJcmV0dXJuIGlkZV9zdG9wcGVkOworCQl9IGVsc2UgaWYgKChlcnIgJiBCQURfQ1JDKSA9PSBCQURfQ1JDKSB7CisJCQkvKiBVRE1BIGNyYyBlcnJvciwganVzdCByZXRyeSB0aGUgb3BlcmF0aW9uICovCisJCQlkcml2ZS0+Y3JjX2NvdW50Kys7CisJCX0gZWxzZSBpZiAoZXJyICYgKEJCRF9FUlIgfCBFQ0NfRVJSKSkgeworCQkJLyogcmV0cmllcyB3b24ndCBoZWxwIHRoZXNlICovCisJCQlycS0+ZXJyb3JzID0gRVJST1JfTUFYOworCQl9IGVsc2UgaWYgKGVyciAmIFRSSzBfRVJSKSB7CisJCQkvKiBoZWxwIGl0IGZpbmQgdHJhY2sgemVybyAqLworCQkJcnEtPmVycm9ycyB8PSBFUlJPUl9SRUNBTDsKKwkJfQorCX0KKworCWlmICgoc3RhdCAmIERSUV9TVEFUKSAmJiBycV9kYXRhX2RpcihycSkgPT0gUkVBRCkKKwkJdHJ5X3RvX2ZsdXNoX2xlZnRvdmVyX2RhdGEoZHJpdmUpOworCisJaWYgKGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykgJiAoQlVTWV9TVEFUfERSUV9TVEFUKSkKKwkJLyogZm9yY2UgYW4gYWJvcnQgKi8KKwkJaHdpZi0+T1VUQihXSU5fSURMRUlNTUVESUFURSwgSURFX0NPTU1BTkRfUkVHKTsKKworCWlmIChycS0+ZXJyb3JzID49IEVSUk9SX01BWCB8fCBibGtfbm9yZXRyeV9yZXF1ZXN0KHJxKSkKKwkJaWRlX2tpbGxfcnEoZHJpdmUsIHJxKTsKKwllbHNlIHsKKwkJaWYgKChycS0+ZXJyb3JzICYgRVJST1JfUkVTRVQpID09IEVSUk9SX1JFU0VUKSB7CisJCQkrK3JxLT5lcnJvcnM7CisJCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwkJfQorCQlpZiAoKHJxLT5lcnJvcnMgJiBFUlJPUl9SRUNBTCkgPT0gRVJST1JfUkVDQUwpCisJCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlID0gMTsKKwkJKytycS0+ZXJyb3JzOworCX0KKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2F0YXBpX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCB1OCBzdGF0LCB1OCBlcnIpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCisJaWYgKHN0YXQgJiBCVVNZX1NUQVQgfHwgKChzdGF0ICYgV1JFUlJfU1RBVCkgJiYgIWRyaXZlLT5ub3dlcnIpKSB7CisJCS8qIG90aGVyIGJpdHMgYXJlIHVzZWxlc3Mgd2hlbiBCVVNZICovCisJCXJxLT5lcnJvcnMgfD0gRVJST1JfUkVTRVQ7CisJfSBlbHNlIHsKKwkJLyogYWRkIGRlY29kaW5nIGVycm9yIHN0dWZmICovCisJfQorCisJaWYgKGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykgJiAoQlVTWV9TVEFUfERSUV9TVEFUKSkKKwkJLyogZm9yY2UgYW4gYWJvcnQgKi8KKwkJaHdpZi0+T1VUQihXSU5fSURMRUlNTUVESUFURSwgSURFX0NPTU1BTkRfUkVHKTsKKworCWlmIChycS0+ZXJyb3JzID49IEVSUk9SX01BWCkgeworCQlpZGVfa2lsbF9ycShkcml2ZSwgcnEpOworCX0gZWxzZSB7CisJCWlmICgocnEtPmVycm9ycyAmIEVSUk9SX1JFU0VUKSA9PSBFUlJPUl9SRVNFVCkgeworCQkJKytycS0+ZXJyb3JzOworCQkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CisJCX0KKwkJKytycS0+ZXJyb3JzOworCX0KKworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworaWRlX3N0YXJ0c3RvcF90CitfX2lkZV9lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyKQoreworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCXJldHVybiBpZGVfYXRhX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKKwlyZXR1cm4gaWRlX2F0YXBpX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoX19pZGVfZXJyb3IpOworCisvKioKKyAqCWlkZV9lcnJvcgktCWhhbmRsZSBhbiBlcnJvciBvbiB0aGUgSURFCisgKglAZHJpdmU6IGRyaXZlIHRoZSBlcnJvciBvY2N1cnJlZCBvbgorICoJQG1zZzogbWVzc2FnZSB0byByZXBvcnQKKyAqCUBzdGF0OiBzdGF0dXMgYml0cworICoKKyAqCWlkZV9lcnJvcigpIHRha2VzIGFjdGlvbiBiYXNlZCBvbiB0aGUgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIGRyaXZlLgorICoJRm9yIG5vcm1hbCBJL08gdGhhdCBtYXkgd2VsbCBpbmNsdWRlIHJldHJpZXMuIFdlIGRlYWwgd2l0aAorICoJYm90aCBuZXctc3R5bGUgKHRhc2tmaWxlKSBhbmQgb2xkIHN0eWxlIGNvbW1hbmQgaGFuZGxpbmcgaGVyZS4KKyAqCUluIHRoZSBjYXNlIG9mIHRhc2tmaWxlIGNvbW1hbmQgaGFuZGxpbmcgdGhlcmUgaXMgd29yayBsZWZ0IHRvCisgKglkbworICovCisgCitpZGVfc3RhcnRzdG9wX3QgaWRlX2Vycm9yIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKm1zZywgdTggc3RhdCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJdTggZXJyOworCisJZXJyID0gaWRlX2R1bXBfc3RhdHVzKGRyaXZlLCBtc2csIHN0YXQpOworCisJaWYgKChycSA9IEhXR1JPVVAoZHJpdmUpLT5ycSkgPT0gTlVMTCkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJLyogcmV0cnkgb25seSAibm9ybWFsIiBJL086ICovCisJaWYgKHJxLT5mbGFncyAmIChSRVFfRFJJVkVfQ01EIHwgUkVRX0RSSVZFX1RBU0sgfCBSRVFfRFJJVkVfVEFTS0ZJTEUpKSB7CisJCXJxLT5lcnJvcnMgPSAxOworCQlpZGVfZW5kX2RyaXZlX2NtZChkcml2ZSwgc3RhdCwgZXJyKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCWlmIChycS0+cnFfZGlzaykgeworCQlpZGVfZHJpdmVyX3QgKmRydjsKKworCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlyZXR1cm4gZHJ2LT5lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7CisJfSBlbHNlCisJCXJldHVybiBfX2lkZV9lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9lcnJvcik7CisKK2lkZV9zdGFydHN0b3BfdCBfX2lkZV9hYm9ydChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQorCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFU0VUOworCisJaWRlX2tpbGxfcnEoZHJpdmUsIHJxKTsKKworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoX19pZGVfYWJvcnQpOworCisvKioKKyAqCWlkZV9hYm9ydAktCWFib3J0IHBlbmRpbmcgSURFIG9wZXJhdGlucworICoJQGRyaXZlOiBkcml2ZSB0aGUgZXJyb3Igb2NjdXJyZWQgb24KKyAqCUBtc2c6IG1lc3NhZ2UgdG8gcmVwb3J0CisgKgorICoJaWRlX2Fib3J0IGtpbGxzIGFuZCBjbGVhbnMgdXAgd2hlbiB3ZSBhcmUgYWJvdXQgdG8gZG8gYSAKKyAqCWhvc3QgaW5pdGlhdGVkIHJlc2V0IG9uIGFjdGl2ZSBjb21tYW5kcy4gTG9uZ2VyIHRlcm0gd2UKKyAqCXdhbnQgaGFuZGxlcnMgdG8gaGF2ZSBzZW5zaWJsZSBhYm9ydCBoYW5kbGluZyB0aGVtc2VsdmVzCisgKgorICoJVGhpcyBkaWZmZXJzIGZ1bmRhbWVudGFsbHkgZnJvbSBpZGVfZXJyb3IgYmVjYXVzZSBpbiAKKyAqCXRoaXMgY2FzZSB0aGUgY29tbWFuZCBpcyBkb2luZyBqdXN0IGZpbmUgd2hlbiB3ZQorICoJYmxvdyBpdCBhd2F5LgorICovCisgCitpZGVfc3RhcnRzdG9wX3QgaWRlX2Fib3J0KGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnKQoreworCXN0cnVjdCByZXF1ZXN0ICpycTsKKworCWlmIChkcml2ZSA9PSBOVUxMIHx8IChycSA9IEhXR1JPVVAoZHJpdmUpLT5ycSkgPT0gTlVMTCkKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCisJLyogcmV0cnkgb25seSAibm9ybWFsIiBJL086ICovCisJaWYgKHJxLT5mbGFncyAmIChSRVFfRFJJVkVfQ01EIHwgUkVRX0RSSVZFX1RBU0sgfCBSRVFfRFJJVkVfVEFTS0ZJTEUpKSB7CisJCXJxLT5lcnJvcnMgPSAxOworCQlpZGVfZW5kX2RyaXZlX2NtZChkcml2ZSwgQlVTWV9TVEFULCAwKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCWlmIChycS0+cnFfZGlzaykgeworCQlpZGVfZHJpdmVyX3QgKmRydjsKKworCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlyZXR1cm4gZHJ2LT5hYm9ydChkcml2ZSwgcnEpOworCX0gZWxzZQorCQlyZXR1cm4gX19pZGVfYWJvcnQoZHJpdmUsIHJxKTsKK30KKworLyoqCisgKglpZGVfY21kCQktCWlzc3VlIGEgc2ltcGxlIGRyaXZlIGNvbW1hbmQKKyAqCUBkcml2ZTogZHJpdmUgdGhlIGNvbW1hbmQgaXMgZm9yCisgKglAY21kOiBjb21tYW5kIGJ5dGUKKyAqCUBuc2VjdDogc2VjdG9yIGJ5dGUKKyAqCUBoYW5kbGVyOiBoYW5kbGVyIGZvciB0aGUgY29tbWFuZCBjb21wbGV0aW9uCisgKgorICoJSXNzdWUgYSBzaW1wbGUgZHJpdmUgY29tbWFuZCB3aXRoIGludGVycnVwdHMuCisgKglUaGUgZHJpdmUgbXVzdCBiZSBzZWxlY3RlZCBiZWZvcmVoYW5kLgorICovCisKK3N0YXRpYyB2b2lkIGlkZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kLCB1OCBuc2VjdCwKKwkJaWRlX2hhbmRsZXJfdCAqaGFuZGxlcikKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWYgKElERV9DT05UUk9MX1JFRykKKwkJaHdpZi0+T1VUQihkcml2ZS0+Y3RsLElERV9DT05UUk9MX1JFRyk7CS8qIGNsZWFyIG5JRU4gKi8KKwlTRUxFQ1RfTUFTSyhkcml2ZSwwKTsKKwlod2lmLT5PVVRCKG5zZWN0LElERV9OU0VDVE9SX1JFRyk7CisJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgY21kLCBoYW5kbGVyLCBXQUlUX0NNRCwgTlVMTCk7Cit9CisKKy8qKgorICoJZHJpdmVfY21kX2ludHIJCS0gCWRyaXZlIGNvbW1hbmQgY29tcGxldGlvbiBpbnRlcnJ1cHQKKyAqCUBkcml2ZTogZHJpdmUgdGhlIGNvbXBsZXRpb24gaW50ZXJydXB0IG9jY3VycmVkIG9uCisgKgorICoJZHJpdmVfY21kX2ludHIoKSBpcyBpbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgYSBzcGVjaWFsIERSSVZFX0NNRC4KKyAqCVdlIGRvIGFueSBuZWNlc3NhcnkgZGF5YSByZWFkaW5nIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBkcml2ZSB0bworICoJZ28gbm9uIGJ1c3kuIEF0IHRoYXQgcG9pbnQgd2UgbWF5IHJlYWQgdGhlIGVycm9yIGRhdGEgYW5kIGNvbXBsZXRlCisgKgl0aGUgcmVxdWVzdAorICovCisgCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGRyaXZlX2NtZF9pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1OCAqYXJncyA9ICh1OCAqKSBycS0+YnVmZmVyOworCXU4IHN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCWludCByZXRyaWVzID0gMTA7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKChzdGF0ICYgRFJRX1NUQVQpICYmIGFyZ3MgJiYgYXJnc1szXSkgeworCQl1OCBpb18zMmJpdCA9IGRyaXZlLT5pb18zMmJpdDsKKwkJZHJpdmUtPmlvXzMyYml0ID0gMDsKKwkJaHdpZi0+YXRhX2lucHV0X2RhdGEoZHJpdmUsICZhcmdzWzRdLCBhcmdzWzNdICogU0VDVE9SX1dPUkRTKTsKKwkJZHJpdmUtPmlvXzMyYml0ID0gaW9fMzJiaXQ7CisJCXdoaWxlICgoKHN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSAmIEJVU1lfU1RBVCkgJiYgcmV0cmllcy0tKQorCQkJdWRlbGF5KDEwMCk7CisJfQorCisJaWYgKCFPS19TVEFUKHN0YXQsIFJFQURZX1NUQVQsIEJBRF9TVEFUKSkKKwkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgImRyaXZlX2NtZCIsIHN0YXQpOworCQkvKiBjYWxscyBpZGVfZW5kX2RyaXZlX2NtZCAqLworCWlkZV9lbmRfZHJpdmVfY21kKGRyaXZlLCBzdGF0LCBod2lmLT5JTkIoSURFX0VSUk9SX1JFRykpOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworc3RhdGljIHZvaWQgaWRlX2luaXRfc3BlY2lmeV9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICp0YXNrKQoreworCXRhc2stPnRmUmVnaXN0ZXJbSURFX05TRUNUT1JfT0ZGU0VUXSA9IGRyaXZlLT5zZWN0OworCXRhc2stPnRmUmVnaXN0ZXJbSURFX1NFQ1RPUl9PRkZTRVRdICA9IGRyaXZlLT5zZWN0OworCXRhc2stPnRmUmVnaXN0ZXJbSURFX0xDWUxfT0ZGU0VUXSAgICA9IGRyaXZlLT5jeWw7CisJdGFzay0+dGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdICAgID0gZHJpdmUtPmN5bD4+ODsKKwl0YXNrLT50ZlJlZ2lzdGVyW0lERV9TRUxFQ1RfT0ZGU0VUXSAgPSAoKGRyaXZlLT5oZWFkLTEpfGRyaXZlLT5zZWxlY3QuYWxsKSYweEJGOworCXRhc2stPnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXSA9IFdJTl9TUEVDSUZZOworCisJdGFzay0+aGFuZGxlciA9ICZzZXRfZ2VvbWV0cnlfaW50cjsKK30KKworc3RhdGljIHZvaWQgaWRlX2luaXRfcmVzdG9yZV9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICp0YXNrKQoreworCXRhc2stPnRmUmVnaXN0ZXJbSURFX05TRUNUT1JfT0ZGU0VUXSA9IGRyaXZlLT5zZWN0OworCXRhc2stPnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXSA9IFdJTl9SRVNUT1JFOworCisJdGFzay0+aGFuZGxlciA9ICZyZWNhbF9pbnRyOworfQorCitzdGF0aWMgdm9pZCBpZGVfaW5pdF9zZXRtdWx0X2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV90YXNrX3QgKnRhc2spCit7CisJdGFzay0+dGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdID0gZHJpdmUtPm11bHRfcmVxOworCXRhc2stPnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXSA9IFdJTl9TRVRNVUxUOworCisJdGFzay0+aGFuZGxlciA9ICZzZXRfbXVsdG1vZGVfaW50cjsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZGlza19zcGVjaWFsKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzcGVjaWFsX3QgKnMgPSAmZHJpdmUtPnNwZWNpYWw7CisJaWRlX3Rhc2tfdCBhcmdzOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOworCWFyZ3MuY29tbWFuZF90eXBlID0gSURFX0RSSVZFX1RBU0tfTk9fREFUQTsKKworCWlmIChzLT5iLnNldF9nZW9tZXRyeSkgeworCQlzLT5iLnNldF9nZW9tZXRyeSA9IDA7CisJCWlkZV9pbml0X3NwZWNpZnlfY21kKGRyaXZlLCAmYXJncyk7CisJfSBlbHNlIGlmIChzLT5iLnJlY2FsaWJyYXRlKSB7CisJCXMtPmIucmVjYWxpYnJhdGUgPSAwOworCQlpZGVfaW5pdF9yZXN0b3JlX2NtZChkcml2ZSwgJmFyZ3MpOworCX0gZWxzZSBpZiAocy0+Yi5zZXRfbXVsdG1vZGUpIHsKKwkJcy0+Yi5zZXRfbXVsdG1vZGUgPSAwOworCQlpZiAoZHJpdmUtPm11bHRfcmVxID4gZHJpdmUtPmlkLT5tYXhfbXVsdHNlY3QpCisJCQlkcml2ZS0+bXVsdF9yZXEgPSBkcml2ZS0+aWQtPm1heF9tdWx0c2VjdDsKKwkJaWRlX2luaXRfc2V0bXVsdF9jbWQoZHJpdmUsICZhcmdzKTsKKwl9IGVsc2UgaWYgKHMtPmFsbCkgeworCQlpbnQgc3BlY2lhbCA9IHMtPmFsbDsKKwkJcy0+YWxsID0gMDsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIHNwZWNpYWwgZmxhZzogMHglMDJ4XG4iLCBkcml2ZS0+bmFtZSwgc3BlY2lhbCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwlkb19yd190YXNrZmlsZShkcml2ZSwgJmFyZ3MpOworCisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCisvKioKKyAqCWRvX3NwZWNpYWwJCS0JaXNzdWUgc29tZSBzcGVjaWFsIGNvbW1hbmRzCisgKglAZHJpdmU6IGRyaXZlIHRoZSBjb21tYW5kIGlzIGZvcgorICoKKyAqCWRvX3NwZWNpYWwoKSBpcyB1c2VkIHRvIGlzc3VlIFdJTl9TUEVDSUZZLCBXSU5fUkVTVE9SRSwgYW5kIFdJTl9TRVRNVUxUCisgKgljb21tYW5kcyB0byBhIGRyaXZlLiAgSXQgdXNlZCB0byBkbyBtdWNoIG1vcmUsIGJ1dCBoYXMgYmVlbiBzY2FsZWQKKyAqCWJhY2suCisgKi8KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBkb19zcGVjaWFsIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3BlY2lhbF90ICpzID0gJmRyaXZlLT5zcGVjaWFsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIiVzOiBkb19zcGVjaWFsOiAweCUwMnhcbiIsIGRyaXZlLT5uYW1lLCBzLT5hbGwpOworI2VuZGlmCisJaWYgKHMtPmIuc2V0X3R1bmUpIHsKKwkJcy0+Yi5zZXRfdHVuZSA9IDA7CisJCWlmIChIV0lGKGRyaXZlKS0+dHVuZXByb2MgIT0gTlVMTCkKKwkJCUhXSUYoZHJpdmUpLT50dW5lcHJvYyhkcml2ZSwgZHJpdmUtPnR1bmVfcmVxKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0gZWxzZSB7CisJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCQlyZXR1cm4gaWRlX2Rpc2tfc3BlY2lhbChkcml2ZSk7CisKKwkJcy0+YWxsID0gMDsKKwkJZHJpdmUtPm11bHRfcmVxID0gMDsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KK30KKwordm9pZCBpZGVfbWFwX3NnKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaHdpZi0+c2dfdGFibGU7CisKKwlpZiAoaHdpZi0+c2dfbWFwcGVkKQkvKiBuZWVkZWQgYnkgaWRlLXNjc2kgKi8KKwkJcmV0dXJuOworCisJaWYgKChycS0+ZmxhZ3MgJiBSRVFfRFJJVkVfVEFTS0ZJTEUpID09IDApIHsKKwkJaHdpZi0+c2dfbmVudHMgPSBibGtfcnFfbWFwX3NnKGRyaXZlLT5xdWV1ZSwgcnEsIHNnKTsKKwl9IGVsc2UgeworCQlzZ19pbml0X29uZShzZywgcnEtPmJ1ZmZlciwgcnEtPm5yX3NlY3RvcnMgKiBTRUNUT1JfU0laRSk7CisJCWh3aWYtPnNnX25lbnRzID0gMTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9tYXBfc2cpOworCit2b2lkIGlkZV9pbml0X3NnX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisKKwlod2lmLT5uc2VjdCA9IGh3aWYtPm5sZWZ0ID0gcnEtPm5yX3NlY3RvcnM7CisJaHdpZi0+Y3Vyc2cgPSBod2lmLT5jdXJzZ19vZnMgPSAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfaW5pdF9zZ19jbWQpOworCisvKioKKyAqCWV4ZWN1dGVfZHJpdmVfY29tbWFuZAktCWlzc3VlIHNwZWNpYWwgZHJpdmUgY29tbWFuZAorICoJQGRyaXZlOiB0aGUgZHJpdmUgdG8gaXNzdWUgdGggY29tbWFuZCBvbgorICoJQHJxOiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgY29tbWFuZAorICoKKyAqCWV4ZWN1dGVfZHJpdmVfY21kKCkgaXNzdWVzIGEgc3BlY2lhbCBkcml2ZSBjb21tYW5kLCAgdXN1YWxseSAKKyAqCWluaXRpYXRlZCBieSBpb2N0bCgpIGZyb20gdGhlIGV4dGVybmFsIGhkcGFybSBwcm9ncmFtLiBUaGUKKyAqCWNvbW1hbmQgY2FuIGJlIGEgZHJpdmUgY29tbWFuZCwgZHJpdmUgdGFzayBvciB0YXNrZmlsZSAKKyAqCW9wZXJhdGlvbi4gV2VpcmRseSB5b3UgY2FuIGNhbGwgaXQgd2l0aCBOVUxMIHRvIHdhaXQgZm9yCisgKglhbGwgY29tbWFuZHMgdG8gZmluaXNoLiBEb24ndCBkbyB0aGlzIGFzIHRoYXQgaXMgZHVlIHRvIGNoYW5nZQorICovCisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZXhlY3V0ZV9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0tGSUxFKSB7CisgCQlpZGVfdGFza190ICphcmdzID0gcnEtPnNwZWNpYWw7CisgCisJCWlmICghYXJncykKKwkJCWdvdG8gZG9uZTsKKworCQlod2lmLT5kYXRhX3BoYXNlID0gYXJncy0+ZGF0YV9waGFzZTsKKworCQlzd2l0Y2ggKGh3aWYtPmRhdGFfcGhhc2UpIHsKKwkJY2FzZSBUQVNLRklMRV9NVUxUSV9PVVQ6CisJCWNhc2UgVEFTS0ZJTEVfT1VUOgorCQljYXNlIFRBU0tGSUxFX01VTFRJX0lOOgorCQljYXNlIFRBU0tGSUxFX0lOOgorCQkJaWRlX2luaXRfc2dfY21kKGRyaXZlLCBycSk7CisJCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhcmdzLT50Zl9vdXRfZmxhZ3MuYWxsICE9IDApIAorCQkJcmV0dXJuIGZsYWdnZWRfdGFza2ZpbGUoZHJpdmUsIGFyZ3MpOworCQlyZXR1cm4gZG9fcndfdGFza2ZpbGUoZHJpdmUsIGFyZ3MpOworCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0spIHsKKwkJdTggKmFyZ3MgPSBycS0+YnVmZmVyOworCQl1OCBzZWw7CisgCisJCWlmICghYXJncykKKwkJCWdvdG8gZG9uZTsKKyNpZmRlZiBERUJVRworIAkJcHJpbnRrKCIlczogRFJJVkVfVEFTS19DTUQgIiwgZHJpdmUtPm5hbWUpOworIAkJcHJpbnRrKCJjbWQ9MHglMDJ4ICIsIGFyZ3NbMF0pOworIAkJcHJpbnRrKCJmcj0weCUwMnggIiwgYXJnc1sxXSk7CisgCQlwcmludGsoIm5zPTB4JTAyeCAiLCBhcmdzWzJdKTsKKyAJCXByaW50aygic2M9MHglMDJ4ICIsIGFyZ3NbM10pOworIAkJcHJpbnRrKCJsY3lsPTB4JTAyeCAiLCBhcmdzWzRdKTsKKyAJCXByaW50aygiaGN5bD0weCUwMnggIiwgYXJnc1s1XSk7CisgCQlwcmludGsoInNlbD0weCUwMnhcbiIsIGFyZ3NbNl0pOworI2VuZGlmCisgCQlod2lmLT5PVVRCKGFyZ3NbMV0sIElERV9GRUFUVVJFX1JFRyk7CisgCQlod2lmLT5PVVRCKGFyZ3NbM10sIElERV9TRUNUT1JfUkVHKTsKKyAJCWh3aWYtPk9VVEIoYXJnc1s0XSwgSURFX0xDWUxfUkVHKTsKKyAJCWh3aWYtPk9VVEIoYXJnc1s1XSwgSURFX0hDWUxfUkVHKTsKKyAJCXNlbCA9IChhcmdzWzZdICYgfjB4MTApOworIAkJaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0KQorIAkJCXNlbCB8PSAweDEwOworIAkJaHdpZi0+T1VUQihzZWwsIElERV9TRUxFQ1RfUkVHKTsKKyAJCWlkZV9jbWQoZHJpdmUsIGFyZ3NbMF0sIGFyZ3NbMl0sICZkcml2ZV9jbWRfaW50cik7CisgCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisgCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX0NNRCkgeworIAkJdTggKmFyZ3MgPSBycS0+YnVmZmVyOworCisJCWlmICghYXJncykKKwkJCWdvdG8gZG9uZTsKKyNpZmRlZiBERUJVRworIAkJcHJpbnRrKCIlczogRFJJVkVfQ01EICIsIGRyaXZlLT5uYW1lKTsKKyAJCXByaW50aygiY21kPTB4JTAyeCAiLCBhcmdzWzBdKTsKKyAJCXByaW50aygic2M9MHglMDJ4ICIsIGFyZ3NbMV0pOworIAkJcHJpbnRrKCJmcj0weCUwMnggIiwgYXJnc1syXSk7CisgCQlwcmludGsoInh4PTB4JTAyeFxuIiwgYXJnc1szXSk7CisjZW5kaWYKKyAJCWlmIChhcmdzWzBdID09IFdJTl9TTUFSVCkgeworIAkJCWh3aWYtPk9VVEIoMHg0ZiwgSURFX0xDWUxfUkVHKTsKKyAJCQlod2lmLT5PVVRCKDB4YzIsIElERV9IQ1lMX1JFRyk7CisgCQkJaHdpZi0+T1VUQihhcmdzWzJdLElERV9GRUFUVVJFX1JFRyk7CisgCQkJaHdpZi0+T1VUQihhcmdzWzFdLElERV9TRUNUT1JfUkVHKTsKKyAJCQlpZGVfY21kKGRyaXZlLCBhcmdzWzBdLCBhcmdzWzNdLCAmZHJpdmVfY21kX2ludHIpOworIAkJCXJldHVybiBpZGVfc3RhcnRlZDsKKyAJCX0KKyAJCWh3aWYtPk9VVEIoYXJnc1syXSxJREVfRkVBVFVSRV9SRUcpOworIAkJaWRlX2NtZChkcml2ZSwgYXJnc1swXSwgYXJnc1sxXSwgJmRyaXZlX2NtZF9pbnRyKTsKKyAJCXJldHVybiBpZGVfc3RhcnRlZDsKKyAJfQorCitkb25lOgorIAkvKgorIAkgKiBOVUxMIGlzIGFjdHVhbGx5IGEgdmFsaWQgd2F5IG9mIHdhaXRpbmcgZm9yCisgCSAqIGFsbCBjdXJyZW50IHJlcXVlc3RzIHRvIGJlIGZsdXNoZWQgZnJvbSB0aGUgcXVldWUuCisgCSAqLworI2lmZGVmIERFQlVHCisgCXByaW50aygiJXM6IERSSVZFX0NNRCAobnVsbClcbiIsIGRyaXZlLT5uYW1lKTsKKyNlbmRpZgorIAlpZGVfZW5kX2RyaXZlX2NtZChkcml2ZSwKKwkJCWh3aWYtPklOQihJREVfU1RBVFVTX1JFRyksCisJCQlod2lmLT5JTkIoSURFX0VSUk9SX1JFRykpOworIAlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKKy8qKgorICoJc3RhcnRfcmVxdWVzdAktCXN0YXJ0IG9mIEkvTyBhbmQgY29tbWFuZCBpc3N1aW5nIGZvciBJREUKKyAqCisgKglzdGFydF9yZXF1ZXN0KCkgaW5pdGlhdGVzIGhhbmRsaW5nIG9mIGEgbmV3IEkvTyByZXF1ZXN0LiBJdAorICoJYWNjZXB0cyBjb21tYW5kcyBhbmQgSS9PIChyZWFkL3dyaXRlKSByZXF1ZXN0cy4gSXQgYWxzbyBkb2VzCisgKgl0aGUgZmluYWwgcmVtYXBwaW5nIGZvciB3ZWlyZCBzdHVmZiBsaWtlIEVaRHJpdmUuIE9uY2UgCisgKglkZXZpY2UgbWFwcGVyIGNhbiB3b3JrIHNlY3RvciBsZXZlbCB0aGUgRVpEcml2ZSBzdHVmZiBjYW4gZ28gYXdheQorICoKKyAqCUZJWE1FOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIGEgcmVuYW1lCisgKi8KKyAKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3Qgc3RhcnRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKwlzZWN0b3JfdCBibG9jazsKKworCUJVR19PTighKHJxLT5mbGFncyAmIFJFUV9TVEFSVEVEKSk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6IHN0YXJ0X3JlcXVlc3Q6IGN1cnJlbnQ9MHglMDhseFxuIiwKKwkJSFdJRihkcml2ZSktPm5hbWUsICh1bnNpZ25lZCBsb25nKSBycSk7CisjZW5kaWYKKworCS8qIGJhaWwgZWFybHkgaWYgd2UndmUgZXhjZWVkZWQgbWF4X2ZhaWx1cmVzICovCisJaWYgKGRyaXZlLT5tYXhfZmFpbHVyZXMgJiYgKGRyaXZlLT5mYWlsdXJlcyA+IGRyaXZlLT5tYXhfZmFpbHVyZXMpKSB7CisJCWdvdG8ga2lsbF9ycTsKKwl9CisKKwlibG9jayAgICA9IHJxLT5zZWN0b3I7CisJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSAmJgorCSAgICAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrIHx8IGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5KSkgeworCQlibG9jayArPSBkcml2ZS0+c2VjdDA7CisJfQorCS8qIFllY2NoIC0gdGhpcyB3aWxsIHNoaWZ0IHRoZSBlbnRpcmUgaW50ZXJ2YWwsCisJICAgcG9zc2libHkga2lsbGluZyBzb21lIGlubm9jZW50IGZvbGxvd2luZyBzZWN0b3IgKi8KKwlpZiAoYmxvY2sgPT0gMCAmJiBkcml2ZS0+cmVtYXBfMF90b18xID09IDEpCisJCWJsb2NrID0gMTsgIC8qIHJlZGlyZWN0IE1CUiBhY2Nlc3MgdG8gRVotRHJpdmUgcGFydG4gdGFibGUgKi8KKworCWlmIChibGtfcG1fc3VzcGVuZF9yZXF1ZXN0KHJxKSAmJgorCSAgICBycS0+cG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3N1c3BlbmQpCisJCS8qIE1hcmsgZHJpdmUgYmxvY2tlZCB3aGVuIHN0YXJ0aW5nIHRoZSBzdXNwZW5kIHNlcXVlbmNlLiAqLworCQlkcml2ZS0+YmxvY2tlZCA9IDE7CisJZWxzZSBpZiAoYmxrX3BtX3Jlc3VtZV9yZXF1ZXN0KHJxKSAmJgorCQkgcnEtPnBtLT5wbV9zdGVwID09IGlkZV9wbV9zdGF0ZV9zdGFydF9yZXN1bWUpIHsKKwkJLyogCisJCSAqIFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBvbiB3YWtldXAgaXMgdG8gd2FpdCBmb3IgQlNZIGJpdCB0bworCQkgKiBnbyBhd2F5ICh3aXRoIGEgbG9vb25nIHRpbWVvdXQpIGFzIGEgZHJpdmUgb24gdGhpcyBod2lmIG1heQorCQkgKiBqdXN0IGJlIFBPU1RpbmcgaXRzZWxmLgorCQkgKiBXZSBkbyB0aGF0IGJlZm9yZSBldmVuIHNlbGVjdGluZyBhcyB0aGUgIm90aGVyIiBkZXZpY2Ugb24KKwkJICogdGhlIGJ1cyBtYXkgYmUgYnJva2VuIGVub3VnaCB0byB3YWxrIG9uIG91ciB0b2VzIGF0IHRoaXMKKwkJICogcG9pbnQuCisJCSAqLworCQlpbnQgcmM7CisjaWZkZWYgREVCVUdfUE0KKwkJcHJpbnRrKCIlczogV2FrZXVwIHJlcXVlc3QgaW5pdGVkLCB3YWl0aW5nIGZvciAhQlNZLi4uXG4iLCBkcml2ZS0+bmFtZSk7CisjZW5kaWYKKwkJcmMgPSBpZGVfd2FpdF9ub3RfYnVzeShIV0lGKGRyaXZlKSwgMzUwMDApOworCQlpZiAocmMpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYnVzIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKKwkJU0VMRUNUX0RSSVZFKGRyaXZlKTsKKwkJSFdJRihkcml2ZSktPk9VVEIoOCwgSFdJRihkcml2ZSktPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0pOworCQlyYyA9IGlkZV93YWl0X25vdF9idXN5KEhXSUYoZHJpdmUpLCAxMDAwMCk7CisJCWlmIChyYykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZSBub3QgcmVhZHkgb24gd2FrZXVwXG4iLCBkcml2ZS0+bmFtZSk7CisJfQorCisJU0VMRUNUX0RSSVZFKGRyaXZlKTsKKwlpZiAoaWRlX3dhaXRfc3RhdCgmc3RhcnRzdG9wLCBkcml2ZSwgZHJpdmUtPnJlYWR5X3N0YXQsIEJVU1lfU1RBVHxEUlFfU1RBVCwgV0FJVF9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmUgbm90IHJlYWR5IGZvciBjb21tYW5kXG4iLCBkcml2ZS0+bmFtZSk7CisJCXJldHVybiBzdGFydHN0b3A7CisJfQorCWlmICghZHJpdmUtPnNwZWNpYWwuYWxsKSB7CisJCWlkZV9kcml2ZXJfdCAqZHJ2OworCisJCWlmIChycS0+ZmxhZ3MgJiAoUkVRX0RSSVZFX0NNRCB8IFJFUV9EUklWRV9UQVNLKSkKKwkJCXJldHVybiBleGVjdXRlX2RyaXZlX2NtZChkcml2ZSwgcnEpOworCQllbHNlIGlmIChycS0+ZmxhZ3MgJiBSRVFfRFJJVkVfVEFTS0ZJTEUpCisJCQlyZXR1cm4gZXhlY3V0ZV9kcml2ZV9jbWQoZHJpdmUsIHJxKTsKKwkJZWxzZSBpZiAoYmxrX3BtX3JlcXVlc3QocnEpKSB7CisjaWZkZWYgREVCVUdfUE0KKwkJCXByaW50aygiJXM6IHN0YXJ0X3Bvd2VyX3N0ZXAoc3RlcDogJWQpXG4iLAorCQkJCWRyaXZlLT5uYW1lLCBycS0+cG0tPnBtX3N0ZXApOworI2VuZGlmCisJCQlzdGFydHN0b3AgPSBpZGVfc3RhcnRfcG93ZXJfc3RlcChkcml2ZSwgcnEpOworCQkJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCAmJgorCQkJICAgIHJxLT5wbS0+cG1fc3RlcCA9PSBpZGVfcG1fc3RhdGVfY29tcGxldGVkKQorCQkJCWlkZV9jb21wbGV0ZV9wbV9yZXF1ZXN0KGRyaXZlLCBycSk7CisJCQlyZXR1cm4gc3RhcnRzdG9wOworCQl9CisKKwkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJcmV0dXJuIGRydi0+ZG9fcmVxdWVzdChkcml2ZSwgcnEsIGJsb2NrKTsKKwl9CisJcmV0dXJuIGRvX3NwZWNpYWwoZHJpdmUpOwora2lsbF9ycToKKwlpZGVfa2lsbF9ycShkcml2ZSwgcnEpOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworLyoqCisgKglpZGVfc3RhbGxfcXVldWUJCS0JcGF1c2UgYW4gSURFIGRldmljZQorICoJQGRyaXZlOiBkcml2ZSB0byBzdGFsbAorICoJQHRpbWVvdXQ6IHRpbWUgdG8gc3RhbGwgZm9yIChqaWZmaWVzKQorICoKKyAqCWlkZV9zdGFsbF9xdWV1ZSgpIGNhbiBiZSB1c2VkIGJ5IGEgZHJpdmUgdG8gZ2l2ZSBleGNlc3MgYmFuZHdpZHRoIGJhY2sKKyAqCXRvIHRoZSBod2dyb3VwIGJ5IHNsZWVwaW5nIGZvciB0aW1lb3V0IGppZmZpZXMuCisgKi8KKyAKK3ZvaWQgaWRlX3N0YWxsX3F1ZXVlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZW91dCA+IFdBSVRfV09SU1RDQVNFKQorCQl0aW1lb3V0ID0gV0FJVF9XT1JTVENBU0U7CisJZHJpdmUtPnNsZWVwID0gdGltZW91dCArIGppZmZpZXM7CisJZHJpdmUtPnNsZWVwaW5nID0gMTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfc3RhbGxfcXVldWUpOworCisjZGVmaW5lIFdBS0VVUChkcml2ZSkJKChkcml2ZSktPnNlcnZpY2Vfc3RhcnQgKyAyICogKGRyaXZlKS0+c2VydmljZV90aW1lKQorCisvKioKKyAqCWNob29zZV9kcml2ZQkJLQlzZWxlY3QgYSBkcml2ZSB0byBzZXJ2aWNlCisgKglAaHdncm91cDogaGFyZHdhcmUgZ3JvdXAgdG8gc2VsZWN0IG9uCisgKgorICoJY2hvb3NlX2RyaXZlKCkgc2VsZWN0cyB0aGUgbmV4dCBkcml2ZSB3aGljaCB3aWxsIGJlIHNlcnZpY2VkLgorICoJVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgSURFIGxheWVyIGNhbid0IGlzc3VlIGNvbW1hbmRzCisgKgl0byBib3RoIGRyaXZlcyBvbiB0aGUgc2FtZSBjYWJsZSwgdW5saWtlIFNDU0kuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaWRlX2RyaXZlX3QgKmNob29zZV9kcml2ZSAoaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUsICpiZXN0OworCityZXBlYXQ6CQorCWJlc3QgPSBOVUxMOworCWRyaXZlID0gaHdncm91cC0+ZHJpdmU7CisKKwkvKgorCSAqIGRyaXZlIGlzIGRvaW5nIHByZS1mbHVzaCwgb3JkZXJlZCB3cml0ZSwgcG9zdC1mbHVzaCBzZXF1ZW5jZS4gZXZlbgorCSAqIHRob3VnaCB0aGF0IGlzIDMgcmVxdWVzdHMsIGl0IG11c3QgYmUgc2VlbiBhcyBhIHNpbmdsZSB0cmFuc2FjdGlvbi4KKwkgKiB3ZSBtdXN0IG5vdCBwcmVlbXB0IHRoaXMgZHJpdmUgdW50aWwgdGhhdCBpcyBjb21wbGV0ZQorCSAqLworCWlmIChibGtfcXVldWVfZmx1c2hpbmcoZHJpdmUtPnF1ZXVlKSkgeworCQkvKgorCQkgKiBzbWFsbCByYWNlIHdoZXJlIHF1ZXVlIGNvdWxkIGdldCByZXBsdWdnZWQgZHVyaW5nCisJCSAqIHRoZSAzLXJlcXVlc3QgZmx1c2ggY3ljbGUsIGp1c3QgeWFuayB0aGUgcGx1ZyBzaW5jZQorCQkgKiB3ZSB3YW50IGl0IHRvIGZpbmlzaCBhc2FwCisJCSAqLworCQlibGtfcmVtb3ZlX3BsdWcoZHJpdmUtPnF1ZXVlKTsKKwkJcmV0dXJuIGRyaXZlOworCX0KKworCWRvIHsKKwkJaWYgKCghZHJpdmUtPnNsZWVwaW5nIHx8IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZHJpdmUtPnNsZWVwKSkKKwkJICAgICYmICFlbHZfcXVldWVfZW1wdHkoZHJpdmUtPnF1ZXVlKSkgeworCQkJaWYgKCFiZXN0CisJCQkgfHwgKGRyaXZlLT5zbGVlcGluZyAmJiAoIWJlc3QtPnNsZWVwaW5nIHx8IHRpbWVfYmVmb3JlKGRyaXZlLT5zbGVlcCwgYmVzdC0+c2xlZXApKSkKKwkJCSB8fCAoIWJlc3QtPnNsZWVwaW5nICYmIHRpbWVfYmVmb3JlKFdBS0VVUChkcml2ZSksIFdBS0VVUChiZXN0KSkpKQorCQkJeworCQkJCWlmICghYmxrX3F1ZXVlX3BsdWdnZWQoZHJpdmUtPnF1ZXVlKSkKKwkJCQkJYmVzdCA9IGRyaXZlOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGRyaXZlID0gZHJpdmUtPm5leHQpICE9IGh3Z3JvdXAtPmRyaXZlKTsKKwlpZiAoYmVzdCAmJiBiZXN0LT5uaWNlMSAmJiAhYmVzdC0+c2xlZXBpbmcgJiYgYmVzdCAhPSBod2dyb3VwLT5kcml2ZSAmJiBiZXN0LT5zZXJ2aWNlX3RpbWUgPiBXQUlUX01JTl9TTEVFUCkgeworCQlsb25nIHQgPSAoc2lnbmVkIGxvbmcpKFdBS0VVUChiZXN0KSAtIGppZmZpZXMpOworCQlpZiAodCA+PSBXQUlUX01JTl9TTEVFUCkgeworCQkvKgorCQkgKiBXZSAqbWF5KiBoYXZlIHNvbWUgdGltZSB0byBzcGFyZSwgYnV0IGZpcnN0IGxldCdzIHNlZSBpZgorCQkgKiBzb21lb25lIGNhbiBwb3RlbnRpYWxseSBiZW5lZml0IGZyb20gb3VyIG5pY2UgbW9vZCB0b2RheS4uCisJCSAqLworCQkJZHJpdmUgPSBiZXN0LT5uZXh0OworCQkJZG8geworCQkJCWlmICghZHJpdmUtPnNsZWVwaW5nCisJCQkJICYmIHRpbWVfYmVmb3JlKGppZmZpZXMgLSBiZXN0LT5zZXJ2aWNlX3RpbWUsIFdBS0VVUChkcml2ZSkpCisJCQkJICYmIHRpbWVfYmVmb3JlKFdBS0VVUChkcml2ZSksIGppZmZpZXMgKyB0KSkKKwkJCQl7CisJCQkJCWlkZV9zdGFsbF9xdWV1ZShiZXN0LCBtaW5fdChsb25nLCB0LCAxMCAqIFdBSVRfTUlOX1NMRUVQKSk7CisJCQkJCWdvdG8gcmVwZWF0OworCQkJCX0KKwkJCX0gd2hpbGUgKChkcml2ZSA9IGRyaXZlLT5uZXh0KSAhPSBiZXN0KTsKKwkJfQorCX0KKwlyZXR1cm4gYmVzdDsKK30KKworLyoKKyAqIElzc3VlIGEgbmV3IHJlcXVlc3QgdG8gYSBkcml2ZSBmcm9tIGh3Z3JvdXAKKyAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIHNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgLi4pOworICoKKyAqIEEgaHdncm91cCBpcyBhIHNlcmlhbGl6ZWQgZ3JvdXAgb2YgSURFIGludGVyZmFjZXMuICBVc3VhbGx5IHRoZXJlIGlzCisgKiBleGFjdGx5IG9uZSBod2lmIChpbnRlcmZhY2UpIHBlciBod2dyb3VwLCBidXQgYnVnZ3kgY29udHJvbGxlcnMgKGVnLiBDTUQ2NDApCisgKiBtYXkgaGF2ZSBib3RoIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgaHdncm91cCB0byAic2VyaWFsaXplIiBhY2Nlc3MuCisgKiBPciBwb3NzaWJseSBtdWx0aXBsZSBJU0EgaW50ZXJmYWNlcyBjYW4gc2hhcmUgYSBjb21tb24gSVJRIGJ5IGJlaW5nIGdyb3VwZWQKKyAqIHRvZ2V0aGVyIGludG8gb25lIGh3Z3JvdXAgZm9yIHNlcmlhbGl6ZWQgYWNjZXNzLgorICoKKyAqIE5vdGUgYWxzbyB0aGF0IHNldmVyYWwgaHdncm91cHMgY2FuIGVuZCB1cCBzaGFyaW5nIGEgc2luZ2xlIElSUSwKKyAqIHBvc3NpYmx5IGFsb25nIHdpdGggbWFueSBvdGhlciBkZXZpY2VzLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGNvbW1vbiBpbgorICogUENJLWJhc2VkIHN5c3RlbXMgd2l0aCBvZmYtYm9hcmQgSURFIGNvbnRyb2xsZXIgY2FyZHMuCisgKgorICogVGhlIElERSBkcml2ZXIgdXNlcyB0aGUgc2luZ2xlIGdsb2JhbCBpZGVfbG9jayBzcGlubG9jayB0byBwcm90ZWN0CisgKiBhY2Nlc3MgdG8gdGhlIHJlcXVlc3QgcXVldWVzLCBhbmQgdG8gcHJvdGVjdCB0aGUgaHdncm91cC0+YnVzeSBmbGFnLgorICoKKyAqIFRoZSBmaXJzdCB0aHJlYWQgaW50byB0aGUgZHJpdmVyIGZvciBhIHBhcnRpY3VsYXIgaHdncm91cCBzZXRzIHRoZQorICogaHdncm91cC0+YnVzeSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBod2dyb3VwIGlzIG5vdyBhY3RpdmUsCisgKiBhbmQgdGhlbiBpbml0aWF0ZXMgcHJvY2Vzc2luZyBvZiB0aGUgdG9wIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBxdWV1ZS4KKyAqCisgKiBPdGhlciB0aHJlYWRzIGF0dGVtcHRpbmcgZW50cnkgbm90aWNlIHRoZSBidXN5IHNldHRpbmcsIGFuZCB3aWxsIHNpbXBseQorICogcXVldWUgdGhlaXIgbmV3IHJlcXVlc3RzIGFuZCBleGl0IGltbWVkaWF0ZWx5LiAgTm90ZSB0aGF0IGh3Z3JvdXAtPmJ1c3kKKyAqIHJlbWFpbnMgc2V0IGV2ZW4gd2hlbiB0aGUgZHJpdmVyIGlzIG1lcmVseSBhd2FpdGluZyB0aGUgbmV4dCBpbnRlcnJ1cHQuCisgKiBUaHVzLCB0aGUgbWVhbmluZyBpcyAidGhpcyBod2dyb3VwIGlzIGJ1c3kgcHJvY2Vzc2luZyBhIHJlcXVlc3QiLgorICoKKyAqIFdoZW4gcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QgY29tcGxldGVzLCB0aGUgY29tcGxldGluZyB0aHJlYWQgb3IgSVJRLWhhbmRsZXIKKyAqIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZS4gIElmIG5vIG1vcmUgd29yayByZW1haW5zLAorICogdGhlIGRyaXZlciB3aWxsIGNsZWFyIHRoZSBod2dyb3VwLT5idXN5IGZsYWcgYW5kIGV4aXQuCisgKgorICogVGhlIGlkZV9sb2NrIChzcGlubG9jaykgaXMgdXNlZCB0byBwcm90ZWN0IGFsbCBhY2Nlc3MgdG8gdGhlCisgKiBod2dyb3VwLT5idXN5IGZsYWcsIGJ1dCBpcyBvdGhlcndpc2Ugbm90IG5lZWRlZCBmb3IgbW9zdCBwcm9jZXNzaW5nIGluCisgKiB0aGUgZHJpdmVyLiAgVGhpcyBtYWtlcyB0aGUgZHJpdmVyIG11Y2ggbW9yZSBmcmllbmRsaWVyIHRvIHNoYXJlZCBJUlFzCisgKiB0aGFuIHByZXZpb3VzIGRlc2lnbnMsIHdoaWxlIHJlbWFpbmluZyAxMDAlICg/KSBTTVAgc2FmZSBhbmQgY2FwYWJsZS4KKyAqLworc3RhdGljIHZvaWQgaWRlX2RvX3JlcXVlc3QgKGlkZV9od2dyb3VwX3QgKmh3Z3JvdXAsIGludCBtYXNrZWRfaXJxKQoreworCWlkZV9kcml2ZV90CSpkcml2ZTsKKwlpZGVfaHdpZl90CSpod2lmOworCXN0cnVjdCByZXF1ZXN0CSpycTsKKwlpZGVfc3RhcnRzdG9wX3QJc3RhcnRzdG9wOworCisJLyogZm9yIGF0YXJpIG9ubHk6IFBPU1NJQkxZIEJST0tFTiBIRVJFKD8pICovCisJaWRlX2dldF9sb2NrKGlkZV9pbnRyLCBod2dyb3VwKTsKKworCS8qIGNhbGxlciBtdXN0IG93biBpZGVfbG9jayAqLworCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKKworCXdoaWxlICghaHdncm91cC0+YnVzeSkgeworCQlod2dyb3VwLT5idXN5ID0gMTsKKwkJZHJpdmUgPSBjaG9vc2VfZHJpdmUoaHdncm91cCk7CisJCWlmIChkcml2ZSA9PSBOVUxMKSB7CisJCQlpbnQgc2xlZXBpbmcgPSAwOworCQkJdW5zaWduZWQgbG9uZyBzbGVlcCA9IDA7IC8qIHNodXQgdXAsIGdjYyAqLworCQkJaHdncm91cC0+cnEgPSBOVUxMOworCQkJZHJpdmUgPSBod2dyb3VwLT5kcml2ZTsKKwkJCWRvIHsKKwkJCQlpZiAoZHJpdmUtPnNsZWVwaW5nICYmICghc2xlZXBpbmcgfHwgdGltZV9iZWZvcmUoZHJpdmUtPnNsZWVwLCBzbGVlcCkpKSB7CisJCQkJCXNsZWVwaW5nID0gMTsKKwkJCQkJc2xlZXAgPSBkcml2ZS0+c2xlZXA7CisJCQkJfQorCQkJfSB3aGlsZSAoKGRyaXZlID0gZHJpdmUtPm5leHQpICE9IGh3Z3JvdXAtPmRyaXZlKTsKKwkJCWlmIChzbGVlcGluZykgeworCQkvKgorCQkgKiBUYWtlIGEgc2hvcnQgc25vb3plLCBhbmQgdGhlbiB3YWtlIHVwIHRoaXMgaHdncm91cCBhZ2Fpbi4KKwkJICogVGhpcyBnaXZlcyBvdGhlciBod2dyb3VwcyBvbiB0aGUgc2FtZSBhIGNoYW5jZSB0bworCQkgKiBwbGF5IGZhaXJseSB3aXRoIHVzLCBqdXN0IGluIGNhc2UgdGhlcmUgYXJlIGJpZyBkaWZmZXJlbmNlcworCQkgKiBpbiByZWxhdGl2ZSB0aHJvdWdocHV0cy4uIGRvbid0IHdhbnQgdG8gaG9nIHRoZSBjcHUgdG9vIG11Y2guCisJCSAqLworCQkJCWlmICh0aW1lX2JlZm9yZShzbGVlcCwgamlmZmllcyArIFdBSVRfTUlOX1NMRUVQKSkKKwkJCQkJc2xlZXAgPSBqaWZmaWVzICsgV0FJVF9NSU5fU0xFRVA7CisjaWYgMQorCQkJCWlmICh0aW1lcl9wZW5kaW5nKCZod2dyb3VwLT50aW1lcikpCisJCQkJCXByaW50ayhLRVJOX0NSSVQgImlkZV9zZXRfaGFuZGxlcjogdGltZXIgYWxyZWFkeSBhY3RpdmVcbiIpOworI2VuZGlmCisJCQkJLyogc28gdGhhdCBpZGVfdGltZXJfZXhwaXJ5IGtub3dzIHdoYXQgdG8gZG8gKi8KKwkJCQlod2dyb3VwLT5zbGVlcGluZyA9IDE7CisJCQkJbW9kX3RpbWVyKCZod2dyb3VwLT50aW1lciwgc2xlZXApOworCQkJCS8qIHdlIHB1cnBvc2VseSBsZWF2ZSBod2dyb3VwLT5idXN5PT0xCisJCQkJICogd2hpbGUgc2xlZXBpbmcgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogVWdseSwgYnV0IGhvdyBjYW4gd2Ugc2xlZXAgZm9yIHRoZSBsb2NrCisJCQkJICogb3RoZXJ3aXNlPyBwZXJoYXBzIGZyb20gdHFfZGlzaz8KKwkJCQkgKi8KKworCQkJCS8qIGZvciBhdGFyaSBvbmx5ICovCisJCQkJaWRlX3JlbGVhc2VfbG9jaygpOworCQkJCWh3Z3JvdXAtPmJ1c3kgPSAwOworCQkJfQorCisJCQkvKiBubyBtb3JlIHdvcmsgZm9yIHRoaXMgaHdncm91cCAoZm9yIG5vdykgKi8KKwkJCXJldHVybjsKKwkJfQorCQlod2lmID0gSFdJRihkcml2ZSk7CisJCWlmIChod2dyb3VwLT5od2lmLT5zaGFyaW5nX2lycSAmJgorCQkgICAgaHdpZiAhPSBod2dyb3VwLT5od2lmICYmCisJCSAgICBod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKSB7CisJCQkvKiBzZXQgbklFTiBmb3IgcHJldmlvdXMgaHdpZiAqLworCQkJU0VMRUNUX0lOVEVSUlVQVChkcml2ZSk7CisJCX0KKwkJaHdncm91cC0+aHdpZiA9IGh3aWY7CisJCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmU7CisJCWRyaXZlLT5zbGVlcGluZyA9IDA7CisJCWRyaXZlLT5zZXJ2aWNlX3N0YXJ0ID0gamlmZmllczsKKworCQlpZiAoYmxrX3F1ZXVlX3BsdWdnZWQoZHJpdmUtPnF1ZXVlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZGU6IGh1aD8gcXVldWUgd2FzIHBsdWdnZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogd2Uga25vdyB0aGF0IHRoZSBxdWV1ZSBpc24ndCBlbXB0eSwgYnV0IHRoaXMgY2FuIGhhcHBlbgorCQkgKiBpZiB0aGUgcS0+cHJlcF9ycV9mbigpIGRlY2lkZXMgdG8ga2lsbCBhIHJlcXVlc3QKKwkJICovCisJCXJxID0gZWx2X25leHRfcmVxdWVzdChkcml2ZS0+cXVldWUpOworCQlpZiAoIXJxKSB7CisJCQlod2dyb3VwLT5idXN5ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogU2FuaXR5OiBkb24ndCBhY2NlcHQgYSByZXF1ZXN0IHRoYXQgaXNuJ3QgYSBQTSByZXF1ZXN0CisJCSAqIGlmIHdlIGFyZSBjdXJyZW50bHkgcG93ZXIgbWFuYWdlZC4gVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBhcworCQkgKiBibGtfc3RvcF9xdWV1ZSgpIGRvZXNuJ3QgcHJldmVudCB0aGUgZWx2X25leHRfcmVxdWVzdCgpCisJCSAqIGFib3ZlIHRvIHJldHVybiB1cyB3aGF0ZXZlciBpcyBpbiB0aGUgcXVldWUuIFNpbmNlIHdlIGNhbGwKKwkJICogaWRlX2RvX3JlcXVlc3QoKSBvdXJzZWx2ZXMsIHdlIGVuZCB1cCB0YWtpbmcgcmVxdWVzdHMgd2hpbGUKKwkJICogdGhlIHF1ZXVlIGlzIGJsb2NrZWQuLi4KKwkJICogCisJCSAqIFdlIGxldCByZXF1ZXN0cyBmb3JjZWQgYXQgaGVhZCBvZiBxdWV1ZSB3aXRoIGlkZS1wcmVlbXB0CisJCSAqIHRob3VnaC4gSSBob3BlIHRoYXQgZG9lc24ndCBoYXBwZW4gdG9vIG11Y2gsIGhvcGVmdWxseSBub3QKKwkJICogdW5sZXNzIHRoZSBzdWJkcml2ZXIgdHJpZ2dlcnMgc3VjaCBhIHRoaW5nIGluIGl0cyBvd24gUE0KKwkJICogc3RhdGUgbWFjaGluZS4KKwkJICovCisJCWlmIChkcml2ZS0+YmxvY2tlZCAmJiAhYmxrX3BtX3JlcXVlc3QocnEpICYmICEocnEtPmZsYWdzICYgUkVRX1BSRUVNUFQpKSB7CisJCQkvKiBXZSBjbGVhciBidXN5LCB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyBBVEEgY29tbWFuZCBhdCB0aGlzIHBvaW50LiAqLworCQkJaHdncm91cC0+YnVzeSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWh3Z3JvdXAtPnJxID0gcnE7CisKKwkJLyoKKwkJICogU29tZSBzeXN0ZW1zIGhhdmUgdHJvdWJsZSB3aXRoIElERSBJUlFzIGFycml2aW5nIHdoaWxlCisJCSAqIHRoZSBkcml2ZXIgaXMgc3RpbGwgc2V0dGluZyB0aGluZ3MgdXAuICBTbywgaGVyZSB3ZSBkaXNhYmxlCisJCSAqIHRoZSBJUlEgdXNlZCBieSB0aGlzIGludGVyZmFjZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyBiZWluZyBzdGFydGVkLgorCQkgKiBUaGlzIG1heSBsb29rIGJhZCBhdCBmaXJzdCwgYnV0IHByZXR0eSBtdWNoIHRoZSBzYW1lIHRoaW5nCisJCSAqIGhhcHBlbnMgYW55d2F5IHdoZW4gYW55IGludGVycnVwdCBjb21lcyBpbiwgSURFIG9yIG90aGVyd2lzZQorCQkgKiAgLS0gdGhlIGtlcm5lbCBtYXNrcyB0aGUgSVJRIHdoaWxlIGl0IGlzIGJlaW5nIGhhbmRsZWQuCisJCSAqLworCQlpZiAobWFza2VkX2lycSAhPSBJREVfTk9fSVJRICYmIGh3aWYtPmlycSAhPSBtYXNrZWRfaXJxKQorCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGh3aWYtPmlycSk7CisJCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCS8qIGFsbG93IG90aGVyIElSUXMgd2hpbGUgd2Ugc3RhcnQgdGhpcyByZXF1ZXN0ICovCisJCXN0YXJ0c3RvcCA9IHN0YXJ0X3JlcXVlc3QoZHJpdmUsIHJxKTsKKwkJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCQlpZiAobWFza2VkX2lycSAhPSBJREVfTk9fSVJRICYmIGh3aWYtPmlycSAhPSBtYXNrZWRfaXJxKQorCQkJZW5hYmxlX2lycShod2lmLT5pcnEpOworCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKQorCQkJaHdncm91cC0+YnVzeSA9IDA7CisJfQorfQorCisvKgorICogUGFzc2VzIHRoZSBzdHVmZiB0byBpZGVfZG9fcmVxdWVzdAorICovCit2b2lkIGRvX2lkZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSkKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBxLT5xdWV1ZWRhdGE7CisKKwlpZGVfZG9fcmVxdWVzdChIV0dST1VQKGRyaXZlKSwgSURFX05PX0lSUSk7Cit9CisKKy8qCisgKiB1bi1idXN5IHRoZSBod2dyb3VwIGV0YywgYW5kIGNsZWFyIGFueSBwZW5kaW5nIERNQSBzdGF0dXMuIHdlIHdhbnQgdG8KKyAqIHJldHJ5IHRoZSBjdXJyZW50IHJlcXVlc3QgaW4gcGlvIG1vZGUgaW5zdGVhZCBvZiByaXNraW5nIHRvc3NpbmcgaXQKKyAqIGFsbCBhd2F5CisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2RtYV90aW1lb3V0X3JldHJ5KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGVycm9yKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaWRlX3N0YXJ0c3RvcF90IHJldCA9IGlkZV9zdG9wcGVkOworCisJLyoKKwkgKiBlbmQgY3VycmVudCBkbWEgdHJhbnNhY3Rpb24KKwkgKi8KKworCWlmIChlcnJvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERNQSB0aW1lb3V0IGVycm9yXG4iLCBkcml2ZS0+bmFtZSk7CisJCSh2b2lkKUhXSUYoZHJpdmUpLT5pZGVfZG1hX2VuZChkcml2ZSk7CisJCXJldCA9IGlkZV9lcnJvcihkcml2ZSwgImRtYSB0aW1lb3V0IGVycm9yIiwKKwkJCQkJCWh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgdGltZW91dCByZXRyeVxuIiwgZHJpdmUtPm5hbWUpOworCQkodm9pZCkgaHdpZi0+aWRlX2RtYV90aW1lb3V0KGRyaXZlKTsKKwl9CisKKwkvKgorCSAqIGRpc2FibGUgZG1hIGZvciBub3csIGJ1dCByZW1lbWJlciB0aGF0IHdlIGRpZCBzbyBiZWNhdXNlIG9mCisJICogYSB0aW1lb3V0IC0tIHdlJ2xsIHJlZW5hYmxlIGFmdGVyIHdlIGZpbmlzaCB0aGlzIG5leHQgcmVxdWVzdAorCSAqIChvciByYXRoZXIgdGhlIGZpcnN0IGNodW5rIG9mIGl0KSBpbiBwaW8uCisJICovCisJZHJpdmUtPnJldHJ5X3BpbysrOworCWRyaXZlLT5zdGF0ZSA9IERNQV9QSU9fUkVUUlk7CisJKHZvaWQpIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCisJLyoKKwkgKiB1bi1idXN5IGRyaXZlIGV0YyAoaHdncm91cC0+YnVzeSBpcyBjbGVhcmVkIG9uIHJldHVybikgYW5kCisJICogbWFrZSBzdXJlIHJlcXVlc3QgaXMgc2FuZQorCSAqLworCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisKKwlycS0+ZXJyb3JzID0gMDsKKworCWlmICghcnEtPmJpbykKKwkJZ290byBvdXQ7CisKKwlycS0+c2VjdG9yID0gcnEtPmJpby0+Ymlfc2VjdG9yOworCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBiaW9faW92ZWMocnEtPmJpbyktPmJ2X2xlbiA+PiA5OworCXJxLT5oYXJkX2N1cl9zZWN0b3JzID0gcnEtPmN1cnJlbnRfbnJfc2VjdG9yczsKKwlycS0+YnVmZmVyID0gYmlvX2RhdGEocnEtPmJpbyk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglpZGVfdGltZXJfZXhwaXJ5CS0JaGFuZGxlIGxhY2sgb2YgYW4gSURFIGludGVycnVwdAorICoJQGRhdGE6IHRpbWVyIGNhbGxiYWNrIG1hZ2ljIChod2dyb3VwKQorICoKKyAqCUFuIElERSBjb21tYW5kIGhhcyB0aW1lZCBvdXQgYmVmb3JlIHRoZSBleHBlY3RlZCBkcml2ZSByZXR1cm4KKyAqCW9jY3VycmVkLiBBdCB0aGlzIHBvaW50IHdlIGF0dGVtcHQgdG8gY2xlYW4gdXAgdGhlIGN1cnJlbnQKKyAqCW1lc3MuIElmIHRoZSBjdXJyZW50IGhhbmRsZXIgaW5jbHVkZXMgYW4gZXhwaXJ5IGhhbmRsZXIgdGhlbgorICoJd2UgaW52b2tlIHRoZSBleHBpcnkgaGFuZGxlciwgYW5kIHByb3ZpZGluZyBpdCBpcyBoYXBweSB0aGUKKyAqCXdvcmsgaXMgZG9uZS4gSWYgdGhhdCBmYWlscyB3ZSBhcHBseSBnZW5lcmljIHJlY292ZXJ5IHJ1bGVzCisgKglpbnZva2luZyB0aGUgaGFuZGxlciBhbmQgY2hlY2tpbmcgdGhlIGRyaXZlIERNQSBzdGF0dXMuIFdlCisgKgloYXZlIGFuIGV4Y2Vzc2l2ZWx5IGluY2VzdHVvdXMgcmVsYXRpb25zaGlwIHdpdGggdGhlIERNQQorICoJbG9naWMgdGhhdCB3YW50cyBjbGVhbmluZyB1cC4KKyAqLworIAordm9pZCBpZGVfdGltZXJfZXhwaXJ5ICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaWRlX2h3Z3JvdXBfdAkqaHdncm91cCA9IChpZGVfaHdncm91cF90ICopIGRhdGE7CisJaWRlX2hhbmRsZXJfdAkqaGFuZGxlcjsKKwlpZGVfZXhwaXJ5X3QJKmV4cGlyeTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJd2FpdCA9IC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoKGhhbmRsZXIgPSBod2dyb3VwLT5oYW5kbGVyKSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEVpdGhlciBhIG1hcmdpbmFsIHRpbWVvdXQgb2NjdXJyZWQKKwkJICogKGdvdCB0aGUgaW50ZXJydXB0IGp1c3QgYXMgdGltZXIgZXhwaXJlZCksCisJCSAqIG9yIHdlIHdlcmUgInNsZWVwaW5nIiB0byBnaXZlIG90aGVyIGRldmljZXMgYSBjaGFuY2UuCisJCSAqIEVpdGhlciB3YXksIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGNvbXBsYWluIGFib3V0IGFueXRoaW5nLgorCQkgKi8KKwkJaWYgKGh3Z3JvdXAtPnNsZWVwaW5nKSB7CisJCQlod2dyb3VwLT5zbGVlcGluZyA9IDA7CisJCQlod2dyb3VwLT5idXN5ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlkZV9kcml2ZV90ICpkcml2ZSA9IGh3Z3JvdXAtPmRyaXZlOworCQlpZiAoIWRyaXZlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlkZV90aW1lcl9leHBpcnk6IGh3Z3JvdXAtPmRyaXZlIHdhcyBOVUxMXG4iKTsKKwkJCWh3Z3JvdXAtPmhhbmRsZXIgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaWRlX2h3aWZfdCAqaHdpZjsKKwkJCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3AgPSBpZGVfc3RvcHBlZDsKKwkJCWlmICghaHdncm91cC0+YnVzeSkgeworCQkJCWh3Z3JvdXAtPmJ1c3kgPSAxOwkvKiBwYXJhbm9pYSAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlkZV90aW1lcl9leHBpcnk6IGh3Z3JvdXAtPmJ1c3kgd2FzIDAgPz9cbiIsIGRyaXZlLT5uYW1lKTsKKwkJCX0KKwkJCWlmICgoZXhwaXJ5ID0gaHdncm91cC0+ZXhwaXJ5KSAhPSBOVUxMKSB7CisJCQkJLyogY29udGludWUgKi8KKwkJCQlpZiAoKHdhaXQgPSBleHBpcnkoZHJpdmUpKSA+IDApIHsKKwkJCQkJLyogcmVzZXQgdGltZXIgKi8KKwkJCQkJaHdncm91cC0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgd2FpdDsKKwkJCQkJYWRkX3RpbWVyKCZod2dyb3VwLT50aW1lcik7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlod2dyb3VwLT5oYW5kbGVyID0gTlVMTDsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIHNpbXVsYXRlIGEgcmVhbCBpbnRlcnJ1cHQgd2hlbiBpbnZva2luZworCQkJICogdGhlIGhhbmRsZXIoKSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0bworCQkJICogZ2xvYmFsbHkgbWFzayB0aGUgc3BlY2lmaWMgSVJROgorCQkJICovCisJCQlzcGluX3VubG9jaygmaWRlX2xvY2spOworCQkJaHdpZiAgPSBIV0lGKGRyaXZlKTsKKyNpZiBESVNBQkxFX0lSUV9OT1NZTkMKKwkJCWRpc2FibGVfaXJxX25vc3luYyhod2lmLT5pcnEpOworI2Vsc2UKKwkJCS8qIGRpc2FibGVfaXJxX25vc3luYyA/PyAqLworCQkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKKyNlbmRpZiAvKiBESVNBQkxFX0lSUV9OT1NZTkMgKi8KKwkJCS8qIGxvY2FsIENQVSBvbmx5LAorCQkJICogYXMgaWYgd2Ugd2VyZSBoYW5kbGluZyBhbiBpbnRlcnJ1cHQgKi8KKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQlpZiAoaHdncm91cC0+cG9sbGluZykgeworCQkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCQkJfSBlbHNlIGlmIChkcml2ZV9pc19yZWFkeShkcml2ZSkpIHsKKwkJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJCQkJKHZvaWQpIGh3Z3JvdXAtPmh3aWYtPmlkZV9kbWFfbG9zdGlycShkcml2ZSk7CisJCQkJKHZvaWQpaWRlX2Fja19pbnRyKGh3aWYpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsb3N0IGludGVycnVwdFxuIiwgZHJpdmUtPm5hbWUpOworCQkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkgeworCQkJCQlzdGFydHN0b3AgPSBpZGVfZG1hX3RpbWVvdXRfcmV0cnkoZHJpdmUsIHdhaXQpOworCQkJCX0gZWxzZQorCQkJCQlzdGFydHN0b3AgPQorCQkJCQlpZGVfZXJyb3IoZHJpdmUsICJpcnEgdGltZW91dCIsIGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpOworCQkJfQorCQkJZHJpdmUtPnNlcnZpY2VfdGltZSA9IGppZmZpZXMgLSBkcml2ZS0+c2VydmljZV9zdGFydDsKKwkJCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwkJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKKwkJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpCisJCQkJaHdncm91cC0+YnVzeSA9IDA7CisJCX0KKwl9CisJaWRlX2RvX3JlcXVlc3QoaHdncm91cCwgSURFX05PX0lSUSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKgl1bmV4cGVjdGVkX2ludHIJCS0JaGFuZGxlIGFuIHVuZXhwZWN0ZWQgSURFIGludGVycnVwdAorICoJQGlycTogaW50ZXJydXB0IGxpbmUKKyAqCUBod2dyb3VwOiBod2dyb3VwIGJlaW5nIHByb2Nlc3NlZAorICoKKyAqCVRoZXJlJ3Mgbm90aGluZyByZWFsbHkgdXNlZnVsIHdlIGNhbiBkbyB3aXRoIGFuIHVuZXhwZWN0ZWQgaW50ZXJydXB0LAorICoJb3RoZXIgdGhhbiByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKHRvIGNsZWFyIGl0KSwgYW5kIGxvZ2dpbmcgaXQuCisgKglUaGVyZSBzaG91bGQgYmUgbm8gd2F5IHRoYXQgYW4gaXJxIGNhbiBoYXBwZW4gYmVmb3JlIHdlJ3JlIHJlYWR5IGZvciBpdCwKKyAqCXNvIHdlIG5lZWRuJ3Qgd29ycnkgbXVjaCBhYm91dCBsb3NpbmcgYW4gImltcG9ydGFudCIgaW50ZXJydXB0IGhlcmUuCisgKgorICoJT24gbGFwdG9wcyAoYW5kICJncmVlbiIgUENzKSwgYW4gdW5leHBlY3RlZCBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyCisgKgl0aGUgZHJpdmUgZW50ZXJzICJpZGxlIiwgInN0YW5kYnkiLCBvciAic2xlZXAiIG1vZGUsIHNvIGlmIHRoZSBzdGF0dXMKKyAqCWxvb2tzICJnb29kIiwgd2UganVzdCBpZ25vcmUgdGhlIGludGVycnVwdCBjb21wbGV0ZWx5LgorICoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIF9fY2xpKCkgaXMgaW4gZWZmZWN0IHdoZW4gY2FsbGVkLgorICoKKyAqCUlmIGFuIHVuZXhwZWN0ZWQgaW50ZXJydXB0IGhhcHBlbnMgb24gaXJxMTUgd2hpbGUgd2UgYXJlIGhhbmRsaW5nIGlycTE0CisgKglhbmQgaWYgdGhlIHR3byBpbnRlcmZhY2VzIGFyZSAic2VyaWFsaXplZCIgKENNRDY0MCksIHRoZW4gaXQgbG9va3MgbGlrZQorICoJd2UgY291bGQgc2NyZXcgdXAgYnkgaW50ZXJmZXJpbmcgd2l0aCBhIG5ldyByZXF1ZXN0IGJlaW5nIHNldCB1cCBmb3IgCisgKglpcnExNS4KKyAqCisgKglJbiByZWFsaXR5LCB0aGlzIGlzIGEgbm9uLWlzc3VlLiAgVGhlIG5ldyBjb21tYW5kIGlzIG5vdCBzZW50IHVubGVzcyAKKyAqCXRoZSBkcml2ZSBpcyByZWFkeSB0byBhY2NlcHQgb25lLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgdGhlIGRyaXZlIGlzCisgKglub3QgdHJ5aW5nIHRvIGludGVycnVwdCB1cy4gIEFuZCBpZGVfc2V0X2hhbmRsZXIoKSBpcyBhbHdheXMgaW52b2tlZAorICoJYmVmb3JlIGNvbXBsZXRpbmcgdGhlIGlzc3VhbmNlIG9mIGFueSBuZXcgZHJpdmUgY29tbWFuZCwgc28gd2Ugd2lsbCBub3QKKyAqCWJlIGFjY2lkZW50YWxseSBpbnZva2VkIGFzIGEgcmVzdWx0IG9mIGFueSB2YWxpZCBjb21tYW5kIGNvbXBsZXRpb24KKyAqCWludGVycnVwdC4KKyAqCisgKglOb3RlIHRoYXQgd2UgbXVzdCB3YWxrIHRoZSBlbnRpcmUgaHdncm91cCBoZXJlLiBXZSBrbm93IHdoaWNoIGh3aWYKKyAqCWlzIGRvaW5nIHRoZSBjdXJyZW50IGNvbW1hbmQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGh3aWYgYnVycGVkCisgKglteXN0ZXJpb3VzbHkuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfaW50ciAoaW50IGlycSwgaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKK3sKKwl1OCBzdGF0OworCWlkZV9od2lmX3QgKmh3aWYgPSBod2dyb3VwLT5od2lmOworCisJLyoKKwkgKiBoYW5kbGUgdGhlIHVuZXhwZWN0ZWQgaW50ZXJydXB0CisJICovCisJZG8geworCQlpZiAoaHdpZi0+aXJxID09IGlycSkgeworCQkJc3RhdCA9IGh3aWYtPklOQihod2lmLT5pb19wb3J0c1tJREVfU1RBVFVTX09GRlNFVF0pOworCQkJaWYgKCFPS19TVEFUKHN0YXQsIFJFQURZX1NUQVQsIEJBRF9TVEFUKSkgeworCQkJCS8qIFRyeSB0byBub3QgZmxvb2QgdGhlIGNvbnNvbGUgd2l0aCBtc2dzICovCisJCQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tc2d0aW1lLCBjb3VudDsKKwkJCQkrK2NvdW50OworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3RfbXNndGltZSArIEhaKSkgeworCQkJCQlsYXN0X21zZ3RpbWUgPSBqaWZmaWVzOworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0LCAiCisJCQkJCQkic3RhdHVzPTB4JTAyeCwgY291bnQ9JWxkXG4iLAorCQkJCQkJaHdpZi0+bmFtZSwKKwkJCQkJCShod2lmLT5uZXh0PT1od2dyb3VwLT5od2lmKSA/ICIiIDogIig/KSIsIHN0YXQsIGNvdW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlICgoaHdpZiA9IGh3aWYtPm5leHQpICE9IGh3Z3JvdXAtPmh3aWYpOworfQorCisvKioKKyAqCWlkZV9pbnRyCS0JZGVmYXVsdCBJREUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqCUBkZXZfaWQ6IGh3aWYgZ3JvdXAKKyAqCUByZWdzOiB1bnVzZWQgd2VpcmRuZXNzIGZyb20gdGhlIGtlcm5lbCBpcnEgbGF5ZXIKKyAqCisgKglUaGlzIGlzIHRoZSBkZWZhdWx0IElSUSBoYW5kbGVyIGZvciB0aGUgSURFIGxheWVyLiBZb3Ugc2hvdWxkCisgKglub3QgbmVlZCB0byBvdmVycmlkZSBpdC4gSWYgeW91IGRvIGJlIGF3YXJlIGl0IGlzIHN1YnRsZSBpbgorICoJcGxhY2VzCisgKgorICoJaHdncm91cC0+aHdpZiBpcyB0aGUgaW50ZXJmYWNlIGluIHRoZSBncm91cCBjdXJyZW50bHkgcGVyZm9ybWluZworICoJYSBjb21tYW5kLiBod2dyb3VwLT5kcml2ZSBpcyB0aGUgZHJpdmUgYW5kIGh3Z3JvdXAtPmhhbmRsZXIgaXMKKyAqCXRoZSBJUlEgaGFuZGxlciB0byBjYWxsLiBBcyB3ZSBpc3N1ZSBhIGNvbW1hbmQgdGhlIGhhbmRsZXJzCisgKglzdGVwIHRocm91Z2ggbXVsdGlwbGUgc3RhdGVzLCByZWFzc2lnbmluZyB0aGUgaGFuZGxlciB0byB0aGUKKyAqCW5leHQgc3RlcCBpbiB0aGUgcHJvY2Vzcy4gVW5saWtlIGEgc21hcnQgU0NTSSBjb250cm9sbGVyIElERQorICoJZXhwZWN0cyB0aGUgbWFpbiBwcm9jZXNzb3IgdG8gc2VxdWVuY2UgdGhlIHZhcmlvdXMgdHJhbnNmZXIKKyAqCXN0YWdlcy4gV2UgYWxzbyBtYW5hZ2UgYSBwb2xsIHRpbWVyIHRvIGNhdGNoIHVwIHdpdGggbW9zdAorICoJdGltZW91dCBzaXR1YXRpb25zLiBUaGVyZSBhcmUgc3RpbGwgYSBmZXcgd2hlcmUgdGhlIGhhbmRsZXJzCisgKglkb24ndCBldmVyIGRlY2lkZSB0byBnaXZlIHVwLgorICoKKyAqCVRoZSBoYW5kbGVyIGV2ZW50dWFsbHkgcmV0dXJucyBpZGVfc3RvcHBlZCB0byBpbmRpY2F0ZSB0aGUKKyAqCXJlcXVlc3QgY29tcGxldGVkLiBBdCB0aGlzIHBvaW50IHdlIGlzc3VlIHRoZSBuZXh0IHJlcXVlc3QKKyAqCW9uIHRoZSBod2dyb3VwIGFuZCB0aGUgcHJvY2VzcyBiZWdpbnMgYWdhaW4uCisgKi8KKyAKK2lycXJldHVybl90IGlkZV9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IChpZGVfaHdncm91cF90ICopZGV2X2lkOworCWlkZV9od2lmX3QgKmh3aWY7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWlkZV9oYW5kbGVyX3QgKmhhbmRsZXI7CisJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWh3aWYgPSBod2dyb3VwLT5od2lmOworCisJaWYgKCFpZGVfYWNrX2ludHIoaHdpZikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmICgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwgfHwgaHdncm91cC0+cG9sbGluZykgeworCQkvKgorCQkgKiBOb3QgZXhwZWN0aW5nIGFuIGludGVycnVwdCBmcm9tIHRoaXMgZHJpdmUuCisJCSAqIFRoYXQgbWVhbnMgdGhpcyBjb3VsZCBiZToKKwkJICoJKDEpIGFuIGludGVycnVwdCBmcm9tIGFub3RoZXIgUENJIGRldmljZQorCQkgKglzaGFyaW5nIHRoZSBzYW1lIFBDSSBJTlQjIGFzIHVzLgorCQkgKiBvcgkoMikgYSBkcml2ZSBqdXN0IGVudGVyZWQgc2xlZXAgb3Igc3RhbmRieSBtb2RlLAorCQkgKglhbmQgaXMgaW50ZXJydXB0aW5nIHRvIGxldCB1cyBrbm93LgorCQkgKiBvcgkoMykgYSBzcHVyaW91cyBpbnRlcnJ1cHQgb2YgdW5rbm93biBvcmlnaW4uCisJCSAqCisJCSAqIEZvciBQQ0ksIHdlIGNhbm5vdCB0ZWxsIHRoZSBkaWZmZXJlbmNlLAorCQkgKiBzbyBpbiB0aGF0IGNhc2Ugd2UganVzdCBpZ25vcmUgaXQgYW5kIGhvcGUgaXQgZ29lcyBhd2F5LgorCQkgKgorCQkgKiBGSVhNRTogdW5leHBlY3RlZF9pbnRyIHNob3VsZCBiZSBod2lmLT4gdGhlbiB3ZSBjYW4KKwkJICogcmVtb3ZlIGFsbCB0aGUgaWZkZWYgUENJIGNyYXAKKwkJICovCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFUENJCisJCWlmIChod2lmLT5wY2lfZGV2ICYmICFod2lmLT5wY2lfZGV2LT52ZW5kb3IpCisjZW5kaWYJLyogQ09ORklHX0JMS19ERVZfSURFUENJICovCisJCXsKKwkJCS8qCisJCQkgKiBQcm9iYWJseSBub3QgYSBzaGFyZWQgUENJIGludGVycnVwdCwKKwkJCSAqIHNvIHdlIGNhbiBzYWZlbHkgdHJ5IHRvIGRvIHNvbWV0aGluZyBhYm91dCBpdDoKKwkJCSAqLworCQkJdW5leHBlY3RlZF9pbnRyKGlycSwgaHdncm91cCk7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFUENJCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2hhY2sgdGhlIHN0YXR1cyByZWdpc3RlciwganVzdCBpbiBjYXNlCisJCQkgKiB3ZSBoYXZlIGEgbGVmdG92ZXIgcGVuZGluZyBJUlEuCisJCQkgKi8KKwkJCSh2b2lkKSBod2lmLT5JTkIoaHdpZi0+aW9fcG9ydHNbSURFX1NUQVRVU19PRkZTRVRdKTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVQQ0kgKi8KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWRyaXZlID0gaHdncm91cC0+ZHJpdmU7CisJaWYgKCFkcml2ZSkgeworCQkvKgorCQkgKiBUaGlzIHNob3VsZCBORVZFUiBoYXBwZW4sIGFuZCB0aGVyZSBpc24ndCBtdWNoCisJCSAqIHdlIGNvdWxkIGRvIGFib3V0IGl0IGhlcmUuCisJCSAqCisJCSAqIFtOb3RlIC0gdGhpcyBjYW4gb2NjdXIgaWYgdGhlIGRyaXZlIGlzIGhvdCB1bnBsdWdnZWRdCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmICghZHJpdmVfaXNfcmVhZHkoZHJpdmUpKSB7CisJCS8qCisJCSAqIFRoaXMgaGFwcGVucyByZWd1bGFybHkgd2hlbiB3ZSBzaGFyZSBhIFBDSSBJUlEgd2l0aAorCQkgKiBhbm90aGVyIGRldmljZS4gIFVuZm9ydHVuYXRlbHksIGl0IGNhbiBhbHNvIGhhcHBlbgorCQkgKiB3aXRoIHNvbWUgYnVnZ3kgZHJpdmVzIHRoYXQgdHJpZ2dlciB0aGUgSVJRIGJlZm9yZQorCQkgKiB0aGVpciBzdGF0dXMgcmVnaXN0ZXIgaXMgdXAgdG8gZGF0ZS4gIEhvcGVmdWxseSB3ZSBoYXZlCisJCSAqIGVub3VnaCBhZHZhbmNlIG92ZXJoZWFkIHRoYXQgdGhlIGxhdHRlciBpc24ndCBhIHByb2JsZW0uCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWlmICghaHdncm91cC0+YnVzeSkgeworCQlod2dyb3VwLT5idXN5ID0gMTsJLyogcGFyYW5vaWEgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaWRlX2ludHI6IGh3Z3JvdXAtPmJ1c3kgd2FzIDAgPz9cbiIsIGRyaXZlLT5uYW1lKTsKKwl9CisJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7CisJZGVsX3RpbWVyKCZod2dyb3VwLT50aW1lcik7CisJc3Bpbl91bmxvY2soJmlkZV9sb2NrKTsKKworCWlmIChkcml2ZS0+dW5tYXNrKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJLyogc2VydmljZSB0aGlzIGludGVycnVwdCwgbWF5IHNldCBoYW5kbGVyIGZvciBuZXh0IGludGVycnVwdCAqLworCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKworCS8qCisJICogTm90ZSB0aGF0IGhhbmRsZXIoKSBtYXkgaGF2ZSBzZXQgdGhpbmdzIHVwIGZvciBhbm90aGVyCisJICogaW50ZXJydXB0IHRvIG9jY3VyIHNvb24sIGJ1dCBpdCBjYW5ub3QgaGFwcGVuIHVudGlsCisJICogd2UgZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYmVjYXVzZSBpdCB3aWxsIGJlIHRoZQorCSAqIHNhbWUgaXJxIGFzIGlzIGN1cnJlbnRseSBiZWluZyBzZXJ2aWNlZCBoZXJlLCBhbmQgTGludXgKKwkgKiB3b24ndCBhbGxvdyBhbm90aGVyIG9mIHRoZSBzYW1lIChvbiBhbnkgQ1BVKSB1bnRpbCB3ZSByZXR1cm4uCisJICovCisJZHJpdmUtPnNlcnZpY2VfdGltZSA9IGppZmZpZXMgLSBkcml2ZS0+c2VydmljZV9zdGFydDsKKwlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKSB7CisJCWlmIChod2dyb3VwLT5oYW5kbGVyID09IE5VTEwpIHsJLyogcGFyYW5vaWEgKi8KKwkJCWh3Z3JvdXAtPmJ1c3kgPSAwOworCQkJaWRlX2RvX3JlcXVlc3QoaHdncm91cCwgaHdpZi0+aXJxKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlkZV9pbnRyOiBodWg/IGV4cGVjdGVkIE5VTEwgaGFuZGxlciAiCisJCQkJIm9uIGV4aXRcbiIsIGRyaXZlLT5uYW1lKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKglpZGVfaW5pdF9kcml2ZV9jbWQJLQlpbml0aWFsaXplIGEgZHJpdmUgY29tbWFuZCByZXF1ZXN0CisgKglAcnE6IHJlcXVlc3Qgb2JqZWN0CisgKgorICoJSW5pdGlhbGl6ZSBhIHJlcXVlc3QgYmVmb3JlIHdlIGZpbGwgaXQgaW4gYW5kIHNlbmQgaXQgZG93biB0bworICoJaWRlX2RvX2RyaXZlX2NtZC4gQ29tbWFuZHMgbXVzdCBiZSBzZXQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gUmlnaHQKKyAqCW5vdyBpdCBkb2Vzbid0IGRvIGEgbG90LCBidXQgaWYgdGhhdCBjaGFuZ2VzIGFidXNlcnMgd2lsbCBoYXZlIGEKKyAqCW5hc3R5IHN1cHJpc2UuCisgKi8KKwordm9pZCBpZGVfaW5pdF9kcml2ZV9jbWQgKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwltZW1zZXQocnEsIDAsIHNpemVvZigqcnEpKTsKKwlycS0+ZmxhZ3MgPSBSRVFfRFJJVkVfQ01EOworCXJxLT5yZWZfY291bnQgPSAxOworfQorCitFWFBPUlRfU1lNQk9MKGlkZV9pbml0X2RyaXZlX2NtZCk7CisKKy8qKgorICoJaWRlX2RvX2RyaXZlX2NtZAktCWlzc3VlIElERSBzcGVjaWFsIGNvbW1hbmQKKyAqCUBkcml2ZTogZGV2aWNlIHRvIGlzc3VlIGNvbW1hbmQKKyAqCUBycTogcmVxdWVzdCB0byBpc3N1ZQorICoJQGFjdGlvbjogYWN0aW9uIGZvciBwcm9jZXNzaW5nCisgKgorICoJVGhpcyBmdW5jdGlvbiBpc3N1ZXMgYSBzcGVjaWFsIElERSBkZXZpY2UgcmVxdWVzdAorICoJb250byB0aGUgcmVxdWVzdCBxdWV1ZS4KKyAqCisgKglJZiBhY3Rpb24gaXMgaWRlX3dhaXQsIHRoZW4gdGhlIHJxIGlzIHF1ZXVlZCBhdCB0aGUgZW5kIG9mIHRoZQorICoJcmVxdWVzdCBxdWV1ZSwgYW5kIHRoZSBmdW5jdGlvbiBzbGVlcHMgdW50aWwgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICoJVGhpcyBpcyBmb3IgdXNlIHdoZW4gaW52b2tlZCBmcm9tIGFuIGlvY3RsIGhhbmRsZXIuCisgKgorICoJSWYgYWN0aW9uIGlzIGlkZV9wcmVlbXB0LCB0aGVuIHRoZSBycSBpcyBxdWV1ZWQgYXQgdGhlIGhlYWQgb2YKKyAqCXRoZSByZXF1ZXN0IHF1ZXVlLCBkaXNwbGFjaW5nIHRoZSBjdXJyZW50bHktYmVpbmctcHJvY2Vzc2VkCisgKglyZXF1ZXN0IGFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nCisgKglmb3IgdGhlIG5ldyBycSB0byBiZSBjb21wbGV0ZWQuICBUaGlzIGlzIFZFUlkgREFOR0VST1VTLCBhbmQgaXMKKyAqCWludGVuZGVkIGZvciBjYXJlZnVsIHVzZSBieSB0aGUgQVRBUEkgdGFwZS9jZHJvbSBkcml2ZXIgY29kZS4KKyAqCisgKglJZiBhY3Rpb24gaXMgaWRlX25leHQsIHRoZW4gdGhlIHJxIGlzIHF1ZXVlZCBpbW1lZGlhdGVseSBhZnRlcgorICoJdGhlIGN1cnJlbnRseS1iZWluZy1wcm9jZXNzZWQtcmVxdWVzdCAoaWYgYW55KSwgYW5kIHRoZSBmdW5jdGlvbgorICoJcmV0dXJucyB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBuZXcgcnEgdG8gYmUgY29tcGxldGVkLiAgQXMgYWJvdmUsCisgKglUaGlzIGlzIFZFUlkgREFOR0VST1VTLCBhbmQgaXMgaW50ZW5kZWQgZm9yIGNhcmVmdWwgdXNlIGJ5IHRoZQorICoJQVRBUEkgdGFwZS9jZHJvbSBkcml2ZXIgY29kZS4KKyAqCisgKglJZiBhY3Rpb24gaXMgaWRlX2VuZCwgdGhlbiB0aGUgcnEgaXMgcXVldWVkIGF0IHRoZSBlbmQgb2YgdGhlCisgKglyZXF1ZXN0IHF1ZXVlLCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nCisgKglmb3IgdGhlIG5ldyBycSB0byBiZSBjb21wbGV0ZWQuIFRoaXMgaXMgYWdhaW4gaW50ZW5kZWQgZm9yIGNhcmVmdWwKKyAqCXVzZSBieSB0aGUgQVRBUEkgdGFwZS9jZHJvbSBkcml2ZXIgY29kZS4KKyAqLworIAoraW50IGlkZV9kb19kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpZGVfYWN0aW9uX3QgYWN0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IEhXR1JPVVAoZHJpdmUpOworCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKwlpbnQgd2hlcmUgPSBFTEVWQVRPUl9JTlNFUlRfQkFDSywgZXJyOworCWludCBtdXN0X3dhaXQgPSAoYWN0aW9uID09IGlkZV93YWl0IHx8IGFjdGlvbiA9PSBpZGVfaGVhZF93YWl0KTsKKworCXJxLT5lcnJvcnMgPSAwOworCXJxLT5ycV9zdGF0dXMgPSBSUV9BQ1RJVkU7CisKKwkvKgorCSAqIHdlIG5lZWQgdG8gaG9sZCBhbiBleHRyYSByZWZlcmVuY2UgdG8gcmVxdWVzdCBmb3Igc2FmZSBpbnNwZWN0aW9uCisJICogYWZ0ZXIgY29tcGxldGlvbgorCSAqLworCWlmIChtdXN0X3dhaXQpIHsKKwkJcnEtPnJlZl9jb3VudCsrOworCQlycS0+d2FpdGluZyA9ICZ3YWl0OworCQlycS0+ZW5kX2lvID0gYmxrX2VuZF9zeW5jX3JxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWlmIChhY3Rpb24gPT0gaWRlX3ByZWVtcHQpCisJCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwlpZiAoYWN0aW9uID09IGlkZV9wcmVlbXB0IHx8IGFjdGlvbiA9PSBpZGVfaGVhZF93YWl0KSB7CisJCXdoZXJlID0gRUxFVkFUT1JfSU5TRVJUX0ZST05UOworCQlycS0+ZmxhZ3MgfD0gUkVRX1BSRUVNUFQ7CisJfQorCV9fZWx2X2FkZF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgcnEsIHdoZXJlLCAwKTsKKwlpZGVfZG9fcmVxdWVzdChod2dyb3VwLCBJREVfTk9fSVJRKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCisJZXJyID0gMDsKKwlpZiAobXVzdF93YWl0KSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCQlycS0+d2FpdGluZyA9IE5VTEw7CisJCWlmIChycS0+ZXJyb3JzKQorCQkJZXJyID0gLUVJTzsKKworCQlibGtfcHV0X3JlcXVlc3QocnEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2RvX2RyaXZlX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAyNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpAQCAtMCwwICsxLDEyODUgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCVZlcnNpb24gMC4zNwlNYXIgMDUsIDIwMDMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJCVJlZCBIYXQgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqCUNvbnZlbnRpb25hbCBQSU8gb3BlcmF0aW9ucyBmb3IgQVRBIGRldmljZXMKKyAqLworCitzdGF0aWMgdTggaWRlX2luYiAodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiAodTgpIGluYihwb3J0KTsKK30KKworc3RhdGljIHUxNiBpZGVfaW53ICh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuICh1MTYpIGludyhwb3J0KTsKK30KKworc3RhdGljIHZvaWQgaWRlX2luc3cgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdTMyIGNvdW50KQoreworCWluc3cocG9ydCwgYWRkciwgY291bnQpOworfQorCitzdGF0aWMgdTMyIGlkZV9pbmwgKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlyZXR1cm4gKHUzMikgaW5sKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBpZGVfaW5zbCAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJaW5zbChwb3J0LCBhZGRyLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9vdXRiICh1OCB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlvdXRiKHZhbCwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9vdXRic3luYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBhZGRyLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJb3V0YihhZGRyLCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQgaWRlX291dHcgKHUxNiB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlvdXR3KHZhbCwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9vdXRzdyAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJb3V0c3cocG9ydCwgYWRkciwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBpZGVfb3V0bCAodTMyIHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCW91dGwodmFsLCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQgaWRlX291dHNsICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHUzMiBjb3VudCkKK3sKKwlvdXRzbChwb3J0LCBhZGRyLCBjb3VudCk7Cit9CisKK3ZvaWQgZGVmYXVsdF9od2lmX2lvcHMgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+T1VUQgk9IGlkZV9vdXRiOworCWh3aWYtPk9VVEJTWU5DCT0gaWRlX291dGJzeW5jOworCWh3aWYtPk9VVFcJPSBpZGVfb3V0dzsKKwlod2lmLT5PVVRMCT0gaWRlX291dGw7CisJaHdpZi0+T1VUU1cJPSBpZGVfb3V0c3c7CisJaHdpZi0+T1VUU0wJPSBpZGVfb3V0c2w7CisJaHdpZi0+SU5CCT0gaWRlX2luYjsKKwlod2lmLT5JTlcJPSBpZGVfaW53OworCWh3aWYtPklOTAk9IGlkZV9pbmw7CisJaHdpZi0+SU5TVwk9IGlkZV9pbnN3OworCWh3aWYtPklOU0wJPSBpZGVfaW5zbDsKK30KKworRVhQT1JUX1NZTUJPTChkZWZhdWx0X2h3aWZfaW9wcyk7CisKKy8qCisgKglNTUlPIG9wZXJhdGlvbnMsIHR5cGljYWxseSB1c2VkIGZvciBTQVRBIGNvbnRyb2xsZXJzCisgKi8KKworc3RhdGljIHU4IGlkZV9tbV9pbmIgKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlyZXR1cm4gKHU4KSByZWFkYigodm9pZCBfX2lvbWVtICopIHBvcnQpOworfQorCitzdGF0aWMgdTE2IGlkZV9tbV9pbncgKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlyZXR1cm4gKHUxNikgcmVhZHcoKHZvaWQgX19pb21lbSAqKSBwb3J0KTsKK30KKworc3RhdGljIHZvaWQgaWRlX21tX2luc3cgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdTMyIGNvdW50KQoreworCV9faWRlX21tX2luc3coKHZvaWQgX19pb21lbSAqKSBwb3J0LCBhZGRyLCBjb3VudCk7Cit9CisKK3N0YXRpYyB1MzIgaWRlX21tX2lubCAodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiAodTMyKSByZWFkbCgodm9pZCBfX2lvbWVtICopIHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBpZGVfbW1faW5zbCAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJX19pZGVfbW1faW5zbCgodm9pZCBfX2lvbWVtICopIHBvcnQsIGFkZHIsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgaWRlX21tX291dGIgKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJd3JpdGViKHZhbHVlLCAodm9pZCBfX2lvbWVtICopIHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBpZGVfbW1fb3V0YnN5bmMgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl3cml0ZWIodmFsdWUsICh2b2lkIF9faW9tZW0gKikgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9tbV9vdXR3ICh1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl3cml0ZXcodmFsdWUsICh2b2lkIF9faW9tZW0gKikgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9tbV9vdXRzdyAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJX19pZGVfbW1fb3V0c3coKHZvaWQgX19pb21lbSAqKSBwb3J0LCBhZGRyLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9tbV9vdXRsICh1MzIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl3cml0ZWwodmFsdWUsICh2b2lkIF9faW9tZW0gKikgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9tbV9vdXRzbCAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJX19pZGVfbW1fb3V0c2woKHZvaWQgX19pb21lbSAqKSBwb3J0LCBhZGRyLCBjb3VudCk7Cit9CisKK3ZvaWQgZGVmYXVsdF9od2lmX21taW9wcyAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlod2lmLT5PVVRCCT0gaWRlX21tX291dGI7CisJLyogTW9zdCBzeXN0ZW1zIHdpbGwgbmVlZCB0byBvdmVycmlkZSBPVVRCU1lOQywgYWxhcyBob3dldmVyCisJICAgdGhpcyBvbmUgaXMgY29udHJvbGxlciBzcGVjaWZpYyEgKi8KKwlod2lmLT5PVVRCU1lOQwk9IGlkZV9tbV9vdXRic3luYzsKKwlod2lmLT5PVVRXCT0gaWRlX21tX291dHc7CisJaHdpZi0+T1VUTAk9IGlkZV9tbV9vdXRsOworCWh3aWYtPk9VVFNXCT0gaWRlX21tX291dHN3OworCWh3aWYtPk9VVFNMCT0gaWRlX21tX291dHNsOworCWh3aWYtPklOQgk9IGlkZV9tbV9pbmI7CisJaHdpZi0+SU5XCT0gaWRlX21tX2ludzsKKwlod2lmLT5JTkwJPSBpZGVfbW1faW5sOworCWh3aWYtPklOU1cJPSBpZGVfbW1faW5zdzsKKwlod2lmLT5JTlNMCT0gaWRlX21tX2luc2w7Cit9CisKK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9od2lmX21taW9wcyk7CisKK3UzMiBpZGVfcmVhZF8yNCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IGhjeWwgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9IQ1lMX1JFRyk7CisJdTggbGN5bCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX0xDWUxfUkVHKTsKKwl1OCBzZWN0ID0gSFdJRihkcml2ZSktPklOQihJREVfU0VDVE9SX1JFRyk7CisJcmV0dXJuIChoY3lsPDwxNil8KGxjeWw8PDgpfHNlY3Q7Cit9CisKK3ZvaWQgU0VMRUNUX0RSSVZFIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWYgKEhXSUYoZHJpdmUpLT5zZWxlY3Rwcm9jKQorCQlIV0lGKGRyaXZlKS0+c2VsZWN0cHJvYyhkcml2ZSk7CisJSFdJRihkcml2ZSktPk9VVEIoZHJpdmUtPnNlbGVjdC5hbGwsIElERV9TRUxFQ1RfUkVHKTsKK30KKworRVhQT1JUX1NZTUJPTChTRUxFQ1RfRFJJVkUpOworCit2b2lkIFNFTEVDVF9JTlRFUlJVUFQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAoSFdJRihkcml2ZSktPmludHJwcm9jKQorCQlIV0lGKGRyaXZlKS0+aW50cnByb2MoZHJpdmUpOworCWVsc2UKKwkJSFdJRihkcml2ZSktPk9VVEIoZHJpdmUtPmN0bHwyLCBJREVfQ09OVFJPTF9SRUcpOworfQorCit2b2lkIFNFTEVDVF9NQVNLIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtYXNrKQoreworCWlmIChIV0lGKGRyaXZlKS0+bWFza3Byb2MpCisJCUhXSUYoZHJpdmUpLT5tYXNrcHJvYyhkcml2ZSwgbWFzayk7Cit9CisKK3ZvaWQgUVVJUktfTElTVCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChIV0lGKGRyaXZlKS0+cXVpcmtwcm9jKQorCQlkcml2ZS0+cXVpcmtfbGlzdCA9IEhXSUYoZHJpdmUpLT5xdWlya3Byb2MoZHJpdmUpOworfQorCisvKgorICogU29tZSBsb2NhbGJ1cyBFSURFIGludGVyZmFjZXMgcmVxdWlyZSBhIHNwZWNpYWwgYWNjZXNzIHNlcXVlbmNlCisgKiB3aGVuIHVzaW5nIDMyLWJpdCBJL08gaW5zdHJ1Y3Rpb25zIHRvIHRyYW5zZmVyIGRhdGEuICBXZSBjYWxsIHRoaXMKKyAqIHRoZSAidmxiX3N5bmMiIHNlcXVlbmNlLCB3aGljaCBjb25zaXN0cyBvZiB0aHJlZSBzdWNjZXNzaXZlIHJlYWRzCisgKiBvZiB0aGUgc2VjdG9yIGNvdW50IHJlZ2lzdGVyIGxvY2F0aW9uLCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKyAqIHRvIGVuc3VyZSB0aGF0IHRoZSByZWFkcyBhbGwgaGFwcGVuIHRvZ2V0aGVyLgorICovCitzdGF0aWMgdm9pZCBhdGFfdmxiX3N5bmMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIocG9ydCk7CisJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIocG9ydCk7CisJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIocG9ydCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgZm9yIG1vc3QgUElPIGRhdGEgdHJhbnNmZXJzICpmcm9tKiB0aGUgSURFIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBhdGFfaW5wdXRfZGF0YShpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKmJ1ZmZlciwgdTMyIHdjb3VudCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggaW9fMzJiaXQJCT0gZHJpdmUtPmlvXzMyYml0OworCisJaWYgKGlvXzMyYml0KSB7CisJCWlmIChpb18zMmJpdCAmIDIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlhdGFfdmxiX3N5bmMoZHJpdmUsIElERV9OU0VDVE9SX1JFRyk7CisJCQlod2lmLT5JTlNMKElERV9EQVRBX1JFRywgYnVmZmVyLCB3Y291bnQpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9IGVsc2UKKwkJCWh3aWYtPklOU0woSURFX0RBVEFfUkVHLCBidWZmZXIsIHdjb3VudCk7CisJfSBlbHNlIHsKKwkJaHdpZi0+SU5TVyhJREVfREFUQV9SRUcsIGJ1ZmZlciwgd2NvdW50PDwxKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgZm9yIG1vc3QgUElPIGRhdGEgdHJhbnNmZXJzICp0byogdGhlIElERSBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQgYXRhX291dHB1dF9kYXRhKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqYnVmZmVyLCB1MzIgd2NvdW50KQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBpb18zMmJpdAkJPSBkcml2ZS0+aW9fMzJiaXQ7CisKKwlpZiAoaW9fMzJiaXQpIHsKKwkJaWYgKGlvXzMyYml0ICYgMikgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWF0YV92bGJfc3luYyhkcml2ZSwgSURFX05TRUNUT1JfUkVHKTsKKwkJCWh3aWYtPk9VVFNMKElERV9EQVRBX1JFRywgYnVmZmVyLCB3Y291bnQpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9IGVsc2UKKwkJCWh3aWYtPk9VVFNMKElERV9EQVRBX1JFRywgYnVmZmVyLCB3Y291bnQpOworCX0gZWxzZSB7CisJCWh3aWYtPk9VVFNXKElERV9EQVRBX1JFRywgYnVmZmVyLCB3Y291bnQ8PDEpOworCX0KK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIG1haW5seSB1c2VkIGJ5IHRoZSBBVEFQSSBkcml2ZXJzLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIHdpbGwgcm91bmQgdXAgYW55IHJlcXVlc3QgZm9yIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsCisgKiBzbyBpZiBhbiBvZGQgYnl0ZWNvdW50IGlzIHNwZWNpZmllZCwgYmUgc3VyZSB0aGF0IHRoZXJlJ3MgYXQgbGVhc3Qgb25lCisgKiBleHRyYSBieXRlIGFsbG9jYXRlZCBmb3IgdGhlIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFwaV9pbnB1dF9ieXRlcyhpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKmJ1ZmZlciwgdTMyIGJ5dGVjb3VudCkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisKKwkrK2J5dGVjb3VudDsKKyNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkgfHwgZGVmaW5lZChDT05GSUdfUTQwKQorCWlmIChNQUNIX0lTX0FUQVJJIHx8IE1BQ0hfSVNfUTQwKSB7CisJCS8qIEF0YXJpIGhhcyBhIGJ5dGUtc3dhcHBlZCBJREUgaW50ZXJmYWNlICovCisJCWluc3dfc3dhcHcoSURFX0RBVEFfUkVHLCBidWZmZXIsIGJ5dGVjb3VudCAvIDIpOworCQlyZXR1cm47CisJfQorI2VuZGlmIC8qIENPTkZJR19BVEFSSSB8fCBDT05GSUdfUTQwICovCisJaHdpZi0+YXRhX2lucHV0X2RhdGEoZHJpdmUsIGJ1ZmZlciwgYnl0ZWNvdW50IC8gNCk7CisJaWYgKChieXRlY291bnQgJiAweDAzKSA+PSAyKQorCQlod2lmLT5JTlNXKElERV9EQVRBX1JFRywgKCh1OCAqKWJ1ZmZlcikrKGJ5dGVjb3VudCAmIH4weDAzKSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YXBpX291dHB1dF9ieXRlcyhpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKmJ1ZmZlciwgdTMyIGJ5dGVjb3VudCkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisKKwkrK2J5dGVjb3VudDsKKyNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkgfHwgZGVmaW5lZChDT05GSUdfUTQwKQorCWlmIChNQUNIX0lTX0FUQVJJIHx8IE1BQ0hfSVNfUTQwKSB7CisJCS8qIEF0YXJpIGhhcyBhIGJ5dGUtc3dhcHBlZCBJREUgaW50ZXJmYWNlICovCisJCW91dHN3X3N3YXB3KElERV9EQVRBX1JFRywgYnVmZmVyLCBieXRlY291bnQgLyAyKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQVRBUkkgfHwgQ09ORklHX1E0MCAqLworCWh3aWYtPmF0YV9vdXRwdXRfZGF0YShkcml2ZSwgYnVmZmVyLCBieXRlY291bnQgLyA0KTsKKwlpZiAoKGJ5dGVjb3VudCAmIDB4MDMpID49IDIpCisJCWh3aWYtPk9VVFNXKElERV9EQVRBX1JFRywgKCh1OCopYnVmZmVyKSsoYnl0ZWNvdW50ICYgfjB4MDMpLCAxKTsKK30KKwordm9pZCBkZWZhdWx0X2h3aWZfdHJhbnNwb3J0KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YXRhX2lucHV0X2RhdGEJCT0gYXRhX2lucHV0X2RhdGE7CisJaHdpZi0+YXRhX291dHB1dF9kYXRhCQk9IGF0YV9vdXRwdXRfZGF0YTsKKwlod2lmLT5hdGFwaV9pbnB1dF9ieXRlcwkJPSBhdGFwaV9pbnB1dF9ieXRlczsKKwlod2lmLT5hdGFwaV9vdXRwdXRfYnl0ZXMJPSBhdGFwaV9vdXRwdXRfYnl0ZXM7Cit9CisKK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9od2lmX3RyYW5zcG9ydCk7CisKKy8qCisgKiBCZWdpbm5pbmcgb2YgVGFza2ZpbGUgT1BDT0RFIExpYnJhcnkgYW5kIGZlYXR1cmUgc2V0cy4KKyAqLwordm9pZCBpZGVfZml4X2RyaXZlaWQgKHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCisjIGlmZGVmIF9fQklHX0VORElBTgorCWludCBpOworCXUxNiAqc3RyaW5nY2FzdDsKKworCWlkLT5jb25maWcgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmNvbmZpZyk7CisJaWQtPmN5bHMgICAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+Y3lscyk7CisJaWQtPnJlc2VydmVkMiAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+cmVzZXJ2ZWQyKTsKKwlpZC0+aGVhZHMgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5oZWFkcyk7CisJaWQtPnRyYWNrX2J5dGVzICAgID0gX19sZTE2X3RvX2NwdShpZC0+dHJhY2tfYnl0ZXMpOworCWlkLT5zZWN0b3JfYnl0ZXMgICA9IF9fbGUxNl90b19jcHUoaWQtPnNlY3Rvcl9ieXRlcyk7CisJaWQtPnNlY3RvcnMgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+c2VjdG9ycyk7CisJaWQtPnZlbmRvcjAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+dmVuZG9yMCk7CisJaWQtPnZlbmRvcjEgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+dmVuZG9yMSk7CisJaWQtPnZlbmRvcjIgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+dmVuZG9yMik7CisJc3RyaW5nY2FzdCA9ICh1MTYgKikmaWQtPnNlcmlhbF9ub1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgKDIwLzIpOyBpKyspCisJCXN0cmluZ2Nhc3RbaV0gPSBfX2xlMTZfdG9fY3B1KHN0cmluZ2Nhc3RbaV0pOworCWlkLT5idWZfdHlwZSAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmJ1Zl90eXBlKTsKKwlpZC0+YnVmX3NpemUgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5idWZfc2l6ZSk7CisJaWQtPmVjY19ieXRlcyAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZWNjX2J5dGVzKTsKKwlzdHJpbmdjYXN0ID0gKHUxNiAqKSZpZC0+ZndfcmV2WzBdOworCWZvciAoaSA9IDA7IGkgPCAoOC8yKTsgaSsrKQorCQlzdHJpbmdjYXN0W2ldID0gX19sZTE2X3RvX2NwdShzdHJpbmdjYXN0W2ldKTsKKwlzdHJpbmdjYXN0ID0gKHUxNiAqKSZpZC0+bW9kZWxbMF07CisJZm9yIChpID0gMDsgaSA8ICg0MC8yKTsgaSsrKQorCQlzdHJpbmdjYXN0W2ldID0gX19sZTE2X3RvX2NwdShzdHJpbmdjYXN0W2ldKTsKKwlpZC0+ZHdvcmRfaW8gICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5kd29yZF9pbyk7CisJaWQtPnJlc2VydmVkNTAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+cmVzZXJ2ZWQ1MCk7CisJaWQtPmZpZWxkX3ZhbGlkICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZmllbGRfdmFsaWQpOworCWlkLT5jdXJfY3lscyAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmN1cl9jeWxzKTsKKwlpZC0+Y3VyX2hlYWRzICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jdXJfaGVhZHMpOworCWlkLT5jdXJfc2VjdG9ycyAgICA9IF9fbGUxNl90b19jcHUoaWQtPmN1cl9zZWN0b3JzKTsKKwlpZC0+Y3VyX2NhcGFjaXR5MCAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jdXJfY2FwYWNpdHkwKTsKKwlpZC0+Y3VyX2NhcGFjaXR5MSAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jdXJfY2FwYWNpdHkxKTsKKwlpZC0+bGJhX2NhcGFjaXR5ICAgPSBfX2xlMzJfdG9fY3B1KGlkLT5sYmFfY2FwYWNpdHkpOworCWlkLT5kbWFfMXdvcmQgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmRtYV8xd29yZCk7CisJaWQtPmRtYV9td29yZCAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZG1hX213b3JkKTsKKwlpZC0+ZWlkZV9waW9fbW9kZXMgPSBfX2xlMTZfdG9fY3B1KGlkLT5laWRlX3Bpb19tb2Rlcyk7CisJaWQtPmVpZGVfZG1hX21pbiAgID0gX19sZTE2X3RvX2NwdShpZC0+ZWlkZV9kbWFfbWluKTsKKwlpZC0+ZWlkZV9kbWFfdGltZSAgPSBfX2xlMTZfdG9fY3B1KGlkLT5laWRlX2RtYV90aW1lKTsKKwlpZC0+ZWlkZV9waW8gICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5laWRlX3Bpbyk7CisJaWQtPmVpZGVfcGlvX2lvcmR5ID0gX19sZTE2X3RvX2NwdShpZC0+ZWlkZV9waW9faW9yZHkpOworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisJCWlkLT53b3JkczY5XzcwW2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHM2OV83MFtpXSk7CisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJaWQtPndvcmRzNzFfNzRbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczcxXzc0W2ldKTsKKwlpZC0+cXVldWVfZGVwdGggICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5xdWV1ZV9kZXB0aCk7CisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJaWQtPndvcmRzNzZfNzlbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3Jkczc2Xzc5W2ldKTsKKwlpZC0+bWFqb3JfcmV2X251bSAgPSBfX2xlMTZfdG9fY3B1KGlkLT5tYWpvcl9yZXZfbnVtKTsKKwlpZC0+bWlub3JfcmV2X251bSAgPSBfX2xlMTZfdG9fY3B1KGlkLT5taW5vcl9yZXZfbnVtKTsKKwlpZC0+Y29tbWFuZF9zZXRfMSAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jb21tYW5kX3NldF8xKTsKKwlpZC0+Y29tbWFuZF9zZXRfMiAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jb21tYW5kX3NldF8yKTsKKwlpZC0+Y2Zzc2UgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jZnNzZSk7CisJaWQtPmNmc19lbmFibGVfMSAgID0gX19sZTE2X3RvX2NwdShpZC0+Y2ZzX2VuYWJsZV8xKTsKKwlpZC0+Y2ZzX2VuYWJsZV8yICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jZnNfZW5hYmxlXzIpOworCWlkLT5jc2ZfZGVmYXVsdCAgICA9IF9fbGUxNl90b19jcHUoaWQtPmNzZl9kZWZhdWx0KTsKKwlpZC0+ZG1hX3VsdHJhICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5kbWFfdWx0cmEpOworCWlkLT50cnNldWMgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnRyc2V1Yyk7CisJaWQtPnRyc0V1YyAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+dHJzRXVjKTsKKwlpZC0+Q3VyQVBNdmFsdWVzICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5DdXJBUE12YWx1ZXMpOworCWlkLT5tcHJjICAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPm1wcmMpOworCWlkLT5od19jb25maWcgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmh3X2NvbmZpZyk7CisJaWQtPmFjb3VzdGljICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+YWNvdXN0aWMpOworCWlkLT5tc3JxcyAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPm1zcnFzKTsKKwlpZC0+c3hmZXJ0ICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5zeGZlcnQpOworCWlkLT5zYWwgICAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnNhbCk7CisJaWQtPnNwZyAgICAgICAgICAgID0gX19sZTMyX3RvX2NwdShpZC0+c3BnKTsKKwlpZC0+bGJhX2NhcGFjaXR5XzIgPSBfX2xlNjRfdG9fY3B1KGlkLT5sYmFfY2FwYWNpdHlfMik7CisJZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisJCWlkLT53b3JkczEwNF8xMjVbaV0gICA9IF9fbGUxNl90b19jcHUoaWQtPndvcmRzMTA0XzEyNVtpXSk7CisJaWQtPmxhc3RfbHVuICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+bGFzdF9sdW4pOworCWlkLT53b3JkMTI3ICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPndvcmQxMjcpOworCWlkLT5kbGYgICAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmRsZik7CisJaWQtPmNzZm8gICAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+Y3Nmbyk7CisJZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisJCWlkLT53b3JkczEzMF8xNTVbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczEzMF8xNTVbaV0pOworCWlkLT53b3JkMTU2ICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPndvcmQxNTYpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWlkLT53b3JkczE1N18xNTlbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczE1N18xNTlbaV0pOworCWlkLT5jZmFfcG93ZXIgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmNmYV9wb3dlcik7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWlkLT53b3JkczE2MV8xNzVbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczE2MV8xNzVbaV0pOworCWZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKQorCQlpZC0+d29yZHMxNzZfMjA1W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHMxNzZfMjA1W2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykKKwkJaWQtPndvcmRzMjA2XzI1NFtpXSA9IF9fbGUxNl90b19jcHUoaWQtPndvcmRzMjA2XzI1NFtpXSk7CisJaWQtPmludGVncml0eV93b3JkICA9IF9fbGUxNl90b19jcHUoaWQtPmludGVncml0eV93b3JkKTsKKyMgZWxzZQorIyAgZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjIGVuZGlmCisjZW5kaWYKK30KKworLyogRklYTUU6IGV4cG9ydGVkIGZvciB1c2UgYnkgdGhlIFVTQiBzdG9yYWdlIChpc2QyMDAuYykgY29kZSBvbmx5ICovCitFWFBPUlRfU1lNQk9MKGlkZV9maXhfZHJpdmVpZCk7CisKK3ZvaWQgaWRlX2ZpeHN0cmluZyAodTggKnMsIGNvbnN0IGludCBieXRlY291bnQsIGNvbnN0IGludCBieXRlc3dhcCkKK3sKKwl1OCAqcCA9IHMsICplbmQgPSAmc1tieXRlY291bnQgJiB+MV07IC8qIGJ5dGVjb3VudCBtdXN0IGJlIGV2ZW4gKi8KKworCWlmIChieXRlc3dhcCkgeworCQkvKiBjb252ZXJ0IGZyb20gYmlnLWVuZGlhbiB0byBob3N0IGJ5dGUgb3JkZXIgKi8KKwkJZm9yIChwID0gZW5kIDsgcCAhPSBzOykgeworCQkJdW5zaWduZWQgc2hvcnQgKnBwID0gKHVuc2lnbmVkIHNob3J0ICopIChwIC09IDIpOworCQkJKnBwID0gbnRvaHMoKnBwKTsKKwkJfQorCX0KKwkvKiBzdHJpcCBsZWFkaW5nIGJsYW5rcyAqLworCXdoaWxlIChzICE9IGVuZCAmJiAqcyA9PSAnICcpCisJCSsrczsKKwkvKiBjb21wcmVzcyBpbnRlcm5hbCBibGFua3MgYW5kIHN0cmlwIHRyYWlsaW5nIGJsYW5rcyAqLworCXdoaWxlIChzICE9IGVuZCAmJiAqcykgeworCQlpZiAoKnMrKyAhPSAnICcgfHwgKHMgIT0gZW5kICYmICpzICYmICpzICE9ICcgJykpCisJCQkqcCsrID0gKihzLTEpOworCX0KKwkvKiB3aXBlIG91dCB0cmFpbGluZyBnYXJiYWdlICovCisJd2hpbGUgKHAgIT0gZW5kKQorCQkqcCsrID0gJ1wwJzsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfZml4c3RyaW5nKTsKKworLyoKKyAqIE5lZWRlZCBmb3IgUENJIGlycSBzaGFyaW5nCisgKi8KK2ludCBkcml2ZV9pc19yZWFkeSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBzdGF0CQkJPSAwOworCisJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCisJCXJldHVybiBod2lmLT5pZGVfZG1hX3Rlc3RfaXJxKGRyaXZlKTsKKworI2lmIDAKKwkvKiBuZWVkIHRvIGd1YXJhbnRlZSA0MDBucyBzaW5jZSBsYXN0IGNvbW1hbmQgd2FzIGlzc3VlZCAqLworCXVkZWxheSgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEKKwkvKgorCSAqIFdlIGRvIGEgcGFzc2l2ZSBzdGF0dXMgdGVzdCB1bmRlciBzaGFyZWQgUENJIGludGVycnVwdHMgb24KKwkgKiBjYXJkcyB0aGF0IHRydWx5IHNoYXJlIHRoZSBBVEEgc2lkZSBpbnRlcnJ1cHQsIGJ1dCBtYXkgYWxzbyBzaGFyZQorCSAqIGFuIGludGVycnVwdCB3aXRoIGFub3RoZXIgcGNpIGNhcmQvZGV2aWNlLiAgV2UgbWFrZSBubyBhc3N1bXB0aW9ucworCSAqIGFib3V0IHBvc3NpYmxlIGlzYS1wbnAgYW5kIHBjaS1wbnAgaXNzdWVzIHlldC4KKwkgKi8KKwlpZiAoSURFX0NPTlRST0xfUkVHKQorCQlzdGF0ID0gaHdpZi0+SU5CKElERV9BTFRTVEFUVVNfUkVHKTsKKwllbHNlCisjZW5kaWYgLyogQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgKi8KKwkJLyogTm90ZTogdGhpcyBtYXkgY2xlYXIgYSBwZW5kaW5nIElSUSEhICovCisJCXN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCisJaWYgKHN0YXQgJiBCVVNZX1NUQVQpCisJCS8qIGRyaXZlIGJ1c3k6ICBkZWZpbml0ZWx5IG5vdCBpbnRlcnJ1cHRpbmcgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBkcml2ZSByZWFkeTogKm1pZ2h0KiBiZSBpbnRlcnJ1cHRpbmcgKi8KKwlyZXR1cm4gMTsKK30KKworRVhQT1JUX1NZTUJPTChkcml2ZV9pc19yZWFkeSk7CisKKy8qCisgKiBHbG9iYWwgZm9yIEFsbCwgYW5kIHRha2VuIGZyb20gaWRlLXBtYWMuYy4gQ2FuIGJlIGNhbGxlZAorICogd2l0aCBzcGlubG9jayBoZWxkICYgSVJRcyBkaXNhYmxlZCwgc28gZG9uJ3Qgc2NoZWR1bGUgIQorICovCitpbnQgd2FpdF9mb3JfcmVhZHkgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHRpbWVvdXQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXU4IHN0YXQJCQk9IDA7CisKKwl3aGlsZSgtLXRpbWVvdXQpIHsKKwkJc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyk7CisJCWlmICghKHN0YXQgJiBCVVNZX1NUQVQpKSB7CisJCQlpZiAoZHJpdmUtPnJlYWR5X3N0YXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKChzdGF0ICYgZHJpdmUtPnJlYWR5X3N0YXQpfHwoc3RhdCAmIEVSUl9TVEFUKSkKKwkJCQlicmVhazsKKwkJfQorCQltZGVsYXkoMSk7CisJfQorCWlmICgoc3RhdCAmIEVSUl9TVEFUKSB8fCB0aW1lb3V0IDw9IDApIHsKKwkJaWYgKHN0YXQgJiBFUlJfU1RBVCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogd2FpdF9mb3JfcmVhZHksICIKKwkJCQkiZXJyb3Igc3RhdHVzOiAleFxuIiwgZHJpdmUtPm5hbWUsIHN0YXQpOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9yZWFkeSk7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgYnVzeS13YWl0cyBmb3IgdGhlIGRyaXZlIHN0YXR1cyB0byBiZSBub3QgImJ1c3kiLgorICogSXQgdGhlbiBjaGVja3MgdGhlIHN0YXR1cyBmb3IgYWxsIG9mIHRoZSAiZ29vZCIgYml0cyBhbmQgbm9uZQorICogb2YgdGhlICJiYWQiIGJpdHMsIGFuZCBpZiBhbGwgaXMgb2theSBpdCByZXR1cm5zIDAuICBBbGwgb3RoZXIKKyAqIGNhc2VzIHJldHVybiAxIGFmdGVyIGludm9raW5nIGlkZV9lcnJvcigpIC0tIGNhbGxlciBzaG91bGQganVzdCByZXR1cm4uCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBnZXQgZml4ZWQgdG8gbm90IGhvZyB0aGUgY3B1IGR1cmluZyBleHRyYSBsb25nIHdhaXRzLi4KKyAqIFRoYXQgY291bGQgYmUgZG9uZSBieSBidXN5LXdhaXRpbmcgZm9yIHRoZSBmaXJzdCBqaWZmeSBvciB0d28sIGFuZCB0aGVuCisgKiBzZXR0aW5nIGEgdGltZXIgdG8gd2FrZSB1cCBhdCBoYWxmIHNlY29uZCBpbnRlcnZhbHMgdGhlcmVhZnRlciwKKyAqIHVudGlsIHRpbWVvdXQgaXMgYWNoaWV2ZWQsIGJlZm9yZSB0aW1pbmcgb3V0LgorICovCitpbnQgaWRlX3dhaXRfc3RhdCAoaWRlX3N0YXJ0c3RvcF90ICpzdGFydHN0b3AsIGlkZV9kcml2ZV90ICpkcml2ZSwgdTggZ29vZCwgdTggYmFkLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXU4IHN0YXQ7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwkvKiBiYWlsIGVhcmx5IGlmIHdlJ3ZlIGV4Y2VlZGVkIG1heF9mYWlsdXJlcyAqLworCWlmIChkcml2ZS0+bWF4X2ZhaWx1cmVzICYmIChkcml2ZS0+ZmFpbHVyZXMgPiBkcml2ZS0+bWF4X2ZhaWx1cmVzKSkgeworCQkqc3RhcnRzdG9wID0gaWRlX3N0b3BwZWQ7CisJCXJldHVybiAxOworCX0KKworCXVkZWxheSgxKTsJLyogc3BlYyBhbGxvd3MgZHJpdmUgNDAwbnMgdG8gYXNzZXJ0ICJCVVNZIiAqLworCWlmICgoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpICYgQlVTWV9TVEFUKSB7CisJCWxvY2FsX2lycV9zZXQoZmxhZ3MpOworCQl0aW1lb3V0ICs9IGppZmZpZXM7CisJCXdoaWxlICgoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpICYgQlVTWV9TVEFUKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCS8qCisJCQkJICogT25lIGxhc3QgcmVhZCBhZnRlciB0aGUgdGltZW91dCBpbiBjYXNlCisJCQkJICogaGVhdnkgaW50ZXJydXB0IGxvYWQgbWFkZSB1cyBub3QgbWFrZSBhbnkKKwkJCQkgKiBwcm9ncmVzcyBkdXJpbmcgdGhlIHRpbWVvdXQuLgorCQkJCSAqLworCQkJCXN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCQkJCWlmICghKHN0YXQgJiBCVVNZX1NUQVQpKQorCQkJCQlicmVhazsKKworCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQkqc3RhcnRzdG9wID0gaWRlX2Vycm9yKGRyaXZlLCAic3RhdHVzIHRpbWVvdXQiLCBzdGF0KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCS8qCisJICogQWxsb3cgc3RhdHVzIHRvIHNldHRsZSwgdGhlbiByZWFkIGl0IGFnYWluLgorCSAqIEEgZmV3IHJhcmUgZHJpdmVzIHZhc3RseSB2aW9sYXRlIHRoZSA0MDBucyBzcGVjIGhlcmUsCisJICogc28gd2UnbGwgd2FpdCB1cCB0byAxMHVzZWMgZm9yIGEgImdvb2QiIHN0YXR1cworCSAqIHJhdGhlciB0aGFuIGV4cGVuc2l2ZWx5IGZhaWwgdGhpbmdzIGltbWVkaWF0ZWx5LgorCSAqIFRoaXMgZml4IGNvdXJ0ZXN5IG9mIE1hdHRoZXcgRmF1cGVsICYgTmljY29sbyBSaWdhY2NpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKE9LX1NUQVQoKHN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSwgZ29vZCwgYmFkKSkKKwkJCXJldHVybiAwOworCX0KKwkqc3RhcnRzdG9wID0gaWRlX2Vycm9yKGRyaXZlLCAic3RhdHVzIGVycm9yIiwgc3RhdCk7CisJcmV0dXJuIDE7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX3dhaXRfc3RhdCk7CisKKy8qCisgKiAgQWxsIGhvc3RzIHRoYXQgdXNlIHRoZSA4MGMgcmliYm9uIG11c3QgdXNlIQorICogIFRoZSBuYW1lIGlzIGRlcml2ZWQgZnJvbSB1cHBlciBieXRlIG9mIHdvcmQgOTMgYW5kIHRoZSA4MGMgcmliYm9uLgorICovCit1OCBlaWdodHlfbmludHlfdGhyZWUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKyNpZiAwCisJaWYgKCFIV0lGKGRyaXZlKS0+dWRtYV9mb3VyKQorCQlyZXR1cm4gMDsKKworCWlmIChkcml2ZS0+aWQtPm1ham9yX3Jldl9udW0pIHsKKwkJaW50IGhzc2JkID0gMDsKKwkJaW50IGk7CisJCS8qCisJCSAqIERldGVybWluZSBoaWdoZXN0IFN1cHBvcnRlZCBTUEVDCisJCSAqLworCQlmb3IgKGk9MTsgaTw9MTU7IGkrKykKKwkJCWlmIChkcml2ZS0+aWQtPm1ham9yX3Jldl9udW0gJiAoMTw8aSkpCisJCQkJaHNzYmQrKzsKKworCQlzd2l0Y2ggKGhzc2JkKSB7CisJCQljYXNlIDc6CisJCQljYXNlIDY6CisJCQljYXNlIDU6CisJCS8qIEFUQS00IGFuZCBvbGRlciBkbyBub3Qgc3VwcG9ydCBhYm92ZSBVbHRyYSAzMyAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAoKHU4KSAoCisjaWZuZGVmIENPTkZJR19JREVETUFfSVZCCisJCShkcml2ZS0+aWQtPmh3X2NvbmZpZyAmIDB4NDAwMCkgJiYKKyNlbmRpZiAvKiBDT05GSUdfSURFRE1BX0lWQiAqLworCQkgKGRyaXZlLT5pZC0+aHdfY29uZmlnICYgMHg2MDAwKSkgPyAxIDogMCk7CisKKyNlbHNlCisKKwlyZXR1cm4gKCh1OCkgKChIV0lGKGRyaXZlKS0+dWRtYV9mb3VyKSAmJgorI2lmbmRlZiBDT05GSUdfSURFRE1BX0lWQgorCQkJKGRyaXZlLT5pZC0+aHdfY29uZmlnICYgMHg0MDAwKSAmJgorI2VuZGlmIC8qIENPTkZJR19JREVETUFfSVZCICovCisJCQkoZHJpdmUtPmlkLT5od19jb25maWcgJiAweDYwMDApKSA/IDEgOiAwKTsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MKGVpZ2h0eV9uaW50eV90aHJlZSk7CisKK2ludCBpZGVfYXRhNjZfY2hlY2sgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX3Rhc2tfdCAqYXJncykKK3sKKwlpZiAoKGFyZ3MtPnRmUmVnaXN0ZXJbSURFX0NPTU1BTkRfT0ZGU0VUXSA9PSBXSU5fU0VURkVBVFVSRVMpICYmCisJICAgIChhcmdzLT50ZlJlZ2lzdGVyW0lERV9TRUNUT1JfT0ZGU0VUXSA+IFhGRVJfVURNQV8yKSAmJgorCSAgICAoYXJncy0+dGZSZWdpc3RlcltJREVfRkVBVFVSRV9PRkZTRVRdID09IFNFVEZFQVRVUkVTX1hGRVIpKSB7CisjaWZuZGVmIENPTkZJR19JREVETUFfSVZCCisJCWlmICgoZHJpdmUtPmlkLT5od19jb25maWcgJiAweDYwMDApID09IDApIHsKKyNlbHNlIC8qICFDT05GSUdfSURFRE1BX0lWQiAqLworCQlpZiAoKChkcml2ZS0+aWQtPmh3X2NvbmZpZyAmIDB4MjAwMCkgPT0gMCkgfHwKKwkJICAgICgoZHJpdmUtPmlkLT5od19jb25maWcgJiAweDQwMDApID09IDApKSB7CisjZW5kaWYgLyogQ09ORklHX0lERURNQV9JVkIgKi8KKwkJCXByaW50aygiJXM6IFNwZWVkIHdhcm5pbmdzIFVETUEgMy80LzUgaXMgbm90ICIKKwkJCQkiZnVuY3Rpb25hbC5cbiIsIGRyaXZlLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghSFdJRihkcml2ZSktPnVkbWFfZm91cikgeworCQkJcHJpbnRrKCIlczogU3BlZWQgd2FybmluZ3MgVURNQSAzLzQvNSBpcyBub3QgIgorCQkJCSJmdW5jdGlvbmFsLlxuIiwKKwkJCQlIV0lGKGRyaXZlKS0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJhY2tzaWRlIG9mIEhESU9fRFJJVkVfQ01EIGNhbGwgb2YgU0VURkVBVFVSRVNfWEZFUi4KKyAqIDEgOiBTYWZlIHRvIHVwZGF0ZSBkcml2ZS0+aWQgRE1BIHJlZ2lzdGVycy4KKyAqIDAgOiBPT1BzIG5vdCBhbGxvd2VkLgorICovCitpbnQgc2V0X3RyYW5zZmVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV90YXNrX3QgKmFyZ3MpCit7CisJaWYgKChhcmdzLT50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0gPT0gV0lOX1NFVEZFQVRVUkVTKSAmJgorCSAgICAoYXJncy0+dGZSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF0gPj0gWEZFUl9TV19ETUFfMCkgJiYKKwkgICAgKGFyZ3MtPnRmUmVnaXN0ZXJbSURFX0ZFQVRVUkVfT0ZGU0VUXSA9PSBTRVRGRUFUVVJFU19YRkVSKSAmJgorCSAgICAoZHJpdmUtPmlkLT5kbWFfdWx0cmEgfHwKKwkgICAgIGRyaXZlLT5pZC0+ZG1hX213b3JkIHx8CisJICAgICBkcml2ZS0+aWQtPmRtYV8xd29yZCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUEKK3N0YXRpYyB1OCBpZGVfYXV0b19yZWR1Y2VfeGZlciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmICghZHJpdmUtPmNyY19jb3VudCkKKwkJcmV0dXJuIGRyaXZlLT5jdXJyZW50X3NwZWVkOworCWRyaXZlLT5jcmNfY291bnQgPSAwOworCisJc3dpdGNoKGRyaXZlLT5jdXJyZW50X3NwZWVkKSB7CisJCWNhc2UgWEZFUl9VRE1BXzc6CXJldHVybiBYRkVSX1VETUFfNjsKKwkJY2FzZSBYRkVSX1VETUFfNjoJcmV0dXJuIFhGRVJfVURNQV81OworCQljYXNlIFhGRVJfVURNQV81OglyZXR1cm4gWEZFUl9VRE1BXzQ7CisJCWNhc2UgWEZFUl9VRE1BXzQ6CXJldHVybiBYRkVSX1VETUFfMzsKKwkJY2FzZSBYRkVSX1VETUFfMzoJcmV0dXJuIFhGRVJfVURNQV8yOworCQljYXNlIFhGRVJfVURNQV8yOglyZXR1cm4gWEZFUl9VRE1BXzE7CisJCWNhc2UgWEZFUl9VRE1BXzE6CXJldHVybiBYRkVSX1VETUFfMDsKKwkJCS8qCisJCQkgKiBPT1BTIHdlIGRvIG5vdCBnb3RvIG5vbiBVbHRyYSBETUEgbW9kZXMKKwkJCSAqIHdpdGhvdXQgaUNSQydzIGF2YWlsYWJsZSB3ZSBmb3JjZQorCQkJICogdGhlIHN5c3RlbSB0byBQSU8gYW5kIG1ha2UgdGhlIHVzZXIKKwkJCSAqIGludm9rZSB0aGUgQVRBLTEgQVRBLTIgRE1BIG1vZGVzLgorCQkJICovCisJCWNhc2UgWEZFUl9VRE1BXzA6CisJCWRlZmF1bHQ6CQlyZXR1cm4gWEZFUl9QSU9fNDsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BICovCisKKy8qCisgKiBVcGRhdGUgdGhlIAorICovCitpbnQgaWRlX2RyaXZlaWRfdXBkYXRlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBoZF9kcml2ZWlkICppZDsKKyNpZiAwCisJaWQgPSBrbWFsbG9jKFNFQ1RPUl9XT1JEUyo0LCBHRlBfQVRPTUlDKTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gMDsKKworCXRhc2tmaWxlX2xpYl9nZXRfaWRlbnRpZnkoZHJpdmUsIChjaGFyICopJmlkKTsKKworCWlkZV9maXhfZHJpdmVpZChpZCk7CisJaWYgKGlkKSB7CisJCWRyaXZlLT5pZC0+ZG1hX3VsdHJhID0gaWQtPmRtYV91bHRyYTsKKwkJZHJpdmUtPmlkLT5kbWFfbXdvcmQgPSBpZC0+ZG1hX213b3JkOworCQlkcml2ZS0+aWQtPmRtYV8xd29yZCA9IGlkLT5kbWFfMXdvcmQ7CisJCS8qIGFueXRoaW5nIG1vcmUgPyAqLworCQlrZnJlZShpZCk7CisJfQorCXJldHVybiAxOworI2Vsc2UKKwkvKgorCSAqIFJlLXJlYWQgZHJpdmUtPmlkIGZvciBwb3NzaWJsZSBETUEgbW9kZQorCSAqIGNoYW5nZSAoY29waWVkIGZyb20gaWRlLXByb2JlLmMpCisJICovCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0LCBmbGFnczsKKworCVNFTEVDVF9NQVNLKGRyaXZlLCAxKTsKKwlpZiAoSURFX0NPTlRST0xfUkVHKQorCQlod2lmLT5PVVRCKGRyaXZlLT5jdGwsSURFX0NPTlRST0xfUkVHKTsKKwltc2xlZXAoNTApOworCWh3aWYtPk9VVEIoV0lOX0lERU5USUZZLCBJREVfQ09NTUFORF9SRUcpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJZG8geworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJU0VMRUNUX01BU0soZHJpdmUsIDApOworCQkJcmV0dXJuIDA7CS8qIGRyaXZlIHRpbWVkLW91dCAqLworCQl9CisJCW1zbGVlcCg1MCk7CS8qIGdpdmUgZHJpdmUgYSBicmVhdGhlciAqLworCX0gd2hpbGUgKGh3aWYtPklOQihJREVfQUxUU1RBVFVTX1JFRykgJiBCVVNZX1NUQVQpOworCW1zbGVlcCg1MCk7CS8qIHdhaXQgZm9yIElSUSBhbmQgRFJRX1NUQVQgKi8KKwlpZiAoIU9LX1NUQVQoaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSxEUlFfU1RBVCxCQURfUl9TVEFUKSkgeworCQlTRUxFQ1RfTUFTSyhkcml2ZSwgMCk7CisJCXByaW50aygiJXM6IENIRUNLIGZvciBnb29kIFNUQVRVU1xuIiwgZHJpdmUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCVNFTEVDVF9NQVNLKGRyaXZlLCAwKTsKKwlpZCA9IGttYWxsb2MoU0VDVE9SX1dPUkRTKjQsIEdGUF9BVE9NSUMpOworCWlmICghaWQpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJYXRhX2lucHV0X2RhdGEoZHJpdmUsIGlkLCBTRUNUT1JfV09SRFMpOworCSh2b2lkKSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOwkvKiBjbGVhciBkcml2ZSBJUlEgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWlkZV9maXhfZHJpdmVpZChpZCk7CisJaWYgKGlkKSB7CisJCWRyaXZlLT5pZC0+ZG1hX3VsdHJhID0gaWQtPmRtYV91bHRyYTsKKwkJZHJpdmUtPmlkLT5kbWFfbXdvcmQgPSBpZC0+ZG1hX213b3JkOworCQlkcml2ZS0+aWQtPmRtYV8xd29yZCA9IGlkLT5kbWFfMXdvcmQ7CisJCS8qIGFueXRoaW5nIG1vcmUgPyAqLworCQlrZnJlZShpZCk7CisJfQorCisJcmV0dXJuIDE7CisjZW5kaWYKK30KKworLyoKKyAqIFNpbWlsYXIgdG8gaWRlX3dhaXRfc3RhdCgpLCBleGNlcHQgaXQgbmV2ZXIgY2FsbHMgaWRlX2Vycm9yIGludGVybmFsbHkuCisgKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGhhbmRsZSB0aGUgbmV3IGlkZV9jb25maWdfZHJpdmVfc3BlZWQoKSBmdW5jdGlvbiwKKyAqIGFuZCBzaG91bGQgbm90IG90aGVyd2lzZSBiZSB1c2VkIGFueXdoZXJlLiAgRXZlbnR1YWxseSwgdGhlIHR1bmVwcm9jJ3MKKyAqIHNob3VsZCBiZSB1cGRhdGVkIHRvIHJldHVybiBpZGVfc3RhcnRzdG9wX3QsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIGdldAorICogcmlkIG9mIHRoaXMgYWJvbWluYXRpb24gYWdhaW4uICA6KSAgIC1tbAorICoKKyAqIEl0IGlzIGdvbmUuLi4uLi4uLi4uCisgKgorICogY29uc3QgY2hhciAqbXNnID09IGNvbnNpZGVyIGFkZGluZyBmb3IgdmVyYm9zZSBlcnJvcnMuCisgKi8KK2ludCBpZGVfY29uZmlnX2RyaXZlX3NwZWVkIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpbnQJaSwgZXJyb3IJPSAxOworCXU4IHN0YXQ7CisKKy8vCXdoaWxlIChIV0dST1VQKGRyaXZlKS0+YnVzeSkKKy8vCQltc2xlZXAoNTApOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJaWYgKGh3aWYtPmlkZV9kbWFfY2hlY2spCSAvKiBjaGVjayBpZiBob3N0IHN1cHBvcnRzIERNQSAqLworCQlod2lmLT5pZGVfZG1hX2hvc3Rfb2ZmKGRyaXZlKTsKKyNlbmRpZgorCisJLyoKKwkgKiBEb24ndCB1c2UgaWRlX3dhaXRfY21kIGhlcmUgLSBpdCB3aWxsCisJICogYXR0ZW1wdCB0byBzZXRfZ2VvbWV0cnkgYW5kIHJlY2FsaWJyYXRlLAorCSAqIGJ1dCBmb3Igc29tZSByZWFzb24gdGhlc2UgZG9uJ3Qgd29yayBhdAorCSAqIHRoaXMgcG9pbnQgKGxvc3QgaW50ZXJydXB0KS4KKwkgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogU2VsZWN0IHRoZSBkcml2ZSwgYW5kIGlzc3VlIHRoZSBTRVRGRUFUVVJFUyBjb21tYW5kCisgICAgICAgICAqLworCWRpc2FibGVfaXJxX25vc3luYyhod2lmLT5pcnEpOworCQorCS8qCisJICoJRklYTUU6IHdlIHJhY2UgYWdhaW5zdCB0aGUgcnVubmluZyBJUlEgaGVyZSBpZgorCSAqCXRoaXMgaXMgY2FsbGVkIGZyb20gbm9uIElSUSBjb250ZXh0LiBJZiB3ZSB1c2UKKwkgKglkaXNhYmxlX2lycSgpIHdlIGhhbmcgb24gdGhlIGVycm9yIHBhdGguIFdvcmsKKwkgKglpcyBuZWVkZWQuCisJICovCisJIAorCXVkZWxheSgxKTsKKwlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCVNFTEVDVF9NQVNLKGRyaXZlLCAwKTsKKwl1ZGVsYXkoMSk7CisJaWYgKElERV9DT05UUk9MX1JFRykKKwkJaHdpZi0+T1VUQihkcml2ZS0+Y3RsIHwgMiwgSURFX0NPTlRST0xfUkVHKTsKKwlod2lmLT5PVVRCKHNwZWVkLCBJREVfTlNFQ1RPUl9SRUcpOworCWh3aWYtPk9VVEIoU0VURkVBVFVSRVNfWEZFUiwgSURFX0ZFQVRVUkVfUkVHKTsKKwlod2lmLT5PVVRCKFdJTl9TRVRGRUFUVVJFUywgSURFX0NPTU1BTkRfUkVHKTsKKwlpZiAoKElERV9DT05UUk9MX1JFRykgJiYgKGRyaXZlLT5xdWlya19saXN0ID09IDIpKQorCQlod2lmLT5PVVRCKGRyaXZlLT5jdGwsIElERV9DT05UUk9MX1JFRyk7CisJdWRlbGF5KDEpOworCS8qCisJICogV2FpdCBmb3IgZHJpdmUgdG8gYmVjb21lIG5vbi1CVVNZCisJICovCisJaWYgKChzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSkgJiBCVVNZX1NUQVQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKKwkJbG9jYWxfaXJxX3NldChmbGFncyk7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9DTUQ7CisJCXdoaWxlICgoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpICYgQlVTWV9TVEFUKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJLyoKKwkgKiBBbGxvdyBzdGF0dXMgdG8gc2V0dGxlLCB0aGVuIHJlYWQgaXQgYWdhaW4uCisJICogQSBmZXcgcmFyZSBkcml2ZXMgdmFzdGx5IHZpb2xhdGUgdGhlIDQwMG5zIHNwZWMgaGVyZSwKKwkgKiBzbyB3ZSdsbCB3YWl0IHVwIHRvIDEwdXNlYyBmb3IgYSAiZ29vZCIgc3RhdHVzCisJICogcmF0aGVyIHRoYW4gZXhwZW5zaXZlbHkgZmFpbCB0aGluZ3MgaW1tZWRpYXRlbHkuCisJICogVGhpcyBmaXggY291cnRlc3kgb2YgTWF0dGhldyBGYXVwZWwgJiBOaWNjb2xvIFJpZ2FjY2kuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoT0tfU1RBVCgoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpLCBEUklWRV9SRUFEWSwgQlVTWV9TVEFUfERSUV9TVEFUfEVSUl9TVEFUKSkgeworCQkJZXJyb3IgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlTRUxFQ1RfTUFTSyhkcml2ZSwgMCk7CisKKwllbmFibGVfaXJxKGh3aWYtPmlycSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJKHZvaWQpIGlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgInNldF9kcml2ZV9zcGVlZF9zdGF0dXMiLCBzdGF0KTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWRyaXZlLT5pZC0+ZG1hX3VsdHJhICY9IH4weEZGMDA7CisJZHJpdmUtPmlkLT5kbWFfbXdvcmQgJj0gfjB4MEYwMDsKKwlkcml2ZS0+aWQtPmRtYV8xd29yZCAmPSB+MHgwRjAwOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJaWYgKHNwZWVkID49IFhGRVJfU1dfRE1BXzApCisJCWh3aWYtPmlkZV9kbWFfaG9zdF9vbihkcml2ZSk7CisJZWxzZSBpZiAoaHdpZi0+aWRlX2RtYV9jaGVjaykJLyogY2hlY2sgaWYgaG9zdCBzdXBwb3J0cyBETUEgKi8KKwkJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisjZW5kaWYKKworCXN3aXRjaChzcGVlZCkgeworCQljYXNlIFhGRVJfVURNQV83OiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4ODA4MDsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzY6ICAgZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHg0MDQwOyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfNTogICBkcml2ZS0+aWQtPmRtYV91bHRyYSB8PSAweDIwMjA7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV80OiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4MTAxMDsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzM6ICAgZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwODA4OyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfMjogICBkcml2ZS0+aWQtPmRtYV91bHRyYSB8PSAweDA0MDQ7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV8xOiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4MDIwMjsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6ICAgZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwMTAxOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOiBkcml2ZS0+aWQtPmRtYV9td29yZCB8PSAweDA0MDQ7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzE6IGRyaXZlLT5pZC0+ZG1hX213b3JkIHw9IDB4MDIwMjsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMDogZHJpdmUtPmlkLT5kbWFfbXdvcmQgfD0gMHgwMTAxOyBicmVhazsKKwkJY2FzZSBYRkVSX1NXX0RNQV8yOiBkcml2ZS0+aWQtPmRtYV8xd29yZCB8PSAweDA0MDQ7IGJyZWFrOworCQljYXNlIFhGRVJfU1dfRE1BXzE6IGRyaXZlLT5pZC0+ZG1hXzF3b3JkIHw9IDB4MDIwMjsgYnJlYWs7CisJCWNhc2UgWEZFUl9TV19ETUFfMDogZHJpdmUtPmlkLT5kbWFfMXdvcmQgfD0gMHgwMTAxOyBicmVhazsKKwkJZGVmYXVsdDogYnJlYWs7CisJfQorCWlmICghZHJpdmUtPmluaXRfc3BlZWQpCisJCWRyaXZlLT5pbml0X3NwZWVkID0gc3BlZWQ7CisJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBzcGVlZDsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2NvbmZpZ19kcml2ZV9zcGVlZCk7CisKKworLyoKKyAqIFRoaXMgc2hvdWxkIGdldCBpbnZva2VkIGFueSB0aW1lIHdlIGV4aXQgdGhlIGRyaXZlciB0bworICogd2FpdCBmb3IgYW4gaW50ZXJydXB0IHJlc3BvbnNlIGZyb20gYSBkcml2ZS4gIGhhbmRsZXIoKSBwb2ludHMKKyAqIGF0IHRoZSBhcHByb3ByaWF0ZSBjb2RlIHRvIGhhbmRsZSB0aGUgbmV4dCBpbnRlcnJ1cHQsIGFuZCBhCisgKiB0aW1lciBpcyBzdGFydGVkIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIGZvcmV2ZXIgaW4gY2FzZQorICogc29tZXRoaW5nIGdvZXMgd3JvbmcgKHNlZSB0aGUgaWRlX3RpbWVyX2V4cGlyeSgpIGhhbmRsZXIgbGF0ZXIgb24pLgorICoKKyAqIFNlZSBhbHNvIGlkZV9leGVjdXRlX2NvbW1hbmQKKyAqLworc3RhdGljIHZvaWQgX19pZGVfc2V0X2hhbmRsZXIgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwKKwkJICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5KQoreworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKKworCWlmIChod2dyb3VwLT5oYW5kbGVyICE9IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGlkZV9zZXRfaGFuZGxlcjogaGFuZGxlciBub3QgbnVsbDsgIgorCQkJIm9sZD0lcCwgbmV3PSVwXG4iLAorCQkJZHJpdmUtPm5hbWUsIGh3Z3JvdXAtPmhhbmRsZXIsIGhhbmRsZXIpOworCX0KKwlod2dyb3VwLT5oYW5kbGVyCT0gaGFuZGxlcjsKKwlod2dyb3VwLT5leHBpcnkJCT0gZXhwaXJ5OworCWh3Z3JvdXAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKK30KKwordm9pZCBpZGVfc2V0X2hhbmRsZXIgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwKKwkJICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGhhbmRsZXIsIHRpbWVvdXQsIGV4cGlyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfc2V0X2hhbmRsZXIpOworIAorLyoqCisgKglpZGVfZXhlY3V0ZV9jb21tYW5kCS0JZXhlY3V0ZSBhbiBJREUgY29tbWFuZAorICoJQGRyaXZlOiBJREUgZHJpdmUgdG8gaXNzdWUgdGhlIGNvbW1hbmQgYWdhaW5zdAorICoJQGNvbW1hbmQ6IGNvbW1hbmQgYnl0ZSB0byB3cml0ZQorICoJQGhhbmRsZXI6IGhhbmRsZXIgZm9yIG5leHQgcGhhc2UKKyAqCUB0aW1lb3V0OiB0aW1lb3V0IGZvciBjb21tYW5kCisgKglAZXhwaXJ5OiAgaGFuZGxlciB0byBydW4gb24gdGltZW91dAorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB0byBpc3N1ZSBhbiBJREUgY29tbWFuZC4gVGhpcyBoYW5kbGVzIHRoZQorICoJYXRvbWljaXR5IHJlcXVpcmVtZW50cywgY29tbWFuZCB0aW1pbmcgYW5kIGVuc3VyZXMgdGhhdCB0aGUgCisgKgloYW5kbGVyIGFuZCBJUlEgc2V0dXAgZG8gbm90IHJhY2UuIEFsbCBJREUgY29tbWFuZCBraWNrIG9mZgorICoJc2hvdWxkIGdvIHZpYSB0aGlzIGZ1bmN0aW9uIG9yIGRvIGVxdWl2YWxlbnQgbG9ja2luZy4KKyAqLworIAordm9pZCBpZGVfZXhlY3V0ZV9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSwgdGFza19pb3JlZ190IGNtZCwgaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwgdW5zaWduZWQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gSFdHUk9VUChkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCQorCWlmKGh3Z3JvdXAtPmhhbmRsZXIpCisJCUJVRygpOworCWh3Z3JvdXAtPmhhbmRsZXIJPSBoYW5kbGVyOworCWh3Z3JvdXAtPmV4cGlyeQkJPSBleHBpcnk7CisJaHdncm91cC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcigmaHdncm91cC0+dGltZXIpOworCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCBjbWQsIElERV9DT01NQU5EX1JFRyk7CisJLyogRHJpdmUgdGFrZXMgNDAwblMgdG8gcmVzcG9uZCwgd2UgbXVzdCBhdm9pZCB0aGUgSVJRIGJlaW5nCisJICAgc2VydmljZWQgYmVmb3JlIHRoYXQuIAorCSAgIAorCSAgIEZJWE1FOiB3ZSBjb3VsZCBza2lwIHRoaXMgZGVsYXkgd2l0aCBjYXJlIG9uIG5vbiBzaGFyZWQKKwkgICBkZXZpY2VzIAorCSovCisJbmRlbGF5KDQwMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfZXhlY3V0ZV9jb21tYW5kKTsKKworCisvKiBuZWVkZWQgYmVsb3cgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZG9fcmVzZXQxIChpZGVfZHJpdmVfdCAqLCBpbnQpOworCisvKgorICogYXRhcGlfcmVzZXRfcG9sbGZ1bmMoKSBnZXRzIGludm9rZWQgdG8gcG9sbCB0aGUgaW50ZXJmYWNlIGZvciBjb21wbGV0aW9uIGV2ZXJ5IDUwbXMKKyAqIGR1cmluZyBhbiBhdGFwaSBkcml2ZSByZXNldCBvcGVyYXRpb24uIElmIHRoZSBkcml2ZSBoYXMgbm90IHlldCByZXNwb25kZWQsCisgKiBhbmQgd2UgaGF2ZSBub3QgeWV0IGhpdCBvdXIgbWF4aW11bSB3YWl0aW5nIHRpbWUsIHRoZW4gdGhlIHRpbWVyIGlzIHJlc3RhcnRlZAorICogZm9yIGFub3RoZXIgNTBtcy4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBhdGFwaV9yZXNldF9wb2xsZnVuYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAJPSBIV0dST1VQKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggc3RhdDsKKworCVNFTEVDVF9EUklWRShkcml2ZSk7CisJdWRlbGF5ICgxMCk7CisKKwlpZiAoT0tfU1RBVChzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSwgMCwgQlVTWV9TVEFUKSkgeworCQlwcmludGsoIiVzOiBBVEFQSSByZXNldCBjb21wbGV0ZVxuIiwgZHJpdmUtPm5hbWUpOworCX0gZWxzZSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2dyb3VwLT5wb2xsX3RpbWVvdXQpKSB7CisJCQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKKwkJCQlCVUcoKTsKKwkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmF0YXBpX3Jlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CisJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCisJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJCX0KKwkJLyogZW5kIG9mIHBvbGxpbmcgKi8KKwkJaHdncm91cC0+cG9sbGluZyA9IDA7CisJCXByaW50aygiJXM6IEFUQVBJIHJlc2V0IHRpbWVkLW91dCwgc3RhdHVzPTB4JTAyeFxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgc3RhdCk7CisJCS8qIGRvIGl0IHRoZSBvbGQgZmFzaGlvbmVkIHdheSAqLworCQlyZXR1cm4gZG9fcmVzZXQxKGRyaXZlLCAxKTsKKwl9CisJLyogZG9uZSBwb2xsaW5nICovCisJaHdncm91cC0+cG9sbGluZyA9IDA7CisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCisvKgorICogcmVzZXRfcG9sbGZ1bmMoKSBnZXRzIGludm9rZWQgdG8gcG9sbCB0aGUgaW50ZXJmYWNlIGZvciBjb21wbGV0aW9uIGV2ZXJ5IDUwbXMKKyAqIGR1cmluZyBhbiBpZGUgcmVzZXQgb3BlcmF0aW9uLiBJZiB0aGUgZHJpdmVzIGhhdmUgbm90IHlldCByZXNwb25kZWQsCisgKiBhbmQgd2UgaGF2ZSBub3QgeWV0IGhpdCBvdXIgbWF4aW11bSB3YWl0aW5nIHRpbWUsIHRoZW4gdGhlIHRpbWVyIGlzIHJlc3RhcnRlZAorICogZm9yIGFub3RoZXIgNTBtcy4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCByZXNldF9wb2xsZnVuYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAJPSBIV0dST1VQKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggdG1wOworCisJaWYgKGh3aWYtPnJlc2V0X3BvbGwgIT0gTlVMTCkgeworCQlpZiAoaHdpZi0+cmVzZXRfcG9sbChkcml2ZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGhvc3QgcmVzZXRfcG9sbCBmYWlsdXJlIGZvciAlcy5cbiIsCisJCQkJaHdpZi0+bmFtZSwgZHJpdmUtPm5hbWUpOworCQkJcmV0dXJuIGlkZV9zdG9wcGVkOworCQl9CisJfQorCisJaWYgKCFPS19TVEFUKHRtcCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyksIDAsIEJVU1lfU1RBVCkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKKwkJCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQorCQkJCUJVRygpOworCQkJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKKwkJCS8qIGNvbnRpbnVlIHBvbGxpbmcgKi8KKwkJCXJldHVybiBpZGVfc3RhcnRlZDsKKwkJfQorCQlwcmludGsoIiVzOiByZXNldCB0aW1lZC1vdXQsIHN0YXR1cz0weCUwMnhcbiIsIGh3aWYtPm5hbWUsIHRtcCk7CisJCWRyaXZlLT5mYWlsdXJlcysrOworCX0gZWxzZSAgeworCQlwcmludGsoIiVzOiByZXNldDogIiwgaHdpZi0+bmFtZSk7CisJCWlmICgodG1wID0gaHdpZi0+SU5CKElERV9FUlJPUl9SRUcpKSA9PSAxKSB7CisJCQlwcmludGsoInN1Y2Nlc3NcbiIpOworCQkJZHJpdmUtPmZhaWx1cmVzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWRyaXZlLT5mYWlsdXJlcysrOworCQkJcHJpbnRrKCJtYXN0ZXI6ICIpOworCQkJc3dpdGNoICh0bXAgJiAweDdmKSB7CisJCQkJY2FzZSAxOiBwcmludGsoInBhc3NlZCIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6IHByaW50aygiZm9ybWF0dGVyIGRldmljZSBlcnJvciIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6IHByaW50aygic2VjdG9yIGJ1ZmZlciBlcnJvciIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6IHByaW50aygiRUNDIGNpcmN1aXRyeSBlcnJvciIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDU6IHByaW50aygiY29udHJvbGxpbmcgTVBVIGVycm9yIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6cHJpbnRrKCJlcnJvciAoMHglMDJ4PykiLCB0bXApOworCQkJfQorCQkJaWYgKHRtcCAmIDB4ODApCisJCQkJcHJpbnRrKCI7IHNsYXZlOiBmYWlsZWQiKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKwlod2dyb3VwLT5wb2xsaW5nID0gMDsJLyogZG9uZSBwb2xsaW5nICovCisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitzdGF0aWMgdm9pZCBjaGVja19kbWFfY3JjKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUEKKwlpZiAoZHJpdmUtPmNyY19jb3VudCkgeworCQkodm9pZCkgSFdJRihkcml2ZSktPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCQlpZGVfc2V0X3hmZXJfcmF0ZShkcml2ZSwgaWRlX2F1dG9fcmVkdWNlX3hmZXIoZHJpdmUpKTsKKwkJaWYgKGRyaXZlLT5jdXJyZW50X3NwZWVkID49IFhGRVJfU1dfRE1BXzApCisJCQkodm9pZCkgSFdJRihkcml2ZSktPmlkZV9kbWFfb24oZHJpdmUpOworCX0gZWxzZQorCQkodm9pZClfX2lkZV9kbWFfb2ZmKGRyaXZlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpZGVfZGlza19wcmVfcmVzZXQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludCBsZWdhY3kgPSAoZHJpdmUtPmlkLT5jZnNfZW5hYmxlXzIgJiAweDA0MDApID8gMCA6IDE7CisKKwlkcml2ZS0+c3BlY2lhbC5hbGwgPSAwOworCWRyaXZlLT5zcGVjaWFsLmIuc2V0X2dlb21ldHJ5ID0gbGVnYWN5OworCWRyaXZlLT5zcGVjaWFsLmIucmVjYWxpYnJhdGUgID0gbGVnYWN5OworCWlmIChPS19UT19SRVNFVF9DT05UUk9MTEVSKQorCQlkcml2ZS0+bXVsdF9jb3VudCA9IDA7CisJaWYgKCFkcml2ZS0+a2VlcF9zZXR0aW5ncyAmJiAhZHJpdmUtPnVzaW5nX2RtYSkKKwkJZHJpdmUtPm11bHRfcmVxID0gMDsKKwlpZiAoZHJpdmUtPm11bHRfcmVxICE9IGRyaXZlLT5tdWx0X2NvdW50KQorCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9tdWx0bW9kZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHByZV9yZXNldChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKwkJaWRlX2Rpc2tfcHJlX3Jlc2V0KGRyaXZlKTsKKwllbHNlCisJCWRyaXZlLT5wb3N0X3Jlc2V0ID0gMTsKKworCWlmICghZHJpdmUtPmtlZXBfc2V0dGluZ3MpIHsKKwkJaWYgKGRyaXZlLT51c2luZ19kbWEpIHsKKwkJCWNoZWNrX2RtYV9jcmMoZHJpdmUpOworCQl9IGVsc2UgeworCQkJZHJpdmUtPnVubWFzayA9IDA7CisJCQlkcml2ZS0+aW9fMzJiaXQgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGRyaXZlLT51c2luZ19kbWEpCisJCWNoZWNrX2RtYV9jcmMoZHJpdmUpOworCisJaWYgKEhXSUYoZHJpdmUpLT5wcmVfcmVzZXQgIT0gTlVMTCkKKwkJSFdJRihkcml2ZSktPnByZV9yZXNldChkcml2ZSk7CisKK30KKworLyoKKyAqIGRvX3Jlc2V0MSgpIGF0dGVtcHRzIHRvIHJlY292ZXIgYSBjb25mdXNlZCBkcml2ZSBieSByZXNldHRpbmcgaXQuCisgKiBVbmZvcnR1bmF0ZWx5LCByZXNldHRpbmcgYSBkaXNrIGRyaXZlIGFjdHVhbGx5IHJlc2V0cyBhbGwgZGV2aWNlcyBvbgorICogdGhlIHNhbWUgaW50ZXJmYWNlLCBzbyBpdCBjYW4gcmVhbGx5IGJlIHRob3VnaHQgb2YgYXMgcmVzZXR0aW5nIHRoZQorICogaW50ZXJmYWNlIHJhdGhlciB0aGFuIHJlc2V0dGluZyB0aGUgZHJpdmUuCisgKgorICogQVRBUEkgZGV2aWNlcyBoYXZlIHRoZWlyIG93biByZXNldCBtZWNoYW5pc20gd2hpY2ggYWxsb3dzIHRoZW0gdG8gYmUKKyAqIGluZGl2aWR1YWxseSByZXNldCB3aXRob3V0IGNsb2JiZXJpbmcgb3RoZXIgZGV2aWNlcyBvbiB0aGUgc2FtZSBpbnRlcmZhY2UuCisgKgorICogVW5mb3J0dW5hdGVseSwgdGhlIElERSBpbnRlcmZhY2UgZG9lcyBub3QgZ2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIGxldAorICogdXMga25vdyB3aGVuIHRoZSByZXNldCBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLCBzbyB3ZSBtdXN0IHBvbGwgZm9yIHRoaXMuCisgKiBFcXVhbGx5IHBvb3IsIHRob3VnaCwgaXMgdGhlIGZhY3QgdGhhdCB0aGlzIG1heSBhIHZlcnkgbG9uZyB0aW1lIHRvIGNvbXBsZXRlLAorICogKHVwIHRvIDMwIHNlY29uZHMgd29yc3RjYXNlKS4gIFNvLCBpbnN0ZWFkIG9mIGJ1c3ktd2FpdGluZyBoZXJlIGZvciBpdCwKKyAqIHdlIHNldCBhIHRpbWVyIHRvIHBvbGwgYXQgNTBtcyBpbnRlcnZhbHMuCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZG9fcmVzZXQxIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBkb19ub3RfdHJ5X2F0YXBpKQoreworCXVuc2lnbmVkIGludCB1bml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWh3aWYgPSBIV0lGKGRyaXZlKTsKKwlod2dyb3VwID0gSFdHUk9VUChkcml2ZSk7CisKKwkvKiBXZSBtdXN0IG5vdCByZXNldCB3aXRoIHJ1bm5pbmcgaGFuZGxlcnMgKi8KKwlpZihod2dyb3VwLT5oYW5kbGVyICE9IE5VTEwpCisJCUJVRygpOworCisJLyogRm9yIGFuIEFUQVBJIGRldmljZSwgZmlyc3QgdHJ5IGFuIEFUQVBJIFNSU1QuICovCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayAmJiAhZG9fbm90X3RyeV9hdGFwaSkgeworCQlwcmVfcmVzZXQoZHJpdmUpOworCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCQl1ZGVsYXkgKDIwKTsKKwkJaHdpZi0+T1VUQihXSU5fU1JTVCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJaHdncm91cC0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOworCQlod2dyb3VwLT5wb2xsaW5nID0gMTsKKwkJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZhdGFwaV9yZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfQorCisJLyoKKwkgKiBGaXJzdCwgcmVzZXQgYW55IGRldmljZSBzdGF0ZSBkYXRhIHdlIHdlcmUgbWFpbnRhaW5pbmcKKwkgKiBmb3IgYW55IG9mIHRoZSBkcml2ZXMgb24gdGhpcyBpbnRlcmZhY2UuCisJICovCisJZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkKKwkJcHJlX3Jlc2V0KCZod2lmLT5kcml2ZXNbdW5pdF0pOworCisjaWYgT0tfVE9fUkVTRVRfQ09OVFJPTExFUgorCWlmICghSURFX0NPTlRST0xfUkVHKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBhbHNvIHNldCBuSUVOIHdoaWxlIHJlc2V0dGluZyB0aGUgZGV2aWNlLAorCSAqIHRvIG1hc2sgdW53YW50ZWQgaW50ZXJydXB0cyBmcm9tIHRoZSBpbnRlcmZhY2UgZHVyaW5nIHRoZSByZXNldC4KKwkgKiBIb3dldmVyLCBkdWUgdG8gdGhlIGRlc2lnbiBvZiBQQyBoYXJkd2FyZSwgdGhpcyB3aWxsIGNhdXNlIGFuCisJICogaW1tZWRpYXRlIGludGVycnVwdCBkdWUgdG8gdGhlIGVkZ2UgdHJhbnNpdGlvbiBpdCBwcm9kdWNlcy4KKwkgKiBUaGlzIHNpbmdsZSBpbnRlcnJ1cHQgZ2l2ZXMgdXMgYSAiZmFzdCBwb2xsIiBmb3IgZHJpdmVzIHRoYXQKKwkgKiByZWNvdmVyIGZyb20gcmVzZXQgdmVyeSBxdWlja2x5LCBzYXZpbmcgdXMgdGhlIGZpcnN0IDUwbXMgd2FpdCB0aW1lLgorCSAqLworCS8qIHNldCBTUlNUIGFuZCBuSUVOICovCisJaHdpZi0+T1VUQlNZTkMoZHJpdmUsIGRyaXZlLT5jdGx8NixJREVfQ09OVFJPTF9SRUcpOworCS8qIG1vcmUgdGhhbiBlbm91Z2ggdGltZSAqLworCXVkZWxheSgxMCk7CisJaWYgKGRyaXZlLT5xdWlya19saXN0ID09IDIpIHsKKwkJLyogY2xlYXIgU1JTVCBhbmQgbklFTiAqLworCQlod2lmLT5PVVRCU1lOQyhkcml2ZSwgZHJpdmUtPmN0bCwgSURFX0NPTlRST0xfUkVHKTsKKwl9IGVsc2UgeworCQkvKiBjbGVhciBTUlNULCBsZWF2ZSBuSUVOICovCisJCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCBkcml2ZS0+Y3RsfDIsIElERV9DT05UUk9MX1JFRyk7CisJfQorCS8qIG1vcmUgdGhhbiBlbm91Z2ggdGltZSAqLworCXVkZWxheSgxMCk7CisJaHdncm91cC0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOworCWh3Z3JvdXAtPnBvbGxpbmcgPSAxOworCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKKworCS8qCisJICogU29tZSB3ZWlyZCBjb250cm9sbGVyIGxpa2UgcmVzZXR0aW5nIHRoZW1zZWx2ZXMgdG8gYSBzdHJhbmdlCisJICogc3RhdGUgd2hlbiB0aGUgZGlza3MgYXJlIHJlc2V0IHRoaXMgd2F5LiBBdCBsZWFzdCwgdGhlIFdpbmJvbmQKKwkgKiA1NTMgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQKKwkgKi8KKwlpZiAoaHdpZi0+cmVzZXRwcm9jICE9IE5VTEwpIHsKKwkJaHdpZi0+cmVzZXRwcm9jKGRyaXZlKTsKKwl9CisJCisjZW5kaWYJLyogT0tfVE9fUkVTRVRfQ09OVFJPTExFUiAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKKy8qCisgKiBpZGVfZG9fcmVzZXQoKSBpcyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIGRyaXZlL2ludGVyZmFjZSByZXNldCBjb2RlLgorICovCisKK2lkZV9zdGFydHN0b3BfdCBpZGVfZG9fcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gZG9fcmVzZXQxKGRyaXZlLCAwKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfZG9fcmVzZXQpOworCisvKgorICogaWRlX3dhaXRfbm90X2J1c3koKSB3YWl0cyBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2Ugb24gdGhlIGh3aWYKKyAqIHRvIHJlcG9ydCBhIG5vbi1idXN5IHN0YXR1cywgc2VlIGNvbW1lbnRzIGluIHByb2JlX2h3aWYoKS4KKyAqLworaW50IGlkZV93YWl0X25vdF9idXN5KGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwl1OCBzdGF0ID0gMDsKKworCXdoaWxlKHRpbWVvdXQtLSkgeworCQkvKgorCQkgKiBUdXJuIHRoaXMgaW50byBhIHNjaGVkdWxlKCkgc2xlZXAgb25jZSBJJ20gc3VyZQorCQkgKiBhYm91dCBsb2NraW5nIGlzc3VlcyAoMi41IHdvcmsgPykuCisJCSAqLworCQltZGVsYXkoMSk7CisJCXN0YXQgPSBod2lmLT5JTkIoaHdpZi0+aW9fcG9ydHNbSURFX1NUQVRVU19PRkZTRVRdKTsKKwkJaWYgKChzdGF0ICYgQlVTWV9TVEFUKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCS8qCisJCSAqIEFzc3VtZSBhIHZhbHVlIG9mIDB4ZmYgbWVhbnMgbm90aGluZyBpcyBjb25uZWN0ZWQgdG8KKwkJICogdGhlIGludGVyZmFjZSBhbmQgaXQgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHB1bGwtZG93bgorCQkgKiByZXNpc3RvciBvbiBENy4KKwkJICovCisJCWlmIChzdGF0ID09IDB4ZmYpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3dhaXRfbm90X2J1c3kpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwNmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwpAQCAtMCwwICsxLDYyMiBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqCUlERSBsaWJyYXJ5IHJvdXRpbmVzLiBUaGVzZSBhcmUgcGx1ZyBpbiBjb2RlIHRoYXQgbW9zdCAKKyAqCWRyaXZlcnMgY2FuIHVzZSBidXQgb2NjYXNpb25hbGx5IG1heSBiZSB3ZWlyZCBlbm91Z2gKKyAqCXRvIHdhbnQgdG8gZG8gdGhlaXIgb3duIHRoaW5nIHdpdGgKKyAqCisgKglBZGQgY29tbW9uIG5vbiBJL08gb3Agc3R1ZmYgaGVyZS4gTWFrZSBzdXJlIGl0IGhhcyBwcm9wZXIKKyAqCWtlcm5lbC1kb2MgZnVuY3Rpb24gaGVhZGVycyBvciB5b3VyIHBhdGNoIHdpbGwgYmUgcmVqZWN0ZWQKKyAqLworIAorCisvKioKKyAqCWlkZV94ZmVyX3ZlcmJvc2UJLQlyZXR1cm4gSURFIG1vZGUgbmFtZXMKKyAqCUB4ZmVyX3JhdGU6IHJhdGUgdG8gbmFtZQorICoKKyAqCVJldHVybnMgYSBjb25zdGFudCBzdHJpbmcgZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2RlCisgKglyZXF1ZXN0ZWQuCisgKi8KKworY2hhciAqaWRlX3hmZXJfdmVyYm9zZSAodTggeGZlcl9yYXRlKQoreworICAgICAgICBzd2l0Y2goeGZlcl9yYXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBYRkVSX1VETUFfNzoJcmV0dXJuKCJVRE1BIDciKTsKKyAgICAgICAgICAgICAgICBjYXNlIFhGRVJfVURNQV82OglyZXR1cm4oIlVETUEgNiIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9VRE1BXzU6CXJldHVybigiVURNQSA1Iik7CisgICAgICAgICAgICAgICAgY2FzZSBYRkVSX1VETUFfNDoJcmV0dXJuKCJVRE1BIDQiKTsKKyAgICAgICAgICAgICAgICBjYXNlIFhGRVJfVURNQV8zOglyZXR1cm4oIlVETUEgMyIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9VRE1BXzI6CXJldHVybigiVURNQSAyIik7CisgICAgICAgICAgICAgICAgY2FzZSBYRkVSX1VETUFfMToJcmV0dXJuKCJVRE1BIDEiKTsKKyAgICAgICAgICAgICAgICBjYXNlIFhGRVJfVURNQV8wOglyZXR1cm4oIlVETUEgMCIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9NV19ETUFfMjoJcmV0dXJuKCJNVyBETUEgMiIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9NV19ETUFfMToJcmV0dXJuKCJNVyBETUEgMSIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9NV19ETUFfMDoJcmV0dXJuKCJNVyBETUEgMCIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9TV19ETUFfMjoJcmV0dXJuKCJTVyBETUEgMiIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9TV19ETUFfMToJcmV0dXJuKCJTVyBETUEgMSIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9TV19ETUFfMDoJcmV0dXJuKCJTVyBETUEgMCIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fNDoJcmV0dXJuKCJQSU8gNCIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fMzoJcmV0dXJuKCJQSU8gMyIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fMjoJcmV0dXJuKCJQSU8gMiIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fMToJcmV0dXJuKCJQSU8gMSIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fMDoJcmV0dXJuKCJQSU8gMCIpOworICAgICAgICAgICAgICAgIGNhc2UgWEZFUl9QSU9fU0xPVzoJcmV0dXJuKCJQSU8gU0xPVyIpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CQlyZXR1cm4oIlhGRVIgRVJST1IiKTsKKyAgICAgICAgfQorfQorCitFWFBPUlRfU1lNQk9MKGlkZV94ZmVyX3ZlcmJvc2UpOworCisvKioKKyAqCWlkZV9kbWFfc3BlZWQJLQljb21wdXRlIERNQSBzcGVlZAorICoJQGRyaXZlOiBkcml2ZQorICoJQG1vZGU7IGludGVuZGVkIG1vZGUKKyAqCisgKglDaGVja3MgdGhlIGRyaXZlIGNhcGFiaWxpdGllcyBhbmQgcmV0dXJucyB0aGUgc3BlZWQgdG8gdXNlCisgKglmb3IgdGhlIHRyYW5zZmVyLiBSZXR1cm5zIC0xIGlmIHRoZSByZXF1ZXN0ZWQgbW9kZSBpcyB1bmtub3duCisgKgkoZWcgUElPKQorICovCisgCit1OCBpZGVfZG1hX3NwZWVkKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggbW9kZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgICA9IGRyaXZlLT5pZDsKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggc3BlZWQgPSAwOworCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayAmJiBod2lmLT5hdGFwaV9kbWEgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2gobW9kZSkgeworCQljYXNlIDB4MDQ6CisJCQlpZiAoKGlkLT5kbWFfdWx0cmEgJiAweDAwNDApICYmCisJCQkgICAgKGlkLT5kbWFfdWx0cmEgJiBod2lmLT51bHRyYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9VRE1BXzY7IGJyZWFrOyB9CisJCWNhc2UgMHgwMzoKKwkJCWlmICgoaWQtPmRtYV91bHRyYSAmIDB4MDAyMCkgJiYKKwkJCSAgICAoaWQtPmRtYV91bHRyYSAmIGh3aWYtPnVsdHJhX21hc2spKQorCQkJCXsgc3BlZWQgPSBYRkVSX1VETUFfNTsgYnJlYWs7IH0KKwkJY2FzZSAweDAyOgorCQkJaWYgKChpZC0+ZG1hX3VsdHJhICYgMHgwMDEwKSAmJgorCQkJICAgIChpZC0+ZG1hX3VsdHJhICYgaHdpZi0+dWx0cmFfbWFzaykpCisJCQkJeyBzcGVlZCA9IFhGRVJfVURNQV80OyBicmVhazsgfQorCQkJaWYgKChpZC0+ZG1hX3VsdHJhICYgMHgwMDA4KSAmJgorCQkJICAgIChpZC0+ZG1hX3VsdHJhICYgaHdpZi0+dWx0cmFfbWFzaykpCisJCQkJeyBzcGVlZCA9IFhGRVJfVURNQV8zOyBicmVhazsgfQorCQljYXNlIDB4MDE6CisJCQlpZiAoKGlkLT5kbWFfdWx0cmEgJiAweDAwMDQpICYmCisJCQkgICAgKGlkLT5kbWFfdWx0cmEgJiBod2lmLT51bHRyYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9VRE1BXzI7IGJyZWFrOyB9CisJCQlpZiAoKGlkLT5kbWFfdWx0cmEgJiAweDAwMDIpICYmCisJCQkgICAgKGlkLT5kbWFfdWx0cmEgJiBod2lmLT51bHRyYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9VRE1BXzE7IGJyZWFrOyB9CisJCQlpZiAoKGlkLT5kbWFfdWx0cmEgJiAweDAwMDEpICYmCisJCQkgICAgKGlkLT5kbWFfdWx0cmEgJiBod2lmLT51bHRyYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9VRE1BXzA7IGJyZWFrOyB9CisJCWNhc2UgMHgwMDoKKwkJCWlmICgoaWQtPmRtYV9td29yZCAmIDB4MDAwNCkgJiYKKwkJCSAgICAoaWQtPmRtYV9td29yZCAmIGh3aWYtPm13ZG1hX21hc2spKQorCQkJCXsgc3BlZWQgPSBYRkVSX01XX0RNQV8yOyBicmVhazsgfQorCQkJaWYgKChpZC0+ZG1hX213b3JkICYgMHgwMDAyKSAmJgorCQkJICAgIChpZC0+ZG1hX213b3JkICYgaHdpZi0+bXdkbWFfbWFzaykpCisJCQkJeyBzcGVlZCA9IFhGRVJfTVdfRE1BXzE7IGJyZWFrOyB9CisJCQlpZiAoKGlkLT5kbWFfbXdvcmQgJiAweDAwMDEpICYmCisJCQkgICAgKGlkLT5kbWFfbXdvcmQgJiBod2lmLT5td2RtYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9NV19ETUFfMDsgYnJlYWs7IH0KKwkJCWlmICgoaWQtPmRtYV8xd29yZCAmIDB4MDAwNCkgJiYKKwkJCSAgICAoaWQtPmRtYV8xd29yZCAmIGh3aWYtPnN3ZG1hX21hc2spKQorCQkJCXsgc3BlZWQgPSBYRkVSX1NXX0RNQV8yOyBicmVhazsgfQorCQkJaWYgKChpZC0+ZG1hXzF3b3JkICYgMHgwMDAyKSAmJgorCQkJICAgIChpZC0+ZG1hXzF3b3JkICYgaHdpZi0+c3dkbWFfbWFzaykpCisJCQkJeyBzcGVlZCA9IFhGRVJfU1dfRE1BXzE7IGJyZWFrOyB9CisJCQlpZiAoKGlkLT5kbWFfMXdvcmQgJiAweDAwMDEpICYmCisJCQkgICAgKGlkLT5kbWFfMXdvcmQgJiBod2lmLT5zd2RtYV9tYXNrKSkKKwkJCQl7IHNwZWVkID0gWEZFUl9TV19ETUFfMDsgYnJlYWs7IH0KKwl9CisKKy8vCXByaW50aygiJXM6ICVzOiBtb2RlIDB4JTAyeCwgc3BlZWQgMHglMDJ4XG4iLAorLy8JCV9fRlVOQ1RJT05fXywgZHJpdmUtPm5hbWUsIG1vZGUsIHNwZWVkKTsKKworCXJldHVybiBzcGVlZDsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfZG1hX3NwZWVkKTsKKworCisvKioKKyAqCWlkZV9yYXRlX2ZpbHRlcgkJLQlyZXR1cm4gYmVzdCBzcGVlZCBmb3IgbW9kZQorICoJQG1vZGU6IG1vZGVzIGF2YWlsYWJsZQorICoJQHNwZWVkOiBkZXNpcmVkIHNwZWVkCisgKgorICoJR2l2ZW4gdGhlIGF2YWlsYWJsZSBETUEvVURNQSBtb2RlIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICoJdGhlIGJlc3QgYXZhaWxhYmxlIHNwZWVkIGF0IG9yIGJlbG93IHRoZSBzcGVlZCByZXF1ZXN0ZWQuCisgKi8KKwordTggaWRlX3JhdGVfZmlsdGVyICh1OCBtb2RlLCB1OCBzcGVlZCkgCit7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJc3RhdGljIHU4IHNwZWVkX21heFtdID0geworCQlYRkVSX01XX0RNQV8yLCBYRkVSX1VETUFfMiwgWEZFUl9VRE1BXzQsCisJCVhGRVJfVURNQV81LCBYRkVSX1VETUFfNgorCX07CisKKy8vCXByaW50aygiJXM6IG1vZGUgMHglMDJ4LCBzcGVlZCAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgbW9kZSwgc3BlZWQpOworCisJLyogU28gdGhhdCB3ZSByZW1lbWJlciB0byB1cGRhdGUgdGhpcyBpZiBuZXcgbW9kZXMgYXBwZWFyICovCisJaWYgKG1vZGUgPiA0KQorCQlCVUcoKTsKKwlyZXR1cm4gbWluKHNwZWVkLCBzcGVlZF9tYXhbbW9kZV0pOworI2Vsc2UgLyogIUNPTkZJR19CTEtfREVWX0lERURNQSAqLworCXJldHVybiBtaW4oc3BlZWQsICh1OClYRkVSX1BJT180KTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KK30KKworRVhQT1JUX1NZTUJPTChpZGVfcmF0ZV9maWx0ZXIpOworCitpbnQgaWRlX2RtYV9lbmFibGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJcmV0dXJuICgoaW50KQkoKCgoaWQtPmRtYV91bHRyYSA+PiA4KSAmIGh3aWYtPnVsdHJhX21hc2spIHx8CisJCQkgICgoaWQtPmRtYV9td29yZCA+PiA4KSAmIGh3aWYtPm13ZG1hX21hc2spIHx8CisJCQkgICgoaWQtPmRtYV8xd29yZCA+PiA4KSAmIGh3aWYtPnN3ZG1hX21hc2spKSA/IDEgOiAwKSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2RtYV9lbmFibGUpOworCisvKgorICogU3RhbmRhcmQgKGdlbmVyaWMpIHRpbWluZ3MgZm9yIFBJTyBtb2RlcywgZnJvbSBBVEEyIHNwZWNpZmljYXRpb24uCisgKiBUaGVzZSB0aW1pbmdzIGFyZSBmb3IgYWNjZXNzIHRvIHRoZSBJREUgZGF0YSBwb3J0IHJlZ2lzdGVyICpvbmx5Ki4KKyAqIFNvbWUgZHJpdmVzIG1heSBzcGVjaWZ5IGEgbW9kZSwgd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50CisgKiB2YWx1ZSBmb3IgY3ljbGVfdGltZSAoZnJvbSBkcml2ZSBpZGVudGlmaWNhdGlvbiBkYXRhKS4KKyAqLworY29uc3QgaWRlX3Bpb190aW1pbmdzX3QgaWRlX3Bpb190aW1pbmdzWzZdID0geworCXsgNzAsCTE2NSwJNjAwIH0sCS8qIFBJTyBNb2RlIDAgKi8KKwl7IDUwLAkxMjUsCTM4MyB9LAkvKiBQSU8gTW9kZSAxICovCisJeyAzMCwJMTAwLAkyNDAgfSwJLyogUElPIE1vZGUgMiAqLworCXsgMzAsCTgwLAkxODAgfSwJLyogUElPIE1vZGUgMyB3aXRoIElPUkRZICovCisJeyAyNSwJNzAsCTEyMCB9LAkvKiBQSU8gTW9kZSA0IHdpdGggSU9SRFkgKi8KKwl7IDIwLAk1MCwJMTAwIH0JLyogUElPIE1vZGUgNSB3aXRoIElPUkRZIChub25zdGFuZGFyZCkgKi8KK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9waW9fdGltaW5ncyk7CisKKy8qCisgKiBTaGFyZWQgZGF0YS9mdW5jdGlvbnMgZm9yIGRldGVybWluaW5nIGJlc3QgUElPIG1vZGUgZm9yIGFuIElERSBkcml2ZS4KKyAqIE1vc3Qgb2YgdGhpcyBzdHVmZiBvcmlnaW5hbGx5IGxpdmVkIGluIGNtZDY0MC5jLCBhbmQgY2hhbmdlcyB0byB0aGUKKyAqIGlkZV9waW9fYmxhY2tsaXN0W10gdGFibGUgc2hvdWxkIGJlIG1hZGUgd2l0aCBFWFRSRU1FIENBVVRJT04gdG8gYXZvaWQKKyAqIGJyZWFraW5nIHRoZSBmcmFnaWxlIGNtZDY0MC5jIHN1cHBvcnQuCisgKi8KKworLyoKKyAqIEJsYWNrIGxpc3QuIFNvbWUgZHJpdmVzIGluY29ycmVjdGx5IHJlcG9ydCB0aGVpciBtYXhpbWFsIFBJTyBtb2RlLAorICogYXQgbGVhc3QgaW4gcmVzcGVjdCB0byBDTUQ2NDAuIEhlcmUgd2Uga2VlcCBpbmZvIG9uIHNvbWUga25vd24gZHJpdmVzLgorICovCitzdGF0aWMgc3RydWN0IGlkZV9waW9faW5mbyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCXBpbzsKK30gaWRlX3Bpb19ibGFja2xpc3QgW10gPSB7CisvKgl7ICJDb25uZXIgUGVyaXBoZXJhbHMgMTI3NU1CIC0gQ0ZTMTI3NUEiLCA0IH0sICovCisJeyAiQ29ubmVyIFBlcmlwaGVyYWxzIDU0ME1CIC0gQ0ZTNTQwQSIsIDMgfSwKKworCXsgIldEQyBBQzI3MDAiLCAgMyB9LAorCXsgIldEQyBBQzI1NDAiLCAgMyB9LAorCXsgIldEQyBBQzI0MjAiLCAgMyB9LAorCXsgIldEQyBBQzIzNDAiLCAgMyB9LAorCXsgIldEQyBBQzIyNTAiLCAgMCB9LAorCXsgIldEQyBBQzIyMDAiLCAgMCB9LAorCXsgIldEQyBBQzIxMjAwIiwgNCB9LAorCXsgIldEQyBBQzIxMjAiLCAgMCB9LAorCXsgIldEQyBBQzI4NTAiLCAgMyB9LAorCXsgIldEQyBBQzEyNzAiLCAgMyB9LAorCXsgIldEQyBBQzExNzAiLCAgMSB9LAorCXsgIldEQyBBQzEyMTAiLCAgMSB9LAorCXsgIldEQyBBQzI4MCIsICAgMCB9LAorLyoJeyAiV0RDIEFDMjEwMDAiLCA0IH0sICovCisJeyAiV0RDIEFDMzEwMDAiLCAzIH0sCisJeyAiV0RDIEFDMzEyMDAiLCAzIH0sCisvKgl7ICJXREMgQUMzMTYwMCIsIDQgfSwgKi8KKworCXsgIk1heHRvciA3MTMxIEFUIiwgMSB9LAorCXsgIk1heHRvciA3MTcxIEFUIiwgMSB9LAorCXsgIk1heHRvciA3MjEzIEFUIiwgMSB9LAorCXsgIk1heHRvciA3MjQ1IEFUIiwgMSB9LAorCXsgIk1heHRvciA3MzQ1IEFUIiwgMSB9LAorCXsgIk1heHRvciA3NTQ2IEFUIiwgMyB9LAorCXsgIk1heHRvciA3NTQwIEFWIiwgMyB9LAorCisJeyAiU0FNU1VORyBTSEQtMzEyMUEiLCAxIH0sCisJeyAiU0FNU1VORyBTSEQtMzEyMkEiLCAxIH0sCisJeyAiU0FNU1VORyBTSEQtMzE3MkEiLCAxIH0sCisKKy8qCXsgIlNUNTEwODBBIiwgNCB9LAorICoJeyAiU1Q1MTI3MEEiLCA0IH0sCisgKgl7ICJTVDMxMjIwQSIsIDQgfSwKKyAqCXsgIlNUMzE2NDBBIiwgNCB9LAorICoJeyAiU1QzMjE0MEEiLCA0IH0sCisgKgl7ICJTVDM3ODBBIiwgIDQgfSwKKyAqLworCXsgIlNUNTY2MEEiLCAgMyB9LAorCXsgIlNUMzY2MEEiLCAgMyB9LAorCXsgIlNUMzYzMEEiLCAgMyB9LAorCXsgIlNUMzY1NUEiLCAgMyB9LAorCXsgIlNUMzM5MUEiLCAgMyB9LAorCXsgIlNUMzM5MEEiLCAgMSB9LAorCXsgIlNUMzYwMEEiLCAgMSB9LAorCXsgIlNUMzI5MEEiLCAgMCB9LAorCXsgIlNUMzE0NEEiLCAgMCB9LAorCXsgIlNUMzQ5MUEiLCAgMSB9LAkvKiByZXBvcnRzIDMsIHNob3VsZCBiZSAxIG9yIDIgKGRlcGVuZGluZyBvbiAqLwkKKwkJCQkvKiBkcml2ZSkgYWNjb3JkaW5nIHRvIFNlYWdhdGVzIEZJTkQtQVRBIHByb2dyYW0gKi8KKworCXsgIlFVQU5UVU0gRUxTMTI3QSIsIDAgfSwKKwl7ICJRVUFOVFVNIEVMUzE3MEEiLCAwIH0sCisJeyAiUVVBTlRVTSBMUFMyNDBBIiwgMCB9LAorCXsgIlFVQU5UVU0gTFBTMjEwQSIsIDMgfSwKKwl7ICJRVUFOVFVNIExQUzI3MEEiLCAzIH0sCisJeyAiUVVBTlRVTSBMUFMzNjVBIiwgMyB9LAorCXsgIlFVQU5UVU0gTFBTNTQwQSIsIDMgfSwKKwl7ICJRVUFOVFVNIExJR0hUTklORyA1NDBBIiwgMyB9LAorCXsgIlFVQU5UVU0gTElHSFROSU5HIDczMEEiLCAzIH0sCisKKyAgICAgICAgeyAiUVVBTlRVTSBGSVJFQkFMTF81NDAiLCAzIH0sIC8qIE9sZGVyIFF1YW50dW0gRmlyZWJhbGxzIGRvbid0IHdvcmsgKi8KKyAgICAgICAgeyAiUVVBTlRVTSBGSVJFQkFMTF82NDAiLCAzIH0sIAorICAgICAgICB7ICJRVUFOVFVNIEZJUkVCQUxMXzEwODAiLCAzIH0sCisgICAgICAgIHsgIlFVQU5UVU0gRklSRUJBTExfMTI4MCIsIDMgfSwKKwl7IE5VTEwsCTAgfQorfTsKKworLyoqCisgKglpZGVfc2Nhbl9waW9fYmxhY2tsaXN0IAktCWNoZWNrIGZvciBhIGJsYWNrbGlzdGVkIGRyaXZlCisgKglAbW9kZWw6IERyaXZlIG1vZGVsIHN0cmluZworICoKKyAqCVRoaXMgcm91dGluZSBzZWFyY2hlcyB0aGUgaWRlX3Bpb19ibGFja2xpc3QgZm9yIGFuIGVudHJ5CisgKgltYXRjaGluZyB0aGUgc3RhcnQvd2hvbGUgb2YgdGhlIHN1cHBsaWVkIG1vZGVsIG5hbWUuCisgKgorICoJUmV0dXJucyAtMSBpZiBubyBtYXRjaCBmb3VuZC4KKyAqCU90aGVyd2lzZSByZXR1cm5zIHRoZSByZWNvbW1lbmRlZCBQSU8gbW9kZSBmcm9tIGlkZV9waW9fYmxhY2tsaXN0W10uCisgKi8KKworc3RhdGljIGludCBpZGVfc2Nhbl9waW9fYmxhY2tsaXN0IChjaGFyICptb2RlbCkKK3sKKwlzdHJ1Y3QgaWRlX3Bpb19pbmZvICpwOworCisJZm9yIChwID0gaWRlX3Bpb19ibGFja2xpc3Q7IHAtPm5hbWUgIT0gTlVMTDsgcCsrKSB7CisJCWlmIChzdHJuY21wKHAtPm5hbWUsIG1vZGVsLCBzdHJsZW4ocC0+bmFtZSkpID09IDApCisJCQlyZXR1cm4gcC0+cGlvOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICoJaWRlX2dldF9iZXN0X3Bpb19tb2RlCS0JZ2V0IFBJTyBtb2RlIGZyb20gZHJpdmUKKyAqCUBkcml2ZXI6IGRyaXZlIHRvIGNvbnNpZGVyCisgKglAbW9kZV93YW50ZWQ6IHByZWZlcnJlZCBtb2RlCisgKglAbWF4X21vZGU6IGhpZ2hlc3QgYWxsb3dlZAorICoJQGQ6IHBpbyBkYXRhCisgKgorICoJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHJlY29tbWVuZGVkIFBJTyBzZXR0aW5ncyBmb3IgYSBnaXZlbiBkcml2ZSwKKyAqCWJhc2VkIG9uIHRoZSBkcml2ZS0+aWQgaW5mb3JtYXRpb24gYW5kIHRoZSBpZGVfcGlvX2JsYWNrbGlzdFtdLgorICoJVGhpcyBpcyB1c2VkIGJ5IG1vc3QgY2hpcHNldCBzdXBwb3J0IG1vZHVsZXMgd2hlbiAiYXV0by10dW5pbmciLgorICoKKyAqCURyaXZlIFBJTyBtb2RlIGF1dG8gc2VsZWN0aW9uCisgKi8KKwordTggaWRlX2dldF9iZXN0X3Bpb19tb2RlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkLCB1OCBtYXhfbW9kZSwgaWRlX3Bpb19kYXRhX3QgKmQpCit7CisJaW50IHBpb19tb2RlOworCWludCBjeWNsZV90aW1lID0gMDsKKwlpbnQgdXNlX2lvcmR5ID0gMDsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCogaWQgPSBkcml2ZS0+aWQ7CisJaW50IG92ZXJyaWRkZW4gID0gMDsKKwlpbnQgYmxhY2tsaXN0ZWQgPSAwOworCisJaWYgKG1vZGVfd2FudGVkICE9IDI1NSkgeworCQlwaW9fbW9kZSA9IG1vZGVfd2FudGVkOworCX0gZWxzZSBpZiAoIWRyaXZlLT5pZCkgeworCQlwaW9fbW9kZSA9IDA7CisJfSBlbHNlIGlmICgocGlvX21vZGUgPSBpZGVfc2Nhbl9waW9fYmxhY2tsaXN0KGlkLT5tb2RlbCkpICE9IC0xKSB7CisJCW92ZXJyaWRkZW4gPSAxOworCQlibGFja2xpc3RlZCA9IDE7CisJCXVzZV9pb3JkeSA9IChwaW9fbW9kZSA+IDIpOworCX0gZWxzZSB7CisJCXBpb19tb2RlID0gaWQtPnRQSU87CisJCWlmIChwaW9fbW9kZSA+IDIpIHsJLyogMiBpcyBtYXhpbXVtIGFsbG93ZWQgdFBJTyB2YWx1ZSAqLworCQkJcGlvX21vZGUgPSAyOworCQkJb3ZlcnJpZGRlbiA9IDE7CisJCX0KKwkJaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpIHsJICAvKiBkcml2ZSBpbXBsZW1lbnRzIEFUQTI/ICovCisJCQlpZiAoaWQtPmNhcGFiaWxpdHkgJiA4KSB7IC8qIGRyaXZlIHN1cHBvcnRzIHVzZV9pb3JkeT8gKi8KKwkJCQl1c2VfaW9yZHkgPSAxOworCQkJCWN5Y2xlX3RpbWUgPSBpZC0+ZWlkZV9waW9faW9yZHk7CisJCQkJaWYgKGlkLT5laWRlX3Bpb19tb2RlcyAmIDcpIHsKKwkJCQkJb3ZlcnJpZGRlbiA9IDA7CisJCQkJCWlmIChpZC0+ZWlkZV9waW9fbW9kZXMgJiA0KQorCQkJCQkJcGlvX21vZGUgPSA1OworCQkJCQllbHNlIGlmIChpZC0+ZWlkZV9waW9fbW9kZXMgJiAyKQorCQkJCQkJcGlvX21vZGUgPSA0OworCQkJCQllbHNlCisJCQkJCQlwaW9fbW9kZSA9IDM7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljeWNsZV90aW1lID0gaWQtPmVpZGVfcGlvOworCQkJfQorCQl9CisKKyNpZiAwCisJCWlmIChkcml2ZS0+aWQtPm1ham9yX3Jldl9udW0gJiAweDAwMDQpIHByaW50aygiQVRBLTIgIik7CisjZW5kaWYKKworCQkvKgorCQkgKiBDb25zZXJ2YXRpdmUgImRvd25ncmFkZSIgZm9yIGFsbCBwcmUtQVRBMiBkcml2ZXMKKwkJICovCisJCWlmIChwaW9fbW9kZSAmJiBwaW9fbW9kZSA8IDQpIHsKKwkJCXBpb19tb2RlLS07CisJCQlvdmVycmlkZGVuID0gMTsKKyNpZiAwCisJCQl1c2VfaW9yZHkgPSAocGlvX21vZGUgPiAyKTsKKyNlbmRpZgorCQkJaWYgKGN5Y2xlX3RpbWUgJiYgY3ljbGVfdGltZSA8IGlkZV9waW9fdGltaW5nc1twaW9fbW9kZV0uY3ljbGVfdGltZSkKKwkJCQljeWNsZV90aW1lID0gMDsgLyogdXNlIHN0YW5kYXJkIHRpbWluZyAqLworCQl9CisJfQorCWlmIChwaW9fbW9kZSA+IG1heF9tb2RlKSB7CisJCXBpb19tb2RlID0gbWF4X21vZGU7CisJCWN5Y2xlX3RpbWUgPSAwOworCX0KKwlpZiAoZCkgeworCQlkLT5waW9fbW9kZSA9IHBpb19tb2RlOworCQlkLT5jeWNsZV90aW1lID0gY3ljbGVfdGltZSA/IGN5Y2xlX3RpbWUgOiBpZGVfcGlvX3RpbWluZ3NbcGlvX21vZGVdLmN5Y2xlX3RpbWU7CisJCWQtPnVzZV9pb3JkeSA9IHVzZV9pb3JkeTsKKwkJZC0+b3ZlcnJpZGRlbiA9IG92ZXJyaWRkZW47CisJCWQtPmJsYWNrbGlzdGVkID0gYmxhY2tsaXN0ZWQ7CisJfQorCXJldHVybiBwaW9fbW9kZTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2dldF9iZXN0X3Bpb19tb2RlKTsKKworLyoqCisgKglpZGVfdG9nZ2xlX2JvdW5jZQktCWhhbmRsZSBib3VuY2UgYnVmZmVyaW5nCisgKglAZHJpdmU6IGRyaXZlIHRvIHVwZGF0ZQorICoJQG9uOiBvbi9vZmYgYm9vbGVhbgorICoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIGJvdW5jZSBidWZmZXJpbmcgZm9yIHRoZSBkZXZpY2UuIERyaXZlcyBtb3ZlCisgKgliZXR3ZWVuIFBJTyBhbmQgRE1BIGFuZCB0aGF0IGNoYW5nZXMgdGhlIHJ1bGVzIHdlIG5lZWQuCisgKi8KKyAKK3ZvaWQgaWRlX3RvZ2dsZV9ib3VuY2UoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgb24pCit7CisJdTY0IGFkZHIgPSBCTEtfQk9VTkNFX0hJR0g7CS8qIGRtYTY0X2FkZHJfdCAqLworCisJaWYgKG9uICYmIGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykgeworCQlpZiAoIVBDSV9ETUFfQlVTX0lTX1BIWVMpCisJCQlhZGRyID0gQkxLX0JPVU5DRV9BTlk7CisJCWVsc2UgaWYgKEhXSUYoZHJpdmUpLT5wY2lfZGV2KQorCQkJYWRkciA9IEhXSUYoZHJpdmUpLT5wY2lfZGV2LT5kbWFfbWFzazsKKwl9CisKKwlpZiAoZHJpdmUtPnF1ZXVlKQorCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KGRyaXZlLT5xdWV1ZSwgYWRkcik7Cit9CisKKy8qKgorICoJaWRlX3NldF94ZmVyX3JhdGUJLQlzZXQgdHJhbnNmZXIgcmF0ZQorICoJQGRyaXZlOiBkcml2ZSB0byBzZXQKKyAqCUBzcGVlZDogc3BlZWQgdG8gYXR0ZW1wdCB0byBzZXQKKyAqCQorICoJR2VuZXJhbCBoZWxwZXIgZm9yIHNldHRpbmcgdGhlIHNwZWVkIG9mIGFuIElERSBkZXZpY2UuIFRoaXMKKyAqCWZ1bmN0aW9uIGtub3dzIGFib3V0IHVzZXIgZW5mb3JjZWQgbGltaXRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KKyAqCXdoaWNoIHNwZWVkcHJvYygpIGRvZXMgbm90LiAgSGlnaCBsZXZlbCBkcml2ZXJzIHNob3VsZCBuZXZlcgorICoJaW52b2tlIHNwZWVkcHJvYygpIGRpcmVjdGx5LgorICovCisgCitpbnQgaWRlX3NldF94ZmVyX3JhdGUoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCByYXRlKQoreworI2lmbmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUEKKwlyYXRlID0gbWluKHJhdGUsICh1OCkgWEZFUl9QSU9fNCk7CisjZW5kaWYKKwlpZihIV0lGKGRyaXZlKS0+c3BlZWRwcm9jKQorCQlyZXR1cm4gSFdJRihkcml2ZSktPnNwZWVkcHJvYyhkcml2ZSwgcmF0ZSk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9zZXRfeGZlcl9yYXRlKTsKKworc3RhdGljIHZvaWQgaWRlX2R1bXBfb3Bjb2RlKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJdTggb3Bjb2RlID0gMDsKKwlpbnQgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrKCZpZGVfbG9jayk7CisJcnEgPSBOVUxMOworCWlmIChIV0dST1VQKGRyaXZlKSkKKwkJcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3Bpbl91bmxvY2soJmlkZV9sb2NrKTsKKwlpZiAoIXJxKQorCQlyZXR1cm47CisJaWYgKHJxLT5mbGFncyAmIChSRVFfRFJJVkVfQ01EIHwgUkVRX0RSSVZFX1RBU0spKSB7CisJCWNoYXIgKmFyZ3MgPSBycS0+YnVmZmVyOworCQlpZiAoYXJncykgeworCQkJb3Bjb2RlID0gYXJnc1swXTsKKwkJCWZvdW5kID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0tGSUxFKSB7CisJCWlkZV90YXNrX3QgKmFyZ3MgPSBycS0+c3BlY2lhbDsKKwkJaWYgKGFyZ3MpIHsKKwkJCXRhc2tfc3RydWN0X3QgKnRmID0gKHRhc2tfc3RydWN0X3QgKikgYXJncy0+dGZSZWdpc3RlcjsKKwkJCW9wY29kZSA9IHRmLT5jb21tYW5kOworCQkJZm91bmQgPSAxOworCQl9CisJfQorCisJcHJpbnRrKCJpZGU6IGZhaWxlZCBvcGNvZGUgd2FzOiAiKTsKKwlpZiAoIWZvdW5kKQorCQlwcmludGsoInVua25vd25cbiIpOworCWVsc2UKKwkJcHJpbnRrKCIweCUwMnhcbiIsIG9wY29kZSk7Cit9CisKK3N0YXRpYyB1OCBpZGVfZHVtcF9hdGFfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGVyciA9IDA7CisKKwlsb2NhbF9pcnFfc2V0KGZsYWdzKTsKKwlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCIsIGRyaXZlLT5uYW1lLCBtc2csIHN0YXQpOworCXByaW50aygiIHsgIik7CisJaWYgKHN0YXQgJiBCVVNZX1NUQVQpCisJCXByaW50aygiQnVzeSAiKTsKKwllbHNlIHsKKwkJaWYgKHN0YXQgJiBSRUFEWV9TVEFUKQlwcmludGsoIkRyaXZlUmVhZHkgIik7CisJCWlmIChzdGF0ICYgV1JFUlJfU1RBVCkJcHJpbnRrKCJEZXZpY2VGYXVsdCAiKTsKKwkJaWYgKHN0YXQgJiBTRUVLX1NUQVQpCXByaW50aygiU2Vla0NvbXBsZXRlICIpOworCQlpZiAoc3RhdCAmIERSUV9TVEFUKQlwcmludGsoIkRhdGFSZXF1ZXN0ICIpOworCQlpZiAoc3RhdCAmIEVDQ19TVEFUKQlwcmludGsoIkNvcnJlY3RlZEVycm9yICIpOworCQlpZiAoc3RhdCAmIElOREVYX1NUQVQpCXByaW50aygiSW5kZXggIik7CisJCWlmIChzdGF0ICYgRVJSX1NUQVQpCXByaW50aygiRXJyb3IgIik7CisJfQorCXByaW50aygifSIpOworCXByaW50aygiXG4iKTsKKwlpZiAoKHN0YXQgJiAoQlVTWV9TVEFUfEVSUl9TVEFUKSkgPT0gRVJSX1NUQVQpIHsKKwkJZXJyID0gaHdpZi0+SU5CKElERV9FUlJPUl9SRUcpOworCQlwcmludGsoIiVzOiAlczogZXJyb3I9MHglMDJ4IiwgZHJpdmUtPm5hbWUsIG1zZywgZXJyKTsKKwkJcHJpbnRrKCIgeyAiKTsKKwkJaWYgKGVyciAmIEFCUlRfRVJSKQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7CisJCWlmIChlcnIgJiBJQ1JDX0VSUikKKwkJCXByaW50aygiQmFkJXMgIiwgKGVyciAmIEFCUlRfRVJSKSA/ICJDUkMiIDogIlNlY3RvciIpOworCQlpZiAoZXJyICYgRUNDX0VSUikJcHJpbnRrKCJVbmNvcnJlY3RhYmxlRXJyb3IgIik7CisJCWlmIChlcnIgJiBJRF9FUlIpCXByaW50aygiU2VjdG9ySWROb3RGb3VuZCAiKTsKKwkJaWYgKGVyciAmIFRSSzBfRVJSKQlwcmludGsoIlRyYWNrWmVyb05vdEZvdW5kICIpOworCQlpZiAoZXJyICYgTUFSS19FUlIpCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKKwkJcHJpbnRrKCJ9Iik7CisJCWlmICgoZXJyICYgKEJCRF9FUlIgfCBBQlJUX0VSUikpID09IEJCRF9FUlIgfHwKKwkJICAgIChlcnIgJiAoRUNDX0VSUnxJRF9FUlJ8TUFSS19FUlIpKSkgeworCQkJaWYgKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpIHsKKwkJCQlfX3U2NCBzZWN0b3JzID0gMDsKKwkJCQl1MzIgbG93ID0gMCwgaGlnaCA9IDA7CisJCQkJbG93ID0gaWRlX3JlYWRfMjQoZHJpdmUpOworCQkJCWh3aWYtPk9VVEIoZHJpdmUtPmN0bHwweDgwLCBJREVfQ09OVFJPTF9SRUcpOworCQkJCWhpZ2ggPSBpZGVfcmVhZF8yNChkcml2ZSk7CisJCQkJc2VjdG9ycyA9ICgoX191NjQpaGlnaCA8PCAyNCkgfCBsb3c7CisJCQkJcHJpbnRrKCIsIExCQXNlY3Q9JWxsdSwgaGlnaD0lZCwgbG93PSVkIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2VjdG9ycywKKwkJCQkgICAgICAgaGlnaCwgbG93KTsKKwkJCX0gZWxzZSB7CisJCQkJdTggY3VyID0gaHdpZi0+SU5CKElERV9TRUxFQ1RfUkVHKTsKKwkJCQlpZiAoY3VyICYgMHg0MCkgewkvKiB1c2luZyBMQkE/ICovCisJCQkJCXByaW50aygiLCBMQkFzZWN0PSVsZCIsICh1bnNpZ25lZCBsb25nKQorCQkJCQkgKChjdXImMHhmKTw8MjQpCisJCQkJCSB8KGh3aWYtPklOQihJREVfSENZTF9SRUcpPDwxNikKKwkJCQkJIHwoaHdpZi0+SU5CKElERV9MQ1lMX1JFRyk8PDgpCisJCQkJCSB8IGh3aWYtPklOQihJREVfU0VDVE9SX1JFRykpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygiLCBDSFM9JWQvJWQvJWQiLAorCQkJCQkgKGh3aWYtPklOQihJREVfSENZTF9SRUcpPDw4KSArCisJCQkJCSAgaHdpZi0+SU5CKElERV9MQ1lMX1JFRyksCisJCQkJCSAgY3VyICYgMHhmLAorCQkJCQkgIGh3aWYtPklOQihJREVfU0VDVE9SX1JFRykpOworCQkJCX0KKwkJCX0KKwkJCWlmIChIV0dST1VQKGRyaXZlKSAmJiBIV0dST1VQKGRyaXZlKS0+cnEpCisJCQkJcHJpbnRrKCIsIHNlY3Rvcj0lbGx1IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylIV0dST1VQKGRyaXZlKS0+cnEtPnNlY3Rvcik7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworCWlkZV9kdW1wX29wY29kZShkcml2ZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJaWRlX2R1bXBfYXRhcGlfc3RhdHVzICAgICAgIC0gICAgICAgcHJpbnQgaHVtYW4gcmVhZGFibGUgYXRhcGkgc3RhdHVzCisgKglAZHJpdmU6IGRyaXZlIHRoYXQgc3RhdHVzIGFwcGxpZXMgdG8KKyAqCUBtc2c6IHRleHQgbWVzc2FnZSB0byBwcmludAorICoJQHN0YXQ6IHN0YXR1cyBieXRlIHRvIGRlY29kZQorICoKKyAqCUVycm9yIHJlcG9ydGluZywgaW4gaHVtYW4gcmVhZGFibGUgZm9ybSAobHV4dXJpb3VzLCBidXQgYSBtZW1vcnkgaG9nKS4KKyAqLworCitzdGF0aWMgdTggaWRlX2R1bXBfYXRhcGlfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhdGFwaV9zdGF0dXNfdCBzdGF0dXM7CisJYXRhcGlfZXJyb3JfdCBlcnJvcjsKKworCXN0YXR1cy5hbGwgPSBzdGF0OworCWVycm9yLmFsbCA9IDA7CisJbG9jYWxfaXJxX3NldChmbGFncyk7CisJcHJpbnRrKCIlczogJXM6IHN0YXR1cz0weCUwMnggeyAiLCBkcml2ZS0+bmFtZSwgbXNnLCBzdGF0KTsKKwlpZiAoc3RhdHVzLmIuYnN5KQorCQlwcmludGsoIkJ1c3kgIik7CisJZWxzZSB7CisJCWlmIChzdGF0dXMuYi5kcmR5KQlwcmludGsoIkRyaXZlUmVhZHkgIik7CisJCWlmIChzdGF0dXMuYi5kZikJcHJpbnRrKCJEZXZpY2VGYXVsdCAiKTsKKwkJaWYgKHN0YXR1cy5iLmRzYykJcHJpbnRrKCJTZWVrQ29tcGxldGUgIik7CisJCWlmIChzdGF0dXMuYi5kcnEpCXByaW50aygiRGF0YVJlcXVlc3QgIik7CisJCWlmIChzdGF0dXMuYi5jb3JyKQlwcmludGsoIkNvcnJlY3RlZEVycm9yICIpOworCQlpZiAoc3RhdHVzLmIuaWR4KQlwcmludGsoIkluZGV4ICIpOworCQlpZiAoc3RhdHVzLmIuY2hlY2spCXByaW50aygiRXJyb3IgIik7CisJfQorCXByaW50aygifVxuIik7CisJaWYgKHN0YXR1cy5iLmNoZWNrICYmICFzdGF0dXMuYi5ic3kpIHsKKwkJZXJyb3IuYWxsID0gSFdJRihkcml2ZSktPklOQihJREVfRVJST1JfUkVHKTsKKwkJcHJpbnRrKCIlczogJXM6IGVycm9yPTB4JTAyeCB7ICIsIGRyaXZlLT5uYW1lLCBtc2csIGVycm9yLmFsbCk7CisJCWlmIChlcnJvci5iLmlsaSkJcHJpbnRrKCJJbGxlZ2FsTGVuZ3RoSW5kaWNhdGlvbiAiKTsKKwkJaWYgKGVycm9yLmIuZW9tKQlwcmludGsoIkVuZE9mTWVkaWEgIik7CisJCWlmIChlcnJvci5iLmFicnQpCXByaW50aygiQWJvcnRlZENvbW1hbmQgIik7CisJCWlmIChlcnJvci5iLm1jcikJcHJpbnRrKCJNZWRpYUNoYW5nZVJlcXVlc3RlZCAiKTsKKwkJaWYgKGVycm9yLmIuc2Vuc2Vfa2V5KQlwcmludGsoIkxhc3RGYWlsZWRTZW5zZT0weCUwMnggIiwKKwkJCQkJCWVycm9yLmIuc2Vuc2Vfa2V5KTsKKwkJcHJpbnRrKCJ9XG4iKTsKKwl9CisJaWRlX2R1bXBfb3Bjb2RlKGRyaXZlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIGVycm9yLmFsbDsKK30KKworLyoqCisgKglpZGVfZHVtcF9zdGF0dXMJCS0JdHJhbnNsYXRlIEFUQS9BVEFQSSBlcnJvcgorICoJQGRyaXZlOiBkcml2ZSB0aGUgZXJyb3Igb2NjdXJlZCBvbgorICoJQG1zZzogaW5mb3JtYXRpb24gc3RyaW5nCisgKglAc3RhdDogc3RhdHVzIGJ5dGUKKyAqCisgKglFcnJvciByZXBvcnRpbmcsIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0gKGx1eHVyaW91cywgYnV0IGEgbWVtb3J5IGhvZykuCisgKglDb21iaW5lcyB0aGUgZHJpdmUgbmFtZSwgbWVzc2FnZSBhbmQgc3RhdHVzIGJ5dGUgdG8gcHJvdmlkZSBhCisgKgl1c2VyIHVuZGVyc3RhbmRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBkZXZpY2UgZXJyb3IuCisgKi8KKwordTggaWRlX2R1bXBfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQoreworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCXJldHVybiBpZGVfZHVtcF9hdGFfc3RhdHVzKGRyaXZlLCBtc2csIHN0YXQpOworCXJldHVybiBpZGVfZHVtcF9hdGFwaV9zdGF0dXMoZHJpdmUsIG1zZywgc3RhdCk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX2R1bXBfc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wbnAuYyBiL2RyaXZlcnMvaWRlL2lkZS1wbnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdkMTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBucC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9pZGUtcG5wLmMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYXV0b2RldGVjdGlvbiBmb3IgSVNBIFBuUCBJREUgaW50ZXJmYWNlcy4KKyAqIEl0IHdhcyB0ZXN0ZWQgd2l0aCAiRVNTIEVTMTg2OCBQbHVnIGFuZCBQbGF5IEF1ZGlvRHJpdmUiIElERSBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJleSBQYW5pbiA8cGF6a2VAZG9ucGFjLnJ1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChmb3IgZXhhbXBsZSAvdXNyL3NyYy9saW51eC9DT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisvKiBBZGQgeW91ciBkZXZpY2VzIGhlcmUgOikpICovCitzdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgaWRlcG5wX2RldmljZXNbXSA9IHsKKyAgCS8qIEdlbmVyaWMgRVNESS9JREUvQVRBIGNvbXBhdGlibGUgaGFyZCBkaXNrIGNvbnRyb2xsZXIgKi8KKwl7LmlkID0gIlBOUDA2MDAiLCAuZHJpdmVyX2RhdGEgPSAwfSwKKwl7LmlkID0gIiJ9Cit9OworCitzdGF0aWMgaW50IGlkZXBucF9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqIGRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlod19yZWdzX3QgaHc7CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlpbnQgaW5kZXg7CisKKwlpZiAoIShwbnBfcG9ydF92YWxpZChkZXYsIDApICYmIHBucF9wb3J0X3ZhbGlkKGRldiwgMSkgJiYgcG5wX2lycV92YWxpZChkZXYsIDApKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7CisJaWRlX3N0ZF9pbml0X3BvcnRzKCZodywgcG5wX3BvcnRfc3RhcnQoZGV2LCAwKSwKKwkJCQlwbnBfcG9ydF9zdGFydChkZXYsIDEpKTsKKwlody5pcnEgPSBwbnBfaXJxKGRldiwgMCk7CisJaHcuZG1hID0gTk9fRE1BOworCisJaW5kZXggPSBpZGVfcmVnaXN0ZXJfaHcoJmh3LCAmaHdpZik7CisKKwlpZiAoaW5kZXggIT0gLTEpIHsKKwkgICAgCXByaW50ayhLRVJOX0lORk8gImlkZSVkOiBnZW5lcmljIFBuUCBJREUgaW50ZXJmYWNlXG4iLCBpbmRleCk7CisJCXBucF9zZXRfZHJ2ZGF0YShkZXYsaHdpZik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaWRlcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqIGRldikKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gcG5wX2dldF9kcnZkYXRhKGRldik7CisJaWYgKGh3aWYpIHsKKwkJaWRlX3VucmVnaXN0ZXIoaHdpZi0+aW5kZXgpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImlkZXBucDogVW5hYmxlIHRvIHJlbW92ZSBkZXZpY2UsIHBsZWFzZSByZXBvcnQuXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIGlkZXBucF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImlkZSIsCisJLmlkX3RhYmxlCT0gaWRlcG5wX2RldmljZXMsCisJLnByb2JlCQk9IGlkZXBucF9wcm9iZSwKKwkucmVtb3ZlCQk9IGlkZXBucF9yZW1vdmUsCit9OworCit2b2lkIF9faW5pdCBwbnBpZGVfaW5pdCh2b2lkKQoreworCXBucF9yZWdpc3Rlcl9kcml2ZXIoJmlkZXBucF9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ0NzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKQEAgLTAsMCArMSwxNDIxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCVZlcnNpb24gMS4xMQlNYXIgMDUsIDIwMDMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTggIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycyAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiAgTW9zdGx5IHdyaXR0ZW4gYnkgTWFyayBMb3JkIDxtbG9yZEBwb2JveC5jb20+CisgKiAgICAgICAgICAgICAgICBhbmQgR2FkaSBPeG1hbiA8Z2FkaW9AbmV0dmlzaW9uLm5ldC5pbD4KKyAqICAgICAgICAgICAgICAgIGFuZCBBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICoKKyAqICBTZWUgbGludXgvTUFJTlRBSU5FUlMgZm9yIGFkZHJlc3Mgb2YgY3VycmVudCBtYWludGFpbmVyLgorICoKKyAqIFRoaXMgaXMgdGhlIElERSBwcm9iZSBtb2R1bGUsIGFzIGV2b2x2ZWQgZnJvbSBoZC5jIGFuZCBpZGUuYy4KKyAqCisgKiBWZXJzaW9uIDEuMDAJCW1vdmUgZHJpdmUgcHJvYmluZyBjb2RlIGZyb20gaWRlLmMgdG8gaWRlLXByb2JlLmMKKyAqIFZlcnNpb24gMS4wMQkJZml4IGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIG02OGsKKyAqIFZlcnNpb24gMS4wMgkJaW5jcmVhc2UgV0FJVF9QSURFTlRJRlkgdG8gYXZvaWQgQ0QtUk9NIGxvY2tpbmcgYXQgYm9vdAorICoJCQkgYnkgQW5kcmVhIEFyY2FuZ2VsaQorICogVmVyc2lvbiAxLjAzCQlmaXggZm9yIChod2lmLT5jaGlwc2V0ID09IGlkZV80ZHJpdmVzKQorICogVmVyc2lvbiAxLjA0CQlmaXhlZCBidWdneSB0cmVhdG1lbnRzIG9mIGtub3duIGZsYXNoIG1lbW9yeSBjYXJkcworICoKKyAqIFZlcnNpb24gMS4wNQkJZml4IGZvciAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGRjNDAzMCkKKyAqCQkJYWRkZWQgaWRlNi83LzgvOQorICoJCQlhbGxvd2VkIGZvciBzZWNvbmRhcnkgZmxhc2ggY2FyZCB0byBiZSBkZXRlY3RhYmxlCisgKgkJCSB3aXRoIG5ldyBmbGFnIDogZHJpdmUtPmF0YV9mbGFzaCA6IDE7CisgKiBWZXJzaW9uIDEuMDYJCXN0cmVhbSBsaW5lIHJlcXVlc3QgcXVldWUgYW5kIHByZXAgZm9yIGNhc2NhZGUgcHJvamVjdC4KKyAqIFZlcnNpb24gMS4wNwkJbWF4X3NlY3QgPD0gMjU1OyBzbG93ZXIgZGlza3Mgd291bGQgZ2V0IGJlaGluZCBhbmQKKyAqIAkJCXRoZW4gZmFsbCBvdmVyIHdoZW4gdGhleSBnZXQgdG8gMjU2LglQYXVsIEcuCisgKiBWZXJzaW9uIDEuMTAJCVVwZGF0ZSBzZXQgZm9yIG5ldyBJREUuIGRyaXZlLT5pZCBpcyBub3cgYWx3YXlzCisgKgkJCXZhbGlkIGFmdGVyIHByb2JlIHRpbWUgZXZlbiB3aXRoIG5vcHJvYmUKKyAqLworCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JCS8qIG1vc3Qgc3lzdGVtcyBjYW4gc2FmZWx5IHVuZGVmIHRoaXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKioKKyAqCWdlbmVyaWNfaWQJCS0JYWRkIGEgZ2VuZXJpYyBkcml2ZSBpZAorICoJQGRyaXZlOglkcml2ZSB0byBtYWtlIGFuIElEIGJsb2NrIGZvcgorICoJCisgKglBZGQgYSBmYWtlIGlkIGZpZWxkIHRvIHRoZSBkcml2ZSB3ZSBhcmUgcGFzc2VkLiBUaGlzIGFsbG93cworICoJdXNlIHRvIHNraXAgYSB0b24gb2YgTlVMTCBjaGVja3MgKHdoaWNoIHBlb3BsZSBhbHdheXMgbWlzcykgCisgKglhbmQgbWFrZSBkcml2ZSBwcm9wZXJ0aWVzIHVuY29uZGl0aW9uYWwgb3V0c2lkZSBvZiB0aGlzIGZpbGUKKyAqLworIAorc3RhdGljIHZvaWQgZ2VuZXJpY19pZChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJZHJpdmUtPmlkLT5jeWxzID0gZHJpdmUtPmN5bDsKKwlkcml2ZS0+aWQtPmhlYWRzID0gZHJpdmUtPmhlYWQ7CisJZHJpdmUtPmlkLT5zZWN0b3JzID0gZHJpdmUtPnNlY3Q7CisJZHJpdmUtPmlkLT5jdXJfY3lscyA9IGRyaXZlLT5jeWw7CisJZHJpdmUtPmlkLT5jdXJfaGVhZHMgPSBkcml2ZS0+aGVhZDsKKwlkcml2ZS0+aWQtPmN1cl9zZWN0b3JzID0gZHJpdmUtPnNlY3Q7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9kaXNrX2luaXRfY2hzKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisKKwkvKiBFeHRyYWN0IGdlb21ldHJ5IGlmIHdlIGRpZCBub3QgYWxyZWFkeSBoYXZlIG9uZSBmb3IgdGhlIGRyaXZlICovCisJaWYgKCFkcml2ZS0+Y3lsIHx8ICFkcml2ZS0+aGVhZCB8fCAhZHJpdmUtPnNlY3QpIHsKKwkJZHJpdmUtPmN5bCAgPSBkcml2ZS0+Ymlvc19jeWwgID0gaWQtPmN5bHM7CisJCWRyaXZlLT5oZWFkID0gZHJpdmUtPmJpb3NfaGVhZCA9IGlkLT5oZWFkczsKKwkJZHJpdmUtPnNlY3QgPSBkcml2ZS0+Ymlvc19zZWN0ID0gaWQtPnNlY3RvcnM7CisJfQorCisJLyogSGFuZGxlIGxvZ2ljYWwgZ2VvbWV0cnkgdHJhbnNsYXRpb24gYnkgdGhlIGRyaXZlICovCisJaWYgKChpZC0+ZmllbGRfdmFsaWQgJiAxKSAmJiBpZC0+Y3VyX2N5bHMgJiYKKwkgICAgaWQtPmN1cl9oZWFkcyAmJiAoaWQtPmN1cl9oZWFkcyA8PSAxNikgJiYgaWQtPmN1cl9zZWN0b3JzKSB7CisJCWRyaXZlLT5jeWwgID0gaWQtPmN1cl9jeWxzOworCQlkcml2ZS0+aGVhZCA9IGlkLT5jdXJfaGVhZHM7CisJCWRyaXZlLT5zZWN0ID0gaWQtPmN1cl9zZWN0b3JzOworCX0KKworCS8qIFVzZSBwaHlzaWNhbCBnZW9tZXRyeSBpZiB3aGF0IHdlIGhhdmUgc3RpbGwgbWFrZXMgbm8gc2Vuc2UgKi8KKwlpZiAoZHJpdmUtPmhlYWQgPiAxNiAmJiBpZC0+aGVhZHMgJiYgaWQtPmhlYWRzIDw9IDE2KSB7CisJCWRyaXZlLT5jeWwgID0gaWQtPmN5bHM7CisJCWRyaXZlLT5oZWFkID0gaWQtPmhlYWRzOworCQlkcml2ZS0+c2VjdCA9IGlkLT5zZWN0b3JzOworCX0KK30KKworc3RhdGljIHZvaWQgaWRlX2Rpc2tfaW5pdF9tdWx0X2NvdW50KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisKKwlkcml2ZS0+bXVsdF9jb3VudCA9IDA7CisJaWYgKGlkLT5tYXhfbXVsdHNlY3QpIHsKKyNpZmRlZiBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFCisJCWlkLT5tdWx0c2VjdCA9ICgoaWQtPm1heF9tdWx0c2VjdC8yKSA+IDEpID8gaWQtPm1heF9tdWx0c2VjdCA6IDA7CisJCWlkLT5tdWx0c2VjdF92YWxpZCA9IGlkLT5tdWx0c2VjdCA/IDEgOiAwOworCQlkcml2ZS0+bXVsdF9yZXEgPSBpZC0+bXVsdHNlY3RfdmFsaWQgPyBpZC0+bWF4X211bHRzZWN0IDogSU5JVElBTF9NVUxUX0NPVU5UOworCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9tdWx0bW9kZSA9IGRyaXZlLT5tdWx0X3JlcSA/IDEgOiAwOworI2Vsc2UJLyogb3JpZ2luYWwsIHByZSBJREUtTkZHLCBwZXIgcmVxdWVzdCBvZiBBQyAqLworCQlkcml2ZS0+bXVsdF9yZXEgPSBJTklUSUFMX01VTFRfQ09VTlQ7CisJCWlmIChkcml2ZS0+bXVsdF9yZXEgPiBpZC0+bWF4X211bHRzZWN0KQorCQkJZHJpdmUtPm11bHRfcmVxID0gaWQtPm1heF9tdWx0c2VjdDsKKwkJaWYgKGRyaXZlLT5tdWx0X3JlcSB8fCAoKGlkLT5tdWx0c2VjdF92YWxpZCAmIDEpICYmIGlkLT5tdWx0c2VjdCkpCisJCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9tdWx0bW9kZSA9IDE7CisjZW5kaWYKKwl9Cit9CisKKy8qKgorICoJZHJpdmVfaXNfZmxhc2hjYXJkCS0JY2hlY2sgZm9yIGNvbXBhY3QgZmxhc2gKKyAqCUBkcml2ZTogZHJpdmUgdG8gY2hlY2sKKyAqCisgKglDb21wYWN0Rmxhc2ggY2FyZHMgYW5kIHRoZWlyIGJyZXRoZXJuIHByZXRlbmQgdG8gYmUgcmVtb3ZhYmxlCisgKgloYXJkIGRpc2tzLCBleGNlcHQ6CisgKiAJCSgxKSB0aGV5IG5ldmVyIGhhdmUgYSBzbGF2ZSB1bml0LCBhbmQKKyAqCQkoMikgdGhleSBkb24ndCBoYXZlIGRvb3Jsb2NrIG1lY2hhbmlzbXMuCisgKglUaGlzIHRlc3QgY2F0Y2hlcyB0aGVtLCBhbmQgaXMgaW52b2tlZCBlbHNld2hlcmUgd2hlbiBzZXR0aW5nCisgKglhcHByb3ByaWF0ZSBjb25maWcgYml0cy4KKyAqCisgKglGSVhNRTogVGhpcyB0cmVhdG1lbnQgaXMgcHJvYmFibHkgYXBwbGljYWJsZSBmb3IgKmFsbCogUENNQ0lBIChQQyBDQVJEKQorICoJZGV2aWNlcywgc28gaW4gbGludXggMi4zLnggd2Ugc2hvdWxkIGNoYW5nZSB0aGlzIHRvIGp1c3QgdHJlYXQgYWxsCisgKglQQ01DSUEgIGRyaXZlcyB0aGlzIHdheSwgYW5kIGdldCByaWQgb2YgdGhlIG1vZGVsLW5hbWUgdGVzdHMgYmVsb3cKKyAqCSh0b28gYmlnIG9mIGFuIGludGVyZmFjZSBjaGFuZ2UgZm9yIDIuNC54KS4KKyAqCUF0IHRoYXQgdGltZSwgd2UgbWlnaHQgYWxzbyBjb25zaWRlciBwYXJhbWV0ZXJpemluZyB0aGUgdGltZW91dHMgYW5kCisgKglyZXRyaWVzLCBzaW5jZSB0aGVzZSBhcmUgTVVDSCBmYXN0ZXIgdGhhbiBtZWNoYW5pY2FsIGRyaXZlcy4gLU0uTG9yZAorICovCisgCitzdGF0aWMgaW5saW5lIGludCBkcml2ZV9pc19mbGFzaGNhcmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisKKwlpZiAoZHJpdmUtPnJlbW92YWJsZSkgeworCQlpZiAoaWQtPmNvbmZpZyA9PSAweDg0OGEpIHJldHVybiAxOwkvKiBDb21wYWN0Rmxhc2ggKi8KKwkJaWYgKCFzdHJuY21wKGlkLT5tb2RlbCwgIktPREFLIEFUQV9GTEFTSCIsIDE1KQkvKiBLb2RhayAqLworCQkgfHwgIXN0cm5jbXAoaWQtPm1vZGVsLCAiSGl0YWNoaSBDViIsIDEwKQkvKiBIaXRhY2hpICovCisJCSB8fCAhc3RybmNtcChpZC0+bW9kZWwsICJTdW5EaXNrIFNEQ0ZCIiwgMTMpCS8qIG9sZCBTYW5EaXNrICovCisJCSB8fCAhc3RybmNtcChpZC0+bW9kZWwsICJTYW5EaXNrIFNEQ0ZCIiwgMTMpCS8qIFNhbkRpc2sgKi8KKwkJIHx8ICFzdHJuY21wKGlkLT5tb2RlbCwgIkhBR0lXQVJBIEhQQyIsIDEyKQkvKiBIYWdpd2FyYSAqLworCQkgfHwgIXN0cm5jbXAoaWQtPm1vZGVsLCAiTEVYQVIgQVRBX0ZMQVNIIiwgMTUpCS8qIExleGFyICovCisJCSB8fCAhc3RybmNtcChpZC0+bW9kZWwsICJBVEFfRkxBU0giLCA5KSkJLyogU2ltcGxlIFRlY2ggKi8KKwkJeworCQkJcmV0dXJuIDE7CS8qIHllcywgaXQgaXMgYSBmbGFzaCBtZW1vcnkgY2FyZCAqLworCQl9CisJfQorCXJldHVybiAwOwkvKiBubywgaXQgaXMgbm90IGEgZmxhc2ggbWVtb3J5IGNhcmQgKi8KK30KKworLyoqCisgKglkb19pZGVudGlmeQktCWlkZW50aWZ5IGEgZHJpdmUKKyAqCUBkcml2ZTogZHJpdmUgdG8gaWRlbnRpZnkgCisgKglAY21kOiBjb21tYW5kIHVzZWQKKyAqCisgKglDYWxsZWQgd2hlbiB3ZSBoYXZlIGlzc3VlZCBhIGRyaXZlIGlkZW50aWZ5IGNvbW1hbmQgdG8KKyAqCXJlYWQgYW5kIHBhcnNlIHRoZSByZXN1bHRzLiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biB3aXRoCisgKglpbnRlcnJ1cHRzIGRpc2FibGVkLiAKKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIGRvX2lkZW50aWZ5IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaW50IGJzd2FwID0gMTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQ7CisKKwlpZCA9IGRyaXZlLT5pZDsKKwkvKiByZWFkIDUxMiBieXRlcyBvZiBpZCBpbmZvICovCisJaHdpZi0+YXRhX2lucHV0X2RhdGEoZHJpdmUsIGlkLCBTRUNUT1JfV09SRFMpOworCisJZHJpdmUtPmlkX3JlYWQgPSAxOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlpZGVfZml4X2RyaXZlaWQoaWQpOworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NDU0lfRUFUQV9ETUEpIHx8IGRlZmluZWQgKENPTkZJR19TQ1NJX0VBVEFfUElPKSB8fCBkZWZpbmVkIChDT05GSUdfU0NTSV9FQVRBKQorCS8qCisJICogRUFUQSBTQ1NJIGNvbnRyb2xsZXJzIGRvIGEgaGFyZHdhcmUgQVRBIGVtdWxhdGlvbjoKKwkgKiBJZ25vcmUgdGhlbSBpZiB0aGVyZSBpcyBhIGRyaXZlciBmb3IgdGhlbSBhdmFpbGFibGUuCisJICovCisJaWYgKChpZC0+bW9kZWxbMF0gPT0gJ1AnICYmIGlkLT5tb2RlbFsxXSA9PSAnTScpIHx8CisJICAgIChpZC0+bW9kZWxbMF0gPT0gJ1MnICYmIGlkLT5tb2RlbFsxXSA9PSAnSycpKSB7CisJCXByaW50aygiJXM6IEVBVEEgU0NTSSBIQkEgJS4xMHNcbiIsIGRyaXZlLT5uYW1lLCBpZC0+bW9kZWwpOworCQlnb3RvIGVycl9taXNjOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0NTSV9FQVRBX0RNQSB8fCBDT05GSUdfU0NTSV9FQVRBX1BJTyAqLworCisJLyoKKwkgKiAgV0lOX0lERU5USUZZIHJldHVybnMgbGl0dGxlLWVuZGlhbiBpbmZvLAorCSAqICBXSU5fUElERU5USUZZICp1c3VhbGx5KiByZXR1cm5zIGxpdHRsZS1lbmRpYW4gaW5mby4KKwkgKi8KKwlpZiAoY21kID09IFdJTl9QSURFTlRJRlkpIHsKKwkJaWYgKChpZC0+bW9kZWxbMF0gPT0gJ04nICYmIGlkLT5tb2RlbFsxXSA9PSAnRScpIC8qIE5FQyAqLworCQkgfHwgKGlkLT5tb2RlbFswXSA9PSAnRicgJiYgaWQtPm1vZGVsWzFdID09ICdYJykgLyogTWl0c3VtaSAqLworCQkgfHwgKGlkLT5tb2RlbFswXSA9PSAnUCcgJiYgaWQtPm1vZGVsWzFdID09ICdpJykpLyogUGlvbmVlciAqLworCQkJLyogVmVydG9zIGRyaXZlcyBtYXkgc3RpbGwgYmUgd2VpcmQgKi8KKwkJCWJzd2FwIF49IDE7CQorCX0KKwlpZGVfZml4c3RyaW5nKGlkLT5tb2RlbCwgICAgIHNpemVvZihpZC0+bW9kZWwpLCAgICAgYnN3YXApOworCWlkZV9maXhzdHJpbmcoaWQtPmZ3X3JldiwgICAgc2l6ZW9mKGlkLT5md19yZXYpLCAgICBic3dhcCk7CisJaWRlX2ZpeHN0cmluZyhpZC0+c2VyaWFsX25vLCBzaXplb2YoaWQtPnNlcmlhbF9ubyksIGJzd2FwKTsKKworCWlmIChzdHJzdHIoaWQtPm1vZGVsLCAiRSBYIEEgQiBZIFQgRSBOIEUgUyBUIikpCisJCWdvdG8gZXJyX21pc2M7CisKKwkvKiB3ZSBkZXBlbmQgb24gdGhpcyBhIGxvdCEgKi8KKwlpZC0+bW9kZWxbc2l6ZW9mKGlkLT5tb2RlbCktMV0gPSAnXDAnOworCXByaW50aygiJXM6ICVzLCAiLCBkcml2ZS0+bmFtZSwgaWQtPm1vZGVsKTsKKwlkcml2ZS0+cHJlc2VudCA9IDE7CisJZHJpdmUtPmRlYWQgPSAwOworCisJLyoKKwkgKiBDaGVjayBmb3IgYW4gQVRBUEkgZGV2aWNlCisJICovCisJaWYgKGNtZCA9PSBXSU5fUElERU5USUZZKSB7CisJCXU4IHR5cGUgPSAoaWQtPmNvbmZpZyA+PiA4KSAmIDB4MWY7CisJCXByaW50aygiQVRBUEkgIik7CisJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBpZGVfZmxvcHB5OgorCQkJCWlmICghc3Ryc3RyKGlkLT5tb2RlbCwgIkNELVJPTSIpKSB7CisJCQkJCWlmICghc3Ryc3RyKGlkLT5tb2RlbCwgIm9wcHkiKSAmJgorCQkJCQkgICAgIXN0cnN0cihpZC0+bW9kZWwsICJwb3lwIikgJiYKKwkJCQkJICAgICFzdHJzdHIoaWQtPm1vZGVsLCAiWklQIikpCisJCQkJCQlwcmludGsoImNkcm9tIG9yIGZsb3BweT8sIGFzc3VtaW5nICIpOworCQkJCQlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9jZHJvbSkgeworCQkJCQkJcHJpbnRrICgiRkxPUFBZIik7CisJCQkJCQlkcml2ZS0+cmVtb3ZhYmxlID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCS8qIEVhcmx5IGNkcm9tIG1vZGVscyB1c2VkIHplcm8gKi8KKwkJCQl0eXBlID0gaWRlX2Nkcm9tOworCQkJY2FzZSBpZGVfY2Ryb206CisJCQkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisjaWZkZWYgQ09ORklHX1BQQworCQkJCS8qIGtsdWRnZSBmb3IgQXBwbGUgUG93ZXJCb29rIGludGVybmFsIHppcCAqLworCQkJCWlmICghc3Ryc3RyKGlkLT5tb2RlbCwgIkNELVJPTSIpICYmCisJCQkJICAgIHN0cnN0cihpZC0+bW9kZWwsICJaSVAiKSkgeworCQkJCQlwcmludGsgKCJGTE9QUFkiKTsKKwkJCQkJdHlwZSA9IGlkZV9mbG9wcHk7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJCXByaW50ayAoIkNEL0RWRC1ST00iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgaWRlX3RhcGU6CisJCQkJcHJpbnRrICgiVEFQRSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBpZGVfb3B0aWNhbDoKKwkJCQlwcmludGsgKCJPUFRJQ0FMIik7CisJCQkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50aygiVU5LTk9XTiAodHlwZSAlZCkiLCB0eXBlKTsKKwkJCQlicmVhazsKKwkJfQorCQlwcmludGsgKCIgZHJpdmVcbiIpOworCQlkcml2ZS0+bWVkaWEgPSB0eXBlOworCQkvKiBhbiBBVEFQSSBkZXZpY2UgaWdub3JlcyBEUkRZICovCisJCWRyaXZlLT5yZWFkeV9zdGF0ID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTm90IGFuIEFUQVBJIGRldmljZTogbG9va3MgbGlrZSBhICJyZWd1bGFyIiBoYXJkIGRpc2sKKwkgKi8KKwlpZiAoaWQtPmNvbmZpZyAmICgxPDw3KSkKKwkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisKKwlpZiAoZHJpdmVfaXNfZmxhc2hjYXJkKGRyaXZlKSkKKwkJZHJpdmUtPmlzX2ZsYXNoID0gMTsKKwlkcml2ZS0+bWVkaWEgPSBpZGVfZGlzazsKKwlwcmludGsoIiVzIERJU0sgZHJpdmVcbiIsIChkcml2ZS0+aXNfZmxhc2gpID8gIkNGQSIgOiAiQVRBIiApOworCVFVSVJLX0xJU1QoZHJpdmUpOworCXJldHVybjsKKworZXJyX21pc2M6CisJa2ZyZWUoaWQpOworCWRyaXZlLT5wcmVzZW50ID0gMDsKKwlyZXR1cm47Cit9CisKKy8qKgorICoJYWN0dWFsX3RyeV90b19pZGVudGlmeQktCXNlbmQgYXRhL2F0YXBpIGlkZW50aWZ5CisgKglAZHJpdmU6IGRyaXZlIHRvIGlkZW50aWZ5CisgKglAY21kOiBjb21tYW5kIHRvIHVzZQorICoKKyAqCXRyeV90b19pZGVudGlmeSgpIHNlbmRzIGFuIEFUQShQSSkgSURFTlRJRlkgcmVxdWVzdCB0byBhIGRyaXZlCisgKglhbmQgd2FpdHMgZm9yIGEgcmVzcG9uc2UuICBJdCBhbHNvIG1vbml0b3JzIGlycXMgd2hpbGUgdGhpcyBpcworICoJaGFwcGVuaW5nLCBpbiBob3BlIG9mIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5pbmcgd2hpY2ggb25lIGlzCisgKgliZWluZyB1c2VkIGJ5IHRoZSBpbnRlcmZhY2UuCisgKgorICoJUmV0dXJuczoJMCAgZGV2aWNlIHdhcyBpZGVudGlmaWVkCisgKgkJCTEgIGRldmljZSB0aW1lZC1vdXQgKG5vIHJlc3BvbnNlIHRvIGlkZW50aWZ5IHJlcXVlc3QpCisgKgkJCTIgIGRldmljZSBhYm9ydGVkIHRoZSBjb21tYW5kIChyZWZ1c2VkIHRvIGlkZW50aWZ5IGl0c2VsZikKKyAqLworCitzdGF0aWMgaW50IGFjdHVhbF90cnlfdG9faWRlbnRpZnkgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBoZF9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXU4IHMgPSAwLCBhID0gMDsKKworCS8qIHRha2UgYSBkZWVwIGJyZWF0aCAqLworCW1zbGVlcCg1MCk7CisKKwlpZiAoSURFX0NPTlRST0xfUkVHKSB7CisJCWEgPSBod2lmLT5JTkIoSURFX0FMVFNUQVRVU19SRUcpOworCQlzID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKwkJaWYgKChhIF4gcykgJiB+SU5ERVhfU1RBVCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb2Jpbmcgd2l0aCBTVEFUVVMoMHglMDJ4KSBpbnN0ZWFkIG9mICIKKwkJCQkiQUxUU1RBVFVTKDB4JTAyeClcbiIsIGRyaXZlLT5uYW1lLCBzLCBhKTsKKwkJCS8qIGFuY2llbnQgU2VhZ2F0ZSBkcml2ZXMsIGJyb2tlbiBpbnRlcmZhY2VzICovCisJCQloZF9zdGF0dXMgPSBJREVfU1RBVFVTX1JFRzsKKwkJfSBlbHNlIHsKKwkJCS8qIHVzZSBub24taW50cnVzaXZlIHBvbGxpbmcgKi8KKwkJCWhkX3N0YXR1cyA9IElERV9BTFRTVEFUVVNfUkVHOworCQl9CisJfSBlbHNlCisJCWhkX3N0YXR1cyA9IElERV9TVEFUVVNfUkVHOworCisJLyogc2V0IGZlYXR1cmVzIHJlZ2lzdGVyIGZvciBhdGFwaQorCSAqIGlkZW50aWZ5IGNvbW1hbmQgdG8gYmUgc3VyZSBvZiByZXBseQorCSAqLworCWlmICgoY21kID09IFdJTl9QSURFTlRJRlkpKQorCQkvKiBkaXNhYmxlIGRtYSAmIG92ZXJsYXAgKi8KKwkJaHdpZi0+T1VUQigwLCBJREVfRkVBVFVSRV9SRUcpOworCisJLyogYXNrIGRyaXZlIGZvciBJRCAqLworCWh3aWYtPk9VVEIoY21kLCBJREVfQ09NTUFORF9SRUcpOworCisJdGltZW91dCA9ICgoY21kID09IFdJTl9JREVOVElGWSkgPyBXQUlUX1dPUlNUQ0FTRSA6IFdBSVRfUElERU5USUZZKSAvIDI7CisJdGltZW91dCArPSBqaWZmaWVzOworCWRvIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCS8qIGRyaXZlIHRpbWVkLW91dCAqLworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogZ2l2ZSBkcml2ZSBhIGJyZWF0aGVyICovCisJCW1zbGVlcCg1MCk7CisJfSB3aGlsZSAoKGh3aWYtPklOQihoZF9zdGF0dXMpKSAmIEJVU1lfU1RBVCk7CisKKwkvKiB3YWl0IGZvciBJUlEgYW5kIERSUV9TVEFUICovCisJbXNsZWVwKDUwKTsKKwlpZiAoT0tfU1RBVCgoaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSksIERSUV9TVEFULCBCQURfUl9TVEFUKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIGxvY2FsIENQVSBvbmx5OyBzb21lIHN5c3RlbXMgbmVlZCB0aGlzICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJLyogZHJpdmUgcmV0dXJuZWQgSUQgKi8KKwkJZG9faWRlbnRpZnkoZHJpdmUsIGNtZCk7CisJCS8qIGRyaXZlIHJlc3BvbmRlZCB3aXRoIElEICovCisJCXJjID0gMDsKKwkJLyogY2xlYXIgZHJpdmUgSVJRICovCisJCSh2b2lkKSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfSBlbHNlIHsKKwkJLyogZHJpdmUgcmVmdXNlZCBJRCAqLworCQlyYyA9IDI7CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKgl0cnlfdG9faWRlbnRpZnkJLQl0cnkgdG8gaWRlbnRpZnkgYSBkcml2ZQorICoJQGRyaXZlOiBkcml2ZSB0byBwcm9iZQorICoJQGNtZDogY29tbWFuZCB0byB1c2UKKyAqCisgKglJc3N1ZSB0aGUgaWRlbnRpZnkgY29tbWFuZCBhbmQgdGhlbiBkbyBJUlEgcHJvYmluZyB0bworICoJY29tcGxldGUgdGhlIGlkZW50aWZpY2F0aW9uIHdoZW4gbmVlZGVkIGJ5IGZpbmRpbmcgdGhlCisgKglJUlEgdGhlIGRyaXZlIGlzIGF0dGFjaGVkIHRvCisgKi8KKyAKK3N0YXRpYyBpbnQgdHJ5X3RvX2lkZW50aWZ5IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaW50IHJldHZhbDsKKwlpbnQgYXV0b3Byb2JlID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvb2tpZSA9IDA7CisKKwkvKgorCSAqIERpc2FibGUgZGV2aWNlIGlycSB1bmxlc3Mgd2UgbmVlZCB0bworCSAqIHByb2JlIGZvciBpdC4gT3RoZXJ3aXNlIHdlJ2xsIGdldCBzcHVyaW91cworCSAqIGludGVycnVwdHMgZHVyaW5nIHRoZSBpZGVudGlmeS1waGFzZSB0aGF0CisJICogdGhlIGlycSBoYW5kbGVyIGlzbid0IGV4cGVjdGluZy4KKwkgKi8KKwlpZiAoSURFX0NPTlRST0xfUkVHKSB7CisJCXU4IGN0bCA9IGRyaXZlLT5jdGwgfCAyOworCQlpZiAoIWh3aWYtPmlycSkgeworCQkJYXV0b3Byb2JlID0gMTsKKwkJCWNvb2tpZSA9IHByb2JlX2lycV9vbigpOworCQkJLyogZW5hYmxlIGRldmljZSBpcnEgKi8KKwkJCWN0bCAmPSB+MjsKKwkJfQorCQlod2lmLT5PVVRCKGN0bCwgSURFX0NPTlRST0xfUkVHKTsKKwl9CisKKwlyZXR2YWwgPSBhY3R1YWxfdHJ5X3RvX2lkZW50aWZ5KGRyaXZlLCBjbWQpOworCisJaWYgKGF1dG9wcm9iZSkgeworCQlpbnQgaXJxOworCQkvKiBtYXNrIGRldmljZSBpcnEgKi8KKwkJaHdpZi0+T1VUQihkcml2ZS0+Y3RsfDIsIElERV9DT05UUk9MX1JFRyk7CisJCS8qIGNsZWFyIGRyaXZlIElSUSAqLworCQkodm9pZCkgaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKwkJdWRlbGF5KDUpOworCQlpcnEgPSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCWlmICghaHdpZi0+aXJxKSB7CisJCQlpZiAoaXJxID4gMCkgeworCQkJCWh3aWYtPmlycSA9IGlycTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTW1tbS4uIG11bHRpcGxlIElSUXMuLgorCQkJCSAqIGRvbid0IGtub3cgd2hpY2ggd2FzIG91cnMKKwkJCQkgKi8KKwkJCQlwcmludGsoIiVzOiBJUlEgcHJvYmUgZmFpbGVkICgweCVseClcbiIsCisJCQkJCWRyaXZlLT5uYW1lLCBjb29raWUpOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKglkb19wcm9iZQkJLQlwcm9iZSBhbiBJREUgZGV2aWNlCisgKglAZHJpdmU6IGRyaXZlIHRvIHByb2JlCisgKglAY21kOiBjb21tYW5kIHRvIHVzZQorICoKKyAqCWRvX3Byb2JlKCkgaGFzIHRoZSBkaWZmaWN1bHQgam9iIG9mIGZpbmRpbmcgYSBkcml2ZSBpZiBpdCBleGlzdHMsCisgKgl3aXRob3V0IGdldHRpbmcgaHVuZyB1cCBpZiBpdCBkb2Vzbid0IGV4aXN0LCB3aXRob3V0IHRyYW1wbGluZyBvbgorICoJZXRoZXJuZXQgY2FyZHMsIGFuZCB3aXRob3V0IGxlYXZpbmcgYW55IElSUXMgZGFuZ2xpbmcgdG8gaGF1bnQgdXMgbGF0ZXIuCisgKgorICoJSWYgYSBkcml2ZSBpcyAia25vd24iIHRvIGV4aXN0IChmcm9tIENNT1Mgb3Iga2VybmVsIHBhcmFtZXRlcnMpLAorICoJYnV0IGRvZXMgbm90IHJlc3BvbmQgcmlnaHQgYXdheSwgdGhlIHByb2JlIHdpbGwgImhhbmcgaW4gdGhlcmUiCisgKglmb3IgdGhlIG1heGltdW0gd2FpdCB0aW1lIChhYm91dCAzMCBzZWNvbmRzKSwgb3RoZXJ3aXNlIGl0IHdpbGwKKyAqCWV4aXQgbXVjaCBtb3JlIHF1aWNrbHkuCisgKgorICogUmV0dXJuczoJMCAgZGV2aWNlIHdhcyBpZGVudGlmaWVkCisgKgkJMSAgZGV2aWNlIHRpbWVkLW91dCAobm8gcmVzcG9uc2UgdG8gaWRlbnRpZnkgcmVxdWVzdCkKKyAqCQkyICBkZXZpY2UgYWJvcnRlZCB0aGUgY29tbWFuZCAocmVmdXNlZCB0byBpZGVudGlmeSBpdHNlbGYpCisgKgkJMyAgYmFkIHN0YXR1cyBmcm9tIGRldmljZSAocG9zc2libGUgZm9yIEFUQVBJIGRyaXZlcykKKyAqCQk0ICBwcm9iZSB3YXMgbm90IGF0dGVtcHRlZCBiZWNhdXNlIGZhaWx1cmUgd2FzIG9idmlvdXMKKyAqLworCitzdGF0aWMgaW50IGRvX3Byb2JlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKK3sKKwlpbnQgcmM7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCisJaWYgKGRyaXZlLT5wcmVzZW50KSB7CisJCS8qIGF2b2lkIHdhaXRpbmcgZm9yIGluYXBwcm9wcmlhdGUgcHJvYmVzICovCisJCWlmICgoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKSAmJiAoY21kID09IFdJTl9JREVOVElGWSkpCisJCQlyZXR1cm4gNDsKKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGsoInByb2JpbmcgZm9yICVzOiBwcmVzZW50PSVkLCBtZWRpYT0lZCwgcHJvYmV0eXBlPSVzXG4iLAorCQlkcml2ZS0+bmFtZSwgZHJpdmUtPnByZXNlbnQsIGRyaXZlLT5tZWRpYSwKKwkJKGNtZCA9PSBXSU5fSURFTlRJRlkpID8gIkFUQSIgOiAiQVRBUEkiKTsKKyNlbmRpZgorCisJLyogbmVlZGVkIGZvciBzb21lIHN5c3RlbXMKKwkgKiAoZS5nLiBjcnc5NjI0IGFzIGRyaXZlMCB3aXRoIGRpc2sgYXMgc2xhdmUpCisJICovCisJbXNsZWVwKDUwKTsKKwlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCW1zbGVlcCg1MCk7CisJaWYgKGh3aWYtPklOQihJREVfU0VMRUNUX1JFRykgIT0gZHJpdmUtPnNlbGVjdC5hbGwgJiYgIWRyaXZlLT5wcmVzZW50KSB7CisJCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCAhPSAwKSB7CisJCQkvKiBleGl0IHdpdGggZHJpdmUwIHNlbGVjdGVkICovCisJCQlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJCQkvKiBhbGxvdyBCVVNZX1NUQVQgdG8gYXNzZXJ0ICYgY2xlYXIgKi8KKwkJCW1zbGVlcCg1MCk7CisJCX0KKwkJLyogbm8gaS9mIHByZXNlbnQ6IG1tbS4uIHRoaXMgc2hvdWxkIGJlIGEgNCAtbWwgKi8KKwkJcmV0dXJuIDM7CisJfQorCisJaWYgKE9LX1NUQVQoKGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpLCBSRUFEWV9TVEFULCBCVVNZX1NUQVQpIHx8CisJICAgIGRyaXZlLT5wcmVzZW50IHx8IGNtZCA9PSBXSU5fUElERU5USUZZKSB7CisJCS8qIHNlbmQgY21kIGFuZCB3YWl0ICovCisJCWlmICgocmMgPSB0cnlfdG9faWRlbnRpZnkoZHJpdmUsIGNtZCkpKSB7CisJCQkvKiBmYWlsZWQ6IHRyeSBhZ2FpbiAqLworCQkJcmMgPSB0cnlfdG9faWRlbnRpZnkoZHJpdmUsY21kKTsKKwkJfQorCQlpZiAoaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSA9PSAoQlVTWV9TVEFUfFJFQURZX1NUQVQpKQorCQkJcmV0dXJuIDQ7CisKKwkJaWYgKChyYyA9PSAxICYmIGNtZCA9PSBXSU5fUElERU5USUZZKSAmJgorCQkJKChkcml2ZS0+YXV0b3R1bmUgPT0gSURFX1RVTkVfREVGQVVMVCkgfHwKKwkJCShkcml2ZS0+YXV0b3R1bmUgPT0gSURFX1RVTkVfQVVUTykpKSB7CisJCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJCQlwcmludGsoIiVzOiBubyByZXNwb25zZSAoc3RhdHVzID0gMHglMDJ4KSwgIgorCQkJCSJyZXNldHRpbmcgZHJpdmVcbiIsIGRyaXZlLT5uYW1lLAorCQkJCWh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpOworCQkJbXNsZWVwKDUwKTsKKwkJCWh3aWYtPk9VVEIoZHJpdmUtPnNlbGVjdC5hbGwsIElERV9TRUxFQ1RfUkVHKTsKKwkJCW1zbGVlcCg1MCk7CisJCQlod2lmLT5PVVRCKFdJTl9TUlNULCBJREVfQ09NTUFORF9SRUcpOworCQkJdGltZW91dCA9IGppZmZpZXM7CisJCQl3aGlsZSAoKChod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSAmIEJVU1lfU1RBVCkgJiYKKwkJCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0ICsgV0FJVF9XT1JTVENBU0UpKQorCQkJCW1zbGVlcCg1MCk7CisJCQlyYyA9IHRyeV90b19pZGVudGlmeShkcml2ZSwgY21kKTsKKwkJfQorCQlpZiAocmMgPT0gMSkKKwkJCXByaW50aygiJXM6IG5vIHJlc3BvbnNlIChzdGF0dXMgPSAweCUwMngpXG4iLAorCQkJCWRyaXZlLT5uYW1lLCBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKTsKKwkJLyogZW5zdXJlIGRyaXZlIGlycSBpcyBjbGVhciAqLworCQkodm9pZCkgaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKwl9IGVsc2UgeworCQkvKiBub3QgcHJlc2VudCBvciBtYXliZSBBVEFQSSAqLworCQlyYyA9IDM7CisJfQorCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCAhPSAwKSB7CisJCS8qIGV4aXQgd2l0aCBkcml2ZTAgc2VsZWN0ZWQgKi8KKwkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOworCQltc2xlZXAoNTApOworCQkvKiBlbnN1cmUgZHJpdmUgaXJxIGlzIGNsZWFyICovCisJCSh2b2lkKSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKgorICovCitzdGF0aWMgdm9pZCBlbmFibGVfbmVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlwcmludGsoIiVzOiBlbmFibGluZyAlcyAtLSAiLCBod2lmLT5uYW1lLCBkcml2ZS0+aWQtPm1vZGVsKTsKKwlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCW1zbGVlcCg1MCk7CisJaHdpZi0+T1VUQihFWEFCWVRFX0VOQUJMRV9ORVNULCBJREVfQ09NTUFORF9SRUcpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJZG8geworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKCJmYWlsZWQgKHRpbWVvdXQpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQltc2xlZXAoNTApOworCX0gd2hpbGUgKChod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSAmIEJVU1lfU1RBVCk7CisKKwltc2xlZXAoNTApOworCisJaWYgKCFPS19TVEFUKChod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSwgMCwgQkFEX1NUQVQpKSB7CisJCXByaW50aygiZmFpbGVkIChzdGF0dXMgPSAweCUwMngpXG4iLCBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKTsKKwl9IGVsc2UgeworCQlwcmludGsoInN1Y2Nlc3NcbiIpOworCX0KKworCS8qIGlmICEoc3VjY2Vzc3x8dGltZWQtb3V0KSAqLworCWlmIChkb19wcm9iZShkcml2ZSwgV0lOX0lERU5USUZZKSA+PSAyKSB7CisJCS8qIGxvb2sgZm9yIEFUQVBJIGRldmljZSAqLworCQkodm9pZCkgZG9fcHJvYmUoZHJpdmUsIFdJTl9QSURFTlRJRlkpOworCX0KK30KKworLyoqCisgKglwcm9iZV9mb3JfZHJpdmVzCS0JdXBwZXIgbGV2ZWwgZHJpdmUgcHJvYmUKKyAqCUBkcml2ZTogZHJpdmUgdG8gcHJvYmUgZm9yCisgKgorICoJcHJvYmVfZm9yX2RyaXZlKCkgdGVzdHMgZm9yIGV4aXN0ZW5jZSBvZiBhIGdpdmVuIGRyaXZlIHVzaW5nIGRvX3Byb2JlKCkKKyAqCWFuZCBwcmVzZW50cyB0aGluZ3MgdG8gdGhlIHVzZXIgYXMgbmVlZGVkLgorICoKKyAqCVJldHVybnM6CTAgIG5vIGRldmljZSB3YXMgZm91bmQKKyAqCQkJMSAgZGV2aWNlIHdhcyBmb3VuZCAobm90ZTogZHJpdmUtPnByZXNlbnQgbWlnaHQKKyAqCQkJICAgc3RpbGwgYmUgMCkKKyAqLworIAorc3RhdGljIGlubGluZSB1OCBwcm9iZV9mb3JfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwkvKgorCSAqCUluIG9yZGVyIHRvIGtlZXAgdGhpbmdzIHNpbXBsZSB3ZSBoYXZlIGFuIGlkCisJICoJYmxvY2sgZm9yIGFsbCBkcml2ZXMgYXQgYWxsIHRpbWVzLiBJZiB0aGUgZGV2aWNlCisJICoJaXMgcHJlIEFUQSBvciByZWZ1c2VzIEFUQS9BVEFQSSBpZGVudGlmeSB3ZQorCSAqCXdpbGwgYWRkIGZha2VkIGRhdGEgdG8gdGhpcy4KKwkgKgorCSAqCUFsc28gbm90ZSB0aGF0IDAgZXZlcnl3aGVyZSBtZWFucyAiY2FuJ3QgZG8gWCIKKwkgKi8KKyAKKwlkcml2ZS0+aWQgPSBrbWFsbG9jKFNFQ1RPUl9XT1JEUyAqNCwgR0ZQX0tFUk5FTCk7CisJZHJpdmUtPmlkX3JlYWQgPSAwOworCWlmKGRyaXZlLT5pZCA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGU6IG91dCBvZiBtZW1vcnkgZm9yIGlkIGRhdGEuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChkcml2ZS0+aWQsIDAsIFNFQ1RPUl9XT1JEUyAqIDQpOworCXN0cmNweShkcml2ZS0+aWQtPm1vZGVsLCAiVU5LTk9XTiIpOworCQorCS8qIHNraXAgcHJvYmluZz8gKi8KKwlpZiAoIWRyaXZlLT5ub3Byb2JlKQorCXsKKwkJLyogaWYgIShzdWNjZXNzfHx0aW1lZC1vdXQpICovCisJCWlmIChkb19wcm9iZShkcml2ZSwgV0lOX0lERU5USUZZKSA+PSAyKSB7CisJCQkvKiBsb29rIGZvciBBVEFQSSBkZXZpY2UgKi8KKwkJCSh2b2lkKSBkb19wcm9iZShkcml2ZSwgV0lOX1BJREVOVElGWSk7CisJCX0KKwkJaWYgKHN0cnN0cihkcml2ZS0+aWQtPm1vZGVsLCAiRSBYIEEgQiBZIFQgRSBOIEUgUyBUIikpCisJCQllbmFibGVfbmVzdChkcml2ZSk7CisJCWlmICghZHJpdmUtPnByZXNlbnQpCisJCQkvKiBkcml2ZSBub3QgZm91bmQgKi8KKwkJCXJldHVybiAwOworCQorCQkvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQ/ICovCisJCWlmICghZHJpdmUtPmlkX3JlYWQpIHsKKwkJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbm9uLUlERSBkcml2ZSwgQ0hTPSVkLyVkLyVkXG4iLAorCQkJCQlkcml2ZS0+bmFtZSwgZHJpdmUtPmN5bCwKKwkJCQkJZHJpdmUtPmhlYWQsIGRyaXZlLT5zZWN0KTsKKwkJCX0gZWxzZSBpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBVEFQSSBjZHJvbSAoPylcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbnVrZSBpdCAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIGRldmljZSBvbiBidXMgcmVmdXNlZCBpZGVudGlmaWNhdGlvbi4gSWdub3JpbmcuXG4iLCBkcml2ZS0+bmFtZSk7CisJCQkJZHJpdmUtPnByZXNlbnQgPSAwOworCQkJfQorCQl9CisJCS8qIGRyaXZlIHdhcyBmb3VuZCAqLworCX0KKwlpZighZHJpdmUtPnByZXNlbnQpCisJCXJldHVybiAwOworCS8qIFRoZSBkcml2ZSB3YXNuJ3QgYmVpbmcgaGVscGZ1bC4gQWRkIGdlbmVyaWMgaW5mbyBvbmx5ICovCisJaWYgKGRyaXZlLT5pZF9yZWFkID09IDApIHsKKwkJZ2VuZXJpY19pZChkcml2ZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spIHsKKwkJaWRlX2Rpc2tfaW5pdF9jaHMoZHJpdmUpOworCQlpZGVfZGlza19pbml0X211bHRfY291bnQoZHJpdmUpOworCX0KKworCXJldHVybiBkcml2ZS0+cHJlc2VudDsKK30KKworc3RhdGljIHZvaWQgaHdpZl9yZWxlYXNlX2RldiAoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBjb250YWluZXJfb2YoZGV2LCBpZGVfaHdpZl90LCBnZW5kZXYpOworCisJdXAoJmh3aWYtPmdlbmRldl9yZWxfc2VtKTsKK30KKworc3RhdGljIHZvaWQgaHdpZl9yZWdpc3RlciAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwkvKiByZWdpc3RlciB3aXRoIGdsb2JhbCBkZXZpY2UgdHJlZSAqLworCXN0cmxjcHkoaHdpZi0+Z2VuZGV2LmJ1c19pZCxod2lmLT5uYW1lLEJVU19JRF9TSVpFKTsKKwlod2lmLT5nZW5kZXYuZHJpdmVyX2RhdGEgPSBod2lmOworCWlmIChod2lmLT5nZW5kZXYucGFyZW50ID09IE5VTEwpIHsKKwkJaWYgKGh3aWYtPnBjaV9kZXYpCisJCQlod2lmLT5nZW5kZXYucGFyZW50ID0gJmh3aWYtPnBjaV9kZXYtPmRldjsKKwkJZWxzZQorCQkJLyogV291bGQgbGlrZSB0byBkbyA9ICZkZXZpY2VfbGVnYWN5ICovCisJCQlod2lmLT5nZW5kZXYucGFyZW50ID0gTlVMTDsKKwl9CisJaHdpZi0+Z2VuZGV2LnJlbGVhc2UgPSBod2lmX3JlbGVhc2VfZGV2OworCWRldmljZV9yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKK30KKworc3RhdGljIGludCB3YWl0X2h3aWZfcmVhZHkoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiUHJvYmluZyBJREUgaW50ZXJmYWNlICVzLi4uXG4iLCBod2lmLT5uYW1lKTsKKworCS8qIExldCBIVyBzZXR0bGUgZG93biBhIGJpdCBmcm9tIHdoYXRldmVyIGluaXQgc3RhdGUgd2UKKwkgKiBjb21lIGZyb20gKi8KKwltZGVsYXkoMik7CisKKwkvKiBXYWl0IGZvciBCU1kgYml0IHRvIGdvIGF3YXksIHNwZWMgdGltZW91dCBpcyAzMCBzZWNvbmRzLAorCSAqIEkga25vdyBvZiBhdCBsZWFzdCBvbmUgZGlzayB3aG8gdGFrZXMgMzEgc2Vjb25kcywgSSB1c2UgMzUKKwkgKiBoZXJlIHRvIGJlIHNhZmUKKwkgKi8KKwlyYyA9IGlkZV93YWl0X25vdF9idXN5KGh3aWYsIDM1MDAwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIE5vdyBtYWtlIHN1cmUgYm90aCBtYXN0ZXIgJiBzbGF2ZSBhcmUgcmVhZHkgKi8KKwlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJaHdpZi0+T1VUQig4LCBod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKTsKKwltZGVsYXkoMik7CisJcmMgPSBpZGVfd2FpdF9ub3RfYnVzeShod2lmLCAxMDAwMCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMV0pOworCWh3aWYtPk9VVEIoOCwgaHdpZi0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSk7CisJbWRlbGF5KDIpOworCXJjID0gaWRlX3dhaXRfbm90X2J1c3koaHdpZiwgMTAwMDApOworCisJLyogRXhpdCBmdW5jdGlvbiB3aXRoIG1hc3RlciByZXNlbGVjdGVkIChsZXQncyBiZSBzYW5lKSAqLworCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKKwkKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJaWRlX3VuZGVjb2RlZF9zbGF2ZQktCWxvb2sgZm9yIGJhZCBDRiBhZGFwdGVycworICoJQGh3aWY6IGludGVyZmFjZQorICoKKyAqCUFuYWx5c2UgdGhlIGRyaXZlcyBvbiB0aGUgaW50ZXJmYWNlIGFuZCBhdHRlbXB0IHRvIGRlY2lkZSBpZiB3ZQorICoJaGF2ZSB0aGUgc2FtZSBkcml2ZSB2aWV3ZWQgdHdpY2UuIFRoaXMgb2NjdXJzIHdpdGggY3JhcCBDRiBhZGFwdGVycworICoJYW5kIFBDTUNJQSBzb21ldGltZXMuCisgKi8KKwordm9pZCBpZGVfdW5kZWNvZGVkX3NsYXZlKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlMCA9ICZod2lmLT5kcml2ZXNbMF07CisJaWRlX2RyaXZlX3QgKmRyaXZlMSA9ICZod2lmLT5kcml2ZXNbMV07CisKKwlpZiAoZHJpdmUwLT5wcmVzZW50ID09IDAgfHwgZHJpdmUxLT5wcmVzZW50ID09IDApCisJCXJldHVybjsKKworCS8qIElmIHRoZSBtb2RlbHMgZG9uJ3QgbWF0Y2ggdGhleSBhcmUgbm90IHRoZSBzYW1lIHByb2R1Y3QgKi8KKwlpZiAoc3RyY21wKGRyaXZlMC0+aWQtPm1vZGVsLCBkcml2ZTEtPmlkLT5tb2RlbCkpCisJCXJldHVybjsKKworCS8qIFNlcmlhbCBudW1iZXJzIGRvIG5vdCBtYXRjaCAqLworCWlmIChzdHJuY21wKGRyaXZlMC0+aWQtPnNlcmlhbF9ubywgZHJpdmUxLT5pZC0+c2VyaWFsX25vLCAyMCkpCisJCXJldHVybjsKKworCS8qIE5vIHNlcmlhbCBudW1iZXIsIHRoYW5rZnVsbHkgdmVyeSByYXJlIGZvciBDRiAqLworCWlmIChkcml2ZTAtPmlkLT5zZXJpYWxfbm9bMF0gPT0gMCkKKwkJcmV0dXJuOworCisJLyogQXBwZWFycyB0byBiZSBhbiBJREUgZmxhc2ggYWRhcHRlciB3aXRoIGRlY29kZSBidWdzICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlLXByb2JlOiBpZ25vcmluZyB1bmRlY29kZWQgc2xhdmVcbiIpOworCisJZHJpdmUxLT5wcmVzZW50ID0gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3VuZGVjb2RlZF9zbGF2ZSk7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgb25seSBrbm93cyBob3cgdG8gbG9vayBmb3IgZHJpdmUgdW5pdHMgMCBhbmQgMQorICogb24gYW4gaW50ZXJmYWNlLCBzbyBhbnkgc2V0dGluZyBvZiBNQVhfRFJJVkVTID4gMiB3b24ndCB3b3JrIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHByb2JlX2h3aWYoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1bnNpZ25lZCBpbnQgdW5pdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnFkOworCisJaWYgKGh3aWYtPm5vcHJvYmUpCisJCXJldHVybjsKKworCWlmICgoaHdpZi0+Y2hpcHNldCAhPSBpZGVfNGRyaXZlcyB8fCAhaHdpZi0+bWF0ZSB8fCAhaHdpZi0+bWF0ZS0+cHJlc2VudCkgJiYKKwkgICAgKGlkZV9od2lmX3JlcXVlc3RfcmVnaW9ucyhod2lmKSkpIHsKKwkJdTE2IG1zZ291dCA9IDA7CisJCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKKwkJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisJCQlpZiAoZHJpdmUtPnByZXNlbnQpIHsKKwkJCQlkcml2ZS0+cHJlc2VudCA9IDA7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRVJST1IsIFBPUlRTIEFMUkVBRFkgSU4gVVNFXG4iLAorCQkJCQlkcml2ZS0+bmFtZSk7CisJCQkJbXNnb3V0ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIW1zZ291dCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBvcnRzIGFscmVhZHkgaW4gdXNlLCBza2lwcGluZyBwcm9iZVxuIiwKKwkJCQlod2lmLT5uYW1lKTsKKwkJcmV0dXJuOwkKKwl9CisKKwkvKgorCSAqIFdlIG11c3QgYWx3YXlzIGRpc2FibGUgSVJRLCBhcyBwcm9iZV9mb3JfZHJpdmUgd2lsbCBhc3NlcnQgSVJRLCBidXQKKwkgKiB3ZSdsbCBpbnN0YWxsIG91ciBJUlEgZHJpdmVyIG11Y2ggbGF0ZXIuLi4KKwkgKi8KKwlpcnFkID0gaHdpZi0+aXJxOworCWlmIChpcnFkKQorCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOworCisJbG9jYWxfaXJxX3NldChmbGFncyk7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCBvbiBzb21lIFBQQ3MgYW5kIGEgYnVuY2ggb2YgQklPUy1sZXNzIGVtYmVkZGVkCisJICogcGxhdGZvcm1zLiBUeXBpY2FsIGNhc2VzIGFyZToKKwkgKiAKKwkgKiAgLSBUaGUgZmlybXdhcmUgaGFyZCByZXNldCB0aGUgZGlzayBiZWZvcmUgYm9vdGluZyB0aGUga2VybmVsLAorCSAqICAgIHRoZSBkcml2ZSBpcyBzdGlsbCBkb2luZyBpdCdzIHBvd2Vyb24tcmVzZXQgc2VxdWVuY2UsIHRoYXQKKwkgKiAgICBjYW4gdGFrZSB1cCB0byAzMCBzZWNvbmRzCisJICogIC0gVGhlIGZpcm13YXJlIGRvZXMgbm90aGluZyAob3Igbm8gZmlybXdhcmUpLCB0aGUgZGV2aWNlIGlzCisJICogICAgc3RpbGwgaW4gUE9TVCBzdGF0ZSAoc2FtZSBhcyBhYm92ZSBhY3R1YWxseSkuCisJICogIC0gU29tZSBDRC9EVkQvV3JpdGVyIGNvbWJvIGRyaXZlcyB0ZW5kIHRvIGRyaXZlIHRoZSBidXMgZHVyaW5nCisJICogICAgdGhlaXIgcmVzZXQgc2VxdWVuY2UgZXZlbiB3aGVuIHRoZXkgYXJlIG5vbi1zZWxlY3RlZCBzbGF2ZQorCSAqICAgIGRldmljZXMsIHRodXMgcHJldmVudGluZyBkaXNjb3Zlcnkgb2YgdGhlIG1haW4gSEQKKwkgKiAgICAKKwkgKiAgRG9pbmcgdGhpcyB3YWl0LWZvci1idXN5IHNob3VsZCBub3QgaGFybSBhbnkgZXhpc3RpbmcgY29uZmlndXJhdGlvbgorCSAqICAoYXQgbGVhc3QgdGhpbmdzIHdvbid0IGJlIHdvcnNlIHRoYW4gd2hhdCBjdXJyZW50IGNvZGUgZG9lcywgdGhhdAorCSAqICBpcyBibGluZGx5IGdvICYgdGFsayB0byB0aGUgZHJpdmUpIGFuZCBmaXggc29tZSBpc3N1ZXMgbGlrZSB0aGUKKwkgKiAgYWJvdmUuCisJICogIAorCSAqICBCZW5ILgorCSAqLworCWlmICh3YWl0X2h3aWZfcmVhZHkoaHdpZikgPT0gLUVCVVNZKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhaXQgZm9yIHJlYWR5IGZhaWxlZCBiZWZvcmUgcHJvYmUgIVxuIiwgaHdpZi0+bmFtZSk7CisKKwkvKgorCSAqIFNlY29uZCBkcml2ZSBzaG91bGQgb25seSBleGlzdCBpZiBmaXJzdCBkcml2ZSB3YXMgZm91bmQsCisJICogYnV0IGEgbG90IG9mIGNkcm9tIGRyaXZlcyBhcmUgY29uZmlndXJlZCBhcyBzaW5nbGUgc2xhdmVzLgorCSAqLworCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKwkJZHJpdmUtPmRuID0gKGh3aWYtPmNoYW5uZWwgPyAyIDogMCkgKyB1bml0OworCQkodm9pZCkgcHJvYmVfZm9yX2RyaXZlKGRyaXZlKTsKKwkJaWYgKGRyaXZlLT5wcmVzZW50ICYmICFod2lmLT5wcmVzZW50KSB7CisJCQlod2lmLT5wcmVzZW50ID0gMTsKKwkJCWlmIChod2lmLT5jaGlwc2V0ICE9IGlkZV80ZHJpdmVzIHx8CisJCQkgICAgIWh3aWYtPm1hdGUgfHwgCisJCQkgICAgIWh3aWYtPm1hdGUtPnByZXNlbnQpIHsKKwkJCQlod2lmX3JlZ2lzdGVyKGh3aWYpOworCQkJfQorCQl9CisJfQorCWlmIChod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdICYmIGh3aWYtPnJlc2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKKwkJdTggc3RhdDsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXRcbiIsIGh3aWYtPm5hbWUpOworCQlod2lmLT5PVVRCKDEyLCBod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKTsKKwkJdWRlbGF5KDEwKTsKKwkJaHdpZi0+T1VUQig4LCBod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKTsKKwkJZG8geworCQkJbXNsZWVwKDUwKTsKKwkJCXN0YXQgPSBod2lmLT5JTkIoaHdpZi0+aW9fcG9ydHNbSURFX1NUQVRVU19PRkZTRVRdKTsKKwkJfSB3aGlsZSAoKHN0YXQgJiBCVVNZX1NUQVQpICYmIHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkvKgorCSAqIFVzZSBjYWNoZWQgSVJRIG51bWJlci4gSXQgbWlnaHQgYmUgKGFuZCBpcy4uLikgY2hhbmdlZCBieSBwcm9iZQorCSAqIGNvZGUgYWJvdmUKKwkgKi8KKwlpZiAoaXJxZCkKKwkJZW5hYmxlX2lycShpcnFkKTsKKworCWlmICghaHdpZi0+cHJlc2VudCkgeworCQlpZGVfaHdpZl9yZWxlYXNlX3JlZ2lvbnMoaHdpZik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7CisJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisKKwkJaWYgKGRyaXZlLT5wcmVzZW50KSB7CisJCQlpZiAoaHdpZi0+dHVuZXByb2MgIT0gTlVMTCAmJiAKKwkJCQlkcml2ZS0+YXV0b3R1bmUgPT0gSURFX1RVTkVfQVVUTykKKwkJCQkvKiBhdXRvLXR1bmUgUElPIG1vZGUgKi8KKwkJCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgMjU1KTsKKworCQkJaWYgKGRyaXZlLT5hdXRvdHVuZSAhPSBJREVfVFVORV9ERUZBVUxUICYmCisJCQkgICAgZHJpdmUtPmF1dG90dW5lICE9IElERV9UVU5FX0FVVE8pCisJCQkJY29udGludWU7CisKKwkJCWRyaXZlLT5uaWNlMSA9IDE7CisKKwkJCS8qCisJCQkgKiBNQUpPUiBIQUNLIEJBUkYgOi0vCisJCQkgKgorCQkJICogRklYTUU6IGNoaXBzZXRzIG93biB0aGlzIGNydWZ0IQorCQkJICovCisJCQkvKgorCQkJICogTW92ZSBoZXJlIHRvIHByZXZlbnQgbW9kdWxlIGxvYWRpbmcgY2xhc2hpbmcuCisJCQkgKi8KKwkvLwkJZHJpdmUtPmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCQkJaWYgKGh3aWYtPmlkZV9kbWFfY2hlY2spIHsKKwkJCQkvKgorCQkJCSAqIEZvcmNlIERNQWluZyBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hlY2suCisJCQkJICogU29tZSBjaGlwc2V0cyBhcHBlYXIgdG8gZG8gaW50ZXJlc3RpbmcKKwkJCQkgKiB0aGluZ3MsIGlmIG5vdCBjaGVja2VkIGFuZCBjbGVhcmVkLgorCQkJCSAqICAgUEFSQU5PSUEhISEKKwkJCQkgKi8KKwkJCQlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKyNpZmRlZiBDT05GSUdfSURFRE1BX09OTFlESVNLCisJCQkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKyNlbmRpZgorCQkJCQlod2lmLT5pZGVfZG1hX2NoZWNrKGRyaXZlKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBod2lmX2luaXQoaWRlX2h3aWZfdCAqaHdpZik7CisKK2ludCBwcm9iZV9od2lmX2luaXRfd2l0aF9maXh1cChpZGVfaHdpZl90ICpod2lmLCB2b2lkICgqZml4dXApKGlkZV9od2lmX3QgKmh3aWYpKQoreworCXByb2JlX2h3aWYoaHdpZik7CisKKwlpZiAoZml4dXApCisJCWZpeHVwKGh3aWYpOworCisJaWYgKCFod2lmX2luaXQoaHdpZikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIElERSBpbnRlcmZhY2VcbiIsCisJCQkJIGh3aWYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGh3aWYtPnByZXNlbnQpIHsKKwkJdTE2IHVuaXQgPSAwOworCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7CisJCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCQkJLyogRm9yIG5vdyBkb24ndCBhdHRhY2ggYWJzZW50IGRyaXZlcywgd2UgbWF5CisJCQkgICB3YW50IHRoZW0gb24gZGVmYXVsdCBvciBhIG5ldyAiZW1wdHkiIGNsYXNzCisJCQkgICBmb3IgaG90cGx1ZyByZXByb2JpbmcgPyAqLworCQkJaWYgKGRyaXZlLT5wcmVzZW50KSB7CisJCQkJYXRhX2F0dGFjaChkcml2ZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBwcm9iZV9od2lmX2luaXQoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlyZXR1cm4gcHJvYmVfaHdpZl9pbml0X3dpdGhfZml4dXAoaHdpZiwgTlVMTCk7Cit9CisKK0VYUE9SVF9TWU1CT0wocHJvYmVfaHdpZl9pbml0KTsKKworI2lmIE1BWF9IV0lGUyA+IDEKKy8qCisgKiBzYXZlX21hdGNoKCkgaXMgdXNlZCB0byBzaW1wbGlmeSBsb2dpYyBpbiBpbml0X2lycSgpIGJlbG93LgorICoKKyAqIEEgbG9vcGhvbGUgaGVyZSBpcyB0aGF0IHdlIG1heSBub3Qga25vdyBhYm91dCBhIHBhcnRpY3VsYXIKKyAqIGh3aWYncyBpcnEgdW50aWwgYWZ0ZXIgdGhhdCBod2lmIGlzIGFjdHVhbGx5IHByb2JlZC9pbml0aWFsaXplZC4uCisgKiBUaGlzIGNvdWxkIGJlIGEgcHJvYmxlbSBmb3IgdGhlIGNhc2Ugd2hlcmUgYW4gaHdpZiBpcyBvbiBhCisgKiBkdWFsIGludGVyZmFjZSB0aGF0IHJlcXVpcmVzIHNlcmlhbGl6YXRpb24gKGVnLiBjbWQ2NDApIGFuZCBhbm90aGVyCisgKiBod2lmIHVzaW5nIG9uZSBvZiB0aGUgc2FtZSBpcnFzIGlzIGluaXRpYWxpemVkIGJlZm9yZWhhbmQuCisgKgorICogVGhpcyByb3V0aW5lIGRldGVjdHMgYW5kIHJlcG9ydHMgc3VjaCBzaXR1YXRpb25zLCBidXQgZG9lcyBub3QgZml4IHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkIHNhdmVfbWF0Y2goaWRlX2h3aWZfdCAqaHdpZiwgaWRlX2h3aWZfdCAqbmV3LCBpZGVfaHdpZl90ICoqbWF0Y2gpCit7CisJaWRlX2h3aWZfdCAqbSA9ICptYXRjaDsKKworCWlmIChtICYmIG0tPmh3Z3JvdXAgJiYgbS0+aHdncm91cCAhPSBuZXctPmh3Z3JvdXApIHsKKwkJaWYgKCFuZXctPmh3Z3JvdXApCisJCQlyZXR1cm47CisJCXByaW50aygiJXM6IHBvdGVudGlhbCBpcnEgcHJvYmxlbSB3aXRoICVzIGFuZCAlc1xuIiwKKwkJCWh3aWYtPm5hbWUsIG5ldy0+bmFtZSwgbS0+bmFtZSk7CisJfQorCWlmICghbSB8fCBtLT5pcnEgIT0gaHdpZi0+aXJxKSAvKiBkb24ndCB1bmRvIGEgcHJpb3IgcGVyZmVjdCBtYXRjaCAqLworCQkqbWF0Y2ggPSBuZXc7Cit9CisjZW5kaWYgLyogTUFYX0hXSUZTID4gMSAqLworCisvKgorICogaW5pdCByZXF1ZXN0IHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgaWRlX2luaXRfcXVldWUoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJlcXVlc3RfcXVldWVfdCAqcTsKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaW50IG1heF9zZWN0b3JzID0gMjU2OworCWludCBtYXhfc2dfZW50cmllcyA9IFBSRF9FTlRSSUVTOworCisJLyoKKwkgKglPdXIgZGVmYXVsdCBzZXQgdXAgYXNzdW1lcyB0aGUgbm9ybWFsIElERSBjYXNlLAorCSAqCXRoYXQgaXMgNjRLIHNlZ21lbnRpbmcsIHN0YW5kYXJkIFBSRCBzZXR1cAorCSAqCWFuZCBMQkEyOC4gU29tZSBkcml2ZXJzIHRoZW4gaW1wb3NlIHRoZWlyIG93bgorCSAqCWxpbWl0cyBhbmQgTEJBNDggd2UgY291bGQgcmFpc2UgaXQgYnV0IGFzIHlldAorCSAqCWRvIG5vdC4KKwkgKi8KKwkgCisJcSA9IGJsa19pbml0X3F1ZXVlKGRvX2lkZV9yZXF1ZXN0LCAmaWRlX2xvY2spOworCWlmICghcSkKKwkJcmV0dXJuIDE7CisKKwlxLT5xdWV1ZWRhdGEgPSBkcml2ZTsKKwlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShxLCAweGZmZmYpOworCisJaWYgKCFod2lmLT5ycXNpemUpIHsKKwkJaWYgKGh3aWYtPm5vX2xiYTQ4IHx8IGh3aWYtPm5vX2xiYTQ4X2RtYSkKKwkJCWh3aWYtPnJxc2l6ZSA9IDI1NjsKKwkJZWxzZQorCQkJaHdpZi0+cnFzaXplID0gNjU1MzY7CisJfQorCWlmIChod2lmLT5ycXNpemUgPCBtYXhfc2VjdG9ycykKKwkJbWF4X3NlY3RvcnMgPSBod2lmLT5ycXNpemU7CisJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHEsIG1heF9zZWN0b3JzKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwkvKiBXaGVuIHdlIGhhdmUgYW4gSU9NTVUsIHdlIG1heSBoYXZlIGEgcHJvYmxlbSB3aGVyZSBwY2lfbWFwX3NnKCkKKwkgKiBjcmVhdGVzIHNlZ21lbnRzIHRoYXQgZG9uJ3QgY29tcGxldGVseSBtYXRjaCBvdXIgYm91bmRhcnkKKwkgKiByZXF1aXJlbWVudHMgYW5kIHRodXMgbmVlZCB0byBiZSBicm9rZW4gdXAgYWdhaW4uIEJlY2F1c2UgaXQKKwkgKiBkb2Vzbid0IGFsaWduIHByb3Blcmx5IGVpdGhlciwgd2UgbWF5IGFjdHVhbGx5IGhhdmUgdG8gYnJlYWsgdXAKKwkgKiB0byBtb3JlIHNlZ21lbnRzIHRoYW4gd2hhdCB3YXMgd2UgZ290IGluIHRoZSBmaXJzdCBwbGFjZSwgYSBtYXgKKwkgKiB3b3JzdCBjYXNlIGlzIHR3aWNlIGFzIG1hbnkuCisJICogVGhpcyB3aWxsIGJlIGZpeGVkIG9uY2Ugd2UgdGVhY2ggcGNpX21hcF9zZygpIGFib3V0IG91ciBib3VuZGFyeQorCSAqIHJlcXVpcmVtZW50cywgaG9wZWZ1bGx5IHNvb24uICpGSVhNRSoKKwkgKi8KKwlpZiAoIVBDSV9ETUFfQlVTX0lTX1BIWVMpCisJCW1heF9zZ19lbnRyaWVzID4+PSAxOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgbWF4X3NnX2VudHJpZXMpOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBtYXhfc2dfZW50cmllcyk7CisKKwkvKiBhc3NpZ24gZHJpdmUgcXVldWUgKi8KKwlkcml2ZS0+cXVldWUgPSBxOworCisJLyogbmVlZHMgZHJpdmUtPnF1ZXVlIHRvIGJlIHNldCAqLworCWlkZV90b2dnbGVfYm91bmNlKGRyaXZlLCAxKTsKKworCS8qIGVuYWJsZSBsZWQgYWN0aXZpdHkgZm9yIGRpc2sgZHJpdmVzIG9ubHkgKi8KKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrICYmIGh3aWYtPmxlZF9hY3QpCisJCWJsa19xdWV1ZV9hY3Rpdml0eV9mbihxLCBod2lmLT5sZWRfYWN0LCBkcml2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHVwIHRoZSBpcnEgZm9yIGFuIGlkZSBpbnRlcmZhY2UsIGFuZCBjcmVhdGVzIGEgbmV3CisgKiBod2dyb3VwIGZvciB0aGUgaXJxL2h3aWYgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBhc3NpZ25lZC4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb2RlIGlzIGZvciBjb3JyZWN0bHkgZGV0ZWN0aW5nL2hhbmRsaW5nIGlycSBzaGFyaW5nCisgKiBhbmQgaXJxIHNlcmlhbGl6YXRpb24gc2l0dWF0aW9ucy4gIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleCBiZWNhdXNlCisgKiBpdCBoYW5kbGVzIHN0YXRpYyBhcyB3ZWxsIGFzIGR5bmFtaWMgKFBDTUNJQSkgSURFIGludGVyZmFjZXMuCisgKgorICogVGhlIFNBX0lOVEVSUlVQVCBpbiBzYV9mbGFncyBtZWFucyBpZGVfaW50cigpIGlzIGFsd2F5cyBlbnRlcmVkIHdpdGgKKyAqIGludGVycnVwdHMgY29tcGxldGVseSBkaXNhYmxlZC4gIFRoaXMgY2FuIGJlIGJhZCBmb3IgaW50ZXJydXB0IGxhdGVuY3ksCisgKiBidXQgYW55dGhpbmcgZWxzZSBoYXMgbGVkIHRvIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMuICBXZSByZS1lbmFibGUKKyAqIGludGVycnVwdHMgYXMgbXVjaCBhcyB3ZSBjYW4gc2FmZWx5IGRvIGluIG1vc3QgcGxhY2VzLgorICovCitzdGF0aWMgaW50IGluaXRfaXJxIChpZGVfaHdpZl90ICpod2lmKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwOworCWlkZV9od2lmX3QgKm1hdGNoID0gTlVMTDsKKworCisJQlVHX09OKGluX2ludGVycnVwdCgpKTsKKwlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsJCisJZG93bigmaWRlX2NmZ19zZW0pOworCWh3aWYtPmh3Z3JvdXAgPSBOVUxMOworI2lmIE1BWF9IV0lGUyA+IDEKKwkvKgorCSAqIEdyb3VwIHVwIHdpdGggYW55IG90aGVyIGh3aWZzIHRoYXQgc2hhcmUgb3VyIGlycShzKS4KKwkgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfSFdJRlM7IGluZGV4KyspIHsKKwkJaWRlX2h3aWZfdCAqaCA9ICZpZGVfaHdpZnNbaW5kZXhdOworCQlpZiAoaC0+aHdncm91cCkgeyAgLyogc2NhbiBvbmx5IGluaXRpYWxpemVkIGh3aWYncyAqLworCQkJaWYgKGh3aWYtPmlycSA9PSBoLT5pcnEpIHsKKwkJCQlod2lmLT5zaGFyaW5nX2lycSA9IGgtPnNoYXJpbmdfaXJxID0gMTsKKwkJCQlpZiAoaHdpZi0+Y2hpcHNldCAhPSBpZGVfcGNpIHx8CisJCQkJICAgIGgtPmNoaXBzZXQgIT0gaWRlX3BjaSkgeworCQkJCQlzYXZlX21hdGNoKGh3aWYsIGgsICZtYXRjaCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGh3aWYtPnNlcmlhbGl6ZWQpIHsKKwkJCQlpZiAoaHdpZi0+bWF0ZSAmJiBod2lmLT5tYXRlLT5pcnEgPT0gaC0+aXJxKQorCQkJCQlzYXZlX21hdGNoKGh3aWYsIGgsICZtYXRjaCk7CisJCQl9CisJCQlpZiAoaC0+c2VyaWFsaXplZCkgeworCQkJCWlmIChoLT5tYXRlICYmIGh3aWYtPmlycSA9PSBoLT5tYXRlLT5pcnEpCisJCQkJCXNhdmVfbWF0Y2goaHdpZiwgaCwgJm1hdGNoKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBNQVhfSFdJRlMgPiAxICovCisJLyoKKwkgKiBJZiB3ZSBhcmUgc3RpbGwgd2l0aG91dCBhIGh3Z3JvdXAsIHRoZW4gZm9ybSBhIG5ldyBvbmUKKwkgKi8KKwlpZiAobWF0Y2gpIHsKKwkJaHdncm91cCA9IG1hdGNoLT5od2dyb3VwOworCQlod2lmLT5od2dyb3VwID0gaHdncm91cDsKKwkJLyoKKwkJICogTGluayB1cyBpbnRvIHRoZSBod2dyb3VwLgorCQkgKiBUaGlzIG11c3QgYmUgZG9uZSBlYXJseSwgZG8gZW5zdXJlIHRoYXQgdW5leHBlY3RlZF9pbnRyCisJCSAqIGNhbiBmaW5kIHRoZSBod2lmIGFuZCBwcmV2ZW50IGlycSBzdG9ybXMuCisJCSAqIE5vIGRyaXZlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIG5ldyBod2lmLCBjaG9vc2VfZHJpdmUKKwkJICogY2FuJ3QgZG8gYW55dGhpbmcgc3R1cGlkICh5ZXQpLgorCQkgKiBBZGQgb3Vyc2VsZiBhcyB0aGUgMm5kIGVudHJ5IHRvIHRoZSBod2dyb3VwLT5od2lmCisJCSAqIGxpbmtlZCBsaXN0LCB0aGUgZmlyc3QgZW50cnkgaXMgdGhlIGh3aWYgdGhhdCBvd25zCisJCSAqIGh3Z3JvdXAtPmhhbmRsZXIgLSBkbyBub3QgY2hhbmdlIHRoYXQuCisJCSAqLworCQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJCWh3aWYtPm5leHQgPSBod2dyb3VwLT5od2lmLT5uZXh0OworCQlod2dyb3VwLT5od2lmLT5uZXh0ID0gaHdpZjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJfSBlbHNlIHsKKwkJaHdncm91cCA9IGttYWxsb2Moc2l6ZW9mKGlkZV9od2dyb3VwX3QpLEdGUF9LRVJORUwpOworCQlpZiAoIWh3Z3JvdXApCisJICAgICAgIAkJZ290byBvdXRfdXA7CisKKwkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7CisKKwkJbWVtc2V0KGh3Z3JvdXAsIDAsIHNpemVvZihpZGVfaHdncm91cF90KSk7CisJCWh3Z3JvdXAtPmh3aWYgICAgID0gaHdpZi0+bmV4dCA9IGh3aWY7CisJCWh3Z3JvdXAtPnJxICAgICAgID0gTlVMTDsKKwkJaHdncm91cC0+aGFuZGxlciAgPSBOVUxMOworCQlod2dyb3VwLT5kcml2ZSAgICA9IE5VTEw7CisJCWh3Z3JvdXAtPmJ1c3kgICAgID0gMDsKKwkJaW5pdF90aW1lcigmaHdncm91cC0+dGltZXIpOworCQlod2dyb3VwLT50aW1lci5mdW5jdGlvbiA9ICZpZGVfdGltZXJfZXhwaXJ5OworCQlod2dyb3VwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGh3Z3JvdXA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgaXJxLCBpZiBub3QgYWxyZWFkeSBvYnRhaW5lZCBmb3IgYW5vdGhlciBod2lmCisJICovCisJaWYgKCFtYXRjaCB8fCBtYXRjaC0+aXJxICE9IGh3aWYtPmlycSkgeworCQlpbnQgc2EgPSBTQV9JTlRFUlJVUFQ7CisjaWYgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChDT05GSUdfQVBVUykKKwkJc2EgPSBTQV9TSElSUTsKKyNlbmRpZiAvKiBfX21jNjgwMDBfXyB8fCBDT05GSUdfQVBVUyAqLworCisJCWlmIChJREVfQ0hJUFNFVF9JU19QQ0koaHdpZi0+Y2hpcHNldCkpIHsKKwkJCXNhID0gU0FfU0hJUlE7CisjaWZuZGVmIENPTkZJR19JREVQQ0lfU0hBUkVfSVJRCisJCQlzYSB8PSBTQV9JTlRFUlJVUFQ7CisjZW5kaWYgLyogQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgKi8KKwkJfQorCisJCWlmIChod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKQorCQkJLyogY2xlYXIgbklFTiAqLworCQkJaHdpZi0+T1VUQigweDA4LCBod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdKTsKKworCQlpZiAocmVxdWVzdF9pcnEoaHdpZi0+aXJxLCZpZGVfaW50cixzYSxod2lmLT5uYW1lLGh3Z3JvdXApKQorCSAgICAgICAJCWdvdG8gb3V0X3VubGluazsKKwl9CisKKwkvKgorCSAqIEZvciBhbnkgcHJlc2VudCBkcml2ZToKKwkgKiAtIGFsbG9jYXRlIHRoZSBibG9jayBkZXZpY2UgcXVldWUKKwkgKiAtIGxpbmsgZHJpdmUgaW50byB0aGUgaHdncm91cAorCSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9EUklWRVM7ICsraW5kZXgpIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpbmRleF07CisJCWlmICghZHJpdmUtPnByZXNlbnQpCisJCQljb250aW51ZTsKKwkJaWYgKGlkZV9pbml0X3F1ZXVlKGRyaXZlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZGU6IGZhaWxlZCB0byBpbml0ICVzXG4iLGRyaXZlLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwkJaWYgKCFod2dyb3VwLT5kcml2ZSkgeworCQkJLyogZmlyc3QgZHJpdmUgZm9yIGh3Z3JvdXAuICovCisJCQlkcml2ZS0+bmV4dCA9IGRyaXZlOworCQkJaHdncm91cC0+ZHJpdmUgPSBkcml2ZTsKKwkJCWh3Z3JvdXAtPmh3aWYgPSBIV0lGKGh3Z3JvdXAtPmRyaXZlKTsKKwkJfSBlbHNlIHsKKwkJCWRyaXZlLT5uZXh0ID0gaHdncm91cC0+ZHJpdmUtPm5leHQ7CisJCQlod2dyb3VwLT5kcml2ZS0+bmV4dCA9IGRyaXZlOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCX0KKworI2lmICFkZWZpbmVkKF9fbWM2ODAwMF9fKSAmJiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgIWRlZmluZWQoX19zcGFyY19fKQorCXByaW50aygiJXMgYXQgMHglMDNseC0weCUwM2x4LDB4JTAzbHggb24gaXJxICVkIiwgaHdpZi0+bmFtZSwKKwkJaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSwKKwkJaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSs3LAorCQlod2lmLT5pb19wb3J0c1tJREVfQ09OVFJPTF9PRkZTRVRdLCBod2lmLT5pcnEpOworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJcHJpbnRrKCIlcyBhdCAweCUwM2x4LTB4JTAzbHgsMHglMDNseCBvbiBpcnEgJXMiLCBod2lmLT5uYW1lLAorCQlod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdLAorCQlod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdKzcsCisJCWh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0sIF9faXJxX2l0b2EoaHdpZi0+aXJxKSk7CisjZWxzZQorCXByaW50aygiJXMgYXQgMHglMDhseCBvbiBpcnEgJWQiLCBod2lmLT5uYW1lLAorCQlod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdLCBod2lmLT5pcnEpOworI2VuZGlmIC8qIF9fbWM2ODAwMF9fICYmIENPTkZJR19BUFVTICovCisJaWYgKG1hdGNoKQorCQlwcmludGsoIiAoJXNlZCB3aXRoICVzKSIsCisJCQlod2lmLT5zaGFyaW5nX2lycSA/ICJzaGFyIiA6ICJzZXJpYWxpeiIsIG1hdGNoLT5uYW1lKTsKKwlwcmludGsoIlxuIik7CisJdXAoJmlkZV9jZmdfc2VtKTsKKwlyZXR1cm4gMDsKK291dF91bmxpbms6CisJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCWlmIChod2lmLT5uZXh0ID09IGh3aWYpIHsKKwkJQlVHX09OKG1hdGNoKTsKKwkJQlVHX09OKGh3Z3JvdXAtPmh3aWYgIT0gaHdpZik7CisJCWtmcmVlKGh3Z3JvdXApOworCX0gZWxzZSB7CisJCWlkZV9od2lmX3QgKmc7CisJCWcgPSBod2dyb3VwLT5od2lmOworCQl3aGlsZSAoZy0+bmV4dCAhPSBod2lmKQorCQkJZyA9IGctPm5leHQ7CisJCWctPm5leHQgPSBod2lmLT5uZXh0OworCQlpZiAoaHdncm91cC0+aHdpZiA9PSBod2lmKSB7CisJCQkvKiBJbXBvc3NpYmxlLiAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJEdWguIFVuaW5pdGlhbGl6ZWQgaHdpZiBsaXN0ZWQgYXMgYWN0aXZlIGh3aWYuXG4iKTsKKwkJCWh3Z3JvdXAtPmh3aWYgPSBnOworCQl9CisJCUJVR19PTihod2dyb3VwLT5od2lmID09IGh3aWYpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKK291dF91cDoKKwl1cCgmaWRlX2NmZ19zZW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGF0YV9sb2NrKGRldl90IGRldiwgdm9pZCAqZGF0YSkKK3sKKwkvKiBGSVhNRTogd2Ugd2FudCB0byBwaW4gaHdpZiBkb3duICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqYXRhX3Byb2JlKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkYXRhOworCWludCB1bml0ID0gKnBhcnQgPj4gUEFSVE5fQklUUzsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCWlmICghZHJpdmUtPnByZXNlbnQpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKwkJcmVxdWVzdF9tb2R1bGUoImlkZS1kaXNrIik7CisJaWYgKGRyaXZlLT5zY3NpKQorCQlyZXF1ZXN0X21vZHVsZSgiaWRlLXNjc2kiKTsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpCisJCXJlcXVlc3RfbW9kdWxlKCJpZGUtY2QiKTsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlKQorCQlyZXF1ZXN0X21vZHVsZSgiaWRlLXRhcGUiKTsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9mbG9wcHkpCisJCXJlcXVlc3RfbW9kdWxlKCJpZGUtZmxvcHB5Iik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpleGFjdF9tYXRjaChkZXZfdCBkZXYsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqcCA9IGRhdGE7CisJKnBhcnQgJj0gKDEgPDwgUEFSVE5fQklUUykgLSAxOworCXJldHVybiAmcC0+a29iajsKK30KKworc3RhdGljIGludCBleGFjdF9sb2NrKGRldl90IGRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqcCA9IGRhdGE7CisKKwlpZiAoIWdldF9kaXNrKHApKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaWRlX3JlZ2lzdGVyX3JlZ2lvbihzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlibGtfcmVnaXN0ZXJfcmVnaW9uKE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciksCisJCQkgICAgZGlzay0+bWlub3JzLCBOVUxMLCBleGFjdF9tYXRjaCwgZXhhY3RfbG9jaywgZGlzayk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9yZWdpc3Rlcl9yZWdpb24pOworCit2b2lkIGlkZV91bnJlZ2lzdGVyX3JlZ2lvbihzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSwKKwkJCSAgICAgIGRpc2stPm1pbm9ycyk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV91bnJlZ2lzdGVyX3JlZ2lvbik7CisKK3ZvaWQgaWRlX2luaXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwl1bnNpZ25lZCBpbnQgdW5pdCA9IChkcml2ZS0+c2VsZWN0LmFsbCA+PiA0KSAmIDE7CisKKwlkaXNrLT5tYWpvciA9IGh3aWYtPm1ham9yOworCWRpc2stPmZpcnN0X21pbm9yID0gdW5pdCA8PCBQQVJUTl9CSVRTOworCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAiaGQlYyIsICdhJyArIGh3aWYtPmluZGV4ICogTUFYX0RSSVZFUyArIHVuaXQpOworCWRpc2stPnF1ZXVlID0gZHJpdmUtPnF1ZXVlOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfaW5pdF9kaXNrKTsKKworc3RhdGljIHZvaWQgZHJpdmVfcmVsZWFzZV9kZXYgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBjb250YWluZXJfb2YoZGV2LCBpZGVfZHJpdmVfdCwgZ2VuZGV2KTsKKworCXVwKCZkcml2ZS0+Z2VuZGV2X3JlbF9zZW0pOworfQorCisvKgorICogaW5pdF9nZW5kaXNrKCkgKGFzIG9wcG9zZWQgdG8gaWRlX2dlbmluaXQpIGlzIGNhbGxlZCBmb3IgZWFjaCBtYWpvciBkZXZpY2UsCisgKiBhZnRlciBwcm9iaW5nIGZvciBkcml2ZXMsIHRvIGFsbG9jYXRlIHBhcnRpdGlvbiB0YWJsZXMgYW5kIG90aGVyIGRhdGEKKyAqIHN0cnVjdHVyZXMgbmVlZGVkIGZvciB0aGUgcm91dGluZXMgaW4gZ2VuaGQuYy4gIGlkZV9nZW5pbml0KCkgZ2V0cyBjYWxsZWQKKyAqIHNvbWV3aGF0IGxhdGVyLCBkdXJpbmcgdGhlIHBhcnRpdGlvbiBjaGVjay4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9nZW5kaXNrIChpZGVfaHdpZl90ICpod2lmKQoreworCXVuc2lnbmVkIGludCB1bml0OworCisJZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgeworCQlpZGVfZHJpdmVfdCAqIGRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKwkJaWRlX2FkZF9nZW5lcmljX3NldHRpbmdzKGRyaXZlKTsKKwkJc25wcmludGYoZHJpdmUtPmdlbmRldi5idXNfaWQsQlVTX0lEX1NJWkUsIiV1LiV1IiwKKwkJCSBod2lmLT5pbmRleCx1bml0KTsKKwkJZHJpdmUtPmdlbmRldi5wYXJlbnQgPSAmaHdpZi0+Z2VuZGV2OworCQlkcml2ZS0+Z2VuZGV2LmJ1cyA9ICZpZGVfYnVzX3R5cGU7CisJCWRyaXZlLT5nZW5kZXYuZHJpdmVyX2RhdGEgPSBkcml2ZTsKKwkJZHJpdmUtPmdlbmRldi5yZWxlYXNlID0gZHJpdmVfcmVsZWFzZV9kZXY7CisJCWlmIChkcml2ZS0+cHJlc2VudCkgeworCQkJZGV2aWNlX3JlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKKwkJCXNwcmludGYoZHJpdmUtPmRldmZzX25hbWUsICJpZGUvaG9zdCVkL2J1cyVkL3RhcmdldCVkL2x1biVkIiwKKwkJCQkoaHdpZi0+Y2hhbm5lbCAmJiBod2lmLT5tYXRlKSA/CisJCQkJaHdpZi0+bWF0ZS0+aW5kZXggOiBod2lmLT5pbmRleCwKKwkJCQlod2lmLT5jaGFubmVsLCB1bml0LCBkcml2ZS0+bHVuKTsKKwkJfQorCX0KKwlibGtfcmVnaXN0ZXJfcmVnaW9uKE1LREVWKGh3aWYtPm1ham9yLCAwKSwgTUFYX0RSSVZFUyA8PCBQQVJUTl9CSVRTLAorCQkJVEhJU19NT0RVTEUsIGF0YV9wcm9iZSwgYXRhX2xvY2ssIGh3aWYpOworfQorCitzdGF0aWMgaW50IGh3aWZfaW5pdChpZGVfaHdpZl90ICpod2lmKQoreworCWludCBvbGRfaXJxOworCisJLyogUmV0dXJuIHN1Y2Nlc3MgaWYgbm8gZGV2aWNlIGlzIGNvbm5lY3RlZCAqLworCWlmICghaHdpZi0+cHJlc2VudCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWh3aWYtPmlycSkgeworCQlpZiAoIShod2lmLT5pcnEgPSBpZGVfZGVmYXVsdF9pcnEoaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSkpKQorCQl7CisJCQlwcmludGsoIiVzOiBESVNBQkxFRCwgTk8gSVJRXG4iLCBod2lmLT5uYW1lKTsKKwkJCXJldHVybiAoaHdpZi0+cHJlc2VudCA9IDApOworCQl9CisJfQorI2lmZGVmIENPTkZJR19CTEtfREVWX0hECisJaWYgKGh3aWYtPmlycSA9PSBIRF9JUlEgJiYgaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSAhPSBIRF9EQVRBKSB7CisJCXByaW50aygiJXM6IENBTk5PVCBTSEFSRSBJUlEgV0lUSCBPTEQgIgorCQkJIkhBUkRESVNLIERSSVZFUiAoaGQuYylcbiIsIGh3aWYtPm5hbWUpOworCQlyZXR1cm4gKGh3aWYtPnByZXNlbnQgPSAwKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSEQgKi8KKworCS8qIHdlIHNldCBpdCBiYWNrIHRvIDEgaWYgYWxsIGlzIG9rIGJlbG93ICovCQorCWh3aWYtPnByZXNlbnQgPSAwOworCisJaWYgKHJlZ2lzdGVyX2Jsa2Rldihod2lmLT5tYWpvciwgaHdpZi0+bmFtZSkpCisJCXJldHVybiAwOworCisJaWYgKCFod2lmLT5zZ19tYXhfbmVudHMpCisJCWh3aWYtPnNnX21heF9uZW50cyA9IFBSRF9FTlRSSUVTOworCisJaHdpZi0+c2dfdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKmh3aWYtPnNnX21heF9uZW50cywKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFod2lmLT5zZ190YWJsZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgU0cgdGFibGUuXG4iLCBod2lmLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChpbml0X2lycShod2lmKSA9PSAwKQorCQlnb3RvIGRvbmU7CisKKwlvbGRfaXJxID0gaHdpZi0+aXJxOworCS8qCisJICoJSXQgZmFpbGVkIHRvIGluaXRpYWxpc2UuIEZpbmQgdGhlIGRlZmF1bHQgSVJRIGZvciAKKwkgKgl0aGlzIHBvcnQgYW5kIHRyeSB0aGF0LgorCSAqLworCWlmICghKGh3aWYtPmlycSA9IGlkZV9kZWZhdWx0X2lycShod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdKSkpIHsKKwkJcHJpbnRrKCIlczogRGlzYWJsZWQgdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLAorCQkJaHdpZi0+bmFtZSwgb2xkX2lycSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaW5pdF9pcnEoaHdpZikpIHsKKwkJcHJpbnRrKCIlczogcHJvYmVkIElSUSAlZCBhbmQgZGVmYXVsdCBJUlEgJWQgZmFpbGVkLlxuIiwKKwkJCWh3aWYtPm5hbWUsIG9sZF9pcnEsIGh3aWYtPmlycSk7CisJCWdvdG8gb3V0OworCX0KKwlwcmludGsoIiVzOiBwcm9iZWQgSVJRICVkIGZhaWxlZCwgdXNpbmcgZGVmYXVsdC5cbiIsCisJCWh3aWYtPm5hbWUsIGh3aWYtPmlycSk7CisKK2RvbmU6CisJaW5pdF9nZW5kaXNrKGh3aWYpOworCWh3aWYtPnByZXNlbnQgPSAxOwkvKiBzdWNjZXNzICovCisJcmV0dXJuIDE7CisKK291dDoKKwl1bnJlZ2lzdGVyX2Jsa2Rldihod2lmLT5tYWpvciwgaHdpZi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZGVwcm9iZV9pbml0ICh2b2lkKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcHJvYmVbTUFYX0hXSUZTXTsKKworCW1lbXNldChwcm9iZSwgMCwgTUFYX0hXSUZTICogc2l6ZW9mKGludCkpOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkKKwkJcHJvYmVbaW5kZXhdID0gIWlkZV9od2lmc1tpbmRleF0ucHJlc2VudDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkKKwkJaWYgKHByb2JlW2luZGV4XSkKKwkJCXByb2JlX2h3aWYoJmlkZV9od2lmc1tpbmRleF0pOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkKKwkJaWYgKHByb2JlW2luZGV4XSkKKwkJCWh3aWZfaW5pdCgmaWRlX2h3aWZzW2luZGV4XSk7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0hXSUZTOyArK2luZGV4KSB7CisJCWlmIChwcm9iZVtpbmRleF0pIHsKKwkJCWlkZV9od2lmX3QgKmh3aWYgPSAmaWRlX2h3aWZzW2luZGV4XTsKKwkJCWludCB1bml0OworCQkJaWYgKCFod2lmLT5wcmVzZW50KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3Vua25vd24gfHwgaHdpZi0+Y2hpcHNldCA9PSBpZGVfZm9yY2VkKQorCQkJCWh3aWYtPmNoaXBzZXQgPSBpZGVfZ2VuZXJpYzsKKwkJCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpCisJCQkJaWYgKGh3aWYtPmRyaXZlc1t1bml0XS5wcmVzZW50KQorCQkJCQlhdGFfYXR0YWNoKCZod2lmLT5kcml2ZXNbdW5pdF0pOworCQl9CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVwcm9iZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZmY1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC0wLDAgKzEsNTIxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMJVmVyc2lvbiAxLjA1CU1hciAwNSwgMjAwMworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OAlNYXJrIExvcmQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJCVJlZCBIYXQgPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgL3Byb2MvaWRlLyBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uLgorICoKKyAqIERyaXZlL0RyaXZlciBzZXR0aW5ncyBjYW4gYmUgcmV0cmlldmVkIGJ5IHJlYWRpbmcgdGhlIGRyaXZlJ3MKKyAqICJzZXR0aW5ncyIgZmlsZXMuICBlLmcuICAgICJjYXQgL3Byb2MvaWRlMC9oZGEvc2V0dGluZ3MiCisgKiBUbyB3cml0ZSBhIG5ldyB2YWx1ZSAidmFsIiBpbnRvIGEgc3BlY2lmaWMgc2V0dGluZyAibmFtZSIsIHVzZToKKyAqICAgZWNobyAibmFtZTp2YWwiID4vcHJvYy9pZGUvaWRlMC9oZGEvc2V0dGluZ3MKKyAqCisgKiBBbHNvIHVzZWZ1bCwgImNhdCAvcHJvYy9pZGUwL2hkYS9baWRlbnRpZnksIHNtYXJ0X3ZhbHVlcywKKyAqIHNtYXJ0X3RocmVzaG9sZHMsIGNhcGFiaWxpdGllc10iIHdpbGwgaXNzdWUgYW4gSURFTlRJRlkgLworICogUEFDS0VUX0lERU5USUZZIC8gU01BUlRfUkVBRF9WQUxVRVMgLyBTTUFSVF9SRUFEX1RIUkVTSE9MRFMgLworICogU0VOU0UgQ0FQQUJJTElUSUVTIGNvbW1hbmQgdG8gL2Rldi9oZGEsIGFuZCB0aGVuIGR1bXAgb3V0IHRoZQorICogcmV0dXJuZWQgZGF0YSBhcyAyNTYgMTYtYml0IHdvcmRzLiAgVGhlICJoZHBhcm0iIHV0aWxpdHkgd2lsbAorICogYmUgdXBkYXRlZCBzb21lZGF5IHNvb24gdG8gdXNlIHRoaXMgbWVjaGFuaXNtLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX2ltb2RlbAorCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKikgZGF0YTsKKwlpbnQJCWxlbjsKKwljb25zdCBjaGFyCSpuYW1lOworCisJLyoKKwkgKiBOZWl0aGVyIGlkZV91bmtub3duIG5vciBpZGVfZm9yY2VkIHNob3VsZCBiZSBzZXQgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlzd2l0Y2ggKGh3aWYtPmNoaXBzZXQpIHsKKwkJY2FzZSBpZGVfZ2VuZXJpYzoJbmFtZSA9ICJnZW5lcmljIjsJYnJlYWs7CisJCWNhc2UgaWRlX3BjaToJCW5hbWUgPSAicGNpIjsJCWJyZWFrOworCQljYXNlIGlkZV9jbWQ2NDA6CW5hbWUgPSAiY21kNjQwIjsJYnJlYWs7CisJCWNhc2UgaWRlX2R0YzIyNzg6CW5hbWUgPSAiZHRjMjI3OCI7CWJyZWFrOworCQljYXNlIGlkZV9hbGkxNHh4OgluYW1lID0gImFsaTE0eHgiOwlicmVhazsKKwkJY2FzZSBpZGVfcWQ2NXh4OgluYW1lID0gInFkNjV4eCI7CWJyZWFrOworCQljYXNlIGlkZV91bWM4NjcyOgluYW1lID0gInVtYzg2NzIiOwlicmVhazsKKwkJY2FzZSBpZGVfaHQ2NTYwYjoJbmFtZSA9ICJodDY1NjBiIjsJYnJlYWs7CisJCWNhc2UgaWRlX3J6MTAwMDoJbmFtZSA9ICJyejEwMDAiOwlicmVhazsKKwkJY2FzZSBpZGVfdHJtMjkwOgluYW1lID0gInRybTI5MCI7CWJyZWFrOworCQljYXNlIGlkZV9jbWQ2NDY6CW5hbWUgPSAiY21kNjQ2IjsJYnJlYWs7CisJCWNhc2UgaWRlX2N5ODJjNjkzOgluYW1lID0gImN5ODJjNjkzIjsJYnJlYWs7CisJCWNhc2UgaWRlXzRkcml2ZXM6CW5hbWUgPSAiNGRyaXZlcyI7CWJyZWFrOworCQljYXNlIGlkZV9wbWFjOgkJbmFtZSA9ICJtYWMtaW8iOwlicmVhazsKKwkJZGVmYXVsdDoJCW5hbWUgPSAiKHVua25vd24pIjsJYnJlYWs7CisJfQorCWxlbiA9IHNwcmludGYocGFnZSwgIiVzXG4iLCBuYW1lKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX21hdGUKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopIGRhdGE7CisJaW50CQlsZW47CisKKwlpZiAoaHdpZiAmJiBod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPnByZXNlbnQpCisJCWxlbiA9IHNwcmludGYocGFnZSwgIiVzXG4iLCBod2lmLT5tYXRlLT5uYW1lKTsKKwllbHNlCisJCWxlbiA9IHNwcmludGYocGFnZSwgIihub25lKVxuIik7CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVfcmVhZF9jaGFubmVsCisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9od2lmX3QJKmh3aWYgPSAoaWRlX2h3aWZfdCAqKSBkYXRhOworCWludAkJbGVuOworCisJcGFnZVswXSA9IGh3aWYtPmNoYW5uZWwgPyAnMScgOiAnMCc7CisJcGFnZVsxXSA9ICdcbic7CisJbGVuID0gMjsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX2lkZW50aWZ5CisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJaW50CQlsZW4gPSAwLCBpID0gMDsKKwlpbnQJCWVyciA9IDA7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICJcbiIpOworCisJaWYgKGRyaXZlKSB7CisJCXVuc2lnbmVkIHNob3J0ICp2YWwgPSAodW5zaWduZWQgc2hvcnQgKikgcGFnZTsKKworCQllcnIgPSB0YXNrZmlsZV9saWJfZ2V0X2lkZW50aWZ5KGRyaXZlLCBwYWdlKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWNoYXIgKm91dCA9ICgoY2hhciAqKXBhZ2UpICsgKFNFQ1RPUl9XT1JEUyAqIDQpOworCQkJcGFnZSA9IG91dDsKKwkJCWRvIHsKKwkJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDR4JWMiLAorCQkJCQlsZTE2X3RvX2NwdSgqdmFsKSwgKCsraSAmIDcpID8gJyAnIDogJ1xuJyk7CisJCQkJdmFsICs9IDE7CisJCQl9IHdoaWxlIChpIDwgKFNFQ1RPUl9XT1JEUyAqIDIpKTsKKwkJCWxlbiA9IG91dCAtIHBhZ2U7CisJCX0KKwl9CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfaWRlX3NldHRpbmdzX3dhcm4odm9pZCkKK3sKKwlzdGF0aWMgaW50IHdhcm5lZCA9IDA7CisKKwlpZiAod2FybmVkKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiAvcHJvYy9pZGUvaGQ/L3NldHRpbmdzIGludGVyZmFjZSBpcyAiCisJCQkgICAgIm9ic29sZXRlLCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24hXG4iKTsKKwl3YXJuZWQgPSAxOworfQorCitzdGF0aWMgaW50IHByb2NfaWRlX3JlYWRfc2V0dGluZ3MKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7CisJaWRlX3NldHRpbmdzX3QJKnNldHRpbmcgPSAoaWRlX3NldHRpbmdzX3QgKikgZHJpdmUtPnNldHRpbmdzOworCWNoYXIJCSpvdXQgPSBwYWdlOworCWludAkJbGVuLCByYywgbXVsX2ZhY3RvciwgZGl2X2ZhY3RvcjsKKworCXByb2NfaWRlX3NldHRpbmdzX3dhcm4oKTsKKworCWRvd24oJmlkZV9zZXR0aW5nX3NlbSk7CisJb3V0ICs9IHNwcmludGYob3V0LCAibmFtZVx0XHRcdHZhbHVlXHRcdG1pblx0XHRtYXhcdFx0bW9kZVxuIik7CisJb3V0ICs9IHNwcmludGYob3V0LCAiLS0tLVx0XHRcdC0tLS0tXHRcdC0tLVx0XHQtLS1cdFx0LS0tLVxuIik7CisJd2hpbGUoc2V0dGluZykgeworCQltdWxfZmFjdG9yID0gc2V0dGluZy0+bXVsX2ZhY3RvcjsKKwkJZGl2X2ZhY3RvciA9IHNldHRpbmctPmRpdl9mYWN0b3I7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiUtMjRzIiwgc2V0dGluZy0+bmFtZSk7CisJCWlmICgocmMgPSBpZGVfcmVhZF9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nKSkgPj0gMCkKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUtMTZkIiwgcmMgKiBtdWxfZmFjdG9yIC8gZGl2X2ZhY3Rvcik7CisJCWVsc2UKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUtMTZzIiwgIndyaXRlLW9ubHkiKTsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJS0xNmQlLTE2ZCIsIChzZXR0aW5nLT5taW4gKiBtdWxfZmFjdG9yICsgZGl2X2ZhY3RvciAtIDEpIC8gZGl2X2ZhY3Rvciwgc2V0dGluZy0+bWF4ICogbXVsX2ZhY3RvciAvIGRpdl9mYWN0b3IpOworCQlpZiAoc2V0dGluZy0+cncgJiBTRVRUSU5HX1JFQUQpCisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICJyIik7CisJCWlmIChzZXR0aW5nLT5ydyAmIFNFVFRJTkdfV1JJVEUpCisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICJ3Iik7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIlxuIik7CisJCXNldHRpbmcgPSBzZXR0aW5nLT5uZXh0OworCX0KKwlsZW4gPSBvdXQgLSBwYWdlOworCXVwKCZpZGVfc2V0dGluZ19zZW0pOworCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZixsZW4pOworfQorCisjZGVmaW5lIE1BWF9MRU4JMzAKKworc3RhdGljIGludCBwcm9jX2lkZV93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOworCWNoYXIJCW5hbWVbTUFYX0xFTiArIDFdOworCWludAkJZm9yX3JlYWwgPSAwOworCXVuc2lnbmVkIGxvbmcJbjsKKwlpZGVfc2V0dGluZ3NfdAkqc2V0dGluZzsKKwljaGFyICpidWYsICpzOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXByb2NfaWRlX3NldHRpbmdzX3dhcm4oKTsKKworCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcyA9IGJ1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJYnVmW2NvdW50XSA9ICdcMCc7CisKKwkvKgorCSAqIFNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UKKwkgKi8KKwl3aGlsZSAoY291bnQgJiYgaXNzcGFjZSgqcykpIHsKKwkJLS1jb3VudDsKKwkJKytzOworCX0KKwkvKgorCSAqIERvIG9uZSBmdWxsIHBhc3MgdG8gdmVyaWZ5IGFsbCBwYXJhbWV0ZXJzLAorCSAqIHRoZW4gZG8gYW5vdGhlciB0byBhY3R1YWxseSB3cml0ZSB0aGUgbmV3IHNldHRpbmdzLgorCSAqLworCWRvIHsKKwkJY2hhciAqcCA9IHM7CisJCW4gPSBjb3VudDsKKwkJd2hpbGUgKG4gPiAwKSB7CisJCQl1bnNpZ25lZCB2YWw7CisJCQljaGFyICpxID0gcDsKKworCQkJd2hpbGUgKG4gPiAwICYmICpwICE9ICc6JykgeworCQkJCS0tbjsKKwkJCQlwKys7CisJCQl9CisJCQlpZiAoKnAgIT0gJzonKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQlpZiAocCAtIHEgPiBNQVhfTEVOKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQltZW1jcHkobmFtZSwgcSwgcCAtIHEpOworCQkJbmFtZVtwIC0gcV0gPSAwOworCisJCQlpZiAobiA+IDApIHsKKwkJCQktLW47CisJCQkJcCsrOworCQkJfSBlbHNlCisJCQkJZ290byBwYXJzZV9lcnJvcjsKKworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnEsIDEwKTsKKwkJCW4gLT0gcSAtIHA7CisJCQlwID0gcTsKKwkJCWlmIChuID4gMCAmJiAhaXNzcGFjZSgqcCkpCisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCXdoaWxlIChuID4gMCAmJiBpc3NwYWNlKCpwKSkgeworCQkJCS0tbjsKKwkJCQkrK3A7CisJCQl9CisKKwkJCWRvd24oJmlkZV9zZXR0aW5nX3NlbSk7CisJCQlzZXR0aW5nID0gaWRlX2ZpbmRfc2V0dGluZ19ieV9uYW1lKGRyaXZlLCBuYW1lKTsKKwkJCWlmICghc2V0dGluZykKKwkJCXsKKwkJCQl1cCgmaWRlX3NldHRpbmdfc2VtKTsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJaWYgKGZvcl9yZWFsKQorCQkJCWlkZV93cml0ZV9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nLCB2YWwgKiBzZXR0aW5nLT5kaXZfZmFjdG9yIC8gc2V0dGluZy0+bXVsX2ZhY3Rvcik7CisJCQl1cCgmaWRlX3NldHRpbmdfc2VtKTsKKwkJfQorCX0gd2hpbGUgKCFmb3JfcmVhbCsrKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKwlyZXR1cm4gY291bnQ7CitwYXJzZV9lcnJvcjoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKwlwcmludGsoInByb2NfaWRlX3dyaXRlX3NldHRpbmdzKCk6IHBhcnNlIGVycm9yXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHByb2NfaWRlX3JlYWRfY2FwYWNpdHkKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IHNwcmludGYocGFnZSwiJWxsdVxuIiwgKGxvbmcgbG9uZykweDdmZmZmZmZmKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocHJvY19pZGVfcmVhZF9jYXBhY2l0eSk7CisKK2ludCBwcm9jX2lkZV9yZWFkX2dlb21ldHJ5CisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOworCWNoYXIJCSpvdXQgPSBwYWdlOworCWludAkJbGVuOworCisJb3V0ICs9IHNwcmludGYob3V0LCJwaHlzaWNhbCAgICAgJWQvJWQvJWRcbiIsCisJCQlkcml2ZS0+Y3lsLCBkcml2ZS0+aGVhZCwgZHJpdmUtPnNlY3QpOworCW91dCArPSBzcHJpbnRmKG91dCwibG9naWNhbCAgICAgICVkLyVkLyVkXG4iLAorCQkJZHJpdmUtPmJpb3NfY3lsLCBkcml2ZS0+Ymlvc19oZWFkLCBkcml2ZS0+Ymlvc19zZWN0KTsKKworCWxlbiA9IG91dCAtIHBhZ2U7CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0wocHJvY19pZGVfcmVhZF9nZW9tZXRyeSk7CisKK3N0YXRpYyBpbnQgcHJvY19pZGVfcmVhZF9kbW9kZWwKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCWludAkJbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJS40MHNcbiIsCisJCShpZCAmJiBpZC0+bW9kZWxbMF0pID8gKGNoYXIgKilpZC0+bW9kZWwgOiAiKG5vbmUpIik7CisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVfcmVhZF9kcml2ZXIKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7CisJaWRlX2RyaXZlcl90CSpkcml2ZXIgPSBkcml2ZS0+ZHJpdmVyOworCWludAkJbGVuOworCisJaWYgKGRyaXZlcikgeworCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlcyB2ZXJzaW9uICVzXG4iLAorCQkJCWRyaXZlci0+bmFtZSwgZHJpdmVyLT52ZXJzaW9uKTsKKwl9IGVsc2UKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiaWRlLWRlZmF1bHQgdmVyc2lvbiAwLjkubmV3aWRlXG4iKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZV93cml0ZV9kcml2ZXIKKwkoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7CisJY2hhciBuYW1lWzMyXTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKGNvdW50ID4gMzEpCisJCWNvdW50ID0gMzE7CisJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwluYW1lW2NvdW50XSA9ICdcMCc7CisJaWYgKGlkZV9yZXBsYWNlX3N1YmRyaXZlcihkcml2ZSwgbmFtZSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX21lZGlhCisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOworCWNvbnN0IGNoYXIJKm1lZGlhOworCWludAkJbGVuOworCisJc3dpdGNoIChkcml2ZS0+bWVkaWEpIHsKKwkJY2FzZSBpZGVfZGlzazoJbWVkaWEgPSAiZGlza1xuIjsKKwkJCQlicmVhazsKKwkJY2FzZSBpZGVfY2Ryb206CW1lZGlhID0gImNkcm9tXG4iOworCQkJCWJyZWFrOworCQljYXNlIGlkZV90YXBlOgltZWRpYSA9ICJ0YXBlXG4iOworCQkJCWJyZWFrOworCQljYXNlIGlkZV9mbG9wcHk6bWVkaWEgPSAiZmxvcHB5XG4iOworCQkJCWJyZWFrOworCQlkZWZhdWx0OgltZWRpYSA9ICJVTktOT1dOXG4iOworCQkJCWJyZWFrOworCX0KKwlzdHJjcHkocGFnZSxtZWRpYSk7CisJbGVuID0gc3RybGVuKG1lZGlhKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKTsKK30KKworc3RhdGljIGlkZV9wcm9jX2VudHJ5X3QgZ2VuZXJpY19kcml2ZV9lbnRyaWVzW10gPSB7CisJeyAiZHJpdmVyIiwJU19JRlJFR3xTX0lSVUdPLAlwcm9jX2lkZV9yZWFkX2RyaXZlciwJcHJvY19pZGVfd3JpdGVfZHJpdmVyIH0sCisJeyAiaWRlbnRpZnkiLAlTX0lGUkVHfFNfSVJVU1IsCXByb2NfaWRlX3JlYWRfaWRlbnRpZnksCU5VTEwgfSwKKwl7ICJtZWRpYSIsCVNfSUZSRUd8U19JUlVHTywJcHJvY19pZGVfcmVhZF9tZWRpYSwJTlVMTCB9LAorCXsgIm1vZGVsIiwJU19JRlJFR3xTX0lSVUdPLAlwcm9jX2lkZV9yZWFkX2Rtb2RlbCwJTlVMTCB9LAorCXsgInNldHRpbmdzIiwJU19JRlJFR3xTX0lSVVNSfFNfSVdVU1IscHJvY19pZGVfcmVhZF9zZXR0aW5ncywJcHJvY19pZGVfd3JpdGVfc2V0dGluZ3MgfSwKKwl7IE5VTEwsCTAsIE5VTEwsIE5VTEwgfQorfTsKKwordm9pZCBpZGVfYWRkX3Byb2NfZW50cmllcyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwgaWRlX3Byb2NfZW50cnlfdCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCWlmICghZGlyIHx8ICFwKQorCQlyZXR1cm47CisJd2hpbGUgKHAtPm5hbWUgIT0gTlVMTCkgeworCQllbnQgPSBjcmVhdGVfcHJvY19lbnRyeShwLT5uYW1lLCBwLT5tb2RlLCBkaXIpOworCQlpZiAoIWVudCkgcmV0dXJuOworCQllbnQtPm5saW5rID0gMTsKKwkJZW50LT5kYXRhID0gZGF0YTsKKwkJZW50LT5yZWFkX3Byb2MgPSBwLT5yZWFkX3Byb2M7CisJCWVudC0+d3JpdGVfcHJvYyA9IHAtPndyaXRlX3Byb2M7CisJCXArKzsKKwl9Cit9CisKK3ZvaWQgaWRlX3JlbW92ZV9wcm9jX2VudHJpZXMoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIsIGlkZV9wcm9jX2VudHJ5X3QgKnApCit7CisJaWYgKCFkaXIgfHwgIXApCisJCXJldHVybjsKKwl3aGlsZSAocC0+bmFtZSAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHAtPm5hbWUsIGRpcik7CisJCXArKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9wcm9jX2lkZV9kcml2ZXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpbnQJZDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCA9IGh3aWYtPnByb2M7CisJY2hhciBuYW1lWzY0XTsKKworCWZvciAoZCA9IDA7IGQgPCBNQVhfRFJJVkVTOyBkKyspIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tkXTsKKworCQlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQkJY29udGludWU7CisJCWlmIChkcml2ZS0+cHJvYykKKwkJCWNvbnRpbnVlOworCisJCWRyaXZlLT5wcm9jID0gcHJvY19ta2Rpcihkcml2ZS0+bmFtZSwgcGFyZW50KTsKKwkJaWYgKGRyaXZlLT5wcm9jKQorCQkJaWRlX2FkZF9wcm9jX2VudHJpZXMoZHJpdmUtPnByb2MsIGdlbmVyaWNfZHJpdmVfZW50cmllcywgZHJpdmUpOworCQlzcHJpbnRmKG5hbWUsImlkZSVkLyVzIiwgKGRyaXZlLT5uYW1lWzJdLSdhJykvMiwgZHJpdmUtPm5hbWUpOworCQllbnQgPSBwcm9jX3N5bWxpbmsoZHJpdmUtPm5hbWUsIHByb2NfaWRlX3Jvb3QsIG5hbWUpOworCQlpZiAoIWVudCkgcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9wcm9jX2lkZV9kZXZpY2UoaWRlX2h3aWZfdCAqaHdpZiwgaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChkcml2ZS0+cHJvYykgeworCQlpZGVfcmVtb3ZlX3Byb2NfZW50cmllcyhkcml2ZS0+cHJvYywgZ2VuZXJpY19kcml2ZV9lbnRyaWVzKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoZHJpdmUtPm5hbWUsIHByb2NfaWRlX3Jvb3QpOworCQlyZW1vdmVfcHJvY19lbnRyeShkcml2ZS0+bmFtZSwgaHdpZi0+cHJvYyk7CisJCWRyaXZlLT5wcm9jID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcHJvY19pZGVfZHJpdmVzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaW50CWQ7CisKKwlmb3IgKGQgPSAwOyBkIDwgTUFYX0RSSVZFUzsgZCsrKSB7CisJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbZF07CisJCWlmIChkcml2ZS0+cHJvYykKKwkJCWRlc3Ryb3lfcHJvY19pZGVfZGV2aWNlKGh3aWYsIGRyaXZlKTsKKwl9Cit9CisKK3N0YXRpYyBpZGVfcHJvY19lbnRyeV90IGh3aWZfZW50cmllc1tdID0geworCXsgImNoYW5uZWwiLAlTX0lGUkVHfFNfSVJVR08sCXByb2NfaWRlX3JlYWRfY2hhbm5lbCwJTlVMTCB9LAorCXsgIm1hdGUiLAlTX0lGUkVHfFNfSVJVR08sCXByb2NfaWRlX3JlYWRfbWF0ZSwJTlVMTCB9LAorCXsgIm1vZGVsIiwJU19JRlJFR3xTX0lSVUdPLAlwcm9jX2lkZV9yZWFkX2ltb2RlbCwJTlVMTCB9LAorCXsgTlVMTCwJMCwgTlVMTCwgTlVMTCB9Cit9OworCit2b2lkIGNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKHZvaWQpCit7CisJaW50CWg7CisKKwlmb3IgKGggPSAwOyBoIDwgTUFYX0hXSUZTOyBoKyspIHsKKwkJaWRlX2h3aWZfdCAqaHdpZiA9ICZpZGVfaHdpZnNbaF07CisKKwkJaWYgKCFod2lmLT5wcmVzZW50KQorCQkJY29udGludWU7CisJCWlmICghaHdpZi0+cHJvYykgeworCQkJaHdpZi0+cHJvYyA9IHByb2NfbWtkaXIoaHdpZi0+bmFtZSwgcHJvY19pZGVfcm9vdCk7CisJCQlpZiAoIWh3aWYtPnByb2MpCisJCQkJcmV0dXJuOworCQkJaWRlX2FkZF9wcm9jX2VudHJpZXMoaHdpZi0+cHJvYywgaHdpZl9lbnRyaWVzLCBod2lmKTsKKwkJfQorCQljcmVhdGVfcHJvY19pZGVfZHJpdmVzKGh3aWYpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChjcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcyk7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVQQ0kKK3ZvaWQgaWRlX3BjaV9jcmVhdGVfaG9zdF9wcm9jKGNvbnN0IGNoYXIgKm5hbWUsIGdldF9pbmZvX3QgKmdldF9pbmZvKQoreworCWNyZWF0ZV9wcm9jX2luZm9fZW50cnkobmFtZSwgMCwgcHJvY19pZGVfcm9vdCwgZ2V0X2luZm8pOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfcGNpX2NyZWF0ZV9ob3N0X3Byb2MpOworI2VuZGlmCisKK3ZvaWQgZGVzdHJveV9wcm9jX2lkZV9pbnRlcmZhY2UoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZiAoaHdpZi0+cHJvYykgeworCQlkZXN0cm95X3Byb2NfaWRlX2RyaXZlcyhod2lmKTsKKwkJaWRlX3JlbW92ZV9wcm9jX2VudHJpZXMoaHdpZi0+cHJvYywgaHdpZl9lbnRyaWVzKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoaHdpZi0+bmFtZSwgcHJvY19pZGVfcm9vdCk7CisJCWh3aWYtPnByb2MgPSBOVUxMOworCX0KK30KKworZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpZGVfZHJpdmVyc19vcDsKK3N0YXRpYyBpbnQgaWRlX2RyaXZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlkZV9kcml2ZXJzX29wKTsKK30KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlkZV9kcml2ZXJzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gaWRlX2RyaXZlcnNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKwordm9pZCBwcm9jX2lkZV9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJaWYgKCFwcm9jX2lkZV9yb290KQorCQlyZXR1cm47CisKKwljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiZHJpdmVycyIsIDAsIHByb2NfaWRlX3Jvb3QpOworCWlmIChlbnRyeSkKKwkJZW50cnktPnByb2NfZm9wcyA9ICZpZGVfZHJpdmVyc19vcGVyYXRpb25zOworfQorCit2b2lkIHByb2NfaWRlX2Rlc3Ryb3kodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiaWRlL2RyaXZlcnMiLCBwcm9jX2lkZV9yb290KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiaWRlIiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI1NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMCwwICsxLDQ5MzcgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCQlWZXJzaW9uIDEuMTkJTm92LCAyMDAzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IC0gMTk5OSBHYWRpIE94bWFuIDxnYWRpb0BuZXR2aXNpb24ubmV0LmlsPgorICoKKyAqICRIZWFkZXIkCisgKgorICogVGhpcyBkcml2ZXIgd2FzIGNvbnN0cnVjdGVkIGFzIGEgc3R1ZGVudCBwcm9qZWN0IGluIHRoZSBzb2Z0d2FyZSBsYWJvcmF0b3J5CisgKiBvZiB0aGUgZmFjdWx0eSBvZiBlbGVjdHJpY2FsIGVuZ2luZWVyaW5nIGluIHRoZSBUZWNobmlvbiAtIElzcmFlbCdzCisgKiBJbnN0aXR1dGUgT2YgVGVjaG5vbG9neSwgd2l0aCB0aGUgZ3VpZGUgb2YgQXZuZXIgTG90dGVtIGFuZCBEci4gSWxhbmEgRGF2aWQuCisgKgorICogSXQgaXMgaGVyZWJ5IHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlLgorICogKFNlZSBsaW51eC9DT1BZSU5HKS4KKyAqLworIAorLyoKKyAqIElERSBBVEFQSSBzdHJlYW1pbmcgdGFwZSBkcml2ZXIuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYSBwYXJ0IG9mIHRoZSBMaW51eCBpZGUgZHJpdmVyIGFuZCB3b3JrcyBpbiBjby1vcGVyYXRpb24KKyAqIHdpdGggbGludXgvZHJpdmVycy9ibG9jay9pZGUuYy4KKyAqCisgKiBUaGUgZHJpdmVyLCBpbiBjby1vcGVyYXRpb24gd2l0aCBpZGUuYywgYmFzaWNhbGx5IHRyYXZlcnNlcyB0aGUgCisgKiByZXF1ZXN0LWxpc3QgZm9yIHRoZSBibG9jayBkZXZpY2UgaW50ZXJmYWNlLiBUaGUgY2hhcmFjdGVyIGRldmljZQorICogaW50ZXJmYWNlLCBvbiB0aGUgb3RoZXIgaGFuZCwgY3JlYXRlcyBuZXcgcmVxdWVzdHMsIGFkZHMgdGhlbQorICogdG8gdGhlIHJlcXVlc3QtbGlzdCBvZiB0aGUgYmxvY2sgZGV2aWNlLCBhbmQgd2FpdHMgZm9yIHRoZWlyIGNvbXBsZXRpb24uCisgKgorICogUGlwZWxpbmVkIG9wZXJhdGlvbiBtb2RlIGlzIG5vdyBzdXBwb3J0ZWQgb24gYm90aCByZWFkcyBhbmQgd3JpdGVzLgorICoKKyAqIFRoZSBibG9jayBkZXZpY2UgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgYXJlIGRldGVybWluZWQgZnJvbSB0aGUKKyAqIHRhcGUncyByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgaWRlIGludGVyZmFjZXMsIGFzIGV4cGxhaW5lZCBpbiBpZGUuYy4KKyAqCisgKiBUaGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgorICoKKyAqIGh0MAkJbWFqb3IgMzcsIG1pbm9yIDAJZmlyc3QgIElERSB0YXBlLCByZXdpbmQgb24gY2xvc2UuCisgKiBodDEJCW1ham9yIDM3LCBtaW5vciAxCXNlY29uZCBJREUgdGFwZSwgcmV3aW5kIG9uIGNsb3NlLgorICogLi4uCisgKiBuaHQwCQltYWpvciAzNywgbWlub3IgMTI4CWZpcnN0ICBJREUgdGFwZSwgbm8gcmV3aW5kIG9uIGNsb3NlLgorICogbmh0MQkJbWFqb3IgMzcsIG1pbm9yIDEyOQlzZWNvbmQgSURFIHRhcGUsIG5vIHJld2luZCBvbiBjbG9zZS4KKyAqIC4uLgorICoKKyAqIFJ1biBsaW51eC9zY3JpcHRzL01BS0VERVYuaWRlIHRvIGNyZWF0ZSB0aGUgYWJvdmUgZW50cmllcy4KKyAqCisgKiBUaGUgZ2VuZXJhbCBtYWduZXRpYyB0YXBlIGNvbW1hbmRzIGNvbXBhdGlibGUgaW50ZXJmYWNlLCBhcyBkZWZpbmVkIGJ5CisgKiBpbmNsdWRlL2xpbnV4L210aW8uaCwgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgorICoKKyAqIEdlbmVyYWwgaWRlIGRyaXZlciBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIGludGVycnVwdC11bm1hc2sKKyAqIGZsYWcsIGNhbiBiZSBjb25maWd1cmVkIGJ5IGlzc3VpbmcgYW4gaW9jdGwgdG8gdGhlIGJsb2NrIGRldmljZSBpbnRlcmZhY2UsCisgKiBhcyBhbnkgb3RoZXIgaWRlIGRldmljZS4KKyAqCisgKiBPdXIgb3duIGlkZS10YXBlIGlvY3RsJ3MgY2FuIGJlIGlzc3VlZCB0byBlaXRoZXIgdGhlIGJsb2NrIGRldmljZSBvcgorICogdGhlIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlLgorICoKKyAqIE1heGltYWwgdGhyb3VnaHB1dCB3aXRoIG1pbmltYWwgYnVzIGxvYWQgd2lsbCB1c3VhbGx5IGJlIGFjaGlldmVkIGluIHRoZQorICogZm9sbG93aW5nIHNjZW5hcmlvOgorICoKKyAqCTEuCWlkZS10YXBlIGlzIG9wZXJhdGluZyBpbiB0aGUgcGlwZWxpbmVkIG9wZXJhdGlvbiBtb2RlLgorICoJMi4JTm8gYnVmZmVyaW5nIGlzIHBlcmZvcm1lZCBieSB0aGUgdXNlciBiYWNrdXAgcHJvZ3JhbS4KKyAqCisgKiBUZXN0aW5nIHdhcyBkb25lIHdpdGggYSAyIEdCIENPTk5FUiBDVE1BIDQwMDAgSURFIEFUQVBJIFN0cmVhbWluZyBUYXBlIERyaXZlLgorICogCisgKiBWZXIgMC4xICAgTm92ICAxIDk1ICAgUHJlLXdvcmtpbmcgY29kZSA6LSkKKyAqIFZlciAwLjIgICBOb3YgMjMgOTUgICBBIHNob3J0IGJhY2t1cCAoZmV3IG1lZ2FieXRlcykgYW5kIHJlc3RvcmUgcHJvY2VkdXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBzdWNjZXNzZnVsICEgKFVzaW5nIHRhciBjdmYgLi4uIG9uIHRoZSBibG9jaworICogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgaW50ZXJmYWNlKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBIGxvbmdlciBiYWNrdXAgcmVzdWx0ZWQgaW4gbWFqb3Igc3dhcHBpbmcsIGJhZAorICogICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIExpbnV4IHBlcmZvcm1hbmNlIGFuZCBldmVudHVhbGx5IGZhaWxlZCBhcworICogICAgICAgICAgICAgICAgICAgICAgICB3ZSByZWNlaXZlZCBub24gc2VyaWFsIHJlYWQtYWhlYWQgcmVxdWVzdHMgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGNhY2hlLgorICogVmVyIDAuMyAgIE5vdiAyOCA5NSAgIExvbmcgYmFja3VwcyBhcmUgbm93IHBvc3NpYmxlLCB0aGFua3MgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlLiBMaW51eCdzIHJlc3BvbnNpdmVuZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwZXJmb3JtYW5jZSBkb2Vzbid0IHNlZW0gdG8gYmUgbXVjaCBhZmZlY3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYWNrZ3JvdW5kIGJhY2t1cCBwcm9jZWR1cmUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBnZW5lcmFsIG10aW8uaCBtYWduZXRpYyB0YXBlIG9wZXJhdGlvbnMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG5vdyBzdXBwb3J0ZWQgYnkgb3VyIGNoYXJhY3RlciBkZXZpY2UuIEFzIGEgcmVzdWx0LAorICogICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGFyIHRhcGUgdXRpbGl0aWVzIGFyZSBzdGFydGluZyB0byB3b3JrIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaWRlIHRhcGVzIDotKQorICogICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgd2VyZSB0ZXN0ZWQ6CisgKiAgICAgICAgICAgICAgICAgICAgICAgCTEuIEFuIElERSBBVEFQSSBUQVBFIHNoYXJlcyB0aGUgc2FtZSBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAJICAgYW5kIGlycSB3aXRoIGFuIElERSBBVEFQSSBDRFJPTS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgCTIuIEFuIElERSBBVEFQSSBUQVBFIHNoYXJlcyB0aGUgc2FtZSBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgYW5kIGlycSB3aXRoIGEgbm9ybWFsIElERSBkaXNrLgorICogICAgICAgICAgICAgICAgICAgICAgICBCb3RoIGNvbmZpZ3VyYXRpb25zIHNlZW1lZCB0byB3b3JrIGp1c3QgZmluZSAhCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIGl0IGlzIG1lYW53aGlsZQorICogICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlZCB0byBnaXZlIHRoZSBJREUgVEFQRSBpdHMgb3duIGludGVyZmFjZQorICogICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXJxLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoZSBvbmUgdGhpbmcgd2hpY2ggbmVlZHMgdG8gYmUgZG9uZSBoZXJlIGlzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBhICJyZXF1ZXN0IHBvc3Rwb25lIiBmZWF0dXJlIHRvIGlkZS5jLAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHdlIHdvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHRhcGUgdG8gZmluaXNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYSBsb25nIG1lZGlhIGFjY2VzcyAoRFNDKSByZXF1ZXN0IChzdWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgcmV3aW5kKSBiZWZvcmUgd2UgY2FuIGFjY2VzcyB0aGUgb3RoZXIgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBzYW1lIGludGVyZmFjZS4gVGhpcyBlZmZlY3QgZG9lc24ndCBkaXN0dXJiCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbCBvcGVyYXRpb24gbW9zdCBvZiB0aGUgdGltZSBiZWNhdXNlIHJlYWQvd3JpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgYXJlIHJlbGF0aXZlbHkgZmFzdCwgYW5kIG9uY2Ugd2UgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgb25lIHRhcGUgci93IHJlcXVlc3QsIGEgbG90IG9mIHJlcXVlc3RzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG90aGVyIGRldmljZSBjYW4gYmUgcXVldWVkIGFuZCBpZGUuYyB3aWxsCisgKgkJCSAgc2VydmljZSBhbGwgb2YgdGhlbSBhZnRlciB0aGlzIHNpbmdsZSB0YXBlIHJlcXVlc3QuCisgKiBWZXIgMS4wICAgRGVjIDExIDk1ICAgSW50ZWdyYXRlZCBpbnRvIExpbnV4IDEuMy40NiBkZXZlbG9wbWVudCB0cmVlLgorICogICAgICAgICAgICAgICAgICAgICAgIE9uIGVhY2ggcmVhZCAvIHdyaXRlIHJlcXVlc3QsIHdlIG5vdyBhc2sgdGhlIGRyaXZlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdlIGNhbiB0cmFuc2ZlciBhIGNvbnN0YW50IG51bWJlciBvZiBieXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAoYSBwYXJhbWV0ZXIgb2YgdGhlIGRyaXZlKSBvbmx5IHRvIGl0cyBidWZmZXJzLAorICogICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGNhdXNpbmcgYWN0dWFsIG1lZGlhIGFjY2Vzcy4gSWYgd2UgY2FuJ3QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdlIGp1c3Qgd2FpdCB1bnRpbCB3ZSBjYW4gYnkgcG9sbGluZyB0aGUgRFNDIGJpdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgd2hpbGUgd2UgYXJlIG5vdCB0cmFuc2ZlcnJpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBieXRlcyB0aGFuIHRoZSBjb25zdGFudCByZWZlcnJlZCB0byBhYm92ZSwgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBsYXRlbmN5IHdpbGwgbm90IGJlY29tZSB0b28gaGlnaCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd29uJ3QgY2F1c2UgYW4gaW50ZXJydXB0IHRpbWVvdXQsIGFzIGhhcHBlbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9jY2FzaW9uYWxseSBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICBXaGlsZSBwb2xsaW5nIGZvciBEU0MsIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHBvbmVkIGFuZCBpZGUuYyBpcyBmcmVlIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdGhlciBkZXZpY2UuIFRoaXMgaXMgaGFuZGxlZCB0cmFuc3BhcmVudGx5IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlkZS5jLiBUaGUgaHdncm91cCBsb2NraW5nIG1ldGhvZCB3aGljaCB3YXMgdXNlZAorICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiB3YXMgcmVtb3ZlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2Ugb2YgbmV3IGdlbmVyYWwgZmVhdHVyZXMgd2hpY2ggYXJlIHByb3ZpZGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlkZS5jIGZvciB1c2Ugd2l0aCBhdGFwaSBkZXZpY2VzLgorICogICAgICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbW1pbmcgZG9uZSBieSBNYXJrIExvcmQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgRmV3IHBvdGVudGlhbCBidWcgZml4ZXMgKEFnYWluLCBzdWdnZXN0ZWQgYnkgTWFyaykKKyAqICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGUgY2hhcmFjdGVyIGRldmljZSBkYXRhIHRyYW5zZmVycyBhcmUgbm93CisgKiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBsaW1pdGVkIGluIHNpemUsIGFzIHRoZXkgd2VyZSBiZWZvcmUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgV2UgYXJlIGFza2luZyB0aGUgdGFwZSBhYm91dCBpdHMgcmVjb21tZW5kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgdW5pdCBhbmQgc2VuZCBhIGxhcmdlciBkYXRhIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFzIHNldmVyYWwgdHJhbnNmZXJzIG9mIHRoZSBhYm92ZSBzaXplLgorICogICAgICAgICAgICAgICAgICAgICAgICBGb3IgYmVzdCByZXN1bHRzLCB1c2UgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWMgdW5pdCAod2hpY2ggaXMgc2hvd24gZHVyaW5nIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbikuIEkgd2lsbCBzb29uIGFkZCBhbiBpb2N0bCB0byBnZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbXBvcnRhbnQgcGFyYW1ldGVyLgorICogICAgICAgICAgICAgICAgICAgICAgIE91ciBkYXRhIHRyYW5zZmVyIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gc3RhcnR1cCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYmVmb3JlIGVhY2ggZGF0YSB0cmFuc2Zlci4gVGhpcyBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlIHRoYXQgd2Ugd2lsbCBpbmRlZWQgaGF2ZSBhIGRhdGEgYnVmZmVyLgorICogVmVyIDEuMSAgIERlYyAxNCA5NSAgIEZpeGVkIHJhbmRvbSBwcm9ibGVtcyB3aGljaCBvY2N1cnJlZCB3aGVuIHRoZSB0YXBlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCBhbiBpbnRlcmZhY2Ugd2l0aCBhbm90aGVyIGRldmljZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHBvbGxfZm9yX2RzYyB3YXMgYSBjb21wbGV0ZSBtZXNzKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIHNvbWUgb2xkIChub24tYWN0aXZlKSBjb2RlIHdoaWNoIGhhZAorICogICAgICAgICAgICAgICAgICAgICAgICB0byBkbyB3aXRoIHN1cHBvcnRpbmcgYnVmZmVyIGNhY2hlIG9yaWdpbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJsb2NrIGRldmljZSBpbnRlcmZhY2UgY2FuIG5vdyBiZSBvcGVuZWQsIHNvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZ2VuZXJhbCBpZGUgZHJpdmVyIGZlYXR1cmVzIGxpa2UgdGhlIHVubWFzaworICogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzIGZsYWcgY2FuIGJlIHNlbGVjdGVkIHdpdGggYW4gaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG9ubHkgdXNlIG9mIHRoZSBibG9jayBkZXZpY2UgaW50ZXJmYWNlLgorICogICAgICAgICAgICAgICAgICAgICAgIE5ldyBmYXN0IHBpcGVsaW5lZCBvcGVyYXRpb24gbW9kZSAoY3VycmVudGx5IG9ubHkgb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVzKS4gV2hlbiB1c2luZyB0aGUgcGlwZWxpbmVkIG1vZGUsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdocHV0IGNhbiBwb3RlbnRpYWxseSByZWFjaCB0aGUgbWF4aW11bQorICogICAgICAgICAgICAgICAgICAgICAgICB0YXBlIHN1cHBvcnRlZCB0aHJvdWdocHV0LCByZWdhcmRsZXNzIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGJhY2t1cCBwcm9ncmFtLiBPbiBteSB0YXBlIGRyaXZlLCBpdCBzb21ldGltZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3RlZCBwZXJmb3JtYW5jZSBieSBhIGZhY3RvciBvZiAyLiBQaXBlbGluZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBzaW5jZSBpdCBoYXMgYSBmZXcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZG93bmZhbGxzIGFzIHdlbGwsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIGl0LgorICogICAgICAgICAgICAgICAgICAgICAgICBBIHNob3J0IGV4cGxhbmF0aW9uIG9mIHRoZSBwaXBlbGluZWQgb3BlcmF0aW9uIG1vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXZhaWxhYmxlIGJlbG93LgorICogVmVyIDEuMiAgIEphbiAgMSA5NiAgIEVsaW1pbmF0ZWQgcGlwZWxpbmVkIG1vZGUgcmFjZSBjb25kaXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgcGlwZWxpbmUgcmVhZCBtb2RlLiBBcyBhIHJlc3VsdCwgcmVzdG9yZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdyBhcyBmYXN0IGFzIGJhY2t1cHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVkIHNoYXJlZCBpbnRlcmZhY2UgYmVoYXZpb3IuIFRoZSBuZXcgYmVoYXZpb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdHlwaWNhbGx5IHJlc3VsdHMgaW4gYmV0dGVyIElERSBidXMgZWZmaWNpZW5jeSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVyIHRhcGUgdGhyb3VnaHB1dC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBQcmUtY2FsY3VsYXRpb24gb2YgdGhlIGV4cGVjdGVkIHJlYWQvd3JpdGUgcmVxdWVzdAorICogICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIHRpbWUsIGJhc2VkIG9uIHRoZSB0YXBlJ3MgcGFyYW1ldGVycy4gSW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpcGVsaW5lZCBvcGVyYXRpb24gbW9kZSwgdGhpcyBhbGxvd3MgdXMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0IG91ciBwb2xsaW5nIGZyZXF1ZW5jeSB0byBhIG11Y2ggbG93ZXIgdmFsdWUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aHVzIHRvIGRyYW1hdGljYWxseSByZWR1Y2Ugb3VyIGxvYWQgb24gTGludXgsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgYW55IGRlY3JlYXNlIGluIHBlcmZvcm1hbmNlLgorICogICAgICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGVkIGFkZGl0aW9uYWwgbXRpby5oIG9wZXJhdGlvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY29tbWVuZGVkIHVzZXIgYmxvY2sgc2l6ZSBpcyByZXR1cm5lZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgTVRJT0NHRVQgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBtaW5vciBjaGFuZ2VzLgorICogVmVyIDEuMyAgIEZlYiAgOSA5NiAgIEZpeGVkIHBpcGVsaW5lZCByZWFkIG1vZGUgYnVnIHdoaWNoIHByZXZlbnRlZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdXNlIG9mIHNvbWUgYmxvY2sgc2l6ZXMgZHVyaW5nIGEgcmVzdG9yZSBwcm9jZWR1cmUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlIHdpbGwgbm93IHByZXNlbnQgYQorICogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZpZXcgb2YgdGhlIG1lZGlhIC0gYW55IG1peCBvZiBibG9jayBzaXplcworICogICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBiYWNrdXAvcmVzdG9yZSBwcm9jZWR1cmUgaXMgc3VwcG9ydGVkLiBUaGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIHdpbGwgYnVmZmVyIHRoZSByZXF1ZXN0cyBpbnRlcm5hbGx5IGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRoZW0gdG8gdGhlIHRhcGUncyByZWNvbW1lbmRlZCB0cmFuc2ZlcgorICogICAgICAgICAgICAgICAgICAgICAgICB1bml0LCBtYWtpbmcgcGVyZm9ybWFuY2UgYWxtb3N0IGluZGVwZW5kZW50IG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW4gdXNlciBibG9jayBzaXplLgorICogICAgICAgICAgICAgICAgICAgICAgIFNvbWUgaW1wcm92ZW1lbnRzIGluIGVycm9yIHJlY292ZXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgIEJ5IGNvb3BlcmF0aW5nIHdpdGggaWRlLWRtYS5jLCBidXMgbWFzdGVyaW5nIERNQSBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgbm93IHNvbWV0aW1lcyBiZSB1c2VkIHdpdGggSURFIHRhcGUgZHJpdmVzIGFzIHdlbGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJ1cyBtYXN0ZXJpbmcgRE1BIGhhcyB0aGUgcG90ZW50aWFsIHRvIGRyYW1hdGljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UgdGhlIENQVSdzIG92ZXJoZWFkIHdoZW4gYWNjZXNzaW5nIHRoZSBkZXZpY2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgZW5hYmxlZCBieSB1c2luZyBoZHBhcm0gLWQxIG9uIHRoZSB0YXBlJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgZGV2aWNlIGludGVyZmFjZS4gRm9yIG1vcmUgaW5mbywgcmVhZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgaW4gaWRlLWRtYS5jLgorICogVmVyIDEuNCAgIE1hciAxMyA5NiAgIEZpeGVkIHNlcmlhbGl6ZSBzdXBwb3J0LgorICogVmVyIDEuNSAgIEFwciAxMiA5NiAgIEZpeGVkIHNoYXJlZCBpbnRlcmZhY2Ugb3BlcmF0aW9uLCBicm9rZW4gaW4gMS4zLjg1LgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIHBpcGVsaW5lZCByZWFkIG1vZGUgaW5lZmZpY2llbmN5LgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIG5hc3R5IG51bGwgZGVyZWZlcmVuY2luZyBidWcuCisgKiBWZXIgMS42ICAgQXVnIDE2IDk2ICAgRml4ZWQgRlBVIHVzYWdlIGluIHRoZSBkcml2ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgZW5kIG9mIG1lZGlhIGJ1Zy4KKyAqIFZlciAxLjcgICBTZXAgMTAgOTYgICBNaW5vciBjaGFuZ2VzIGZvciB0aGUgQ09OTkVSIENUVDgwMDAtQSBtb2RlbC4KKyAqIFZlciAxLjggICBTZXAgMjYgOTYgICBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgYmFsYW5jZSBiZXR3ZWVuIGdvb2QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgcmVzcG9uc2UgYW5kIGhpZ2ggc3lzdGVtIHRocm91Z2hwdXQuCisgKiBWZXIgMS45ICAgTm92ICA1IDk2ICAgQXV0b21hdGljYWxseSBjcm9zcyBlbmNvdW50ZXJlZCBmaWxlbWFya3MgcmF0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEZTRiBjb21tYW5kLgorICogICAgICAgICAgICAgICAgICAgICAgIEFib3J0IHBlbmRpbmcgcmVxdWVzdHMgYXQgZW5kIG9mIG1lZGlhLgorICogICAgICAgICAgICAgICAgICAgICAgIE1UVEVMTCB3YXMgc29tZXRpbWVzIHJldHVybmluZyBpbmNvcnJlY3QgcmVzdWx0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdGhlIHJlYWwgYmxvY2sgc2l6ZSBpbiB0aGUgTVRJT0NHRVQgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBlcnJvciByZWNvdmVyeSBidWcgZml4ZXMuCisgKiBWZXIgMS4xMCAgTm92ICA1IDk2ICAgTWFqb3IgcmVvcmdhbml6YXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgUmVkdWNlZCBDUFUgb3ZlcmhlYWQgYSBiaXQgYnkgZWxpbWluYXRpbmcgaW50ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYm91bmNlIGJ1ZmZlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9kdWxlIHN1cHBvcnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbXVsdGlwbGUgdGFwZSBkcml2ZXMgc3VwcG9ydC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBwYXJ0aXRpb24gc3VwcG9ydC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBSZXdyb3RlIERTQyBoYW5kbGluZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBTb21lIHBvcnRhYmlsaXR5IGZpeGVzLgorICogICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgaWRlLXRhcGUuaC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIG1pbm9yIGNoYW5nZXMuCisgKiBWZXIgMS4xMSAgRGVjICAyIDk2ICAgQnVnIGZpeCBpbiBwcmV2aW91cyBEU0MgdGltZW91dCBoYW5kbGluZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2UgaWRlX3N0YWxsX3F1ZXVlKCkgZm9yIERTQyBvdmVybGFwLgorICogICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgbWF4aW11bSBzcGVlZCByYXRoZXIgdGhhbiB0aGUgY3VycmVudCBzcGVlZAorICogICAgICAgICAgICAgICAgICAgICAgICB0byBjb21wdXRlIHRoZSByZXF1ZXN0IHNlcnZpY2UgdGltZS4KKyAqIFZlciAxLjEyICBEZWMgIDcgOTcgICBGaXggcmFuZG9tIG1lbW9yeSBvdmVyd3JpdGluZyBhbmQvb3IgbGFzdCBibG9jayBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRpb24sIHdoaWNoIGNvdWxkIG9jY3VyIGlmIHRoZSB0b3RhbCBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgdGFwZSB3YXMgbm90IGFuIGludGVncmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0YXBlIGJsb2Nrcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgSU5URVJSVVBUIERSUSBkZXZpY2VzLgorICogVmVyIDEuMTMgIEphbiAgMiA5OCAgIEFkZCAic3BlZWQgPT0gMCIgd29yay1hcm91bmQgZm9yIEhQIENPTE9SQURPIDVHQgorICogVmVyIDEuMTQgIERlYyAzMCA5OCAgIFBhcnRpYWwgZml4ZXMgZm9yIHRoZSBTb255L0FJV0EgdGFwZSBkcml2ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBjbGkoKS9zdGkoKSB3aXRoIGh3Z3JvdXAgc3BpbmxvY2tzLgorICogVmVyIDEuMTUgIE1hciAyNSA5OSAgIEZpeCBTTVAgcmFjZSBjb25kaXRpb24gYnkgcmVwbGFjaW5nIGh3Z3JvdXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3BpbmxvY2sgd2l0aCBwcml2YXRlIHBlci10YXBlIHNwaW5sb2NrLgorICogVmVyIDEuMTYgIFNlcCAgMSA5OSAgIEFkZCBPblN0cmVhbSB0YXBlIHN1cHBvcnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWJvcnQgcmVhZCBwaXBlbGluZSBvbiBFT0QuCisgKiAgICAgICAgICAgICAgICAgICAgICAgV2FpdCBmb3IgdGhlIHRhcGUgdG8gYmVjb21lIHJlYWR5IGluIGNhc2UgaXQgcmV0dXJucworICogICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHkiIG9uIG9wZW4oKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggemVybyBwYWRkaW5nIG9mIHRoZSBsYXN0IHdyaXR0ZW4gYmxvY2sgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGUgdGFwZSBibG9jayBzaXplIGlzIGxhcmdlciB0aGFuIFBBR0VfU0laRS4KKyAqICAgICAgICAgICAgICAgICAgICAgICBEZWNyZWFzZSB0aGUgZGVmYXVsdCBkaXNjb25uZWN0aW9uIHRpbWUgdG8gdG4uCisgKiBWZXIgMS4xNmUgT2N0ICAzIDk5ICAgTWlub3IgZml4ZXMuCisgKiBWZXIgMS4xNmUxIE9jdCAxMyA5OSAgUGF0Y2hlcyBieSBBcm5vbGQgTmllc3NlbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBuaWVzc2VuQGlhZS5ubCAvIGFybm9sZC5uaWVzc2VuQHBoaWxpcHMuY29tCisgKiAgICAgICAgICAgICAgICAgICBHTy0xKSAgVW5kZWZpbmVkIGNvZGUgaW4gaWRldGFwZV9yZWFkX3Bvc2l0aW9uCisgKgkJCQlhY2NvcmRpbmcgdG8gR2FkaSdzIGVtYWlsCisgKiAgICAgICAgICAgICAgICAgICBBSk4tMSkgTWlub3IgZml4IGFzYyA9PSAxMSBzaG91bGQgYmUgYXNjID09IDB4MTEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGlkZXRhcGVfaXNzdWVfcGFja2V0X2NvbW1hbmQgKGRpZCBlZmZlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2luZyBvdXRwdXQgb25seSkKKyAqICAgICAgICAgICAgICAgICAgIEFKTi0yKSBBZGRlZCBtb3JlIGRlYnVnZ2luZyBvdXRwdXQsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBpZGUtdGFwZTogd2hlcmUgbWlzc2luZy4gSSB3b3VsZCBhbHNvCisgKgkJCQlsaWtlIHRvIGFkZCB0YXBlLT5uYW1lIHdoZXJlIHBvc3NpYmxlCisgKiAgICAgICAgICAgICAgICAgICBBSk4tMykgQWRkZWQgZGlmZmVyZW50IGRlYnVnX2xldmVsJ3MgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSAvcHJvYy9pZGUvaGRjL3NldHRpbmdzCisgKiAJCQkJImRlYnVnX2xldmVsIiBkZXRlcm1pbmVzIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0OworICogCQkJCWNhbiBiZSBjaGFuZ2VkIHVzaW5nIC9wcm9jL2lkZS9oZHgvc2V0dGluZ3MKKyAqIAkJCQkwIDogYWxtb3N0IG5vIGRlYnVnZ2luZyBvdXRwdXQKKyAqIAkJCQkxIDogMCtvdXRwdXQgZXJyb3JzIG9ubHkKKyAqIAkJCQkyIDogMStvdXRwdXQgYWxsIHNlbnNla2V5L2FzYworICogCQkJCTMgOiAyK2ZvbGxvdyBhbGwgY2hyZGV2IHJlbGF0ZWQgcHJvY2VkdXJlcworICogCQkJCTQgOiAzK2ZvbGxvdyBhbGwgcHJvY2VkdXJlcworICogCQkJCTUgOiA0K2luY2x1ZGUgcGNfc3RhY2sgcnFfc3RhY2sgaW5mbworICogCQkJCTYgOiA1K1VTRV9DT1VOVCB1cGRhdGVzCisgKiAgICAgICAgICAgICAgICAgICBBSk4tNCkgRml4ZWQgdGltZW91dCBmb3IgcmV0ZW5zaW9uIGluIGlkZXRhcGVfcXVldWVfcGNfdGFpbAorICoJCQkJZnJvbSA1IHRvIDEwIG1pbnV0ZXMKKyAqICAgICAgICAgICAgICAgICAgIEFKTi01KSBDaGFuZ2VkIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB0byBza2lwIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0YXBlcyB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHdyaXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyBmcm9tIDEwMCB0byAxMDAwIGluIGlkZXRhcGVfZ2V0X2xvZ2ljYWxfYmxrCisgKiAgICAgICAgICAgICAgICAgICBQcm9wb3NlZCBjaGFuZ2VzIHRvIGNvZGU6CisgKiAgICAgICAgICAgICAgICAgICAxKSBvdXRwdXQgImxvZ2ljYWxfYmxrX251bSIgdmlhIC9wcm9jCisgKiAgICAgICAgICAgICAgICAgICAyKSBvdXRwdXQgImN1cnJlbnRfb3BlcmF0aW9uIiB2aWEgL3Byb2MKKyAqICAgICAgICAgICAgICAgICAgIDMpIEVpdGhlciBzb2x2ZSBvciBkb2N1bWVudCB0aGUgZmFjdCB0aGF0IGBtdCByZXdpbmQnIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBhZnRlciByZWFkaW5nIGZyb20gL2Rldi9uaHR4IHRvIGJlCisgKgkJCWFibGUgdG8gcm1tb2QgdGhlIGlkZXRhcGUgbW9kdWxlOworICoJCQlBbHNvLCBzb21ldGltZXMgYW4gYXBwbGljYXRpb24gZmluaXNoZXMgYnV0IHRoZQorICoJCQlkZXZpY2UgcmVtYWlucyBgYnVzeScgZm9yIHNvbWUgdGltZS4gU2FtZSBjYXVzZSA/CisgKiAgICAgICAgICAgICAgICAgICBQcm9wb3NlZCBjaGFuZ2VzIHRvIHJlbGVhc2Utbm90ZXM6CisgKgkJICAgICA0KSB3cml0ZSBhIHNpbXBsZSBgcXVpY2tzdGFydCcgc2VjdGlvbiBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2Ugbm90ZXM7IEkgdm9sdW50ZWVyIGlmIHlvdSBkb24ndCB3YW50IHRvCisgKiAJCSAgICAgNSkgaW5jbHVkZSBhIHBvaW50ZXIgdG8gdmlkZW80bGludXggaW4gdGhlIGRvYworICogICAgICAgICAgICAgICAgICAgICAgdG8gc3RpbXVsYXRlIHZpZGVvIGFwcGxpY2F0aW9ucworICogICAgICAgICAgICAgICAgICAgNikgcmVsZWFzZSBub3RlcyBsaW5lcyAzMzEgYW5kIDM2MjogZXhwbGFpbiB3aGF0IGhhcHBlbnMKKyAqCQkJaWYgdGhlIGFwcGxpY2F0aW9uIGRhdGEgcmF0ZSBpcyBoaWdoZXIgdGhhbiAxMTAwIEtCL3M7IAorICoJCQlzaW1pbGFyIGFwcHJvYWNoIHRvIGxvd2VyLXRoYW4tNTAwIGtCL3MgPworICoJCSAgICAgNykgNi42IENvbXBhcmlzb247IHdvdWxkbid0IGl0IGJlIGJldHRlciB0byBhbGxvdyBkaWZmZXJlbnQgCisgKgkJCXN0cmF0ZWdpZXMgZm9yIHJlYWQgYW5kIHdyaXRlID8KKyAqCQkJV291bGRuJ3QgaXQgYmUgYmV0dGVyIHRvIGNvbnRyb2wgdGhlIHRhcGUgYnVmZmVyCisgKgkJCWNvbnRlbnRzIGluc3RlYWQgb2YgdGhlIGJhbmR3aWR0aCA/CisgKgkJICAgICA4KSBsaW5lIDUzNjogcmVwbGFjZSB3aWxsIGJ5IHdvdWxkIChpZiBJIHVuZGVyc3RhbmQKKyAqCQkJdGhpcyBzZWN0aW9uIGNvcnJlY3RseSwgYSBoeXBvdGhldGljYWwgYW5kIHVud2FudGVkIHNpdHVhdGlvbgorICoJCQkgaXMgYmVpbmcgZGVzY3JpYmVkKQorICogVmVyIDEuMTZmIERlYyAxNSA5OSAgIENoYW5nZSBwbGFjZSBvZiB0aGUgc2Vjb25kYXJ5IE9uU3RyZWFtIGhlYWRlciBmcmFtZXMuCisgKiBWZXIgMS4xNyAgTm92IDIwMDAgLyBKYW4gMjAwMSAgTWFyY2VsIE1vbCwgbWFyY2VsQG1lc2EubmwKKyAqCQkJLSBBZGQgaWRldGFwZV9vbnN0cmVhbV9tb2RlX3NlbnNlX3RhcGVfcGFyYW1ldGVyX3BhZ2UKKyAqCQkJICBmdW5jdGlvbiB0byBnZXQgdGFwZSBjYXBhY2l0eSBpbiBmcmFtZXM6IHRhcGUtPmNhcGFjaXR5LgorICoJCQktIEFkZCBzdXBwb3J0IGZvciBESS01MCBkcml2ZXMoIG9yIGFueSBESS0gZHJpdmUpLgorICoJCQktICd3b3JrYXJvdW5kJyBmb3IgcmVhZCBlcnJvci9ibGFuayBibG9jayBhcm91bmQgYmxvY2sgMzAwMC4KKyAqCQkJLSBJbXBsZW1lbnQgRWFybHkgd2FybmluZyBmb3IgZW5kIG9mIG1lZGlhIGZvciBPbnN0cmVhbS4KKyAqCQkJLSBDb3NtZXRpYyBjb2RlIGNoYW5nZXMgZm9yIHJlYWRhYmlsaXR5LgorICoJCQktIElkZXRhcGVfcG9zaXRpb25fdGFwZSBzaG91bGQgbm90IHVzZSBTS0lQIGJpdCBkdXJpbmcKKyAqCQkJICBPbnN0cmVhbSByZWFkIHJlY292ZXJ5LgorICoJCQktIEFkZCBjYXBhY2l0eSwgbG9naWNhbF9ibGtfbnVtIGFuZCBmaXJzdC9sYXN0X2ZyYW1lX3Bvc2l0aW9uCisgKgkJCSAgdG8gL3Byb2MvaWRlL2hkPy9zZXR0aW5ncy4KKyAqCQkJLSBNb2R1bGUgdXNlIGNvdW50IHdhcyBnb25lIGluIHRoZSBMaW51eCAyLjQgZHJpdmVyLgorICogVmVyIDEuMTdhIEFwciAyMDAxIFdpbGxlbSBSaWVkZSBvc3N0QHJpZWRlLm9yZworICogCQkJLSBHZXQgZHJpdmUncyBhY3R1YWwgYmxvY2sgc2l6ZSBmcm9tIG1vZGUgc2Vuc2UgYmxvY2sgZGVzY3JpcHRvcgorICogCQkJLSBMaW1pdCBzaXplIG9mIHBpcGVsaW5lCisgKiBWZXIgMS4xN2IgT2N0IDIwMDIgICBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgorICoJCQlDaGFuZ2VkIElERVRBUEVfTUlOX1BJUEVMSU5FX1NUQUdFUyB0byAxIGFuZCBhY3R1YWxseSB1c2VkCisgKgkJCSBpdCBpbiB0aGUgY29kZSEKKyAqCQkJQWN0dWFsbHkgcmVtb3ZlZCBhYm9ydGVkIHN0YWdlcyBpbiBpZGV0YXBlX2Fib3J0X3BpcGVsaW5lCisgKgkJCSBpbnN0ZWFkIG9mIGp1c3QgY2hhbmdpbmcgdGhlIGNvbW1hbmQgY29kZS4KKyAqCQkJTWFkZSB0aGUgdHJhbnNmZXIgYnl0ZSBjb3VudCBmb3IgUmVxdWVzdCBTZW5zZSBlcXVhbCB0byB0aGUKKyAqCQkJIGFjdHVhbCBsZW5ndGggb2YgdGhlIGRhdGEgdHJhbnNmZXIuCisgKgkJCUNoYW5nZWQgaGFuZGxpbmcgb2YgcGFydGlhbCBkYXRhIHRyYW5zZmVyczogdGhleSBkbyBub3QKKyAqCQkJIGNhdXNlIERNQSBlcnJvcnMuCisgKgkJCU1vdmVkIGluaXRpYXRpb24gb2YgRE1BIHRyYW5zZmVycyB0byB0aGUgY29ycmVjdCBwbGFjZS4KKyAqCQkJUmVtb3ZlZCByZWZlcmVuY2UgdG8gdW5hbGxvY2F0ZWQgbWVtb3J5LgorICoJCQlNYWRlIF9faWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAqCQkJIHNlY3RvcnMgc2tpcHBlZCwgbm90IHRoZSBudW1iZXIgb2Ygc3RhZ2VzLgorICoJCQlSZXBsYWNlZCBlcnJhbnQga2ZyZWUoKSBjYWxscyB3aXRoIF9faWRldGFwZV9rZnJlZV9zdGFnZSgpLgorICoJCQlGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIHRlc3RpbmcgdGhlIHBpcGVsaW5lIGxlbmd0aC4KKyAqCQkJRml4ZWQgaGFuZGxpbmcgb2YgZmlsZW1hcmtzIGluIHRoZSByZWFkIHBpcGVsaW5lLgorICoJCQlTbWFsbCBjb2RlIG9wdGltaXphdGlvbiBmb3IgTVRCU0YgYW5kIE1UQlNGTSBpb2N0bHMuCisgKgkJCURvbid0IHRyeSB0byB1bmxvY2sgdGhlIGRvb3IgZHVyaW5nIGRldmljZSBjbG9zZSBpZiBpcworICoJCQkgYWxyZWFkeSB1bmxvY2tlZCEKKyAqCQkJQ29zbWV0aWMgZml4ZXMgdG8gbWlzY2VsbGFuZW91cyBkZWJ1Z2dpbmcgb3V0cHV0IG1lc3NhZ2VzLgorICoJCQlTZXQgdGhlIG1pbmltdW0gL3Byb2MvaWRlL2hkPy9zZXR0aW5ncyB2YWx1ZXMgZm9yICJwaXBlbGluZSIsCisgKgkJCSAicGlwZWxpbmVfbWluIiwgYW5kICJwaXBlbGluZV9tYXgiIHRvIDEuCisgKgorICogSGVyZSBhcmUgc29tZSB3b3JkcyBmcm9tIHRoZSBmaXJzdCByZWxlYXNlcyBvZiBoZC5jLCB3aGljaCBhcmUgcXVvdGVkCisgKiBpbiBpZGUuYyBhbmQgYXBwbHkgaGVyZSBhcyB3ZWxsOgorICoKKyAqIHwgU3BlY2lhbCBjYXJlIGlzIHJlY29tbWVuZGVkLiAgSGF2ZSBGdW4hCisgKgorICovCisKKy8qCisgKiBBbiBvdmVydmlldyBvZiB0aGUgcGlwZWxpbmVkIG9wZXJhdGlvbiBtb2RlLgorICoKKyAqIEluIHRoZSBwaXBlbGluZWQgd3JpdGUgbW9kZSwgd2Ugd2lsbCB1c3VhbGx5IGp1c3QgYWRkIHJlcXVlc3RzIHRvIG91cgorICogcGlwZWxpbmUgYW5kIHJldHVybiBpbW1lZGlhdGVseSwgYmVmb3JlIHdlIGV2ZW4gc3RhcnQgdG8gc2VydmljZSB0aGVtLiBUaGUKKyAqIHVzZXIgcHJvZ3JhbSB3aWxsIHRoZW4gaGF2ZSBlbm91Z2ggdGltZSB0byBwcmVwYXJlIHRoZSBuZXh0IHJlcXVlc3Qgd2hpbGUKKyAqIHdlIGFyZSBzdGlsbCBidXN5IHNlcnZpY2luZyBwcmV2aW91cyByZXF1ZXN0cy4gSW4gdGhlIHBpcGVsaW5lZCByZWFkIG1vZGUsCisgKiB0aGUgc2l0dWF0aW9uIGlzIHNpbWlsYXIgLSB3ZSBhZGQgcmVhZC1haGVhZCByZXF1ZXN0cyBpbnRvIHRoZSBwaXBlbGluZSwKKyAqIGJlZm9yZSB0aGUgdXNlciBldmVuIHJlcXVlc3RlZCB0aGVtLgorICoKKyAqIFRoZSBwaXBlbGluZSBjYW4gYmUgdmlld2VkIGFzIGEgInNhZmV0eSBuZXQiIHdoaWNoIHdpbGwgYmUgYWN0aXZhdGVkIHdoZW4KKyAqIHRoZSBzeXN0ZW0gbG9hZCBpcyBoaWdoIGFuZCBwcmV2ZW50cyB0aGUgdXNlciBiYWNrdXAgcHJvZ3JhbSBmcm9tIGtlZXBpbmcgdXAKKyAqIHdpdGggdGhlIGN1cnJlbnQgdGFwZSBzcGVlZC4gQXQgdGhpcyBwb2ludCwgdGhlIHBpcGVsaW5lIHdpbGwgZ2V0CisgKiBzaG9ydGVyIGFuZCBzaG9ydGVyIGJ1dCB0aGUgdGFwZSB3aWxsIHN0aWxsIGJlIHN0cmVhbWluZyBhdCB0aGUgc2FtZSBzcGVlZC4KKyAqIEFzc3VtaW5nIHdlIGhhdmUgZW5vdWdoIHBpcGVsaW5lIHN0YWdlcywgdGhlIHN5c3RlbSBsb2FkIHdpbGwgaG9wZWZ1bGx5CisgKiBkZWNyZWFzZSBiZWZvcmUgdGhlIHBpcGVsaW5lIGlzIGNvbXBsZXRlbHkgZW1wdHksIGFuZCB0aGUgYmFja3VwIHByb2dyYW0KKyAqIHdpbGwgYmUgYWJsZSB0byAiY2F0Y2ggdXAiIGFuZCByZWZpbGwgdGhlIHBpcGVsaW5lIGFnYWluLgorICogCisgKiBXaGVuIHVzaW5nIHRoZSBwaXBlbGluZWQgbW9kZSwgaXQgd291bGQgYmUgYmVzdCB0byBkaXNhYmxlIGFueSB0eXBlIG9mCisgKiBidWZmZXJpbmcgZG9uZSBieSB0aGUgdXNlciBwcm9ncmFtLCBhcyBpZGUtdGFwZSBhbHJlYWR5IHByb3ZpZGVzIGFsbCB0aGUKKyAqIGJlbmVmaXRzIGluIHRoZSBrZXJuZWwsIHdoZXJlIGl0IGNhbiBiZSBkb25lIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5LgorICogQXMgd2Ugd2lsbCB1c3VhbGx5IG5vdCBibG9jayB0aGUgdXNlciBwcm9ncmFtIG9uIGEgcmVxdWVzdCwgdGhlIG1vc3QKKyAqIGVmZmljaWVudCB1c2VyIGNvZGUgd2lsbCB0aGVuIGJlIGEgc2ltcGxlIHJlYWQtd3JpdGUtcmVhZC0uLi4gY3ljbGUuCisgKiBBbnkgYWRkaXRpb25hbCBsb2dpYyB3aWxsIHVzdWFsbHkganVzdCBzbG93IGRvd24gdGhlIGJhY2t1cCBwcm9jZXNzLgorICoKKyAqIFVzaW5nIHRoZSBwaXBlbGluZWQgbW9kZSwgSSBnZXQgYSBjb25zdGFudCBvdmVyIDQwMCBLQnBzIHRocm91Z2hwdXQsCisgKiB3aGljaCBzZWVtcyB0byBiZSB0aGUgbWF4aW11bSB0aHJvdWdocHV0IHN1cHBvcnRlZCBieSBteSB0YXBlLgorICoKKyAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGRvd25mYWxsczoKKyAqCisgKgkxLglXZSB1c2UgbWVtb3J5IChmb3IgZGF0YSBidWZmZXJzKSBpbiBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlcgorICoJCW9mIHBpcGVsaW5lIHN0YWdlcyAoZWFjaCBzdGFnZSBpcyBhYm91dCAyNiBLQiB3aXRoIG15IHRhcGUpLgorICoJMi4JSW4gdGhlIHBpcGVsaW5lZCB3cml0ZSBtb2RlLCB3ZSBjaGVhdCBhbmQgcG9zdHBvbmUgZXJyb3IgY29kZXMKKyAqCQl0byB0aGUgdXNlciB0YXNrLiBJbiByZWFkIG1vZGUsIHRoZSBhY3R1YWwgdGFwZSBwb3NpdGlvbgorICoJCXdpbGwgYmUgYSBiaXQgZnVydGhlciB0aGFuIHRoZSBsYXN0IHJlcXVlc3RlZCBibG9jay4KKyAqCisgKiBDb25jZXJuaW5nICgxKToKKyAqCisgKgkxLglXZSBhbGxvY2F0ZSBzdGFnZXMgZHluYW1pY2FsbHkgb25seSB3aGVuIHdlIG5lZWQgdGhlbS4gV2hlbgorICoJCXdlIGRvbid0IG5lZWQgdGhlbSwgd2UgZG9uJ3QgY29uc3VtZSBhZGRpdGlvbmFsIG1lbW9yeS4gSW4KKyAqCQljYXNlIHdlIGNhbid0IGFsbG9jYXRlIHN0YWdlcywgd2UganVzdCBtYW5hZ2Ugd2l0aG91dCB0aGVtCisgKgkJKGF0IHRoZSBleHBlbnNlIG9mIGRlY3JlYXNlZCB0aHJvdWdocHV0KSBzbyB3aGVuIExpbnV4IGlzCisgKgkJdGlnaHQgaW4gbWVtb3J5LCB3ZSB3aWxsIG5vdCBwb3NlIGFkZGl0aW9uYWwgZGlmZmljdWx0aWVzLgorICoKKyAqCTIuCVRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFnZXMgKHdoaWNoIGlzLCBpbiBmYWN0LCB0aGUgbWF4aW11bQorICoJCWFtb3VudCBvZiBtZW1vcnkpIHdoaWNoIHdlIGFsbG9jYXRlIGlzIGxpbWl0ZWQgYnkgdGhlIGNvbXBpbGUKKyAqCQl0aW1lIHBhcmFtZXRlciBJREVUQVBFX01BWF9QSVBFTElORV9TVEFHRVMuCisgKgorICoJMy4JVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWdlcyBpcyBhIGNvbnRyb2xsZWQgcGFyYW1ldGVyIC0gV2UKKyAqCQlkb24ndCBzdGFydCBmcm9tIHRoZSB1c2VyIGRlZmluZWQgbWF4aW11bSBudW1iZXIgb2Ygc3RhZ2VzCisgKgkJYnV0IGZyb20gdGhlIGxvd2VyIElERVRBUEVfTUlOX1BJUEVMSU5FX1NUQUdFUyAoYWdhaW4sIHdlCisgKgkJd2lsbCBub3QgZXZlbiBhbGxvY2F0ZSB0aGlzIGFtb3VudCBvZiBzdGFnZXMgaWYgdGhlIHVzZXIKKyAqCQlwcm9ncmFtIGNhbid0IGhhbmRsZSB0aGUgc3BlZWQpLiBXZSB0aGVuIGltcGxlbWVudCBhIGZlZWRiYWNrCisgKgkJbG9vcCB3aGljaCBjaGVja3MgaWYgdGhlIHBpcGVsaW5lIGlzIGVtcHR5LCBhbmQgaWYgaXQgaXMsIHdlCisgKgkJaW5jcmVhc2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWdlcyBhcyBuZWNlc3NhcnkgdW50aWwgd2UKKyAqCQlyZWFjaCB0aGUgb3B0aW11bSB2YWx1ZSB3aGljaCBqdXN0IG1hbmFnZXMgdG8ga2VlcCB0aGUgdGFwZQorICoJCWJ1c3kgd2l0aCBtaW5pbXVtIGFsbG9jYXRlZCBtZW1vcnkgb3IgdW50aWwgd2UgcmVhY2gKKyAqCQlJREVUQVBFX01BWF9QSVBFTElORV9TVEFHRVMuCisgKgorICogQ29uY2VybmluZyAoMik6CisgKgorICoJSW4gcGlwZWxpbmVkIHdyaXRlIG1vZGUsIGlkZS10YXBlIGNhbiBub3QgcmV0dXJuIGFjY3VyYXRlIGVycm9yIGNvZGVzCisgKgl0byB0aGUgdXNlciBwcm9ncmFtIHNpbmNlIHdlIHVzdWFsbHkganVzdCBhZGQgdGhlIHJlcXVlc3QgdG8gdGhlCisgKiAgICAgIHBpcGVsaW5lIHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gYmUgc2VydmljZWQuIEluIGNhc2UgYW4gZXJyb3IKKyAqICAgICAgb2NjdXJzLCBJIHdpbGwgcmVwb3J0IGl0IG9uIHRoZSBuZXh0IHVzZXIgcmVxdWVzdC4KKyAqCisgKglJbiB0aGUgcGlwZWxpbmVkIHJlYWQgbW9kZSwgc3Vic2VxdWVudCByZWFkIHJlcXVlc3RzIG9yIGZvcndhcmQKKyAqCWZpbGVtYXJrIHNwYWNpbmcgd2lsbCBwZXJmb3JtIGNvcnJlY3RseSwgYXMgd2UgcHJlc2VydmUgYWxsIGJsb2NrcworICoJYW5kIGZpbGVtYXJrcyB3aGljaCB3ZSBlbmNvdW50ZXJlZCBkdXJpbmcgb3VyIGV4Y2VzcyByZWFkLWFoZWFkLgorICogCisgKglGb3IgYWNjdXJhdGUgdGFwZSBwb3NpdGlvbmluZyBhbmQgZXJyb3IgcmVwb3J0aW5nLCBkaXNhYmxpbmcKKyAqCXBpcGVsaW5lZCBtb2RlIG1pZ2h0IGJlIHRoZSBiZXN0IG9wdGlvbi4KKyAqCisgKiBZb3UgY2FuIGVuYWJsZS9kaXNhYmxlL3R1bmUgdGhlIHBpcGVsaW5lZCBvcGVyYXRpb24gbW9kZSBieSBhZGp1c3RpbmcKKyAqIHRoZSBjb21waWxlIHRpbWUgcGFyYW1ldGVycyBiZWxvdy4KKyAqLworCisvKgorICoJUG9zc2libGUgaW1wcm92ZW1lbnRzLgorICoKKyAqCTEuCVN1cHBvcnQgZm9yIHRoZSBBVEFQSSBvdmVybGFwIHByb3RvY29sLgorICoKKyAqCQlJbiBvcmRlciB0byBtYXhpbWl6ZSBidXMgdGhyb3VnaHB1dCwgd2UgY3VycmVudGx5IHVzZSB0aGUgRFNDCisgKgkJb3ZlcmxhcCBtZXRob2Qgd2hpY2ggZW5hYmxlcyBpZGUuYyB0byBzZXJ2aWNlIHJlcXVlc3RzIGZyb20gdGhlCisgKgkJb3RoZXIgZGV2aWNlIHdoaWxlIHRoZSB0YXBlIGlzIGJ1c3kgZXhlY3V0aW5nIGEgY29tbWFuZC4gVGhlCisgKgkJRFNDIG92ZXJsYXAgbWV0aG9kIGludm9sdmVzIHBvbGxpbmcgdGhlIHRhcGUncyBzdGF0dXMgcmVnaXN0ZXIKKyAqCQlmb3IgdGhlIERTQyBiaXQsIGFuZCBzZXJ2aWNpbmcgdGhlIG90aGVyIGRldmljZSB3aGlsZSB0aGUgdGFwZQorICoJCWlzbid0IHJlYWR5LgorICoKKyAqCQlJbiB0aGUgY3VycmVudCBRSUMgZGV2ZWxvcG1lbnQgc3RhbmRhcmQgKERlY2VtYmVyIDE5OTUpLAorICoJCWl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmV3IHRhcGUgZHJpdmVzIHdpbGwgKmluIGFkZGl0aW9uKiAKKyAqCQlpbXBsZW1lbnQgdGhlIEFUQVBJIG92ZXJsYXAgcHJvdG9jb2wsIHdoaWNoIGlzIHVzZWQgZm9yIHRoZQorICoJCXNhbWUgcHVycG9zZSAtIGVmZmljaWVudCB1c2Ugb2YgdGhlIElERSBidXMsIGJ1dCBpcyBpbnRlcnJ1cHQKKyAqCQlkcml2ZW4gYW5kIHRodXMgaGFzIG11Y2ggbGVzcyBDUFUgb3ZlcmhlYWQuCisgKgorICoJCUFUQVBJIG92ZXJsYXAgaXMgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZCBpbiBtb3N0IG5ldyBBVEFQSQorICoJCWRldmljZXMsIGluY2x1ZGluZyBuZXcgQVRBUEkgY2Ryb21zLCBhbmQgdGh1cyBwcm92aWRlcyB1cworICoJCWEgbWV0aG9kIGJ5IHdoaWNoIHdlIGNhbiBhY2hpZXZlIGhpZ2hlciB0aHJvdWdocHV0IHdoZW4KKyAqCQlzaGFyaW5nIGEgKGZhc3QpIEFUQS0yIGRpc2sgd2l0aCBhbnkgKHNsb3cpIG5ldyBBVEFQSSBkZXZpY2UuCisgKi8KKworI2RlZmluZSBJREVUQVBFX1ZFUlNJT04gIjEuMTkiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKy8qCisgKiBwYXJ0aXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3NfcGFydGl0aW9uX3MgeworCV9fdTgJcGFydGl0aW9uX251bTsKKwlfX3U4CXBhcl9kZXNjX3ZlcjsKKwlfX3UxNgl3cnRfcGFzc19jbnRyOworCV9fdTMyCWZpcnN0X2ZyYW1lX2FkZHI7CisJX191MzIJbGFzdF9mcmFtZV9hZGRyOworCV9fdTMyCWVvZF9mcmFtZV9hZGRyOworfSBvc19wYXJ0aXRpb25fdDsKKworLyoKKyAqIERBVCBlbnRyeQorICovCit0eXBlZGVmIHN0cnVjdCBvc19kYXRfZW50cnlfcyB7CisJX191MzIJYmxrX3N6OworCV9fdTE2CWJsa19jbnQ7CisJX191OAlmbGFnczsKKwlfX3U4CXJlc2VydmVkOworfSBvc19kYXRfZW50cnlfdDsKKworLyoKKyAqIERBVAorICovCisjZGVmaW5lIE9TX0RBVF9GTEFHU19EQVRBCSgweGMpCisjZGVmaW5lIE9TX0RBVF9GTEFHU19NQVJLCSgweDEpCisKK3R5cGVkZWYgc3RydWN0IG9zX2RhdF9zIHsKKwlfX3U4CQlkYXRfc3o7CisJX191OAkJcmVzZXJ2ZWQxOworCV9fdTgJCWVudHJ5X2NudDsKKwlfX3U4CQlyZXNlcnZlZDM7CisJb3NfZGF0X2VudHJ5X3QJZGF0X2xpc3RbMTZdOworfSBvc19kYXRfdDsKKworI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVHVuYWJsZSBwYXJhbWV0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKglQaXBlbGluZWQgbW9kZSBwYXJhbWV0ZXJzLgorICoKKyAqCVdlIHRyeSB0byB1c2UgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHN0YWdlcyB3aGljaCBpcyBlbm91Z2ggdG8KKyAqCWtlZXAgdGhlIHRhcGUgY29uc3RhbnRseSBzdHJlYW1pbmcuIFRvIGFjY29tcGxpc2ggdGhhdCwgd2UgaW1wbGVtZW50CisgKglhIGZlZWRiYWNrIGxvb3AgYXJvdW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFnZXM6CisgKgorICoJV2Ugc3RhcnQgZnJvbSBNSU4gbWF4aW11bSBzdGFnZXMgKHdlIHdpbGwgbm90IGV2ZW4gdXNlIE1JTiBzdGFnZXMKKyAqICAgICAgaWYgd2UgZG9uJ3QgbmVlZCB0aGVtKSwgaW5jcmVtZW50IGl0IGJ5IFJBVEUqKE1BWC1NSU4pCisgKgl3aGVuZXZlciB3ZSBzZW5zZSB0aGF0IHRoZSBwaXBlbGluZSBpcyBlbXB0eSwgdW50aWwgd2UgcmVhY2gKKyAqCXRoZSBvcHRpbXVtIHZhbHVlIG9yIHVudGlsIHdlIHJlYWNoIE1BWC4KKyAqCisgKglTZXR0aW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHRvIDAgaXMgaWxsZWdhbDogdGhlIHBpcGVsaW5lZCBtb2RlCisgKgljYW5ub3QgYmUgZGlzYWJsZWQgKGNhbGN1bGF0ZV9zcGVlZHMoKSBkaXZpZGVzIGJ5IHRhcGUtPm1heF9zdGFnZXMuKQorICovCisjZGVmaW5lIElERVRBUEVfTUlOX1BJUEVMSU5FX1NUQUdFUwkgIDEKKyNkZWZpbmUgSURFVEFQRV9NQVhfUElQRUxJTkVfU1RBR0VTCTQwMAorI2RlZmluZSBJREVUQVBFX0lOQ1JFQVNFX1NUQUdFU19SQVRFCSAyMAorCisvKgorICoJVGhlIGZvbGxvd2luZyBhcmUgdXNlZCB0byBkZWJ1ZyB0aGUgZHJpdmVyOgorICoKKyAqCVNldHRpbmcgSURFVEFQRV9ERUJVR19JTkZPIHRvIDEgd2lsbCByZXBvcnQgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqCVNldHRpbmcgSURFVEFQRV9ERUJVR19MT0cgdG8gMSB3aWxsIGxvZyBkcml2ZXIgZmxvdyBjb250cm9sLgorICoJU2V0dGluZyBJREVUQVBFX0RFQlVHX0JVR1MgdG8gMSB3aWxsIGVuYWJsZSBzZWxmLXNhbml0eSBjaGVja3MgaW4KKyAqCXNvbWUgcGxhY2VzLgorICoKKyAqCVNldHRpbmcgdGhlbSB0byAwIHdpbGwgcmVzdG9yZSBub3JtYWwgb3BlcmF0aW9uIG1vZGU6CisgKgorICoJCTEuCURpc2FibGUgbG9nZ2luZyBub3JtYWwgc3VjY2Vzc2Z1bCBvcGVyYXRpb25zLgorICoJCTIuCURpc2FibGUgc2VsZi1zYW5pdHkgY2hlY2tzLgorICoJCTMuCUVycm9ycyB3aWxsIHN0aWxsIGJlIGxvZ2dlZCwgb2YgY291cnNlLgorICoKKyAqCUFsbCB0aGUgI2lmIERFQlVHIGNvZGUgd2lsbCBiZSByZW1vdmVkIHNvbWUgZGF5LCB3aGVuIHRoZSBkcml2ZXIKKyAqCWlzIHZlcmlmaWVkIHRvIGJlIHN0YWJsZSBlbm91Z2guIFRoaXMgd2lsbCBtYWtlIGl0IG11Y2ggbW9yZQorICoJZXN0aGV0aWMuCisgKi8KKyNkZWZpbmUgSURFVEFQRV9ERUJVR19JTkZPCQkwCisjZGVmaW5lIElERVRBUEVfREVCVUdfTE9HCQkwCisjZGVmaW5lIElERVRBUEVfREVCVUdfQlVHUwkJMQorCisvKgorICoJQWZ0ZXIgZWFjaCBmYWlsZWQgcGFja2V0IGNvbW1hbmQgd2UgaXNzdWUgYSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQKKyAqCWFuZCByZXRyeSB0aGUgcGFja2V0IGNvbW1hbmQgSURFVEFQRV9NQVhfUENfUkVUUklFUyB0aW1lcy4KKyAqCisgKglTZXR0aW5nIElERVRBUEVfTUFYX1BDX1JFVFJJRVMgdG8gMCB3aWxsIGRpc2FibGUgcmV0cmllcy4KKyAqLworI2RlZmluZSBJREVUQVBFX01BWF9QQ19SRVRSSUVTCQkzCisKKy8qCisgKglXaXRoIGVhY2ggcGFja2V0IGNvbW1hbmQsIHdlIGFsbG9jYXRlIGEgYnVmZmVyIG9mCisgKglJREVUQVBFX1BDX0JVRkZFUl9TSVpFIGJ5dGVzLiBUaGlzIGlzIHVzZWQgZm9yIHNldmVyYWwgcGFja2V0CisgKgljb21tYW5kcyAoTm90IGZvciBSRUFEL1dSSVRFIGNvbW1hbmRzKS4KKyAqLworI2RlZmluZSBJREVUQVBFX1BDX0JVRkZFUl9TSVpFCQkyNTYKKworLyoKKyAqCUluIHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkcml2ZXIsIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3RvcmFnZQorICoJZm9yIHBhY2tldCBjb21tYW5kcyBhbmQgcmVxdWVzdHMsIHdoaWNoIHdpbGwgcmVtYWluIHZhbGlkIHdoaWxlCisgKgl3ZSBsZWF2ZSB0aGUgZHJpdmVyIHRvIHdhaXQgZm9yIGFuIGludGVycnVwdCBvciBhIHRpbWVvdXQgZXZlbnQuCisgKi8KKyNkZWZpbmUgSURFVEFQRV9QQ19TVEFDSwkJKDEwICsgSURFVEFQRV9NQVhfUENfUkVUUklFUykKKworLyoKKyAqIFNvbWUgZHJpdmVzIChmb3IgZXhhbXBsZSwgU2VhZ2F0ZSBTVFQzNDAxQSBUcmF2YW4pIHJlcXVpcmUgYSB2ZXJ5IGxvbmcKKyAqIHRpbWVvdXQsIGJlY2F1c2UgdGhleSBkb24ndCByZXR1cm4gYW4gaW50ZXJydXB0IG9yIGNsZWFyIHRoZWlyIGJ1c3kgYml0CisgKiB1bnRpbCBhZnRlciB0aGUgY29tbWFuZCBjb21wbGV0ZXMgKGV2ZW4gcmV0ZW5zaW9uIGNvbW1hbmRzKS4KKyAqLworI2RlZmluZSBJREVUQVBFX1dBSVRfQ01ECQkoOTAwKkhaKQorCisvKgorICoJVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvaW50IGluIHRoZSBpbnRlcm5hbAorICoJdGFwZSBmaWZvIGluIHdoaWNoIHdlIHdpbGwgc3RhcnQgdG8gcmVmaWxsIHRoZSBidWZmZXIuIERlY3JlYXNpbmcKKyAqCXRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgaW1wcm92ZSB0aGUgc3lzdGVtJ3MgbGF0ZW5jeSBhbmQKKyAqCWludGVyYWN0aXZlIHJlc3BvbnNlLCB3aGlsZSB1c2luZyBhIGhpZ2ggdmFsdWUgbWlnaHQgaW1wcm92ZSBzeXRlbQorICoJdGhyb3VnaHB1dC4KKyAqLworI2RlZmluZSBJREVUQVBFX0ZJRk9fVEhSRVNIT0xEIAkJMgorCisvKgorICoJRFNDIHBvbGxpbmcgcGFyYW1ldGVycy4KKyAqCisgKglQb2xsaW5nIGZvciBEU0MgKGEgc2luZ2xlIGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyKSBpcyBhIHZlcnkKKyAqCWltcG9ydGFudCBmdW5jdGlvbiBpbiBpZGUtdGFwZS4gVGhlcmUgYXJlIHR3byBjYXNlcyBpbiB3aGljaCB3ZQorICoJcG9sbCBmb3IgRFNDOgorICoKKyAqCTEuCUJlZm9yZSBhIHJlYWQvd3JpdGUgcGFja2V0IGNvbW1hbmQsIHRvIGVuc3VyZSB0aGF0IHdlCisgKgkJY2FuIHRyYW5zZmVyIGRhdGEgZnJvbS90byB0aGUgdGFwZSdzIGRhdGEgYnVmZmVycywgd2l0aG91dAorICoJCWNhdXNpbmcgYW4gYWN0dWFsIG1lZGlhIGFjY2Vzcy4gSW4gY2FzZSB0aGUgdGFwZSBpcyBub3QKKyAqCQlyZWFkeSB5ZXQsIHdlIHRha2Ugb3V0IG91ciByZXF1ZXN0IGZyb20gdGhlIGRldmljZQorICoJCXJlcXVlc3QgcXVldWUsIHNvIHRoYXQgaWRlLmMgd2lsbCBzZXJ2aWNlIHJlcXVlc3RzIGZyb20KKyAqCQl0aGUgb3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIGludGVyZmFjZSBtZWFud2hpbGUuCisgKgorICoJMi4JQWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24gb2YgYSAibWVkaWEgYWNjZXNzCisgKgkJcGFja2V0IGNvbW1hbmQiLCB3aGljaCBpcyBhIGNvbW1hbmQgd2hpY2ggY2FuIHRha2UgYSBsb25nCisgKgkJdGltZSB0byBjb21wbGV0ZSAoaXQgY2FuIGJlIHNldmVyYWwgc2Vjb25kcyBvciBldmVuIGFuIGhvdXIpLgorICoKKyAqCQlBZ2Fpbiwgd2UgcG9zdHBvbmUgb3VyIHJlcXVlc3QgaW4gdGhlIG1pZGRsZSB0byBmcmVlIHRoZSBidXMKKyAqCQlmb3IgdGhlIG90aGVyIGRldmljZS4gVGhlIHBvbGxpbmcgZnJlcXVlbmN5IGhlcmUgc2hvdWxkIGJlCisgKgkJbG93ZXIgdGhhbiB0aGUgcmVhZC93cml0ZSBmcmVxdWVuY3kgc2luY2UgdGhvc2UgbWVkaWEgYWNjZXNzCisgKgkJY29tbWFuZHMgYXJlIHNsb3cuIFdlIHN0YXJ0IGZyb20gYSAiZmFzdCIgZnJlcXVlbmN5IC0KKyAqCQlJREVUQVBFX0RTQ19NQV9GQVNUIChvbmUgc2Vjb25kKSwgYW5kIGlmIHdlIGRvbid0IHJlY2VpdmUgRFNDCisgKgkJYWZ0ZXIgSURFVEFQRV9EU0NfTUFfVEhSRVNIT0xEICg1IG1pbnV0ZXMpLCB3ZSBzd2l0Y2ggaXQgdG8gYQorICoJCWxvd2VyIGZyZXF1ZW5jeSAtIElERVRBUEVfRFNDX01BX1NMT1cgKDEgbWludXRlKS4KKyAqCisgKglXZSBhbHNvIHNldCBhIHRpbWVvdXQgZm9yIHRoZSB0aW1lciwgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqCVRoZSB0aW1lb3V0IHNob3VsZCBiZSBsb25nZXIgdGhlbiB0aGUgbWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhCisgKgl0YXBlIG9wZXJhdGlvbi4KKyAqLworIAorLyoKKyAqCURTQyB0aW1pbmdzLgorICovCisjZGVmaW5lIElERVRBUEVfRFNDX1JXX01JTgkJNSpIWi8xMDAJLyogNTAgbXNlYyAqLworI2RlZmluZSBJREVUQVBFX0RTQ19SV19NQVgJCTQwKkhaLzEwMAkvKiA0MDAgbXNlYyAqLworI2RlZmluZSBJREVUQVBFX0RTQ19SV19USU1FT1VUCQkyKjYwKkhaCQkvKiAyIG1pbnV0ZXMgKi8KKyNkZWZpbmUgSURFVEFQRV9EU0NfTUFfRkFTVAkJMipIWgkJLyogMiBzZWNvbmRzICovCisjZGVmaW5lIElERVRBUEVfRFNDX01BX1RIUkVTSE9MRAk1KjYwKkhaCQkvKiA1IG1pbnV0ZXMgKi8KKyNkZWZpbmUgSURFVEFQRV9EU0NfTUFfU0xPVwkJMzAqSFoJCS8qIDMwIHNlY29uZHMgKi8KKyNkZWZpbmUgSURFVEFQRV9EU0NfTUFfVElNRU9VVAkJMio2MCo2MCpIWgkvKiAyIGhvdXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIHR1bmFibGUgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlYnVnZ2luZy9QZXJmb3JtYW5jZSBhbmFseXNpcworICoKKyAqCUkvTyB0cmFjZSBzdXBwb3J0CisgKi8KKyNkZWZpbmUgVVNFX0lPVFJBQ0UJMAorI2lmIFVTRV9JT1RSQUNFCisjaW5jbHVkZSA8bGludXgvaW9fdHJhY2UuaD4KKyNkZWZpbmUgSU9fSURFVEFQRV9GSUZPCTUwMAorI2VuZGlmCisKKy8qCisgKglSZWFkL1dyaXRlIGVycm9yIHNpbXVsYXRpb24KKyAqLworI2RlZmluZSBTSU1VTEFURV9FUlJPUlMJCQkwCisKKy8qCisgKglGb3IgZ2VuZXJhbCBtYWduZXRpYyB0YXBlIGRldmljZSBjb21wYXRpYmlsaXR5LgorICovCit0eXBlZGVmIGVudW0geworCWlkZXRhcGVfZGlyZWN0aW9uX25vbmUsCisJaWRldGFwZV9kaXJlY3Rpb25fcmVhZCwKKwlpZGV0YXBlX2RpcmVjdGlvbl93cml0ZQorfSBpZGV0YXBlX2NocmRldl9kaXJlY3Rpb25fdDsKKworc3RydWN0IGlkZXRhcGVfYmggeworCXVuc2lnbmVkIHNob3J0IGJfc2l6ZTsKKwlhdG9taWNfdCBiX2NvdW50OworCXN0cnVjdCBpZGV0YXBlX2JoICpiX3JlcW5leHQ7CisJY2hhciAqYl9kYXRhOworfTsKKworLyoKKyAqCU91ciB2aWV3IG9mIGEgcGFja2V0IGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZXRhcGVfcGFja2V0X2NvbW1hbmRfcyB7CisJdTggY1sxMl07CQkJCS8qIEFjdHVhbCBwYWNrZXQgYnl0ZXMgKi8KKwlpbnQgcmV0cmllczsJCQkJLyogT24gZWFjaCByZXRyeSwgd2UgaW5jcmVtZW50IHJldHJpZXMgKi8KKwlpbnQgZXJyb3I7CQkJCS8qIEVycm9yIGNvZGUgKi8KKwlpbnQgcmVxdWVzdF90cmFuc2ZlcjsJCQkvKiBCeXRlcyB0byB0cmFuc2ZlciAqLworCWludCBhY3R1YWxseV90cmFuc2ZlcnJlZDsJCS8qIEJ5dGVzIGFjdHVhbGx5IHRyYW5zZmVycmVkICovCisJaW50IGJ1ZmZlcl9zaXplOwkJCS8qIFNpemUgb2Ygb3VyIGRhdGEgYnVmZmVyICovCisJc3RydWN0IGlkZXRhcGVfYmggKmJoOworCWNoYXIgKmJfZGF0YTsKKwlpbnQgYl9jb3VudDsKKwl1OCAqYnVmZmVyOwkJCQkvKiBEYXRhIGJ1ZmZlciAqLworCXU4ICpjdXJyZW50X3Bvc2l0aW9uOwkJCS8qIFBvaW50ZXIgaW50byB0aGUgYWJvdmUgYnVmZmVyICovCisJaWRlX3N0YXJ0c3RvcF90ICgqY2FsbGJhY2spIChpZGVfZHJpdmVfdCAqKTsJLyogQ2FsbGVkIHdoZW4gdGhpcyBwYWNrZXQgY29tbWFuZCBpcyBjb21wbGV0ZWQgKi8KKwl1OCBwY19idWZmZXJbSURFVEFQRV9QQ19CVUZGRVJfU0laRV07CS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCS8qIFN0YXR1cy9BY3Rpb24gYml0IGZsYWdzOiBsb25nIGZvciBzZXRfYml0ICovCit9IGlkZXRhcGVfcGNfdDsKKworLyoKKyAqCVBhY2tldCBjb21tYW5kIGZsYWcgYml0cy4KKyAqLworLyogU2V0IHdoZW4gYW4gZXJyb3IgaXMgY29uc2lkZXJlZCBub3JtYWwgLSBXZSB3b24ndCByZXRyeSAqLworI2RlZmluZQlQQ19BQk9SVAkJCTAKKy8qIDEgV2hlbiBwb2xsaW5nIGZvciBEU0Mgb24gYSBtZWRpYSBhY2Nlc3MgY29tbWFuZCAqLworI2RlZmluZSBQQ19XQUlUX0ZPUl9EU0MJCQkxCisvKiAxIHdoZW4gd2UgcHJlZmVyIHRvIHVzZSBETUEgaWYgcG9zc2libGUgKi8KKyNkZWZpbmUgUENfRE1BX1JFQ09NTUVOREVECQkyCisvKiAxIHdoaWxlIERNQSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlQQ19ETUFfSU5fUFJPR1JFU1MJCTMKKy8qIDEgd2hlbiBlbmNvdW50ZXJlZCBwcm9ibGVtIGR1cmluZyBETUEgKi8KKyNkZWZpbmUJUENfRE1BX0VSUk9SCQkJNAorLyogRGF0YSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUJUENfV1JJVElORwkJCTUKKworLyoKKyAqCUNhcGFiaWxpdGllcyBhbmQgTWVjaGFuaWNhbCBTdGF0dXMgUGFnZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQJcGFnZV9jb2RlCTo2OwkvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgyYSAqLworCV9fdTgJCXJlc2VydmVkMF82CToxOworCV9fdTgJCXBzCQk6MTsJLyogcGFyYW1ldGVycyBzYXZlYWJsZSAqLworCV9fdTgJCXBhZ2VfbGVuZ3RoOwkJLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMHgxMiAqLworCV9fdTgJCXJlc2VydmVkMiwgcmVzZXJ2ZWQzOworCXVuc2lnbmVkCXJvCQk6MTsJLyogUmVhZCBPbmx5IE1vZGUgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDRfMTIzNAk6NDsKKwl1bnNpZ25lZAlzcHJldgkJOjE7CS8qIFN1cHBvcnRzIFNQQUNFIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAqLworCXVuc2lnbmVkCXJlc2VydmVkNF82Nwk6MjsKKwl1bnNpZ25lZAlyZXNlcnZlZDVfMDEyCTozOworCXVuc2lnbmVkCWVmbXQJCToxOwkvKiBTdXBwb3J0cyBFUkFTRSBjb21tYW5kIGluaXRpYXRlZCBmb3JtYXR0aW5nICovCisJdW5zaWduZWQJcmVzZXJ2ZWQ1XzQJOjE7CisJdW5zaWduZWQJcWZhCQk6MTsJLyogU3VwcG9ydHMgdGhlIFFGQSB0d28gcGFydGl0aW9uIGZvcm1hdHMgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDVfNjcJOjI7CisJdW5zaWduZWQJbG9jawkJOjE7CS8qIFN1cHBvcnRzIGxvY2tpbmcgdGhlIHZvbHVtZSAqLworCXVuc2lnbmVkCWxvY2tlZAkJOjE7CS8qIFRoZSB2b2x1bWUgaXMgbG9ja2VkICovCisJdW5zaWduZWQJcHJldmVudAkJOjE7CS8qIFRoZSBkZXZpY2UgZGVmYXVsdHMgaW4gdGhlIHByZXZlbnQgc3RhdGUgYWZ0ZXIgcG93ZXIgdXAgKi8JCisJdW5zaWduZWQJZWplY3QJCToxOwkvKiBUaGUgZGV2aWNlIGNhbiBlamVjdCB0aGUgdm9sdW1lICovCisJX191OAkJZGlzY29ubmVjdAk6MTsJLyogVGhlIGRldmljZSBjYW4gYnJlYWsgcmVxdWVzdCA+IGN0bCAqLwkKKwlfX3U4CQlyZXNlcnZlZDZfNQk6MTsKKwl1bnNpZ25lZAllY2MJCToxOwkvKiBTdXBwb3J0cyBlcnJvciBjb3JyZWN0aW9uICovCisJdW5zaWduZWQJY21wcnMJCToxOwkvKiBTdXBwb3J0cyBkYXRhIGNvbXByZXNzaW9uICovCisJdW5zaWduZWQJcmVzZXJ2ZWQ3XzAJOjE7CisJdW5zaWduZWQJYmxrNTEyCQk6MTsJLyogU3VwcG9ydHMgNTEyIGJ5dGVzIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZAlibGsxMDI0CQk6MTsJLyogU3VwcG9ydHMgMTAyNCBieXRlcyBibG9jayBzaXplICovCisJdW5zaWduZWQJcmVzZXJ2ZWQ3XzNfNgk6NDsKKwl1bnNpZ25lZAlibGszMjc2OAk6MTsJLyogc2xvd2IgLSB0aGUgZGV2aWNlIHJlc3RyaWN0cyB0aGUgYnl0ZSBjb3VudCBmb3IgUElPICovCisJCQkJCQkvKiB0cmFuc2ZlcnMgZm9yIHNsb3cgYnVmZmVyIG1lbW9yeSA/Pz8gKi8KKwkJCQkJCS8qIEFsc28gMzI3NjggYmxvY2sgc2l6ZSBpbiBzb21lIGNhc2VzICovCisJX191MTYJCW1heF9zcGVlZDsJCS8qIE1heGltdW0gc3BlZWQgc3VwcG9ydGVkIGluIEtCcHMgKi8KKwlfX3U4CQlyZXNlcnZlZDEwLCByZXNlcnZlZDExOworCV9fdTE2CQljdGw7CQkJLyogQ29udGludW91cyBUcmFuc2ZlciBMaW1pdCBpbiBibG9ja3MgKi8KKwlfX3UxNgkJc3BlZWQ7CQkJLyogQ3VycmVudCBTcGVlZCwgaW4gS0JwcyAqLworCV9fdTE2CQlidWZmZXJfc2l6ZTsJCS8qIEJ1ZmZlciBTaXplLCBpbiA1MTIgYnl0ZXMgKi8KKwlfX3U4CQlyZXNlcnZlZDE4LCByZXNlcnZlZDE5OworfSBpZGV0YXBlX2NhcGFiaWxpdGllc19wYWdlX3Q7CisKKy8qCisgKglCbG9jayBTaXplIFBhZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCXBhZ2VfY29kZQk6NjsJLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MzAgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDFfNgk6MTsKKwl1bnNpZ25lZAlwcwkJOjE7CisJX191OAkJcGFnZV9sZW5ndGg7CQkvKiBQYWdlIExlbmd0aCAtIFNob3VsZCBiZSAyICovCisJX191OAkJcmVzZXJ2ZWQyOworCXVuc2lnbmVkCXBsYXkzMgkJOjE7CisJdW5zaWduZWQJcGxheTMyXzUJOjE7CisJdW5zaWduZWQJcmVzZXJ2ZWQyXzIzCToyOworCXVuc2lnbmVkCXJlY29yZDMyCToxOworCXVuc2lnbmVkCXJlY29yZDMyXzUJOjE7CisJdW5zaWduZWQJcmVzZXJ2ZWQyXzYJOjE7CisJdW5zaWduZWQJb25lCQk6MTsKK30gaWRldGFwZV9ibG9ja19zaXplX3BhZ2VfdDsKKworLyoKKyAqCUEgcGlwZWxpbmUgc3RhZ2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZXRhcGVfc3RhZ2VfcyB7CisJc3RydWN0IHJlcXVlc3QgcnE7CQkJLyogVGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCAqLworCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsJCQkvKiBUaGUgZGF0YSBidWZmZXJzICovCisJc3RydWN0IGlkZXRhcGVfc3RhZ2VfcyAqbmV4dDsJCS8qIFBvaW50ZXIgdG8gdGhlIG5leHQgc3RhZ2UgKi8KK30gaWRldGFwZV9zdGFnZV90OworCisvKgorICoJUkVRVUVTVCBTRU5TRSBwYWNrZXQgY29tbWFuZCByZXN1bHQgLSBEYXRhIEZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWVycm9yX2NvZGUJOjc7CS8qIEN1cnJlbnQgb2YgZGVmZXJyZWQgZXJyb3JzICovCisJdW5zaWduZWQJdmFsaWQJCToxOwkvKiBUaGUgaW5mb3JtYXRpb24gZmllbGQgY29uZm9ybXMgdG8gUUlDLTE1N0MgKi8KKwlfX3U4CQlyZXNlcnZlZDEJOjg7CS8qIFNlZ21lbnQgTnVtYmVyIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlzZW5zZV9rZXkJOjQ7CS8qIFNlbnNlIEtleSAqLworCXVuc2lnbmVkCXJlc2VydmVkMl80CToxOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCWlsaQkJOjE7CS8qIEluY29ycmVjdCBMZW5ndGggSW5kaWNhdG9yICovCisJdW5zaWduZWQJZW9tCQk6MTsJLyogRW5kIE9mIE1lZGl1bSAqLworCXVuc2lnbmVkCWZpbGVtYXJrIAk6MTsJLyogRmlsZW1hcmsgKi8KKwlfX3UzMgkJaW5mb3JtYXRpb24gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCV9fdTgJCWFzbDsJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAobi03KSAqLworCV9fdTMyCQljb21tYW5kX3NwZWNpZmljOwkvKiBBZGRpdGlvbmFsIGNvbW1hbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwlfX3U4CQlhc2M7CQkJLyogQWRkaXRpb25hbCBTZW5zZSBDb2RlICovCisJX191OAkJYXNjcTsJCQkvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgUXVhbGlmaWVyICovCisJX191OAkJcmVwbGFjZWFibGVfdW5pdF9jb2RlOwkvKiBGaWVsZCBSZXBsYWNlYWJsZSBVbml0IENvZGUgKi8KKwl1bnNpZ25lZAlza19zcGVjaWZpYzEgCTo3OwkvKiBTZW5zZSBLZXkgU3BlY2lmaWMgKi8KKwl1bnNpZ25lZAlza3N2CQk6MTsJLyogU2Vuc2UgS2V5IFNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHZhbGlkICovCisJX191OAkJc2tfc3BlY2lmaWMyOwkJLyogU2Vuc2UgS2V5IFNwZWNpZmljICovCisJX191OAkJc2tfc3BlY2lmaWMzOwkJLyogU2Vuc2UgS2V5IFNwZWNpZmljICovCisJX191OAkJcGFkWzJdOwkJCS8qIFBhZGRpbmcgdG8gMjAgYnl0ZXMgKi8KK30gaWRldGFwZV9yZXF1ZXN0X3NlbnNlX3Jlc3VsdF90OworCisKKy8qCisgKglNb3N0IG9mIG91ciBnbG9iYWwgZGF0YSB3aGljaCB3ZSBuZWVkIHRvIHNhdmUgZXZlbiBhcyB3ZSBsZWF2ZSB0aGUKKyAqCWRyaXZlciBkdWUgdG8gYW4gaW50ZXJydXB0IG9yIGEgdGltZXIgZXZlbnQgaXMgc3RvcmVkIGluIGEgdmFyaWFibGUKKyAqCW9mIHR5cGUgaWRldGFwZV90YXBlX3QsIGRlZmluZWQgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZV90YXBlX29iaiB7CisJaWRlX2RyaXZlX3QJKmRyaXZlOworCWlkZV9kcml2ZXJfdAkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCSpkaXNrOworCXN0cnVjdCBrcmVmCWtyZWY7CisKKwkvKgorCSAqCVNpbmNlIGEgdHlwaWNhbCBjaGFyYWN0ZXIgZGV2aWNlIG9wZXJhdGlvbiByZXF1aXJlcyBtb3JlCisJICoJdGhhbiBvbmUgcGFja2V0IGNvbW1hbmQsIHdlIHByb3ZpZGUgaGVyZSBlbm91Z2ggbWVtb3J5CisJICoJZm9yIHRoZSBtYXhpbXVtIG9mIGludGVyY29ubmVjdGVkIHBhY2tldCBjb21tYW5kcy4KKwkgKglUaGUgcGFja2V0IGNvbW1hbmRzIGFyZSBzdG9yZWQgaW4gdGhlIGNpcmN1bGFyIGFycmF5IHBjX3N0YWNrLgorCSAqCXBjX3N0YWNrX2luZGV4IHBvaW50cyB0byB0aGUgbGFzdCB1c2VkIGVudHJ5LCBhbmQgd2FycHMgYXJvdW5kCisJICoJdG8gdGhlIHN0YXJ0IHdoZW4gd2UgZ2V0IHRvIHRoZSBsYXN0IGFycmF5IGVudHJ5LgorCSAqCisJICoJcGMgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3NlZCBwYWNrZXQgY29tbWFuZC4KKwkgKgorCSAqCWZhaWxlZF9wYyBwb2ludHMgdG8gdGhlIGxhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kLCBvciBjb250YWlucworCSAqCU5VTEwgaWYgd2UgZG8gbm90IG5lZWQgdG8gcmV0cnkgYW55IHBhY2tldCBjb21tYW5kLiBUaGlzIGlzCisJICoJcmVxdWlyZWQgc2luY2UgYW4gYWRkaXRpb25hbCBwYWNrZXQgY29tbWFuZCBpcyBuZWVkZWQgYmVmb3JlIHRoZQorCSAqCXJldHJ5LCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB3ZW50IHdyb25nLgorCSAqLworCS8qIEN1cnJlbnQgcGFja2V0IGNvbW1hbmQgKi8KKwlpZGV0YXBlX3BjX3QgKnBjOworCS8qIExhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kICovCisJaWRldGFwZV9wY190ICpmYWlsZWRfcGM7CisJLyogUGFja2V0IGNvbW1hbmQgc3RhY2sgKi8KKwlpZGV0YXBlX3BjX3QgcGNfc3RhY2tbSURFVEFQRV9QQ19TVEFDS107CisJLyogTmV4dCBmcmVlIHBhY2tldCBjb21tYW5kIHN0b3JhZ2Ugc3BhY2UgKi8KKwlpbnQgcGNfc3RhY2tfaW5kZXg7CisJc3RydWN0IHJlcXVlc3QgcnFfc3RhY2tbSURFVEFQRV9QQ19TVEFDS107CisJLyogV2UgaW1wbGVtZW50IGEgY2lyY3VsYXIgYXJyYXkgKi8KKwlpbnQgcnFfc3RhY2tfaW5kZXg7CisKKwkvKgorCSAqCURTQyBwb2xsaW5nIHZhcmlhYmxlcy4KKwkgKgorCSAqCVdoaWxlIHBvbGxpbmcgZm9yIERTQyB3ZSB1c2UgcG9zdHBvbmVkX3JxIHRvIHBvc3Rwb25lIHRoZQorCSAqCWN1cnJlbnQgcmVxdWVzdCBzbyB0aGF0IGlkZS5jIHdpbGwgYmUgYWJsZSB0byBzZXJ2aWNlCisJICoJcGVuZGluZyByZXF1ZXN0cyBvbiB0aGUgb3RoZXIgZGV2aWNlLiBOb3RlIHRoYXQgYXQgbW9zdAorCSAqCXdlIHdpbGwgaGF2ZSBvbmx5IG9uZSBEU0MgKHVzdWFsbHkgZGF0YSB0cmFuc2ZlcikgcmVxdWVzdAorCSAqCWluIHRoZSBkZXZpY2UgcmVxdWVzdCBxdWV1ZS4gQWRkaXRpb25hbCByZXF1ZXN0cyBjYW4gYmUKKwkgKglxdWV1ZWQgaW4gb3VyIGludGVybmFsIHBpcGVsaW5lLCBidXQgdGhleSB3aWxsIGJlIHZpc2libGUKKwkgKgl0byBpZGUuYyBvbmx5IG9uZSBhdCBhIHRpbWUuCisJICovCisJc3RydWN0IHJlcXVlc3QgKnBvc3Rwb25lZF9ycTsKKwkvKiBUaGUgdGltZSBpbiB3aGljaCB3ZSBzdGFydGVkIHBvbGxpbmcgZm9yIERTQyAqLworCXVuc2lnbmVkIGxvbmcgZHNjX3BvbGxpbmdfc3RhcnQ7CisJLyogVGltZXIgdXNlZCB0byBwb2xsIGZvciBkc2MgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBkc2NfdGltZXI7CisJLyogUmVhZC9Xcml0ZSBkc2MgcG9sbGluZyBmcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBsb25nIGJlc3RfZHNjX3J3X2ZyZXF1ZW5jeTsKKwkvKiBUaGUgY3VycmVudCBwb2xsaW5nIGZyZXF1ZW5jeSAqLworCXVuc2lnbmVkIGxvbmcgZHNjX3BvbGxpbmdfZnJlcXVlbmN5OworCS8qIE1heGltdW0gd2FpdGluZyB0aW1lICovCisJdW5zaWduZWQgbG9uZyBkc2NfdGltZW91dDsKKworCS8qCisJICoJUmVhZCBwb3NpdGlvbiBpbmZvcm1hdGlvbgorCSAqLworCXU4IHBhcnRpdGlvbjsKKwkvKiBDdXJyZW50IGJsb2NrICovCisJdW5zaWduZWQgaW50IGZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworCXVuc2lnbmVkIGludCBsYXN0X2ZyYW1lX3Bvc2l0aW9uOworCXVuc2lnbmVkIGludCBibG9ja3NfaW5fYnVmZmVyOworCisJLyoKKwkgKglMYXN0IGVycm9yIGluZm9ybWF0aW9uCisJICovCisJdTggc2Vuc2Vfa2V5LCBhc2MsIGFzY3E7CisKKwkvKgorCSAqCUNoYXJhY3RlciBkZXZpY2Ugb3BlcmF0aW9uCisJICovCisJdW5zaWduZWQgaW50IG1pbm9yOworCS8qIGRldmljZSBuYW1lICovCisJY2hhciBuYW1lWzRdOworCS8qIEN1cnJlbnQgY2hhcmFjdGVyIGRldmljZSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAqLworCWlkZXRhcGVfY2hyZGV2X2RpcmVjdGlvbl90IGNocmRldl9kaXJlY3Rpb247CisKKwkvKgorCSAqCURldmljZSBpbmZvcm1hdGlvbgorCSAqLworCS8qIFVzdWFsbHkgNTEyIG9yIDEwMjQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCB0YXBlX2Jsb2NrX3NpemU7CisJaW50IHVzZXJfYnNfZmFjdG9yOworCS8qIENvcHkgb2YgdGhlIHRhcGUncyBDYXBhYmlsaXRpZXMgYW5kIE1lY2hhbmljYWwgUGFnZSAqLworCWlkZXRhcGVfY2FwYWJpbGl0aWVzX3BhZ2VfdCBjYXBhYmlsaXRpZXM7CisKKwkvKgorCSAqCUFjdGl2ZSBkYXRhIHRyYW5zZmVyIHJlcXVlc3QgcGFyYW1ldGVycy4KKwkgKgorCSAqCUF0IG1vc3QsIHRoZXJlIGlzIG9ubHkgb25lIGlkZS10YXBlIG9yaWdpbmF0ZWQgZGF0YSB0cmFuc2ZlcgorCSAqCXJlcXVlc3QgaW4gdGhlIGRldmljZSByZXF1ZXN0IHF1ZXVlLiBUaGlzIGFsbG93cyBpZGUuYyB0bworCSAqCWVhc2lseSBzZXJ2aWNlIHJlcXVlc3RzIGZyb20gdGhlIG90aGVyIGRldmljZSB3aGVuIHdlCisJICoJcG9zdHBvbmUgb3VyIGFjdGl2ZSByZXF1ZXN0LiBJbiB0aGUgcGlwZWxpbmVkIG9wZXJhdGlvbgorCSAqCW1vZGUsIHdlIHVzZSBvdXIgaW50ZXJuYWwgcGlwZWxpbmUgc3RydWN0dXJlIHRvIGhvbGQKKwkgKgltb3JlIGRhdGEgcmVxdWVzdHMuCisJICoKKwkgKglUaGUgZGF0YSBidWZmZXIgc2l6ZSBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHRhcGUncworCSAqCXJlY29tbWVuZGF0aW9uLgorCSAqLworCS8qIFBvaW50ZXIgdG8gdGhlIHJlcXVlc3Qgd2hpY2ggaXMgd2FpdGluZyBpbiB0aGUgZGV2aWNlIHJlcXVlc3QgcXVldWUgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqYWN0aXZlX2RhdGFfcmVxdWVzdDsKKwkvKiBEYXRhIGJ1ZmZlciBzaXplIChjaG9zZW4gYmFzZWQgb24gdGhlIHRhcGUncyByZWNvbW1lbmRhdGlvbiAqLworCWludCBzdGFnZV9zaXplOworCWlkZXRhcGVfc3RhZ2VfdCAqbWVyZ2Vfc3RhZ2U7CisJaW50IG1lcmdlX3N0YWdlX3NpemU7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoOworCWNoYXIgKmJfZGF0YTsKKwlpbnQgYl9jb3VudDsKKwkKKwkvKgorCSAqCVBpcGVsaW5lIHBhcmFtZXRlcnMuCisJICoKKwkgKglUbyBhY2NvbXBsaXNoIG5vbi1waXBlbGluZWQgbW9kZSwgd2Ugc2ltcGx5IHNldCB0aGUgZm9sbG93aW5nCisJICoJdmFyaWFibGVzIHRvIHplcm8gKG9yIE5VTEwsIHdoZXJlIGFwcHJvcHJpYXRlKS4KKwkgKi8KKwkvKiBOdW1iZXIgb2YgY3VycmVudGx5IHVzZWQgc3RhZ2VzICovCisJaW50IG5yX3N0YWdlczsKKwkvKiBOdW1iZXIgb2YgcGVuZGluZyBzdGFnZXMgKi8KKwlpbnQgbnJfcGVuZGluZ19zdGFnZXM7CisJLyogV2Ugd2lsbCBub3QgYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIHN0YWdlcyAqLworCWludCBtYXhfc3RhZ2VzLCBtaW5fcGlwZWxpbmUsIG1heF9waXBlbGluZTsKKwkvKiBUaGUgZmlyc3Qgc3RhZ2Ugd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHBpcGVsaW5lICovCisJaWRldGFwZV9zdGFnZV90ICpmaXJzdF9zdGFnZTsKKwkvKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzdGFnZSAqLworCWlkZXRhcGVfc3RhZ2VfdCAqYWN0aXZlX3N0YWdlOworCS8qIFdpbGwgYmUgc2VydmljZWQgYWZ0ZXIgdGhlIGN1cnJlbnRseSBhY3RpdmUgcmVxdWVzdCAqLworCWlkZXRhcGVfc3RhZ2VfdCAqbmV4dF9zdGFnZTsKKwkvKiBOZXcgcmVxdWVzdHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGlwZWxpbmUgaGVyZSAqLworCWlkZXRhcGVfc3RhZ2VfdCAqbGFzdF9zdGFnZTsKKwkvKiBPcHRpb25hbCBmcmVlIHN0YWdlIHdoaWNoIHdlIGNhbiB1c2UgKi8KKwlpZGV0YXBlX3N0YWdlX3QgKmNhY2hlX3N0YWdlOworCWludCBwYWdlc19wZXJfc3RhZ2U7CisJLyogV2FzdGVkIHNwYWNlIGluIGVhY2ggc3RhZ2UgKi8KKwlpbnQgZXhjZXNzX2JoX3NpemU7CisKKwkvKiBTdGF0dXMvQWN0aW9uIGZsYWdzOiBsb25nIGZvciBzZXRfYml0ICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiBwcm90ZWN0cyB0aGUgaWRlLXRhcGUgcXVldWUgKi8KKwlzcGlubG9ja190IHNwaW5sb2NrOworCisJLyoKKwkgKiBNZWFzdXJlcyBhdmVyYWdlIHRhcGUgc3BlZWQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGF2Z190aW1lOworCWludCBhdmdfc2l6ZTsKKwlpbnQgYXZnX3NwZWVkOworCisJLyogbGFzdCBzZW5zZSBpbmZvcm1hdGlvbiAqLworCWlkZXRhcGVfcmVxdWVzdF9zZW5zZV9yZXN1bHRfdCBzZW5zZTsKKworCWNoYXIgdmVuZG9yX2lkWzEwXTsKKwljaGFyIHByb2R1Y3RfaWRbMThdOworCWNoYXIgZmlybXdhcmVfcmV2aXNpb25bNl07CisJaW50IGZpcm13YXJlX3JldmlzaW9uX251bTsKKworCS8qIHRoZSBkb29yIGlzIGN1cnJlbnRseSBsb2NrZWQgKi8KKwlpbnQgZG9vcl9sb2NrZWQ7CisJLyogdGhlIHRhcGUgaGFyZHdhcmUgaXMgd3JpdGUgcHJvdGVjdGVkICovCisJY2hhciBkcnZfd3JpdGVfcHJvdDsKKwkvKiB0aGUgdGFwZSBpcyB3cml0ZSBwcm90ZWN0ZWQgKGhhcmR3YXJlIG9yIG9wZW5lZCBhcyByZWFkLW9ubHkpICovCisJY2hhciB3cml0ZV9wcm90OworCisJLyoKKwkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVxdWVzdCBjYW4KKwkgKiBiZSBwb3N0cG9uZWQsIHRvIGF2b2lkIGFuIGluZmluaXRlIHBvc3Rwb25lCisJICogZGVhZGxvY2suCisJICovCisJLyogcmVxdWVzdCBwb3N0cG9uZSBjb3VudCBsaW1pdCAqLworCWludCBwb3N0cG9uZV9jbnQ7CisKKwkvKgorCSAqIE1lYXN1cmVzIG51bWJlciBvZiBmcmFtZXM6CisJICoKKwkgKiAxLiB3cml0dGVuL3JlYWQgdG8vZnJvbSB0aGUgZHJpdmVyIHBpcGVsaW5lIChwaXBlbGluZV9oZWFkKS4KKwkgKiAyLiB3cml0dGVuL3JlYWQgdG8vZnJvbSB0aGUgdGFwZSBidWZmZXJzIChpZGV0YXBlX2JoKS4KKwkgKiAzLiB3cml0dGVuL3JlYWQgYnkgdGhlIHRhcGUgdG8vZnJvbSB0aGUgbWVkaWEgKHRhcGVfaGVhZCkuCisJICovCisJaW50IHBpcGVsaW5lX2hlYWQ7CisJaW50IGJ1ZmZlcl9oZWFkOworCWludCB0YXBlX2hlYWQ7CisJaW50IGxhc3RfdGFwZV9oZWFkOworCisJLyoKKwkgKiBTcGVlZCBjb250cm9sIGF0IHRoZSB0YXBlIGJ1ZmZlcnMgaW5wdXQvb3V0cHV0CisJICovCisJdW5zaWduZWQgbG9uZyBpbnNlcnRfdGltZTsKKwlpbnQgaW5zZXJ0X3NpemU7CisJaW50IGluc2VydF9zcGVlZDsKKwlpbnQgbWF4X2luc2VydF9zcGVlZDsKKwlpbnQgbWVhc3VyZV9pbnNlcnRfdGltZTsKKworCS8qCisJICogTWVhc3VyZSB0YXBlIHN0aWxsIHRpbWUsIGluIG1pbGxpc2Vjb25kcworCSAqLworCXVuc2lnbmVkIGxvbmcgdGFwZV9zdGlsbF90aW1lX2JlZ2luOworCWludCB0YXBlX3N0aWxsX3RpbWU7CisKKwkvKgorCSAqIFNwZWVkIHJlZ3VsYXRpb24gbmVnYXRpdmUgZmVlZGJhY2sgbG9vcAorCSAqLworCWludCBzcGVlZF9jb250cm9sOworCWludCBwaXBlbGluZV9oZWFkX3NwZWVkOworCWludCBjb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfc3BlZWQ7CisJaW50IHVuY29udHJvbGxlZF9waXBlbGluZV9oZWFkX3NwZWVkOworCWludCBjb250cm9sbGVkX2xhc3RfcGlwZWxpbmVfaGVhZDsKKwlpbnQgdW5jb250cm9sbGVkX2xhc3RfcGlwZWxpbmVfaGVhZDsKKwl1bnNpZ25lZCBsb25nIHVuY29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWU7CisJdW5zaWduZWQgbG9uZyBjb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfdGltZTsKKwlpbnQgY29udHJvbGxlZF9wcmV2aW91c19waXBlbGluZV9oZWFkOworCWludCB1bmNvbnRyb2xsZWRfcHJldmlvdXNfcGlwZWxpbmVfaGVhZDsKKwl1bnNpZ25lZCBsb25nIGNvbnRyb2xsZWRfcHJldmlvdXNfaGVhZF90aW1lOworCXVuc2lnbmVkIGxvbmcgdW5jb250cm9sbGVkX3ByZXZpb3VzX2hlYWRfdGltZTsKKwlpbnQgcmVzdGFydF9zcGVlZF9jb250cm9sX3JlcTsKKworICAgICAgICAvKgorICAgICAgICAgKiBEZWJ1Z19sZXZlbCBkZXRlcm1pbmVzIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0OworICAgICAgICAgKiBjYW4gYmUgY2hhbmdlZCB1c2luZyAvcHJvYy9pZGUvaGR4L3NldHRpbmdzCisgICAgICAgICAqIDAgOiBhbG1vc3Qgbm8gZGVidWdnaW5nIG91dHB1dAorICAgICAgICAgKiAxIDogMCtvdXRwdXQgZXJyb3JzIG9ubHkKKyAgICAgICAgICogMiA6IDErb3V0cHV0IGFsbCBzZW5zZWtleS9hc2MKKyAgICAgICAgICogMyA6IDIrZm9sbG93IGFsbCBjaHJkZXYgcmVsYXRlZCBwcm9jZWR1cmVzCisgICAgICAgICAqIDQgOiAzK2ZvbGxvdyBhbGwgcHJvY2VkdXJlcworICAgICAgICAgKiA1IDogNCtpbmNsdWRlIHBjX3N0YWNrIHJxX3N0YWNrIGluZm8KKyAgICAgICAgICogNiA6IDUrVVNFX0NPVU5UIHVwZGF0ZXMKKyAgICAgICAgICovCisgICAgICAgICBpbnQgZGVidWdfbGV2ZWw7IAorfSBpZGV0YXBlX3RhcGVfdDsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaWRldGFwZV9yZWZfc2VtKTsKKworI2RlZmluZSB0b19pZGVfdGFwZShvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBpZGVfdGFwZV9vYmosIGtyZWYpCisKKyNkZWZpbmUgaWRlX3RhcGVfZyhkaXNrKSBcCisJY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaWRlX3RhcGVfb2JqLCBkcml2ZXIpCisKK3N0YXRpYyBzdHJ1Y3QgaWRlX3RhcGVfb2JqICppZGVfdGFwZV9nZXQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IE5VTEw7CisKKwlkb3duKCZpZGV0YXBlX3JlZl9zZW0pOworCXRhcGUgPSBpZGVfdGFwZV9nKGRpc2spOworCWlmICh0YXBlKQorCQlrcmVmX2dldCgmdGFwZS0+a3JlZik7CisJdXAoJmlkZXRhcGVfcmVmX3NlbSk7CisJcmV0dXJuIHRhcGU7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKik7CisKK3N0YXRpYyB2b2lkIGlkZV90YXBlX3B1dChzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlKQoreworCWRvd24oJmlkZXRhcGVfcmVmX3NlbSk7CisJa3JlZl9wdXQoJnRhcGUtPmtyZWYsIGlkZV90YXBlX3JlbGVhc2UpOworCXVwKCZpZGV0YXBlX3JlZl9zZW0pOworfQorCisvKgorICoJVGFwZSBkb29yIHN0YXR1cworICovCisjZGVmaW5lIERPT1JfVU5MT0NLRUQJCQkwCisjZGVmaW5lIERPT1JfTE9DS0VECQkJMQorI2RlZmluZSBET09SX0VYUExJQ0lUTFlfTE9DS0VECQkyCisKKy8qCisgKglUYXBlIGZsYWcgYml0cyB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgSURFVEFQRV9JR05PUkVfRFNDCQkwCisjZGVmaW5lIElERVRBUEVfQUREUkVTU19WQUxJRAkJMQkvKiAwIFdoZW4gdGhlIHRhcGUgcG9zaXRpb24gaXMgdW5rbm93biAqLworI2RlZmluZSBJREVUQVBFX0JVU1kJCQkyCS8qIERldmljZSBhbHJlYWR5IG9wZW5lZCAqLworI2RlZmluZSBJREVUQVBFX1BJUEVMSU5FX0VSUk9SCQkzCS8qIEVycm9yIGRldGVjdGVkIGluIGEgcGlwZWxpbmUgc3RhZ2UgKi8KKyNkZWZpbmUgSURFVEFQRV9ERVRFQ1RfQlMJCTQJLyogQXR0ZW1wdCB0byBhdXRvLWRldGVjdCB0aGUgY3VycmVudCB1c2VyIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgSURFVEFQRV9GSUxFTUFSSwkJNQkvKiBDdXJyZW50bHkgb24gYSBmaWxlbWFyayAqLworI2RlZmluZSBJREVUQVBFX0RSUV9JTlRFUlJVUFQJCTYJLyogRFJRIGludGVycnVwdCBkZXZpY2UgKi8KKyNkZWZpbmUgSURFVEFQRV9SRUFEX0VSUk9SCQk3CisjZGVmaW5lIElERVRBUEVfUElQRUxJTkVfQUNUSVZFCQk4CS8qIHBpcGVsaW5lIGFjdGl2ZSAqLworLyogMCA9IG5vIHRhcGUgaXMgbG9hZGVkLCBzbyB3ZSBkb24ndCByZXdpbmQgYWZ0ZXIgZWplY3RpbmcgKi8KKyNkZWZpbmUgSURFVEFQRV9NRURJVU1fUFJFU0VOVAkJOQorCisvKgorICoJU3VwcG9ydGVkIEFUQVBJIHRhcGUgZHJpdmVzIHBhY2tldCBjb21tYW5kcworICovCisjZGVmaW5lIElERVRBUEVfVEVTVF9VTklUX1JFQURZX0NNRAkweDAwCisjZGVmaW5lIElERVRBUEVfUkVXSU5EX0NNRAkJMHgwMQorI2RlZmluZSBJREVUQVBFX1JFUVVFU1RfU0VOU0VfQ01ECTB4MDMKKyNkZWZpbmUgSURFVEFQRV9SRUFEX0NNRAkJMHgwOAorI2RlZmluZSBJREVUQVBFX1dSSVRFX0NNRAkJMHgwYQorI2RlZmluZSBJREVUQVBFX1dSSVRFX0ZJTEVNQVJLX0NNRAkweDEwCisjZGVmaW5lIElERVRBUEVfU1BBQ0VfQ01ECQkweDExCisjZGVmaW5lIElERVRBUEVfSU5RVUlSWV9DTUQJCTB4MTIKKyNkZWZpbmUgSURFVEFQRV9FUkFTRV9DTUQJCTB4MTkKKyNkZWZpbmUgSURFVEFQRV9NT0RFX1NFTlNFX0NNRAkJMHgxYQorI2RlZmluZSBJREVUQVBFX01PREVfU0VMRUNUX0NNRAkJMHgxNQorI2RlZmluZSBJREVUQVBFX0xPQURfVU5MT0FEX0NNRAkJMHgxYgorI2RlZmluZSBJREVUQVBFX1BSRVZFTlRfQ01ECQkweDFlCisjZGVmaW5lIElERVRBUEVfTE9DQVRFX0NNRAkJMHgyYgorI2RlZmluZSBJREVUQVBFX1JFQURfUE9TSVRJT05fQ01ECTB4MzQKKyNkZWZpbmUgSURFVEFQRV9SRUFEX0JVRkZFUl9DTUQJCTB4M2MKKyNkZWZpbmUgSURFVEFQRV9TRVRfU1BFRURfQ01ECQkweGJiCisKKy8qCisgKglTb21lIGRlZmluZXMgZm9yIHRoZSBSRUFEIEJVRkZFUiBjb21tYW5kCisgKi8KKyNkZWZpbmUgSURFVEFQRV9SRVRSSUVWRV9GQVVMVFlfQkxPQ0sJNgorCisvKgorICoJU29tZSBkZWZpbmVzIGZvciB0aGUgU1BBQ0UgY29tbWFuZAorICovCisjZGVmaW5lIElERVRBUEVfU1BBQ0VfT1ZFUl9GSUxFTUFSSwkxCisjZGVmaW5lIElERVRBUEVfU1BBQ0VfVE9fRU9ECQkzCisKKy8qCisgKglTb21lIGRlZmluZXMgZm9yIHRoZSBMT0FEIFVOTE9BRCBjb21tYW5kCisgKi8KKyNkZWZpbmUgSURFVEFQRV9MVV9MT0FEX01BU0sJCTEKKyNkZWZpbmUgSURFVEFQRV9MVV9SRVRFTlNJT05fTUFTSwkyCisjZGVmaW5lIElERVRBUEVfTFVfRU9UX01BU0sJCTQKKworLyoKKyAqCVNwZWNpYWwgcmVxdWVzdHMgZm9yIG91ciBibG9jayBkZXZpY2Ugc3RyYXRlZ3kgcm91dGluZS4KKyAqCisgKglJbiBvcmRlciB0byBzZXJ2aWNlIGEgY2hhcmFjdGVyIGRldmljZSBjb21tYW5kLCB3ZSBhZGQgc3BlY2lhbAorICoJcmVxdWVzdHMgdG8gdGhlIHRhaWwgb2Ygb3VyIGJsb2NrIGRldmljZSByZXF1ZXN0IHF1ZXVlIGFuZCB3YWl0CisgKglmb3IgdGhlaXIgY29tcGxldGlvbi4KKyAqLworCitlbnVtIHsKKwlSRVFfSURFVEFQRV9QQzEJCT0gKDEgPDwgMCksIC8qIHBhY2tldCBjb21tYW5kIChmaXJzdCBzdGFnZSkgKi8KKwlSRVFfSURFVEFQRV9QQzIJCT0gKDEgPDwgMSksIC8qIHBhY2tldCBjb21tYW5kIChzZWNvbmQgc3RhZ2UpICovCisJUkVRX0lERVRBUEVfUkVBRAk9ICgxIDw8IDIpLAorCVJFUV9JREVUQVBFX1dSSVRFCT0gKDEgPDwgMyksCisJUkVRX0lERVRBUEVfUkVBRF9CVUZGRVIJPSAoMSA8PCA0KSwKK307CisKKy8qCisgKglFcnJvciBjb2RlcyB3aGljaCBhcmUgcmV0dXJuZWQgaW4gcnEtPmVycm9ycyB0byB0aGUgaGlnaGVyIHBhcnQKKyAqCW9mIHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUJSURFVEFQRV9FUlJPUl9HRU5FUkFMCQkxMDEKKyNkZWZpbmUJSURFVEFQRV9FUlJPUl9GSUxFTUFSSwkJMTAyCisjZGVmaW5lCUlERVRBUEVfRVJST1JfRU9ECQkxMDMKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgaXMgdXNlZCB0byBmb3JtYXQgdGhlIGdlbmVyYWwgY29uZmlndXJhdGlvbiB3b3JkIG9mCisgKgl0aGUgQVRBUEkgSURFTlRJRlkgREVWSUNFIGNvbW1hbmQuCisgKi8KK3N0cnVjdCBpZGV0YXBlX2lkX2djdyB7CQorCXVuc2lnbmVkIHBhY2tldF9zaXplCQk6MjsJLyogUGFja2V0IFNpemUgKi8KKwl1bnNpZ25lZCByZXNlcnZlZDIzNAkJOjM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgZHJxX3R5cGUJCToyOwkvKiBDb21tYW5kIHBhY2tldCBEUlEgdHlwZSAqLworCXVuc2lnbmVkIHJlbW92YWJsZQkJOjE7CS8qIFJlbW92YWJsZSBtZWRpYSAqLworCXVuc2lnbmVkIGRldmljZV90eXBlCQk6NTsJLyogRGV2aWNlIHR5cGUgKi8KKwl1bnNpZ25lZCByZXNlcnZlZDEzCQk6MTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBwcm90b2NvbAkJOjI7CS8qIFByb3RvY29sIHR5cGUgKi8KK307CisKKy8qCisgKglJTlFVSVJZIHBhY2tldCBjb21tYW5kIC0gRGF0YSBGb3JtYXQgKEZyb20gVGFibGUgNi04IG9mIFFJQy0xNTdDKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQJZGV2aWNlX3R5cGUJOjU7CS8qIFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDBfNzY1CTozOwkvKiBQZXJpcGhlcmFsIFF1YWxpZmllciAtIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVzZXJ2ZWQxXzZ0MAk6NzsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlybWIJCToxOwkvKiBSZW1vdmFibGUgTWVkaXVtIEJpdCAqLworCXVuc2lnbmVkCWFuc2lfdmVyc2lvbgk6MzsJLyogQU5TSSBWZXJzaW9uICovCisJdW5zaWduZWQJZWNtYV92ZXJzaW9uCTozOwkvKiBFQ01BIFZlcnNpb24gKi8KKwl1bnNpZ25lZAlpc29fdmVyc2lvbgk6MjsJLyogSVNPIFZlcnNpb24gKi8KKwl1bnNpZ25lZAlyZXNwb25zZV9mb3JtYXQgOjQ7CS8qIFJlc3BvbnNlIERhdGEgRm9ybWF0ICovCisJdW5zaWduZWQJcmVzZXJ2ZWQzXzQ1CToyOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXJlc2VydmVkM182CToxOwkvKiBUcm1JT1AgLSBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXJlc2VydmVkM183CToxOwkvKiBBRU5DIC0gUmVzZXJ2ZWQgKi8KKwlfX3U4CQlhZGRpdGlvbmFsX2xlbmd0aDsJLyogQWRkaXRpb25hbCBMZW5ndGggKHRvdGFsX2xlbmd0aC00KSAqLworCV9fdTgJCXJzdjUsIHJzdjYsIHJzdjc7CS8qIFJlc2VydmVkICovCisJX191OAkJdmVuZG9yX2lkWzhdOwkJLyogVmVuZG9yIElkZW50aWZpY2F0aW9uICovCisJX191OAkJcHJvZHVjdF9pZFsxNl07CQkvKiBQcm9kdWN0IElkZW50aWZpY2F0aW9uICovCisJX191OAkJcmV2aXNpb25fbGV2ZWxbNF07CS8qIFJldmlzaW9uIExldmVsICovCisJX191OAkJdmVuZG9yX3NwZWNpZmljWzIwXTsJLyogVmVuZG9yIFNwZWNpZmljIC0gT3B0aW9uYWwgKi8KKwlfX3U4CQlyZXNlcnZlZDU2dDk1WzQwXTsJLyogUmVzZXJ2ZWQgLSBPcHRpb25hbCAqLworCQkJCQkJLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgcmV0dXJuZWQgKi8KK30gaWRldGFwZV9pbnF1aXJ5X3Jlc3VsdF90OworCisvKgorICoJUkVBRCBQT1NJVElPTiBwYWNrZXQgY29tbWFuZCAtIERhdGEgRm9ybWF0IChGcm9tIFRhYmxlIDYtNTcpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZAlyZXNlcnZlZDBfMTAJOjI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJYnB1CQk6MTsJLyogQmxvY2sgUG9zaXRpb24gVW5rbm93biAqLwkKKwl1bnNpZ25lZAlyZXNlcnZlZDBfNTQzCTozOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCWVvcAkJOjE7CS8qIEVuZCBPZiBQYXJ0aXRpb24gKi8KKwl1bnNpZ25lZAlib3AJCToxOwkvKiBCZWdpbm5pbmcgT2YgUGFydGl0aW9uICovCisJdTgJCXBhcnRpdGlvbjsJCS8qIFBhcnRpdGlvbiBOdW1iZXIgKi8KKwl1OAkJcmVzZXJ2ZWQyLCByZXNlcnZlZDM7CS8qIFJlc2VydmVkICovCisJdTMyCQlmaXJzdF9ibG9jazsJCS8qIEZpcnN0IEJsb2NrIExvY2F0aW9uICovCisJdTMyCQlsYXN0X2Jsb2NrOwkJLyogTGFzdCBCbG9jayBMb2NhdGlvbiAoT3B0aW9uYWwpICovCisJdTgJCXJlc2VydmVkMTI7CQkvKiBSZXNlcnZlZCAqLworCXU4CQlibG9ja3NfaW5fYnVmZmVyWzNdOwkvKiBCbG9ja3MgSW4gQnVmZmVyIC0gKE9wdGlvbmFsKSAqLworCXUzMgkJYnl0ZXNfaW5fYnVmZmVyOwkvKiBCeXRlcyBJbiBCdWZmZXIgKE9wdGlvbmFsKSAqLworfSBpZGV0YXBlX3JlYWRfcG9zaXRpb25fcmVzdWx0X3Q7CisKKy8qCisgKglGb2xsb3dzIHN0cnVjdHVyZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIFNFTEVDVCBTRU5TRSAvIE1PREUgU0VOU0UKKyAqCXBhY2tldCBjb21tYW5kcy4gVGhvc2UgcGFja2V0IGNvbW1hbmRzIGFyZSBzdGlsbCBub3Qgc3VwcG9ydGVkCisgKglieSBpZGUtdGFwZS4KKyAqLworI2RlZmluZSBJREVUQVBFX0JMT0NLX0RFU0NSSVBUT1IJMAorI2RlZmluZQlJREVUQVBFX0NBUEFCSUxJVElFU19QQUdFCTB4MmEKKyNkZWZpbmUgSURFVEFQRV9QQVJBTVRSX1BBR0UJCTB4MmIgICAvKiBPbnN0cmVhbSBESS14MCBvbmx5ICovCisjZGVmaW5lIElERVRBUEVfQkxPQ0tfU0laRV9QQUdFCQkweDMwCisjZGVmaW5lIElERVRBUEVfQlVGRkVSX0ZJTExJTkdfUEFHRQkweDMzCisKKy8qCisgKglNb2RlIFBhcmFtZXRlciBIZWFkZXIgZm9yIHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3U4CW1vZGVfZGF0YV9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEgdHJhbnNmZXIgKi8KKwlfX3U4CW1lZGl1bV90eXBlOwkJLyogTWVkaXVtIFR5cGUgKi8KKwlfX3U4CWRzcDsJCQkvKiBEZXZpY2UgU3BlY2lmaWMgUGFyYW1ldGVyICovCisJX191OAliZGw7CQkJLyogQmxvY2sgRGVzY3JpcHRvciBMZW5ndGggKi8KKyNpZiAwCisJLyogZGF0YSB0cmFuc2ZlciBwYWdlICovCisJX191OAlwYWdlX2NvZGUJOjY7CisJX191OAlyZXNlcnZlZDBfNgk6MTsKKwlfX3U4CXBzCQk6MTsJLyogcGFyYW1ldGVycyBzYXZlYWJsZSAqLworCV9fdTgJcGFnZV9sZW5ndGg7CQkvKiBwYWdlIExlbmd0aCA9PSAweDAyICovCisJX191OAlyZXNlcnZlZDI7CisJX191OAlyZWFkMzJrCQk6MTsJLyogMzJrIGJsayBzaXplIChkYXRhIG9ubHkpICovCisJX191OAlyZWFkMzJrNQk6MTsJLyogMzIuNWsgYmxrIHNpemUgKGRhdGEmQVVYKSAqLworCV9fdTgJcmVzZXJ2ZWQzXzIzCToyOworCV9fdTgJd3JpdGUzMmsJOjE7CS8qIDMyayBibGsgc2l6ZSAoZGF0YSBvbmx5KSAqLworCV9fdTgJd3JpdGUzMms1CToxOwkvKiAzMi41ayBibGsgc2l6ZSAoZGF0YSZBVVgpICovCisJX191OAlyZXNlcnZlZDNfNgk6MTsKKwlfX3U4CXN0cmVhbWluZwk6MTsJLyogc3RyZWFtaW5nIG1vZGUgZW5hYmxlICovCisjZW5kaWYKK30gaWRldGFwZV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdDsKKworLyoKKyAqCU1vZGUgUGFyYW1ldGVyIEJsb2NrIERlc2NyaXB0b3IgdGhlIE1PREUgU0VOU0UgcGFja2V0IGNvbW1hbmQKKyAqCisgKglTdXBwb3J0IGZvciBibG9jayBkZXNjcmlwdG9ycyBpcyBvcHRpb25hbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTgJCWRlbnNpdHlfY29kZTsJCS8qIE1lZGl1bSBkZW5zaXR5IGNvZGUgKi8KKwlfX3U4CQlibG9ja3NbM107CQkvKiBOdW1iZXIgb2YgYmxvY2tzICovCisJX191OAkJcmVzZXJ2ZWQ0OwkJLyogUmVzZXJ2ZWQgKi8KKwlfX3U4CQlsZW5ndGhbM107CQkvKiBCbG9jayBMZW5ndGggKi8KK30gaWRldGFwZV9wYXJhbWV0ZXJfYmxvY2tfZGVzY3JpcHRvcl90OworCisvKgorICoJVGhlIERhdGEgQ29tcHJlc3Npb24gUGFnZSwgYXMgcmV0dXJuZWQgYnkgdGhlIE1PREUgU0VOU0UgcGFja2V0IGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZAlwYWdlX2NvZGUJOjY7CS8qIFBhZ2UgQ29kZSAtIFNob3VsZCBiZSAweGYgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDAJOjE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcHMJCToxOworCV9fdTgJCXBhZ2VfbGVuZ3RoOwkJLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMTQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDIJOjY7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJZGNjCQk6MTsJLyogRGF0YSBDb21wcmVzc2lvbiBDYXBhYmxlICovCisJdW5zaWduZWQJZGNlCQk6MTsJLyogRGF0YSBDb21wcmVzc2lvbiBFbmFibGUgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDMJOjU7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcmVkCQk6MjsJLyogUmVwb3J0IEV4Y2VwdGlvbiBvbiBEZWNvbXByZXNzaW9uICovCisJdW5zaWduZWQJZGRlCQk6MTsJLyogRGF0YSBEZWNvbXByZXNzaW9uIEVuYWJsZSAqLworCV9fdTMyCQljYTsJCQkvKiBDb21wcmVzc2lvbiBBbGdvcml0aG0gKi8KKwlfX3UzMgkJZGE7CQkJLyogRGVjb21wcmVzc2lvbiBBbGdvcml0aG0gKi8KKwlfX3U4CQlyZXNlcnZlZFs0XTsJCS8qIFJlc2VydmVkICovCit9IGlkZXRhcGVfZGF0YV9jb21wcmVzc2lvbl9wYWdlX3Q7CisKKy8qCisgKglUaGUgTWVkaXVtIFBhcnRpdGlvbiBQYWdlLCBhcyByZXR1cm5lZCBieSB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCXBhZ2VfY29kZQk6NjsJLyogUGFnZSBDb2RlIC0gU2hvdWxkIGJlIDB4MTEgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDFfNgk6MTsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlwcwkJOjE7CisJX191OAkJcGFnZV9sZW5ndGg7CQkvKiBQYWdlIExlbmd0aCAtIFNob3VsZCBiZSA2ICovCisJX191OAkJbWFwOwkJCS8qIE1heGltdW0gQWRkaXRpb25hbCBQYXJ0aXRpb25zIC0gU2hvdWxkIGJlIDAgKi8KKwlfX3U4CQlhcGQ7CQkJLyogQWRkaXRpb25hbCBQYXJ0aXRpb25zIERlZmluZWQgLSBTaG91bGQgYmUgMCAqLworCXVuc2lnbmVkCXJlc2VydmVkNF8wMTIJOjM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcHN1bQkJOjI7CS8qIFNob3VsZCBiZSAwICovCisJdW5zaWduZWQJaWRwCQk6MTsJLyogU2hvdWxkIGJlIDAgKi8KKwl1bnNpZ25lZAlzZHAJCToxOwkvKiBTaG91bGQgYmUgMCAqLworCXVuc2lnbmVkCWZkcAkJOjE7CS8qIEZpeGVkIERhdGEgUGFydGl0aW9ucyAqLworCV9fdTgJCW1mcjsJCQkvKiBNZWRpdW0gRm9ybWF0IFJlY29nbml0aW9uICovCisJX191OAkJcmVzZXJ2ZWRbMl07CQkvKiBSZXNlcnZlZCAqLworfSBpZGV0YXBlX21lZGl1bV9wYXJ0aXRpb25fcGFnZV90OworCisvKgorICoJUnVuIHRpbWUgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJZHNjX3J3X2ZyZXF1ZW5jeTsKKwlpbnQJZHNjX21lZGlhX2FjY2Vzc19mcmVxdWVuY3k7CisJaW50CW5yX3N0YWdlczsKK30gaWRldGFwZV9jb25maWdfdDsKKworLyoKKyAqCVRoZSB2YXJpYWJsZXMgYmVsb3cgYXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZS4KKyAqCUFkZGl0aW9uYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG91ciBpZGVfZHJpdmVfdCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWRlX3RhcGVfb2JqICogaWRldGFwZV9kZXZzW01BWF9IV0lGUyAqIE1BWF9EUklWRVNdOworCisjZGVmaW5lIGlkZV90YXBlX2YoZmlsZSkgKChmaWxlKS0+cHJpdmF0ZV9kYXRhKQorCitzdGF0aWMgc3RydWN0IGlkZV90YXBlX29iaiAqaWRlX3RhcGVfY2hyZGV2X2dldCh1bnNpZ25lZCBpbnQgaSkKK3sKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gTlVMTDsKKworCWRvd24oJmlkZXRhcGVfcmVmX3NlbSk7CisJdGFwZSA9IGlkZXRhcGVfZGV2c1tpXTsKKwlpZiAodGFwZSkKKwkJa3JlZl9nZXQoJnRhcGUtPmtyZWYpOworCXVwKCZpZGV0YXBlX3JlZl9zZW0pOworCXJldHVybiB0YXBlOworfQorCisvKgorICogICAgICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqCisgKi8KK3N0YXRpYyBpbnQgaWRldGFwZV9jaHJkZXZfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgaWRldGFwZV93cml0ZV9yZWxlYXNlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBtaW5vcik7CisKKy8qCisgKiBUb28gYmFkLiBUaGUgZHJpdmUgd2FudHMgdG8gc2VuZCB1cyBkYXRhIHdoaWNoIHdlIGFyZSBub3QgcmVhZHkgdG8gYWNjZXB0LgorICogSnVzdCB0aHJvdyBpdCBhd2F5LgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2Rpc2NhcmRfZGF0YSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgYmNvdW50KQoreworCXdoaWxlIChiY291bnQtLSkKKwkJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIoSURFX0RBVEFfUkVHKTsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9pbnB1dF9idWZmZXJzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcGNfdCAqcGMsIHVuc2lnbmVkIGludCBiY291bnQpCit7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gcGMtPmJoOworCWludCBjb3VudDsKKworCXdoaWxlIChiY291bnQpIHsKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwkJaWYgKGJoID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJoID09IE5VTEwgaW4gIgorCQkJCSJpZGV0YXBlX2lucHV0X2J1ZmZlcnNcbiIpOworCQkJaWRldGFwZV9kaXNjYXJkX2RhdGEoZHJpdmUsIGJjb3VudCk7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwkJY291bnQgPSBtaW4oKHVuc2lnbmVkIGludCkoYmgtPmJfc2l6ZSAtIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkpLCBiY291bnQpOworCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIGJoLT5iX2RhdGEgKyBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpLCBjb3VudCk7CisJCWJjb3VudCAtPSBjb3VudDsKKwkJYXRvbWljX2FkZChjb3VudCwgJmJoLT5iX2NvdW50KTsKKwkJaWYgKGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkgPT0gYmgtPmJfc2l6ZSkgeworCQkJYmggPSBiaC0+Yl9yZXFuZXh0OworCQkJaWYgKGJoKQorCQkJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKKwkJfQorCX0KKwlwYy0+YmggPSBiaDsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9vdXRwdXRfYnVmZmVycyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGV0YXBlX3BjX3QgKnBjLCB1bnNpZ25lZCBpbnQgYmNvdW50KQoreworCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHBjLT5iaDsKKwlpbnQgY291bnQ7CisKKwl3aGlsZSAoYmNvdW50KSB7CisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJCWlmIChiaCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICIKKwkJCQkiaWRldGFwZV9vdXRwdXRfYnVmZmVyc1xuIik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwkJY291bnQgPSBtaW4oKHVuc2lnbmVkIGludClwYy0+Yl9jb3VudCwgKHVuc2lnbmVkIGludCliY291bnQpOworCQlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBwYy0+Yl9kYXRhLCBjb3VudCk7CisJCWJjb3VudCAtPSBjb3VudDsKKwkJcGMtPmJfZGF0YSArPSBjb3VudDsKKwkJcGMtPmJfY291bnQgLT0gY291bnQ7CisJCWlmICghcGMtPmJfY291bnQpIHsKKwkJCXBjLT5iaCA9IGJoID0gYmgtPmJfcmVxbmV4dDsKKwkJCWlmIChiaCkgeworCQkJCXBjLT5iX2RhdGEgPSBiaC0+Yl9kYXRhOworCQkJCXBjLT5iX2NvdW50ID0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaWRldGFwZV91cGRhdGVfYnVmZmVycyAoaWRldGFwZV9wY190ICpwYykKK3sKKwlzdHJ1Y3QgaWRldGFwZV9iaCAqYmggPSBwYy0+Ymg7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGludCBiY291bnQgPSBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQ7CisKKwlpZiAodGVzdF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncykpCisJCXJldHVybjsKKwl3aGlsZSAoYmNvdW50KSB7CisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJCWlmIChiaCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICIKKwkJCQkiaWRldGFwZV91cGRhdGVfYnVmZmVyc1xuIik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwkJY291bnQgPSBtaW4oKHVuc2lnbmVkIGludCliaC0+Yl9zaXplLCAodW5zaWduZWQgaW50KWJjb3VudCk7CisJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCBjb3VudCk7CisJCWlmIChhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpID09IGJoLT5iX3NpemUpCisJCQliaCA9IGJoLT5iX3JlcW5leHQ7CisJCWJjb3VudCAtPSBjb3VudDsKKwl9CisJcGMtPmJoID0gYmg7Cit9CisKKy8qCisgKglpZGV0YXBlX25leHRfcGNfc3RvcmFnZSByZXR1cm5zIGEgcG9pbnRlciB0byBhIHBsYWNlIGluIHdoaWNoIHdlIGNhbgorICoJc2FmZWx5IHN0b3JlIGEgcGFja2V0IGNvbW1hbmQsIGV2ZW4gdGhvdWdoIHdlIGludGVuZCB0byBsZWF2ZSB0aGUKKyAqCWRyaXZlci4gQSBzdG9yYWdlIHNwYWNlIGZvciBhIG1heGltdW0gb2YgSURFVEFQRV9QQ19TVEFDSyBwYWNrZXQKKyAqCWNvbW1hbmRzIGlzIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorICovCitzdGF0aWMgaWRldGFwZV9wY190ICppZGV0YXBlX25leHRfcGNfc3RvcmFnZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IHBjX3N0YWNrX2luZGV4PSVkXG4iLAorCQkJdGFwZS0+cGNfc3RhY2tfaW5kZXgpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisJaWYgKHRhcGUtPnBjX3N0YWNrX2luZGV4ID09IElERVRBUEVfUENfU1RBQ0spCisJCXRhcGUtPnBjX3N0YWNrX2luZGV4PTA7CisJcmV0dXJuICgmdGFwZS0+cGNfc3RhY2tbdGFwZS0+cGNfc3RhY2tfaW5kZXgrK10pOworfQorCisvKgorICoJaWRldGFwZV9uZXh0X3JxX3N0b3JhZ2UgaXMgdXNlZCBhbG9uZyB3aXRoIGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlLgorICoJU2luY2Ugd2UgcXVldWUgcGFja2V0IGNvbW1hbmRzIGluIHRoZSByZXF1ZXN0IHF1ZXVlLCB3ZSBuZWVkIHRvCisgKglhbGxvY2F0ZSBhIHJlcXVlc3QsIGFsb25nIHdpdGggdGhlIGFsbG9jYXRpb24gb2YgYSBwYWNrZXQgY29tbWFuZC4KKyAqLworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBUaGlzIHNob3VsZCBnZXQgZml4ZWQgdG8gdXNlIGttYWxsb2MoLi4sIEdGUF9BVE9NSUMpICAgICAgKgorICogIGZvbGxvd2VkIGxhdGVyIG9uIGJ5IGtmcmVlKCkuICAgLW1sICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqaWRldGFwZV9uZXh0X3JxX3N0b3JhZ2UgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDUpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBycV9zdGFja19pbmRleD0lZFxuIiwKKwkJCXRhcGUtPnJxX3N0YWNrX2luZGV4KTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCWlmICh0YXBlLT5ycV9zdGFja19pbmRleCA9PSBJREVUQVBFX1BDX1NUQUNLKQorCQl0YXBlLT5ycV9zdGFja19pbmRleD0wOworCXJldHVybiAoJnRhcGUtPnJxX3N0YWNrW3RhcGUtPnJxX3N0YWNrX2luZGV4KytdKTsKK30KKworLyoKKyAqCWlkZXRhcGVfaW5pdF9wYyBpbml0aWFsaXplcyBhIHBhY2tldCBjb21tYW5kLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2luaXRfcGMgKGlkZXRhcGVfcGNfdCAqcGMpCit7CisJbWVtc2V0KHBjLT5jLCAwLCAxMik7CisJcGMtPnJldHJpZXMgPSAwOworCXBjLT5mbGFncyA9IDA7CisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSAwOworCXBjLT5idWZmZXIgPSBwYy0+cGNfYnVmZmVyOworCXBjLT5idWZmZXJfc2l6ZSA9IElERVRBUEVfUENfQlVGRkVSX1NJWkU7CisJcGMtPmJoID0gTlVMTDsKKwlwYy0+Yl9kYXRhID0gTlVMTDsKK30KKworLyoKKyAqCWlkZXRhcGVfYW5hbHl6ZV9lcnJvciBpcyBjYWxsZWQgb24gZWFjaCBmYWlsZWQgcGFja2V0IGNvbW1hbmQgcmV0cnkKKyAqCXRvIGFuYWx5emUgdGhlIHJlcXVlc3Qgc2Vuc2UuIFdlIGN1cnJlbnRseSBkbyBub3QgdXRpbGl6ZSB0aGlzCisgKglpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWRldGFwZV9hbmFseXplX2Vycm9yIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcmVxdWVzdF9zZW5zZV9yZXN1bHRfdCAqcmVzdWx0KQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfcGNfdCAqcGMgPSB0YXBlLT5mYWlsZWRfcGM7CisKKwl0YXBlLT5zZW5zZSAgICAgPSAqcmVzdWx0OworCXRhcGUtPnNlbnNlX2tleSA9IHJlc3VsdC0+c2Vuc2Vfa2V5OworCXRhcGUtPmFzYyAgICAgICA9IHJlc3VsdC0+YXNjOworCXRhcGUtPmFzY3EgICAgICA9IHJlc3VsdC0+YXNjcTsKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCS8qCisJICoJV2l0aG91dCBkZWJ1Z2dpbmcsIHdlIG9ubHkgbG9nIGFuIGVycm9yIGlmIHdlIGRlY2lkZWQgdG8KKwkgKglnaXZlIHVwIHJldHJ5aW5nLgorCSAqLworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAxKQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogcGMgPSAleCwgc2Vuc2Uga2V5ID0gJXgsICIKKwkJCSJhc2MgPSAleCwgYXNjcSA9ICV4XG4iLAorCQkJcGMtPmNbMF0sIHJlc3VsdC0+c2Vuc2Vfa2V5LAorCQkJcmVzdWx0LT5hc2MsIHJlc3VsdC0+YXNjcSk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCS8qCisJICoJQ29ycmVjdCBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgYnkgYXNraW5nIHRoZSB0YXBlLgorCSAqLworCWlmICh0ZXN0X2JpdChQQ19ETUFfRVJST1IsICZwYy0+ZmxhZ3MpKSB7CisJCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCA9IHBjLT5yZXF1ZXN0X3RyYW5zZmVyIC0gdGFwZS0+dGFwZV9ibG9ja19zaXplICogbnRvaGwoZ2V0X3VuYWxpZ25lZCgmcmVzdWx0LT5pbmZvcm1hdGlvbikpOworCQlpZGV0YXBlX3VwZGF0ZV9idWZmZXJzKHBjKTsKKwl9CisKKwkvKgorCSAqIElmIGVycm9yIHdhcyB0aGUgcmVzdWx0IG9mIGEgemVyby1sZW5ndGggcmVhZCBvciB3cml0ZSBjb21tYW5kLAorCSAqIHdpdGggc2Vuc2Uga2V5PTUsIGFzYz0weDIyLCBhc2NxPTAsIGxldCBpdCBzbGlkZS4gIFNvbWUgZHJpdmVzCisJICogKGkuZS4gU2VhZ2F0ZSBTVFQzNDAxQSBUcmF2YW4pIGRvbid0IHN1cHBvcnQgMC1sZW5ndGggcmVhZC93cml0ZXMuCisJICovCisJaWYgKChwYy0+Y1swXSA9PSBJREVUQVBFX1JFQURfQ01EIHx8IHBjLT5jWzBdID09IElERVRBUEVfV1JJVEVfQ01EKQorCSAgICAmJiBwYy0+Y1s0XSA9PSAwICYmIHBjLT5jWzNdID09IDAgJiYgcGMtPmNbMl0gPT0gMCkgeyAvKiBsZW5ndGg9PTAgKi8KKwkJaWYgKHJlc3VsdC0+c2Vuc2Vfa2V5ID09IDUpIHsKKwkJCS8qIGRvbid0IHJlcG9ydCBhbiBlcnJvciwgZXZlcnl0aGluZydzIG9rICovCisJCQlwYy0+ZXJyb3IgPSAwOworCQkJLyogZG9uJ3QgcmV0cnkgcmVhZC93cml0ZSAqLworCQkJc2V0X2JpdChQQ19BQk9SVCwgJnBjLT5mbGFncyk7CisJCX0KKwl9CisJaWYgKHBjLT5jWzBdID09IElERVRBUEVfUkVBRF9DTUQgJiYgcmVzdWx0LT5maWxlbWFyaykgeworCQlwYy0+ZXJyb3IgPSBJREVUQVBFX0VSUk9SX0ZJTEVNQVJLOworCQlzZXRfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKTsKKwl9CisJaWYgKHBjLT5jWzBdID09IElERVRBUEVfV1JJVEVfQ01EKSB7CisJCWlmIChyZXN1bHQtPmVvbSB8fAorCQkgICAgKHJlc3VsdC0+c2Vuc2Vfa2V5ID09IDB4ZCAmJiByZXN1bHQtPmFzYyA9PSAweDAgJiYKKwkJICAgICByZXN1bHQtPmFzY3EgPT0gMHgyKSkgeworCQkJcGMtPmVycm9yID0gSURFVEFQRV9FUlJPUl9FT0Q7CisJCQlzZXRfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKTsKKwkJfQorCX0KKwlpZiAocGMtPmNbMF0gPT0gSURFVEFQRV9SRUFEX0NNRCB8fCBwYy0+Y1swXSA9PSBJREVUQVBFX1dSSVRFX0NNRCkgeworCQlpZiAocmVzdWx0LT5zZW5zZV9rZXkgPT0gOCkgeworCQkJcGMtPmVycm9yID0gSURFVEFQRV9FUlJPUl9FT0Q7CisJCQlzZXRfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKTsKKwkJfQorCQlpZiAoIXRlc3RfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKSAmJgorCQkgICAgcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkKQorCQkJcGMtPnJldHJpZXMgPSBJREVUQVBFX01BWF9QQ19SRVRSSUVTICsgMTsKKwl9Cit9CisKKy8qCisgKiBpZGV0YXBlX2FjdGl2ZV9uZXh0X3N0YWdlIHdpbGwgZGVjbGFyZSB0aGUgbmV4dCBzdGFnZSBhcyAiYWN0aXZlIi4KKyAqLworc3RhdGljIHZvaWQgaWRldGFwZV9hY3RpdmVfbmV4dF9zdGFnZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2UgPSB0YXBlLT5uZXh0X3N0YWdlOworCXN0cnVjdCByZXF1ZXN0ICpycSA9ICZzdGFnZS0+cnE7CisKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSA0KQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2FjdGl2ZV9uZXh0X3N0YWdlXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworI2lmIElERVRBUEVfREVCVUdfQlVHUworCWlmIChzdGFnZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJ1ZzogVHJ5aW5nIHRvIGFjdGl2YXRlIGEgbm9uIGV4aXN0aW5nIHN0YWdlXG4iKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8JCisKKwlycS0+cnFfZGlzayA9IHRhcGUtPmRpc2s7CisJcnEtPmJ1ZmZlciA9IE5VTEw7CisJcnEtPnNwZWNpYWwgPSAodm9pZCAqKXN0YWdlLT5iaDsKKwl0YXBlLT5hY3RpdmVfZGF0YV9yZXF1ZXN0ID0gcnE7CisJdGFwZS0+YWN0aXZlX3N0YWdlID0gc3RhZ2U7CisJdGFwZS0+bmV4dF9zdGFnZSA9IHN0YWdlLT5uZXh0OworfQorCisvKgorICoJaWRldGFwZV9pbmNyZWFzZV9tYXhfcGlwZWxpbmVfc3RhZ2VzIGlzIGEgcGFydCBvZiB0aGUgZmVlZGJhY2sKKyAqCWxvb3Agd2hpY2ggdHJpZXMgdG8gZmluZCB0aGUgb3B0aW11bSBudW1iZXIgb2Ygc3RhZ2VzLiBJbiB0aGUKKyAqCWZlZWRiYWNrIGxvb3AsIHdlIGFyZSBzdGFydGluZyBmcm9tIGEgbWluaW11bSBtYXhpbXVtIG51bWJlciBvZgorICoJc3RhZ2VzLCBhbmQgaWYgd2Ugc2Vuc2UgdGhhdCB0aGUgcGlwZWxpbmUgaXMgZW1wdHksIHdlIHRyeSB0bworICoJaW5jcmVhc2UgaXQsIHVudGlsIHdlIHJlYWNoIHRoZSB1c2VyIGNvbXBpbGUgdGltZSBtZW1vcnkgbGltaXQuCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfaW5jcmVhc2VfbWF4X3BpcGVsaW5lX3N0YWdlcyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWludCBpbmNyZWFzZSA9ICh0YXBlLT5tYXhfcGlwZWxpbmUgLSB0YXBlLT5taW5fcGlwZWxpbmUpIC8gMTA7CisJCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJcHJpbnRrIChLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfaW5jcmVhc2VfbWF4X3BpcGVsaW5lX3N0YWdlc1xuIik7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCXRhcGUtPm1heF9zdGFnZXMgKz0gbWF4KGluY3JlYXNlLCAxKTsKKwl0YXBlLT5tYXhfc3RhZ2VzID0gbWF4KHRhcGUtPm1heF9zdGFnZXMsIHRhcGUtPm1pbl9waXBlbGluZSk7CisJdGFwZS0+bWF4X3N0YWdlcyA9IG1pbih0YXBlLT5tYXhfc3RhZ2VzLCB0YXBlLT5tYXhfcGlwZWxpbmUpOworfQorCisvKgorICoJaWRldGFwZV9rZnJlZV9zdGFnZSBjYWxscyBrZnJlZSB0byBjb21wbGV0ZWx5IGZyZWUgYSBzdGFnZSwgYWxvbmcgd2l0aAorICoJaXRzIHJlbGF0ZWQgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgX19pZGV0YXBlX2tmcmVlX3N0YWdlIChpZGV0YXBlX3N0YWdlX3QgKnN0YWdlKQoreworCXN0cnVjdCBpZGV0YXBlX2JoICpwcmV2X2JoLCAqYmggPSBzdGFnZS0+Ymg7CisJaW50IHNpemU7CisKKwl3aGlsZSAoYmggIT0gTlVMTCkgeworCQlpZiAoYmgtPmJfZGF0YSAhPSBOVUxMKSB7CisJCQlzaXplID0gKGludCkgYmgtPmJfc2l6ZTsKKwkJCXdoaWxlIChzaXplID4gMCkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYmgtPmJfZGF0YSk7CisJCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJCQkJYmgtPmJfZGF0YSArPSBQQUdFX1NJWkU7CisJCQl9CisJCX0KKwkJcHJldl9iaCA9IGJoOworCQliaCA9IGJoLT5iX3JlcW5leHQ7CisJCWtmcmVlKHByZXZfYmgpOworCX0KKwlrZnJlZShzdGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfa2ZyZWVfc3RhZ2UgKGlkZXRhcGVfdGFwZV90ICp0YXBlLCBpZGV0YXBlX3N0YWdlX3QgKnN0YWdlKQoreworCV9faWRldGFwZV9rZnJlZV9zdGFnZShzdGFnZSk7Cit9CisKKy8qCisgKglpZGV0YXBlX3JlbW92ZV9zdGFnZV9oZWFkIHJlbW92ZXMgdGFwZS0+Zmlyc3Rfc3RhZ2UgZnJvbSB0aGUgcGlwZWxpbmUuCisgKglUaGUgY2FsbGVyIHNob3VsZCBhdm9pZCByYWNlIGNvbmRpdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfcmVtb3ZlX3N0YWdlX2hlYWQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3N0YWdlX3QgKnN0YWdlOworCQorI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfcmVtb3ZlX3N0YWdlX2hlYWRcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJaWYgKHRhcGUtPmZpcnN0X3N0YWdlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiB0YXBlLT5maXJzdF9zdGFnZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOwkJCisJfQorCWlmICh0YXBlLT5hY3RpdmVfc3RhZ2UgPT0gdGFwZS0+Zmlyc3Rfc3RhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiBUcnlpbmcgdG8gZnJlZSBvdXIgYWN0aXZlIHBpcGVsaW5lIHN0YWdlXG4iKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwlzdGFnZSA9IHRhcGUtPmZpcnN0X3N0YWdlOworCXRhcGUtPmZpcnN0X3N0YWdlID0gc3RhZ2UtPm5leHQ7CisJaWRldGFwZV9rZnJlZV9zdGFnZSh0YXBlLCBzdGFnZSk7CisJdGFwZS0+bnJfc3RhZ2VzLS07CisJaWYgKHRhcGUtPmZpcnN0X3N0YWdlID09IE5VTEwpIHsKKwkJdGFwZS0+bGFzdF9zdGFnZSA9IE5VTEw7CisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJCWlmICh0YXBlLT5uZXh0X3N0YWdlICE9IE5VTEwpCisJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IHRhcGUtPm5leHRfc3RhZ2UgIT0gTlVMTFxuIik7CisJCWlmICh0YXBlLT5ucl9zdGFnZXMpCisJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IG5yX3N0YWdlcyBzaG91bGQgYmUgMCBub3dcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCX0KK30KKworLyoKKyAqIFRoaXMgd2lsbCBmcmVlIGFsbCB0aGUgcGlwZWxpbmUgc3RhZ2VzIHN0YXJ0aW5nIGZyb20gbmV3X2xhc3Rfc3RhZ2UtPm5leHQKKyAqIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGFuZCBwb2ludCB0YXBlLT5sYXN0X3N0YWdlIHRvIG5ld19sYXN0X3N0YWdlLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2Fib3J0X3BpcGVsaW5lKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkgICBpZGV0YXBlX3N0YWdlX3QgKm5ld19sYXN0X3N0YWdlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2UgPSBuZXdfbGFzdF9zdGFnZS0+bmV4dDsKKwlpZGV0YXBlX3N0YWdlX3QgKm5zdGFnZTsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlczogaWRldGFwZV9hYm9ydF9waXBlbGluZSBjYWxsZWRcbiIsIHRhcGUtPm5hbWUpOworI2VuZGlmCisJd2hpbGUgKHN0YWdlKSB7CisJCW5zdGFnZSA9IHN0YWdlLT5uZXh0OworCQlpZGV0YXBlX2tmcmVlX3N0YWdlKHRhcGUsIHN0YWdlKTsKKwkJLS10YXBlLT5ucl9zdGFnZXM7CisJCS0tdGFwZS0+bnJfcGVuZGluZ19zdGFnZXM7CisJCXN0YWdlID0gbnN0YWdlOworCX0KKwlpZiAobmV3X2xhc3Rfc3RhZ2UpCisJCW5ld19sYXN0X3N0YWdlLT5uZXh0ID0gTlVMTDsKKwl0YXBlLT5sYXN0X3N0YWdlID0gbmV3X2xhc3Rfc3RhZ2U7CisJdGFwZS0+bmV4dF9zdGFnZSA9IE5VTEw7Cit9CisKKy8qCisgKglpZGV0YXBlX2VuZF9yZXF1ZXN0IGlzIHVzZWQgdG8gZmluaXNoIHNlcnZpY2luZyBhIHJlcXVlc3QsIGFuZCB0bworICoJaW5zZXJ0IGEgcGVuZGluZyBwaXBlbGluZSByZXF1ZXN0IGludG8gdGhlIG1haW4gZGV2aWNlIHF1ZXVlLgorICovCitzdGF0aWMgaW50IGlkZXRhcGVfZW5kX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0cykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyb3I7CisJaW50IHJlbW92ZV9zdGFnZSA9IDA7CisJaWRldGFwZV9zdGFnZV90ICphY3RpdmVfc3RhZ2U7CisKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworICAgICAgICBpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2VuZF9yZXF1ZXN0XG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCisJc3dpdGNoICh1cHRvZGF0ZSkgeworCQljYXNlIDA6CWVycm9yID0gSURFVEFQRV9FUlJPUl9HRU5FUkFMOyBicmVhazsKKwkJY2FzZSAxOiBlcnJvciA9IDA7IGJyZWFrOworCQlkZWZhdWx0OiBlcnJvciA9IHVwdG9kYXRlOworCX0KKwlycS0+ZXJyb3JzID0gZXJyb3I7CisJaWYgKGVycm9yKQorCQl0YXBlLT5mYWlsZWRfcGMgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBUaGUgcmVxdWVzdCB3YXMgYSBwaXBlbGluZWQgZGF0YSB0cmFuc2ZlciByZXF1ZXN0ICovCisJaWYgKHRhcGUtPmFjdGl2ZV9kYXRhX3JlcXVlc3QgPT0gcnEpIHsKKwkJYWN0aXZlX3N0YWdlID0gdGFwZS0+YWN0aXZlX3N0YWdlOworCQl0YXBlLT5hY3RpdmVfc3RhZ2UgPSBOVUxMOworCQl0YXBlLT5hY3RpdmVfZGF0YV9yZXF1ZXN0ID0gTlVMTDsKKwkJdGFwZS0+bnJfcGVuZGluZ19zdGFnZXMtLTsKKwkJaWYgKHJxLT5jbWRbMF0gJiBSRVFfSURFVEFQRV9XUklURSkgeworCQkJcmVtb3ZlX3N0YWdlID0gMTsKKwkJCWlmIChlcnJvcikgeworCQkJCXNldF9iaXQoSURFVEFQRV9QSVBFTElORV9FUlJPUiwgJnRhcGUtPmZsYWdzKTsKKwkJCQlpZiAoZXJyb3IgPT0gSURFVEFQRV9FUlJPUl9FT0QpCisJCQkJCWlkZXRhcGVfYWJvcnRfcGlwZWxpbmUoZHJpdmUsIGFjdGl2ZV9zdGFnZSk7CisJCQl9CisJCX0gZWxzZSBpZiAocnEtPmNtZFswXSAmIFJFUV9JREVUQVBFX1JFQUQpIHsKKwkJCWlmIChlcnJvciA9PSBJREVUQVBFX0VSUk9SX0VPRCkgeworCQkJCXNldF9iaXQoSURFVEFQRV9QSVBFTElORV9FUlJPUiwgJnRhcGUtPmZsYWdzKTsKKwkJCQlpZGV0YXBlX2Fib3J0X3BpcGVsaW5lKGRyaXZlLCBhY3RpdmVfc3RhZ2UpOworCQkJfQorCQl9CisJCWlmICh0YXBlLT5uZXh0X3N0YWdlICE9IE5VTEwpIHsKKwkJCWlkZXRhcGVfYWN0aXZlX25leHRfc3RhZ2UoZHJpdmUpOworCisJCQkvKgorCQkJICogSW5zZXJ0IHRoZSBuZXh0IHJlcXVlc3QgaW50byB0aGUgcmVxdWVzdCBxdWV1ZS4KKwkJCSAqLworCQkJKHZvaWQpIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsIHRhcGUtPmFjdGl2ZV9kYXRhX3JlcXVlc3QsIGlkZV9lbmQpOworCQl9IGVsc2UgaWYgKCFlcnJvcikgeworCQkJCWlkZXRhcGVfaW5jcmVhc2VfbWF4X3BpcGVsaW5lX3N0YWdlcyhkcml2ZSk7CisJCX0KKwl9CisJaWRlX2VuZF9kcml2ZV9jbWQoZHJpdmUsIDAsIDApOworLy8JYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7CisvLwlkcml2ZS0+cnEgPSBOVUxMOworLy8JZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxKTsKKworCWlmIChyZW1vdmVfc3RhZ2UpCisJCWlkZXRhcGVfcmVtb3ZlX3N0YWdlX2hlYWQoZHJpdmUpOworCWlmICh0YXBlLT5hY3RpdmVfZGF0YV9yZXF1ZXN0ID09IE5VTEwpCisJCWNsZWFyX2JpdChJREVUQVBFX1BJUEVMSU5FX0FDVElWRSwgJnRhcGUtPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXRhcGVfcmVxdWVzdF9zZW5zZV9jYWxsYmFjayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWNoZWQgaWRldGFwZV9yZXF1ZXN0X3NlbnNlX2NhbGxiYWNrXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCWlmICghdGFwZS0+cGMtPmVycm9yKSB7CisJCWlkZXRhcGVfYW5hbHl6ZV9lcnJvcihkcml2ZSwgKGlkZXRhcGVfcmVxdWVzdF9zZW5zZV9yZXN1bHRfdCAqKSB0YXBlLT5wYy0+YnVmZmVyKTsKKwkJaWRldGFwZV9lbmRfcmVxdWVzdChkcml2ZSwgMSwgMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogRXJyb3IgaW4gUkVRVUVTVCBTRU5TRSBpdHNlbGYgLSBBYm9ydGluZyByZXF1ZXN0IVxuIik7CisJCWlkZXRhcGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCX0KKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kIChpZGV0YXBlX3BjX3QgKnBjKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CQorCXBjLT5jWzBdID0gSURFVEFQRV9SRVFVRVNUX1NFTlNFX0NNRDsKKwlwYy0+Y1s0XSA9IDIwOworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gMjA7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcmVxdWVzdF9zZW5zZV9jYWxsYmFjazsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9pbml0X3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgdTggY21kKQoreworCW1lbXNldChycSwgMCwgc2l6ZW9mKCpycSkpOworCXJxLT5mbGFncyA9IFJFUV9TUEVDSUFMOworCXJxLT5jbWRbMF0gPSBjbWQ7Cit9CisKKy8qCisgKglpZGV0YXBlX3F1ZXVlX3BjX2hlYWQgZ2VuZXJhdGVzIGEgbmV3IHBhY2tldCBjb21tYW5kIHJlcXVlc3QgaW4gZnJvbnQKKyAqCW9mIHRoZSByZXF1ZXN0IHF1ZXVlLCBiZWZvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdCwgc28gdGhhdCBpdCB3aWxsIGJlCisgKglwcm9jZXNzZWQgaW1tZWRpYXRlbHksIG9uIHRoZSBuZXh0IHBhc3MgdGhyb3VnaCB0aGUgZHJpdmVyLgorICoKKyAqCWlkZXRhcGVfcXVldWVfcGNfaGVhZCBpcyBjYWxsZWQgZnJvbSB0aGUgcmVxdWVzdCBoYW5kbGluZyBwYXJ0IG9mCisgKgl0aGUgZHJpdmVyICh0aGUgImJvdHRvbSIgcGFydCkuIFNhZmUgc3RvcmFnZSBmb3IgdGhlIHJlcXVlc3Qgc2hvdWxkCisgKgliZSBhbGxvY2F0ZWQgd2l0aCBpZGV0YXBlX25leHRfcGNfc3RvcmFnZSBhbmQgaWRldGFwZV9uZXh0X3JxX3N0b3JhZ2UKKyAqCWJlZm9yZSBjYWxsaW5nIGlkZXRhcGVfcXVldWVfcGNfaGVhZC4KKyAqCisgKglNZW1vcnkgZm9yIHRob3NlIHJlcXVlc3RzIGlzIHByZS1hbGxvY2F0ZWQgYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgYW5kCisgKglpcyBsaW1pdGVkIHRvIElERVRBUEVfUENfU1RBQ0sgcmVxdWVzdHMuIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgZW5vdWdoCisgKglzcGFjZSBmb3IgdGhlIG1heGltdW0gcG9zc2libGUgbnVtYmVyIG9mIGludGVyLWRlcGVuZGVudCBwYWNrZXQgY29tbWFuZHMuCisgKgorICoJVGhlIGhpZ2hlciBsZXZlbCBvZiB0aGUgZHJpdmVyIC0gVGhlIGlvY3RsIGhhbmRsZXIgYW5kIHRoZSBjaGFyYWN0ZXIKKyAqCWRldmljZSBoYW5kbGluZyBmdW5jdGlvbnMgc2hvdWxkIHF1ZXVlIHJlcXVlc3QgdG8gdGhlIGxvd2VyIGxldmVsIHBhcnQKKyAqCWFuZCB3YWl0IGZvciB0aGVpciBjb21wbGV0aW9uIHVzaW5nIGlkZXRhcGVfcXVldWVfcGNfdGFpbCBvcgorICoJaWRldGFwZV9xdWV1ZV9yd190YWlsLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX3F1ZXVlX3BjX2hlYWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRldGFwZV9wY190ICpwYyxzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlkZXRhcGVfaW5pdF9ycShycSwgUkVRX0lERVRBUEVfUEMxKTsKKwlycS0+YnVmZmVyID0gKGNoYXIgKikgcGM7CisJcnEtPnJxX2Rpc2sgPSB0YXBlLT5kaXNrOworCSh2b2lkKSBpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCBycSwgaWRlX3ByZWVtcHQpOworfQorCisvKgorICoJaWRldGFwZV9yZXRyeV9wYyBpcyBjYWxsZWQgd2hlbiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQgZHVyaW5nIHRoZQorICoJbGFzdCBwYWNrZXQgY29tbWFuZC4gV2UgcXVldWUgYSByZXF1ZXN0IHNlbnNlIHBhY2tldCBjb21tYW5kIGluCisgKgl0aGUgaGVhZCBvZiB0aGUgcmVxdWVzdCBsaXN0LgorICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXRhcGVfcmV0cnlfcGMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3BjX3QgKnBjOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlhdGFwaV9lcnJvcl90IGVycm9yOworCisJZXJyb3IuYWxsID0gSFdJRihkcml2ZSktPklOQihJREVfRVJST1JfUkVHKTsKKwlwYyA9IGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwlycSA9IGlkZXRhcGVfbmV4dF9ycV9zdG9yYWdlKGRyaXZlKTsKKwlpZGV0YXBlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChwYyk7CisJc2V0X2JpdChJREVUQVBFX0lHTk9SRV9EU0MsICZ0YXBlLT5mbGFncyk7CisJaWRldGFwZV9xdWV1ZV9wY19oZWFkKGRyaXZlLCBwYywgcnEpOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworLyoKKyAqCWlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdCBwb3N0cG9uZXMgdGhlIGN1cnJlbnQgcmVxdWVzdCBzbyB0aGF0CisgKglpZGUuYyB3aWxsIGJlIGFibGUgdG8gc2VydmljZSByZXF1ZXN0cyBmcm9tIGFub3RoZXIgZGV2aWNlIG9uCisgKgl0aGUgc2FtZSBod2dyb3VwIHdoaWxlIHdlIGFyZSBwb2xsaW5nIGZvciBEU0MuCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IGlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdFxuIik7CisjZW5kaWYKKwl0YXBlLT5wb3N0cG9uZWRfcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJaWRlX3N0YWxsX3F1ZXVlKGRyaXZlLCB0YXBlLT5kc2NfcG9sbGluZ19mcmVxdWVuY3kpOworfQorCisvKgorICoJaWRldGFwZV9wY19pbnRyIGlzIHRoZSB1c3VhbCBpbnRlcnJ1cHQgaGFuZGxlciB3aGljaCB3aWxsIGJlIGNhbGxlZAorICoJZHVyaW5nIGEgcGFja2V0IGNvbW1hbmQuIFdlIHdpbGwgdHJhbnNmZXIgc29tZSBvZiB0aGUgZGF0YSAoYXMKKyAqCXJlcXVlc3RlZCBieSB0aGUgZHJpdmUpIGFuZCB3aWxsIHJlLXBvaW50IGludGVycnVwdCBoYW5kbGVyIHRvIHVzLgorICoJV2hlbiBkYXRhIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCB3ZSB3aWxsIGFjdCBhY2NvcmRpbmcgdG8gdGhlCisgKglhbGdvcml0aG0gZGVzY3JpYmVkIGJlZm9yZSBpZGV0YXBlX2lzc3VlX3BhY2tldF9jb21tYW5kLgorICoKKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX3BjX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJYXRhcGlfc3RhdHVzX3Qgc3RhdHVzOworCWF0YXBpX2Jjb3VudF90IGJjb3VudDsKKwlhdGFwaV9pcmVhc29uX3QgaXJlYXNvbjsKKwlpZGV0YXBlX3BjX3QgKnBjID0gdGFwZS0+cGM7CisKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKyNpZiBTSU1VTEFURV9FUlJPUlMKKwlzdGF0aWMgaW50IGVycm9yX3NpbV9jb3VudCA9IDA7CisjZW5kaWYKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfcGNfaW50ciAiCisJCQkJImludGVycnVwdCBoYW5kbGVyXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLwkKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlzdGF0dXMuYWxsID0gSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRyk7CisKKwlpZiAodGVzdF9iaXQoUENfRE1BX0lOX1BST0dSRVNTLCAmcGMtPmZsYWdzKSkgeworCQlpZiAoSFdJRihkcml2ZSktPmlkZV9kbWFfZW5kKGRyaXZlKSB8fCBzdGF0dXMuYi5jaGVjaykgeworCQkJLyoKKwkJCSAqIEEgRE1BIGVycm9yIGlzIHNvbWV0aW1lcyBleHBlY3RlZC4gRm9yIGV4YW1wbGUsCisJCQkgKiBpZiB0aGUgdGFwZSBpcyBjcm9zc2luZyBhIGZpbGVtYXJrIGR1cmluZyBhCisJCQkgKiBSRUFEIGNvbW1hbmQsIGl0IHdpbGwgaXNzdWUgYW4gaXJxIGFuZCBwb3NpdGlvbgorCQkJICogaXRzZWxmIGJlZm9yZSB0aGUgZmlsZW1hcmssIHNvIHRoYXQgb25seSBhIHBhcnRpYWwKKwkJCSAqIGRhdGEgdHJhbnNmZXIgd2lsbCBvY2N1ciAod2hpY2ggY2F1c2VzIHRoZSBETUEKKwkJCSAqIGVycm9yKS4gSW4gdGhhdCBjYXNlLCB3ZSB3aWxsIGxhdGVyIGFzayB0aGUgdGFwZQorCQkJICogaG93IG11Y2ggYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2VyZQorCQkJICogYWN0dWFsbHkgdHJhbnNmZXJyZWQgKHdlIGNhbid0IHJlY2VpdmUgdGhhdAorCQkJICogaW5mb3JtYXRpb24gZnJvbSB0aGUgRE1BIGVuZ2luZSBvbiBtb3N0IGNoaXBzZXRzKS4KKwkJCSAqLworCisJCQkvKgorCQkJICogT24gdGhlIGNvbnRyYXJ5LCBhIERNQSBlcnJvciBpcyBuZXZlciBleHBlY3RlZDsKKwkJCSAqIGl0IHVzdWFsbHkgaW5kaWNhdGVzIGEgaGFyZHdhcmUgZXJyb3Igb3IgYWJvcnQuCisJCQkgKiBJZiB0aGUgdGFwZSBjcm9zc2VzIGEgZmlsZW1hcmsgZHVyaW5nIGEgUkVBRAorCQkJICogY29tbWFuZCwgaXQgd2lsbCBpc3N1ZSBhbiBpcnEgYW5kIHBvc2l0aW9uIGl0c2VsZgorCQkJICogYWZ0ZXIgdGhlIGZpbGVtYXJrIChub3QgYmVmb3JlKS4gT25seSBhIHBhcnRpYWwKKwkJCSAqIGRhdGEgdHJhbnNmZXIgd2lsbCBvY2N1ciwgYnV0IG5vIERNQSBlcnJvci4KKwkJCSAqIChBUywgMTkgQXByIDIwMDEpCisJCQkgKi8KKwkJCXNldF9iaXQoUENfRE1BX0VSUk9SLCAmcGMtPmZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCA9IHBjLT5yZXF1ZXN0X3RyYW5zZmVyOworCQkJaWRldGFwZV91cGRhdGVfYnVmZmVycyhwYyk7CisJCX0KKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCQlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBETUEgZmluaXNoZWRcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisJfQorCisJLyogTm8gbW9yZSBpbnRlcnJ1cHRzICovCisJaWYgKCFzdGF0dXMuYi5kcnEpIHsKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCQlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBQYWNrZXQgY29tbWFuZCBjb21wbGV0ZWQsICVkIGJ5dGVzIHRyYW5zZmVycmVkXG4iLCBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisJCWNsZWFyX2JpdChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpOworCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworI2lmIFNJTVVMQVRFX0VSUk9SUworCQlpZiAoKHBjLT5jWzBdID09IElERVRBUEVfV1JJVEVfQ01EIHx8CisJCSAgICAgcGMtPmNbMF0gPT0gSURFVEFQRV9SRUFEX0NNRCkgJiYKKwkJICAgICgrK2Vycm9yX3NpbV9jb3VudCAlIDEwMCkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6ICVzOiBzaW11bGF0aW5nIGVycm9yXG4iLAorCQkJCXRhcGUtPm5hbWUpOworCQkJc3RhdHVzLmIuY2hlY2sgPSAxOworCQl9CisjZW5kaWYKKwkJaWYgKHN0YXR1cy5iLmNoZWNrICYmIHBjLT5jWzBdID09IElERVRBUEVfUkVRVUVTVF9TRU5TRV9DTUQpCisJCQlzdGF0dXMuYi5jaGVjayA9IDA7CisJCWlmIChzdGF0dXMuYi5jaGVjayB8fCB0ZXN0X2JpdChQQ19ETUFfRVJST1IsICZwYy0+ZmxhZ3MpKSB7CS8qIEVycm9yIGRldGVjdGVkICovCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwkJCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAxKQorCQkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlczogSS9PIGVycm9yXG4iLAorCQkJCQl0YXBlLT5uYW1lKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCQkJaWYgKHBjLT5jWzBdID09IElERVRBUEVfUkVRVUVTVF9TRU5TRV9DTUQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBJL08gZXJyb3IgaW4gcmVxdWVzdCBzZW5zZSBjb21tYW5kXG4iKTsKKwkJCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwkJCX0KKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCQkJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFtjbWQgJXhdOiBjaGVjayBjb25kaXRpb25cbiIsIHBjLT5jWzBdKTsKKyNlbmRpZgorCQkJLyogUmV0cnkgb3BlcmF0aW9uICovCisJCQlyZXR1cm4gaWRldGFwZV9yZXRyeV9wYyhkcml2ZSk7CisJCX0KKwkJcGMtPmVycm9yID0gMDsKKwkJaWYgKHRlc3RfYml0KFBDX1dBSVRfRk9SX0RTQywgJnBjLT5mbGFncykgJiYKKwkJICAgICFzdGF0dXMuYi5kc2MpIHsKKwkJCS8qIE1lZGlhIGFjY2VzcyBjb21tYW5kICovCisJCQl0YXBlLT5kc2NfcG9sbGluZ19zdGFydCA9IGppZmZpZXM7CisJCQl0YXBlLT5kc2NfcG9sbGluZ19mcmVxdWVuY3kgPSBJREVUQVBFX0RTQ19NQV9GQVNUOworCQkJdGFwZS0+ZHNjX3RpbWVvdXQgPSBqaWZmaWVzICsgSURFVEFQRV9EU0NfTUFfVElNRU9VVDsKKwkJCS8qIEFsbG93IGlkZS5jIHRvIGhhbmRsZSBvdGhlciByZXF1ZXN0cyAqLworCQkJaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGRyaXZlKTsKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfQorCQlpZiAodGFwZS0+ZmFpbGVkX3BjID09IHBjKQorCQkJdGFwZS0+ZmFpbGVkX3BjID0gTlVMTDsKKwkJLyogQ29tbWFuZCBmaW5pc2hlZCAtIENhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJCXJldHVybiBwYy0+Y2FsbGJhY2soZHJpdmUpOworCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBDX0RNQV9JTl9QUk9HUkVTUywgJnBjLT5mbGFncykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogVGhlIHRhcGUgd2FudHMgdG8gaXNzdWUgbW9yZSAiCisJCQkJImludGVycnVwdHMgaW4gRE1BIG1vZGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBETUEgZGlzYWJsZWQsIHJldmVydGluZyB0byBQSU9cbiIpOworCQkodm9pZClfX2lkZV9kbWFfb2ZmKGRyaXZlKTsKKwkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CisJfQorCS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIG9uIHRoaXMgaW50ZXJydXB0LiAqLworCWJjb3VudC5iLmhpZ2ggPSBod2lmLT5JTkIoSURFX0JDT1VOVEhfUkVHKTsKKwliY291bnQuYi5sb3cgPSBod2lmLT5JTkIoSURFX0JDT1VOVExfUkVHKTsKKworCWlyZWFzb24uYWxsID0gaHdpZi0+SU5CKElERV9JUkVBU09OX1JFRyk7CisKKwlpZiAoaXJlYXNvbi5iLmNvZCkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBDb0QgIT0gMCBpbiBpZGV0YXBlX3BjX2ludHJcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwl9CisJaWYgKGlyZWFzb24uYi5pbyA9PSB0ZXN0X2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKSkgeworCQkvKiBIb3BlZnVsbHksIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogV2Ugd2FudGVkIHRvICVzLCAiLAorCQkJaXJlYXNvbi5iLmlvID8gIldyaXRlIjoiUmVhZCIpOworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidXQgdGhlIHRhcGUgd2FudHMgdXMgdG8gJXMgIVxuIiwKKwkJCWlyZWFzb24uYi5pbyA/ICJSZWFkIjoiV3JpdGUiKTsKKwkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CisJfQorCWlmICghdGVzdF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncykpIHsKKwkJLyogUmVhZGluZyAtIENoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgKi8KKwkJdGVtcCA9IHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCArIGJjb3VudC5hbGw7CisJCWlmICh0ZW1wID4gcGMtPnJlcXVlc3RfdHJhbnNmZXIpIHsKKwkJCWlmICh0ZW1wID4gcGMtPmJ1ZmZlcl9zaXplKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogVGhlIHRhcGUgd2FudHMgdG8gc2VuZCB1cyBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCAtIGRpc2NhcmRpbmcgZGF0YVxuIik7CisJCQkJaWRldGFwZV9kaXNjYXJkX2RhdGEoZHJpdmUsIGJjb3VudC5hbGwpOworCQkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXRhcGVfcGNfaW50ciwgSURFVEFQRV9XQUlUX0NNRCwgTlVMTCk7CisJCQkJcmV0dXJuIGlkZV9zdGFydGVkOworCQkJfQorI2lmIElERVRBUEVfREVCVUdfTE9HCisJCQlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImlkZS10YXBlOiBUaGUgdGFwZSB3YW50cyB0byBzZW5kIHVzIG1vcmUgZGF0YSB0aGFuIGV4cGVjdGVkIC0gYWxsb3dpbmcgdHJhbnNmZXJcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisJCX0KKwl9CisJaWYgKHRlc3RfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpKSB7CisJCWlmIChwYy0+YmggIT0gTlVMTCkKKwkJCWlkZXRhcGVfb3V0cHV0X2J1ZmZlcnMoZHJpdmUsIHBjLCBiY291bnQuYWxsKTsKKwkJZWxzZQorCQkJLyogV3JpdGUgdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCQlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBwYy0+Y3VycmVudF9wb3NpdGlvbiwgYmNvdW50LmFsbCk7CisJfSBlbHNlIHsKKwkJaWYgKHBjLT5iaCAhPSBOVUxMKQorCQkJaWRldGFwZV9pbnB1dF9idWZmZXJzKGRyaXZlLCBwYywgYmNvdW50LmFsbCk7CisJCWVsc2UKKwkJCS8qIFJlYWQgdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCQlIV0lGKGRyaXZlKS0+YXRhcGlfaW5wdXRfYnl0ZXMoZHJpdmUsIHBjLT5jdXJyZW50X3Bvc2l0aW9uLCBiY291bnQuYWxsKTsKKwl9CisJLyogVXBkYXRlIHRoZSBjdXJyZW50IHBvc2l0aW9uICovCisJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkICs9IGJjb3VudC5hbGw7CisJcGMtPmN1cnJlbnRfcG9zaXRpb24gKz0gYmNvdW50LmFsbDsKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAyKQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogW2NtZCAleF0gdHJhbnNmZXJyZWQgJWQgYnl0ZXMgb24gdGhhdCBpbnRlcnJ1cHRcbiIsIHBjLT5jWzBdLCBiY291bnQuYWxsKTsKKyNlbmRpZgorCS8qIEFuZCBzZXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGFnYWluICovCisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRldGFwZV9wY19pbnRyLCBJREVUQVBFX1dBSVRfQ01ELCBOVUxMKTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKKy8qCisgKglQYWNrZXQgQ29tbWFuZCBJbnRlcmZhY2UKKyAqCisgKglUaGUgY3VycmVudCBQYWNrZXQgQ29tbWFuZCBpcyBhdmFpbGFibGUgaW4gdGFwZS0+cGMsIGFuZCB3aWxsIG5vdAorICoJY2hhbmdlIHVudGlsIHdlIGZpbmlzaCBoYW5kbGluZyBpdC4gRWFjaCBwYWNrZXQgY29tbWFuZCBpcyBhc3NvY2lhdGVkCisgKgl3aXRoIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGlzCisgKglmaW5pc2hlZC4KKyAqCisgKglUaGUgaGFuZGxpbmcgd2lsbCBiZSBkb25lIGluIHRocmVlIHN0YWdlczoKKyAqCisgKgkxLglpZGV0YXBlX2lzc3VlX3BhY2tldF9jb21tYW5kIHdpbGwgc2VuZCB0aGUgcGFja2V0IGNvbW1hbmQgdG8gdGhlCisgKgkJZHJpdmUsIGFuZCB3aWxsIHNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gaWRldGFwZV9wY19pbnRyLgorICoKKyAqCTIuCU9uIGVhY2ggaW50ZXJydXB0LCBpZGV0YXBlX3BjX2ludHIgd2lsbCBiZSBjYWxsZWQuIFRoaXMgc3RlcAorICoJCXdpbGwgYmUgcmVwZWF0ZWQgdW50aWwgdGhlIGRldmljZSBzaWduYWxzIHVzIHRoYXQgbm8gbW9yZQorICoJCWludGVycnVwdHMgd2lsbCBiZSBpc3N1ZWQuCisgKgorICoJMy4JQVRBUEkgVGFwZSBtZWRpYSBhY2Nlc3MgY29tbWFuZHMgaGF2ZSBpbW1lZGlhdGUgc3RhdHVzIHdpdGggYQorICoJCWRlbGF5ZWQgcHJvY2Vzcy4gSW4gY2FzZSBvZiBhIHN1Y2Nlc3NmdWwgaW5pdGlhdGlvbiBvZiBhCisgKgkJbWVkaWEgYWNjZXNzIHBhY2tldCBjb21tYW5kLCB0aGUgRFNDIGJpdCB3aWxsIGJlIHNldCB3aGVuIHRoZQorICoJCWFjdHVhbCBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmQgaXMgZmluaXNoZWQuIAorICoJCVNpbmNlIHRoZSB0YXBlIGRyaXZlIHdpbGwgbm90IGlzc3VlIGFuIGludGVycnVwdCwgd2UgaGF2ZSB0bworICoJCXBvbGwgZm9yIHRoaXMgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgZGVmaW5lIHRoZSByZXF1ZXN0IGFzCisgKgkJImxvdyBwcmlvcml0eSByZXF1ZXN0IiBieSBzZXR0aW5nIHJxX3N0YXR1cyB0bworICoJCUlERVRBUEVfUlFfUE9TVFBPTkVELCAJc2V0IGEgdGltZXIgdG8gcG9sbCBmb3IgRFNDIGFuZCBleGl0CisgKgkJdGhlIGRyaXZlci4KKyAqCisgKgkJaWRlLmMgd2lsbCB0aGVuIGdpdmUgaGlnaGVyIHByaW9yaXR5IHRvIHJlcXVlc3RzIHdoaWNoCisgKgkJb3JpZ2luYXRlIGZyb20gdGhlIG90aGVyIGRldmljZSwgdW50aWwgd2lsbCBjaGFuZ2UgcnFfc3RhdHVzCisgKgkJdG8gUlFfQUNUSVZFLgorICoKKyAqCTQuCVdoZW4gdGhlIHBhY2tldCBjb21tYW5kIGlzIGZpbmlzaGVkLCBpdCB3aWxsIGJlIGNoZWNrZWQgZm9yIGVycm9ycy4KKyAqCisgKgk1LglJbiBjYXNlIGFuIGVycm9yIHdhcyBmb3VuZCwgd2UgcXVldWUgYSByZXF1ZXN0IHNlbnNlIHBhY2tldAorICoJCWNvbW1hbmQgaW4gZnJvbnQgb2YgdGhlIHJlcXVlc3QgcXVldWUgYW5kIHJldHJ5IHRoZSBvcGVyYXRpb24KKyAqCQl1cCB0byBJREVUQVBFX01BWF9QQ19SRVRSSUVTIHRpbWVzLgorICoKKyAqCTYuCUluIGNhc2Ugbm8gZXJyb3Igd2FzIGZvdW5kLCBvciB3ZSBkZWNpZGVkIHRvIGdpdmUgdXAgYW5kIG5vdAorICoJCXRvIHJldHJ5IGFnYWluLCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHRoZW4KKyAqCQl3ZSB3aWxsIGhhbmRsZSB0aGUgbmV4dCByZXF1ZXN0LgorICoKKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX3RyYW5zZmVyX3BjKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRldGFwZV9wY190ICpwYyA9IHRhcGUtPnBjOworCWF0YXBpX2lyZWFzb25fdCBpcmVhc29uOworCWludCByZXRyaWVzID0gMTAwOworCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3A7CisKKwlpZiAoaWRlX3dhaXRfc3RhdCgmc3RhcnRzdG9wLGRyaXZlLERSUV9TVEFULEJVU1lfU1RBVCxXQUlUX1JFQURZKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBTdHJhbmdlLCBwYWNrZXQgY29tbWFuZCBpbml0aWF0ZWQgeWV0IERSUSBpc24ndCBhc3NlcnRlZFxuIik7CisJCXJldHVybiBzdGFydHN0b3A7CisJfQorCWlyZWFzb24uYWxsID0gaHdpZi0+SU5CKElERV9JUkVBU09OX1JFRyk7CisJd2hpbGUgKHJldHJpZXMtLSAmJiAoIWlyZWFzb24uYi5jb2QgfHwgaXJlYXNvbi5iLmlvKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAoSU8sQ29EICE9ICgwLDEpIHdoaWxlIGlzc3VpbmcgIgorCQkJCSJhIHBhY2tldCBjb21tYW5kLCByZXRyeWluZ1xuIik7CisJCXVkZWxheSgxMDApOworCQlpcmVhc29uLmFsbCA9IGh3aWYtPklOQihJREVfSVJFQVNPTl9SRUcpOworCQlpZiAocmV0cmllcyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAoSU8sQ29EICE9ICgwLDEpIHdoaWxlICIKKwkJCQkJImlzc3VpbmcgYSBwYWNrZXQgY29tbWFuZCwgaWdub3JpbmdcbiIpOworCQkJaXJlYXNvbi5iLmNvZCA9IDE7CisJCQlpcmVhc29uLmIuaW8gPSAwOworCQl9CisJfQorCWlmICghaXJlYXNvbi5iLmNvZCB8fCBpcmVhc29uLmIuaW8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogKElPLENvRCkgIT0gKDAsMSkgd2hpbGUgaXNzdWluZyAiCisJCQkJImEgcGFja2V0IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKwl9CisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXRhcGVfcGNfaW50ciwgSURFVEFQRV9XQUlUX0NNRCwgTlVMTCk7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJLyogQmVnaW4gRE1BLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAodGVzdF9iaXQoUENfRE1BX0lOX1BST0dSRVNTLCAmcGMtPmZsYWdzKSkKKwkJaHdpZi0+ZG1hX3N0YXJ0KGRyaXZlKTsKKyNlbmRpZgorCS8qIFNlbmQgdGhlIGFjdHVhbCBwYWNrZXQgKi8KKwlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBwYy0+YywgMTIpOworCXJldHVybiBpZGVfc3RhcnRlZDsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX2lzc3VlX3BhY2tldF9jb21tYW5kIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcGNfdCAqcGMpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWF0YXBpX2Jjb3VudF90IGJjb3VudDsKKwlpbnQgZG1hX29rID0gMDsKKworI2lmIElERVRBUEVfREVCVUdfQlVHUworCWlmICh0YXBlLT5wYy0+Y1swXSA9PSBJREVUQVBFX1JFUVVFU1RfU0VOU0VfQ01EICYmCisJICAgIHBjLT5jWzBdID09IElERVRBUEVfUkVRVUVTVF9TRU5TRV9DTUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogcG9zc2libGUgaWRlLXRhcGUuYyBidWcgLSAiCisJCQkiVHdvIHJlcXVlc3Qgc2Vuc2UgaW4gc2VyaWFsIHdlcmUgaXNzdWVkXG4iKTsKKwl9CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCisKKwlpZiAodGFwZS0+ZmFpbGVkX3BjID09IE5VTEwgJiYgcGMtPmNbMF0gIT0gSURFVEFQRV9SRVFVRVNUX1NFTlNFX0NNRCkKKwkJdGFwZS0+ZmFpbGVkX3BjID0gcGM7CisJLyogU2V0IHRoZSBjdXJyZW50IHBhY2tldCBjb21tYW5kICovCisJdGFwZS0+cGMgPSBwYzsKKworCWlmIChwYy0+cmV0cmllcyA+IElERVRBUEVfTUFYX1BDX1JFVFJJRVMgfHwKKwkgICAgdGVzdF9iaXQoUENfQUJPUlQsICZwYy0+ZmxhZ3MpKSB7CisJCS8qCisJCSAqCVdlIHdpbGwgImFib3J0IiByZXRyeWluZyBhIHBhY2tldCBjb21tYW5kIGluIGNhc2UKKwkJICoJYSBsZWdpdGltYXRlIGVycm9yIGNvZGUgd2FzIHJlY2VpdmVkIChjcm9zc2luZyBhCisJCSAqCWZpbGVtYXJrLCBvciBlbmQgb2YgdGhlIG1lZGlhLCBmb3IgZXhhbXBsZSkuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KFBDX0FCT1JULCAmcGMtPmZsYWdzKSkgeworCQkJaWYgKCEocGMtPmNbMF0gPT0gSURFVEFQRV9URVNUX1VOSVRfUkVBRFlfQ01EICYmCisJCQkgICAgICB0YXBlLT5zZW5zZV9rZXkgPT0gMiAmJiB0YXBlLT5hc2MgPT0gNCAmJgorCQkJICAgICAodGFwZS0+YXNjcSA9PSAxIHx8IHRhcGUtPmFzY3EgPT0gOCkpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IEkvTyBlcnJvciwgIgorCQkJCQkJInBjID0gJTJ4LCBrZXkgPSAlMngsICIKKwkJCQkJCSJhc2MgPSAlMngsIGFzY3EgPSAlMnhcbiIsCisJCQkJCQl0YXBlLT5uYW1lLCBwYy0+Y1swXSwKKwkJCQkJCXRhcGUtPnNlbnNlX2tleSwgdGFwZS0+YXNjLAorCQkJCQkJdGFwZS0+YXNjcSk7CisJCQl9CisJCQkvKiBHaXZpbmcgdXAgKi8KKwkJCXBjLT5lcnJvciA9IElERVRBUEVfRVJST1JfR0VORVJBTDsKKwkJfQorCQl0YXBlLT5mYWlsZWRfcGMgPSBOVUxMOworCQlyZXR1cm4gcGMtPmNhbGxiYWNrKGRyaXZlKTsKKwl9CisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJldHJ5IG51bWJlciAtICVkLCBjbWQgPSAlMDJYXG4iLCBwYy0+cmV0cmllcywgcGMtPmNbMF0pOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKwlwYy0+cmV0cmllcysrOworCS8qIFdlIGhhdmVuJ3QgdHJhbnNmZXJyZWQgYW55IGRhdGEgeWV0ICovCisJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkID0gMDsKKwlwYy0+Y3VycmVudF9wb3NpdGlvbiA9IHBjLT5idWZmZXI7CisJLyogUmVxdWVzdCB0byB0cmFuc2ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhdCBvbmNlICovCisJYmNvdW50LmFsbCA9IHBjLT5yZXF1ZXN0X3RyYW5zZmVyOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQQ19ETUFfRVJST1IsICZwYy0+ZmxhZ3MpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZS10YXBlOiBETUEgZGlzYWJsZWQsICIKKwkJCQkicmV2ZXJ0aW5nIHRvIFBJT1xuIik7CisJCSh2b2lkKV9faWRlX2RtYV9vZmYoZHJpdmUpOworCX0KKwlpZiAodGVzdF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKSAmJiBkcml2ZS0+dXNpbmdfZG1hKQorCQlkbWFfb2sgPSAhaHdpZi0+ZG1hX3NldHVwKGRyaXZlKTsKKworCWlmIChJREVfQ09OVFJPTF9SRUcpCisJCWh3aWYtPk9VVEIoZHJpdmUtPmN0bCwgSURFX0NPTlRST0xfUkVHKTsKKwlod2lmLT5PVVRCKGRtYV9vayA/IDEgOiAwLCBJREVfRkVBVFVSRV9SRUcpOwkvKiBVc2UgUElPL0RNQSAqLworCWh3aWYtPk9VVEIoYmNvdW50LmIuaGlnaCwgSURFX0JDT1VOVEhfUkVHKTsKKwlod2lmLT5PVVRCKGJjb3VudC5iLmxvdywgSURFX0JDT1VOVExfUkVHKTsKKwlod2lmLT5PVVRCKGRyaXZlLT5zZWxlY3QuYWxsLCBJREVfU0VMRUNUX1JFRyk7CisJaWYgKGRtYV9vaykJCQkvKiBXaWxsIGJlZ2luIERNQSBsYXRlciAqLworCQlzZXRfYml0KFBDX0RNQV9JTl9QUk9HUkVTUywgJnBjLT5mbGFncyk7CisJaWYgKHRlc3RfYml0KElERVRBUEVfRFJRX0lOVEVSUlVQVCwgJnRhcGUtPmZsYWdzKSkgeworCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGV0YXBlX3RyYW5zZmVyX3BjLCBJREVUQVBFX1dBSVRfQ01ELCBOVUxMKTsKKwkJaHdpZi0+T1VUQihXSU5fUEFDS0VUQ01ELCBJREVfQ09NTUFORF9SRUcpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfSBlbHNlIHsKKwkJaHdpZi0+T1VUQihXSU5fUEFDS0VUQ01ELCBJREVfQ09NTUFORF9SRUcpOworCQlyZXR1cm4gaWRldGFwZV90cmFuc2Zlcl9wYyhkcml2ZSk7CisJfQorfQorCisvKgorICoJR2VuZXJhbCBwYWNrZXQgY29tbWFuZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX3BjX2NhbGxiYWNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWNoZWQgaWRldGFwZV9wY19jYWxsYmFja1xuIik7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCWlkZXRhcGVfZW5kX3JlcXVlc3QoZHJpdmUsIHRhcGUtPnBjLT5lcnJvciA/IDAgOiAxLCAwKTsKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKKy8qCisgKglBIG1vZGUgc2Vuc2UgY29tbWFuZCBpcyB1c2VkIHRvICJzZW5zZSIgdGFwZSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9tb2RlX3NlbnNlX2NtZCAoaWRldGFwZV9wY190ICpwYywgdTggcGFnZV9jb2RlKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX01PREVfU0VOU0VfQ01EOworCWlmIChwYWdlX2NvZGUgIT0gSURFVEFQRV9CTE9DS19ERVNDUklQVE9SKQorCQlwYy0+Y1sxXSA9IDg7CS8qIERCRCA9IDEgLSBEb24ndCByZXR1cm4gYmxvY2sgZGVzY3JpcHRvcnMgKi8KKwlwYy0+Y1syXSA9IHBhZ2VfY29kZTsKKwkvKgorCSAqIENoYW5nZWQgcGMtPmNbM10gdG8gMCAoMjU1IHdpbGwgYXQgYmVzdCByZXR1cm4gdW51c2VkIGluZm8pLgorCSAqCisJICogRm9yIFNDU0kgdGhpcyBieXRlIGlzIGRlZmluZWQgYXMgc3VicGFnZSBpbnN0ZWFkIG9mIGhpZ2ggYnl0ZQorCSAqIG9mIGxlbmd0aCBhbmQgc29tZSBJREUgZHJpdmVzIHNlZW0gdG8gaW50ZXJwcmV0IGl0IHRoaXMgd2F5CisJICogYW5kIHJldHVybiBhbiBlcnJvciB3aGVuIDI1NSBpcyB1c2VkLgorCSAqLworCXBjLT5jWzNdID0gMDsKKwlwYy0+Y1s0XSA9IDI1NTsJCS8qIChXZSB3aWxsIGp1c3QgZGlzY2FyZCBkYXRhIGluIHRoYXQgY2FzZSkgKi8KKwlpZiAocGFnZV9jb2RlID09IElERVRBUEVfQkxPQ0tfREVTQ1JJUFRPUikKKwkJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSAxMjsKKwllbHNlIGlmIChwYWdlX2NvZGUgPT0gSURFVEFQRV9DQVBBQklMSVRJRVNfUEFHRSkKKwkJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSAyNDsKKwllbHNlCisJCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gNTA7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcGNfY2FsbGJhY2s7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9zcGVlZHMoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWludCBmdWxsID0gMTI1LCBlbXB0eSA9IDc1OworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWUgKyAxMjAgKiBIWikpIHsKKwkJdGFwZS0+Y29udHJvbGxlZF9wcmV2aW91c19waXBlbGluZV9oZWFkID0gdGFwZS0+Y29udHJvbGxlZF9sYXN0X3BpcGVsaW5lX2hlYWQ7CisJCXRhcGUtPmNvbnRyb2xsZWRfcHJldmlvdXNfaGVhZF90aW1lID0gdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWU7CisJCXRhcGUtPmNvbnRyb2xsZWRfbGFzdF9waXBlbGluZV9oZWFkID0gdGFwZS0+cGlwZWxpbmVfaGVhZDsKKwkJdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWUgPSBqaWZmaWVzOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0YXBlLT5jb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfdGltZSArIDYwICogSFopKQorCQl0YXBlLT5jb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfc3BlZWQgPSAodGFwZS0+cGlwZWxpbmVfaGVhZCAtIHRhcGUtPmNvbnRyb2xsZWRfbGFzdF9waXBlbGluZV9oZWFkKSAqIDMyICogSFogLyAoamlmZmllcyAtIHRhcGUtPmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF90aW1lKTsKKwllbHNlIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRhcGUtPmNvbnRyb2xsZWRfcHJldmlvdXNfaGVhZF90aW1lKSkKKwkJdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3NwZWVkID0gKHRhcGUtPnBpcGVsaW5lX2hlYWQgLSB0YXBlLT5jb250cm9sbGVkX3ByZXZpb3VzX3BpcGVsaW5lX2hlYWQpICogMzIgKiBIWiAvIChqaWZmaWVzIC0gdGFwZS0+Y29udHJvbGxlZF9wcmV2aW91c19oZWFkX3RpbWUpOworCisJaWYgKHRhcGUtPm5yX3BlbmRpbmdfc3RhZ2VzIDwgdGFwZS0+bWF4X3N0YWdlcyAvKi0gMSAqLykgeworCQkvKiAtMSBmb3IgcmVhZCBtb2RlIGVycm9yIHJlY292ZXJ5ICovCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRhcGUtPnVuY29udHJvbGxlZF9wcmV2aW91c19oZWFkX3RpbWUgKyAxMCAqIEhaKSkgeworCQkJdGFwZS0+dW5jb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfdGltZSA9IGppZmZpZXM7CisJCQl0YXBlLT51bmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF9zcGVlZCA9ICh0YXBlLT5waXBlbGluZV9oZWFkIC0gdGFwZS0+dW5jb250cm9sbGVkX3ByZXZpb3VzX3BpcGVsaW5lX2hlYWQpICogMzIgKiBIWiAvIChqaWZmaWVzIC0gdGFwZS0+dW5jb250cm9sbGVkX3ByZXZpb3VzX2hlYWRfdGltZSk7CisJCX0KKwl9IGVsc2UgeworCQl0YXBlLT51bmNvbnRyb2xsZWRfcHJldmlvdXNfaGVhZF90aW1lID0gamlmZmllczsKKwkJdGFwZS0+dW5jb250cm9sbGVkX3ByZXZpb3VzX3BpcGVsaW5lX2hlYWQgPSB0YXBlLT5waXBlbGluZV9oZWFkOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0YXBlLT51bmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF90aW1lICsgMzAgKiBIWikpIHsKKwkJCXRhcGUtPnVuY29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWUgPSBqaWZmaWVzOworCQl9CisJfQorCXRhcGUtPnBpcGVsaW5lX2hlYWRfc3BlZWQgPSBtYXgodGFwZS0+dW5jb250cm9sbGVkX3BpcGVsaW5lX2hlYWRfc3BlZWQsIHRhcGUtPmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF9zcGVlZCk7CisJaWYgKHRhcGUtPnNwZWVkX2NvbnRyb2wgPT0gMCkgeworCQl0YXBlLT5tYXhfaW5zZXJ0X3NwZWVkID0gNTAwMDsKKwl9IGVsc2UgaWYgKHRhcGUtPnNwZWVkX2NvbnRyb2wgPT0gMSkgeworCQlpZiAodGFwZS0+bnJfcGVuZGluZ19zdGFnZXMgPj0gdGFwZS0+bWF4X3N0YWdlcyAvIDIpCisJCQl0YXBlLT5tYXhfaW5zZXJ0X3NwZWVkID0gdGFwZS0+cGlwZWxpbmVfaGVhZF9zcGVlZCArCisJCQkJKDExMDAgLSB0YXBlLT5waXBlbGluZV9oZWFkX3NwZWVkKSAqIDIgKiAodGFwZS0+bnJfcGVuZGluZ19zdGFnZXMgLSB0YXBlLT5tYXhfc3RhZ2VzIC8gMikgLyB0YXBlLT5tYXhfc3RhZ2VzOworCQllbHNlCisJCQl0YXBlLT5tYXhfaW5zZXJ0X3NwZWVkID0gNTAwICsKKwkJCQkodGFwZS0+cGlwZWxpbmVfaGVhZF9zcGVlZCAtIDUwMCkgKiAyICogdGFwZS0+bnJfcGVuZGluZ19zdGFnZXMgLyB0YXBlLT5tYXhfc3RhZ2VzOworCQlpZiAodGFwZS0+bnJfcGVuZGluZ19zdGFnZXMgPj0gdGFwZS0+bWF4X3N0YWdlcyAqIDk5IC8gMTAwKQorCQkJdGFwZS0+bWF4X2luc2VydF9zcGVlZCA9IDUwMDA7CisJfSBlbHNlIGlmICh0YXBlLT5zcGVlZF9jb250cm9sID09IDIpIHsKKwkJdGFwZS0+bWF4X2luc2VydF9zcGVlZCA9IHRhcGUtPnBpcGVsaW5lX2hlYWRfc3BlZWQgKiBlbXB0eSAvIDEwMCArCisJCQkodGFwZS0+cGlwZWxpbmVfaGVhZF9zcGVlZCAqIGZ1bGwgLyAxMDAgLSB0YXBlLT5waXBlbGluZV9oZWFkX3NwZWVkICogZW1wdHkgLyAxMDApICogdGFwZS0+bnJfcGVuZGluZ19zdGFnZXMgLyB0YXBlLT5tYXhfc3RhZ2VzOworCX0gZWxzZQorCQl0YXBlLT5tYXhfaW5zZXJ0X3NwZWVkID0gdGFwZS0+c3BlZWRfY29udHJvbDsKKwl0YXBlLT5tYXhfaW5zZXJ0X3NwZWVkID0gbWF4KHRhcGUtPm1heF9pbnNlcnRfc3BlZWQsIDUwMCk7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRldGFwZV9tZWRpYV9hY2Nlc3NfZmluaXNoZWQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3BjX3QgKnBjID0gdGFwZS0+cGM7CisJYXRhcGlfc3RhdHVzX3Qgc3RhdHVzOworCisJc3RhdHVzLmFsbCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMuYi5kc2MpIHsKKwkJaWYgKHN0YXR1cy5iLmNoZWNrKSB7CisJCQkvKiBFcnJvciBkZXRlY3RlZCAqLworCQkJaWYgKHBjLT5jWzBdICE9IElERVRBUEVfVEVTVF9VTklUX1JFQURZX0NNRCkKKwkJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogSS9PIGVycm9yLCAiLAorCQkJCQkJdGFwZS0+bmFtZSk7CisJCQkvKiBSZXRyeSBvcGVyYXRpb24gKi8KKwkJCXJldHVybiBpZGV0YXBlX3JldHJ5X3BjKGRyaXZlKTsKKwkJfQorCQlwYy0+ZXJyb3IgPSAwOworCQlpZiAodGFwZS0+ZmFpbGVkX3BjID09IHBjKQorCQkJdGFwZS0+ZmFpbGVkX3BjID0gTlVMTDsKKwl9IGVsc2UgeworCQlwYy0+ZXJyb3IgPSBJREVUQVBFX0VSUk9SX0dFTkVSQUw7CisJCXRhcGUtPmZhaWxlZF9wYyA9IE5VTEw7CisJfQorCXJldHVybiBwYy0+Y2FsbGJhY2soZHJpdmUpOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXRhcGVfcndfY2FsbGJhY2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJaW50IGJsb2NrcyA9IHRhcGUtPnBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCAvIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKworCXRhcGUtPmF2Z19zaXplICs9IGJsb2NrcyAqIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKwl0YXBlLT5pbnNlcnRfc2l6ZSArPSBibG9ja3MgKiB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJaWYgKHRhcGUtPmluc2VydF9zaXplID4gMTAyNCAqIDEwMjQpCisJCXRhcGUtPm1lYXN1cmVfaW5zZXJ0X3RpbWUgPSAxOworCWlmICh0YXBlLT5tZWFzdXJlX2luc2VydF90aW1lKSB7CisJCXRhcGUtPm1lYXN1cmVfaW5zZXJ0X3RpbWUgPSAwOworCQl0YXBlLT5pbnNlcnRfdGltZSA9IGppZmZpZXM7CisJCXRhcGUtPmluc2VydF9zaXplID0gMDsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGFwZS0+aW5zZXJ0X3RpbWUpKQorCQl0YXBlLT5pbnNlcnRfc3BlZWQgPSB0YXBlLT5pbnNlcnRfc2l6ZSAvIDEwMjQgKiBIWiAvIChqaWZmaWVzIC0gdGFwZS0+aW5zZXJ0X3RpbWUpOworCWlmIChqaWZmaWVzIC0gdGFwZS0+YXZnX3RpbWUgPj0gSFopIHsKKwkJdGFwZS0+YXZnX3NwZWVkID0gdGFwZS0+YXZnX3NpemUgKiBIWiAvIChqaWZmaWVzIC0gdGFwZS0+YXZnX3RpbWUpIC8gMTAyNDsKKwkJdGFwZS0+YXZnX3NpemUgPSAwOworCQl0YXBlLT5hdmdfdGltZSA9IGppZmZpZXM7CisJfQorCisjaWYgSURFVEFQRV9ERUJVR19MT0cJCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfcndfY2FsbGJhY2tcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKwl0YXBlLT5maXJzdF9mcmFtZV9wb3NpdGlvbiArPSBibG9ja3M7CisJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyAtPSBibG9ja3M7CisKKwlpZiAoIXRhcGUtPnBjLT5lcnJvcikKKwkJaWRldGFwZV9lbmRfcmVxdWVzdChkcml2ZSwgMSwgMCk7CisJZWxzZQorCQlpZGV0YXBlX2VuZF9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5wYy0+ZXJyb3IsIDApOworCXJldHVybiBpZGVfc3RvcHBlZDsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfcmVhZF9jbWQoaWRldGFwZV90YXBlX3QgKnRhcGUsIGlkZXRhcGVfcGNfdCAqcGMsIHVuc2lnbmVkIGludCBsZW5ndGgsIHN0cnVjdCBpZGV0YXBlX2JoICpiaCkKK3sKKwlpZGV0YXBlX2luaXRfcGMocGMpOworCXBjLT5jWzBdID0gSURFVEFQRV9SRUFEX0NNRDsKKwlwdXRfdW5hbGlnbmVkKGh0b25sKGxlbmd0aCksICh1bnNpZ25lZCBpbnQgKikgJnBjLT5jWzFdKTsKKwlwYy0+Y1sxXSA9IDE7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcndfY2FsbGJhY2s7CisJcGMtPmJoID0gYmg7CisJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOworCXBjLT5idWZmZXIgPSBOVUxMOworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gcGMtPmJ1ZmZlcl9zaXplID0gbGVuZ3RoICogdGFwZS0+dGFwZV9ibG9ja19zaXplOworCWlmIChwYy0+cmVxdWVzdF90cmFuc2ZlciA9PSB0YXBlLT5zdGFnZV9zaXplKQorCQlzZXRfYml0KFBDX0RNQV9SRUNPTU1FTkRFRCwgJnBjLT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3JlYWRfYnVmZmVyX2NtZChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9wY190ICpwYywgdW5zaWduZWQgaW50IGxlbmd0aCwgc3RydWN0IGlkZXRhcGVfYmggKmJoKQoreworCWludCBzaXplID0gMzI3Njg7CisJc3RydWN0IGlkZXRhcGVfYmggKnAgPSBiaDsKKworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX1JFQURfQlVGRkVSX0NNRDsKKwlwYy0+Y1sxXSA9IElERVRBUEVfUkVUUklFVkVfRkFVTFRZX0JMT0NLOworCXBjLT5jWzddID0gc2l6ZSA+PiA4OworCXBjLT5jWzhdID0gc2l6ZSAmIDB4ZmY7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcGNfY2FsbGJhY2s7CisJcGMtPmJoID0gYmg7CisJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOworCXBjLT5idWZmZXIgPSBOVUxMOworCXdoaWxlIChwKSB7CisJCWF0b21pY19zZXQoJnAtPmJfY291bnQsIDApOworCQlwID0gcC0+Yl9yZXFuZXh0OworCX0KKwlwYy0+cmVxdWVzdF90cmFuc2ZlciA9IHBjLT5idWZmZXJfc2l6ZSA9IHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3dyaXRlX2NtZChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9wY190ICpwYywgdW5zaWduZWQgaW50IGxlbmd0aCwgc3RydWN0IGlkZXRhcGVfYmggKmJoKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX1dSSVRFX0NNRDsKKwlwdXRfdW5hbGlnbmVkKGh0b25sKGxlbmd0aCksICh1bnNpZ25lZCBpbnQgKikgJnBjLT5jWzFdKTsKKwlwYy0+Y1sxXSA9IDE7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcndfY2FsbGJhY2s7CisJc2V0X2JpdChQQ19XUklUSU5HLCAmcGMtPmZsYWdzKTsKKwlwYy0+YmggPSBiaDsKKwlwYy0+Yl9kYXRhID0gYmgtPmJfZGF0YTsKKwlwYy0+Yl9jb3VudCA9IGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCk7CisJcGMtPmJ1ZmZlciA9IE5VTEw7CisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSBwYy0+YnVmZmVyX3NpemUgPSBsZW5ndGggKiB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJaWYgKHBjLT5yZXF1ZXN0X3RyYW5zZmVyID09IHRhcGUtPnN0YWdlX3NpemUpCisJCXNldF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKTsKK30KKworLyoKKyAqIGlkZXRhcGVfZG9fcmVxdWVzdCBpcyBvdXIgcmVxdWVzdCBoYW5kbGluZyBmdW5jdGlvbi4JCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRldGFwZV9kb19yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHNlY3Rvcl90IGJsb2NrKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfcGNfdCAqcGMgPSBOVUxMOworCXN0cnVjdCByZXF1ZXN0ICpwb3N0cG9uZWRfcnEgPSB0YXBlLT5wb3N0cG9uZWRfcnE7CisJYXRhcGlfc3RhdHVzX3Qgc3RhdHVzOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKyNpZiAwCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDUpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBycV9zdGF0dXM6ICVkLCAiCisJCQkiZGV2OiAlcywgY21kOiAlbGQsIGVycm9yczogJWRcbiIsIHJxLT5ycV9zdGF0dXMsCisJCQkgcnEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgcnEtPmNtZFswXSwgcnEtPmVycm9ycyk7CisjZW5kaWYKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IHNlY3RvcjogJWxkLCAiCisJCQkibnJfc2VjdG9yczogJWxkLCBjdXJyZW50X25yX3NlY3RvcnM6ICVkXG4iLAorCQkJcnEtPnNlY3RvciwgcnEtPm5yX3NlY3RvcnMsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKwlpZiAoKHJxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSA9PSAwKSB7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBzdXBwb3J0IGJ1ZmZlciBjYWNoZSBvcmlnaW5hdGVkIHJlcXVlc3RzLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICJpZGUtdGFwZTogJXM6IFVuc3VwcG9ydGVkIHJlcXVlc3QgaW4gIgorCQkJInJlcXVlc3QgcXVldWUgKCVsZClcbiIsIGRyaXZlLT5uYW1lLCBycS0+ZmxhZ3MpOworCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJLyoKKwkgKglSZXRyeSBhIGZhaWxlZCBwYWNrZXQgY29tbWFuZAorCSAqLworCWlmICh0YXBlLT5mYWlsZWRfcGMgIT0gTlVMTCAmJgorCSAgICB0YXBlLT5wYy0+Y1swXSA9PSBJREVUQVBFX1JFUVVFU1RfU0VOU0VfQ01EKSB7CisJCXJldHVybiBpZGV0YXBlX2lzc3VlX3BhY2tldF9jb21tYW5kKGRyaXZlLCB0YXBlLT5mYWlsZWRfcGMpOworCX0KKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwlpZiAocG9zdHBvbmVkX3JxICE9IE5VTEwpCisJCWlmIChycSAhPSBwb3N0cG9uZWRfcnEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGlkZS10YXBlLmMgYnVnIC0gIgorCQkJCQkiVHdvIERTQyByZXF1ZXN0cyB3ZXJlIHF1ZXVlZFxuIik7CisJCQlpZGV0YXBlX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCisJdGFwZS0+cG9zdHBvbmVkX3JxID0gTlVMTDsKKworCS8qCisJICogSWYgdGhlIHRhcGUgaXMgc3RpbGwgYnVzeSwgcG9zdHBvbmUgb3VyIHJlcXVlc3QgYW5kIHNlcnZpY2UKKwkgKiB0aGUgb3RoZXIgZGV2aWNlIG1lYW53aGlsZS4KKwkgKi8KKwlzdGF0dXMuYWxsID0gSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRyk7CisKKwlpZiAoIWRyaXZlLT5kc2Nfb3ZlcmxhcCAmJiAhKHJxLT5jbWRbMF0gJiBSRVFfSURFVEFQRV9QQzIpKQorCQlzZXRfYml0KElERVRBUEVfSUdOT1JFX0RTQywgJnRhcGUtPmZsYWdzKTsKKworCWlmIChkcml2ZS0+cG9zdF9yZXNldCA9PSAxKSB7CisJCXNldF9iaXQoSURFVEFQRV9JR05PUkVfRFNDLCAmdGFwZS0+ZmxhZ3MpOworCQlkcml2ZS0+cG9zdF9yZXNldCA9IDA7CisJfQorCisJaWYgKHRhcGUtPnRhcGVfc3RpbGxfdGltZSA+IDEwMCAmJiB0YXBlLT50YXBlX3N0aWxsX3RpbWUgPCAyMDApCisJCXRhcGUtPm1lYXN1cmVfaW5zZXJ0X3RpbWUgPSAxOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRhcGUtPmluc2VydF90aW1lKSkKKwkJdGFwZS0+aW5zZXJ0X3NwZWVkID0gdGFwZS0+aW5zZXJ0X3NpemUgLyAxMDI0ICogSFogLyAoamlmZmllcyAtIHRhcGUtPmluc2VydF90aW1lKTsKKwljYWxjdWxhdGVfc3BlZWRzKGRyaXZlKTsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJREVUQVBFX0lHTk9SRV9EU0MsICZ0YXBlLT5mbGFncykgJiYKKwkgICAgIXN0YXR1cy5iLmRzYykgeworCQlpZiAocG9zdHBvbmVkX3JxID09IE5VTEwpIHsKKwkJCXRhcGUtPmRzY19wb2xsaW5nX3N0YXJ0ID0gamlmZmllczsKKwkJCXRhcGUtPmRzY19wb2xsaW5nX2ZyZXF1ZW5jeSA9IHRhcGUtPmJlc3RfZHNjX3J3X2ZyZXF1ZW5jeTsKKwkJCXRhcGUtPmRzY190aW1lb3V0ID0gamlmZmllcyArIElERVRBUEVfRFNDX1JXX1RJTUVPVVQ7CisJCX0gZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0YXBlLT5kc2NfdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6ICVzOiBEU0MgdGltZW91dFxuIiwKKwkJCQl0YXBlLT5uYW1lKTsKKwkJCWlmIChycS0+Y21kWzBdICYgUkVRX0lERVRBUEVfUEMyKSB7CisJCQkJaWRldGFwZV9tZWRpYV9hY2Nlc3NfZmluaXNoZWQoZHJpdmUpOworCQkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoamlmZmllcyAtIHRhcGUtPmRzY19wb2xsaW5nX3N0YXJ0ID4gSURFVEFQRV9EU0NfTUFfVEhSRVNIT0xEKQorCQkJdGFwZS0+ZHNjX3BvbGxpbmdfZnJlcXVlbmN5ID0gSURFVEFQRV9EU0NfTUFfU0xPVzsKKwkJaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGRyaXZlKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKwlpZiAocnEtPmNtZFswXSAmIFJFUV9JREVUQVBFX1JFQUQpIHsKKwkJdGFwZS0+YnVmZmVyX2hlYWQrKzsKKyNpZiBVU0VfSU9UUkFDRQorCQlJT190cmFjZShJT19JREVUQVBFX0ZJRk8sIHRhcGUtPnBpcGVsaW5lX2hlYWQsIHRhcGUtPmJ1ZmZlcl9oZWFkLCB0YXBlLT50YXBlX2hlYWQsIHRhcGUtPm1pbm9yKTsKKyNlbmRpZgorCQl0YXBlLT5wb3N0cG9uZV9jbnQgPSAwOworCQlwYyA9IGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJaWRldGFwZV9jcmVhdGVfcmVhZF9jbWQodGFwZSwgcGMsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMsIChzdHJ1Y3QgaWRldGFwZV9iaCAqKXJxLT5zcGVjaWFsKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChycS0+Y21kWzBdICYgUkVRX0lERVRBUEVfV1JJVEUpIHsKKwkJdGFwZS0+YnVmZmVyX2hlYWQrKzsKKyNpZiBVU0VfSU9UUkFDRQorCQlJT190cmFjZShJT19JREVUQVBFX0ZJRk8sIHRhcGUtPnBpcGVsaW5lX2hlYWQsIHRhcGUtPmJ1ZmZlcl9oZWFkLCB0YXBlLT50YXBlX2hlYWQsIHRhcGUtPm1pbm9yKTsKKyNlbmRpZgorCQl0YXBlLT5wb3N0cG9uZV9jbnQgPSAwOworCQlwYyA9IGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJaWRldGFwZV9jcmVhdGVfd3JpdGVfY21kKHRhcGUsIHBjLCBycS0+Y3VycmVudF9ucl9zZWN0b3JzLCAoc3RydWN0IGlkZXRhcGVfYmggKilycS0+c3BlY2lhbCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocnEtPmNtZFswXSAmIFJFUV9JREVUQVBFX1JFQURfQlVGRkVSKSB7CisJCXRhcGUtPnBvc3Rwb25lX2NudCA9IDA7CisJCXBjID0gaWRldGFwZV9uZXh0X3BjX3N0b3JhZ2UoZHJpdmUpOworCQlpZGV0YXBlX2NyZWF0ZV9yZWFkX2J1ZmZlcl9jbWQodGFwZSwgcGMsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMsIChzdHJ1Y3QgaWRldGFwZV9iaCAqKXJxLT5zcGVjaWFsKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChycS0+Y21kWzBdICYgUkVRX0lERVRBUEVfUEMxKSB7CisJCXBjID0gKGlkZXRhcGVfcGNfdCAqKSBycS0+YnVmZmVyOworCQlycS0+Y21kWzBdICY9IH4oUkVRX0lERVRBUEVfUEMxKTsKKwkJcnEtPmNtZFswXSB8PSBSRVFfSURFVEFQRV9QQzI7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocnEtPmNtZFswXSAmIFJFUV9JREVUQVBFX1BDMikgeworCQlpZGV0YXBlX21lZGlhX2FjY2Vzc19maW5pc2hlZChkcml2ZSk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisJQlVHKCk7CitvdXQ6CisJcmV0dXJuIGlkZXRhcGVfaXNzdWVfcGFja2V0X2NvbW1hbmQoZHJpdmUsIHBjKTsKK30KKworLyoKKyAqCVBpcGVsaW5lIHJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlkZXRhcGVfcGlwZWxpbmVfYWN0aXZlIChpZGV0YXBlX3RhcGVfdCAqdGFwZSkKK3sKKwlpbnQgcmMxLCByYzI7CisKKwlyYzEgPSB0ZXN0X2JpdChJREVUQVBFX1BJUEVMSU5FX0FDVElWRSwgJnRhcGUtPmZsYWdzKTsKKwlyYzIgPSAodGFwZS0+YWN0aXZlX2RhdGFfcmVxdWVzdCAhPSBOVUxMKTsKKwlyZXR1cm4gcmMxOworfQorCisvKgorICoJaWRldGFwZV9rbWFsbG9jX3N0YWdlIHVzZXMgX19nZXRfZnJlZV9wYWdlIHRvIGFsbG9jYXRlIGEgcGlwZWxpbmUKKyAqCXN0YWdlLCBhbG9uZyB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHNtYWxsIGJ1ZmZlcnMgd2hpY2ggdG9nZXRoZXIgbWFrZQorICoJYSBidWZmZXIgb2Ygc2l6ZSB0YXBlLT5zdGFnZV9zaXplIChvciBhIGJpdCBtb3JlKS4gV2UgYXR0ZW1wdCB0bworICoJY29tYmluZSBzZXF1ZW50aWFsIHBhZ2VzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGxvY2F0ZWQgc3RhZ2UsIG9yIE5VTEwgaWYgd2UKKyAqCWNhbid0IChvciBkb24ndCB3YW50IHRvKSBhbGxvY2F0ZSBhIHN0YWdlLgorICoKKyAqCVBpcGVsaW5lIHN0YWdlcyBhcmUgb3B0aW9uYWwgYW5kIGFyZSB1c2VkIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLgorICoJSWYgd2UgY2FuJ3QgYWxsb2NhdGUgdGhlbSwgd2UnbGwgbWFuYWdlIHdpdGhvdXQgdGhlbS4KKyAqLworc3RhdGljIGlkZXRhcGVfc3RhZ2VfdCAqX19pZGV0YXBlX2ttYWxsb2Nfc3RhZ2UgKGlkZXRhcGVfdGFwZV90ICp0YXBlLCBpbnQgZnVsbCwgaW50IGNsZWFyKQoreworCWlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2U7CisJc3RydWN0IGlkZXRhcGVfYmggKnByZXZfYmgsICpiaDsKKwlpbnQgcGFnZXMgPSB0YXBlLT5wYWdlc19wZXJfc3RhZ2U7CisJY2hhciAqYl9kYXRhID0gTlVMTDsKKworCWlmICgoc3RhZ2UgPSAoaWRldGFwZV9zdGFnZV90ICopIGttYWxsb2MgKHNpemVvZiAoaWRldGFwZV9zdGFnZV90KSxHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RhZ2UtPm5leHQgPSBOVUxMOworCisJYmggPSBzdGFnZS0+YmggPSAoc3RydWN0IGlkZXRhcGVfYmggKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWRldGFwZV9iaCksIEdGUF9LRVJORUwpOworCWlmIChiaCA9PSBOVUxMKQorCQlnb3RvIGFib3J0OworCWJoLT5iX3JlcW5leHQgPSBOVUxMOworCWlmICgoYmgtPmJfZGF0YSA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZSAoR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gYWJvcnQ7CisJaWYgKGNsZWFyKQorCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgUEFHRV9TSVpFKTsKKwliaC0+Yl9zaXplID0gUEFHRV9TSVpFOworCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCBmdWxsID8gYmgtPmJfc2l6ZSA6IDApOworCisJd2hpbGUgKC0tcGFnZXMpIHsKKwkJaWYgKChiX2RhdGEgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UgKEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQkJZ290byBhYm9ydDsKKwkJaWYgKGNsZWFyKQorCQkJbWVtc2V0KGJfZGF0YSwgMCwgUEFHRV9TSVpFKTsKKwkJaWYgKGJoLT5iX2RhdGEgPT0gYl9kYXRhICsgUEFHRV9TSVpFKSB7CisJCQliaC0+Yl9zaXplICs9IFBBR0VfU0laRTsKKwkJCWJoLT5iX2RhdGEgLT0gUEFHRV9TSVpFOworCQkJaWYgKGZ1bGwpCisJCQkJYXRvbWljX2FkZChQQUdFX1NJWkUsICZiaC0+Yl9jb3VudCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYl9kYXRhID09IGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplKSB7CisJCQliaC0+Yl9zaXplICs9IFBBR0VfU0laRTsKKwkJCWlmIChmdWxsKQorCQkJCWF0b21pY19hZGQoUEFHRV9TSVpFLCAmYmgtPmJfY291bnQpOworCQkJY29udGludWU7CisJCX0KKwkJcHJldl9iaCA9IGJoOworCQlpZiAoKGJoID0gKHN0cnVjdCBpZGV0YXBlX2JoICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBiX2RhdGEpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQliaC0+Yl9yZXFuZXh0ID0gTlVMTDsKKwkJYmgtPmJfZGF0YSA9IGJfZGF0YTsKKwkJYmgtPmJfc2l6ZSA9IFBBR0VfU0laRTsKKwkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIGZ1bGwgPyBiaC0+Yl9zaXplIDogMCk7CisJCXByZXZfYmgtPmJfcmVxbmV4dCA9IGJoOworCX0KKwliaC0+Yl9zaXplIC09IHRhcGUtPmV4Y2Vzc19iaF9zaXplOworCWlmIChmdWxsKQorCQlhdG9taWNfc3ViKHRhcGUtPmV4Y2Vzc19iaF9zaXplLCAmYmgtPmJfY291bnQpOworCXJldHVybiBzdGFnZTsKK2Fib3J0OgorCV9faWRldGFwZV9rZnJlZV9zdGFnZShzdGFnZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpZGV0YXBlX3N0YWdlX3QgKmlkZXRhcGVfa21hbGxvY19zdGFnZSAoaWRldGFwZV90YXBlX3QgKnRhcGUpCit7CisJaWRldGFwZV9zdGFnZV90ICpjYWNoZV9zdGFnZSA9IHRhcGUtPmNhY2hlX3N0YWdlOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWNoZWQgaWRldGFwZV9rbWFsbG9jX3N0YWdlXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCisJaWYgKHRhcGUtPm5yX3N0YWdlcyA+PSB0YXBlLT5tYXhfc3RhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoY2FjaGVfc3RhZ2UgIT0gTlVMTCkgeworCQl0YXBlLT5jYWNoZV9zdGFnZSA9IE5VTEw7CisJCXJldHVybiBjYWNoZV9zdGFnZTsKKwl9CisJcmV0dXJuIF9faWRldGFwZV9rbWFsbG9jX3N0YWdlKHRhcGUsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyIChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9zdGFnZV90ICpzdGFnZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IG4pCit7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gdGFwZS0+Ymg7CisJaW50IGNvdW50OworCisJd2hpbGUgKG4pIHsKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwkJaWYgKGJoID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJoID09IE5VTEwgaW4gIgorCQkJCSJpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCQljb3VudCA9IG1pbigodW5zaWduZWQgaW50KShiaC0+Yl9zaXplIC0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSksICh1bnNpZ25lZCBpbnQpbik7CisJCWNvcHlfZnJvbV91c2VyKGJoLT5iX2RhdGEgKyBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpLCBidWYsIGNvdW50KTsKKwkJbiAtPSBjb3VudDsKKwkJYXRvbWljX2FkZChjb3VudCwgJmJoLT5iX2NvdW50KTsKKwkJYnVmICs9IGNvdW50OworCQlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA9PSBiaC0+Yl9zaXplKSB7CisJCQliaCA9IGJoLT5iX3JlcW5leHQ7CisJCQlpZiAoYmgpCisJCQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOworCQl9CisJfQorCXRhcGUtPmJoID0gYmg7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyIChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgY2hhciBfX3VzZXIgKmJ1ZiwgaWRldGFwZV9zdGFnZV90ICpzdGFnZSwgaW50IG4pCit7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gdGFwZS0+Ymg7CisJaW50IGNvdW50OworCisJd2hpbGUgKG4pIHsKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwkJaWYgKGJoID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJoID09IE5VTEwgaW4gIgorCQkJCSJpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlclxuIik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwkJY291bnQgPSBtaW4odGFwZS0+Yl9jb3VudCwgbik7CisJCWNvcHlfdG9fdXNlcihidWYsIHRhcGUtPmJfZGF0YSwgY291bnQpOworCQluIC09IGNvdW50OworCQl0YXBlLT5iX2RhdGEgKz0gY291bnQ7CisJCXRhcGUtPmJfY291bnQgLT0gY291bnQ7CisJCWJ1ZiArPSBjb3VudDsKKwkJaWYgKCF0YXBlLT5iX2NvdW50KSB7CisJCQl0YXBlLT5iaCA9IGJoID0gYmgtPmJfcmVxbmV4dDsKKwkJCWlmIChiaCkgeworCQkJCXRhcGUtPmJfZGF0YSA9IGJoLT5iX2RhdGE7CisJCQkJdGFwZS0+Yl9jb3VudCA9IGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfaW5pdF9tZXJnZV9zdGFnZSAoaWRldGFwZV90YXBlX3QgKnRhcGUpCit7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gdGFwZS0+bWVyZ2Vfc3RhZ2UtPmJoOworCQorCXRhcGUtPmJoID0gYmg7CisJaWYgKHRhcGUtPmNocmRldl9kaXJlY3Rpb24gPT0gaWRldGFwZV9kaXJlY3Rpb25fd3JpdGUpCisJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKKwllbHNlIHsKKwkJdGFwZS0+Yl9kYXRhID0gYmgtPmJfZGF0YTsKKwkJdGFwZS0+Yl9jb3VudCA9IGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX3N3aXRjaF9idWZmZXJzIChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9zdGFnZV90ICpzdGFnZSkKK3sKKwlzdHJ1Y3QgaWRldGFwZV9iaCAqdG1wOworCisJdG1wID0gc3RhZ2UtPmJoOworCXN0YWdlLT5iaCA9IHRhcGUtPm1lcmdlX3N0YWdlLT5iaDsKKwl0YXBlLT5tZXJnZV9zdGFnZS0+YmggPSB0bXA7CisJaWRldGFwZV9pbml0X21lcmdlX3N0YWdlKHRhcGUpOworfQorCisvKgorICoJaWRldGFwZV9hZGRfc3RhZ2VfdGFpbCBhZGRzIGEgbmV3IHN0YWdlIGF0IHRoZSBlbmQgb2YgdGhlIHBpcGVsaW5lLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2FkZF9zdGFnZV90YWlsIChpZGVfZHJpdmVfdCAqZHJpdmUsaWRldGFwZV9zdGFnZV90ICpzdGFnZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayAoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2FkZF9zdGFnZV90YWlsXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCXN0YWdlLT5uZXh0ID0gTlVMTDsKKwlpZiAodGFwZS0+bGFzdF9zdGFnZSAhPSBOVUxMKQorCQl0YXBlLT5sYXN0X3N0YWdlLT5uZXh0PXN0YWdlOworCWVsc2UKKwkJdGFwZS0+Zmlyc3Rfc3RhZ2UgPSB0YXBlLT5uZXh0X3N0YWdlPXN0YWdlOworCXRhcGUtPmxhc3Rfc3RhZ2UgPSBzdGFnZTsKKwlpZiAodGFwZS0+bmV4dF9zdGFnZSA9PSBOVUxMKQorCQl0YXBlLT5uZXh0X3N0YWdlID0gdGFwZS0+bGFzdF9zdGFnZTsKKwl0YXBlLT5ucl9zdGFnZXMrKzsKKwl0YXBlLT5ucl9wZW5kaW5nX3N0YWdlcysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKglpZGV0YXBlX3dhaXRfZm9yX3JlcXVlc3QgaW5zdGFsbHMgYSBjb21wbGV0aW9uIGluIGEgcGVuZGluZyByZXF1ZXN0CisgKglhbmQgc2xlZXBzIHVudGlsIGl0IGlzIHNlcnZpY2VkLgorICoKKyAqCVRoZSBjYWxsZXIgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdpbGwgbm90IGJlIHNlcnZpY2VkCisgKgliZWZvcmUgd2UgaW5zdGFsbCB0aGUgY29tcGxldGlvbiAodXN1YWxseSBieSBkaXNhYmxpbmcgaW50ZXJydXB0cykuCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfd2FpdF9mb3JfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJaWYgKHJxID09IE5VTEwgfHwgKHJxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IFRyeWluZyB0byBzbGVlcCBvbiBub24tdmFsaWQgcmVxdWVzdFxuIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCisJcnEtPndhaXRpbmcgPSAmd2FpdDsKKwlycS0+ZW5kX2lvID0gYmxrX2VuZF9zeW5jX3JxOworCXNwaW5fdW5sb2NrX2lycSgmdGFwZS0+c3BpbmxvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCS8qIFRoZSBzdGFnZSBhbmQgaXRzIHN0cnVjdCByZXF1ZXN0IGhhdmUgYmVlbiBkZWFsbG9jYXRlZCAqLworCXNwaW5fbG9ja19pcnEoJnRhcGUtPnNwaW5sb2NrKTsKK30KKworc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX3JlYWRfcG9zaXRpb25fY2FsbGJhY2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3JlYWRfcG9zaXRpb25fcmVzdWx0X3QgKnJlc3VsdDsKKwkKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSA0KQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX3JlYWRfcG9zaXRpb25fY2FsbGJhY2tcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKwlpZiAoIXRhcGUtPnBjLT5lcnJvcikgeworCQlyZXN1bHQgPSAoaWRldGFwZV9yZWFkX3Bvc2l0aW9uX3Jlc3VsdF90ICopIHRhcGUtPnBjLT5idWZmZXI7CisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwkJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDIpCisJCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogQk9QIC0gJXNcbiIscmVzdWx0LT5ib3AgPyAiWWVzIjoiTm8iKTsKKwkJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDIpCisJCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogRU9QIC0gJXNcbiIscmVzdWx0LT5lb3AgPyAiWWVzIjoiTm8iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCQlpZiAocmVzdWx0LT5icHUpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBCbG9jayBsb2NhdGlvbiBpcyB1bmtub3duIHRvIHRoZSB0YXBlXG4iKTsKKwkJCWNsZWFyX2JpdChJREVUQVBFX0FERFJFU1NfVkFMSUQsICZ0YXBlLT5mbGFncyk7CisJCQlpZGV0YXBlX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKKwkJfSBlbHNlIHsKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCQkJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IEJsb2NrIExvY2F0aW9uIC0gJXVcbiIsIG50b2hsKHJlc3VsdC0+Zmlyc3RfYmxvY2spKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCQkJdGFwZS0+cGFydGl0aW9uID0gcmVzdWx0LT5wYXJ0aXRpb247CisJCQl0YXBlLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9IG50b2hsKHJlc3VsdC0+Zmlyc3RfYmxvY2spOworCQkJdGFwZS0+bGFzdF9mcmFtZV9wb3NpdGlvbiA9IG50b2hsKHJlc3VsdC0+bGFzdF9ibG9jayk7CisJCQl0YXBlLT5ibG9ja3NfaW5fYnVmZmVyID0gcmVzdWx0LT5ibG9ja3NfaW5fYnVmZmVyWzJdOworCQkJc2V0X2JpdChJREVUQVBFX0FERFJFU1NfVkFMSUQsICZ0YXBlLT5mbGFncyk7CisJCQlpZGV0YXBlX2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlkZXRhcGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCX0KKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKKy8qCisgKglpZGV0YXBlX2NyZWF0ZV93cml0ZV9maWxlbWFya19jbWQgd2lsbDoKKyAqCisgKgkJMS4JV3JpdGUgYSBmaWxlbWFyayBpZiB3cml0ZV9maWxlbWFyaz0xLgorICoJCTIuCUZsdXNoIHRoZSBkZXZpY2UgYnVmZmVycyB3aXRob3V0IHdyaXRpbmcgYSBmaWxlbWFyaworICoJCQlpZiB3cml0ZV9maWxlbWFyaz0wLgorICoKKyAqLworc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfd3JpdGVfZmlsZW1hcmtfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcGNfdCAqcGMsaW50IHdyaXRlX2ZpbGVtYXJrKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX1dSSVRFX0ZJTEVNQVJLX0NNRDsKKwlwYy0+Y1s0XSA9IHdyaXRlX2ZpbGVtYXJrOworCXNldF9iaXQoUENfV0FJVF9GT1JfRFNDLCAmcGMtPmZsYWdzKTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRldGFwZV9wY19jYWxsYmFjazsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfdGVzdF91bml0X3JlYWR5X2NtZChpZGV0YXBlX3BjX3QgKnBjKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX1RFU1RfVU5JVF9SRUFEWV9DTUQ7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcGNfY2FsbGJhY2s7Cit9CisKKy8qCisgKglpZGV0YXBlX3F1ZXVlX3BjX3RhaWwgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgKgorICoJaWRlX2RvX2RyaXZlX2NtZCBmcm9tIGlkZS5jCisgKgljZHJvbV9xdWV1ZV9yZXF1ZXN0IGFuZCBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZCBmcm9tIGlkZS1jZC5jCisgKgorICoJV2UgYWRkIGEgc3BlY2lhbCBwYWNrZXQgY29tbWFuZCByZXF1ZXN0IHRvIHRoZSB0YWlsIG9mIHRoZSByZXF1ZXN0CisgKglxdWV1ZSwgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHNlcnZpY2VkLgorICoKKyAqCVRoaXMgaXMgbm90IHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgcmVxdWVzdCBoYW5kbGluZyBwYXJ0CisgKglvZiB0aGUgZHJpdmVyICEgV2UgYWxsb2NhdGUgaGVyZSBkYXRhIGluIHRoZSBzdGFjaywgYW5kIGl0IGlzIHZhbGlkCisgKgl1bnRpbCB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZC4gVGhpcyBpcyBub3QgdGhlIGNhc2UgZm9yIHRoZSBib3R0b20KKyAqCXBhcnQgb2YgdGhlIGRyaXZlciwgd2hlcmUgd2UgYXJlIGFsd2F5cyBsZWF2aW5nIHRoZSBmdW5jdGlvbnMgdG8gd2FpdAorICoJZm9yIGFuIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50LgorICoKKyAqCUZyb20gdGhlIGJvdHRvbSBwYXJ0IG9mIHRoZSBkcml2ZXIsIHdlIHNob3VsZCBhbGxvY2F0ZSBzYWZlIG1lbW9yeQorICoJdXNpbmcgaWRldGFwZV9uZXh0X3BjX3N0b3JhZ2UgYW5kIGlkZXRhcGVfbmV4dF9ycV9zdG9yYWdlLCBhbmQgYWRkCisgKgl0aGUgcmVxdWVzdCB0byB0aGUgcmVxdWVzdCBsaXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gYmUgc2VydmljZWQgIQorICoJSW4gdGhhdCBjYXNlLCB3ZSB1c3VhbGx5IHVzZSBpZGV0YXBlX3F1ZXVlX3BjX2hlYWQuCisgKi8KK3N0YXRpYyBpbnQgX19pZGV0YXBlX3F1ZXVlX3BjX3RhaWwgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRldGFwZV9wY190ICpwYykKK3sKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCByZXF1ZXN0IHJxOworCisJaWRldGFwZV9pbml0X3JxKCZycSwgUkVRX0lERVRBUEVfUEMxKTsKKwlycS5idWZmZXIgPSAoY2hhciAqKSBwYzsKKwlycS5ycV9kaXNrID0gdGFwZS0+ZGlzazsKKwlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGV0YXBlX3BjX3QgKnBjLGludCBjbWQpCit7CisJaWRldGFwZV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERVRBUEVfTE9BRF9VTkxPQURfQ01EOworCXBjLT5jWzRdID0gY21kOworCXNldF9iaXQoUENfV0FJVF9GT1JfRFNDLCAmcGMtPmZsYWdzKTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRldGFwZV9wY19jYWxsYmFjazsKK30KKworc3RhdGljIGludCBpZGV0YXBlX3dhaXRfcmVhZHkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRldGFwZV9wY190IHBjOworCWludCBsb2FkX2F0dGVtcHRlZCA9IDA7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSB0YXBlIHRvIGJlY29tZSByZWFkeQorCSAqLworCXNldF9iaXQoSURFVEFQRV9NRURJVU1fUFJFU0VOVCwgJnRhcGUtPmZsYWdzKTsKKwl0aW1lb3V0ICs9IGppZmZpZXM7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlkZXRhcGVfY3JlYXRlX3Rlc3RfdW5pdF9yZWFkeV9jbWQoJnBjKTsKKwkJaWYgKCFfX2lkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkKKwkJCXJldHVybiAwOworCQlpZiAoKHRhcGUtPnNlbnNlX2tleSA9PSAyICYmIHRhcGUtPmFzYyA9PSA0ICYmIHRhcGUtPmFzY3EgPT0gMikKKwkJICAgIHx8ICh0YXBlLT5hc2MgPT0gMHgzQSkpIHsJLyogbm8gbWVkaWEgKi8KKwkJCWlmIChsb2FkX2F0dGVtcHRlZCkKKwkJCQlyZXR1cm4gLUVOT01FRElVTTsKKwkJCWlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZChkcml2ZSwgJnBjLCBJREVUQVBFX0xVX0xPQURfTUFTSyk7CisJCQlfX2lkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJCWxvYWRfYXR0ZW1wdGVkID0gMTsKKwkJLyogbm90IGFib3V0IHRvIGJlIHJlYWR5ICovCisJCX0gZWxzZSBpZiAoISh0YXBlLT5zZW5zZV9rZXkgPT0gMiAmJiB0YXBlLT5hc2MgPT0gNCAmJgorCQkJICAgICAodGFwZS0+YXNjcSA9PSAxIHx8IHRhcGUtPmFzY3EgPT0gOCkpKQorCQkJcmV0dXJuIC1FSU87CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworICAJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJfQorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGlkZXRhcGVfcXVldWVfcGNfdGFpbCAoaWRlX2RyaXZlX3QgKmRyaXZlLGlkZXRhcGVfcGNfdCAqcGMpCit7CisJcmV0dXJuIF9faWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCBwYyk7Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3BjX3QgcGM7CisJaW50IHJjOworCisJaWRldGFwZV9jcmVhdGVfd3JpdGVfZmlsZW1hcmtfY21kKGRyaXZlLCAmcGMsIDApOworCWlmICgocmMgPSBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpKQorCQlyZXR1cm4gcmM7CisJaWRldGFwZV93YWl0X3JlYWR5KGRyaXZlLCA2MCAqIDUgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kIChpZGV0YXBlX3BjX3QgKnBjKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX1JFQURfUE9TSVRJT05fQ01EOworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gMjA7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcmVhZF9wb3NpdGlvbl9jYWxsYmFjazsKK30KKworc3RhdGljIGludCBpZGV0YXBlX3JlYWRfcG9zaXRpb24gKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3BjX3QgcGM7CisJaW50IHBvc2l0aW9uOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKyAgICAgICAgaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDQpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfcmVhZF9wb3NpdGlvblxuIik7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7CisJaWYgKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkKKwkJcmV0dXJuIC0xOworCXBvc2l0aW9uID0gdGFwZS0+Zmlyc3RfZnJhbWVfcG9zaXRpb247CisJcmV0dXJuIHBvc2l0aW9uOworfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9sb2NhdGVfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcGNfdCAqcGMsIHVuc2lnbmVkIGludCBibG9jaywgdTggcGFydGl0aW9uLCBpbnQgc2tpcCkKK3sKKwlpZGV0YXBlX2luaXRfcGMocGMpOworCXBjLT5jWzBdID0gSURFVEFQRV9MT0NBVEVfQ01EOworCXBjLT5jWzFdID0gMjsKKwlwdXRfdW5hbGlnbmVkKGh0b25sKGJsb2NrKSwgKHVuc2lnbmVkIGludCAqKSAmcGMtPmNbM10pOworCXBjLT5jWzhdID0gcGFydGl0aW9uOworCXNldF9iaXQoUENfV0FJVF9GT1JfRFNDLCAmcGMtPmZsYWdzKTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRldGFwZV9wY19jYWxsYmFjazsKK30KKworc3RhdGljIGludCBpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGV0YXBlX3BjX3QgKnBjLCBpbnQgcHJldmVudCkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlmICghdGFwZS0+Y2FwYWJpbGl0aWVzLmxvY2spCisJCXJldHVybiAwOworCisJaWRldGFwZV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERVRBUEVfUFJFVkVOVF9DTUQ7CisJcGMtPmNbNF0gPSBwcmV2ZW50OworCXBjLT5jYWxsYmFjayA9ICZpZGV0YXBlX3BjX2NhbGxiYWNrOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjbnQ7CisKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiAhPSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKQorCQlyZXR1cm4gMDsKKworCS8qIFJlbW92ZSBtZXJnZSBzdGFnZS4gKi8KKwljbnQgPSB0YXBlLT5tZXJnZV9zdGFnZV9zaXplIC8gdGFwZS0+dGFwZV9ibG9ja19zaXplOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSURFVEFQRV9GSUxFTUFSSywgJnRhcGUtPmZsYWdzKSkKKwkJKytjbnQ7CQkvKiBGaWxlbWFya3MgY291bnQgYXMgMSBzZWN0b3IgKi8KKwl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gMDsKKwlpZiAodGFwZS0+bWVyZ2Vfc3RhZ2UgIT0gTlVMTCkgeworCQlfX2lkZXRhcGVfa2ZyZWVfc3RhZ2UodGFwZS0+bWVyZ2Vfc3RhZ2UpOworCQl0YXBlLT5tZXJnZV9zdGFnZSA9IE5VTEw7CisJfQorCisJLyogQ2xlYXIgcGlwZWxpbmUgZmxhZ3MuICovCisJY2xlYXJfYml0KElERVRBUEVfUElQRUxJTkVfRVJST1IsICZ0YXBlLT5mbGFncyk7CisJdGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9IGlkZXRhcGVfZGlyZWN0aW9uX25vbmU7CisKKwkvKiBSZW1vdmUgcGlwZWxpbmUgc3RhZ2VzLiAqLworCWlmICh0YXBlLT5maXJzdF9zdGFnZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCXRhcGUtPm5leHRfc3RhZ2UgPSBOVUxMOworCWlmIChpZGV0YXBlX3BpcGVsaW5lX2FjdGl2ZSh0YXBlKSkKKwkJaWRldGFwZV93YWl0X2Zvcl9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5hY3RpdmVfZGF0YV9yZXF1ZXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHRhcGUtPmZpcnN0X3N0YWdlICE9IE5VTEwpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJxX3B0ciA9ICZ0YXBlLT5maXJzdF9zdGFnZS0+cnE7CisKKwkJY250ICs9IHJxX3B0ci0+bnJfc2VjdG9ycyAtIHJxX3B0ci0+Y3VycmVudF9ucl9zZWN0b3JzOyAKKwkJaWYgKHJxX3B0ci0+ZXJyb3JzID09IElERVRBUEVfRVJST1JfRklMRU1BUkspCisJCQkrK2NudDsKKwkJaWRldGFwZV9yZW1vdmVfc3RhZ2VfaGVhZChkcml2ZSk7CisJfQorCXRhcGUtPm5yX3BlbmRpbmdfc3RhZ2VzID0gMDsKKwl0YXBlLT5tYXhfc3RhZ2VzID0gdGFwZS0+bWluX3BpcGVsaW5lOworCXJldHVybiBjbnQ7Cit9CisKKy8qCisgKglpZGV0YXBlX3Bvc2l0aW9uX3RhcGUgcG9zaXRpb25zIHRoZSB0YXBlIHRvIHRoZSByZXF1ZXN0ZWQgYmxvY2sKKyAqCXVzaW5nIHRoZSBMT0NBVEUgcGFja2V0IGNvbW1hbmQuIEEgUkVBRCBQT1NJVElPTiBjb21tYW5kIGlzIHRoZW4KKyAqCWlzc3VlZCB0byBjaGVjayB3aGVyZSB3ZSBhcmUgcG9zaXRpb25lZC4KKyAqCisgKglMaWtlIGFsbCBoaWdoZXIgbGV2ZWwgb3BlcmF0aW9ucywgd2UgcXVldWUgdGhlIGNvbW1hbmRzIGF0IHRoZSB0YWlsCisgKglvZiB0aGUgcmVxdWVzdCBxdWV1ZSBhbmQgd2FpdCBmb3IgdGhlaXIgY29tcGxldGlvbi4KKyAqCQorICovCitzdGF0aWMgaW50IGlkZXRhcGVfcG9zaXRpb25fdGFwZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgYmxvY2ssIHU4IHBhcnRpdGlvbiwgaW50IHNraXApCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldHZhbDsKKwlpZGV0YXBlX3BjX3QgcGM7CisKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9PSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKQorCQlfX2lkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlKTsKKwlpZGV0YXBlX3dhaXRfcmVhZHkoZHJpdmUsIDYwICogNSAqIEhaKTsKKwlpZGV0YXBlX2NyZWF0ZV9sb2NhdGVfY21kKGRyaXZlLCAmcGMsIGJsb2NrLCBwYXJ0aXRpb24sIHNraXApOworCXJldHZhbCA9IGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gKHJldHZhbCk7CisKKwlpZGV0YXBlX2NyZWF0ZV9yZWFkX3Bvc2l0aW9uX2NtZCgmcGMpOworCXJldHVybiAoaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKTsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHJlc3RvcmVfcG9zaXRpb24pCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaW50IGNudDsKKwlpbnQgc2VlaywgcG9zaXRpb247CisKKwljbnQgPSBfX2lkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlKTsKKwlpZiAocmVzdG9yZV9wb3NpdGlvbikgeworCQlwb3NpdGlvbiA9IGlkZXRhcGVfcmVhZF9wb3NpdGlvbihkcml2ZSk7CisJCXNlZWsgPSBwb3NpdGlvbiA+IGNudCA/IHBvc2l0aW9uIC0gY250IDogMDsKKwkJaWYgKGlkZXRhcGVfcG9zaXRpb25fdGFwZShkcml2ZSwgc2VlaywgMCwgMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlczogcG9zaXRpb25fdGFwZSBmYWlsZWQgaW4gZGlzY2FyZF9waXBlbGluZSgpXG4iLCB0YXBlLT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoKKyAqIGlkZXRhcGVfcXVldWVfcndfdGFpbCBnZW5lcmF0ZXMgYSByZWFkL3dyaXRlIHJlcXVlc3QgZm9yIHRoZSBibG9jaworICogZGV2aWNlIGludGVyZmFjZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgc2VydmljZWQuCisgKi8KK3N0YXRpYyBpbnQgaWRldGFwZV9xdWV1ZV9yd190YWlsKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGNtZCwgaW50IGJsb2Nrcywgc3RydWN0IGlkZXRhcGVfYmggKmJoKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCByZXF1ZXN0IHJxOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IGlkZXRhcGVfcXVldWVfcndfdGFpbDogY21kPSVkXG4iLGNtZCk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwlpZiAoaWRldGFwZV9waXBlbGluZV9hY3RpdmUodGFwZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiB0aGUgcGlwZWxpbmUgaXMgYWN0aXZlIGluIGlkZXRhcGVfcXVldWVfcndfdGFpbFxuIik7CisJCXJldHVybiAoMCk7CisJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLwkKKworCWlkZXRhcGVfaW5pdF9ycSgmcnEsIGNtZCk7CisJcnEucnFfZGlzayA9IHRhcGUtPmRpc2s7CisJcnEuc3BlY2lhbCA9ICh2b2lkICopYmg7CisJcnEuc2VjdG9yID0gdGFwZS0+Zmlyc3RfZnJhbWVfcG9zaXRpb247CisJcnEubnJfc2VjdG9ycyA9IHJxLmN1cnJlbnRfbnJfc2VjdG9ycyA9IGJsb2NrczsKKwkodm9pZCkgaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7CisKKwlpZiAoKGNtZCAmIChSRVFfSURFVEFQRV9SRUFEIHwgUkVRX0lERVRBUEVfV1JJVEUpKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICh0YXBlLT5tZXJnZV9zdGFnZSkKKwkJaWRldGFwZV9pbml0X21lcmdlX3N0YWdlKHRhcGUpOworCWlmIChycS5lcnJvcnMgPT0gSURFVEFQRV9FUlJPUl9HRU5FUkFMKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gKHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSAqIChibG9ja3MtcnEuY3VycmVudF9ucl9zZWN0b3JzKSk7Cit9CisKKy8qCisgKglpZGV0YXBlX2luc2VydF9waXBlbGluZV9pbnRvX3F1ZXVlIGlzIHVzZWQgdG8gc3RhcnQgc2VydmljaW5nIHRoZQorICoJcGlwZWxpbmUgc3RhZ2VzLCBzdGFydGluZyBmcm9tIHRhcGUtPm5leHRfc3RhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfaW5zZXJ0X3BpcGVsaW5lX2ludG9fcXVldWUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlmICh0YXBlLT5uZXh0X3N0YWdlID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoIWlkZXRhcGVfcGlwZWxpbmVfYWN0aXZlKHRhcGUpKSB7CisJCXNldF9iaXQoSURFVEFQRV9QSVBFTElORV9BQ1RJVkUsICZ0YXBlLT5mbGFncyk7CisJCWlkZXRhcGVfYWN0aXZlX25leHRfc3RhZ2UoZHJpdmUpOworCQkodm9pZCkgaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgdGFwZS0+YWN0aXZlX2RhdGFfcmVxdWVzdCwgaWRlX2VuZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9pbnF1aXJ5X2NtZCAoaWRldGFwZV9wY190ICpwYykKK3sKKwlpZGV0YXBlX2luaXRfcGMocGMpOworCXBjLT5jWzBdID0gSURFVEFQRV9JTlFVSVJZX0NNRDsKKwlwYy0+Y1s0XSA9IHBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gMjU0OworCXBjLT5jYWxsYmFjayA9ICZpZGV0YXBlX3BjX2NhbGxiYWNrOworfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9yZXdpbmRfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfcGNfdCAqcGMpCit7CisJaWRldGFwZV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERVRBUEVfUkVXSU5EX0NNRDsKKwlzZXRfYml0KFBDX1dBSVRfRk9SX0RTQywgJnBjLT5mbGFncyk7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcGNfY2FsbGJhY2s7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9tb2RlX3NlbGVjdF9jbWQgKGlkZXRhcGVfcGNfdCAqcGMsIGludCBsZW5ndGgpCit7CisJaWRldGFwZV9pbml0X3BjKHBjKTsKKwlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCXBjLT5jWzBdID0gSURFVEFQRV9NT0RFX1NFTEVDVF9DTUQ7CisJcGMtPmNbMV0gPSAweDEwOworCXB1dF91bmFsaWduZWQoaHRvbnMobGVuZ3RoKSwgKHVuc2lnbmVkIHNob3J0ICopICZwYy0+Y1szXSk7CisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSAyNTU7CisJcGMtPmNhbGxiYWNrID0gJmlkZXRhcGVfcGNfY2FsbGJhY2s7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfZXJhc2VfY21kIChpZGV0YXBlX3BjX3QgKnBjKQoreworCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBJREVUQVBFX0VSQVNFX0NNRDsKKwlwYy0+Y1sxXSA9IDE7CisJc2V0X2JpdChQQ19XQUlUX0ZPUl9EU0MsICZwYy0+ZmxhZ3MpOworCXBjLT5jYWxsYmFjayA9ICZpZGV0YXBlX3BjX2NhbGxiYWNrOworfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9zcGFjZV9jbWQgKGlkZXRhcGVfcGNfdCAqcGMsaW50IGNvdW50LCB1OCBjbWQpCit7CisJaWRldGFwZV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IElERVRBUEVfU1BBQ0VfQ01EOworCXB1dF91bmFsaWduZWQoaHRvbmwoY291bnQpLCAodW5zaWduZWQgaW50ICopICZwYy0+Y1sxXSk7CisJcGMtPmNbMV0gPSBjbWQ7CisJc2V0X2JpdChQQ19XQUlUX0ZPUl9EU0MsICZwYy0+ZmxhZ3MpOworCXBjLT5jYWxsYmFjayA9ICZpZGV0YXBlX3BjX2NhbGxiYWNrOworfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX3dhaXRfZmlyc3Rfc3RhZ2UgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHRhcGUtPmZpcnN0X3N0YWdlID09IE5VTEwpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFwZS0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAodGFwZS0+YWN0aXZlX3N0YWdlID09IHRhcGUtPmZpcnN0X3N0YWdlKQorCQlpZGV0YXBlX3dhaXRfZm9yX3JlcXVlc3QoZHJpdmUsIHRhcGUtPmFjdGl2ZV9kYXRhX3JlcXVlc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKglpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdCB0cmllcyB0byBhZGQgYSBjaGFyYWN0ZXIgZGV2aWNlCisgKglvcmlnaW5hdGVkIHdyaXRlIHJlcXVlc3QgdG8gb3VyIHBpcGVsaW5lLiBJbiBjYXNlIHdlIGRvbid0IHN1Y2NlZWQsCisgKgl3ZSByZXZlcnQgdG8gbm9uLXBpcGVsaW5lZCBvcGVyYXRpb24gbW9kZSBmb3IgdGhpcyByZXF1ZXN0LgorICoKKyAqCTEuCVRyeSB0byBhbGxvY2F0ZSBhIG5ldyBwaXBlbGluZSBzdGFnZS4KKyAqCTIuCUlmIHdlIGNhbid0LCB3YWl0IGZvciBtb3JlIGFuZCBtb3JlIHJlcXVlc3RzIHRvIGJlIHNlcnZpY2VkCisgKgkJYW5kIHRyeSBhZ2FpbiBlYWNoIHRpbWUuCisgKgkzLglJZiB3ZSBzdGlsbCBjYW4ndCBhbGxvY2F0ZSBhIHN0YWdlLCBmYWxsYmFjayB0bworICoJCW5vbi1waXBlbGluZWQgb3BlcmF0aW9uIG1vZGUgZm9yIHRoaXMgcmVxdWVzdC4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYmxvY2tzKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfc3RhZ2VfdCAqbmV3X3N0YWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWNoZWQgaWRldGFwZV9hZGRfY2hyZGV2X3dyaXRlX3JlcXVlc3RcbiIpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKyAgICAgCS8qCisgICAgIAkgKglBdHRlbXB0IHRvIGFsbG9jYXRlIGEgbmV3IHN0YWdlLgorCSAqCVBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMuCisJICovCisJd2hpbGUgKChuZXdfc3RhZ2UgPSBpZGV0YXBlX2ttYWxsb2Nfc3RhZ2UodGFwZSkpID09IE5VTEwpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisJCWlmIChpZGV0YXBlX3BpcGVsaW5lX2FjdGl2ZSh0YXBlKSkgeworCQkJaWRldGFwZV93YWl0X2Zvcl9yZXF1ZXN0KGRyaXZlLCB0YXBlLT5hY3RpdmVfZGF0YV9yZXF1ZXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCQkJaWRldGFwZV9pbnNlcnRfcGlwZWxpbmVfaW50b19xdWV1ZShkcml2ZSk7CisJCQlpZiAoaWRldGFwZV9waXBlbGluZV9hY3RpdmUodGFwZSkpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICoJTGludXggaXMgc2hvcnQgb24gbWVtb3J5LiBGYWxsYmFjayB0bworCQkJICoJbm9uLXBpcGVsaW5lZCBvcGVyYXRpb24gbW9kZSBmb3IgdGhpcyByZXF1ZXN0LgorCQkJICovCisJCQlyZXR1cm4gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9XUklURSwgYmxvY2tzLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOworCQl9CisJfQorCXJxID0gJm5ld19zdGFnZS0+cnE7CisJaWRldGFwZV9pbml0X3JxKHJxLCBSRVFfSURFVEFQRV9XUklURSk7CisJLyogRG9lc24ndCBhY3R1YWxseSBtYXR0ZXIgLSBXZSBhbHdheXMgYXNzdW1lIHNlcXVlbnRpYWwgYWNjZXNzICovCisJcnEtPnNlY3RvciA9IHRhcGUtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworCXJxLT5ucl9zZWN0b3JzID0gcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyA9IGJsb2NrczsKKworCWlkZXRhcGVfc3dpdGNoX2J1ZmZlcnModGFwZSwgbmV3X3N0YWdlKTsKKwlpZGV0YXBlX2FkZF9zdGFnZV90YWlsKGRyaXZlLCBuZXdfc3RhZ2UpOworCXRhcGUtPnBpcGVsaW5lX2hlYWQrKzsKKyNpZiBVU0VfSU9UUkFDRQorCUlPX3RyYWNlKElPX0lERVRBUEVfRklGTywgdGFwZS0+cGlwZWxpbmVfaGVhZCwgdGFwZS0+YnVmZmVyX2hlYWQsIHRhcGUtPnRhcGVfaGVhZCwgdGFwZS0+bWlub3IpOworI2VuZGlmCisJY2FsY3VsYXRlX3NwZWVkcyhkcml2ZSk7CisKKwkvKgorCSAqCUVzdGltYXRlIHdoZXRoZXIgdGhlIHRhcGUgaGFzIHN0b3BwZWQgd3JpdGluZyBieSBjaGVja2luZworCSAqCWlmIG91ciB3cml0ZSBwaXBlbGluZSBpcyBjdXJyZW50bHkgZW1wdHkuIElmIHdlIGFyZSBub3QKKwkgKgl3cml0aW5nIGFueW1vcmUsIHdhaXQgZm9yIHRoZSBwaXBlbGluZSB0byBiZSBmdWxsIGVub3VnaAorCSAqCSg5MCUpIGJlZm9yZSBzdGFydGluZyB0byBzZXJ2aWNlIHJlcXVlc3RzLCBzbyB0aGF0IHdlIHdpbGwKKwkgKgliZSBhYmxlIHRvIGtlZXAgdXAgd2l0aCB0aGUgaGlnaGVyIHNwZWVkcyBvZiB0aGUgdGFwZS4KKwkgKi8KKwlpZiAoIWlkZXRhcGVfcGlwZWxpbmVfYWN0aXZlKHRhcGUpKSB7CisJCWlmICh0YXBlLT5ucl9zdGFnZXMgPj0gdGFwZS0+bWF4X3N0YWdlcyAqIDkgLyAxMCB8fAorCQkgICAgdGFwZS0+bnJfc3RhZ2VzID49IHRhcGUtPm1heF9zdGFnZXMgLSB0YXBlLT51bmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF9zcGVlZCAqIDMgKiAxMDI0IC8gdGFwZS0+dGFwZV9ibG9ja19zaXplKSB7CisJCQl0YXBlLT5tZWFzdXJlX2luc2VydF90aW1lID0gMTsKKwkJCXRhcGUtPmluc2VydF90aW1lID0gamlmZmllczsKKwkJCXRhcGUtPmluc2VydF9zaXplID0gMDsKKwkJCXRhcGUtPmluc2VydF9zcGVlZCA9IDA7CisJCQlpZGV0YXBlX2luc2VydF9waXBlbGluZV9pbnRvX3F1ZXVlKGRyaXZlKTsKKwkJfQorCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElERVRBUEVfUElQRUxJTkVfRVJST1IsICZ0YXBlLT5mbGFncykpCisJCS8qIFJldHVybiBhIGRlZmVycmVkIGVycm9yICovCisJCXJldHVybiAtRUlPOworCXJldHVybiBibG9ja3M7Cit9CisKKy8qCisgKglpZGV0YXBlX3dhaXRfZm9yX3BpcGVsaW5lIHdpbGwgd2FpdCB1bnRpbCBhbGwgcGVuZGluZyBwaXBlbGluZQorICoJcmVxdWVzdHMgYXJlIHNlcnZpY2VkLiBUeXBpY2FsbHkgY2FsbGVkIG9uIGRldmljZSBjbG9zZS4KKyAqLworc3RhdGljIHZvaWQgaWRldGFwZV93YWl0X2Zvcl9waXBlbGluZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAodGFwZS0+bmV4dF9zdGFnZSB8fCBpZGV0YXBlX3BpcGVsaW5lX2FjdGl2ZSh0YXBlKSkgeworCQlpZGV0YXBlX2luc2VydF9waXBlbGluZV9pbnRvX3F1ZXVlKGRyaXZlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisJCWlmIChpZGV0YXBlX3BpcGVsaW5lX2FjdGl2ZSh0YXBlKSkKKwkJCWlkZXRhcGVfd2FpdF9mb3JfcmVxdWVzdChkcml2ZSwgdGFwZS0+YWN0aXZlX2RhdGFfcmVxdWVzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGV0YXBlX2VtcHR5X3dyaXRlX3BpcGVsaW5lIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaW50IGJsb2NrcywgbWluOworCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsKKwkKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiAhPSBpZGV0YXBlX2RpcmVjdGlvbl93cml0ZSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IFRyeWluZyB0byBlbXB0eSB3cml0ZSBwaXBlbGluZSwgYnV0IHdlIGFyZSBub3Qgd3JpdGluZy5cbiIpOworCQlyZXR1cm47CisJfQorCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplID4gdGFwZS0+c3RhZ2Vfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IG1lcmdlX2J1ZmZlciB0b28gYmlnXG4iKTsKKwkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSA9IHRhcGUtPnN0YWdlX3NpemU7CisJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplKSB7CisJCWJsb2NrcyA9IHRhcGUtPm1lcmdlX3N0YWdlX3NpemUgLyB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplICUgdGFwZS0+dGFwZV9ibG9ja19zaXplKSB7CisJCQl1bnNpZ25lZCBpbnQgaTsKKworCQkJYmxvY2tzKys7CisJCQlpID0gdGFwZS0+dGFwZV9ibG9ja19zaXplIC0gdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSAlIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKwkJCWJoID0gdGFwZS0+YmgtPmJfcmVxbmV4dDsKKwkJCXdoaWxlIChiaCkgeworCQkJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKKwkJCQliaCA9IGJoLT5iX3JlcW5leHQ7CisJCQl9CisJCQliaCA9IHRhcGUtPmJoOworCQkJd2hpbGUgKGkpIHsKKwkJCQlpZiAoYmggPT0gTlVMTCkgeworCisJCQkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBidWcsIGJoIE5VTExcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbWluID0gbWluKGksICh1bnNpZ25lZCBpbnQpKGJoLT5iX3NpemUgLSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpKSk7CisJCQkJbWVtc2V0KGJoLT5iX2RhdGEgKyBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpLCAwLCBtaW4pOworCQkJCWF0b21pY19hZGQobWluLCAmYmgtPmJfY291bnQpOworCQkJCWkgLT0gbWluOworCQkJCWJoID0gYmgtPmJfcmVxbmV4dDsKKwkJCX0KKwkJfQorCQkodm9pZCkgaWRldGFwZV9hZGRfY2hyZGV2X3dyaXRlX3JlcXVlc3QoZHJpdmUsIGJsb2Nrcyk7CisJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPSAwOworCX0KKwlpZGV0YXBlX3dhaXRfZm9yX3BpcGVsaW5lKGRyaXZlKTsKKwlpZiAodGFwZS0+bWVyZ2Vfc3RhZ2UgIT0gTlVMTCkgeworCQlfX2lkZXRhcGVfa2ZyZWVfc3RhZ2UodGFwZS0+bWVyZ2Vfc3RhZ2UpOworCQl0YXBlLT5tZXJnZV9zdGFnZSA9IE5VTEw7CisJfQorCWNsZWFyX2JpdChJREVUQVBFX1BJUEVMSU5FX0VSUk9SLCAmdGFwZS0+ZmxhZ3MpOworCXRhcGUtPmNocmRldl9kaXJlY3Rpb24gPSBpZGV0YXBlX2RpcmVjdGlvbl9ub25lOworCisJLyoKKwkgKglPbiB0aGUgbmV4dCBiYWNrdXAsIHBlcmZvcm0gdGhlIGZlZWRiYWNrIGxvb3AgYWdhaW4uCisJICoJKEkgZG9uJ3Qgd2FudCB0byBrZWVwIHNlbnNlIGluZm9ybWF0aW9uIGJldHdlZW4gYmFja3VwcywKKwkgKgkgYXMgc29tZSBzeXN0ZW1zIGFyZSBjb25zdGFudGx5IG9uLCBhbmQgdGhlIHN5c3RlbSBsb2FkCisJICoJIGNhbiBiZSB0b3RhbGx5IGRpZmZlcmVudCBvbiB0aGUgbmV4dCBiYWNrdXApLgorCSAqLworCXRhcGUtPm1heF9zdGFnZXMgPSB0YXBlLT5taW5fcGlwZWxpbmU7CisjaWYgSURFVEFQRV9ERUJVR19CVUdTCisJaWYgKHRhcGUtPmZpcnN0X3N0YWdlICE9IE5VTEwgfHwKKwkgICAgdGFwZS0+bmV4dF9zdGFnZSAhPSBOVUxMIHx8CisJICAgIHRhcGUtPmxhc3Rfc3RhZ2UgIT0gTlVMTCB8fAorCSAgICB0YXBlLT5ucl9zdGFnZXMgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBpZGUtdGFwZSBwaXBlbGluZSBidWcsICIKKwkJCSJmaXJzdF9zdGFnZSAlcCwgbmV4dF9zdGFnZSAlcCwgIgorCQkJImxhc3Rfc3RhZ2UgJXAsIG5yX3N0YWdlcyAlZFxuIiwKKwkJCXRhcGUtPmZpcnN0X3N0YWdlLCB0YXBlLT5uZXh0X3N0YWdlLAorCQkJdGFwZS0+bGFzdF9zdGFnZSwgdGFwZS0+bnJfc3RhZ2VzKTsKKwl9CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfcmVzdGFydF9zcGVlZF9jb250cm9sIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisKKwl0YXBlLT5yZXN0YXJ0X3NwZWVkX2NvbnRyb2xfcmVxID0gMDsKKwl0YXBlLT5waXBlbGluZV9oZWFkID0gMDsKKwl0YXBlLT5jb250cm9sbGVkX2xhc3RfcGlwZWxpbmVfaGVhZCA9IHRhcGUtPnVuY29udHJvbGxlZF9sYXN0X3BpcGVsaW5lX2hlYWQgPSAwOworCXRhcGUtPmNvbnRyb2xsZWRfcHJldmlvdXNfcGlwZWxpbmVfaGVhZCA9IHRhcGUtPnVuY29udHJvbGxlZF9wcmV2aW91c19waXBlbGluZV9oZWFkID0gMDsKKwl0YXBlLT5waXBlbGluZV9oZWFkX3NwZWVkID0gdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3NwZWVkID0gNTAwMDsKKwl0YXBlLT51bmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF9zcGVlZCA9IDA7CisJdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3RpbWUgPSB0YXBlLT51bmNvbnRyb2xsZWRfcGlwZWxpbmVfaGVhZF90aW1lID0gamlmZmllczsKKwl0YXBlLT5jb250cm9sbGVkX3ByZXZpb3VzX2hlYWRfdGltZSA9IHRhcGUtPnVuY29udHJvbGxlZF9wcmV2aW91c19oZWFkX3RpbWUgPSBqaWZmaWVzOworfQorCitzdGF0aWMgaW50IGlkZXRhcGVfaW5pdGlhdGVfcmVhZCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWF4X3N0YWdlcykKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3N0YWdlX3QgKm5ld19zdGFnZTsKKwlzdHJ1Y3QgcmVxdWVzdCBycTsKKwlpbnQgYnl0ZXNfcmVhZDsKKwlpbnQgYmxvY2tzID0gdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bDsKKworCS8qIEluaXRpYWxpemUgcmVhZCBvcGVyYXRpb24gKi8KKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiAhPSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKSB7CisJCWlmICh0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID09IGlkZXRhcGVfZGlyZWN0aW9uX3dyaXRlKSB7CisJCQlpZGV0YXBlX2VtcHR5X3dyaXRlX3BpcGVsaW5lKGRyaXZlKTsKKwkJCWlkZXRhcGVfZmx1c2hfdGFwZV9idWZmZXJzKGRyaXZlKTsKKwkJfQorI2lmIElERVRBUEVfREVCVUdfQlVHUworCQlpZiAodGFwZS0+bWVyZ2Vfc3RhZ2UgfHwgdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLXRhcGU6IG1lcmdlX3N0YWdlX3NpemUgc2hvdWxkIGJlIDAgbm93XG4iKTsKKwkJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPSAwOworCQl9CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCisJCWlmICgodGFwZS0+bWVyZ2Vfc3RhZ2UgPSBfX2lkZXRhcGVfa21hbGxvY19zdGFnZSh0YXBlLCAwLCAwKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQl0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID0gaWRldGFwZV9kaXJlY3Rpb25fcmVhZDsKKworCQkvKgorCQkgKglJc3N1ZSBhIHJlYWQgMCBjb21tYW5kIHRvIGVuc3VyZSB0aGF0IERTQyBoYW5kc2hha2UKKwkJICoJaXMgc3dpdGNoZWQgZnJvbSBjb21wbGV0aW9uIG1vZGUgdG8gYnVmZmVyIGF2YWlsYWJsZQorCQkgKgltb2RlLgorCQkgKglObyBwb2ludCBpbiBpc3N1aW5nIHRoaXMgaWYgRFNDIG92ZXJsYXAgaXNuJ3Qgc3VwcG9ydGVkLAorCQkgKglzb21lIGRyaXZlcyAoU2VhZ2F0ZSBTVFQzNDAxQSkgd2lsbCByZXR1cm4gYW4gZXJyb3IuCisJCSAqLworCQlpZiAoZHJpdmUtPmRzY19vdmVybGFwKSB7CisJCQlieXRlc19yZWFkID0gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9SRUFELCAwLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOworCQkJaWYgKGJ5dGVzX3JlYWQgPCAwKSB7CisJCQkJX19pZGV0YXBlX2tmcmVlX3N0YWdlKHRhcGUtPm1lcmdlX3N0YWdlKTsKKwkJCQl0YXBlLT5tZXJnZV9zdGFnZSA9IE5VTEw7CisJCQkJdGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9IGlkZXRhcGVfZGlyZWN0aW9uX25vbmU7CisJCQkJcmV0dXJuIGJ5dGVzX3JlYWQ7CisJCQl9CisJCX0KKwl9CisJaWYgKHRhcGUtPnJlc3RhcnRfc3BlZWRfY29udHJvbF9yZXEpCisJCWlkZXRhcGVfcmVzdGFydF9zcGVlZF9jb250cm9sKGRyaXZlKTsKKwlpZGV0YXBlX2luaXRfcnEoJnJxLCBSRVFfSURFVEFQRV9SRUFEKTsKKwlycS5zZWN0b3IgPSB0YXBlLT5maXJzdF9mcmFtZV9wb3NpdGlvbjsKKwlycS5ucl9zZWN0b3JzID0gcnEuY3VycmVudF9ucl9zZWN0b3JzID0gYmxvY2tzOworCWlmICghdGVzdF9iaXQoSURFVEFQRV9QSVBFTElORV9FUlJPUiwgJnRhcGUtPmZsYWdzKSAmJgorCSAgICB0YXBlLT5ucl9zdGFnZXMgPCBtYXhfc3RhZ2VzKSB7CisJCW5ld19zdGFnZSA9IGlkZXRhcGVfa21hbGxvY19zdGFnZSh0YXBlKTsKKwkJd2hpbGUgKG5ld19zdGFnZSAhPSBOVUxMKSB7CisJCQluZXdfc3RhZ2UtPnJxID0gcnE7CisJCQlpZGV0YXBlX2FkZF9zdGFnZV90YWlsKGRyaXZlLCBuZXdfc3RhZ2UpOworCQkJaWYgKHRhcGUtPm5yX3N0YWdlcyA+PSBtYXhfc3RhZ2VzKQorCQkJCWJyZWFrOworCQkJbmV3X3N0YWdlID0gaWRldGFwZV9rbWFsbG9jX3N0YWdlKHRhcGUpOworCQl9CisJfQorCWlmICghaWRldGFwZV9waXBlbGluZV9hY3RpdmUodGFwZSkpIHsKKwkJaWYgKHRhcGUtPm5yX3BlbmRpbmdfc3RhZ2VzID49IDMgKiBtYXhfc3RhZ2VzIC8gNCkgeworCQkJdGFwZS0+bWVhc3VyZV9pbnNlcnRfdGltZSA9IDE7CisJCQl0YXBlLT5pbnNlcnRfdGltZSA9IGppZmZpZXM7CisJCQl0YXBlLT5pbnNlcnRfc2l6ZSA9IDA7CisJCQl0YXBlLT5pbnNlcnRfc3BlZWQgPSAwOworCQkJaWRldGFwZV9pbnNlcnRfcGlwZWxpbmVfaW50b19xdWV1ZShkcml2ZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglpZGV0YXBlX2FkZF9jaHJkZXZfcmVhZF9yZXF1ZXN0IGlzIGNhbGxlZCBmcm9tIGlkZXRhcGVfY2hyZGV2X3JlYWQKKyAqCXRvIHNlcnZpY2UgYSBjaGFyYWN0ZXIgZGV2aWNlIHJlYWQgcmVxdWVzdCBhbmQgYWRkIHJlYWQtYWhlYWQKKyAqCXJlcXVlc3RzIHRvIG91ciBwaXBlbGluZS4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX2FkZF9jaHJkZXZfcmVhZF9yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsaW50IGJsb2NrcykKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXF1ZXN0ICpycV9wdHI7CisJaW50IGJ5dGVzX3JlYWQ7CisKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSA0KQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2FkZF9jaHJkZXZfcmVhZF9yZXF1ZXN0LCAlZCBibG9ja3NcbiIsIGJsb2Nrcyk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCS8qCisJICogSWYgd2UgYXJlIGF0IGEgZmlsZW1hcmssIHJldHVybiBhIHJlYWQgbGVuZ3RoIG9mIDAKKwkgKi8KKwlpZiAodGVzdF9iaXQoSURFVEFQRV9GSUxFTUFSSywgJnRhcGUtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBuZXh0IGJsb2NrIHRvIGJlIGF2YWlsYWJsZSBhdCB0aGUgaGVhZAorCSAqIG9mIHRoZSBwaXBlbGluZQorCSAqLworCWlkZXRhcGVfaW5pdGlhdGVfcmVhZChkcml2ZSwgdGFwZS0+bWF4X3N0YWdlcyk7CisJaWYgKHRhcGUtPmZpcnN0X3N0YWdlID09IE5VTEwpIHsKKwkJaWYgKHRlc3RfYml0KElERVRBUEVfUElQRUxJTkVfRVJST1IsICZ0YXBlLT5mbGFncykpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgUkVRX0lERVRBUEVfUkVBRCwgYmxvY2tzLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOworCX0KKwlpZGV0YXBlX3dhaXRfZmlyc3Rfc3RhZ2UoZHJpdmUpOworCXJxX3B0ciA9ICZ0YXBlLT5maXJzdF9zdGFnZS0+cnE7CisJYnl0ZXNfcmVhZCA9IHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSAqIChycV9wdHItPm5yX3NlY3RvcnMgLSBycV9wdHItPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJcnFfcHRyLT5ucl9zZWN0b3JzID0gcnFfcHRyLT5jdXJyZW50X25yX3NlY3RvcnMgPSAwOworCisKKwlpZiAocnFfcHRyLT5lcnJvcnMgPT0gSURFVEFQRV9FUlJPUl9FT0QpCisJCXJldHVybiAwOworCWVsc2UgeworCQlpZGV0YXBlX3N3aXRjaF9idWZmZXJzKHRhcGUsIHRhcGUtPmZpcnN0X3N0YWdlKTsKKwkJaWYgKHJxX3B0ci0+ZXJyb3JzID09IElERVRBUEVfRVJST1JfRklMRU1BUkspCisJCQlzZXRfYml0KElERVRBUEVfRklMRU1BUkssICZ0YXBlLT5mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCQlpZGV0YXBlX3JlbW92ZV9zdGFnZV9oZWFkKGRyaXZlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFwZS0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJdGFwZS0+cGlwZWxpbmVfaGVhZCsrOworI2lmIFVTRV9JT1RSQUNFCisJCUlPX3RyYWNlKElPX0lERVRBUEVfRklGTywgdGFwZS0+cGlwZWxpbmVfaGVhZCwgdGFwZS0+YnVmZmVyX2hlYWQsIHRhcGUtPnRhcGVfaGVhZCwgdGFwZS0+bWlub3IpOworI2VuZGlmCisJCWNhbGN1bGF0ZV9zcGVlZHMoZHJpdmUpOworCX0KKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwlpZiAoYnl0ZXNfcmVhZCA+IGJsb2NrcyAqIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBidWc6IHRyeWluZyB0byByZXR1cm4gbW9yZSBieXRlcyB0aGFuIHJlcXVlc3RlZFxuIik7CisJCWJ5dGVzX3JlYWQgPSBibG9ja3MgKiB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCXJldHVybiAoYnl0ZXNfcmVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXRhcGVfcGFkX3plcm9zIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBiY291bnQpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlkZXRhcGVfYmggKmJoOworCWludCBibG9ja3M7CisJCisJd2hpbGUgKGJjb3VudCkgeworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwkJYmggPSB0YXBlLT5tZXJnZV9zdGFnZS0+Ymg7CisJCWNvdW50ID0gbWluKHRhcGUtPnN0YWdlX3NpemUsIGJjb3VudCk7CisJCWJjb3VudCAtPSBjb3VudDsKKwkJYmxvY2tzID0gY291bnQgLyB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJCXdoaWxlIChjb3VudCkgeworCQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIG1pbihjb3VudCwgKHVuc2lnbmVkIGludCliaC0+Yl9zaXplKSk7CisJCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSk7CisJCQljb3VudCAtPSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpOworCQkJYmggPSBiaC0+Yl9yZXFuZXh0OworCQl9CisJCWlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgUkVRX0lERVRBUEVfV1JJVEUsIGJsb2NrcywgdGFwZS0+bWVyZ2Vfc3RhZ2UtPmJoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV9waXBlbGluZV9zaXplIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRldGFwZV9zdGFnZV90ICpzdGFnZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHNpemUgPSAwOworCisJaWRldGFwZV93YWl0X2Zvcl9waXBlbGluZShkcml2ZSk7CisJc3RhZ2UgPSB0YXBlLT5maXJzdF9zdGFnZTsKKwl3aGlsZSAoc3RhZ2UgIT0gTlVMTCkgeworCQlycSA9ICZzdGFnZS0+cnE7CisJCXNpemUgKz0gdGFwZS0+dGFwZV9ibG9ja19zaXplICogKHJxLT5ucl9zZWN0b3JzLXJxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCQlpZiAocnEtPmVycm9ycyA9PSBJREVUQVBFX0VSUk9SX0ZJTEVNQVJLKQorCQkJc2l6ZSArPSB0YXBlLT50YXBlX2Jsb2NrX3NpemU7CisJCXN0YWdlID0gc3RhZ2UtPm5leHQ7CisJfQorCXNpemUgKz0gdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqCVJld2luZHMgdGhlIHRhcGUgdG8gdGhlIEJlZ2lubmluZyBPZiB0aGUgY3VycmVudCBQYXJ0aXRpb24gKEJPUCkuCisgKgorICoJV2UgY3VycmVudGx5IHN1cHBvcnQgb25seSBvbmUgcGFydGl0aW9uLgorICovIAorc3RhdGljIGludCBpZGV0YXBlX3Jld2luZF90YXBlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaW50IHJldHZhbDsKKwlpZGV0YXBlX3BjX3QgcGM7CisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZiAodGFwZS0+ZGVidWdfbGV2ZWwgPj0gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWNoZWQgaWRldGFwZV9yZXdpbmRfdGFwZVxuIik7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8JCisJCisJaWRldGFwZV9jcmVhdGVfcmV3aW5kX2NtZChkcml2ZSwgJnBjKTsKKwlyZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7CisJcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglPdXIgc3BlY2lhbCBpZGUtdGFwZSBpb2N0bCdzLgorICoKKyAqCUN1cnJlbnRseSB0aGVyZSBhcmVuJ3QgYW55IGlvY3RsJ3MuCisgKgltdGlvLmggY29tcGF0aWJsZSBjb21tYW5kcyBzaG91bGQgYmUgaXNzdWVkIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlCisgKglpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgaWRldGFwZV9ibGtkZXZfaW9jdGwoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX2NvbmZpZ190IGNvbmZpZzsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCQorCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSA0KQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2Jsa2Rldl9pb2N0bFxuIik7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIDB4MDM0MDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCBhcmdwLCBzaXplb2YgKGlkZXRhcGVfY29uZmlnX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXRhcGUtPmJlc3RfZHNjX3J3X2ZyZXF1ZW5jeSA9IGNvbmZpZy5kc2NfcndfZnJlcXVlbmN5OworCQkJdGFwZS0+bWF4X3N0YWdlcyA9IGNvbmZpZy5ucl9zdGFnZXM7CisJCQlicmVhazsKKwkJY2FzZSAweDAzNTA6CisJCQljb25maWcuZHNjX3J3X2ZyZXF1ZW5jeSA9IChpbnQpIHRhcGUtPmJlc3RfZHNjX3J3X2ZyZXF1ZW5jeTsKKwkJCWNvbmZpZy5ucl9zdGFnZXMgPSB0YXBlLT5tYXhfc3RhZ2VzOyAKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNvbmZpZywgc2l6ZW9mIChpZGV0YXBlX2NvbmZpZ190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MgaXMgbm93IGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBqdXN0CisgKglwYXNzaW5nIHRoZSBjb21tYW5kIHRvIHRoZSB0YXBlIHNpbmNlIHdlIG1heSBoYXZlIGNyb3NzZWQgc29tZQorICoJZmlsZW1hcmtzIGR1cmluZyBvdXIgcGlwZWxpbmVkIHJlYWQtYWhlYWQgbW9kZS4KKyAqCisgKglBcyBhIG1pbm9yIHNpZGUgZWZmZWN0LCB0aGUgcGlwZWxpbmUgZW5hYmxlcyB1cyB0byBzdXBwb3J0IE1URlNGTSB3aGVuCisgKgl0aGUgZmlsZW1hcmsgaXMgaW4gb3VyIGludGVybmFsIHBpcGVsaW5lIGV2ZW4gaWYgdGhlIHRhcGUgZG9lc24ndAorICoJc3VwcG9ydCBzcGFjaW5nIG92ZXIgZmlsZW1hcmtzIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbi4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX3NwYWNlX292ZXJfZmlsZW1hcmtzIChpZGVfZHJpdmVfdCAqZHJpdmUsc2hvcnQgbXRfb3AsaW50IG10X2NvdW50KQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfcGNfdCBwYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWwsY291bnQ9MDsKKworCWlmIChtdF9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoTVRCU0YgPT0gbXRfb3AgfHwgTVRCU0ZNID09IG10X29wKSB7CisJCWlmICghdGFwZS0+Y2FwYWJpbGl0aWVzLnNwcmV2KQorCQkJcmV0dXJuIC1FSU87CisJCW10X2NvdW50ID0gLSBtdF9jb3VudDsKKwl9CisKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9PSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKSB7CisJCS8qCisJCSAqCVdlIGhhdmUgYSByZWFkLWFoZWFkIGJ1ZmZlci4gU2NhbiBpdCBmb3IgY3Jvc3NlZAorCQkgKglmaWxlbWFya3MuCisJCSAqLworCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gMDsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJREVUQVBFX0ZJTEVNQVJLLCAmdGFwZS0+ZmxhZ3MpKQorCQkJKytjb3VudDsKKwkJd2hpbGUgKHRhcGUtPmZpcnN0X3N0YWdlICE9IE5VTEwpIHsKKwkJCWlmIChjb3VudCA9PSBtdF9jb3VudCkgeworCQkJCWlmIChtdF9vcCA9PSBNVEZTRk0pCisJCQkJCXNldF9iaXQoSURFVEFQRV9GSUxFTUFSSywgJnRhcGUtPmZsYWdzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCQkJaWYgKHRhcGUtPmZpcnN0X3N0YWdlID09IHRhcGUtPmFjdGl2ZV9zdGFnZSkgeworCQkJCS8qCisJCQkJICoJV2UgaGF2ZSByZWFjaGVkIHRoZSBhY3RpdmUgc3RhZ2UgaW4gdGhlIHJlYWQgcGlwZWxpbmUuCisJCQkJICoJVGhlcmUgaXMgbm8gcG9pbnQgaW4gYWxsb3dpbmcgdGhlIGRyaXZlIHRvIGNvbnRpbnVlCisJCQkJICoJcmVhZGluZyBhbnkgZmFydGhlciwgc28gd2Ugc3RvcCB0aGUgcGlwZWxpbmUuCisJCQkJICoKKwkJCQkgKglUaGlzIHNlY3Rpb24gc2hvdWxkIGJlIG1vdmVkIHRvIGEgc2VwYXJhdGUgc3Vicm91dGluZSwKKwkJCQkgKgliZWNhdXNlIGEgc2ltaWxhciBmdW5jdGlvbiBpcyBwZXJmb3JtZWQgaW4KKwkJCQkgKglfX2lkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKCksIGZvciBleGFtcGxlLgorCQkJCSAqLworCQkJCXRhcGUtPm5leHRfc3RhZ2UgPSBOVUxMOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJaWRldGFwZV93YWl0X2ZpcnN0X3N0YWdlKGRyaXZlKTsKKwkJCQl0YXBlLT5uZXh0X3N0YWdlID0gdGFwZS0+Zmlyc3Rfc3RhZ2UtPm5leHQ7CisJCQl9IGVsc2UKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXBlLT5zcGlubG9jaywgZmxhZ3MpOworCQkJaWYgKHRhcGUtPmZpcnN0X3N0YWdlLT5ycS5lcnJvcnMgPT0gSURFVEFQRV9FUlJPUl9GSUxFTUFSSykKKwkJCQkrK2NvdW50OworCQkJaWRldGFwZV9yZW1vdmVfc3RhZ2VfaGVhZChkcml2ZSk7CisJCX0KKwkJaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUoZHJpdmUsIDApOworCX0KKworCS8qCisJICoJVGhlIGZpbGVtYXJrIHdhcyBub3QgZm91bmQgaW4gb3VyIGludGVybmFsIHBpcGVsaW5lLgorCSAqCU5vdyB3ZSBjYW4gaXNzdWUgdGhlIHNwYWNlIGNvbW1hbmQuCisJICovCisJc3dpdGNoIChtdF9vcCkgeworCQljYXNlIE1URlNGOgorCQljYXNlIE1UQlNGOgorCQkJaWRldGFwZV9jcmVhdGVfc3BhY2VfY21kKCZwYyxtdF9jb3VudC1jb3VudCxJREVUQVBFX1NQQUNFX09WRVJfRklMRU1BUkspOworCQkJcmV0dXJuIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpOworCQljYXNlIE1URlNGTToKKwkJY2FzZSBNVEJTRk06CisJCQlpZiAoIXRhcGUtPmNhcGFiaWxpdGllcy5zcHJldikKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJcmV0dmFsID0gaWRldGFwZV9zcGFjZV9vdmVyX2ZpbGVtYXJrcyhkcml2ZSwgTVRGU0YsIG10X2NvdW50LWNvdW50KTsKKwkJCWlmIChyZXR2YWwpIHJldHVybiAocmV0dmFsKTsKKwkJCWNvdW50ID0gKE1UQlNGTSA9PSBtdF9vcCA/IDEgOiAtMSk7CisJCQlyZXR1cm4gKGlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MoZHJpdmUsIE1URlNGLCBjb3VudCkpOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogTVRJTyBvcGVyYXRpb24gJWQgbm90IHN1cHBvcnRlZFxuIixtdF9vcCk7CisJCQlyZXR1cm4gKC1FSU8pOworCX0KK30KKworCisvKgorICoJT3VyIGNoYXJhY3RlciBkZXZpY2UgcmVhZCAvIHdyaXRlIGZ1bmN0aW9ucy4KKyAqCisgKglUaGUgdGFwZSBpcyBvcHRpbWl6ZWQgdG8gbWF4aW1pemUgdGhyb3VnaHB1dCB3aGVuIGl0IGlzIHRyYW5zZmVycmluZworICoJYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHRoZSAiY29udGludW91cyB0cmFuc2ZlciBsaW1pdCIsIHdoaWNoIGlzCisgKglhIHBhcmFtZXRlciBvZiB0aGUgc3BlY2lmaWMgdGFwZSAoMjYgS0Igb24gbXkgcGFydGljdWxhciB0YXBlKS4KKyAqICAgICAgKDMyIGtCIGZvciBPbnN0cmVhbSkKKyAqCisgKglBcyBvZiB2ZXJzaW9uIDEuMyBvZiB0aGUgZHJpdmVyLCB0aGUgY2hhcmFjdGVyIGRldmljZSBwcm92aWRlcyBhbgorICoJYWJzdHJhY3QgY29udGludW91cyB2aWV3IG9mIHRoZSBtZWRpYSAtIGFueSBtaXggb2YgYmxvY2sgc2l6ZXMgKGV2ZW4gMQorICoJYnl0ZSkgb24gdGhlIHNhbWUgYmFja3VwL3Jlc3RvcmUgcHJvY2VkdXJlIGlzIHN1cHBvcnRlZC4gVGhlIGRyaXZlcgorICoJd2lsbCBpbnRlcm5hbGx5IGNvbnZlcnQgdGhlIHJlcXVlc3RzIHRvIHRoZSByZWNvbW1lbmRlZCB0cmFuc2ZlciB1bml0LAorICoJc28gdGhhdCBhbiB1bm1hdGNoIGJldHdlZW4gdGhlIHVzZXIncyBibG9jayBzaXplIHRvIHRoZSByZWNvbW1lbmRlZAorICoJc2l6ZSB3aWxsIG9ubHkgcmVzdWx0IGluIGEgKHNsaWdodGx5KSBpbmNyZWFzZWQgZHJpdmVyIG92ZXJoZWFkLCBidXQKKyAqCXdpbGwgbm8gbG9uZ2VyIGhpdCBwZXJmb3JtYW5jZS4KKyAqICAgICAgVGhpcyBpcyBub3QgYXBwbGljYWJsZSB0byBPbnN0cmVhbS4KKyAqLworc3RhdGljIHNzaXplX3QgaWRldGFwZV9jaHJkZXZfcmVhZCAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9mKGZpbGUpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOworCXNzaXplX3QgYnl0ZXNfcmVhZCx0ZW1wLCBhY3R1YWxseV9yZWFkID0gMCwgcmM7CisKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAzKQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2NocmRldl9yZWFkLCBjb3VudCAlWmRcbiIsIGNvdW50KTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCisJaWYgKHRhcGUtPmNocmRldl9kaXJlY3Rpb24gIT0gaWRldGFwZV9kaXJlY3Rpb25fcmVhZCkgeworCQlpZiAodGVzdF9iaXQoSURFVEFQRV9ERVRFQ1RfQlMsICZ0YXBlLT5mbGFncykpCisJCQlpZiAoY291bnQgPiB0YXBlLT50YXBlX2Jsb2NrX3NpemUgJiYKKwkJCSAgICAoY291bnQgJSB0YXBlLT50YXBlX2Jsb2NrX3NpemUpID09IDApCisJCQkJdGFwZS0+dXNlcl9ic19mYWN0b3IgPSBjb3VudCAvIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKwl9CisJaWYgKChyYyA9IGlkZXRhcGVfaW5pdGlhdGVfcmVhZChkcml2ZSwgdGFwZS0+bWF4X3N0YWdlcykpIDwgMCkKKwkJcmV0dXJuIHJjOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplKSB7CisJCWFjdHVhbGx5X3JlYWQgPSBtaW4oKHVuc2lnbmVkIGludCkodGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSksICh1bnNpZ25lZCBpbnQpY291bnQpOworCQlpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCBhY3R1YWxseV9yZWFkKTsKKwkJYnVmICs9IGFjdHVhbGx5X3JlYWQ7CisJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgLT0gYWN0dWFsbHlfcmVhZDsKKwkJY291bnQgLT0gYWN0dWFsbHlfcmVhZDsKKwl9CisJd2hpbGUgKGNvdW50ID49IHRhcGUtPnN0YWdlX3NpemUpIHsKKwkJYnl0ZXNfcmVhZCA9IGlkZXRhcGVfYWRkX2NocmRldl9yZWFkX3JlcXVlc3QoZHJpdmUsIHRhcGUtPmNhcGFiaWxpdGllcy5jdGwpOworCQlpZiAoYnl0ZXNfcmVhZCA8PSAwKQorCQkJZ290byBmaW5pc2g7CisJCWlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ5dGVzX3JlYWQpOworCQlidWYgKz0gYnl0ZXNfcmVhZDsKKwkJY291bnQgLT0gYnl0ZXNfcmVhZDsKKwkJYWN0dWFsbHlfcmVhZCArPSBieXRlc19yZWFkOworCX0KKwlpZiAoY291bnQpIHsKKwkJYnl0ZXNfcmVhZCA9IGlkZXRhcGVfYWRkX2NocmRldl9yZWFkX3JlcXVlc3QoZHJpdmUsIHRhcGUtPmNhcGFiaWxpdGllcy5jdGwpOworCQlpZiAoYnl0ZXNfcmVhZCA8PSAwKQorCQkJZ290byBmaW5pc2g7CisJCXRlbXAgPSBtaW4oKHVuc2lnbmVkIGxvbmcpY291bnQsICh1bnNpZ25lZCBsb25nKWJ5dGVzX3JlYWQpOworCQlpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCB0ZW1wKTsKKwkJYWN0dWFsbHlfcmVhZCArPSB0ZW1wOworCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gYnl0ZXNfcmVhZC10ZW1wOworCX0KK2ZpbmlzaDoKKwlpZiAoIWFjdHVhbGx5X3JlYWQgJiYgdGVzdF9iaXQoSURFVEFQRV9GSUxFTUFSSywgJnRhcGUtPmZsYWdzKSkgeworI2lmIElERVRBUEVfREVCVUdfTE9HCisJCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAyKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6ICVzOiBzcGFjaW5nIG92ZXIgZmlsZW1hcmtcbiIsIHRhcGUtPm5hbWUpOworI2VuZGlmCisJCWlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MoZHJpdmUsIE1URlNGLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBhY3R1YWxseV9yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBpZGV0YXBlX2NocmRldl93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxlKTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKKwlzc2l6ZV90IHJldHZhbCwgYWN0dWFsbHlfd3JpdHRlbiA9IDA7CisKKwkvKiBUaGUgZHJpdmUgaXMgd3JpdGUgcHJvdGVjdGVkLiAqLworCWlmICh0YXBlLT53cml0ZV9wcm90KQorCQlyZXR1cm4gLUVBQ0NFUzsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDMpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfY2hyZGV2X3dyaXRlLCAiCisJCQkiY291bnQgJVpkXG4iLCBjb3VudCk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19MT0cgKi8KKworCS8qIEluaXRpYWxpemUgd3JpdGUgb3BlcmF0aW9uICovCisJaWYgKHRhcGUtPmNocmRldl9kaXJlY3Rpb24gIT0gaWRldGFwZV9kaXJlY3Rpb25fd3JpdGUpIHsKKwkJaWYgKHRhcGUtPmNocmRldl9kaXJlY3Rpb24gPT0gaWRldGFwZV9kaXJlY3Rpb25fcmVhZCkKKwkJCWlkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlLCAxKTsKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwkJaWYgKHRhcGUtPm1lcmdlX3N0YWdlIHx8IHRhcGUtPm1lcmdlX3N0YWdlX3NpemUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IG1lcmdlX3N0YWdlX3NpemUgIgorCQkJCSJzaG91bGQgYmUgMCBub3dcbiIpOworCQkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KKwkJaWYgKCh0YXBlLT5tZXJnZV9zdGFnZSA9IF9faWRldGFwZV9rbWFsbG9jX3N0YWdlKHRhcGUsIDAsIDApKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXRhcGUtPmNocmRldl9kaXJlY3Rpb24gPSBpZGV0YXBlX2RpcmVjdGlvbl93cml0ZTsKKwkJaWRldGFwZV9pbml0X21lcmdlX3N0YWdlKHRhcGUpOworCisJCS8qCisJCSAqCUlzc3VlIGEgd3JpdGUgMCBjb21tYW5kIHRvIGVuc3VyZSB0aGF0IERTQyBoYW5kc2hha2UKKwkJICoJaXMgc3dpdGNoZWQgZnJvbSBjb21wbGV0aW9uIG1vZGUgdG8gYnVmZmVyIGF2YWlsYWJsZQorCQkgKgltb2RlLgorCQkgKglObyBwb2ludCBpbiBpc3N1aW5nIHRoaXMgaWYgRFNDIG92ZXJsYXAgaXNuJ3Qgc3VwcG9ydGVkLAorCQkgKglzb21lIGRyaXZlcyAoU2VhZ2F0ZSBTVFQzNDAxQSkgd2lsbCByZXR1cm4gYW4gZXJyb3IuCisJCSAqLworCQlpZiAoZHJpdmUtPmRzY19vdmVybGFwKSB7CisJCQlyZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLCAwLCB0YXBlLT5tZXJnZV9zdGFnZS0+YmgpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlfX2lkZXRhcGVfa2ZyZWVfc3RhZ2UodGFwZS0+bWVyZ2Vfc3RhZ2UpOworCQkJCXRhcGUtPm1lcmdlX3N0YWdlID0gTlVMTDsKKwkJCQl0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID0gaWRldGFwZV9kaXJlY3Rpb25fbm9uZTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9CisJfQorCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmICh0YXBlLT5yZXN0YXJ0X3NwZWVkX2NvbnRyb2xfcmVxKQorCQlpZGV0YXBlX3Jlc3RhcnRfc3BlZWRfY29udHJvbChkcml2ZSk7CisJaWYgKHRhcGUtPm1lcmdlX3N0YWdlX3NpemUpIHsKKyNpZiBJREVUQVBFX0RFQlVHX0JVR1MKKwkJaWYgKHRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPj0gdGFwZS0+c3RhZ2Vfc2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiBtZXJnZSBidWZmZXIgdG9vIGJpZ1xuIik7CisJCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gMDsKKwkJfQorI2VuZGlmIC8qIElERVRBUEVfREVCVUdfQlVHUyAqLworCQlhY3R1YWxseV93cml0dGVuID0gbWluKCh1bnNpZ25lZCBpbnQpKHRhcGUtPnN0YWdlX3NpemUgLSB0YXBlLT5tZXJnZV9zdGFnZV9zaXplKSwgKHVuc2lnbmVkIGludCljb3VudCk7CisJCWlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgYWN0dWFsbHlfd3JpdHRlbik7CisJCWJ1ZiArPSBhY3R1YWxseV93cml0dGVuOworCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplICs9IGFjdHVhbGx5X3dyaXR0ZW47CisJCWNvdW50IC09IGFjdHVhbGx5X3dyaXR0ZW47CisKKwkJaWYgKHRhcGUtPm1lcmdlX3N0YWdlX3NpemUgPT0gdGFwZS0+c3RhZ2Vfc2l6ZSkgeworCQkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSA9IDA7CisJCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCk7CisJCQlpZiAocmV0dmFsIDw9IDApCisJCQkJcmV0dXJuIChyZXR2YWwpOworCQl9CisJfQorCXdoaWxlIChjb3VudCA+PSB0YXBlLT5zdGFnZV9zaXplKSB7CisJCWlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgdGFwZS0+c3RhZ2Vfc2l6ZSk7CisJCWJ1ZiArPSB0YXBlLT5zdGFnZV9zaXplOworCQljb3VudCAtPSB0YXBlLT5zdGFnZV9zaXplOworCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCk7CisJCWFjdHVhbGx5X3dyaXR0ZW4gKz0gdGFwZS0+c3RhZ2Vfc2l6ZTsKKwkJaWYgKHJldHZhbCA8PSAwKQorCQkJcmV0dXJuIChyZXR2YWwpOworCX0KKwlpZiAoY291bnQpIHsKKwkJYWN0dWFsbHlfd3JpdHRlbiArPSBjb3VudDsKKwkJaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnVmLCBjb3VudCk7CisJCXRhcGUtPm1lcmdlX3N0YWdlX3NpemUgKz0gY291bnQ7CisJfQorCXJldHVybiAoYWN0dWFsbHlfd3JpdHRlbik7Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV93cml0ZV9maWxlbWFyayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfcGNfdCBwYzsKKworCS8qIFdyaXRlIGEgZmlsZW1hcmsgKi8KKwlpZGV0YXBlX2NyZWF0ZV93cml0ZV9maWxlbWFya19jbWQoZHJpdmUsICZwYywgMSk7CisJaWYgKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBDb3VsZG4ndCB3cml0ZSBhIGZpbGVtYXJrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKgorICoJaWRldGFwZV9tdGlvY3RvcCBpcyBjYWxsZWQgZnJvbSBpZGV0YXBlX2NocmRldl9pb2N0bCB3aGVuCisgKgl0aGUgZ2VuZXJhbCBtdGlvIE1USU9DVE9QIGlvY3RsIGlzIHJlcXVlc3RlZC4KKyAqCisgKglXZSBjdXJyZW50bHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG10aW8uaCBvcGVyYXRpb25zOgorICoKKyAqCU1URlNGCS0JU3BhY2Ugb3ZlciBtdF9jb3VudCBmaWxlbWFya3MgaW4gdGhlIHBvc2l0aXZlIGRpcmVjdGlvbi4KKyAqCQkJVGhlIHRhcGUgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBzcGFjZWQgZmlsZW1hcmsuCisgKgorICoJTVRGU0ZNCS0JU2FtZSBhcyBNVEZTRiwgYnV0IHRoZSB0YXBlIGlzIHBvc2l0aW9uZWQgYmVmb3JlIHRoZQorICoJCQlsYXN0IGZpbGVtYXJrLgorICoKKyAqCU1UQlNGCS0JU3RlcHMgYmFja2dyb3VuZCBvdmVyIG10X2NvdW50IGZpbGVtYXJrcywgdGFwZSBpcworICoJCQlwb3NpdGlvbmVkIGJlZm9yZSB0aGUgbGFzdCBmaWxlbWFyay4KKyAqCisgKglNVEJTRk0JLQlMaWtlIE1UQlNGLCBvbmx5IHRhcGUgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBmaWxlbWFyay4KKyAqCisgKglOb3RlOgorICoKKyAqCQlNVEJTRiBhbmQgTVRCU0ZNIGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4gdGhlIHRhcGUgZG9lc24ndAorICoJCXN1cHBvcnQgc3BhY2luZyBvdmVyIGZpbGVtYXJrcyBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCisgKgkJSW4gdGhpcyBjYXNlLCBNVEZTRk0gaXMgYWxzbyB1c3VhbGx5IG5vdCBzdXBwb3J0ZWQgKGl0IGlzCisgKgkJc3VwcG9ydGVkIGluIHRoZSByYXJlIGNhc2UgaW4gd2hpY2ggd2UgY3Jvc3NlZCB0aGUgZmlsZW1hcmsKKyAqCQlkdXJpbmcgb3VyIHJlYWQtYWhlYWQgcGlwZWxpbmVkIG9wZXJhdGlvbiBtb2RlKS4KKyAqCQkKKyAqCU1UV0VPRgktCVdyaXRlcyBtdF9jb3VudCBmaWxlbWFya3MuIFRhcGUgaXMgcG9zaXRpb25lZCBhZnRlcgorICoJCQl0aGUgbGFzdCB3cml0dGVuIGZpbGVtYXJrLgorICoKKyAqCU1UUkVXCS0JUmV3aW5kcyB0YXBlLgorICoKKyAqCU1UTE9BRAktCUxvYWRzIHRoZSB0YXBlLgorICoKKyAqCU1UT0ZGTAktCVB1dHMgdGhlIHRhcGUgZHJpdmUgIk9mZmxpbmUiOiBSZXdpbmRzIHRoZSB0YXBlIGFuZAorICoJTVRVTkxPQUQJcHJldmVudHMgZnVydGhlciBhY2Nlc3MgdW50aWwgdGhlIG1lZGlhIGlzIHJlcGxhY2VkLgorICoKKyAqCU1UTk9QCS0JRmx1c2hlcyB0YXBlIGJ1ZmZlcnMuCisgKgorICoJTVRSRVRFTgktCVJldGVuc2lvbiBtZWRpYS4gVGhpcyB0eXBpY2FsbHkgY29uc2lzdHMgb2Ygb25lIGVuZAorICoJCQl0byBlbmQgcGFzcyBvbiB0aGUgbWVkaWEuCisgKgorICoJTVRFT00JLQlNb3ZlcyB0byB0aGUgZW5kIG9mIHJlY29yZGVkIGRhdGEuCisgKgorICoJTVRFUkFTRQktCUVyYXNlcyB0YXBlLgorICoKKyAqCU1UU0VUQkxLIC0gCVNldHMgdGhlIHVzZXIgYmxvY2sgc2l6ZSB0byBtdF9jb3VudCBieXRlcy4gSWYKKyAqCQkJbXRfY291bnQgaXMgMCwgd2Ugd2lsbCBhdHRlbXB0IHRvIGF1dG9kZXRlY3QKKyAqCQkJdGhlIGJsb2NrIHNpemUuCisgKgorICoJTVRTRUVLCS0JUG9zaXRpb25zIHRoZSB0YXBlIGluIGEgc3BlY2lmaWMgYmxvY2sgbnVtYmVyLCB3aGVyZQorICoJCQllYWNoIGJsb2NrIGlzIGFzc3VtZWQgdG8gY29udGFpbiB3aGljaCB1c2VyX2Jsb2NrX3NpemUKKyAqCQkJYnl0ZXMuCisgKgorICoJTVRTRVRQQVJUIC0gCVN3aXRjaGVzIHRvIGFub3RoZXIgdGFwZSBwYXJ0aXRpb24uCisgKgorICoJTVRMT0NLIC0gCUxvY2tzIHRoZSB0YXBlIGRvb3IuCisgKgorICoJTVRVTkxPQ0sgLSAJVW5sb2NrcyB0aGUgdGFwZSBkb29yLgorICoKKyAqCVRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkOgorICoKKyAqCU1URlNTLCBNVEJTUywgTVRXU00sIE1UU0VUREVOU0lUWSwKKyAqCU1UU0VURFJWQlVGRkVSLCBNVF9TVF9CT09MRUFOUywgTVRfU1RfV1JJVEVfVEhSRVNIT0xELgorICovCitzdGF0aWMgaW50IGlkZXRhcGVfbXRpb2N0b3AgKGlkZV9kcml2ZV90ICpkcml2ZSxzaG9ydCBtdF9vcCxpbnQgbXRfY291bnQpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRldGFwZV9wY190IHBjOworCWludCBpLHJldHZhbDsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDEpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBIYW5kbGluZyBNVElPQ1RPUCBpb2N0bDogIgorCQkJIm10X29wPSVkLCBtdF9jb3VudD0lZFxuIiwgbXRfb3AsIG10X2NvdW50KTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCS8qCisJICoJQ29tbWFuZHMgd2hpY2ggbmVlZCBvdXIgcGlwZWxpbmVkIHJlYWQtYWhlYWQgc3RhZ2VzLgorCSAqLworCXN3aXRjaCAobXRfb3ApIHsKKwkJY2FzZSBNVEZTRjoKKwkJY2FzZSBNVEZTRk06CisJCWNhc2UgTVRCU0Y6CisJCWNhc2UgTVRCU0ZNOgorCQkJaWYgKCFtdF9jb3VudCkKKwkJCQlyZXR1cm4gKDApOworCQkJcmV0dXJuIChpZGV0YXBlX3NwYWNlX292ZXJfZmlsZW1hcmtzKGRyaXZlLG10X29wLG10X2NvdW50KSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJc3dpdGNoIChtdF9vcCkgeworCQljYXNlIE1UV0VPRjoKKwkJCWlmICh0YXBlLT53cml0ZV9wcm90KQorCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUoZHJpdmUsIDEpOworCQkJZm9yIChpID0gMDsgaSA8IG10X2NvdW50OyBpKyspIHsKKwkJCQlyZXR2YWwgPSBpZGV0YXBlX3dyaXRlX2ZpbGVtYXJrKGRyaXZlKTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dXJuICgwKTsKKwkJY2FzZSBNVFJFVzoKKwkJCWlkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlLCAwKTsKKwkJCWlmIChpZGV0YXBlX3Jld2luZF90YXBlKGRyaXZlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXJldHVybiAwOworCQljYXNlIE1UTE9BRDoKKwkJCWlkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlLCAwKTsKKwkJCWlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZChkcml2ZSwgJnBjLCBJREVUQVBFX0xVX0xPQURfTUFTSyk7CisJCQlyZXR1cm4gKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSk7CisJCWNhc2UgTVRVTkxPQUQ6CisJCWNhc2UgTVRPRkZMOgorCQkJLyoKKwkJCSAqIElmIGRvb3IgaXMgbG9ja2VkLCBhdHRlbXB0IHRvIHVubG9jayBiZWZvcmUKKwkJCSAqIGF0dGVtcHRpbmcgdG8gZWplY3QuCisJCQkgKi8KKwkJCWlmICh0YXBlLT5kb29yX2xvY2tlZCkgeworCQkJCWlmIChpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZChkcml2ZSwgJnBjLCAwKSkKKwkJCQkJaWYgKCFpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpCisJCQkJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfVU5MT0NLRUQ7CisJCQl9CisJCQlpZGV0YXBlX2Rpc2NhcmRfcmVhZF9waXBlbGluZShkcml2ZSwgMCk7CisJCQlpZGV0YXBlX2NyZWF0ZV9sb2FkX3VubG9hZF9jbWQoZHJpdmUsICZwYywhSURFVEFQRV9MVV9MT0FEX01BU0spOworCQkJcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCQkJaWYgKCFyZXR2YWwpCisJCQkJY2xlYXJfYml0KElERVRBUEVfTUVESVVNX1BSRVNFTlQsICZ0YXBlLT5mbGFncyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQljYXNlIE1UTk9QOgorCQkJaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUoZHJpdmUsIDApOworCQkJcmV0dXJuIChpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhkcml2ZSkpOworCQljYXNlIE1UUkVURU46CisJCQlpZGV0YXBlX2Rpc2NhcmRfcmVhZF9waXBlbGluZShkcml2ZSwgMCk7CisJCQlpZGV0YXBlX2NyZWF0ZV9sb2FkX3VubG9hZF9jbWQoZHJpdmUsICZwYyxJREVUQVBFX0xVX1JFVEVOU0lPTl9NQVNLIHwgSURFVEFQRV9MVV9MT0FEX01BU0spOworCQkJcmV0dXJuIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpOworCQljYXNlIE1URU9NOgorCQkJaWRldGFwZV9jcmVhdGVfc3BhY2VfY21kKCZwYywgMCwgSURFVEFQRV9TUEFDRV9UT19FT0QpOworCQkJcmV0dXJuIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpOworCQljYXNlIE1URVJBU0U6CisJCQkodm9pZCkgaWRldGFwZV9yZXdpbmRfdGFwZShkcml2ZSk7CisJCQlpZGV0YXBlX2NyZWF0ZV9lcmFzZV9jbWQoJnBjKTsKKwkJCXJldHVybiAoaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKTsKKwkJY2FzZSBNVFNFVEJMSzoKKwkJCWlmIChtdF9jb3VudCkgeworCQkJCWlmIChtdF9jb3VudCA8IHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSB8fCBtdF9jb3VudCAlIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSkKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJdGFwZS0+dXNlcl9ic19mYWN0b3IgPSBtdF9jb3VudCAvIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKwkJCQljbGVhcl9iaXQoSURFVEFQRV9ERVRFQ1RfQlMsICZ0YXBlLT5mbGFncyk7CisJCQl9IGVsc2UKKwkJCQlzZXRfYml0KElERVRBUEVfREVURUNUX0JTLCAmdGFwZS0+ZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgTVRTRUVLOgorCQkJaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUoZHJpdmUsIDApOworCQkJcmV0dXJuIGlkZXRhcGVfcG9zaXRpb25fdGFwZShkcml2ZSwgbXRfY291bnQgKiB0YXBlLT51c2VyX2JzX2ZhY3RvciwgdGFwZS0+cGFydGl0aW9uLCAwKTsKKwkJY2FzZSBNVFNFVFBBUlQ6CisJCQlpZGV0YXBlX2Rpc2NhcmRfcmVhZF9waXBlbGluZShkcml2ZSwgMCk7CisJCQlyZXR1cm4gKGlkZXRhcGVfcG9zaXRpb25fdGFwZShkcml2ZSwgMCwgbXRfY291bnQsIDApKTsKKwkJY2FzZSBNVEZTUjoKKwkJY2FzZSBNVEJTUjoKKwkJY2FzZSBNVExPQ0s6CisJCQlpZiAoIWlkZXRhcGVfY3JlYXRlX3ByZXZlbnRfY21kKGRyaXZlLCAmcGMsIDEpKQorCQkJCXJldHVybiAwOworCQkJcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCQkJaWYgKHJldHZhbCkgcmV0dXJuIHJldHZhbDsKKwkJCXRhcGUtPmRvb3JfbG9ja2VkID0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRDsKKwkJCXJldHVybiAwOworCQljYXNlIE1UVU5MT0NLOgorCQkJaWYgKCFpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZChkcml2ZSwgJnBjLCAwKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHZhbCA9IGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7CisJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfVU5MT0NLRUQ7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IE1USU8gb3BlcmF0aW9uICVkIG5vdCAiCisJCQkJInN1cHBvcnRlZFxuIiwgbXRfb3ApOworCQkJcmV0dXJuICgtRUlPKTsKKwl9Cit9CisKKy8qCisgKglPdXIgY2hhcmFjdGVyIGRldmljZSBpb2N0bHMuCisgKgorICoJR2VuZXJhbCBtdGlvLmggbWFnbmV0aWMgaW8gY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBoZXJlLCBhbmQgbm90IGluCisgKgl0aGUgY29ycmVzcG9uZGluZyBibG9jayBpbnRlcmZhY2UuCisgKgorICoJVGhlIGZvbGxvd2luZyBpb2N0bHMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKglNVElPQ1RPUCAtCVJlZmVyIHRvIGlkZXRhcGVfbXRpb2N0b3AgZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorICoKKyAqCU1USU9DR0VUIC0gCVRoZSBtdF9kc3JlZyBmaWVsZCBpbiB0aGUgcmV0dXJuZWQgbXRnZXQgc3RydWN0dXJlCisgKgkJCXdpbGwgYmUgc2V0IHRvICh1c2VyIGJsb2NrIHNpemUgaW4gYnl0ZXMgPDwKKyAqCQkJTVRfU1RfQkxLU0laRV9TSElGVCkgJiBNVF9TVF9CTEtTSVpFX01BU0suCisgKgorICoJCQlUaGUgbXRfYmxrbm8gaXMgc2V0IHRvIHRoZSBjdXJyZW50IHVzZXIgYmxvY2sgbnVtYmVyLgorICoJCQlUaGUgb3RoZXIgbXRnZXQgZmllbGRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqCU1USU9DUE9TIC0JVGhlIGN1cnJlbnQgdGFwZSAiYmxvY2sgcG9zaXRpb24iIGlzIHJldHVybmVkLiBXZQorICoJCQlhc3N1bWUgdGhhdCBlYWNoIGJsb2NrIGNvbnRhaW5zIHVzZXJfYmxvY2tfc2l6ZQorICoJCQlieXRlcy4KKyAqCisgKglPdXIgb3duIGlkZS10YXBlIGlvY3RscyBhcmUgc3VwcG9ydGVkIG9uIGJvdGggaW50ZXJmYWNlcy4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX2NocmRldl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9mKGZpbGUpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOworCXN0cnVjdCBtdG9wIG10b3A7CisJc3RydWN0IG10Z2V0IG10Z2V0OworCXN0cnVjdCBtdHBvcyBtdHBvczsKKwlpbnQgYmxvY2tfb2Zmc2V0ID0gMCwgcG9zaXRpb24gPSB0YXBlLT5maXJzdF9mcmFtZV9wb3NpdGlvbjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworI2lmIElERVRBUEVfREVCVUdfTE9HCisJaWYgKHRhcGUtPmRlYnVnX2xldmVsID49IDMpCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBSZWFjaGVkIGlkZXRhcGVfY2hyZGV2X2lvY3RsLCAiCisJCQkiY21kPSV1XG4iLCBjbWQpOworI2VuZGlmIC8qIElERVRBUEVfREVCVUdfTE9HICovCisKKwl0YXBlLT5yZXN0YXJ0X3NwZWVkX2NvbnRyb2xfcmVxID0gMTsKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9PSBpZGV0YXBlX2RpcmVjdGlvbl93cml0ZSkgeworCQlpZGV0YXBlX2VtcHR5X3dyaXRlX3BpcGVsaW5lKGRyaXZlKTsKKwkJaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMoZHJpdmUpOworCX0KKwlpZiAoY21kID09IE1USU9DR0VUIHx8IGNtZCA9PSBNVElPQ1BPUykgeworCQlibG9ja19vZmZzZXQgPSBpZGV0YXBlX3BpcGVsaW5lX3NpemUoZHJpdmUpIC8gKHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSAqIHRhcGUtPnVzZXJfYnNfZmFjdG9yKTsKKwkJaWYgKChwb3NpdGlvbiA9IGlkZXRhcGVfcmVhZF9wb3NpdGlvbihkcml2ZSkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCX0KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIE1USU9DVE9QOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtdG9wLCBhcmdwLCBzaXplb2YgKHN0cnVjdCBtdG9wKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gKGlkZXRhcGVfbXRpb2N0b3AoZHJpdmUsbXRvcC5tdF9vcCxtdG9wLm10X2NvdW50KSk7CisJCWNhc2UgTVRJT0NHRVQ6CisJCQltZW1zZXQoJm10Z2V0LCAwLCBzaXplb2YgKHN0cnVjdCBtdGdldCkpOworCQkJbXRnZXQubXRfdHlwZSA9IE1UX0lTU0NTSTI7CisJCQltdGdldC5tdF9ibGtubyA9IHBvc2l0aW9uIC8gdGFwZS0+dXNlcl9ic19mYWN0b3IgLSBibG9ja19vZmZzZXQ7CisJCQltdGdldC5tdF9kc3JlZyA9ICgodGFwZS0+dGFwZV9ibG9ja19zaXplICogdGFwZS0+dXNlcl9ic19mYWN0b3IpIDw8IE1UX1NUX0JMS1NJWkVfU0hJRlQpICYgTVRfU1RfQkxLU0laRV9NQVNLOworCQkJaWYgKHRhcGUtPmRydl93cml0ZV9wcm90KSB7CisJCQkJbXRnZXQubXRfZ3N0YXQgfD0gR01UX1dSX1BST1QoMHhmZmZmZmZmZik7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtdGdldCwgc2l6ZW9mKHN0cnVjdCBtdGdldCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCWNhc2UgTVRJT0NQT1M6CisJCQltdHBvcy5tdF9ibGtubyA9IHBvc2l0aW9uIC8gdGFwZS0+dXNlcl9ic19mYWN0b3IgLSBibG9ja19vZmZzZXQ7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtdHBvcywgc2l6ZW9mKHN0cnVjdCBtdHBvcykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9PSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKQorCQkJCWlkZXRhcGVfZGlzY2FyZF9yZWFkX3BpcGVsaW5lKGRyaXZlLCAxKTsKKwkJCXJldHVybiBpZGV0YXBlX2Jsa2Rldl9pb2N0bChkcml2ZSwgY21kLCBhcmcpOworCX0KK30KKworc3RhdGljIHZvaWQgaWRldGFwZV9nZXRfYmxvY2tzaXplX2Zyb21fYmxvY2tfZGVzY3JpcHRvcihpZGVfZHJpdmVfdCAqZHJpdmUpOworCisvKgorICoJT3VyIGNoYXJhY3RlciBkZXZpY2Ugb3BlbiBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX2NocmRldl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpLCBpID0gbWlub3IgJiB+MHhjMDsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaWRldGFwZV90YXBlX3QgKnRhcGU7CisJaWRldGFwZV9wY190IHBjOworCWludCByZXR2YWw7CisKKwkvKgorCSAqIFdlIHJlYWxseSB3YW50IHRvIGRvIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOyBoZXJlLCBidXQgc29tZQorCSAqIHZlcnNpb25zIG9mIHRhciBpbmNvcnJlY3RseSBjYWxsIGxzZWVrIG9uIHRhcGVzIGFuZCBiYWlsIG91dCBpZiB0aGF0CisJICogZmFpbHMuICBTbyB3ZSBkaXNhbGxvdyBwcmVhZCgpIGFuZCBwd3JpdGUoKSwgYnV0IHBlcm1pdCBsc2Vla3MuCisJICovCisJZmlscC0+Zl9tb2RlICY9IH4oRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEUpOworCisjaWYgSURFVEFQRV9ERUJVR19MT0cKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2NocmRldl9vcGVuXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCQorCWlmIChpID49IE1BWF9IV0lGUyAqIE1BWF9EUklWRVMpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoISh0YXBlID0gaWRlX3RhcGVfY2hyZGV2X2dldChpKSkpCisJCXJldHVybiAtRU5YSU87CisKKwlkcml2ZSA9IHRhcGUtPmRyaXZlOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdGFwZTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KElERVRBUEVfQlVTWSwgJnRhcGUtPmZsYWdzKSkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3B1dF90YXBlOworCX0KKworCXJldHZhbCA9IGlkZXRhcGVfd2FpdF9yZWFkeShkcml2ZSwgNjAgKiBIWik7CisJaWYgKHJldHZhbCkgeworCQljbGVhcl9iaXQoSURFVEFQRV9CVVNZLCAmdGFwZS0+ZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogZHJpdmUgbm90IHJlYWR5XG4iLCB0YXBlLT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X3RhcGU7CisJfQorCisJaWRldGFwZV9yZWFkX3Bvc2l0aW9uKGRyaXZlKTsKKwlpZiAoIXRlc3RfYml0KElERVRBUEVfQUREUkVTU19WQUxJRCwgJnRhcGUtPmZsYWdzKSkKKwkJKHZvaWQpaWRldGFwZV9yZXdpbmRfdGFwZShkcml2ZSk7CisKKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiAhPSBpZGV0YXBlX2RpcmVjdGlvbl9yZWFkKQorCQljbGVhcl9iaXQoSURFVEFQRV9QSVBFTElORV9FUlJPUiwgJnRhcGUtPmZsYWdzKTsKKworCS8qIFJlYWQgYmxvY2sgc2l6ZSBhbmQgd3JpdGUgcHJvdGVjdCBzdGF0dXMgZnJvbSBkcml2ZS4gKi8KKwlpZGV0YXBlX2dldF9ibG9ja3NpemVfZnJvbV9ibG9ja19kZXNjcmlwdG9yKGRyaXZlKTsKKworCS8qIFNldCB3cml0ZSBwcm90ZWN0IGZsYWcgaWYgZGV2aWNlIGlzIG9wZW5lZCBhcyByZWFkLW9ubHkuICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKKwkJdGFwZS0+d3JpdGVfcHJvdCA9IDE7CisJZWxzZQorCQl0YXBlLT53cml0ZV9wcm90ID0gdGFwZS0+ZHJ2X3dyaXRlX3Byb3Q7CisKKwkvKiBNYWtlIHN1cmUgZHJpdmUgaXNuJ3Qgd3JpdGUgcHJvdGVjdGVkIGlmIHVzZXIgd2FudHMgdG8gd3JpdGUuICovCisJaWYgKHRhcGUtPndyaXRlX3Byb3QpIHsKKwkJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSB8fAorCQkgICAgKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikgeworCQkJY2xlYXJfYml0KElERVRBUEVfQlVTWSwgJnRhcGUtPmZsYWdzKTsKKwkJCXJldHZhbCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0X3B1dF90YXBlOworCQl9CisJfQorCisJLyoKKwkgKiBMb2NrIHRoZSB0YXBlIGRyaXZlIGRvb3Igc28gdXNlciBjYW4ndCBlamVjdC4KKwkgKi8KKwlpZiAodGFwZS0+Y2hyZGV2X2RpcmVjdGlvbiA9PSBpZGV0YXBlX2RpcmVjdGlvbl9ub25lKSB7CisJCWlmIChpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZChkcml2ZSwgJnBjLCAxKSkgeworCQkJaWYgKCFpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpIHsKKwkJCQlpZiAodGFwZS0+ZG9vcl9sb2NrZWQgIT0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRCkKKwkJCQkJdGFwZS0+ZG9vcl9sb2NrZWQgPSBET09SX0xPQ0tFRDsKKwkJCX0KKwkJfQorCX0KKwlpZGV0YXBlX3Jlc3RhcnRfc3BlZWRfY29udHJvbChkcml2ZSk7CisJdGFwZS0+cmVzdGFydF9zcGVlZF9jb250cm9sX3JlcSA9IDA7CisJcmV0dXJuIDA7CisKK291dF9wdXRfdGFwZToKKwlpZGVfdGFwZV9wdXQodGFwZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgaWRldGFwZV93cml0ZV9yZWxlYXNlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBtaW5vcikKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKworCWlkZXRhcGVfZW1wdHlfd3JpdGVfcGlwZWxpbmUoZHJpdmUpOworCXRhcGUtPm1lcmdlX3N0YWdlID0gX19pZGV0YXBlX2ttYWxsb2Nfc3RhZ2UodGFwZSwgMSwgMCk7CisJaWYgKHRhcGUtPm1lcmdlX3N0YWdlICE9IE5VTEwpIHsKKwkJaWRldGFwZV9wYWRfemVyb3MoZHJpdmUsIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSAqICh0YXBlLT51c2VyX2JzX2ZhY3RvciAtIDEpKTsKKwkJX19pZGV0YXBlX2tmcmVlX3N0YWdlKHRhcGUtPm1lcmdlX3N0YWdlKTsKKwkJdGFwZS0+bWVyZ2Vfc3RhZ2UgPSBOVUxMOworCX0KKwlpZGV0YXBlX3dyaXRlX2ZpbGVtYXJrKGRyaXZlKTsKKwlpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhkcml2ZSk7CisJaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMoZHJpdmUpOworfQorCisvKgorICoJT3VyIGNoYXJhY3RlciBkZXZpY2UgcmVsZWFzZSBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBpZGV0YXBlX2NocmRldl9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxwKTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKKwlpZGV0YXBlX3BjX3QgcGM7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCWxvY2tfa2VybmVsKCk7CisJdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKyNpZiBJREVUQVBFX0RFQlVHX0xPRworCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAzKQorCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUmVhY2hlZCBpZGV0YXBlX2NocmRldl9yZWxlYXNlXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0xPRyAqLworCisJaWYgKHRhcGUtPmNocmRldl9kaXJlY3Rpb24gPT0gaWRldGFwZV9kaXJlY3Rpb25fd3JpdGUpCisJCWlkZXRhcGVfd3JpdGVfcmVsZWFzZShkcml2ZSwgbWlub3IpOworCWlmICh0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID09IGlkZXRhcGVfZGlyZWN0aW9uX3JlYWQpIHsKKwkJaWYgKG1pbm9yIDwgMTI4KQorCQkJaWRldGFwZV9kaXNjYXJkX3JlYWRfcGlwZWxpbmUoZHJpdmUsIDEpOworCQllbHNlCisJCQlpZGV0YXBlX3dhaXRfZm9yX3BpcGVsaW5lKGRyaXZlKTsKKwl9CisJaWYgKHRhcGUtPmNhY2hlX3N0YWdlICE9IE5VTEwpIHsKKwkJX19pZGV0YXBlX2tmcmVlX3N0YWdlKHRhcGUtPmNhY2hlX3N0YWdlKTsKKwkJdGFwZS0+Y2FjaGVfc3RhZ2UgPSBOVUxMOworCX0KKwlpZiAobWlub3IgPCAxMjggJiYgdGVzdF9iaXQoSURFVEFQRV9NRURJVU1fUFJFU0VOVCwgJnRhcGUtPmZsYWdzKSkKKwkJKHZvaWQpIGlkZXRhcGVfcmV3aW5kX3RhcGUoZHJpdmUpOworCWlmICh0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID09IGlkZXRhcGVfZGlyZWN0aW9uX25vbmUpIHsKKwkJaWYgKHRhcGUtPmRvb3JfbG9ja2VkID09IERPT1JfTE9DS0VEKSB7CisJCQlpZiAoaWRldGFwZV9jcmVhdGVfcHJldmVudF9jbWQoZHJpdmUsICZwYywgMCkpIHsKKwkJCQlpZiAoIWlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkKKwkJCQkJdGFwZS0+ZG9vcl9sb2NrZWQgPSBET09SX1VOTE9DS0VEOworCQkJfQorCQl9CisJfQorCWNsZWFyX2JpdChJREVUQVBFX0JVU1ksICZ0YXBlLT5mbGFncyk7CisJaWRlX3RhcGVfcHV0KHRhcGUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWlkZXRhcGVfaWRlbnRpZnlfZGV2aWNlIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgY29udGVudHMgb2YgdGhlCisgKglBVEFQSSBJREVOVElGWSBjb21tYW5kIHJlc3VsdHMuIFdlIHJldHVybjoKKyAqCisgKgkxCUlmIHRoZSB0YXBlIGNhbiBiZSBzdXBwb3J0ZWQgYnkgdXMsIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbgorICoJCXdlIGhhdmUgc28gZmFyLgorICoKKyAqCTAgCUlmIHRoaXMgdGFwZSBkcml2ZXIgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdXMuCisgKi8KK3N0YXRpYyBpbnQgaWRldGFwZV9pZGVudGlmeV9kZXZpY2UgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaWRldGFwZV9pZF9nY3cgZ2N3OworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKyNpZiBJREVUQVBFX0RFQlVHX0lORk8KKwl1bnNpZ25lZCBzaG9ydCBtYXNrLGk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19JTkZPICovCisKKwlpZiAoZHJpdmUtPmlkX3JlYWQgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKSAmZ2N3KSA9IGlkLT5jb25maWc7CisKKyNpZiBJREVUQVBFX0RFQlVHX0lORk8KKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogRHVtcGluZyBBVEFQSSBJZGVudGlmeSBEZXZpY2UgdGFwZSBwYXJhbWV0ZXJzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogUHJvdG9jb2wgVHlwZTogIik7CisJc3dpdGNoIChnY3cucHJvdG9jb2wpIHsKKwkJY2FzZSAwOiBjYXNlIDE6IHByaW50aygiQVRBXG4iKTticmVhazsKKwkJY2FzZSAyOglwcmludGsoIkFUQVBJXG4iKTticmVhazsKKwkJY2FzZSAzOiBwcmludGsoIlJlc2VydmVkIChVbmtub3duIHRvIGlkZS10YXBlKVxuIik7YnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBEZXZpY2UgVHlwZTogJXggLSAiLGdjdy5kZXZpY2VfdHlwZSk7CQorCXN3aXRjaCAoZ2N3LmRldmljZV90eXBlKSB7CisJCWNhc2UgMDogcHJpbnRrKCJEaXJlY3QtYWNjZXNzIERldmljZVxuIik7YnJlYWs7CisJCWNhc2UgMTogcHJpbnRrKCJTdHJlYW1pbmcgVGFwZSBEZXZpY2VcbiIpO2JyZWFrOworCQljYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBwcmludGsoIlJlc2VydmVkXG4iKTticmVhazsKKwkJY2FzZSA1OiBwcmludGsoIkNELVJPTSBEZXZpY2VcbiIpO2JyZWFrOworCQljYXNlIDY6IHByaW50aygiUmVzZXJ2ZWRcbiIpOworCQljYXNlIDc6IHByaW50aygiT3B0aWNhbCBtZW1vcnkgRGV2aWNlXG4iKTticmVhazsKKwkJY2FzZSAweDFmOiBwcmludGsoIlVua25vd24gb3Igbm8gRGV2aWNlIHR5cGVcbiIpO2JyZWFrOworCQlkZWZhdWx0OiBwcmludGsoIlJlc2VydmVkXG4iKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlbW92YWJsZTogJXMiLGdjdy5yZW1vdmFibGUgPyAiWWVzXG4iOiJOb1xuIik7CQorCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBDb21tYW5kIFBhY2tldCBEUlEgVHlwZTogIik7CisJc3dpdGNoIChnY3cuZHJxX3R5cGUpIHsKKwkJY2FzZSAwOiBwcmludGsoIk1pY3JvcHJvY2Vzc29yIERSUVxuIik7YnJlYWs7CisJCWNhc2UgMTogcHJpbnRrKCJJbnRlcnJ1cHQgRFJRXG4iKTticmVhazsKKwkJY2FzZSAyOiBwcmludGsoIkFjY2VsZXJhdGVkIERSUVxuIik7YnJlYWs7CisJCWNhc2UgMzogcHJpbnRrKCJSZXNlcnZlZFxuIik7YnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBDb21tYW5kIFBhY2tldCBTaXplOiAiKTsKKwlzd2l0Y2ggKGdjdy5wYWNrZXRfc2l6ZSkgeworCQljYXNlIDA6IHByaW50aygiMTIgYnl0ZXNcbiIpO2JyZWFrOworCQljYXNlIDE6IHByaW50aygiMTYgYnl0ZXNcbiIpO2JyZWFrOworCQlkZWZhdWx0OiBwcmludGsoIlJlc2VydmVkXG4iKTticmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IE1vZGVsOiAlLjQwc1xuIixpZC0+bW9kZWwpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBGaXJtd2FyZSBSZXZpc2lvbjogJS44c1xuIixpZC0+ZndfcmV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU2VyaWFsIE51bWJlcjogJS4yMHNcbiIsaWQtPnNlcmlhbF9ubyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFdyaXRlIGJ1ZmZlciBzaXplOiAlZCBieXRlc1xuIixpZC0+YnVmX3NpemUqNTEyKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogRE1BOiAlcyIsaWQtPmNhcGFiaWxpdHkgJiAweDAxID8gIlllc1xuIjoiTm9cbiIpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBMQkE6ICVzIixpZC0+Y2FwYWJpbGl0eSAmIDB4MDIgPyAiWWVzXG4iOiJOb1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IElPUkRZIGNhbiBiZSBkaXNhYmxlZDogJXMiLGlkLT5jYXBhYmlsaXR5ICYgMHgwNCA/ICJZZXNcbiI6Ik5vXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogSU9SRFkgc3VwcG9ydGVkOiAlcyIsaWQtPmNhcGFiaWxpdHkgJiAweDA4ID8gIlllc1xuIjoiVW5rbm93blxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IEFUQVBJIG92ZXJsYXAgc3VwcG9ydGVkOiAlcyIsaWQtPmNhcGFiaWxpdHkgJiAweDIwID8gIlllc1xuIjoiTm9cbiIpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBQSU8gQ3ljbGUgVGltaW5nIENhdGVnb3J5OiAlZFxuIixpZC0+dFBJTyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IERNQSBDeWNsZSBUaW1pbmcgQ2F0ZWdvcnk6ICVkXG4iLGlkLT50RE1BKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU2luZ2xlIFdvcmQgRE1BIHN1cHBvcnRlZCBtb2RlczogIik7CisJZm9yIChpPTAsbWFzaz0xO2k8ODtpKyssbWFzaz1tYXNrIDw8IDEpIHsKKwkJaWYgKGlkLT5kbWFfMXdvcmQgJiBtYXNrKQorCQkJcHJpbnRrKCIlZCAiLGkpOworCQlpZiAoaWQtPmRtYV8xd29yZCAmIChtYXNrIDw8IDgpKQorCQkJcHJpbnRrKCIoYWN0aXZlKSAiKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBNdWx0aSBXb3JkIERNQSBzdXBwb3J0ZWQgbW9kZXM6ICIpOworCWZvciAoaT0wLG1hc2s9MTtpPDg7aSsrLG1hc2s9bWFzayA8PCAxKSB7CisJCWlmIChpZC0+ZG1hX213b3JkICYgbWFzaykKKwkJCXByaW50aygiJWQgIixpKTsKKwkJaWYgKGlkLT5kbWFfbXdvcmQgJiAobWFzayA8PCA4KSkKKwkJCXByaW50aygiKGFjdGl2ZSkgIik7CisJfQorCXByaW50aygiXG4iKTsKKwlpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMHgwMDAyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBFbmhhbmNlZCBQSU8gTW9kZXM6ICVzXG4iLAorCQkJaWQtPmVpZGVfcGlvX21vZGVzICYgMSA/ICJNb2RlIDMiOiJOb25lIik7CisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBNaW5pbXVtIE11bHRpLXdvcmQgRE1BIGN5Y2xlIHBlciB3b3JkOiAiKTsKKwkJaWYgKGlkLT5laWRlX2RtYV9taW4gPT0gMCkKKwkJCXByaW50aygiTm90IHN1cHBvcnRlZFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiJWQgbnNcbiIsaWQtPmVpZGVfZG1hX21pbik7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IE1hbnVmYWN0dXJlclwncyBSZWNvbW1lbmRlZCBNdWx0aS13b3JkIGN5Y2xlOiAiKTsKKwkJaWYgKGlkLT5laWRlX2RtYV90aW1lID09IDApCisJCQlwcmludGsoIk5vdCBzdXBwb3J0ZWRcbiIpOworCQllbHNlCisJCQlwcmludGsoIiVkIG5zXG4iLGlkLT5laWRlX2RtYV90aW1lKTsKKworCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogTWluaW11bSBQSU8gY3ljbGUgd2l0aG91dCBJT1JEWTogIik7CisJCWlmIChpZC0+ZWlkZV9waW8gPT0gMCkKKwkJCXByaW50aygiTm90IHN1cHBvcnRlZFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiJWQgbnNcbiIsaWQtPmVpZGVfcGlvKTsKKworCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogTWluaW11bSBQSU8gY3ljbGUgd2l0aCBJT1JEWTogIik7CisJCWlmIChpZC0+ZWlkZV9waW9faW9yZHkgPT0gMCkKKwkJCXByaW50aygiTm90IHN1cHBvcnRlZFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiJWQgbnNcbiIsaWQtPmVpZGVfcGlvX2lvcmR5KTsKKwkJCisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBBY2NvcmRpbmcgdG8gdGhlIGRldmljZSwgZmllbGRzIDY0LTcwIGFyZSBub3QgdmFsaWQuXG4iKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0lORk8gKi8KKworCS8qIENoZWNrIHRoYXQgd2UgY2FuIHN1cHBvcnQgdGhpcyBkZXZpY2UgKi8KKworCWlmIChnY3cucHJvdG9jb2wgIT0yICkKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogUHJvdG9jb2wgaXMgbm90IEFUQVBJXG4iKTsKKwllbHNlIGlmIChnY3cuZGV2aWNlX3R5cGUgIT0gMSkKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogRGV2aWNlIHR5cGUgaXMgbm90IHNldCB0byB0YXBlXG4iKTsKKwllbHNlIGlmICghZ2N3LnJlbW92YWJsZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogVGhlIHJlbW92YWJsZSBmbGFnIGlzIG5vdCBzZXRcbiIpOworCWVsc2UgaWYgKGdjdy5wYWNrZXRfc2l6ZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IFBhY2tldCBzaXplIGlzIG5vdCAxMiBieXRlcyBsb25nXG4iKTsKKwkJaWYgKGdjdy5wYWNrZXRfc2l6ZSA9PSAxKQorCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogU29ycnksIHBhZGRpbmcgdG8gMTYgYnl0ZXMgaXMgc3RpbGwgbm90IHN1cHBvcnRlZFxuIik7CisJfSBlbHNlCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogVXNlIElOUVVJUlkgdG8gZ2V0IHRoZSBmaXJtd2FyZSByZXZpc2lvbgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2dldF9pbnF1aXJ5X3Jlc3VsdHMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwljaGFyICpyOworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZXRhcGVfcGNfdCBwYzsKKwlpZGV0YXBlX2lucXVpcnlfcmVzdWx0X3QgKmlucXVpcnk7CisJCisJaWRldGFwZV9jcmVhdGVfaW5xdWlyeV9jbWQoJnBjKTsKKwlpZiAoaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6ICVzOiBjYW4ndCBnZXQgSU5RVUlSWSByZXN1bHRzXG4iLCB0YXBlLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpbnF1aXJ5ID0gKGlkZXRhcGVfaW5xdWlyeV9yZXN1bHRfdCAqKSBwYy5idWZmZXI7CisJbWVtY3B5KHRhcGUtPnZlbmRvcl9pZCwgaW5xdWlyeS0+dmVuZG9yX2lkLCA4KTsKKwltZW1jcHkodGFwZS0+cHJvZHVjdF9pZCwgaW5xdWlyeS0+cHJvZHVjdF9pZCwgMTYpOworCW1lbWNweSh0YXBlLT5maXJtd2FyZV9yZXZpc2lvbiwgaW5xdWlyeS0+cmV2aXNpb25fbGV2ZWwsIDQpOworCWlkZV9maXhzdHJpbmcodGFwZS0+dmVuZG9yX2lkLCAxMCwgMCk7CisJaWRlX2ZpeHN0cmluZyh0YXBlLT5wcm9kdWN0X2lkLCAxOCwgMCk7CisJaWRlX2ZpeHN0cmluZyh0YXBlLT5maXJtd2FyZV9yZXZpc2lvbiwgNiwgMCk7CisJciA9IHRhcGUtPmZpcm13YXJlX3JldmlzaW9uOworCWlmICgqKHIgKyAxKSA9PSAnLicpCisJCXRhcGUtPmZpcm13YXJlX3JldmlzaW9uX251bSA9ICgqciAtICcwJykgKiAxMDAgKyAoKihyICsgMikgLSAnMCcpICogMTAgKyAqKHIgKyAzKSAtICcwJzsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXMgPC0+ICVzOiAlcyAlcyByZXYgJXNcbiIsIGRyaXZlLT5uYW1lLCB0YXBlLT5uYW1lLCB0YXBlLT52ZW5kb3JfaWQsIHRhcGUtPnByb2R1Y3RfaWQsIHRhcGUtPmZpcm13YXJlX3JldmlzaW9uKTsKK30KKworLyoKKyAqCWlkZXRhcGVfZ2V0X21vZGVfc2Vuc2VfcmVzdWx0cyBhc2tzIHRoZSB0YXBlIGFib3V0IGl0cyB2YXJpb3VzCisgKglwYXJhbWV0ZXJzLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aWxsIGFkanVzdCBvdXIgZGF0YSB0cmFuc2ZlciBidWZmZXIKKyAqCXNpemUgdG8gdGhlIHJlY29tbWVuZGVkIHZhbHVlIGFzIHJldHVybmVkIGJ5IHRoZSB0YXBlLgorICovCitzdGF0aWMgdm9pZCBpZGV0YXBlX2dldF9tb2RlX3NlbnNlX3Jlc3VsdHMgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlpZGV0YXBlX3BjX3QgcGM7CisJaWRldGFwZV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqaGVhZGVyOworCWlkZXRhcGVfY2FwYWJpbGl0aWVzX3BhZ2VfdCAqY2FwYWJpbGl0aWVzOworCQorCWlkZXRhcGVfY3JlYXRlX21vZGVfc2Vuc2VfY21kKCZwYywgSURFVEFQRV9DQVBBQklMSVRJRVNfUEFHRSk7CisJaWYgKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBDYW4ndCBnZXQgdGFwZSBwYXJhbWV0ZXJzIC0gYXNzdW1pbmcgc29tZSBkZWZhdWx0IHZhbHVlc1xuIik7CisJCXRhcGUtPnRhcGVfYmxvY2tfc2l6ZSA9IDUxMjsKKwkJdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCA9IDUyOworCQl0YXBlLT5jYXBhYmlsaXRpZXMuc3BlZWQgPSA0NTA7CisJCXRhcGUtPmNhcGFiaWxpdGllcy5idWZmZXJfc2l6ZSA9IDYgKiA1MjsKKwkJcmV0dXJuOworCX0KKwloZWFkZXIgPSAoaWRldGFwZV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqKSBwYy5idWZmZXI7CisJY2FwYWJpbGl0aWVzID0gKGlkZXRhcGVfY2FwYWJpbGl0aWVzX3BhZ2VfdCAqKSAocGMuYnVmZmVyICsgc2l6ZW9mKGlkZXRhcGVfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QpICsgaGVhZGVyLT5iZGwpOworCisJY2FwYWJpbGl0aWVzLT5tYXhfc3BlZWQgPSBudG9ocyhjYXBhYmlsaXRpZXMtPm1heF9zcGVlZCk7CisJY2FwYWJpbGl0aWVzLT5jdGwgPSBudG9ocyhjYXBhYmlsaXRpZXMtPmN0bCk7CisJY2FwYWJpbGl0aWVzLT5zcGVlZCA9IG50b2hzKGNhcGFiaWxpdGllcy0+c3BlZWQpOworCWNhcGFiaWxpdGllcy0+YnVmZmVyX3NpemUgPSBudG9ocyhjYXBhYmlsaXRpZXMtPmJ1ZmZlcl9zaXplKTsKKworCWlmICghY2FwYWJpbGl0aWVzLT5zcGVlZCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXM6IG92ZXJyaWRpbmcgY2FwYWJpbGl0aWVzLT5zcGVlZCAoYXNzdW1pbmcgNjUwS0Ivc2VjKVxuIiwgZHJpdmUtPm5hbWUpOworCQljYXBhYmlsaXRpZXMtPnNwZWVkID0gNjUwOworCX0KKwlpZiAoIWNhcGFiaWxpdGllcy0+bWF4X3NwZWVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlczogb3ZlcnJpZGluZyBjYXBhYmlsaXRpZXMtPm1heF9zcGVlZCAoYXNzdW1pbmcgNjUwS0Ivc2VjKVxuIiwgZHJpdmUtPm5hbWUpOworCQljYXBhYmlsaXRpZXMtPm1heF9zcGVlZCA9IDY1MDsKKwl9CisKKwl0YXBlLT5jYXBhYmlsaXRpZXMgPSAqY2FwYWJpbGl0aWVzOwkJLyogU2F2ZSB1cyBhIGNvcHkgKi8KKwlpZiAoY2FwYWJpbGl0aWVzLT5ibGs1MTIpCisJCXRhcGUtPnRhcGVfYmxvY2tfc2l6ZSA9IDUxMjsKKwllbHNlIGlmIChjYXBhYmlsaXRpZXMtPmJsazEwMjQpCisJCXRhcGUtPnRhcGVfYmxvY2tfc2l6ZSA9IDEwMjQ7CisKKyNpZiBJREVUQVBFX0RFQlVHX0lORk8KKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogRHVtcGluZyB0aGUgcmVzdWx0cyBvZiB0aGUgTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IE1vZGUgUGFyYW1ldGVyIEhlYWRlcjpcbiIpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBNb2RlIERhdGEgTGVuZ3RoIC0gJWRcbiIsaGVhZGVyLT5tb2RlX2RhdGFfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogTWVkaXVtIFR5cGUgLSAlZFxuIixoZWFkZXItPm1lZGl1bV90eXBlKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogRGV2aWNlIFNwZWNpZmljIFBhcmFtZXRlciAtICVkXG4iLGhlYWRlci0+ZHNwKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogQmxvY2sgRGVzY3JpcHRvciBMZW5ndGggLSAlZFxuIixoZWFkZXItPmJkbCk7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IENhcGFiaWxpdGllcyBhbmQgTWVjaGFuaWNhbCBTdGF0dXMgUGFnZTpcbiIpOworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBQYWdlIGNvZGUgLSAlZFxuIixjYXBhYmlsaXRpZXMtPnBhZ2VfY29kZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFBhZ2UgbGVuZ3RoIC0gJWRcbiIsY2FwYWJpbGl0aWVzLT5wYWdlX2xlbmd0aCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFJlYWQgb25seSAtICVzXG4iLGNhcGFiaWxpdGllcy0+cm8gPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgcmV2ZXJzZSBzcGFjZSAtICVzXG4iLGNhcGFiaWxpdGllcy0+c3ByZXYgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgZXJhc2UgaW5pdGlhdGVkIGZvcm1hdHRpbmcgLSAlc1xuIixjYXBhYmlsaXRpZXMtPmVmbXQgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgUUZBIHR3byBQYXJ0aXRpb24gZm9ybWF0IC0gJXNcbiIsY2FwYWJpbGl0aWVzLT5xZmEgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgbG9ja2luZyB0aGUgbWVkaXVtIC0gJXNcbiIsY2FwYWJpbGl0aWVzLT5sb2NrID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFRoZSB2b2x1bWUgaXMgY3VycmVudGx5IGxvY2tlZCAtICVzXG4iLGNhcGFiaWxpdGllcy0+bG9ja2VkID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFRoZSBkZXZpY2UgZGVmYXVsdHMgaW4gdGhlIHByZXZlbnQgc3RhdGUgLSAlc1xuIixjYXBhYmlsaXRpZXMtPnByZXZlbnQgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgZWplY3RpbmcgdGhlIG1lZGl1bSAtICVzXG4iLGNhcGFiaWxpdGllcy0+ZWplY3QgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgZXJyb3IgY29ycmVjdGlvbiAtICVzXG4iLGNhcGFiaWxpdGllcy0+ZWNjID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFN1cHBvcnRzIGRhdGEgY29tcHJlc3Npb24gLSAlc1xuIixjYXBhYmlsaXRpZXMtPmNtcHJzID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFN1cHBvcnRzIDUxMiBieXRlcyBibG9jayBzaXplIC0gJXNcbiIsY2FwYWJpbGl0aWVzLT5ibGs1MTIgPyAiWWVzIjoiTm8iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogU3VwcG9ydHMgMTAyNCBieXRlcyBibG9jayBzaXplIC0gJXNcbiIsY2FwYWJpbGl0aWVzLT5ibGsxMDI0ID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IFN1cHBvcnRzIDMyNzY4IGJ5dGVzIGJsb2NrIHNpemUgLyBSZXN0cmljdGVkIGJ5dGUgY291bnQgZm9yIFBJTyB0cmFuc2ZlcnMgLSAlc1xuIixjYXBhYmlsaXRpZXMtPmJsazMyNzY4ID8gIlllcyI6Ik5vIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IE1heGltdW0gc3VwcG9ydGVkIHNwZWVkIGluIEtCcHMgLSAlZFxuIixjYXBhYmlsaXRpZXMtPm1heF9zcGVlZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6IENvbnRpbnVvdXMgdHJhbnNmZXIgbGltaXRzIGluIGJsb2NrcyAtICVkXG4iLGNhcGFiaWxpdGllcy0+Y3RsKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogQ3VycmVudCBzcGVlZCBpbiBLQnBzIC0gJWRcbiIsY2FwYWJpbGl0aWVzLT5zcGVlZCk7CQorCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBCdWZmZXIgc2l6ZSAtICVkXG4iLGNhcGFiaWxpdGllcy0+YnVmZmVyX3NpemUqNTEyKTsKKyNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0lORk8gKi8KK30KKworLyoKKyAqCWlkZV9nZXRfYmxvY2tzaXplX2Zyb21fYmxvY2tfZGVzY3JpcHRvciBkb2VzIGEgbW9kZSBzZW5zZSBwYWdlIDAgd2l0aCBibG9jayBkZXNjcmlwdG9yCisgKglhbmQgaWYgaXQgc3VjY2VlZHMgc2V0cyB0aGUgdGFwZSBibG9jayBzaXplIHdpdGggdGhlIHJlcG9ydGVkIHZhbHVlCisgKi8KK3N0YXRpYyB2b2lkIGlkZXRhcGVfZ2V0X2Jsb2Nrc2l6ZV9mcm9tX2Jsb2NrX2Rlc2NyaXB0b3IoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRldGFwZV9wY190IHBjOworCWlkZXRhcGVfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QgKmhlYWRlcjsKKwlpZGV0YXBlX3BhcmFtZXRlcl9ibG9ja19kZXNjcmlwdG9yX3QgKmJsb2NrX2Rlc2NycDsKKwkKKwlpZGV0YXBlX2NyZWF0ZV9tb2RlX3NlbnNlX2NtZCgmcGMsIElERVRBUEVfQkxPQ0tfREVTQ1JJUFRPUik7CisJaWYgKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBDYW4ndCBnZXQgYmxvY2sgZGVzY3JpcHRvclxuIik7CisJCWlmICh0YXBlLT50YXBlX2Jsb2NrX3NpemUgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlLXRhcGU6IENhbm5vdCBkZWFsIHdpdGggemVybyBibG9jayBzaXplLCBhc3N1bWUgMzJrXG4iKTsKKwkJCXRhcGUtPnRhcGVfYmxvY2tfc2l6ZSA9ICAzMjc2ODsKKwkJfQorCQlyZXR1cm47CisJfQorCWhlYWRlciA9IChpZGV0YXBlX21vZGVfcGFyYW1ldGVyX2hlYWRlcl90ICopIHBjLmJ1ZmZlcjsKKwlibG9ja19kZXNjcnAgPSAoaWRldGFwZV9wYXJhbWV0ZXJfYmxvY2tfZGVzY3JpcHRvcl90ICopIChwYy5idWZmZXIgKyBzaXplb2YoaWRldGFwZV9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCkpOworCXRhcGUtPnRhcGVfYmxvY2tfc2l6ZSA9KCBibG9ja19kZXNjcnAtPmxlbmd0aFswXTw8MTYpICsgKGJsb2NrX2Rlc2NycC0+bGVuZ3RoWzFdPDw4KSArIGJsb2NrX2Rlc2NycC0+bGVuZ3RoWzJdOworCXRhcGUtPmRydl93cml0ZV9wcm90ID0gKGhlYWRlci0+ZHNwICYgMHg4MCkgPj4gNzsKKworI2lmIElERVRBUEVfREVCVUdfSU5GTworCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBBZGp1c3RlZCBibG9jayBzaXplIC0gJWRcbiIsIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZSk7CisjZW5kaWYgLyogSURFVEFQRV9ERUJVR19JTkZPICovCit9CitzdGF0aWMgdm9pZCBpZGV0YXBlX2FkZF9zZXR0aW5ncyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisvKgorICoJCQlkcml2ZQlzZXR0aW5nIG5hbWUJcmVhZC93cml0ZQlpb2N0bAlpb2N0bAkJZGF0YSB0eXBlCW1pbgkJCW1heAkJCW11bF9mYWN0b3IJCQlkaXZfZmFjdG9yCQkJZGF0YSBwb2ludGVyCQkJCXNldCBmdW5jdGlvbgorICovCisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYnVmZmVyIiwJU0VUVElOR19SRUFELAktMSwJLTEsCQlUWVBFX1NIT1JULAkwLAkJCTB4ZmZmZiwJCQkxLAkJCQkyLAkJCQkmdGFwZS0+Y2FwYWJpbGl0aWVzLmJ1ZmZlcl9zaXplLAlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJwaXBlbGluZV9taW4iLAlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0lOVCwJMSwJCQkweGZmZmYsCQkJdGFwZS0+c3RhZ2Vfc2l6ZSAvIDEwMjQsCTEsCQkJCSZ0YXBlLT5taW5fcGlwZWxpbmUsCQkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkicGlwZWxpbmUiLAlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0lOVCwJMSwJCQkweGZmZmYsCQkJdGFwZS0+c3RhZ2Vfc2l6ZSAvIDEwMjQsCTEsCQkJCSZ0YXBlLT5tYXhfc3RhZ2VzLAkJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInBpcGVsaW5lX21heCIsCVNFVFRJTkdfUlcsCS0xLAktMSwJCVRZUEVfSU5ULAkxLAkJCTB4ZmZmZiwJCQl0YXBlLT5zdGFnZV9zaXplIC8gMTAyNCwJMSwJCQkJJnRhcGUtPm1heF9waXBlbGluZSwJCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJwaXBlbGluZV91c2VkIixTRVRUSU5HX1JFQUQsCS0xLAktMSwJCVRZUEVfSU5ULAkwLAkJCTB4ZmZmZiwJCQl0YXBlLT5zdGFnZV9zaXplIC8gMTAyNCwJMSwJCQkJJnRhcGUtPm5yX3N0YWdlcywJCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJwaXBlbGluZV9wZW5kaW5nIixTRVRUSU5HX1JFQUQsLTEsCS0xLAkJVFlQRV9JTlQsCTAsCQkJMHhmZmZmLAkJCXRhcGUtPnN0YWdlX3NpemUgLyAxMDI0LAkxLAkJCQkmdGFwZS0+bnJfcGVuZGluZ19zdGFnZXMsCQlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJzcGVlZCIsCVNFVFRJTkdfUkVBRCwJLTEsCS0xLAkJVFlQRV9TSE9SVCwJMCwJCQkweGZmZmYsCQkJMSwJCQkJMSwJCQkJJnRhcGUtPmNhcGFiaWxpdGllcy5zcGVlZCwJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInN0YWdlIiwJU0VUVElOR19SRUFELAktMSwJLTEsCQlUWVBFX0lOVCwJMCwJCQkweGZmZmYsCQkJMSwJCQkJMTAyNCwJCQkJJnRhcGUtPnN0YWdlX3NpemUsCQkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkidGRzYyIsCQlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0lOVCwJSURFVEFQRV9EU0NfUldfTUlOLAlJREVUQVBFX0RTQ19SV19NQVgsCTEwMDAsCQkJCUhaLAkJCQkmdGFwZS0+YmVzdF9kc2NfcndfZnJlcXVlbmN5LAkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiZHNjX292ZXJsYXAiLAlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0JZVEUsCTAsCQkJMSwJCQkxLAkJCQkxLAkJCQkmZHJpdmUtPmRzY19vdmVybGFwLAkJCU5VTEwpOworCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInBpcGVsaW5lX2hlYWRfc3BlZWRfYyIsU0VUVElOR19SRUFELAktMSwJLTEsCVRZUEVfSU5ULAkwLAkJCTB4ZmZmZiwJCQkxLAkJCQkxLAkJCQkmdGFwZS0+Y29udHJvbGxlZF9waXBlbGluZV9oZWFkX3NwZWVkLAlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJwaXBlbGluZV9oZWFkX3NwZWVkX3UiLFNFVFRJTkdfUkVBRCwJLTEsCS0xLAlUWVBFX0lOVCwJMCwJCQkweGZmZmYsCQkJMSwJCQkJMSwJCQkJJnRhcGUtPnVuY29udHJvbGxlZF9waXBlbGluZV9oZWFkX3NwZWVkLAlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJhdmdfc3BlZWQiLAlTRVRUSU5HX1JFQUQsCS0xLAktMSwJCVRZUEVfSU5ULAkwLAkJCTB4ZmZmZiwJCQkxLAkJCQkxLAkJCQkmdGFwZS0+YXZnX3NwZWVkLAkJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiZGVidWdfbGV2ZWwiLFNFVFRJTkdfUlcsCS0xLAktMSwJCVRZUEVfSU5ULAkwLAkJCTB4ZmZmZiwJCQkxLAkJCQkxLAkJCQkmdGFwZS0+ZGVidWdfbGV2ZWwsCQlOVUxMKTsKK30KKworLyoKKyAqCWlkZV9zZXR1cCBpcyBjYWxsZWQgdG86CisgKgorICoJCTEuCUluaXRpYWxpemUgb3VyIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzLgorICoJCTIuCUFzayB0aGUgdGFwZSBmb3IgaXRzIGNhcGFiaWxpdGllcy4KKyAqCQkzLglBbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGRhdGEKKyAqCQkJdHJhbnNmZXIuIFRoZSBidWZmZXIgc2l6ZSBpcyBjaG9zZW4gYmFzZWQgb24KKyAqCQkJdGhlIHJlY29tbWVuZGF0aW9uIHdoaWNoIHdlIHJlY2VpdmVkIGluIHN0ZXAgKDIpLgorICoKKyAqCU5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGlkZS5jIGFscmVhZHkgYXNzaWduZWQgdXMgYW4gaXJxLCBzbyB0aGF0CisgKgl3ZSBjYW4gcXVldWUgcmVxdWVzdHMgaGVyZSBhbmQgd2FpdCBmb3IgdGhlaXIgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWRldGFwZV9zZXR1cCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaW50IG1pbm9yKQoreworCXVuc2lnbmVkIGxvbmcgdDEsIHRtaWQsIHRuLCB0OworCWludCBzcGVlZDsKKwlzdHJ1Y3QgaWRldGFwZV9pZF9nY3cgZ2N3OworCWludCBzdGFnZV9zaXplOworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJc3Bpbl9sb2NrX2luaXQoJnRhcGUtPnNwaW5sb2NrKTsKKwlkcml2ZS0+ZHNjX292ZXJsYXAgPSAxOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBDSQorCWlmIChIV0lGKGRyaXZlKS0+cGNpX2RldiAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZXNlIHR3byBpZGUtcGNpIGhvc3QgYWRhcHRlcnMgYXBwZWFyIHRvIG5lZWQgRFNDIG92ZXJsYXAgZGlzYWJsZWQuCisJCSAqIFRoaXMgcHJvYmFibHkgbmVlZHMgZnVydGhlciBhbmFseXNpcy4KKwkJICovCisJCWlmICgoSFdJRihkcml2ZSktPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg1MFVGKSB8fAorCQkgICAgKEhXSUYoZHJpdmUpLT5wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9UVElfSFBUMzQzKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6ICVzOiBkaXNhYmxpbmcgRFNDIG92ZXJsYXBcbiIsIHRhcGUtPm5hbWUpOworCQkgICAgCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFUENJICovCisJLyogU2VhZ2F0ZSBUcmF2YW4gZHJpdmVzIGRvIG5vdCBzdXBwb3J0IERTQyBvdmVybGFwLiAqLworCWlmIChzdHJzdHIoZHJpdmUtPmlkLT5tb2RlbCwgIlNlYWdhdGUgU1RUMzQwMSIpKQorCQlkcml2ZS0+ZHNjX292ZXJsYXAgPSAwOworCXRhcGUtPm1pbm9yID0gbWlub3I7CisJdGFwZS0+bmFtZVswXSA9ICdoJzsKKwl0YXBlLT5uYW1lWzFdID0gJ3QnOworCXRhcGUtPm5hbWVbMl0gPSAnMCcgKyBtaW5vcjsKKwl0YXBlLT5jaHJkZXZfZGlyZWN0aW9uID0gaWRldGFwZV9kaXJlY3Rpb25fbm9uZTsKKwl0YXBlLT5wYyA9IHRhcGUtPnBjX3N0YWNrOworCXRhcGUtPm1heF9pbnNlcnRfc3BlZWQgPSAxMDAwMDsKKwl0YXBlLT5zcGVlZF9jb250cm9sID0gMTsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKSAmZ2N3KSA9IGRyaXZlLT5pZC0+Y29uZmlnOworCWlmIChnY3cuZHJxX3R5cGUgPT0gMSkKKwkJc2V0X2JpdChJREVUQVBFX0RSUV9JTlRFUlJVUFQsICZ0YXBlLT5mbGFncyk7CisKKwl0YXBlLT5taW5fcGlwZWxpbmUgPSB0YXBlLT5tYXhfcGlwZWxpbmUgPSB0YXBlLT5tYXhfc3RhZ2VzID0gMTA7CisJCisJaWRldGFwZV9nZXRfaW5xdWlyeV9yZXN1bHRzKGRyaXZlKTsKKwlpZGV0YXBlX2dldF9tb2RlX3NlbnNlX3Jlc3VsdHMoZHJpdmUpOworCWlkZXRhcGVfZ2V0X2Jsb2Nrc2l6ZV9mcm9tX2Jsb2NrX2Rlc2NyaXB0b3IoZHJpdmUpOworCXRhcGUtPnVzZXJfYnNfZmFjdG9yID0gMTsKKwl0YXBlLT5zdGFnZV9zaXplID0gdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCAqIHRhcGUtPnRhcGVfYmxvY2tfc2l6ZTsKKwl3aGlsZSAodGFwZS0+c3RhZ2Vfc2l6ZSA+IDB4ZmZmZikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImlkZS10YXBlOiBkZWNyZWFzaW5nIHN0YWdlIHNpemVcbiIpOworCQl0YXBlLT5jYXBhYmlsaXRpZXMuY3RsIC89IDI7CisJCXRhcGUtPnN0YWdlX3NpemUgPSB0YXBlLT5jYXBhYmlsaXRpZXMuY3RsICogdGFwZS0+dGFwZV9ibG9ja19zaXplOworCX0KKwlzdGFnZV9zaXplID0gdGFwZS0+c3RhZ2Vfc2l6ZTsKKwl0YXBlLT5wYWdlc19wZXJfc3RhZ2UgPSBzdGFnZV9zaXplIC8gUEFHRV9TSVpFOworCWlmIChzdGFnZV9zaXplICUgUEFHRV9TSVpFKSB7CisJCXRhcGUtPnBhZ2VzX3Blcl9zdGFnZSsrOworCQl0YXBlLT5leGNlc3NfYmhfc2l6ZSA9IFBBR0VfU0laRSAtIHN0YWdlX3NpemUgJSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKglTZWxlY3QgdGhlICJiZXN0IiBEU0MgcmVhZC93cml0ZSBwb2xsaW5nIGZyZXF1ZW5jeQorCSAqCWFuZCBwaXBlbGluZSBzaXplLgorCSAqLworCXNwZWVkID0gbWF4KHRhcGUtPmNhcGFiaWxpdGllcy5zcGVlZCwgdGFwZS0+Y2FwYWJpbGl0aWVzLm1heF9zcGVlZCk7CisKKwl0YXBlLT5tYXhfc3RhZ2VzID0gc3BlZWQgKiAxMDAwICogMTAgLyB0YXBlLT5zdGFnZV9zaXplOworCisJLyoKKwkgKiAJTGltaXQgbWVtb3J5IHVzZSBmb3IgcGlwZWxpbmUgdG8gMTAlIG9mIHBoeXNpY2FsIG1lbW9yeQorCSAqLworCXNpX21lbWluZm8oJnNpKTsKKwlpZiAodGFwZS0+bWF4X3N0YWdlcyAqIHRhcGUtPnN0YWdlX3NpemUgPiBzaS50b3RhbHJhbSAqIHNpLm1lbV91bml0IC8gMTApCisJCXRhcGUtPm1heF9zdGFnZXMgPSBzaS50b3RhbHJhbSAqIHNpLm1lbV91bml0IC8gKDEwICogdGFwZS0+c3RhZ2Vfc2l6ZSk7CisJdGFwZS0+bWF4X3N0YWdlcyAgID0gbWluKHRhcGUtPm1heF9zdGFnZXMsIElERVRBUEVfTUFYX1BJUEVMSU5FX1NUQUdFUyk7CisJdGFwZS0+bWluX3BpcGVsaW5lID0gbWluKHRhcGUtPm1heF9zdGFnZXMsIElERVRBUEVfTUlOX1BJUEVMSU5FX1NUQUdFUyk7CisJdGFwZS0+bWF4X3BpcGVsaW5lID0gbWluKHRhcGUtPm1heF9zdGFnZXMgKiAyLCBJREVUQVBFX01BWF9QSVBFTElORV9TVEFHRVMpOworCWlmICh0YXBlLT5tYXhfc3RhZ2VzID09IDApCisJCXRhcGUtPm1heF9zdGFnZXMgPSB0YXBlLT5taW5fcGlwZWxpbmUgPSB0YXBlLT5tYXhfcGlwZWxpbmUgPSAxOworCisJdDEgPSAodGFwZS0+c3RhZ2Vfc2l6ZSAqIEhaKSAvIChzcGVlZCAqIDEwMDApOworCXRtaWQgPSAodGFwZS0+Y2FwYWJpbGl0aWVzLmJ1ZmZlcl9zaXplICogMzIgKiBIWikgLyAoc3BlZWQgKiAxMjUpOworCXRuID0gKElERVRBUEVfRklGT19USFJFU0hPTEQgKiB0YXBlLT5zdGFnZV9zaXplICogSFopIC8gKHNwZWVkICogMTAwMCk7CisKKwlpZiAodGFwZS0+bWF4X3N0YWdlcykKKwkJdCA9IHRuOworCWVsc2UKKwkJdCA9IHQxOworCisJLyoKKwkgKglFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIHdlIGdvdCBtYWtlcyBzZW5zZTsgbGltaXQKKwkgKglpdCB3aXRoaW4gSURFVEFQRV9EU0NfUldfTUlOIGFuZCBJREVUQVBFX0RTQ19SV19NQVguCisJICovCisJdGFwZS0+YmVzdF9kc2NfcndfZnJlcXVlbmN5ID0gbWF4X3QodW5zaWduZWQgbG9uZywgbWluX3QodW5zaWduZWQgbG9uZywgdCwgSURFVEFQRV9EU0NfUldfTUFYKSwgSURFVEFQRV9EU0NfUldfTUlOKTsKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXMgPC0+ICVzOiAlZEtCcHMsICVkKiVka0IgYnVmZmVyLCAiCisJCSIlZGtCIHBpcGVsaW5lLCAlbHVtcyB0RFNDJXNcbiIsCisJCWRyaXZlLT5uYW1lLCB0YXBlLT5uYW1lLCB0YXBlLT5jYXBhYmlsaXRpZXMuc3BlZWQsCisJCSh0YXBlLT5jYXBhYmlsaXRpZXMuYnVmZmVyX3NpemUgKiA1MTIpIC8gdGFwZS0+c3RhZ2Vfc2l6ZSwKKwkJdGFwZS0+c3RhZ2Vfc2l6ZSAvIDEwMjQsCisJCXRhcGUtPm1heF9zdGFnZXMgKiB0YXBlLT5zdGFnZV9zaXplIC8gMTAyNCwKKwkJdGFwZS0+YmVzdF9kc2NfcndfZnJlcXVlbmN5ICogMTAwMCAvIEhaLAorCQlkcml2ZS0+dXNpbmdfZG1hID8gIiwgRE1BIjoiIik7CisKKwlpZGV0YXBlX2FkZF9zZXR0aW5ncyhkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV9jbGVhbnVwIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWlmICh0ZXN0X2JpdChJREVUQVBFX0JVU1ksICZ0YXBlLT5mbGFncykgfHwgZHJpdmUtPnVzYWdlIHx8CisJICAgIHRhcGUtPmZpcnN0X3N0YWdlICE9IE5VTEwgfHwgdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCURSSVZFUihkcml2ZSktPmJ1c3kgPSAwOworCSh2b2lkKSBpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUpOworCisJaWRlX3VucmVnaXN0ZXJfcmVnaW9uKHRhcGUtPmRpc2spOworCisJaWRlX3RhcGVfcHV0KHRhcGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IHRvX2lkZV90YXBlKGtyZWYpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOworCXN0cnVjdCBnZW5kaXNrICpnID0gdGFwZS0+ZGlzazsKKworCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7CisJZHJpdmUtPmRyaXZlcl9kYXRhID0gTlVMTDsKKwlkZXZmc19yZW1vdmUoIiVzL210IiwgZHJpdmUtPmRldmZzX25hbWUpOworCWRldmZzX3JlbW92ZSgiJXMvbXRuIiwgZHJpdmUtPmRldmZzX25hbWUpOworCWRldmZzX3VucmVnaXN0ZXJfdGFwZShnLT5udW1iZXIpOworCWlkZXRhcGVfZGV2c1t0YXBlLT5taW5vcl0gPSBOVUxMOworCWctPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcHV0X2Rpc2soZyk7CisJa2ZyZWUodGFwZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IHByb2NfaWRldGFwZV9yZWFkX25hbWUKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopIGRhdGE7CisJaWRldGFwZV90YXBlX3QJKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJY2hhcgkJKm91dCA9IHBhZ2U7CisJaW50CQlsZW47CisKKwlsZW4gPSBzcHJpbnRmKG91dCwgIiVzXG4iLCB0YXBlLT5uYW1lKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitzdGF0aWMgaWRlX3Byb2NfZW50cnlfdCBpZGV0YXBlX3Byb2NbXSA9IHsKKwl7ICJjYXBhY2l0eSIsCVNfSUZSRUd8U19JUlVHTywJcHJvY19pZGVfcmVhZF9jYXBhY2l0eSwgTlVMTCB9LAorCXsgIm5hbWUiLAlTX0lGUkVHfFNfSVJVR08sCXByb2NfaWRldGFwZV9yZWFkX25hbWUsCU5VTEwgfSwKKwl7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfQorfTsKKworI2Vsc2UKKworI2RlZmluZQlpZGV0YXBlX3Byb2MJTlVMTAorCisjZW5kaWYKKworc3RhdGljIGludCBpZGV0YXBlX2F0dGFjaChpZGVfZHJpdmVfdCAqZHJpdmUpOworCisvKgorICoJSURFIHN1YmRyaXZlciBmdW5jdGlvbnMsIHJlZ2lzdGVyZWQgd2l0aCBpZGUuYworICovCitzdGF0aWMgaWRlX2RyaXZlcl90IGlkZXRhcGVfZHJpdmVyID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJpZGUtdGFwZSIsCisJLnZlcnNpb24JCT0gSURFVEFQRV9WRVJTSU9OLAorCS5tZWRpYQkJCT0gaWRlX3RhcGUsCisJLmJ1c3kJCQk9IDEsCisJLnN1cHBvcnRzX2RzY19vdmVybGFwIAk9IDEsCisJLmNsZWFudXAJCT0gaWRldGFwZV9jbGVhbnVwLAorCS5kb19yZXF1ZXN0CQk9IGlkZXRhcGVfZG9fcmVxdWVzdCwKKwkuZW5kX3JlcXVlc3QJCT0gaWRldGFwZV9lbmRfcmVxdWVzdCwKKwkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAorCS5hYm9ydAkJCT0gX19pZGVfYWJvcnQsCisJLnByb2MJCQk9IGlkZXRhcGVfcHJvYywKKwkuYXR0YWNoCQkJPSBpZGV0YXBlX2F0dGFjaCwKKwkuZHJpdmVzCQkJPSBMSVNUX0hFQURfSU5JVChpZGV0YXBlX2RyaXZlci5kcml2ZXMpLAorfTsKKworLyoKKyAqCU91ciBjaGFyYWN0ZXIgZGV2aWNlIHN1cHBvcnRpbmcgZnVuY3Rpb25zLCBwYXNzZWQgdG8gcmVnaXN0ZXJfY2hyZGV2LgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZGV0YXBlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGlkZXRhcGVfY2hyZGV2X3JlYWQsCisJLndyaXRlCQk9IGlkZXRhcGVfY2hyZGV2X3dyaXRlLAorCS5pb2N0bAkJPSBpZGV0YXBlX2NocmRldl9pb2N0bCwKKwkub3BlbgkJPSBpZGV0YXBlX2NocmRldl9vcGVuLAorCS5yZWxlYXNlCT0gaWRldGFwZV9jaHJkZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgaWRldGFwZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlOworCWlkZV9kcml2ZV90ICpkcml2ZTsKKworCWlmICghKHRhcGUgPSBpZGVfdGFwZV9nZXQoZGlzaykpKQorCQlyZXR1cm4gLUVOWElPOworCisJZHJpdmUgPSB0YXBlLT5kcml2ZTsKKworCWRyaXZlLT51c2FnZSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZyhkaXNrKTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKKworCWRyaXZlLT51c2FnZS0tOworCisJaWRlX3RhcGVfcHV0KHRhcGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRldGFwZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBpbm9kZS0+aV9iZGV2OworCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9nKGJkZXYtPmJkX2Rpc2spOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOworCWludCBlcnIgPSBnZW5lcmljX2lkZV9pb2N0bChkcml2ZSwgZmlsZSwgYmRldiwgY21kLCBhcmcpOworCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJZXJyID0gaWRldGFwZV9ibGtkZXZfaW9jdGwoZHJpdmUsIGNtZCwgYXJnKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGlkZXRhcGVfYmxvY2tfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpZGV0YXBlX29wZW4sCisJLnJlbGVhc2UJPSBpZGV0YXBlX3JlbGVhc2UsCisJLmlvY3RsCQk9IGlkZXRhcGVfaW9jdGwsCit9OworCitzdGF0aWMgaW50IGlkZXRhcGVfYXR0YWNoIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRldGFwZV90YXBlX3QgKnRhcGU7CisJc3RydWN0IGdlbmRpc2sgKmc7CisJaW50IG1pbm9yOworCisJaWYgKCFzdHJzdHIoImlkZS10YXBlIiwgZHJpdmUtPmRyaXZlcl9yZXEpKQorCQlnb3RvIGZhaWxlZDsKKwlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQlnb3RvIGZhaWxlZDsKKwlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV90YXBlKQorCQlnb3RvIGZhaWxlZDsKKwlpZiAoIWlkZXRhcGVfaWRlbnRpZnlfZGV2aWNlIChkcml2ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIGlkZS10YXBlXG4iLCBkcml2ZS0+bmFtZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAoZHJpdmUtPnNjc2kpIHsKKwkJcHJpbnRrKCJpZGUtdGFwZTogcGFzc2luZyBkcml2ZSAlcyB0byBpZGUtc2NzaSBlbXVsYXRpb24uXG4iLCBkcml2ZS0+bmFtZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAoc3Ryc3RyKGRyaXZlLT5pZC0+bW9kZWwsICJPblN0cmVhbSBESS0iKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUtdGFwZTogVXNlIGRyaXZlICVzIHdpdGggaWRlLXNjc2kgZW11bGF0aW9uIGFuZCBvc3N0LlxuIiwgZHJpdmUtPm5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUtdGFwZTogT25TdHJlYW0gc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgc29vbiBmcm9tIGlkZS10YXBlIVxuIik7CisJfQorCXRhcGUgPSAoaWRldGFwZV90YXBlX3QgKikga21hbGxvYyAoc2l6ZW9mIChpZGV0YXBlX3RhcGVfdCksIEdGUF9LRVJORUwpOworCWlmICh0YXBlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IENhbid0IGFsbG9jYXRlIGEgdGFwZSBzdHJ1Y3R1cmVcbiIsIGRyaXZlLT5uYW1lKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZyA9IGFsbG9jX2Rpc2soMSA8PCBQQVJUTl9CSVRTKTsKKwlpZiAoIWcpCisJCWdvdG8gb3V0X2ZyZWVfdGFwZTsKKworCWlkZV9pbml0X2Rpc2soZywgZHJpdmUpOworCisJaWYgKGlkZV9yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsICZpZGV0YXBlX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IEZhaWxlZCB0byByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggaWRlLmNcbiIsIGRyaXZlLT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X2Rpc2s7CisJfQorCisJbWVtc2V0KHRhcGUsIDAsIHNpemVvZigqdGFwZSkpOworCisJa3JlZl9pbml0KCZ0YXBlLT5rcmVmKTsKKworCXRhcGUtPmRyaXZlID0gZHJpdmU7CisJdGFwZS0+ZHJpdmVyID0gJmlkZXRhcGVfZHJpdmVyOworCXRhcGUtPmRpc2sgPSBnOworCisJZy0+cHJpdmF0ZV9kYXRhID0gJnRhcGUtPmRyaXZlcjsKKworCWRyaXZlLT5kcml2ZXJfZGF0YSA9IHRhcGU7CisKKwlkb3duKCZpZGV0YXBlX3JlZl9zZW0pOworCWZvciAobWlub3IgPSAwOyBpZGV0YXBlX2RldnNbbWlub3JdOyBtaW5vcisrKQorCQk7CisJaWRldGFwZV9kZXZzW21pbm9yXSA9IHRhcGU7CisJdXAoJmlkZXRhcGVfcmVmX3NlbSk7CisKKwlpZGV0YXBlX3NldHVwKGRyaXZlLCB0YXBlLCBtaW5vcik7CisKKwlkZXZmc19ta19jZGV2KE1LREVWKEhXSUYoZHJpdmUpLT5tYWpvciwgbWlub3IpLAorCQkJU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJIiVzL210IiwgZHJpdmUtPmRldmZzX25hbWUpOworCWRldmZzX21rX2NkZXYoTUtERVYoSFdJRihkcml2ZSktPm1ham9yLCBtaW5vciArIDEyOCksCisJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkiJXMvbXRuIiwgZHJpdmUtPmRldmZzX25hbWUpOworCisJZy0+bnVtYmVyID0gZGV2ZnNfcmVnaXN0ZXJfdGFwZShkcml2ZS0+ZGV2ZnNfbmFtZSk7CisJZy0+Zm9wcyA9ICZpZGV0YXBlX2Jsb2NrX29wczsKKwlpZGVfcmVnaXN0ZXJfcmVnaW9uKGcpOworCisJcmV0dXJuIDA7CitvdXRfcHV0X2Rpc2s6CisJcHV0X2Rpc2soZyk7CitvdXRfZnJlZV90YXBlOgorCWtmcmVlKHRhcGUpOworZmFpbGVkOgorCXJldHVybiAxOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFUQVBJIFN0cmVhbWluZyBUQVBFIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaWRldGFwZV9leGl0ICh2b2lkKQoreworCWlkZV91bnJlZ2lzdGVyX2RyaXZlcigmaWRldGFwZV9kcml2ZXIpOworCXVucmVnaXN0ZXJfY2hyZGV2KElERVRBUEVfTUFKT1IsICJodCIpOworfQorCisvKgorICoJaWRldGFwZV9pbml0IHdpbGwgcmVnaXN0ZXIgdGhlIGRyaXZlciBmb3IgZWFjaCB0YXBlLgorICovCitzdGF0aWMgaW50IGlkZXRhcGVfaW5pdCAodm9pZCkKK3sKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KElERVRBUEVfTUFKT1IsICJodCIsICZpZGV0YXBlX2ZvcHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IEZhaWxlZCB0byByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlkZV9yZWdpc3Rlcl9kcml2ZXIoJmlkZXRhcGVfZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoaWRldGFwZV9pbml0KTsKK21vZHVsZV9leGl0KGlkZXRhcGVfZXhpdCk7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihJREVUQVBFX01BSk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0ZjYyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMJVmVyc2lvbiAwLjM4CU1hcmNoIDA1LCAyMDAzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAyCU1pY2hhZWwgQ29ybndlbGwgPGNvcm53ZWxsQGFjbS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMglLbGF1cyBTbW9saW4KKyAqCQkJCQlJQk0gU3RvcmFnZSBUZWNobm9sb2d5IERpdmlzaW9uCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQJQmFydGxvbWllaiBab2xuaWVya2lld2ljegorICoKKyAqICBUaGUgYmlnIHRoZSBiYWQgYW5kIHRoZSB1Z2x5LgorICoKKyAqICBQcm9ibGVtcyB0byBiZSBmaXhlZCBiZWNhdXNlIG9mIEJIIGludGVyZmFjZSBvciB0aGUgbGFjayB0aGVyZWZvcmUuCisgKgorICogIEZpbGwgbWUgaW4gc3R1cGlkICEhIQorICoKKyAqICBIT1NUOgorICoJR2VuZXJhbCByZWZlcnMgdG8gdGhlIENvbnRyb2xsZXIgYW5kIERyaXZlciAicGFpciIuCisgKiAgREFUQSBIQU5ETEVSOgorICoJVW5kZXIgdGhlIGNvbnRleHQgb2YgTGludXggaXQgZ2VuZXJhbGx5IHJlZmVycyB0byBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCUhvd2V2ZXIsIGl0IGNvcnJlY3RseSBkZXNjcmliZXMgdGhlICdIT1NUJworICogIERBVEEgQkxPQ0s6CisgKglUaGUgYW1vdW50IG9mIGRhdGEgbmVlZGVkIHRvIGJlIHRyYW5zZmVyZWQgYXMgcHJlZGVmaW5lZCBpbiB0aGUKKyAqCXNldHVwIG9mIHRoZSBkZXZpY2UuCisgKiAgU1RPUkFHRSBBVE9NSUM6CisgKglUaGUgJ0RBVEEgQkxPQ0snIGFzc29jaWF0ZWQgdG8gdGhlICdEQVRBIEhBTkRMRVInLCBhbmQgY2FuIGJlIGFzCisgKglzbWFsbCBhcyBhIHNpbmdsZSBzZWN0b3Igb3IgYXMgbGFyZ2UgYXMgdGhlIGVudGlyZSBjb21tYW5kIGJsb2NrCisgKglyZXF1ZXN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgREVCVUdfVEFTS0ZJTEUJMAkvKiB1bnNldCB3aGVuIGZpeGVkICovCisKK3N0YXRpYyB2b2lkIGF0YV9ic3dhcF9kYXRhICh2b2lkICpidWZmZXIsIGludCB3Y291bnQpCit7CisJdTE2ICpwID0gYnVmZmVyOworCisJd2hpbGUgKHdjb3VudC0tKSB7CisJCSpwID0gKnAgPDwgOCB8ICpwID4+IDg7IHArKzsKKwkJKnAgPSAqcCA8PCA4IHwgKnAgPj4gODsgcCsrOworCX0KK30KKworc3RhdGljIHZvaWQgdGFza2ZpbGVfaW5wdXRfZGF0YShpZGVfZHJpdmVfdCAqZHJpdmUsIHZvaWQgKmJ1ZmZlciwgdTMyIHdjb3VudCkKK3sKKwlIV0lGKGRyaXZlKS0+YXRhX2lucHV0X2RhdGEoZHJpdmUsIGJ1ZmZlciwgd2NvdW50KTsKKwlpZiAoZHJpdmUtPmJzd2FwKQorCQlhdGFfYnN3YXBfZGF0YShidWZmZXIsIHdjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2tmaWxlX291dHB1dF9kYXRhKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqYnVmZmVyLCB1MzIgd2NvdW50KQoreworCWlmIChkcml2ZS0+YnN3YXApIHsKKwkJYXRhX2Jzd2FwX2RhdGEoYnVmZmVyLCB3Y291bnQpOworCQlIV0lGKGRyaXZlKS0+YXRhX291dHB1dF9kYXRhKGRyaXZlLCBidWZmZXIsIHdjb3VudCk7CisJCWF0YV9ic3dhcF9kYXRhKGJ1ZmZlciwgd2NvdW50KTsKKwl9IGVsc2UgeworCQlIV0lGKGRyaXZlKS0+YXRhX291dHB1dF9kYXRhKGRyaXZlLCBidWZmZXIsIHdjb3VudCk7CisJfQorfQorCitpbnQgdGFza2ZpbGVfbGliX2dldF9pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCAqYnVmKQoreworCWlkZV90YXNrX3QgYXJnczsKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJYXJncy50ZlJlZ2lzdGVyW0lERV9OU0VDVE9SX09GRlNFVF0JPSAweDAxOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCWFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdCT0gV0lOX0lERU5USUZZOworCWVsc2UKKwkJYXJncy50ZlJlZ2lzdGVyW0lERV9DT01NQU5EX09GRlNFVF0JPSBXSU5fUElERU5USUZZOworCWFyZ3MuY29tbWFuZF90eXBlID0gSURFX0RSSVZFX1RBU0tfSU47CisJYXJncy5kYXRhX3BoYXNlICAgPSBUQVNLRklMRV9JTjsKKwlhcmdzLmhhbmRsZXIJICA9ICZ0YXNrX2luX2ludHI7CisJcmV0dXJuIGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBidWYpOworfQorCitpZGVfc3RhcnRzdG9wX3QgZG9fcndfdGFza2ZpbGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX3Rhc2tfdCAqdGFzaykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdGFza19zdHJ1Y3RfdCAqdGFza2ZpbGUJPSAodGFza19zdHJ1Y3RfdCAqKSB0YXNrLT50ZlJlZ2lzdGVyOworCWhvYl9zdHJ1Y3RfdCAqaG9iZmlsZQk9IChob2Jfc3RydWN0X3QgKikgdGFzay0+aG9iUmVnaXN0ZXI7CisJdTggSElISQkJCT0gKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpID8gMHhFMCA6IDB4RUY7CisKKwkvKiBBTEwgQ29tbWFuZCBCbG9jayBFeGVjdXRpb25zIFNIQUxMIGNsZWFyIG5JRU4sIHVubGVzcyBvdGhlcndpc2UgKi8KKwlpZiAoSURFX0NPTlRST0xfUkVHKSB7CisJCS8qIGNsZWFyIG5JRU4gKi8KKwkJaHdpZi0+T1VUQihkcml2ZS0+Y3RsLCBJREVfQ09OVFJPTF9SRUcpOworCX0KKwlTRUxFQ1RfTUFTSyhkcml2ZSwgMCk7CisKKwlpZiAoZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgeworCQlod2lmLT5PVVRCKGhvYmZpbGUtPmZlYXR1cmUsIElERV9GRUFUVVJFX1JFRyk7CisJCWh3aWYtPk9VVEIoaG9iZmlsZS0+c2VjdG9yX2NvdW50LCBJREVfTlNFQ1RPUl9SRUcpOworCQlod2lmLT5PVVRCKGhvYmZpbGUtPnNlY3Rvcl9udW1iZXIsIElERV9TRUNUT1JfUkVHKTsKKwkJaHdpZi0+T1VUQihob2JmaWxlLT5sb3dfY3lsaW5kZXIsIElERV9MQ1lMX1JFRyk7CisJCWh3aWYtPk9VVEIoaG9iZmlsZS0+aGlnaF9jeWxpbmRlciwgSURFX0hDWUxfUkVHKTsKKwl9CisKKwlod2lmLT5PVVRCKHRhc2tmaWxlLT5mZWF0dXJlLCBJREVfRkVBVFVSRV9SRUcpOworCWh3aWYtPk9VVEIodGFza2ZpbGUtPnNlY3Rvcl9jb3VudCwgSURFX05TRUNUT1JfUkVHKTsKKwlod2lmLT5PVVRCKHRhc2tmaWxlLT5zZWN0b3JfbnVtYmVyLCBJREVfU0VDVE9SX1JFRyk7CisJaHdpZi0+T1VUQih0YXNrZmlsZS0+bG93X2N5bGluZGVyLCBJREVfTENZTF9SRUcpOworCWh3aWYtPk9VVEIodGFza2ZpbGUtPmhpZ2hfY3lsaW5kZXIsIElERV9IQ1lMX1JFRyk7CisKKwlod2lmLT5PVVRCKCh0YXNrZmlsZS0+ZGV2aWNlX2hlYWQgJiBISUhJKSB8IGRyaXZlLT5zZWxlY3QuYWxsLCBJREVfU0VMRUNUX1JFRyk7CisKKwlpZiAodGFzay0+aGFuZGxlciAhPSBOVUxMKSB7CisJCWlmICh0YXNrLT5wcmVoYW5kbGVyICE9IE5VTEwpIHsKKwkJCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCB0YXNrZmlsZS0+Y29tbWFuZCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJCW5kZWxheSg0MDApOwkvKiBGSVhNRSAqLworCQkJcmV0dXJuIHRhc2stPnByZWhhbmRsZXIoZHJpdmUsIHRhc2stPnJxKTsKKwkJfQorCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCB0YXNrZmlsZS0+Y29tbWFuZCwgdGFzay0+aGFuZGxlciwgV0FJVF9XT1JTVENBU0UsIE5VTEwpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfQorCisJaWYgKCFkcml2ZS0+dXNpbmdfZG1hKQorCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisKKwlzd2l0Y2ggKHRhc2tmaWxlLT5jb21tYW5kKSB7CisJCWNhc2UgV0lOX1dSSVRFRE1BX09OQ0U6CisJCWNhc2UgV0lOX1dSSVRFRE1BOgorCQljYXNlIFdJTl9XUklURURNQV9FWFQ6CisJCWNhc2UgV0lOX1JFQURETUFfT05DRToKKwkJY2FzZSBXSU5fUkVBRERNQToKKwkJY2FzZSBXSU5fUkVBRERNQV9FWFQ6CisJCWNhc2UgV0lOX0lERU5USUZZX0RNQToKKwkJCWlmICghaHdpZi0+ZG1hX3NldHVwKGRyaXZlKSkgeworCQkJCWh3aWYtPmRtYV9leGVjX2NtZChkcml2ZSwgdGFza2ZpbGUtPmNvbW1hbmQpOworCQkJCWh3aWYtPmRtYV9zdGFydChkcml2ZSk7CisJCQkJcmV0dXJuIGlkZV9zdGFydGVkOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodGFzay0+aGFuZGxlciA9PSBOVUxMKQorCQkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fcndfdGFza2ZpbGUpOworCisvKgorICogc2V0X211bHRtb2RlX2ludHIoKSBpcyBpbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgYSBXSU5fU0VUTVVMVCBjbWQuCisgKi8KK2lkZV9zdGFydHN0b3BfdCBzZXRfbXVsdG1vZGVfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1OCBzdGF0OworCisJaWYgKE9LX1NUQVQoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyksUkVBRFlfU1RBVCxCQURfU1RBVCkpIHsKKwkJZHJpdmUtPm11bHRfY291bnQgPSBkcml2ZS0+bXVsdF9yZXE7CisJfSBlbHNlIHsKKwkJZHJpdmUtPm11bHRfcmVxID0gZHJpdmUtPm11bHRfY291bnQgPSAwOworCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlID0gMTsKKwkJKHZvaWQpIGlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgInNldF9tdWx0bW9kZSIsIHN0YXQpOworCX0KKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKKy8qCisgKiBzZXRfZ2VvbWV0cnlfaW50cigpIGlzIGludm9rZWQgb24gY29tcGxldGlvbiBvZiBhIFdJTl9TUEVDSUZZIGNtZC4KKyAqLworaWRlX3N0YXJ0c3RvcF90IHNldF9nZW9tZXRyeV9pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWludCByZXRyaWVzID0gNTsKKwl1OCBzdGF0OworCisJd2hpbGUgKCgoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRykpICYgQlVTWV9TVEFUKSAmJiByZXRyaWVzLS0pCisJCXVkZWxheSgxMCk7CisKKwlpZiAoT0tfU1RBVChzdGF0LCBSRUFEWV9TVEFULCBCQURfU1RBVCkpCisJCXJldHVybiBpZGVfc3RvcHBlZDsKKworCWlmIChzdGF0ICYgKEVSUl9TVEFUfERSUV9TVEFUKSkKKwkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInNldF9nZW9tZXRyeV9pbnRyIiwgc3RhdCk7CisKKwlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKKwkJQlVHKCk7CisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmc2V0X2dlb21ldHJ5X2ludHIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKKy8qCisgKiByZWNhbF9pbnRyKCkgaXMgaW52b2tlZCBvbiBjb21wbGV0aW9uIG9mIGEgV0lOX1JFU1RPUkUgKHJlY2FsaWJyYXRlKSBjbWQuCisgKi8KK2lkZV9zdGFydHN0b3BfdCByZWNhbF9pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXU4IHN0YXQ7CisKKwlpZiAoIU9LX1NUQVQoc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyksIFJFQURZX1NUQVQsIEJBRF9TVEFUKSkKKwkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInJlY2FsX2ludHIiLCBzdGF0KTsKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKKy8qCisgKiBIYW5kbGVyIGZvciBjb21tYW5kcyB3aXRob3V0IGEgZGF0YSBwaGFzZQorICovCitpZGVfc3RhcnRzdG9wX3QgdGFza19ub19kYXRhX2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfdGFza190ICphcmdzCT0gSFdHUk9VUChkcml2ZSktPnJxLT5zcGVjaWFsOworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBzdGF0OworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghT0tfU1RBVChzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKSxSRUFEWV9TVEFULEJBRF9TVEFUKSkgeworCQlyZXR1cm4gaWRlX2Vycm9yKGRyaXZlLCAidGFza19ub19kYXRhX2ludHIiLCBzdGF0KTsKKwkJLyogY2FsbHMgaWRlX2VuZF9kcml2ZV9jbWQgKi8KKwl9CisJaWYgKGFyZ3MpCisJCWlkZV9lbmRfZHJpdmVfY21kKGRyaXZlLCBzdGF0LCBod2lmLT5JTkIoSURFX0VSUk9SX1JFRykpOworCisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitFWFBPUlRfU1lNQk9MKHRhc2tfbm9fZGF0YV9pbnRyKTsKKworc3RhdGljIHU4IHdhaXRfZHJpdmVfbm90X2J1c3koaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpbnQgcmV0cmllcyA9IDEwMDsKKwl1OCBzdGF0OworCisJLyoKKwkgKiBMYXN0IHNlY3RvciB3YXMgdHJhbnNmZXJlZCwgd2FpdCB1bnRpbCBkcml2ZSBpcyByZWFkeS4KKwkgKiBUaGlzIGNhbiB0YWtlIHVwIHRvIDEwIHVzZWMsIGJ1dCB3ZSB3aWxsIHdhaXQgbWF4IDEgbXMKKwkgKiAoZHJpdmVfY21kX2ludHIoKSB3YWl0cyB0aGF0IGxvbmcpLgorCSAqLworCXdoaWxlICgoKHN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpKSAmIEJVU1lfU1RBVCkgJiYgcmV0cmllcy0tKQorCQl1ZGVsYXkoMTApOworCisJaWYgKCFyZXRyaWVzKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZSBzdGlsbCBCVVNZIVxuIiwgZHJpdmUtPm5hbWUpOworCisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9waW9fc2VjdG9yKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IHdyaXRlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaHdpZi0+c2dfdGFibGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1OCAqYnVmOworCisJcGFnZSA9IHNnW2h3aWYtPmN1cnNnXS5wYWdlOworCW9mZnNldCA9IHNnW2h3aWYtPmN1cnNnXS5vZmZzZXQgKyBod2lmLT5jdXJzZ19vZnMgKiBTRUNUT1JfU0laRTsKKworCS8qIGdldCB0aGUgY3VycmVudCBwYWdlIGFuZCBvZmZzZXQgKi8KKwlwYWdlID0gbnRoX3BhZ2UocGFnZSwgKG9mZnNldCA+PiBQQUdFX1NISUZUKSk7CisJb2Zmc2V0ICU9IFBBR0VfU0laRTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2VuZGlmCisJYnVmID0ga21hcF9hdG9taWMocGFnZSwgS01fQklPX1NSQ19JUlEpICsgb2Zmc2V0OworCisJaHdpZi0+bmxlZnQtLTsKKwlod2lmLT5jdXJzZ19vZnMrKzsKKworCWlmICgoaHdpZi0+Y3Vyc2dfb2ZzICogU0VDVE9SX1NJWkUpID09IHNnW2h3aWYtPmN1cnNnXS5sZW5ndGgpIHsKKwkJaHdpZi0+Y3Vyc2crKzsKKwkJaHdpZi0+Y3Vyc2dfb2ZzID0gMDsKKwl9CisKKwkvKiBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgKi8KKwlpZiAod3JpdGUpCisJCXRhc2tmaWxlX291dHB1dF9kYXRhKGRyaXZlLCBidWYsIFNFQ1RPUl9XT1JEUyk7CisJZWxzZQorCQl0YXNrZmlsZV9pbnB1dF9kYXRhKGRyaXZlLCBidWYsIFNFQ1RPUl9XT1JEUyk7CisKKwlrdW5tYXBfYXRvbWljKGJ1ZiwgS01fQklPX1NSQ19JUlEpOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGlkZV9waW9fbXVsdGkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgaW50IG5zZWN0OworCisJbnNlY3QgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGRyaXZlLT5od2lmLT5ubGVmdCwgZHJpdmUtPm11bHRfY291bnQpOworCXdoaWxlIChuc2VjdC0tKQorCQlpZGVfcGlvX3NlY3Rvcihkcml2ZSwgd3JpdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Bpb19kYXRhYmxvY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgd3JpdGUpCit7CisJaWYgKHJxLT5iaW8pCS8qIGZzIHJlcXVlc3QgKi8KKwkJcnEtPmVycm9ycyA9IDA7CisKKwlzd2l0Y2ggKGRyaXZlLT5od2lmLT5kYXRhX3BoYXNlKSB7CisJY2FzZSBUQVNLRklMRV9NVUxUSV9JTjoKKwljYXNlIFRBU0tGSUxFX01VTFRJX09VVDoKKwkJaWRlX3Bpb19tdWx0aShkcml2ZSwgd3JpdGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZGVfcGlvX3NlY3Rvcihkcml2ZSwgd3JpdGUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgdGFza19lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJCQkgIGNvbnN0IGNoYXIgKnMsIHU4IHN0YXQpCit7CisJaWYgKHJxLT5iaW8pIHsKKwkJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCQlpbnQgc2VjdG9ycyA9IGh3aWYtPm5zZWN0IC0gaHdpZi0+bmxlZnQ7CisKKwkJc3dpdGNoIChod2lmLT5kYXRhX3BoYXNlKSB7CisJCWNhc2UgVEFTS0ZJTEVfSU46CisJCQlpZiAoaHdpZi0+bmxlZnQpCisJCQkJYnJlYWs7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBUQVNLRklMRV9PVVQ6CisJCQlzZWN0b3JzLS07CisJCQlicmVhazsKKwkJY2FzZSBUQVNLRklMRV9NVUxUSV9JTjoKKwkJCWlmIChod2lmLT5ubGVmdCkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFRBU0tGSUxFX01VTFRJX09VVDoKKwkJCXNlY3RvcnMgLT0gZHJpdmUtPm11bHRfY291bnQ7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzZWN0b3JzID4gMCkgeworCQkJaWRlX2RyaXZlcl90ICpkcnY7CisKKwkJCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCQlkcnYtPmVuZF9yZXF1ZXN0KGRyaXZlLCAxLCBzZWN0b3JzKTsKKwkJfQorCX0KKwlyZXR1cm4gaWRlX2Vycm9yKGRyaXZlLCBzLCBzdGF0KTsKK30KKworc3RhdGljIHZvaWQgdGFza19lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCkKK3sKKwlpZiAocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0tGSUxFKSB7CisJCWlkZV90YXNrX3QgKnRhc2sgPSBycS0+c3BlY2lhbDsKKworCQlpZiAodGFzay0+dGZfb3V0X2ZsYWdzLmFsbCkgeworCQkJdTggZXJyID0gZHJpdmUtPmh3aWYtPklOQihJREVfRVJST1JfUkVHKTsKKwkJCWlkZV9lbmRfZHJpdmVfY21kKGRyaXZlLCBzdGF0LCBlcnIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCBycS0+aGFyZF9ucl9zZWN0b3JzKTsKK30KKworLyoKKyAqIEhhbmRsZXIgZm9yIGNvbW1hbmQgd2l0aCBQSU8gZGF0YS1pbiBwaGFzZSAoUmVhZC9SZWFkIE11bHRpcGxlKS4KKyAqLworaWRlX3N0YXJ0c3RvcF90IHRhc2tfaW5faW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdTggc3RhdCA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyk7CisKKwkvKiBuZXcgd2F5IGZvciBkZWFsaW5nIHdpdGggcHJlbWF0dXJlIHNoYXJlZCBQQ0kgaW50ZXJydXB0cyAqLworCWlmICghT0tfU1RBVChzdGF0LCBEQVRBX1JFQURZLCBCQURfUl9TVEFUKSkgeworCQlpZiAoc3RhdCAmIChFUlJfU1RBVCB8IERSUV9TVEFUKSkKKwkJCXJldHVybiB0YXNrX2Vycm9yKGRyaXZlLCBycSwgX19GVU5DVElPTl9fLCBzdGF0KTsKKwkJLyogTm8gZGF0YSB5ZXQsIHNvIHdhaXQgZm9yIGFub3RoZXIgSVJRLiAqLworCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZ0YXNrX2luX2ludHIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKwkJcmV0dXJuIGlkZV9zdGFydGVkOworCX0KKworCWlkZV9waW9fZGF0YWJsb2NrKGRyaXZlLCBycSwgMCk7CisKKwkvKiBJZiBpdCB3YXMgdGhlIGxhc3QgZGF0YWJsb2NrIGNoZWNrIHN0YXR1cyBhbmQgZmluaXNoIHRyYW5zZmVyLiAqLworCWlmICghaHdpZi0+bmxlZnQpIHsKKwkJc3RhdCA9IHdhaXRfZHJpdmVfbm90X2J1c3koZHJpdmUpOworCQlpZiAoIU9LX1NUQVQoc3RhdCwgMCwgQkFEX1JfU1RBVCkpCisJCQlyZXR1cm4gdGFza19lcnJvcihkcml2ZSwgcnEsIF9fRlVOQ1RJT05fXywgc3RhdCk7CisJCXRhc2tfZW5kX3JlcXVlc3QoZHJpdmUsIHJxLCBzdGF0KTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKworCS8qIFN0aWxsIGRhdGEgbGVmdCB0byB0cmFuc2Zlci4gKi8KKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZ0YXNrX2luX2ludHIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKworCXJldHVybiBpZGVfc3RhcnRlZDsKK30KK0VYUE9SVF9TWU1CT0wodGFza19pbl9pbnRyKTsKKworLyoKKyAqIEhhbmRsZXIgZm9yIGNvbW1hbmQgd2l0aCBQSU8gZGF0YS1vdXQgcGhhc2UgKFdyaXRlL1dyaXRlIE11bHRpcGxlKS4KKyAqLworc3RhdGljIGlkZV9zdGFydHN0b3BfdCB0YXNrX291dF9pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl1OCBzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKworCWlmICghT0tfU1RBVChzdGF0LCBEUklWRV9SRUFEWSwgZHJpdmUtPmJhZF93c3RhdCkpCisJCXJldHVybiB0YXNrX2Vycm9yKGRyaXZlLCBycSwgX19GVU5DVElPTl9fLCBzdGF0KTsKKworCS8qIERlYWwgd2l0aCB1bmV4cGVjdGVkIEFUQSBkYXRhIHBoYXNlLiAqLworCWlmICgoKHN0YXQgJiBEUlFfU1RBVCkgPT0gMCkgXiAhaHdpZi0+bmxlZnQpCisJCXJldHVybiB0YXNrX2Vycm9yKGRyaXZlLCBycSwgX19GVU5DVElPTl9fLCBzdGF0KTsKKworCWlmICghaHdpZi0+bmxlZnQpIHsKKwkJdGFza19lbmRfcmVxdWVzdChkcml2ZSwgcnEsIHN0YXQpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJfQorCisJLyogU3RpbGwgZGF0YSBsZWZ0IHRvIHRyYW5zZmVyLiAqLworCWlkZV9waW9fZGF0YWJsb2NrKGRyaXZlLCBycSwgMSk7CisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmdGFza19vdXRfaW50ciwgV0FJVF9XT1JTVENBU0UsIE5VTEwpOworCisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCitpZGVfc3RhcnRzdG9wX3QgcHJlX3Rhc2tfb3V0X2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3A7CisKKwlpZiAoaWRlX3dhaXRfc3RhdCgmc3RhcnRzdG9wLCBkcml2ZSwgREFUQV9SRUFEWSwKKwkJCSAgZHJpdmUtPmJhZF93c3RhdCwgV0FJVF9EUlEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIERSUSBhZnRlciBpc3N1aW5nICVzV1JJVEUlc1xuIiwKKwkJCQlkcml2ZS0+bmFtZSwKKwkJCQlkcml2ZS0+aHdpZi0+ZGF0YV9waGFzZSA/ICJNVUxUIiA6ICIiLAorCQkJCWRyaXZlLT5hZGRyZXNzaW5nID8gIl9FWFQiIDogIiIpOworCQlyZXR1cm4gc3RhcnRzdG9wOworCX0KKworCWlmICghZHJpdmUtPnVubWFzaykKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnRhc2tfb3V0X2ludHIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKwlpZGVfcGlvX2RhdGFibG9jayhkcml2ZSwgcnEsIDEpOworCisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorRVhQT1JUX1NZTUJPTChwcmVfdGFza19vdXRfaW50cik7CisKK3N0YXRpYyBpbnQgaWRlX2RpYWdfdGFza2ZpbGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICphcmdzLCB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgcmVxdWVzdCBycTsKKworCW1lbXNldCgmcnEsIDAsIHNpemVvZihycSkpOworCXJxLmZsYWdzID0gUkVRX0RSSVZFX1RBU0tGSUxFOworCXJxLmJ1ZmZlciA9IGJ1ZjsKKworCS8qCisJICogKGtzKSBXZSB0cmFuc2ZlciBjdXJyZW50bHkgb25seSB3aG9sZSBzZWN0b3JzLgorCSAqIFRoaXMgaXMgc3VmZmllbnQgZm9yIG5vdy4gIEJ1dCwgaXQgd291bGQgYmUgZ3JlYXQsCisJICogaWYgd2Ugd291bGQgZmluZCBhIHNvbHV0aW9uIHRvIHRyYW5zZmVyIGFueSBzaXplLgorCSAqIFRvIHN1cHBvcnQgc3BlY2lhbCBjb21tYW5kcyBsaWtlIFJFQUQgTE9ORy4KKwkgKi8KKwlpZiAoYXJncy0+Y29tbWFuZF90eXBlICE9IElERV9EUklWRV9UQVNLX05PX0RBVEEpIHsKKwkJaWYgKGRhdGFfc2l6ZSA9PSAwKQorCQkJcnEubnJfc2VjdG9ycyA9IChhcmdzLT5ob2JSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdIDw8IDgpIHwgYXJncy0+dGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdOworCQllbHNlCisJCQlycS5ucl9zZWN0b3JzID0gZGF0YV9zaXplIC8gU0VDVE9SX1NJWkU7CisKKwkJaWYgKCFycS5ucl9zZWN0b3JzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbi9vdXQgY29tbWFuZCB3aXRob3V0IGRhdGFcbiIsCisJCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcnEuaGFyZF9ucl9zZWN0b3JzID0gcnEubnJfc2VjdG9yczsKKwkJcnEuaGFyZF9jdXJfc2VjdG9ycyA9IHJxLmN1cnJlbnRfbnJfc2VjdG9ycyA9IHJxLm5yX3NlY3RvcnM7CisKKwkJaWYgKGFyZ3MtPmNvbW1hbmRfdHlwZSA9PSBJREVfRFJJVkVfVEFTS19SQVdfV1JJVEUpCisJCQlycS5mbGFncyB8PSBSRVFfUlc7CisJfQorCisJcnEuc3BlY2lhbCA9IGFyZ3M7CisJcmV0dXJuIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsICZycSwgaWRlX3dhaXQpOworfQorCitpbnQgaWRlX3Jhd190YXNrZmlsZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICphcmdzLCB1OCAqYnVmKQoreworCXJldHVybiBpZGVfZGlhZ190YXNrZmlsZShkcml2ZSwgYXJncywgMCwgYnVmKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfcmF3X3Rhc2tmaWxlKTsKKworaW50IGlkZV90YXNrZmlsZV9pb2N0bCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZGVfdGFza19yZXF1ZXN0X3QJKnJlcV90YXNrOworCWlkZV90YXNrX3QJCWFyZ3M7CisJdTggKm91dGJ1ZgkJPSBOVUxMOworCXU4ICppbmJ1ZgkJPSBOVUxMOworCXRhc2tfaW9yZWdfdCAqYXJnc3B0cgk9IGFyZ3MudGZSZWdpc3RlcjsKKwl0YXNrX2lvcmVnX3QgKmhvYnNwdHIJPSBhcmdzLmhvYlJlZ2lzdGVyOworCWludCBlcnIJCQk9IDA7CisJaW50IHRhc2tzaXplCQk9IHNpemVvZihzdHJ1Y3QgaWRlX3Rhc2tfcmVxdWVzdF9zKTsKKwlpbnQgdGFza2luCQk9IDA7CisJaW50IHRhc2tvdXQJCT0gMDsKKwl1OCBpb18zMmJpdAkJPSBkcml2ZS0+aW9fMzJiaXQ7CisJY2hhciBfX3VzZXIgKmJ1ZiA9IChjaGFyIF9fdXNlciAqKWFyZzsKKworLy8JcHJpbnRrKCJJREUgVGFza2ZpbGUgLi4uXG4iKTsKKworCXJlcV90YXNrID0ga21hbGxvYyh0YXNrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcV90YXNrID09IE5VTEwpIHJldHVybiAtRU5PTUVNOworCW1lbXNldChyZXFfdGFzaywgMCwgdGFza3NpemUpOworCWlmIChjb3B5X2Zyb21fdXNlcihyZXFfdGFzaywgYnVmLCB0YXNrc2l6ZSkpIHsKKwkJa2ZyZWUocmVxX3Rhc2spOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl0YXNrb3V0ID0gKGludCkgcmVxX3Rhc2stPm91dF9zaXplOworCXRhc2tpbiAgPSAoaW50KSByZXFfdGFzay0+aW5fc2l6ZTsKKworCWlmICh0YXNrb3V0KSB7CisJCWludCBvdXR0b3RhbCA9IHRhc2tzaXplOworCQlvdXRidWYgPSBrbWFsbG9jKHRhc2tvdXQsIEdGUF9LRVJORUwpOworCQlpZiAob3V0YnVmID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGFib3J0OworCQl9CisJCW1lbXNldChvdXRidWYsIDAsIHRhc2tvdXQpOworCQlpZiAoY29weV9mcm9tX3VzZXIob3V0YnVmLCBidWYgKyBvdXR0b3RhbCwgdGFza291dCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCisJaWYgKHRhc2tpbikgeworCQlpbnQgaW50b3RhbCA9IHRhc2tzaXplICsgdGFza291dDsKKwkJaW5idWYgPSBrbWFsbG9jKHRhc2tpbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChpbmJ1ZiA9PSBOVUxMKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBhYm9ydDsKKwkJfQorCQltZW1zZXQoaW5idWYsIDAsIHRhc2tpbik7CisJCWlmIChjb3B5X2Zyb21fdXNlcihpbmJ1ZiwgYnVmICsgaW50b3RhbCwgdGFza2luKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwl9CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJbWVtY3B5KGFyZ3NwdHIsIHJlcV90YXNrLT5pb19wb3J0cywgSERJT19EUklWRV9UQVNLX0hEUl9TSVpFKTsKKwltZW1jcHkoaG9ic3B0ciwgcmVxX3Rhc2stPmhvYl9wb3J0cywgSERJT19EUklWRV9IT0JfSERSX1NJWkUpOworCisJYXJncy50Zl9pbl9mbGFncyAgPSByZXFfdGFzay0+aW5fZmxhZ3M7CisJYXJncy50Zl9vdXRfZmxhZ3MgPSByZXFfdGFzay0+b3V0X2ZsYWdzOworCWFyZ3MuZGF0YV9waGFzZSAgID0gcmVxX3Rhc2stPmRhdGFfcGhhc2U7CisJYXJncy5jb21tYW5kX3R5cGUgPSByZXFfdGFzay0+cmVxX2NtZDsKKworCWRyaXZlLT5pb18zMmJpdCA9IDA7CisJc3dpdGNoKHJlcV90YXNrLT5kYXRhX3BoYXNlKSB7CisJCWNhc2UgVEFTS0ZJTEVfT1VUX0RNQVE6CisJCWNhc2UgVEFTS0ZJTEVfT1VUX0RNQToKKwkJCWVyciA9IGlkZV9kaWFnX3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgdGFza291dCwgb3V0YnVmKTsKKwkJCWJyZWFrOworCQljYXNlIFRBU0tGSUxFX0lOX0RNQVE6CisJCWNhc2UgVEFTS0ZJTEVfSU5fRE1BOgorCQkJZXJyID0gaWRlX2RpYWdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCB0YXNraW4sIGluYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIFRBU0tGSUxFX01VTFRJX09VVDoKKwkJCWlmICghZHJpdmUtPm11bHRfY291bnQpIHsKKwkJCQkvKiAoaHMpOiBnaXZlIHVwIGlmIG11bHRjb3VudCBpcyBub3Qgc2V0ICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgTXVsdGltb2RlIFdyaXRlICIgXAorCQkJCQkibXVsdGNvdW50IGlzIG5vdCBzZXRcbiIsCisJCQkJCWRyaXZlLT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIGFib3J0OworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgVEFTS0ZJTEVfT1VUOgorCQkJYXJncy5wcmVoYW5kbGVyID0gJnByZV90YXNrX291dF9pbnRyOworCQkJYXJncy5oYW5kbGVyID0gJnRhc2tfb3V0X2ludHI7CisJCQllcnIgPSBpZGVfZGlhZ190YXNrZmlsZShkcml2ZSwgJmFyZ3MsIHRhc2tvdXQsIG91dGJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBUQVNLRklMRV9NVUxUSV9JTjoKKwkJCWlmICghZHJpdmUtPm11bHRfY291bnQpIHsKKwkJCQkvKiAoaHMpOiBnaXZlIHVwIGlmIG11bHRjb3VudCBpcyBub3Qgc2V0ICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgTXVsdGltb2RlIFJlYWQgZmFpbHVyZSAiIFwKKwkJCQkJIm11bHRjb3VudCBpcyBub3Qgc2V0XG4iLAorCQkJCQlkcml2ZS0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJZ290byBhYm9ydDsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFRBU0tGSUxFX0lOOgorCQkJYXJncy5oYW5kbGVyID0gJnRhc2tfaW5faW50cjsKKwkJCWVyciA9IGlkZV9kaWFnX3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgdGFza2luLCBpbmJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBUQVNLRklMRV9OT19EQVRBOgorCQkJYXJncy5oYW5kbGVyID0gJnRhc2tfbm9fZGF0YV9pbnRyOworCQkJZXJyID0gaWRlX2RpYWdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCAwLCBOVUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gYWJvcnQ7CisJfQorCisJbWVtY3B5KHJlcV90YXNrLT5pb19wb3J0cywgJihhcmdzLnRmUmVnaXN0ZXIpLCBIRElPX0RSSVZFX1RBU0tfSERSX1NJWkUpOworCW1lbWNweShyZXFfdGFzay0+aG9iX3BvcnRzLCAmKGFyZ3MuaG9iUmVnaXN0ZXIpLCBIRElPX0RSSVZFX0hPQl9IRFJfU0laRSk7CisJcmVxX3Rhc2stPmluX2ZsYWdzICA9IGFyZ3MudGZfaW5fZmxhZ3M7CisJcmVxX3Rhc2stPm91dF9mbGFncyA9IGFyZ3MudGZfb3V0X2ZsYWdzOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJlcV90YXNrLCB0YXNrc2l6ZSkpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBhYm9ydDsKKwl9CisJaWYgKHRhc2tvdXQpIHsKKwkJaW50IG91dHRvdGFsID0gdGFza3NpemU7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgb3V0dG90YWwsIG91dGJ1ZiwgdGFza291dCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCWlmICh0YXNraW4pIHsKKwkJaW50IGludG90YWwgPSB0YXNrc2l6ZSArIHRhc2tvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgaW50b3RhbCwgaW5idWYsIHRhc2tpbikpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorYWJvcnQ6CisJa2ZyZWUocmVxX3Rhc2spOworCWlmIChvdXRidWYgIT0gTlVMTCkKKwkJa2ZyZWUob3V0YnVmKTsKKwlpZiAoaW5idWYgIT0gTlVMTCkKKwkJa2ZyZWUoaW5idWYpOworCisvLwlwcmludGsoIklERSBUYXNrZmlsZSBpb2N0bCBlbmRlZC4gcmMgPSAlaVxuIiwgZXJyKTsKKworCWRyaXZlLT5pb18zMmJpdCA9IGlvXzMyYml0OworCisJcmV0dXJuIGVycjsKK30KKworaW50IGlkZV93YWl0X2NtZCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQsIHU4IG5zZWN0LCB1OCBmZWF0dXJlLCB1OCBzZWN0b3JzLCB1OCAqYnVmKQoreworCXN0cnVjdCByZXF1ZXN0IHJxOworCXU4IGJ1ZmZlcls0XTsKKworCWlmICghYnVmKQorCQlidWYgPSBidWZmZXI7CisJbWVtc2V0KGJ1ZiwgMCwgNCArIFNFQ1RPUl9XT1JEUyAqIDQgKiBzZWN0b3JzKTsKKwlpZGVfaW5pdF9kcml2ZV9jbWQoJnJxKTsKKwlycS5idWZmZXIgPSBidWY7CisJKmJ1ZisrID0gY21kOworCSpidWYrKyA9IG5zZWN0OworCSpidWYrKyA9IGZlYXR1cmU7CisJKmJ1ZisrID0gc2VjdG9yczsKKwlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7Cit9CisKKy8qCisgKiBGSVhNRSA6IHRoaXMgbmVlZHMgdG8gbWFwIGludG8gYXQgdGFza2ZpbGUuIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICovCitpbnQgaWRlX2NtZF9pb2N0bCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyID0gMDsKKwl1OCBhcmdzWzRdLCAqYXJnYnVmID0gYXJnczsKKwl1OCB4ZmVyX3JhdGUgPSAwOworCWludCBhcmdzaXplID0gNDsKKwlpZGVfdGFza190IHRmYXJnczsKKworCWlmIChOVUxMID09ICh2b2lkICopIGFyZykgeworCQlzdHJ1Y3QgcmVxdWVzdCBycTsKKwkJaWRlX2luaXRfZHJpdmVfY21kKCZycSk7CisJCXJldHVybiBpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCAmcnEsIGlkZV93YWl0KTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXJncywgKHZvaWQgX191c2VyICopYXJnLCA0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfRkVBVFVSRV9PRkZTRVRdID0gYXJnc1syXTsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfTlNFQ1RPUl9PRkZTRVRdID0gYXJnc1szXTsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfU0VDVE9SX09GRlNFVF0gID0gYXJnc1sxXTsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfTENZTF9PRkZTRVRdICAgID0gMHgwMDsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfSENZTF9PRkZTRVRdICAgID0gMHgwMDsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfU0VMRUNUX09GRlNFVF0gID0gMHgwMDsKKwl0ZmFyZ3MudGZSZWdpc3RlcltJREVfQ09NTUFORF9PRkZTRVRdID0gYXJnc1swXTsKKworCWlmIChhcmdzWzNdKSB7CisJCWFyZ3NpemUgPSA0ICsgKFNFQ1RPUl9XT1JEUyAqIDQgKiBhcmdzWzNdKTsKKwkJYXJnYnVmID0ga21hbGxvYyhhcmdzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGFyZ2J1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShhcmdidWYsIGFyZ3MsIDQpOworCX0KKwlpZiAoc2V0X3RyYW5zZmVyKGRyaXZlLCAmdGZhcmdzKSkgeworCQl4ZmVyX3JhdGUgPSBhcmdzWzFdOworCQlpZiAoaWRlX2F0YTY2X2NoZWNrKGRyaXZlLCAmdGZhcmdzKSkKKwkJCWdvdG8gYWJvcnQ7CisJfQorCisJZXJyID0gaWRlX3dhaXRfY21kKGRyaXZlLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdidWYpOworCisJaWYgKCFlcnIgJiYgeGZlcl9yYXRlKSB7CisJCS8qIGFjdGl2ZS1yZXR1bmluZy1jYWxscyBmdXR1cmUgKi8KKwkJaWRlX3NldF94ZmVyX3JhdGUoZHJpdmUsIHhmZXJfcmF0ZSk7CisJCWlkZV9kcml2ZWlkX3VwZGF0ZShkcml2ZSk7CisJfQorYWJvcnQ6CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIGFyZ2J1ZiwgYXJnc2l6ZSkpCisJCWVyciA9IC1FRkFVTFQ7CisJaWYgKGFyZ3NpemUgPiA0KQorCQlrZnJlZShhcmdidWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWRlX3dhaXRfY21kX3Rhc2soaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCAqYnVmKQoreworCXN0cnVjdCByZXF1ZXN0IHJxOworCisJaWRlX2luaXRfZHJpdmVfY21kKCZycSk7CisJcnEuZmxhZ3MgPSBSRVFfRFJJVkVfVEFTSzsKKwlycS5idWZmZXIgPSBidWY7CisJcmV0dXJuIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsICZycSwgaWRlX3dhaXQpOworfQorCisvKgorICogRklYTUUgOiB0aGlzIG5lZWRzIHRvIG1hcCBpbnRvIGF0IHRhc2tmaWxlLiA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqLworaW50IGlkZV90YXNrX2lvY3RsIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBlcnIgPSAwOworCXU4IGFyZ3NbN10sICphcmdidWYgPSBhcmdzOworCWludCBhcmdzaXplID0gNzsKKworCWlmIChjb3B5X2Zyb21fdXNlcihhcmdzLCBwLCA3KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZXJyID0gaWRlX3dhaXRfY21kX3Rhc2soZHJpdmUsIGFyZ2J1Zik7CisJaWYgKGNvcHlfdG9fdXNlcihwLCBhcmdidWYsIGFyZ3NpemUpKQorCQllcnIgPSAtRUZBVUxUOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBOT1RJQ0U6IFRoaXMgaXMgYWRkaXRpb25zIGZyb20gSUJNIHRvIHByb3ZpZGUgYSBkaXNjcmV0ZSBpbnRlcmZhY2UsCisgKiBmb3Igc2VsZWN0aXZlIHRhc2tyZWdpc3RlciBhY2Nlc3Mgb3BlcmF0aW9ucy4gIE5pY2UgSk9CIEtsYXVzISEhCisgKiBHbGFkIHRvIGJlIGFibGUgdG8gd29yayBhbmQgY28tZGV2ZWxvcCB0aGlzIHdpdGggeW91IGFuZCBJQk0uCisgKi8KK2lkZV9zdGFydHN0b3BfdCBmbGFnZ2VkX3Rhc2tmaWxlIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV90YXNrX3QgKnRhc2spCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXRhc2tfc3RydWN0X3QgKnRhc2tmaWxlCT0gKHRhc2tfc3RydWN0X3QgKikgdGFzay0+dGZSZWdpc3RlcjsKKwlob2Jfc3RydWN0X3QgKmhvYmZpbGUJPSAoaG9iX3N0cnVjdF90ICopIHRhc2stPmhvYlJlZ2lzdGVyOworI2lmIERFQlVHX1RBU0tGSUxFCisJdTggc3RhdHVzOworI2VuZGlmCisKKwlpZiAodGFzay0+ZGF0YV9waGFzZSA9PSBUQVNLRklMRV9NVUxUSV9JTiB8fAorCSAgICB0YXNrLT5kYXRhX3BoYXNlID09IFRBU0tGSUxFX01VTFRJX09VVCkgeworCQlpZiAoIWRyaXZlLT5tdWx0X2NvdW50KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtdWx0aW1vZGUgbm90IHNldCFcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfQorCX0KKworCS8qCisJICogKGtzKSBDaGVjayB0YXNrZmlsZSBpbi9vdXQgZmxhZ3MuCisJICogSWYgc2V0LCB0aGVuIGV4ZWN1dGUgYXMgaXQgaXMgZGVmaW5lZC4KKwkgKiBJZiBub3Qgc2V0LCB0aGVuIGRlZmluZSBkZWZhdWx0IHNldHRpbmdzLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmU6CisJICoJd3JpdGUgYW5kIHJlYWQgYWxsIHRhc2tmaWxlIHJlZ2lzdGVycyAoZXhjZXB0IGRhdGEpIAorCSAqCXdyaXRlIGFuZCByZWFkIHRoZSBob2IgcmVnaXN0ZXJzIChzZWN0b3IsbnNlY3RvcixsY3lsLGhjeWwpCisJICovCisJaWYgKHRhc2stPnRmX291dF9mbGFncy5hbGwgPT0gMCkgeworCQl0YXNrLT50Zl9vdXRfZmxhZ3MuYWxsID0gSURFX1RBU0tGSUxFX1NURF9PVVRfRkxBR1M7CisJCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKQorCQkJdGFzay0+dGZfb3V0X2ZsYWdzLmFsbCB8PSAoSURFX0hPQl9TVERfT1VUX0ZMQUdTIDw8IDgpOworICAgICAgICB9CisKKwlpZiAodGFzay0+dGZfaW5fZmxhZ3MuYWxsID09IDApIHsKKwkJdGFzay0+dGZfaW5fZmxhZ3MuYWxsID0gSURFX1RBU0tGSUxFX1NURF9JTl9GTEFHUzsKKwkJaWYgKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpCisJCQl0YXNrLT50Zl9pbl9mbGFncy5hbGwgfD0gKElERV9IT0JfU1REX0lOX0ZMQUdTICA8PCA4KTsKKyAgICAgICAgfQorCisJLyogQUxMIENvbW1hbmQgQmxvY2sgRXhlY3V0aW9ucyBTSEFMTCBjbGVhciBuSUVOLCB1bmxlc3Mgb3RoZXJ3aXNlICovCisJaWYgKElERV9DT05UUk9MX1JFRykKKwkJLyogY2xlYXIgbklFTiAqLworCQlod2lmLT5PVVRCKGRyaXZlLT5jdGwsIElERV9DT05UUk9MX1JFRyk7CisJU0VMRUNUX01BU0soZHJpdmUsIDApOworCisjaWYgREVCVUdfVEFTS0ZJTEUKKwlzdGF0dXMgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiAweDgwKSB7CisJCXByaW50aygiZmxhZ2dlZF90YXNrZmlsZSAtPiBCYWQgc3RhdHVzLiBTdGF0dXMgPSAlMDJ4LiB3YWl0IDEwMCB1c2VjIC4uLlxuIiwgc3RhdHVzKTsKKwkJdWRlbGF5KDEwMCk7CisJCXN0YXR1cyA9IGh3aWYtPklOQihJREVfU1RBVFVTX1JFRyk7CisJCXByaW50aygiZmxhZ2dlZF90YXNrZmlsZSAtPiBTdGF0dXMgPSAlMDJ4XG4iLCBzdGF0dXMpOworCX0KKyNlbmRpZgorCisJaWYgKHRhc2stPnRmX291dF9mbGFncy5iLmRhdGEpIHsKKwkJdTE2IGRhdGEgPSAgdGFza2ZpbGUtPmRhdGEgKyAoaG9iZmlsZS0+ZGF0YSA8PCA4KTsKKwkJaHdpZi0+T1VUVyhkYXRhLCBJREVfREFUQV9SRUcpOworCX0KKworCS8qIChrcykgc2VuZCBob2IgcmVnaXN0ZXJzIGZpcnN0ICovCisJaWYgKHRhc2stPnRmX291dF9mbGFncy5iLm5zZWN0b3JfaG9iKQorCQlod2lmLT5PVVRCKGhvYmZpbGUtPnNlY3Rvcl9jb3VudCwgSURFX05TRUNUT1JfUkVHKTsKKwlpZiAodGFzay0+dGZfb3V0X2ZsYWdzLmIuc2VjdG9yX2hvYikKKwkJaHdpZi0+T1VUQihob2JmaWxlLT5zZWN0b3JfbnVtYmVyLCBJREVfU0VDVE9SX1JFRyk7CisJaWYgKHRhc2stPnRmX291dF9mbGFncy5iLmxjeWxfaG9iKQorCQlod2lmLT5PVVRCKGhvYmZpbGUtPmxvd19jeWxpbmRlciwgSURFX0xDWUxfUkVHKTsKKwlpZiAodGFzay0+dGZfb3V0X2ZsYWdzLmIuaGN5bF9ob2IpCisJCWh3aWYtPk9VVEIoaG9iZmlsZS0+aGlnaF9jeWxpbmRlciwgSURFX0hDWUxfUkVHKTsKKworCS8qIChrcykgU2VuZCBub3cgdGhlIHN0YW5kYXJkIHJlZ2lzdGVycyAqLworCWlmICh0YXNrLT50Zl9vdXRfZmxhZ3MuYi5lcnJvcl9mZWF0dXJlKQorCQlod2lmLT5PVVRCKHRhc2tmaWxlLT5mZWF0dXJlLCBJREVfRkVBVFVSRV9SRUcpOworCS8qIHJlZmVycyB0byBudW1iZXIgb2Ygc2VjdG9ycyB0byB0cmFuc2ZlciAqLworCWlmICh0YXNrLT50Zl9vdXRfZmxhZ3MuYi5uc2VjdG9yKQorCQlod2lmLT5PVVRCKHRhc2tmaWxlLT5zZWN0b3JfY291bnQsIElERV9OU0VDVE9SX1JFRyk7CisJLyogcmVmZXJzIHRvIHNlY3RvciBvZmZzZXQgb3Igc3RhcnQgc2VjdG9yICovCisJaWYgKHRhc2stPnRmX291dF9mbGFncy5iLnNlY3RvcikKKwkJaHdpZi0+T1VUQih0YXNrZmlsZS0+c2VjdG9yX251bWJlciwgSURFX1NFQ1RPUl9SRUcpOworCWlmICh0YXNrLT50Zl9vdXRfZmxhZ3MuYi5sY3lsKQorCQlod2lmLT5PVVRCKHRhc2tmaWxlLT5sb3dfY3lsaW5kZXIsIElERV9MQ1lMX1JFRyk7CisJaWYgKHRhc2stPnRmX291dF9mbGFncy5iLmhjeWwpCisJCWh3aWYtPk9VVEIodGFza2ZpbGUtPmhpZ2hfY3lsaW5kZXIsIElERV9IQ1lMX1JFRyk7CisKKyAgICAgICAgLyoKKwkgKiAoa3MpIEluIHRoZSBmbGFnZ2VkIHRhc2tmaWxlIGFwcHJvY2gsIHdlIHdpbGwgdXNlIGFsbCBzcGVjaWZpZWQKKwkgKiByZWdpc3RlcnMgYW5kIHRoZSByZWdpc3RlciB2YWx1ZSB3aWxsIG5vdCBiZSBjaGFuZ2VkLCBleGNlcHQgdGhlCisJICogc2VsZWN0IGJpdCAobWFzdGVyL3NsYXZlKSBpbiB0aGUgZHJpdmVfaGVhZCByZWdpc3Rlci4gV2UgbXVzdCBtYWtlCisJICogc3VyZSB0aGF0IHRoZSBkZXNpcmVkIGRyaXZlIGlzIHNlbGVjdGVkLgorCSAqLworCWh3aWYtPk9VVEIodGFza2ZpbGUtPmRldmljZV9oZWFkIHwgZHJpdmUtPnNlbGVjdC5hbGwsIElERV9TRUxFQ1RfUkVHKTsKKwlzd2l0Y2godGFzay0+ZGF0YV9waGFzZSkgeworCisgICAJICAgICAgICBjYXNlIFRBU0tGSUxFX09VVF9ETUFROgorCQljYXNlIFRBU0tGSUxFX09VVF9ETUE6CisJCWNhc2UgVEFTS0ZJTEVfSU5fRE1BUToKKwkJY2FzZSBUQVNLRklMRV9JTl9ETUE6CisJCQlod2lmLT5kbWFfc2V0dXAoZHJpdmUpOworCQkJaHdpZi0+ZG1hX2V4ZWNfY21kKGRyaXZlLCB0YXNrZmlsZS0+Y29tbWFuZCk7CisJCQlod2lmLT5kbWFfc3RhcnQoZHJpdmUpOworCQkJYnJlYWs7CisKKwkgICAgICAgIGRlZmF1bHQ6CisgCQkJaWYgKHRhc2stPmhhbmRsZXIgPT0gTlVMTCkKKwkJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisKKwkJCS8qIElzc3VlIHRoZSBjb21tYW5kICovCisJCQlpZiAodGFzay0+cHJlaGFuZGxlcikgeworCQkJCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCB0YXNrZmlsZS0+Y29tbWFuZCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJCQluZGVsYXkoNDAwKTsJLyogRklYTUUgKi8KKwkJCQlyZXR1cm4gdGFzay0+cHJlaGFuZGxlcihkcml2ZSwgdGFzay0+cnEpOworCQkJfQorCQkJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgdGFza2ZpbGUtPmNvbW1hbmQsIHRhc2stPmhhbmRsZXIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmggYi9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExOTZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10aW1pbmcuaApAQCAtMCwwICsxLDI4MSBAQAorI2lmbmRlZiBfSURFX1RJTUlOR19ICisjZGVmaW5lIF9JREVfVElNSU5HX0gKKworLyoKKyAqICRJZDogaWRlLXRpbWluZy5oLHYgMS42IDIwMDEvMTIvMjMgMjI6NDc6NTYgdm9qdGVjaCBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBWb2p0ZWNoIFBhdmxpaworICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQorICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPHZvanRlY2hAdWN3LmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorCisjZGVmaW5lIFhGRVJfUElPXzUJCTB4MGQKKyNkZWZpbmUgWEZFUl9VRE1BX1NMT1cJCTB4NGYKKworc3RydWN0IGlkZV90aW1pbmcgeworCXNob3J0IG1vZGU7CisJc2hvcnQgc2V0dXA7CS8qIHQxICovCisJc2hvcnQgYWN0OGI7CS8qIHQyIGZvciA4LWJpdCBpbyAqLworCXNob3J0IHJlYzhiOwkvKiB0MmkgZm9yIDgtYml0IGlvICovCisJc2hvcnQgY3ljOGI7CS8qIHQwIGZvciA4LWJpdCBpbyAqLworCXNob3J0IGFjdGl2ZTsJLyogdDIgb3IgdEQgKi8KKwlzaG9ydCByZWNvdmVyOwkvKiB0Mmkgb3IgdEsgKi8KKwlzaG9ydCBjeWNsZTsJLyogdDAgKi8KKwlzaG9ydCB1ZG1hOwkvKiB0MkNZQ1RZUC8yICovCit9OworCisvKgorICogUElPIDAtNSwgTVdETUEgMC0yIGFuZCBVRE1BIDAtNiB0aW1pbmdzIChpbiBuYW5vc2Vjb25kcykuCisgKiBUaGVzZSB3ZXJlIHRha2VuIGZyb20gQVRBL0FUQVBJLTYgc3RhbmRhcmQsIHJldiAwYSwgZXhjZXB0CisgKiBmb3IgUElPIDUsIHdoaWNoIGlzIGEgbm9uc3RhbmRhcmQgZXh0ZW5zaW9uIGFuZCBVRE1BNiwgd2hpY2gKKyAqIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBieSBNYXh0b3IgZHJpdmVzLiAKKyAqLworCitzdGF0aWMgc3RydWN0IGlkZV90aW1pbmcgaWRlX3RpbWluZ1tdID0geworCisJeyBYRkVSX1VETUFfNiwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAxNSB9LAorCXsgWEZFUl9VRE1BXzUsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgMjAgfSwKKwl7IFhGRVJfVURNQV80LCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDMwIH0sCisJeyBYRkVSX1VETUFfMywgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICA0NSB9LAorCisJeyBYRkVSX1VETUFfMiwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICA2MCB9LAorCXsgWEZFUl9VRE1BXzEsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgODAgfSwKKwl7IFhGRVJfVURNQV8wLCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTIwIH0sCisKKwl7IFhGRVJfVURNQV9TTE9XLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTUwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl7IFhGRVJfTVdfRE1BXzIsICAyNSwgICAwLCAgIDAsICAgMCwgIDcwLCAgMjUsIDEyMCwgICAwIH0sCisJeyBYRkVSX01XX0RNQV8xLCAgNDUsICAgMCwgICAwLCAgIDAsICA4MCwgIDUwLCAxNTAsICAgMCB9LAorCXsgWEZFUl9NV19ETUFfMCwgIDYwLCAgIDAsICAgMCwgICAwLCAyMTUsIDIxNSwgNDgwLCAgIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXsgWEZFUl9TV19ETUFfMiwgIDYwLCAgIDAsICAgMCwgICAwLCAxMjAsIDEyMCwgMjQwLCAgIDAgfSwKKwl7IFhGRVJfU1dfRE1BXzEsICA5MCwgICAwLCAgIDAsICAgMCwgMjQwLCAyNDAsIDQ4MCwgICAwIH0sCisJeyBYRkVSX1NXX0RNQV8wLCAxMjAsICAgMCwgICAwLCAgIDAsIDQ4MCwgNDgwLCA5NjAsICAgMCB9LAorCisJeyBYRkVSX1BJT181LCAgICAgMjAsICA1MCwgIDMwLCAxMDAsICA1MCwgIDMwLCAxMDAsICAgMCB9LAorCXsgWEZFUl9QSU9fNCwgICAgIDI1LCAgNzAsICAyNSwgMTIwLCAgNzAsICAyNSwgMTIwLCAgIDAgfSwKKwl7IFhGRVJfUElPXzMsICAgICAzMCwgIDgwLCAgNzAsIDE4MCwgIDgwLCAgNzAsIDE4MCwgICAwIH0sCisKKwl7IFhGRVJfUElPXzIsICAgICAzMCwgMjkwLCAgNDAsIDMzMCwgMTAwLCAgOTAsIDI0MCwgICAwIH0sCisJeyBYRkVSX1BJT18xLCAgICAgNTAsIDI5MCwgIDkzLCAzODMsIDEyNSwgMTAwLCAzODMsICAgMCB9LAorCXsgWEZFUl9QSU9fMCwgICAgIDcwLCAyOTAsIDI0MCwgNjAwLCAxNjUsIDE1MCwgNjAwLCAgIDAgfSwKKworCXsgWEZFUl9QSU9fU0xPVywgMTIwLCAyOTAsIDI0MCwgOTYwLCAyOTAsIDI0MCwgOTYwLCAgIDAgfSwKKworCXsgLTEgfQorfTsKKworI2RlZmluZSBJREVfVElNSU5HX1NFVFVQCTB4MDEKKyNkZWZpbmUgSURFX1RJTUlOR19BQ1Q4QgkweDAyCisjZGVmaW5lIElERV9USU1JTkdfUkVDOEIJMHgwNAorI2RlZmluZSBJREVfVElNSU5HX0NZQzhCCTB4MDgKKyNkZWZpbmUgSURFX1RJTUlOR184QklUCQkweDBlCisjZGVmaW5lIElERV9USU1JTkdfQUNUSVZFCTB4MTAKKyNkZWZpbmUgSURFX1RJTUlOR19SRUNPVkVSCTB4MjAKKyNkZWZpbmUgSURFX1RJTUlOR19DWUNMRQkweDQwCisjZGVmaW5lIElERV9USU1JTkdfVURNQQkJMHg4MAorI2RlZmluZSBJREVfVElNSU5HX0FMTAkJMHhmZgorCisjZGVmaW5lIE1JTihhLGIpCSgoYSk8KGIpPyhhKTooYikpCisjZGVmaW5lIE1BWChhLGIpCSgoYSk+KGIpPyhhKTooYikpCisjZGVmaW5lIEZJVCh2LG1pbixtYXgpCU1BWChNSU4odixtYXgpLG1pbikKKyNkZWZpbmUgRU5PVUdIKHYsdW5pdCkJKCgodiktMSkvKHVuaXQpKzEpCisjZGVmaW5lIEVaKHYsdW5pdCkJKCh2KT9FTk9VR0godix1bml0KTowKQorCisjZGVmaW5lIFhGRVJfTU9ERQkweGYwCisjZGVmaW5lIFhGRVJfVURNQV8xMzMJMHg0OAorI2RlZmluZSBYRkVSX1VETUFfMTAwCTB4NDQKKyNkZWZpbmUgWEZFUl9VRE1BXzY2CTB4NDIKKyNkZWZpbmUgWEZFUl9VRE1BCTB4NDAKKyNkZWZpbmUgWEZFUl9NV0RNQQkweDIwCisjZGVmaW5lIFhGRVJfU1dETUEJMHgxMAorI2RlZmluZSBYRkVSX0VQSU8JMHgwMQorI2RlZmluZSBYRkVSX1BJTwkweDAwCisKK3N0YXRpYyBzaG9ydCBpZGVfZmluZF9iZXN0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWFwKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwlzaG9ydCBiZXN0ID0gMDsKKworCWlmICghaWQpCisJCXJldHVybiBYRkVSX1BJT19TTE9XOworCisJaWYgKChtYXAgJiBYRkVSX1VETUEpICYmIChpZC0+ZmllbGRfdmFsaWQgJiA0KSkgewkvKiBXYW50IFVETUEgYW5kIFVETUEgYml0bWFwIHZhbGlkICovCisKKwkJaWYgKChtYXAgJiBYRkVSX1VETUFfMTMzKSA9PSBYRkVSX1VETUFfMTMzKQorCQkJaWYgKChiZXN0ID0gKGlkLT5kbWFfdWx0cmEgJiAweDAwNDApID8gWEZFUl9VRE1BXzYgOiAwKSkgcmV0dXJuIGJlc3Q7CisKKwkJaWYgKChtYXAgJiBYRkVSX1VETUFfMTAwKSA9PSBYRkVSX1VETUFfMTAwKQorCQkJaWYgKChiZXN0ID0gKGlkLT5kbWFfdWx0cmEgJiAweDAwMjApID8gWEZFUl9VRE1BXzUgOiAwKSkgcmV0dXJuIGJlc3Q7CisKKwkJaWYgKChtYXAgJiBYRkVSX1VETUFfNjYpID09IFhGRVJfVURNQV82NikKKwkJCWlmICgoYmVzdCA9IChpZC0+ZG1hX3VsdHJhICYgMHgwMDEwKSA/IFhGRVJfVURNQV80IDoKKyAgICAgICAgICAgICAgICAJICAgIAkgICAgKGlkLT5kbWFfdWx0cmEgJiAweDAwMDgpID8gWEZFUl9VRE1BXzMgOiAwKSkgcmV0dXJuIGJlc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoKGJlc3QgPSAoaWQtPmRtYV91bHRyYSAmIDB4MDAwNCkgPyBYRkVSX1VETUFfMiA6CisgICAgICAgICAgICAgICAgCSAgICAoaWQtPmRtYV91bHRyYSAmIDB4MDAwMikgPyBYRkVSX1VETUFfMSA6CisgICAgICAgICAgICAgICAgCSAgICAoaWQtPmRtYV91bHRyYSAmIDB4MDAwMSkgPyBYRkVSX1VETUFfMCA6IDApKSByZXR1cm4gYmVzdDsKKwl9CisKKwlpZiAoKG1hcCAmIFhGRVJfTVdETUEpICYmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgewkvKiBXYW50IE1XRE1BIGFuZCBkcml2ZSBoYXMgRUlERSBmaWVsZHMgKi8KKworCQlpZiAoKGJlc3QgPSAoaWQtPmRtYV9td29yZCAmIDB4MDAwNCkgPyBYRkVSX01XX0RNQV8yIDoKKyAgICAgICAgICAgICAgICAJICAgIChpZC0+ZG1hX213b3JkICYgMHgwMDAyKSA/IFhGRVJfTVdfRE1BXzEgOgorICAgICAgICAgICAgICAgIAkgICAgKGlkLT5kbWFfbXdvcmQgJiAweDAwMDEpID8gWEZFUl9NV19ETUFfMCA6IDApKSByZXR1cm4gYmVzdDsKKwl9CisKKwlpZiAobWFwICYgWEZFUl9TV0RNQSkgewkJCQkJLyogV2FudCBTV0RNQSAqLworCisgCQlpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgewkJCS8qIEVJREUgU1dETUEgKi8KKworCQkJaWYgKChiZXN0ID0gKGlkLT5kbWFfMXdvcmQgJiAweDAwMDQpID8gWEZFUl9TV19ETUFfMiA6CisgICAgICAJCQkJICAgIChpZC0+ZG1hXzF3b3JkICYgMHgwMDAyKSA/IFhGRVJfU1dfRE1BXzEgOgorCQkJCSAgICAoaWQtPmRtYV8xd29yZCAmIDB4MDAwMSkgPyBYRkVSX1NXX0RNQV8wIDogMCkpIHJldHVybiBiZXN0OworCQl9CisKKwkJaWYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgewkJCS8qIFByZS1FSURFIHN0eWxlIFNXRE1BICovCisKKwkJCWlmICgoYmVzdCA9IChpZC0+dERNQSA9PSAyKSA/IFhGRVJfU1dfRE1BXzIgOgorCQkJCSAgICAoaWQtPnRETUEgPT0gMSkgPyBYRkVSX1NXX0RNQV8xIDoKKwkJCQkgICAgKGlkLT50RE1BID09IDApID8gWEZFUl9TV19ETUFfMCA6IDApKSByZXR1cm4gYmVzdDsKKwkJfQorCX0KKworCisJaWYgKChtYXAgJiBYRkVSX0VQSU8pICYmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgewkvKiBFSURFIFBJTyBtb2RlcyAqLworCisJCWlmICgoYmVzdCA9IChkcml2ZS0+aWQtPmVpZGVfcGlvX21vZGVzICYgNCkgPyBYRkVSX1BJT181IDoKKwkJCSAgICAoZHJpdmUtPmlkLT5laWRlX3Bpb19tb2RlcyAmIDIpID8gWEZFUl9QSU9fNCA6CisJCQkgICAgKGRyaXZlLT5pZC0+ZWlkZV9waW9fbW9kZXMgJiAxKSA/IFhGRVJfUElPXzMgOiAwKSkgcmV0dXJuIGJlc3Q7CisJfQorCQorCXJldHVybiAgKGRyaXZlLT5pZC0+dFBJTyA9PSAyKSA/IFhGRVJfUElPXzIgOgorCQkoZHJpdmUtPmlkLT50UElPID09IDEpID8gWEZFUl9QSU9fMSA6CisJCShkcml2ZS0+aWQtPnRQSU8gPT0gMCkgPyBYRkVSX1BJT18wIDogWEZFUl9QSU9fU0xPVzsKK30KKworc3RhdGljIHZvaWQgaWRlX3RpbWluZ19xdWFudGl6ZShzdHJ1Y3QgaWRlX3RpbWluZyAqdCwgc3RydWN0IGlkZV90aW1pbmcgKnEsIGludCBULCBpbnQgVVQpCit7CisJcS0+c2V0dXAgICA9IEVaKHQtPnNldHVwICAgKiAxMDAwLCAgVCk7CisJcS0+YWN0OGIgICA9IEVaKHQtPmFjdDhiICAgKiAxMDAwLCAgVCk7CisJcS0+cmVjOGIgICA9IEVaKHQtPnJlYzhiICAgKiAxMDAwLCAgVCk7CisJcS0+Y3ljOGIgICA9IEVaKHQtPmN5YzhiICAgKiAxMDAwLCAgVCk7CisJcS0+YWN0aXZlICA9IEVaKHQtPmFjdGl2ZSAgKiAxMDAwLCAgVCk7CisJcS0+cmVjb3ZlciA9IEVaKHQtPnJlY292ZXIgKiAxMDAwLCAgVCk7CisJcS0+Y3ljbGUgICA9IEVaKHQtPmN5Y2xlICAgKiAxMDAwLCAgVCk7CisJcS0+dWRtYSAgICA9IEVaKHQtPnVkbWEgICAgKiAxMDAwLCBVVCk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV90aW1pbmdfbWVyZ2Uoc3RydWN0IGlkZV90aW1pbmcgKmEsIHN0cnVjdCBpZGVfdGltaW5nICpiLCBzdHJ1Y3QgaWRlX3RpbWluZyAqbSwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX1NFVFVQICApIG0tPnNldHVwICAgPSBNQVgoYS0+c2V0dXAsICAgYi0+c2V0dXApOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19BQ1Q4QiAgKSBtLT5hY3Q4YiAgID0gTUFYKGEtPmFjdDhiLCAgIGItPmFjdDhiKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfUkVDOEIgICkgbS0+cmVjOGIgICA9IE1BWChhLT5yZWM4YiwgICBiLT5yZWM4Yik7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX0NZQzhCICApIG0tPmN5YzhiICAgPSBNQVgoYS0+Y3ljOGIsICAgYi0+Y3ljOGIpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19BQ1RJVkUgKSBtLT5hY3RpdmUgID0gTUFYKGEtPmFjdGl2ZSwgIGItPmFjdGl2ZSk7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX1JFQ09WRVIpIG0tPnJlY292ZXIgPSBNQVgoYS0+cmVjb3ZlciwgYi0+cmVjb3Zlcik7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX0NZQ0xFICApIG0tPmN5Y2xlICAgPSBNQVgoYS0+Y3ljbGUsICAgYi0+Y3ljbGUpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19VRE1BICAgKSBtLT51ZG1hICAgID0gTUFYKGEtPnVkbWEsICAgIGItPnVkbWEpOworfQorCitzdGF0aWMgc3RydWN0IGlkZV90aW1pbmcqIGlkZV90aW1pbmdfZmluZF9tb2RlKHNob3J0IHNwZWVkKQoreworCXN0cnVjdCBpZGVfdGltaW5nICp0OworCisJZm9yICh0ID0gaWRlX3RpbWluZzsgdC0+bW9kZSAhPSBzcGVlZDsgdCsrKQorCQlpZiAodC0+bW9kZSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdDsgCit9CisKK3N0YXRpYyBpbnQgaWRlX3RpbWluZ19jb21wdXRlKGlkZV9kcml2ZV90ICpkcml2ZSwgc2hvcnQgc3BlZWQsIHN0cnVjdCBpZGVfdGltaW5nICp0LCBpbnQgVCwgaW50IFVUKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwlzdHJ1Y3QgaWRlX3RpbWluZyAqcywgcDsKKworLyoKKyAqIEZpbmQgdGhlIG1vZGUuCisgKi8KKworCWlmICghKHMgPSBpZGVfdGltaW5nX2ZpbmRfbW9kZShzcGVlZCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworLyoKKyAqIElmIHRoZSBkcml2ZSBpcyBhbiBFSURFIGRyaXZlLCBpdCBjYW4gdGVsbCB1cyBpdCBuZWVkcyBleHRlbmRlZAorICogUElPL01XRE1BIGN5Y2xlIHRpbWluZy4KKyAqLworCisJaWYgKGlkICYmIGlkLT5maWVsZF92YWxpZCAmIDIpIHsJLyogRUlERSBkcml2ZSAqLworCisJCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKworCQlzd2l0Y2ggKHNwZWVkICYgWEZFUl9NT0RFKSB7CisKKwkJCWNhc2UgWEZFUl9QSU86CisJCQkJaWYgKHNwZWVkIDw9IFhGRVJfUElPXzIpIHAuY3ljbGUgPSBwLmN5YzhiID0gaWQtPmVpZGVfcGlvOworCQkJCQkJICAgIGVsc2UgcC5jeWNsZSA9IHAuY3ljOGIgPSBpZC0+ZWlkZV9waW9faW9yZHk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgWEZFUl9NV0RNQToKKwkJCQlwLmN5Y2xlID0gaWQtPmVpZGVfZG1hX21pbjsKKwkJCQlicmVhazsKKwkJfQorCisJCWlkZV90aW1pbmdfbWVyZ2UoJnAsIHQsIHQsIElERV9USU1JTkdfQ1lDTEUgfCBJREVfVElNSU5HX0NZQzhCKTsKKwl9CisKKy8qCisgKiBDb252ZXJ0IHRoZSB0aW1pbmcgdG8gYnVzIGNsb2NrIGNvdW50cy4KKyAqLworCisJaWRlX3RpbWluZ19xdWFudGl6ZShzLCB0LCBULCBVVCk7CisKKy8qCisgKiBFdmVuIGluIERNQS9VRE1BIG1vZGVzIHdlIHN0aWxsIHVzZSBQSU8gYWNjZXNzIGZvciBJREVOVElGWSwgUy5NLkEuUi5UCisgKiBhbmQgc29tZSBvdGhlciBjb21tYW5kcy4gV2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgRE1BIGN5Y2xlIHRpbWluZyBpcworICogc2xvd2VyL2VxdWFsIHRoYW4gdGhlIGZhc3Rlc3QgUElPIHRpbWluZy4KKyAqLworCisJaWYgKChzcGVlZCAmIFhGRVJfTU9ERSkgIT0gWEZFUl9QSU8pIHsKKwkJaWRlX3RpbWluZ19jb21wdXRlKGRyaXZlLCBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsIFhGRVJfUElPIHwgWEZFUl9FUElPKSwgJnAsIFQsIFVUKTsKKwkJaWRlX3RpbWluZ19tZXJnZSgmcCwgdCwgdCwgSURFX1RJTUlOR19BTEwpOworCX0KKworLyoKKyAqIExlbmdodGVuIGFjdGl2ZSAmIHJlY292ZXJ5IHRpbWUgc28gdGhhdCBjeWNsZSB0aW1lIGlzIGNvcnJlY3QuCisgKi8KKworCWlmICh0LT5hY3Q4YiArIHQtPnJlYzhiIDwgdC0+Y3ljOGIpIHsKKwkJdC0+YWN0OGIgKz0gKHQtPmN5YzhiIC0gKHQtPmFjdDhiICsgdC0+cmVjOGIpKSAvIDI7CisJCXQtPnJlYzhiID0gdC0+Y3ljOGIgLSB0LT5hY3Q4YjsKKwl9CisKKwlpZiAodC0+YWN0aXZlICsgdC0+cmVjb3ZlciA8IHQtPmN5Y2xlKSB7CisJCXQtPmFjdGl2ZSArPSAodC0+Y3ljbGUgLSAodC0+YWN0aXZlICsgdC0+cmVjb3ZlcikpIC8gMjsKKwkJdC0+cmVjb3ZlciA9IHQtPmN5Y2xlIC0gdC0+YWN0aXZlOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZGVjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC0wLDAgKzEsMjI2OSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9pZGUuYwkJVmVyc2lvbiA3LjAwYmV0YTIJTWFyIDA1IDIwMDMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTggIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycyAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiAgTW9zdGx5IHdyaXR0ZW4gYnkgTWFyayBMb3JkICA8bWxvcmRAcG9ib3guY29tPgorICogICAgICAgICAgICAgICAgYW5kIEdhZGkgT3htYW4gPGdhZGlvQG5ldHZpc2lvbi5uZXQuaWw+CisgKiAgICAgICAgICAgICAgICBhbmQgQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqCisgKiAgU2VlIGxpbnV4L01BSU5UQUlORVJTIGZvciBhZGRyZXNzIG9mIGN1cnJlbnQgbWFpbnRhaW5lci4KKyAqCisgKiBUaGlzIGlzIHRoZSBtdWx0aXBsZSBJREUgaW50ZXJmYWNlIGRyaXZlciwgYXMgZXZvbHZlZCBmcm9tIGhkLmMuCisgKiBJdCBzdXBwb3J0cyB1cCB0byBNQVhfSFdJRlMgSURFIGludGVyZmFjZXMsIG9uIG9uZSBvciBtb3JlIElSUXMKKyAqICAgKHVzdWFsbHkgMTQgJiAxNSkuCisgKiBUaGVyZSBjYW4gYmUgdXAgdG8gdHdvIGRyaXZlcyBwZXIgaW50ZXJmYWNlLCBhcyBwZXIgdGhlIEFUQS0yIHNwZWMuCisgKgorICogUHJpbWFyeTogICAgaWRlMCwgcG9ydCAweDFmMDsgbWFqb3I9MzsgIGhkYSBpcyBtaW5vcj0wOyBoZGIgaXMgbWlub3I9NjQKKyAqIFNlY29uZGFyeTogIGlkZTEsIHBvcnQgMHgxNzA7IG1ham9yPTIyOyBoZGMgaXMgbWlub3I9MDsgaGRkIGlzIG1pbm9yPTY0CisgKiBUZXJ0aWFyeTogICBpZGUyLCBwb3J0IDB4Pz8/OyBtYWpvcj0zMzsgaGRlIGlzIG1pbm9yPTA7IGhkZiBpcyBtaW5vcj02NAorICogUXVhdGVybmFyeTogaWRlMywgcG9ydCAweD8/PzsgbWFqb3I9MzQ7IGhkZyBpcyBtaW5vcj0wOyBoZGggaXMgbWlub3I9NjQKKyAqIC4uLgorICoKKyAqICBGcm9tIGhkLmM6CisgKiAgfAorICogIHwgSXQgdHJhdmVyc2VzIHRoZSByZXF1ZXN0LWxpc3QsIHVzaW5nIGludGVycnVwdHMgdG8ganVtcCBiZXR3ZWVuIGZ1bmN0aW9ucy4KKyAqICB8IEFzIG5lYXJseSBhbGwgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgd2l0aGluIGludGVycnVwdHMsIHdlIG1heSBub3Qgc2xlZXAuCisgKiAgfCBTcGVjaWFsIGNhcmUgaXMgcmVjb21tZW5kZWQuICBIYXZlIEZ1biEKKyAqICB8CisgKiAgfCBtb2RpZmllZCBieSBEcmV3IEVja2hhcmR0IHRvIGNoZWNrIG5yIG9mIGhkJ3MgZnJvbSB0aGUgQ01PUy4KKyAqICB8CisgKiAgfCBUaGFua3MgdG8gQnJhbmtvIExhbmtlc3RlciwgbGFua2VzdGVAZndpLnV2YS5ubCwgd2hvIGZvdW5kIGEgYnVnCisgKiAgfCBpbiB0aGUgZWFybHkgZXh0ZW5kZWQtcGFydGl0aW9uIGNoZWNrcyBhbmQgYWRkZWQgRE0gcGFydGl0aW9ucy4KKyAqICB8CisgKiAgfCBFYXJseSB3b3JrIG9uIGVycm9yIGhhbmRsaW5nIGJ5IE1pa2EgTGlsamViZXJnIChsaWxqZWJlckBjcy5IZWxzaW5raS5GSSkuCisgKiAgfAorICogIHwgSVJRLXVubWFzaywgZHJpdmUtaWQsIG11bHRpcGxlLW1vZGUsIHN1cHBvcnQgZm9yICI+MTYgaGVhZHMiLAorICogIHwgYW5kIGdlbmVyYWwgc3RyZWFtbGluaW5nIGJ5IE1hcmsgTG9yZCAobWxvcmRAcG9ib3guY29tKS4KKyAqCisgKiAgT2N0b2JlciwgMTk5NCAtLSBDb21wbGV0ZSBsaW5lLWJ5LWxpbmUgb3ZlcmhhdWwgZm9yIGxpbnV4IDEuMS54LCBieToKKyAqCisgKglNYXJrIExvcmQJKG1sb3JkQHBvYm94LmNvbSkJCShJREUgUGVyZi5Qa2cpCisgKglEZWxtYW4gTGVlCShkZWxtYW5AaWVlZS5vcmcpCQkoIk1yLiBhdGRpc2syIikKKyAqCVNjb3R0IFNueWRlcgkoc255ZGVyQGZuYWxkMC5mbmFsLmdvdikJKEFUQVBJIElERSBjZC1yb20pCisgKgorICogIFRoaXMgd2FzIGEgcmV3cml0ZSBvZiBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgZnJvbSBoZC5jLCB0aG91Z2ggc29tZSBvcmlnaW5hbAorICogIGNvZGUgaXMgc3RpbGwgc3ByaW5rbGVkIGFib3V0LiAgVGhpbmsgb2YgaXQgYXMgYSBtYWpvciBldm9sdXRpb24sIHdpdGgKKyAqICBpbnNwaXJhdGlvbiBmcm9tIGxvdHMgb2YgbGludXggdXNlcnMsIGVzcC4gIGhhbWlzaEB6b3QuYXBhbmEub3JnLmF1CisgKgorICogIFZlcnNpb24gMS4wIEFMUEhBCWluaXRpYWwgY29kZSwgcHJpbWFyeSBpL2Ygd29ya2luZyBva2F5CisgKiAgVmVyc2lvbiAxLjMgQkVUQQlkdWFsIGkvZiBvbiBzaGFyZWQgaXJxIHRlc3RlZCAmIHdvcmtpbmchCisgKiAgVmVyc2lvbiAxLjQgQkVUQQlhZGRlZCBhdXRvIHByb2JpbmcgZm9yIGlycShzKQorICogIFZlcnNpb24gMS41IEJFVEEJYWRkZWQgQUxQSEEgKHVudGVzdGVkKSBzdXBwb3J0IGZvciBJREUgY2Qtcm9tcywKKyAqICAuLi4KKyAqIFZlcnNpb24gNS41MAkJYWxsb3cgdmFsdWVzIGFzIHNtYWxsIGFzIDIwIGZvciBpZGVidXM9CisgKiBWZXJzaW9uIDUuNTEJCWZvcmNlIG5vbiBpb18zMmJpdCBpbiBkcml2ZV9jbWRfaW50cigpCisgKgkJCWNoYW5nZSBkZWxheV8xMG1zKCkgdG8gZGVsYXlfNTBtcygpIHRvIGZpeCBwcm9ibGVtcworICogVmVyc2lvbiA1LjUyCQlmaXggaW5jb3JyZWN0IGludmFsaWRhdGlvbiBvZiByZW1vdmFibGUgZGV2aWNlcworICoJCQlhZGQgImhkeD1zbG93IiBjb21tYW5kIGxpbmUgb3B0aW9uCisgKiBWZXJzaW9uIDUuNjAJCXN0YXJ0IHRvIG1vZHVsYXJpemUgdGhlIGRyaXZlcjsgdGhlIGRpc2sgYW5kIEFUQVBJCisgKgkJCSBkcml2ZXJzIGNhbiBiZSBjb21waWxlZCBhcyBsb2FkYWJsZSBtb2R1bGVzLgorICoJCQltb3ZlIElERSBwcm9iZSBjb2RlIHRvIGlkZS1wcm9iZS5jCisgKgkJCW1vdmUgSURFIGRpc2sgY29kZSB0byBpZGUtZGlzay5jCisgKgkJCWFkZCBzdXBwb3J0IGZvciBnZW5lcmljIElERSBkZXZpY2Ugc3ViZHJpdmVycworICoJCQlhZGQgbTY4ayBjb2RlIGZyb20gR2VlcnQgVXl0dGVyaG9ldmVuCisgKgkJCXByb2JlIGFsbCBpbnRlcmZhY2VzIGJ5IGRlZmF1bHQKKyAqCQkJYWRkIGlvY3RsIHRvIChyZSlwcm9iZSBhbiBpbnRlcmZhY2UKKyAqIFZlcnNpb24gNi4wMAkJdXNlIHBlciBkZXZpY2UgcmVxdWVzdCBxdWV1ZXMKKyAqCQkJYXR0ZW1wdCB0byBvcHRpbWl6ZSBzaGFyZWQgaHdncm91cCBwZXJmb3JtYW5jZQorICoJCQlhZGQgaW9jdGwgdG8gbWFudWFsbHkgYWRqdXN0IGJhbmR3aWR0aCBhbGdvcml0aG1zCisgKgkJCWFkZCBrZXJuZWxkIHN1cHBvcnQgZm9yIHRoZSBwcm9iZSBtb2R1bGUKKyAqCQkJZml4IGJ1ZyBpbiBpZGVfZXJyb3IoKQorICoJCQlmaXggYnVnIGluIHRoZSBmaXJzdCBpZGVfZ2V0X2xvY2soKSBjYWxsIGZvciBBdGFyaQorICoJCQlkb24ndCBmbHVzaCBsZWZ0b3ZlciBkYXRhIGZvciBBVEFQSSBkZXZpY2VzCisgKiBWZXJzaW9uIDYuMDEJCWNsZWFyIGh3Z3JvdXAtPmFjdGl2ZSB3aGlsZSB0aGUgaHdncm91cCBzbGVlcHMKKyAqCQkJc3VwcG9ydCBIRElPX0dFVEdFTyBmb3IgZmxvcHBpZXMKKyAqIFZlcnNpb24gNi4wMgkJZml4IGlkZV9hY2tfaW50cigpIGNhbGwKKyAqCQkJY2hlY2sgcGFydGl0aW9uIHRhYmxlIG9uIGZsb3BwaWVzCisgKiBWZXJzaW9uIDYuMDMJCWhhbmRsZSBiYWQgc3RhdHVzIGJpdCBzZXF1ZW5jaW5nIGluIGlkZV93YWl0X3N0YXQoKQorICogVmVyc2lvbiA2LjEwCQlkZWxldGVkIG9sZCBlbnRyaWVzIGZyb20gdGhpcyBsaXN0IG9mIHVwZGF0ZXMKKyAqCQkJcmVwbGFjZWQgdHJpdG9uLmMgd2l0aCBpZGUtZG1hLmMgZ2VuZXJpYyBQQ0kgRE1BCisgKgkJCWFkZGVkIHN1cHBvcnQgZm9yIEJJT1MtZW5hYmxlZCBVbHRyYURNQQorICoJCQlyZW5hbWUgYWxsICJwcm9taXNlIiB0aGluZ3MgdG8gInBkYzQwMzAiCisgKgkJCWZpeCBFWi1EUklWRSBoYW5kbGluZyBvbiBzbWFsbCBkaXNrcworICogVmVyc2lvbiA2LjExCQlmaXggcHJvYmUgZXJyb3IgaW4gaWRlX3NjYW5fZGV2aWNlcygpCisgKgkJCWZpeCBhbmNpZW50ICJqaWZmaWVzIiBwb2xsaW5nIGJ1Z3MKKyAqCQkJbWFzayBhbGwgaHdncm91cCBpbnRlcnJ1cHRzIG9uIGVhY2ggaXJxIGVudHJ5CisgKiBWZXJzaW9uIDYuMTIJCWludGVncmF0ZSBpb2N0bCBhbmQgcHJvYyBpbnRlcmZhY2VzCisgKgkJCWZpeCBwYXJzaW5nIG9mICJpZGV4PSIgY29tbWFuZCBsaW5lIHBhcmFtZXRlcgorICogVmVyc2lvbiA2LjEzCQlhZGQgc3VwcG9ydCBmb3IgaWRlNC9pZGU1IGNvdXJ0ZXN5IHJqb25lc0BvcmNoZXN0cmVhbS5jb20KKyAqIFZlcnNpb24gNi4xNAkJZml4ZWQgSVJRIHNoYXJpbmcgYW1vbmcgUENJIGRldmljZXMKKyAqIFZlcnNpb24gNi4xNQkJYWRkZWQgU01QIGF3YXJlbmVzcyB0byBJREUgZHJpdmVycworICogVmVyc2lvbiA2LjE2CQlmaXhlZCB2YXJpb3VzIGJ1Z3M7IGV2ZW4gbW9yZSBTTVAgZnJpZW5kbHkKKyAqIFZlcnNpb24gNi4xNwkJZml4IGZvciBuZXdlc3QgRVotRHJpdmUgcHJvYmxlbQorICogVmVyc2lvbiA2LjE4CQlkZWZhdWx0IHVucGFydGl0aW9uZWQtZGlzayB0cmFuc2xhdGlvbiBub3cgIkJJT1MgTEJBIgorICogVmVyc2lvbiA2LjE5CQlSZS1kZXNpZ24gZm9yIGEgVU5JRk9STSBkcml2ZXIgZm9yIGFsbCBwbGF0Zm9ybXMsCisgKgkJCSAgbW9kZWwgYmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBSdXNzZWxsIEtpbmcgYW5kCisgKgkJCSAgR2VlcnQgVXl0dGVyaG9ldmVuCisgKgkJCVByb21pc2UgREM0MDMwVkwgbm93IHN1cHBvcnRlZC4KKyAqCQkJYWRkIHN1cHBvcnQgZm9yIGlkZTYvaWRlNworICoJCQlkZWxheV81MG1zKCkgY2hhbmdlZCB0byBpZGVfZGVsYXlfNTBtcygpIGFuZCBleHBvcnRlZC4KKyAqIFZlcnNpb24gNi4yMAkJQWRkZWQvRml4ZWQgR2VuZXJpYyBBVEEtNjYgc3VwcG9ydCBhbmQgaHdpZiBkZXRlY3Rpb24uCisgKgkJCUFkZGVkIGhkeD1mbGFzaCB0byBhbGxvdyBmb3Igc2Vjb25kIGZsYXNoIGRpc2sKKyAqCQkJICBkZXRlY3Rpb24gdy9vIHRoZSBoYW5nIGxvb3AuCisgKgkJCUFkZGVkIHN1cHBvcnQgZm9yIGlkZTgvaWRlOQorICoJCQlBZGRlZCBpZGV4PWF0YTY2IGZvciB0aGUgcXVpcmt5IGNoaXBzZXRzIHRoYXQgYXJlCisgKgkJCSAgQVRBLTY2IGNvbXBsaWFudCwgYnV0IGhhdmUgeWV0IHRvIGRldGVybWluZSBhIG1ldGhvZAorICoJCQkgIG9mIHZlcmlmaWNhdGlvbiBvZiB0aGUgODBjIGNhYmxlIHByZXNlbmNlLgorICoJCQkgIFNwZWNpZmljYWxseSBQcm9taXNlJ3MgUERDMjAyNjIgY2hpcHNldC4KKyAqIFZlcnNpb24gNi4yMQkJRml4aW5nL0ZpeGVkIFNNUCBzcGlubG9jayBpc3N1ZSB3aXRoIGluc2lnaHQgZnJvbSBhbiBvbGQKKyAqCQkJICBoYXQgdGhhdCBjbGFyaWZpZWQgb3JpZ2luYWwgbG93IGxldmVsIGRyaXZlciBkZXNpZ24uCisgKiBWZXJzaW9uIDYuMzAJCUFkZGVkIFNNUCBzdXBwb3J0OyBmaXhlZCBtdWx0bW9kZSBpc3N1ZXMuICAtbWwKKyAqIFZlcnNpb24gNi4zMQkJRGVidWcgU2hhcmUgSU5UUidzIGFuZCByZXF1ZXN0IHF1ZXVlIHN0cmVhbWluZworICoJCQlOYXRpdmUgQVRBLTEwMCBzdXBwb3J0CisgKgkJCVByZXAgZm9yIENhc2NhZGVzIFByb2plY3QKKyAqIFZlcnNpb24gNy4wMGFscGhhCUZpcnN0IG5hbWVkIHJldmlzaW9uIG9mIGlkZSByZWFycmFuZ2UKKyAqCisgKiAgU29tZSBhZGRpdGlvbmFsIGRyaXZlciBjb21waWxlLXRpbWUgb3B0aW9ucyBhcmUgaW4gLi9pbmNsdWRlL2xpbnV4L2lkZS5oCisgKgorICogIFRvIGRvLCBpbiBsaWtlbHkgb3JkZXIgb2YgY29tcGxldGlvbjoKKyAqCS0gbW9kaWZ5IGtlcm5lbCB0byBvYnRhaW4gQklPUyBnZW9tZXRyeSBmb3IgZHJpdmVzIG9uIDJuZC8zcmQvNHRoIGkvZgorICoKKyAqLworCisjZGVmaW5lCVJFVklTSU9OCSJSZXZpc2lvbjogNy4wMGFscGhhMiIKKyNkZWZpbmUJVkVSU0lPTgkJIklkOiBpZGUuYyA3LjAwYTIgMjAwMjA5MDYiCisKKyN1bmRlZiBSRUFMTFlfU0xPV19JTwkJLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisjZGVmaW5lIF9JREVfQwkJCS8qIFRlbGwgaWRlLmggaXQncyByZWFsbHkgdXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworLyogZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBmYWlsdXJlcyAqLworI2RlZmluZSBJREVfREVGQVVMVF9NQVhfRkFJTFVSRVMgCTEKKworc3RhdGljIGNvbnN0IHU4IGlkZV9od2lmX3RvX21ham9yW10gPSB7IElERTBfTUFKT1IsIElERTFfTUFKT1IsCisJCQkJCUlERTJfTUFKT1IsIElERTNfTUFKT1IsCisJCQkJCUlERTRfTUFKT1IsIElERTVfTUFKT1IsCisJCQkJCUlERTZfTUFKT1IsIElERTdfTUFKT1IsCisJCQkJCUlERThfTUFKT1IsIElERTlfTUFKT1IgfTsKKworc3RhdGljIGludCBpZGVidXNfcGFyYW1ldGVyOwkvKiBob2xkcyB0aGUgImlkZWJ1cz0iIHBhcmFtZXRlciAqLworc3RhdGljIGludCBzeXN0ZW1fYnVzX3NwZWVkOwkvKiBob2xkcyB3aGF0IHdlIHRoaW5rIGlzIFZFU0EvUENJIGJ1cyBzcGVlZCAqLworc3RhdGljIGludCBpbml0aWFsaXppbmc7CS8qIHNldCB3aGlsZSBpbml0aWFsaXppbmcgYnVpbHQtaW4gZHJpdmVycyAqLworCitERUNMQVJFX01VVEVYKGlkZV9jZmdfc2VtKTsKKyBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soaWRlX2xvY2spOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFUENJCitzdGF0aWMgaW50IGlkZV9zY2FuX2RpcmVjdGlvbjsgLyogVEhJUyB3YXMgZm9ybWVybHkgMi4yLnggcGNpPXJldmVyc2UgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lERURNQV9BVVRPCitpbnQgbm9hdXRvZG1hID0gMDsKKyNlbHNlCitpbnQgbm9hdXRvZG1hID0gMTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKG5vYXV0b2RtYSk7CisKKy8qCisgKiBUaGlzIGlzIGRlY2xhcmVkIGV4dGVybiBpbiBpZGUuaCwgZm9yIGFjY2VzcyBieSBvdGhlciBJREUgbW9kdWxlczoKKyAqLworaWRlX2h3aWZfdCBpZGVfaHdpZnNbTUFYX0hXSUZTXTsJLyogbWFzdGVyIGRhdGEgcmVwb3NpdG9yeSAqLworCitFWFBPUlRfU1lNQk9MKGlkZV9od2lmcyk7CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlkZV9kcml2ZXMgPSBMSVNUX0hFQURfSU5JVChpZGVfZHJpdmVzKTsKKworLyoKKyAqIERvIG5vdCBldmVuICp0aGluayogYWJvdXQgY2FsbGluZyB0aGlzIQorICovCitzdGF0aWMgdm9pZCBpbml0X2h3aWZfZGF0YShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHVuaXQ7CisKKwkvKiBidWxrIGluaXRpYWxpemUgaHdpZiAmIGRyaXZlIGluZm8gd2l0aCB6ZXJvcyAqLworCW1lbXNldChod2lmLCAwLCBzaXplb2YoaWRlX2h3aWZfdCkpOworCisJLyogZmlsbCBpbiBhbnkgbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMgKi8KKwlod2lmLT5pbmRleAk9IGluZGV4OworCWh3aWYtPm1ham9yCT0gaWRlX2h3aWZfdG9fbWFqb3JbaW5kZXhdOworCisJaHdpZi0+bmFtZVswXQk9ICdpJzsKKwlod2lmLT5uYW1lWzFdCT0gJ2QnOworCWh3aWYtPm5hbWVbMl0JPSAnZSc7CisJaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OworCisJaHdpZi0+YnVzX3N0YXRlCT0gQlVTU1RBVEVfT047CisKKwlod2lmLT5hdGFwaV9kbWEgPSAwOwkJLyogZGlzYWJsZSBhbGwgYXRhcGkgZG1hICovIAorCWh3aWYtPnVsdHJhX21hc2sgPSAweDgwOwkvKiBkaXNhYmxlIGFsbCB1bHRyYSAqLworCWh3aWYtPm13ZG1hX21hc2sgPSAweDgwOwkvKiBkaXNhYmxlIGFsbCBtd2RtYSAqLworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDgwOwkvKiBkaXNhYmxlIGFsbCBzd2RtYSAqLworCisJc2VtYV9pbml0KCZod2lmLT5nZW5kZXZfcmVsX3NlbSwgMCk7CisKKwlkZWZhdWx0X2h3aWZfaW9wcyhod2lmKTsKKwlkZWZhdWx0X2h3aWZfdHJhbnNwb3J0KGh3aWYpOworCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKworCQlkcml2ZS0+bWVkaWEJCQk9IGlkZV9kaXNrOworCQlkcml2ZS0+c2VsZWN0LmFsbAkJPSAodW5pdDw8NCl8MHhhMDsKKwkJZHJpdmUtPmh3aWYJCQk9IGh3aWY7CisJCWRyaXZlLT5jdGwJCQk9IDB4MDg7CisJCWRyaXZlLT5yZWFkeV9zdGF0CQk9IFJFQURZX1NUQVQ7CisJCWRyaXZlLT5iYWRfd3N0YXQJCT0gQkFEX1dfU1RBVDsKKwkJZHJpdmUtPnNwZWNpYWwuYi5yZWNhbGlicmF0ZQk9IDE7CisJCWRyaXZlLT5zcGVjaWFsLmIuc2V0X2dlb21ldHJ5CT0gMTsKKwkJZHJpdmUtPm5hbWVbMF0JCQk9ICdoJzsKKwkJZHJpdmUtPm5hbWVbMV0JCQk9ICdkJzsKKwkJZHJpdmUtPm5hbWVbMl0JCQk9ICdhJyArIChpbmRleCAqIE1BWF9EUklWRVMpICsgdW5pdDsKKwkJZHJpdmUtPm1heF9mYWlsdXJlcwkJPSBJREVfREVGQVVMVF9NQVhfRkFJTFVSRVM7CisJCWRyaXZlLT51c2luZ19kbWEJCT0gMDsKKwkJZHJpdmUtPmlzX2ZsYXNoCQkJPSAwOworCQlkcml2ZS0+dmRtYQkJCT0gMDsKKwkJSU5JVF9MSVNUX0hFQUQoJmRyaXZlLT5saXN0KTsKKwkJc2VtYV9pbml0KCZkcml2ZS0+Z2VuZGV2X3JlbF9zZW0sIDApOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdF9od2lmX2RlZmF1bHQoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCWh3X3JlZ3NfdCBodzsKKworCW1lbXNldCgmaHcsIDAsIHNpemVvZihod19yZWdzX3QpKTsKKworCWlkZV9pbml0X2h3aWZfcG9ydHMoJmh3LCBpZGVfZGVmYXVsdF9pb19iYXNlKGluZGV4KSwgMCwgJmh3aWYtPmlycSk7CisKKwltZW1jcHkoJmh3aWYtPmh3LCAmaHcsIHNpemVvZihodykpOworCW1lbWNweShod2lmLT5pb19wb3J0cywgaHcuaW9fcG9ydHMsIHNpemVvZihody5pb19wb3J0cykpOworCisJaHdpZi0+bm9wcm9iZSA9ICFod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdOworI2lmZGVmIENPTkZJR19CTEtfREVWX0hECisJaWYgKGh3aWYtPmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0gPT0gSERfREFUQSkKKwkJaHdpZi0+bm9wcm9iZSA9IDE7CS8qIG1heSBiZSBvdmVycmlkZGVuIGJ5IGlkZV9zZXR1cCgpICovCisjZW5kaWYKK30KKworZXh0ZXJuIHZvaWQgaWRlX2FybV9pbml0KHZvaWQpOworCisvKgorICogaW5pdF9pZGVfZGF0YSgpIHNldHMgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBpbnRvIGFsbCBmaWVsZHMKKyAqIG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGh3aWZzIGFuZCBkcml2ZXMsIGJ1dCBvbmx5IG9uIHRoZSBmaXJzdCBjYWxsLgorICogU3Vic2VxdWVudCBjYWxscyBoYXZlIG5vIGVmZmVjdCAodGhleSBkb24ndCB3aXBlIG91dCBhbnl0aGluZykuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vcm1hbGx5IGNhbGxlZCBhdCBkcml2ZXIgaW5pdGlhbGl6YXRpb24gdGltZSwKKyAqIGJ1dCBtYXkgYWxzbyBiZSBjYWxsZWQgTVVDSCBlYXJsaWVyIGR1cmluZyBrZXJuZWwgImNvbW1hbmQtbGluZSIKKyAqIHBhcmFtZXRlciBwcm9jZXNzaW5nLiAgQXMgc3VjaCwgd2UgY2Fubm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgcGFydHMKKyAqIG9mIHRoZSBrZXJuZWwgKHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb24pIHRvIGJlIGZ1bmN0aW9uaW5nIHlldC4KKyAqCisgKiBUaGlzIGlzIHRvbyBiYWQsIGFzIG90aGVyd2lzZSB3ZSBjb3VsZCBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUKKyAqIGlkZV9kcml2ZV90IHN0cnVjdHMgYXMgbmVlZGVkLCByYXRoZXIgdGhhbiBhbHdheXMgY29uc3VtaW5nIG1lbW9yeQorICogZm9yIHRoZSBtYXggcG9zc2libGUgbnVtYmVyIChNQVhfSFdJRlMgKiBNQVhfRFJJVkVTKSBvZiB0aGVtLgorICoKKyAqIEZJWE1FOiBXZSBzaG91bGQgc3R1ZmYgdGhlIHNldHVwIGRhdGEgaW50byBfX2luaXQgYW5kIGNvcHkgdGhlCisgKiByZWxldmFudCBod2lmcy9hbGxvY2F0ZSB0aGVtIHByb3Blcmx5IGR1cmluZyBib290LgorICovCisjZGVmaW5lIE1BR0lDX0NPT0tJRSAweDEyMzQ1Njc4CitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pZGVfZGF0YSAodm9pZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWdpY19jb29raWUgPSBNQUdJQ19DT09LSUU7CisKKwlpZiAobWFnaWNfY29va2llICE9IE1BR0lDX0NPT0tJRSkKKwkJcmV0dXJuOwkJLyogYWxyZWFkeSBpbml0aWFsaXplZCAqLworCW1hZ2ljX2Nvb2tpZSA9IDA7CisKKwkvKiBJbml0aWFsaXNlIGFsbCBpbnRlcmZhY2Ugc3RydWN0dXJlcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkgeworCQlod2lmID0gJmlkZV9od2lmc1tpbmRleF07CisJCWluaXRfaHdpZl9kYXRhKGh3aWYsIGluZGV4KTsKKwkJaW5pdF9od2lmX2RlZmF1bHQoaHdpZiwgaW5kZXgpOworI2lmICFkZWZpbmVkKENPTkZJR19QUEMzMikgfHwgIWRlZmluZWQoQ09ORklHX1BDSSkKKwkJaHdpZi0+aXJxID0gaHdpZi0+aHcuaXJxID0KKwkJCWlkZV9pbml0X2RlZmF1bHRfaXJxKGh3aWYtPmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0pOworI2VuZGlmCisJfQorI2lmZGVmIENPTkZJR19JREVfQVJNCisJaW5pdGlhbGl6aW5nID0gMTsKKwlpZGVfYXJtX2luaXQoKTsKKwlpbml0aWFsaXppbmcgPSAwOworI2VuZGlmCit9CisKKy8qKgorICoJaWRlX3N5c3RlbV9idXNfc3BlZWQJLQlndWVzcyBidXMgc3BlZWQKKyAqCisgKglpZGVfc3lzdGVtX2J1c19zcGVlZCgpIHJldHVybnMgd2hhdCB3ZSB0aGluayBpcyB0aGUgc3lzdGVtIFZFU0EvUENJCisgKglidXMgc3BlZWQgKGluIE1IeikuIFRoaXMgaXMgdXNlZCBmb3IgY2FsY3VsYXRpbmcgaW50ZXJmYWNlIFBJTyB0aW1pbmdzLgorICoJVGhlIGRlZmF1bHQgaXMgNDAgZm9yIGtub3duIFBDSSBzeXN0ZW1zLCA1MCBvdGhlcndpc2UuCisgKglUaGUgImlkZWJ1cz14eCIgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoaXMgdmFsdWUuCisgKglUaGUgYWN0dWFsIHZhbHVlIHRvIGJlIHVzZWQgaXMgY29tcHV0ZWQvZGlzcGxheWVkIHRoZSBmaXJzdCB0aW1lCisgKgl0aHJvdWdoLiBEcml2ZXJzIHNob3VsZCBvbmx5IHVzZSB0aGlzIGFzIGEgbGFzdCByZXNvcnQuCisgKgorICoJUmV0dXJucyBhIGd1ZXNzZWQgc3BlZWQgaW4gTUh6LgorICovCisKK3N0YXRpYyBpbnQgaWRlX3N5c3RlbV9idXNfc3BlZWQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9kZWZhdWx0W10gPSB7CisJCXsgUENJX0RFVklDRShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEKSB9LAorCQl7IH0KKwl9OworI2Vsc2UKKyNkZWZpbmUgcGNpX2RlZmF1bHQgMAorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCWlmICghc3lzdGVtX2J1c19zcGVlZCkgeworCQlpZiAoaWRlYnVzX3BhcmFtZXRlcikgeworCQkJLyogdXNlciBzdXBwbGllZCB2YWx1ZSAqLworCQkJc3lzdGVtX2J1c19zcGVlZCA9IGlkZWJ1c19wYXJhbWV0ZXI7CisJCX0gZWxzZSBpZiAocGNpX2Rldl9wcmVzZW50KHBjaV9kZWZhdWx0KSkgeworCQkJLyogc2FmZSBkZWZhdWx0IHZhbHVlIGZvciBQQ0kgKi8KKwkJCXN5c3RlbV9idXNfc3BlZWQgPSAzMzsKKwkJfSBlbHNlIHsKKwkJCS8qIHNhZmUgZGVmYXVsdCB2YWx1ZSBmb3IgVkVTQSBhbmQgUENJICovCisJCQlzeXN0ZW1fYnVzX3NwZWVkID0gNTA7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlOiBBc3N1bWluZyAlZE1IeiBzeXN0ZW0gYnVzIHNwZWVkICIKKwkJCSJmb3IgUElPIG1vZGVzJXNcbiIsIHN5c3RlbV9idXNfc3BlZWQsCisJCQlpZGVidXNfcGFyYW1ldGVyID8gIiIgOiAiOyBvdmVycmlkZSB3aXRoIGlkZWJ1cz14eCIpOworCX0KKwlyZXR1cm4gc3lzdGVtX2J1c19zcGVlZDsKK30KKworLyoKKyAqCWRyaXZlc19sb2NrIHByb3RlY3RzIHRoZSBsaXN0IG9mIGRyaXZlcywgZHJpdmVyc19sb2NrIHRoZQorICoJbGlzdCBvZiBkcml2ZXJzLiAgQ3VycmVudGx5IG5vYm9keSB0YWtlcyBib3RoIGF0IG9uY2UuCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhkcml2ZXNfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRyaXZlcnNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGRyaXZlcnMpOworCisvKiBJdGVyYXRvciBmb3IgdGhlIGRyaXZlciBsaXN0LiAqLworCitzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJbG9mZl90IGwgPSAqcG9zOworCXNwaW5fbG9jaygmZHJpdmVyc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZkcml2ZXJzKQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBsaXN0X2VudHJ5KHAsIGlkZV9kcml2ZXJfdCwgZHJpdmVycyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gKChpZGVfZHJpdmVyX3QgKil2KS0+ZHJpdmVycy5uZXh0OworCSgqcG9zKSsrOworCXJldHVybiBwPT0mZHJpdmVycyA/IE5VTEwgOiBsaXN0X2VudHJ5KHAsIGlkZV9kcml2ZXJfdCwgZHJpdmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2soJmRyaXZlcnNfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19kcml2ZXIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCWlkZV9kcml2ZXJfdCAqZHJpdmVyID0gdjsKKwlzZXFfcHJpbnRmKG0sICIlcyB2ZXJzaW9uICVzXG4iLCBkcml2ZXItPm5hbWUsIGRyaXZlci0+dmVyc2lvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzZXFfb3BlcmF0aW9ucyBpZGVfZHJpdmVyc19vcCA9IHsKKwkuc3RhcnQJPSBtX3N0YXJ0LAorCS5uZXh0CT0gbV9uZXh0LAorCS5zdG9wCT0gbV9zdG9wLAorCS5zaG93CT0gc2hvd19kcml2ZXIKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lkZV9yb290OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UqIGh3aWZfcmVxdWVzdF9yZWdpb24oaWRlX2h3aWZfdCAqaHdpZiwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHJlcXVlc3RfcmVnaW9uKGFkZHIsIG51bSwgaHdpZi0+bmFtZSk7CisKKwlpZiAoIXJlcykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSS9PIHJlc291cmNlIDB4JWxYLTB4JWxYIG5vdCBmcmVlLlxuIiwKKwkJCQlod2lmLT5uYW1lLCBhZGRyLCBhZGRyK251bS0xKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqCWlkZV9od2lmX3JlcXVlc3RfcmVnaW9ucyAtIHJlcXVlc3QgcmVzb3VyY2VzIGZvciBJREUKKyAqCUBod2lmOiBpbnRlcmZhY2UgdG8gdXNlCisgKgorICoJUmVxdWVzdHMgYWxsIHRoZSBuZWVkZWQgcmVzb3VyY2VzIGZvciBhbiBpbnRlcmZhY2UuCisgKglSaWdodCBub3cgY29yZSBJREUgY29kZSBkb2VzIHRoaXMgd29yayB3aGljaCBpcyBkZWVwbHkgd3JvbmcuCisgKglNTUlPIGxlYXZlcyBpdCB0byB0aGUgY29udHJvbGxlciBkcml2ZXIsCisgKglQSU8gd2lsbCBtaWdyYXRlIHRoaXMgd2F5IG92ZXIgdGltZS4KKyAqLworCitpbnQgaWRlX2h3aWZfcmVxdWVzdF9yZWdpb25zKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGh3aWYtPm1taW8gPT0gMikKKwkJcmV0dXJuIDA7CisJQlVHX09OKGh3aWYtPm1taW8gPT0gMSk7CisJYWRkciA9IGh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF07CisJaWYgKGFkZHIgJiYgIWh3aWZfcmVxdWVzdF9yZWdpb24oaHdpZiwgYWRkciwgMSkpCisJCWdvdG8gY29udHJvbF9yZWdpb25fYnVzeTsKKwlod2lmLT5zdHJhaWdodDggPSAwOworCWFkZHIgPSBod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdOworCWlmICgoYWRkciB8IDcpID09IGh3aWYtPmlvX3BvcnRzW0lERV9TVEFUVVNfT0ZGU0VUXSkgeworCQlpZiAoIWh3aWZfcmVxdWVzdF9yZWdpb24oaHdpZiwgYWRkciwgOCkpCisJCQlnb3RvIGRhdGFfcmVnaW9uX2J1c3k7CisJCWh3aWYtPnN0cmFpZ2h0OCA9IDE7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSBJREVfREFUQV9PRkZTRVQ7IGkgPD0gSURFX1NUQVRVU19PRkZTRVQ7IGkrKykgeworCQlhZGRyID0gaHdpZi0+aW9fcG9ydHNbaV07CisJCWlmICghaHdpZl9yZXF1ZXN0X3JlZ2lvbihod2lmLCBhZGRyLCAxKSkgeworCQkJd2hpbGUgKC0taSkKKwkJCQlyZWxlYXNlX3JlZ2lvbihhZGRyLCAxKTsKKwkJCWdvdG8gZGF0YV9yZWdpb25fYnVzeTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZGF0YV9yZWdpb25fYnVzeToKKwlhZGRyID0gaHdpZi0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXTsKKwlpZiAoYWRkcikKKwkJcmVsZWFzZV9yZWdpb24oYWRkciwgMSk7Citjb250cm9sX3JlZ2lvbl9idXN5OgorCS8qIElmIGFueSBlcnJvcnMgYXJlIHJldHVybiwgd2UgZHJvcCB0aGUgaHdpZiBpbnRlcmZhY2UuICovCisJcmV0dXJuIC1FQlVTWTsKK30KKworLyoqCisgKglpZGVfaHdpZl9yZWxlYXNlX3JlZ2lvbnMgLSBmcmVlIElERSByZXNvdXJjZXMKKyAqCisgKglOb3RlIHRoYXQgd2Ugb25seSByZWxlYXNlIHRoZSBzdGFuZGFyZCBwb3J0cywKKyAqCWFuZCBkbyBub3QgZXZlbiB0cnkgdG8gaGFuZGxlIGFueSBleHRyYSBwb3J0cworICoJYWxsb2NhdGVkIGZvciB3ZWlyZCBJREUgaW50ZXJmYWNlIGNoaXBzZXRzLgorICoKKyAqCU5vdGUgYWxzbyB0aGF0IHdlIGRvbid0IHlldCBoYW5kbGUgbW1pbyByZXNvdXJjZXMgaGVyZS4gTW9yZQorICoJaW1wb3J0YW50bHkgb3VyIGNhbGxlciBzaG91bGQgYmUgZG9pbmcgdGhpcyBzbyB3ZSBuZWVkIHRvIAorICoJcmVzdHJ1Y3R1cmUgdGhpcyBhcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZHJpdmVycy4KKyAqLworCit2b2lkIGlkZV9od2lmX3JlbGVhc2VfcmVnaW9ucyhpZGVfaHdpZl90ICpod2lmKQoreworCXUzMiBpID0gMDsKKworCWlmIChod2lmLT5tbWlvID09IDIpCisJCXJldHVybjsKKwlpZiAoaHdpZi0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSkKKwkJcmVsZWFzZV9yZWdpb24oaHdpZi0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSwgMSk7CisJaWYgKGh3aWYtPnN0cmFpZ2h0OCkgeworCQlyZWxlYXNlX3JlZ2lvbihod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdLCA4KTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSBJREVfREFUQV9PRkZTRVQ7IGkgPD0gSURFX1NUQVRVU19PRkZTRVQ7IGkrKykKKwkJaWYgKGh3aWYtPmlvX3BvcnRzW2ldKQorCQkJcmVsZWFzZV9yZWdpb24oaHdpZi0+aW9fcG9ydHNbaV0sIDEpOworfQorCisvKioKKyAqCWlkZV9od2lmX3Jlc3RvcmUJLQlyZXN0b3JlIGh3aWYgdG8gdGVtcGxhdGUKKyAqCUBod2lmOiBod2lmIHRvIHVwZGF0ZQorICoJQHRtcF9od2lmOiB0ZW1wbGF0ZQorICoKKyAqCVJlc3RvcmUgaHdpZiB0byBhIHByZXZpb3VzIHN0YXRlIGJ5IGNvcHlpbmcgbW9zdCBzZXR0bmdzCisgKglmcm9tIHRoZSB0ZW1wbGF0ZS4KKyAqLworCitzdGF0aWMgdm9pZCBpZGVfaHdpZl9yZXN0b3JlKGlkZV9od2lmX3QgKmh3aWYsIGlkZV9od2lmX3QgKnRtcF9od2lmKQoreworCWh3aWYtPmh3Z3JvdXAJCQk9IHRtcF9od2lmLT5od2dyb3VwOworCisJaHdpZi0+Z2VuZGV2LnBhcmVudAkJPSB0bXBfaHdpZi0+Z2VuZGV2LnBhcmVudDsKKworCWh3aWYtPnByb2MJCQk9IHRtcF9od2lmLT5wcm9jOworCisJaHdpZi0+bWFqb3IJCQk9IHRtcF9od2lmLT5tYWpvcjsKKwlod2lmLT5zdHJhaWdodDgJCQk9IHRtcF9od2lmLT5zdHJhaWdodDg7CisJaHdpZi0+YnVzX3N0YXRlCQkJPSB0bXBfaHdpZi0+YnVzX3N0YXRlOworCisJaHdpZi0+YXRhcGlfZG1hCQkJPSB0bXBfaHdpZi0+YXRhcGlfZG1hOworCWh3aWYtPnVsdHJhX21hc2sJCT0gdG1wX2h3aWYtPnVsdHJhX21hc2s7CisJaHdpZi0+bXdkbWFfbWFzawkJPSB0bXBfaHdpZi0+bXdkbWFfbWFzazsKKwlod2lmLT5zd2RtYV9tYXNrCQk9IHRtcF9od2lmLT5zd2RtYV9tYXNrOworCisJaHdpZi0+Y2hpcHNldAkJCT0gdG1wX2h3aWYtPmNoaXBzZXQ7CisJaHdpZi0+aG9sZAkJCT0gdG1wX2h3aWYtPmhvbGQ7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVQQ0kKKwlod2lmLT5wY2lfZGV2CQkJPSB0bXBfaHdpZi0+cGNpX2RldjsKKwlod2lmLT5jZHMJCQk9IHRtcF9od2lmLT5jZHM7CisjZW5kaWYKKworCWh3aWYtPnR1bmVwcm9jCQkJPSB0bXBfaHdpZi0+dHVuZXByb2M7CisJaHdpZi0+c3BlZWRwcm9jCQkJPSB0bXBfaHdpZi0+c3BlZWRwcm9jOworCWh3aWYtPnNlbGVjdHByb2MJCT0gdG1wX2h3aWYtPnNlbGVjdHByb2M7CisJaHdpZi0+cmVzZXRfcG9sbAkJPSB0bXBfaHdpZi0+cmVzZXRfcG9sbDsKKwlod2lmLT5wcmVfcmVzZXQJCQk9IHRtcF9od2lmLT5wcmVfcmVzZXQ7CisJaHdpZi0+cmVzZXRwcm9jCQkJPSB0bXBfaHdpZi0+cmVzZXRwcm9jOworCWh3aWYtPmludHJwcm9jCQkJPSB0bXBfaHdpZi0+aW50cnByb2M7CisJaHdpZi0+bWFza3Byb2MJCQk9IHRtcF9od2lmLT5tYXNrcHJvYzsKKwlod2lmLT5xdWlya3Byb2MJCQk9IHRtcF9od2lmLT5xdWlya3Byb2M7CisJaHdpZi0+YnVzcHJvYwkJCT0gdG1wX2h3aWYtPmJ1c3Byb2M7CisKKwlod2lmLT5hdGFfaW5wdXRfZGF0YQkJPSB0bXBfaHdpZi0+YXRhX2lucHV0X2RhdGE7CisJaHdpZi0+YXRhX291dHB1dF9kYXRhCQk9IHRtcF9od2lmLT5hdGFfb3V0cHV0X2RhdGE7CisJaHdpZi0+YXRhcGlfaW5wdXRfYnl0ZXMJCT0gdG1wX2h3aWYtPmF0YXBpX2lucHV0X2J5dGVzOworCWh3aWYtPmF0YXBpX291dHB1dF9ieXRlcwk9IHRtcF9od2lmLT5hdGFwaV9vdXRwdXRfYnl0ZXM7CisKKwlod2lmLT5kbWFfc2V0dXAJCQk9IHRtcF9od2lmLT5kbWFfc2V0dXA7CisJaHdpZi0+ZG1hX2V4ZWNfY21kCQk9IHRtcF9od2lmLT5kbWFfZXhlY19jbWQ7CisJaHdpZi0+ZG1hX3N0YXJ0CQkJPSB0bXBfaHdpZi0+ZG1hX3N0YXJ0OworCWh3aWYtPmlkZV9kbWFfZW5kCQk9IHRtcF9od2lmLT5pZGVfZG1hX2VuZDsKKwlod2lmLT5pZGVfZG1hX2NoZWNrCQk9IHRtcF9od2lmLT5pZGVfZG1hX2NoZWNrOworCWh3aWYtPmlkZV9kbWFfb24JCT0gdG1wX2h3aWYtPmlkZV9kbWFfb247CisJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseQk9IHRtcF9od2lmLT5pZGVfZG1hX29mZl9xdWlldGx5OworCWh3aWYtPmlkZV9kbWFfdGVzdF9pcnEJCT0gdG1wX2h3aWYtPmlkZV9kbWFfdGVzdF9pcnE7CisJaHdpZi0+aWRlX2RtYV9ob3N0X29uCQk9IHRtcF9od2lmLT5pZGVfZG1hX2hvc3Rfb247CisJaHdpZi0+aWRlX2RtYV9ob3N0X29mZgkJPSB0bXBfaHdpZi0+aWRlX2RtYV9ob3N0X29mZjsKKwlod2lmLT5pZGVfZG1hX2xvc3RpcnEJCT0gdG1wX2h3aWYtPmlkZV9kbWFfbG9zdGlycTsKKwlod2lmLT5pZGVfZG1hX3RpbWVvdXQJCT0gdG1wX2h3aWYtPmlkZV9kbWFfdGltZW91dDsKKworCWh3aWYtPk9VVEIJCQk9IHRtcF9od2lmLT5PVVRCOworCWh3aWYtPk9VVEJTWU5DCQkJPSB0bXBfaHdpZi0+T1VUQlNZTkM7CisJaHdpZi0+T1VUVwkJCT0gdG1wX2h3aWYtPk9VVFc7CisJaHdpZi0+T1VUTAkJCT0gdG1wX2h3aWYtPk9VVEw7CisJaHdpZi0+T1VUU1cJCQk9IHRtcF9od2lmLT5PVVRTVzsKKwlod2lmLT5PVVRTTAkJCT0gdG1wX2h3aWYtPk9VVFNMOworCisJaHdpZi0+SU5CCQkJPSB0bXBfaHdpZi0+SU5COworCWh3aWYtPklOVwkJCT0gdG1wX2h3aWYtPklOVzsKKwlod2lmLT5JTkwJCQk9IHRtcF9od2lmLT5JTkw7CisJaHdpZi0+SU5TVwkJCT0gdG1wX2h3aWYtPklOU1c7CisJaHdpZi0+SU5TTAkJCT0gdG1wX2h3aWYtPklOU0w7CisKKwlod2lmLT5zZ19tYXhfbmVudHMJCT0gdG1wX2h3aWYtPnNnX21heF9uZW50czsKKworCWh3aWYtPm1taW8JCQk9IHRtcF9od2lmLT5tbWlvOworCWh3aWYtPnJxc2l6ZQkJCT0gdG1wX2h3aWYtPnJxc2l6ZTsKKwlod2lmLT5ub19sYmE0OAkJCT0gdG1wX2h3aWYtPm5vX2xiYTQ4OworCisjaWZuZGVmIENPTkZJR19CTEtfREVWX0lERUNTCisJaHdpZi0+aXJxCQkJPSB0bXBfaHdpZi0+aXJxOworI2VuZGlmCisKKwlod2lmLT5kbWFfYmFzZQkJCT0gdG1wX2h3aWYtPmRtYV9iYXNlOworCWh3aWYtPmRtYV9tYXN0ZXIJCT0gdG1wX2h3aWYtPmRtYV9tYXN0ZXI7CisJaHdpZi0+ZG1hX2NvbW1hbmQJCT0gdG1wX2h3aWYtPmRtYV9jb21tYW5kOworCWh3aWYtPmRtYV92ZW5kb3IxCQk9IHRtcF9od2lmLT5kbWFfdmVuZG9yMTsKKwlod2lmLT5kbWFfc3RhdHVzCQk9IHRtcF9od2lmLT5kbWFfc3RhdHVzOworCWh3aWYtPmRtYV92ZW5kb3IzCQk9IHRtcF9od2lmLT5kbWFfdmVuZG9yMzsKKwlod2lmLT5kbWFfcHJkdGFibGUJCT0gdG1wX2h3aWYtPmRtYV9wcmR0YWJsZTsKKworCWh3aWYtPmRtYV9leHRyYQkJCT0gdG1wX2h3aWYtPmRtYV9leHRyYTsKKwlod2lmLT5jb25maWdfZGF0YQkJPSB0bXBfaHdpZi0+Y29uZmlnX2RhdGE7CisJaHdpZi0+c2VsZWN0X2RhdGEJCT0gdG1wX2h3aWYtPnNlbGVjdF9kYXRhOworCWh3aWYtPmF1dG9kbWEJCQk9IHRtcF9od2lmLT5hdXRvZG1hOworCWh3aWYtPnVkbWFfZm91cgkJCT0gdG1wX2h3aWYtPnVkbWFfZm91cjsKKwlod2lmLT5ub19kc2MJCQk9IHRtcF9od2lmLT5ub19kc2M7CisKKwlod2lmLT5od2lmX2RhdGEJCQk9IHRtcF9od2lmLT5od2lmX2RhdGE7Cit9CisKKy8qKgorICoJaWRlX3VucmVnaXN0ZXIJCS0JZnJlZSBhbiBpZGUgaW50ZXJmYWNlCisgKglAaW5kZXg6IGluZGV4IG9mIGludGVyZmFjZSAod2lsbCBjaGFuZ2Ugc29vbiB0byBhIHBvaW50ZXIpCisgKgorICoJUGVyZm9ybSB0aGUgZmluYWwgdW5yZWdpc3RlciBvZiBhbiBJREUgaW50ZXJmYWNlLiBBdCB0aGUgbW9tZW50CisgKgl3ZSBkb24ndCByZWZjb3VudCBpbnRlcmZhY2VzIHNvIHRoaXMgd2lsbCBhbHNvIGdldCBzcGxpdCB1cC4KKyAqCisgKglMb2NraW5nOgorICoJVGhlIGNhbGxlciBtdXN0IG5vdCBob2xkIHRoZSBJREUgbG9ja3MKKyAqCVRoZSBkcml2ZSBwcmVzZW50L3ZhbmlzaGluZyBpcyBub3QgeWV0IHByb3Blcmx5IGxvY2tlZAorICoJVGFrZSBjYXJlIHdpdGggdGhlIGNhbGxiYWNrcy4gVGhlc2UgaGF2ZSBiZWVuIHNwbGl0IHRvIGF2b2lkCisgKglkZWFkbG9ja2luZyB0aGUgSURFIGxheWVyLiBUaGUgc2h1dGRvd24gY2FsbGJhY2sgaXMgY2FsbGVkCisgKgliZWZvcmUgd2UgdGFrZSB0aGUgbG9jayBhbmQgZnJlZSByZXNvdXJjZXMuIEl0IGlzIHVwIHRvIHRoZQorICoJY2FsbGVyIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gcGVuZGluZyBJL08gaGVyZSwgYW5kIHRoYXQKKyAqCXRoZSBpbnRlcmZjZSB3aWxsIG5vdCBiZSByZW9wZW5lZCAocHJlc2VudC92YW5pc2hpbmcgbG9ja2luZworICoJaXNudCB5ZXQgZG9uZSBidHcpLiBBZnRlciB3ZSBjb21taXQgdG8gdGhlIGZpbmFsIGtpbGwgd2UKKyAqCWNhbGwgdGhlIGNsZWFudXAgY2FsbGJhY2sgd2l0aCB0aGUgaWRlIGxvY2tzIGhlbGQuCisgKgorICoJVW5yZWdpc3RlciByZXN0b3JlcyB0aGUgaHdpZiBzdHJ1Y3R1cmVzIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICoJVGhpcyBpcyByYXZpbmcgYm9ua2Vycy4KKyAqLworCit2b2lkIGlkZV91bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaWRlX2h3aWZfdCAqaHdpZiwgKmc7CisJc3RhdGljIGlkZV9od2lmX3QgdG1wX2h3aWY7IC8qIHByb3RlY3RlZCBieSBpZGVfY2ZnX3NlbSAqLworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXA7CisJaW50IGlycV9jb3VudCA9IDAsIHVuaXQsIGk7CisKKwlCVUdfT04oaW5kZXggPj0gTUFYX0hXSUZTKTsKKworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisJQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7CisJZG93bigmaWRlX2NmZ19zZW0pOworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwlod2lmID0gJmlkZV9od2lmc1tpbmRleF07CisJaWYgKCFod2lmLT5wcmVzZW50KQorCQlnb3RvIGFib3J0OworCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKKwkJZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCQlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQkJY29udGludWU7CisJCWlmIChkcml2ZS0+dXNhZ2UgfHwgRFJJVkVSKGRyaXZlKS0+YnVzeSkKKwkJCWdvdG8gYWJvcnQ7CisJCWRyaXZlLT5kZWFkID0gMTsKKwl9CisJaHdpZi0+cHJlc2VudCA9IDA7CisKKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKworCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKKwkJZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCQlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQkJY29udGludWU7CisJCURSSVZFUihkcml2ZSktPmNsZWFudXAoZHJpdmUpOworCX0KKworCWRlc3Ryb3lfcHJvY19pZGVfaW50ZXJmYWNlKGh3aWYpOworCisJaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CisJLyoKKwkgKiBmcmVlIHRoZSBpcnEgaWYgd2Ugd2VyZSB0aGUgb25seSBod2lmIHVzaW5nIGl0CisJICovCisJZyA9IGh3Z3JvdXAtPmh3aWY7CisJZG8geworCQlpZiAoZy0+aXJxID09IGh3aWYtPmlycSkKKwkJCSsraXJxX2NvdW50OworCQlnID0gZy0+bmV4dDsKKwl9IHdoaWxlIChnICE9IGh3Z3JvdXAtPmh3aWYpOworCWlmIChpcnFfY291bnQgPT0gMSkKKwkJZnJlZV9pcnEoaHdpZi0+aXJxLCBod2dyb3VwKTsKKworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBvbmx5IHJlbGVhc2UgdGhlIHN0YW5kYXJkIHBvcnRzLAorCSAqIGFuZCBkbyBub3QgZXZlbiB0cnkgdG8gaGFuZGxlIGFueSBleHRyYSBwb3J0cworCSAqIGFsbG9jYXRlZCBmb3Igd2VpcmQgSURFIGludGVyZmFjZSBjaGlwc2V0cy4KKwkgKi8KKwlpZGVfaHdpZl9yZWxlYXNlX3JlZ2lvbnMoaHdpZik7CisKKwkvKgorCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBod2dyb3VwLCBhbmQgZnJlZQorCSAqIHRoZSBod2dyb3VwIGlmIHdlIHdlcmUgdGhlIG9ubHkgbWVtYmVyCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7ICsraSkgeworCQlkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07CisJCWlmIChkcml2ZS0+ZGV2ZnNfbmFtZVswXSAhPSAnXDAnKSB7CisJCQlkZXZmc19yZW1vdmUoZHJpdmUtPmRldmZzX25hbWUpOworCQkJZHJpdmUtPmRldmZzX25hbWVbMF0gPSAnXDAnOworCQl9CisJCWlmICghZHJpdmUtPnByZXNlbnQpCisJCQljb250aW51ZTsKKwkJaWYgKGRyaXZlID09IGRyaXZlLT5uZXh0KSB7CisJCQkvKiBzcGVjaWFsIGNhc2U6IGxhc3QgZHJpdmUgZnJvbSBod2dyb3VwLiAqLworCQkJQlVHX09OKGh3Z3JvdXAtPmRyaXZlICE9IGRyaXZlKTsKKwkJCWh3Z3JvdXAtPmRyaXZlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlkZV9kcml2ZV90ICp3YWxrOworCisJCQl3YWxrID0gaHdncm91cC0+ZHJpdmU7CisJCQl3aGlsZSAod2Fsay0+bmV4dCAhPSBkcml2ZSkKKwkJCQl3YWxrID0gd2Fsay0+bmV4dDsKKwkJCXdhbGstPm5leHQgPSBkcml2ZS0+bmV4dDsKKwkJCWlmIChod2dyb3VwLT5kcml2ZSA9PSBkcml2ZSkgeworCQkJCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmUtPm5leHQ7CisJCQkJaHdncm91cC0+aHdpZiA9IEhXSUYoaHdncm91cC0+ZHJpdmUpOworCQkJfQorCQl9CisJCUJVR19PTihod2dyb3VwLT5kcml2ZSA9PSBkcml2ZSk7CisJCWlmIChkcml2ZS0+aWQgIT0gTlVMTCkgeworCQkJa2ZyZWUoZHJpdmUtPmlkKTsKKwkJCWRyaXZlLT5pZCA9IE5VTEw7CisJCX0KKwkJZHJpdmUtPnByZXNlbnQgPSAwOworCQkvKiBNZXNzZWQgdXAgbG9ja2luZyAuLi4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJCWJsa19jbGVhbnVwX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7CisJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKKwkJZG93bigmZHJpdmUtPmdlbmRldl9yZWxfc2VtKTsKKwkJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCQlkcml2ZS0+cXVldWUgPSBOVUxMOworCX0KKwlpZiAoaHdpZi0+bmV4dCA9PSBod2lmKSB7CisJCUJVR19PTihod2dyb3VwLT5od2lmICE9IGh3aWYpOworCQlrZnJlZShod2dyb3VwKTsKKwl9IGVsc2UgeworCQkvKiBUaGVyZSBpcyBhbm90aGVyIGludGVyZmFjZSBpbiBod2dyb3VwLgorCQkgKiBVbmxpbmsgdXMsIGFuZCBzZXQgaHdncm91cC0+ZHJpdmUgYW5kIC0+aHdpZiB0bworCQkgKiBzb21ldGhpbmcgc2FuZS4KKwkJICovCisJCWcgPSBod2dyb3VwLT5od2lmOworCQl3aGlsZSAoZy0+bmV4dCAhPSBod2lmKQorCQkJZyA9IGctPm5leHQ7CisJCWctPm5leHQgPSBod2lmLT5uZXh0OworCQlpZiAoaHdncm91cC0+aHdpZiA9PSBod2lmKSB7CisJCQkvKiBDaG9zZSBhIHJhbmRvbSBod2lmIGZvciBod2dyb3VwLT5od2lmLgorCQkJICogSXQncyBndWFyYW50ZWVkIHRoYXQgdGhlcmUgYXJlIG5vIGRyaXZlcworCQkJICogbGVmdCBpbiB0aGUgaHdncm91cC4KKwkJCSAqLworCQkJQlVHX09OKGh3Z3JvdXAtPmRyaXZlICE9IE5VTEwpOworCQkJaHdncm91cC0+aHdpZiA9IGc7CisJCX0KKwkJQlVHX09OKGh3Z3JvdXAtPmh3aWYgPT0gaHdpZik7CisJfQorCisJLyogTW9yZSBtZXNzZWQgdXAgbG9ja2luZyAuLi4gKi8KKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKKwlkb3duKCZod2lmLT5nZW5kZXZfcmVsX3NlbSk7CisKKwkvKgorCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBrZXJuZWwncyBrbm93bGVkZ2UKKwkgKi8KKwlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoaHdpZi0+bWFqb3IsIDApLCBNQVhfRFJJVkVTPDxQQVJUTl9CSVRTKTsKKwlrZnJlZShod2lmLT5zZ190YWJsZSk7CisJdW5yZWdpc3Rlcl9ibGtkZXYoaHdpZi0+bWFqb3IsIGh3aWYtPm5hbWUpOworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKworCWlmIChod2lmLT5kbWFfYmFzZSkgeworCQkodm9pZCkgaWRlX3JlbGVhc2VfZG1hKGh3aWYpOworCisJCWh3aWYtPmRtYV9iYXNlID0gMDsKKwkJaHdpZi0+ZG1hX21hc3RlciA9IDA7CisJCWh3aWYtPmRtYV9jb21tYW5kID0gMDsKKwkJaHdpZi0+ZG1hX3ZlbmRvcjEgPSAwOworCQlod2lmLT5kbWFfc3RhdHVzID0gMDsKKwkJaHdpZi0+ZG1hX3ZlbmRvcjMgPSAwOworCQlod2lmLT5kbWFfcHJkdGFibGUgPSAwOworCX0KKworCS8qIGNvcHkgb3JpZ2luYWwgc2V0dGluZ3MgKi8KKwl0bXBfaHdpZiA9ICpod2lmOworCisJLyogcmVzdG9yZSBod2lmIGRhdGEgdG8gcHJpc3RpbmUgc3RhdHVzICovCisJaW5pdF9od2lmX2RhdGEoaHdpZiwgaW5kZXgpOworCWluaXRfaHdpZl9kZWZhdWx0KGh3aWYsIGluZGV4KTsKKworCWlkZV9od2lmX3Jlc3RvcmUoaHdpZiwgJnRtcF9od2lmKTsKKworYWJvcnQ6CisJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJdXAoJmlkZV9jZmdfc2VtKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfdW5yZWdpc3Rlcik7CisKKworLyoqCisgKglpZGVfc2V0dXBfcG9ydHMgCS0Jc2V0IHVwIElERSBpbnRlcmZhY2UgcG9ydHMKKyAqCUBodzogcmVnaXN0ZXIgZGVzY3JpcHRpb25zCisgKglAYmFzZTogYmFzZSByZWdpc3RlcgorICoJQG9mZnNldHM6IHRhYmxlIG9mIHJlZ2lzdGVyIG9mZnNldHMKKyAqCUBjdHJsOiBjb250cm9sIHJlZ2lzdGVyCisgKglAYWNrX2lycTogSVJRIGFjaworICoJQGlycTogaW50ZXJydXB0IGxpZQorICoKKyAqCVNldHVwIGh3X3JlZ3NfdCBzdHJ1Y3R1cmUgZGVzY3JpYmVkIGJ5IHBhcmFtZXRlcnMuICBZb3UKKyAqCW1heSBzZXQgdXAgdGhlIGh3IHN0cnVjdHVyZSB5b3Vyc2VsZiBPUiB1c2UgdGhpcyByb3V0aW5lIHRvCisgKglkbyBpdCBmb3IgeW91LiBUaGlzIGlzIGJhc2ljYWxseSBhIGhlbHBlcgorICoKKyAqLworIAordm9pZCBpZGVfc2V0dXBfcG9ydHMgKAlod19yZWdzX3QgKmh3LAorCQkJdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgKm9mZnNldHMsCisJCQl1bnNpZ25lZCBsb25nIGN0cmwsIHVuc2lnbmVkIGxvbmcgaW50ciwKKwkJCWlkZV9hY2tfaW50cl90ICphY2tfaW50ciwKKy8qCisgKgkJCWlkZV9pb19vcHNfdCAqaW9wcywKKyAqLworCQkJaW50IGlycSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJREVfTlJfUE9SVFM7IGkrKykgeworCQlpZiAob2Zmc2V0c1tpXSA9PSAtMSkgeworCQkJc3dpdGNoKGkpIHsKKwkJCQljYXNlIElERV9DT05UUk9MX09GRlNFVDoKKwkJCQkJaHctPmlvX3BvcnRzW2ldID0gY3RybDsKKwkJCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfQU1JR0EpIHx8IGRlZmluZWQoQ09ORklHX01BQykKKwkJCQljYXNlIElERV9JUlFfT0ZGU0VUOgorCQkJCQlody0+aW9fcG9ydHNbaV0gPSBpbnRyOworCQkJCQlicmVhazsKKyNlbmRpZiAvKiAoQ09ORklHX0FNSUdBKSB8fCAoQ09ORklHX01BQykgKi8KKwkJCQlkZWZhdWx0OgorCQkJCQlody0+aW9fcG9ydHNbaV0gPSAwOworCQkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh3LT5pb19wb3J0c1tpXSA9IGJhc2UgKyBvZmZzZXRzW2ldOworCQl9CisJfQorCWh3LT5pcnEgPSBpcnE7CisJaHctPmRtYSA9IE5PX0RNQTsKKwlody0+YWNrX2ludHIgPSBhY2tfaW50cjsKKy8qCisgKglody0+aW9wcyA9IGlvcHM7CisgKi8KK30KKworLyoqCisgKglpZGVfcmVnaXN0ZXJfaHdfd2l0aF9maXh1cAktCXJlZ2lzdGVyIElERSBpbnRlcmZhY2UKKyAqCUBodzogaGFyZHdhcmUgcmVnaXN0ZXJzCisgKglAaHdpZnA6IHBvaW50ZXIgdG8gcmV0dXJuZWQgaHdpZgorICoJQGZpeHVwOiBmaXh1cCBmdW5jdGlvbgorICoKKyAqCVJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UsIHNwZWNpZnlpbmcgZXhhY3RseSB0aGUgcmVnaXN0ZXJzIGV0Yy4KKyAqCVNldCBpbml0PTEgaWZmIGNhbGxpbmcgYmVmb3JlIHByb2JlcyBoYXZlIHRha2VuIHBsYWNlLgorICoKKyAqCVJldHVybnMgLTEgb24gZXJyb3IuCisgKi8KKworaW50IGlkZV9yZWdpc3Rlcl9od193aXRoX2ZpeHVwKGh3X3JlZ3NfdCAqaHcsIGlkZV9od2lmX3QgKipod2lmcCwgdm9pZCgqZml4dXApKGlkZV9od2lmX3QgKmh3aWYpKQoreworCWludCBpbmRleCwgcmV0cnkgPSAxOworCWlkZV9od2lmX3QgKmh3aWY7CisKKwlkbyB7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgKytpbmRleCkgeworCQkJaHdpZiA9ICZpZGVfaHdpZnNbaW5kZXhdOworCQkJaWYgKGh3aWYtPmh3LmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0gPT0gaHctPmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0pCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfSFdJRlM7ICsraW5kZXgpIHsKKwkJCWh3aWYgPSAmaWRlX2h3aWZzW2luZGV4XTsKKwkJCWlmIChod2lmLT5ob2xkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCghaHdpZi0+cHJlc2VudCAmJiAhaHdpZi0+bWF0ZSAmJiAhaW5pdGlhbGl6aW5nKSB8fAorCQkJICAgICghaHdpZi0+aHcuaW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSAmJiBpbml0aWFsaXppbmcpKQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0hXSUZTOyBpbmRleCsrKQorCQkJaWRlX3VucmVnaXN0ZXIoaW5kZXgpOworCX0gd2hpbGUgKHJldHJ5LS0pOworCXJldHVybiAtMTsKK2ZvdW5kOgorCWlmIChod2lmLT5wcmVzZW50KQorCQlpZGVfdW5yZWdpc3RlcihpbmRleCk7CisJZWxzZSBpZiAoIWh3aWYtPmhvbGQpIHsKKwkJaW5pdF9od2lmX2RhdGEoaHdpZiwgaW5kZXgpOworCQlpbml0X2h3aWZfZGVmYXVsdChod2lmLCBpbmRleCk7CisJfQorCWlmIChod2lmLT5wcmVzZW50KQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KCZod2lmLT5odywgaHcsIHNpemVvZigqaHcpKTsKKwltZW1jcHkoaHdpZi0+aW9fcG9ydHMsIGh3aWYtPmh3LmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aHcuaW9fcG9ydHMpKTsKKwlod2lmLT5pcnEgPSBody0+aXJxOworCWh3aWYtPm5vcHJvYmUgPSAwOworCWh3aWYtPmNoaXBzZXQgPSBody0+Y2hpcHNldDsKKworCWlmICghaW5pdGlhbGl6aW5nKSB7CisJCXByb2JlX2h3aWZfaW5pdF93aXRoX2ZpeHVwKGh3aWYsIGZpeHVwKTsKKwkJY3JlYXRlX3Byb2NfaWRlX2ludGVyZmFjZXMoKTsKKwl9CisKKwlpZiAoaHdpZnApCisJCSpod2lmcCA9IGh3aWY7CisKKwlyZXR1cm4gKGluaXRpYWxpemluZyB8fCBod2lmLT5wcmVzZW50KSA/IGluZGV4IDogLTE7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX3JlZ2lzdGVyX2h3X3dpdGhfZml4dXApOworCitpbnQgaWRlX3JlZ2lzdGVyX2h3KGh3X3JlZ3NfdCAqaHcsIGlkZV9od2lmX3QgKipod2lmcCkKK3sKKwlyZXR1cm4gaWRlX3JlZ2lzdGVyX2h3X3dpdGhfZml4dXAoaHcsIGh3aWZwLCBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfcmVnaXN0ZXJfaHcpOworCisvKgorICoJTG9ja3MgZm9yIElERSBzZXR0aW5nIGZ1bmN0aW9uYWxpdHkKKyAqLworCitERUNMQVJFX01VVEVYKGlkZV9zZXR0aW5nX3NlbSk7CisKKy8qKgorICoJX19pZGVfYWRkX3NldHRpbmcJLQlhZGQgYW4gaWRlIHNldHRpbmcgb3B0aW9uCisgKglAZHJpdmU6IGRyaXZlIHRvIHVzZQorICoJQG5hbWU6IHNldHRpbmcgbmFtZQorICoJQHJ3OiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBpcyByZWFkIHdyaXRlCisgKglAcmVhZF9pb2N0bDogZnVuY3Rpb24gdG8gY2FsbCBvbiByZWFkCisgKglAd3JpdGVfaW9jdGw6IGZ1bmN0aW9uIHRvIGNhbGwgb24gd3JpdGUKKyAqCUBkYXRhX3R5cGU6IHR5cGUgb2YgZGF0YQorICoJQG1pbjogcmFuZ2UgbWluaW11bQorICoJQG1heDogcmFuZ2UgbWF4aW11bQorICoJQG11bF9mYWN0b3I6IG11bHRpcGxpY2F0aW9uIHNjYWxlCisgKglAZGl2X2ZhY3RvcjogZGl2aXNvbiBzY2FsZQorICoJQGRhdGE6IHByaXZhdGUgZGF0YSBmaWVsZAorICoJQHNldDogc2V0dGluZworICoJQGF1dG9fcmVtb3ZlOiBzZXR0aW5nIGF1dG8gcmVtb3ZhbCBmbGFnCisgKgorICoJUmVtb3ZlcyB0aGUgc2V0dGluZyBuYW1lZCBmcm9tIHRoZSBkZXZpY2UgaWYgaXQgaXMgcHJlc2VudC4KKyAqCVRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgc2V0dGluZ3NfbG9jayB0byBwcm90ZWN0IGFnYWluc3QgCisgKglwYXJhbGxlbCBjaGFuZ2VzLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIElSUQorICoJY29udGV4dC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KKyAqCisgKglCVUdTOiBUaGlzIGNvZGUgaXMgc2VyaW91c2x5IG92ZXItZW5naW5lZXJlZC4gVGhlcmUgaXMgYWxzbworICoJbWFnaWMgYWJvdXQgaG93IHRoZSBkcml2ZXIgc3BlY2lmaWMgZmVhdHVyZXMgYXJlIHNldHVwLiBJZgorICoJYSBkcml2ZXIgaXMgYXR0YWNoZWQgd2UgYXNzdW1lIHRoZSBkcml2ZXIgc2V0dGluZ3MgYXJlIGF1dG8KKyAqCXJlbW92ZS4KKyAqLworCitzdGF0aWMgaW50IF9faWRlX2FkZF9zZXR0aW5nKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHJ3LCBpbnQgcmVhZF9pb2N0bCwgaW50IHdyaXRlX2lvY3RsLCBpbnQgZGF0YV90eXBlLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgbXVsX2ZhY3RvciwgaW50IGRpdl9mYWN0b3IsIHZvaWQgKmRhdGEsIGlkZV9wcm9jc2V0X3QgKnNldCwgaW50IGF1dG9fcmVtb3ZlKQoreworCWlkZV9zZXR0aW5nc190ICoqcCA9IChpZGVfc2V0dGluZ3NfdCAqKikgJmRyaXZlLT5zZXR0aW5ncywgKnNldHRpbmcgPSBOVUxMOworCisJZG93bigmaWRlX3NldHRpbmdfc2VtKTsKKwl3aGlsZSAoKCpwKSAmJiBzdHJjbXAoKCpwKS0+bmFtZSwgbmFtZSkgPCAwKQorCQlwID0gJigoKnApLT5uZXh0KTsKKwlpZiAoKHNldHRpbmcgPSBrbWFsbG9jKHNpemVvZigqc2V0dGluZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIGFib3J0OworCW1lbXNldChzZXR0aW5nLCAwLCBzaXplb2YoKnNldHRpbmcpKTsKKwlpZiAoKHNldHRpbmctPm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDEsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIGFib3J0OworCXN0cmNweShzZXR0aW5nLT5uYW1lLCBuYW1lKTsKKwlzZXR0aW5nLT5ydyA9IHJ3OworCXNldHRpbmctPnJlYWRfaW9jdGwgPSByZWFkX2lvY3RsOworCXNldHRpbmctPndyaXRlX2lvY3RsID0gd3JpdGVfaW9jdGw7CisJc2V0dGluZy0+ZGF0YV90eXBlID0gZGF0YV90eXBlOworCXNldHRpbmctPm1pbiA9IG1pbjsKKwlzZXR0aW5nLT5tYXggPSBtYXg7CisJc2V0dGluZy0+bXVsX2ZhY3RvciA9IG11bF9mYWN0b3I7CisJc2V0dGluZy0+ZGl2X2ZhY3RvciA9IGRpdl9mYWN0b3I7CisJc2V0dGluZy0+ZGF0YSA9IGRhdGE7CisJc2V0dGluZy0+c2V0ID0gc2V0OworCQorCXNldHRpbmctPm5leHQgPSAqcDsKKwlpZiAoYXV0b19yZW1vdmUpCisJCXNldHRpbmctPmF1dG9fcmVtb3ZlID0gMTsKKwkqcCA9IHNldHRpbmc7CisJdXAoJmlkZV9zZXR0aW5nX3NlbSk7CisJcmV0dXJuIDA7CithYm9ydDoKKwl1cCgmaWRlX3NldHRpbmdfc2VtKTsKKwlpZiAoc2V0dGluZykKKwkJa2ZyZWUoc2V0dGluZyk7CisJcmV0dXJuIC0xOworfQorCitpbnQgaWRlX2FkZF9zZXR0aW5nKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHJ3LCBpbnQgcmVhZF9pb2N0bCwgaW50IHdyaXRlX2lvY3RsLCBpbnQgZGF0YV90eXBlLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgbXVsX2ZhY3RvciwgaW50IGRpdl9mYWN0b3IsIHZvaWQgKmRhdGEsIGlkZV9wcm9jc2V0X3QgKnNldCkKK3sKKwlyZXR1cm4gX19pZGVfYWRkX3NldHRpbmcoZHJpdmUsIG5hbWUsIHJ3LCByZWFkX2lvY3RsLCB3cml0ZV9pb2N0bCwgZGF0YV90eXBlLCBtaW4sIG1heCwgbXVsX2ZhY3RvciwgZGl2X2ZhY3RvciwgZGF0YSwgc2V0LCAxKTsKK30KKworRVhQT1JUX1NZTUJPTChpZGVfYWRkX3NldHRpbmcpOworCisvKioKKyAqCV9faWRlX3JlbW92ZV9zZXR0aW5nCS0JcmVtb3ZlIGFuIGlkZSBzZXR0aW5nIG9wdGlvbgorICoJQGRyaXZlOiBkcml2ZSB0byB1c2UKKyAqCUBuYW1lOiBzZXR0aW5nIG5hbWUKKyAqCisgKglSZW1vdmVzIHRoZSBzZXR0aW5nIG5hbWVkIGZyb20gdGhlIGRldmljZSBpZiBpdCBpcyBwcmVzZW50LgorICoJVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHNldHRpbmcgc2VtYXBob3JlLgorICovCisgCitzdGF0aWMgdm9pZCBfX2lkZV9yZW1vdmVfc2V0dGluZyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjaGFyICpuYW1lKQoreworCWlkZV9zZXR0aW5nc190ICoqcCwgKnNldHRpbmc7CisKKwlwID0gKGlkZV9zZXR0aW5nc190ICoqKSAmZHJpdmUtPnNldHRpbmdzOworCisJd2hpbGUgKCgqcCkgJiYgc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpKQorCQlwID0gJigoKnApLT5uZXh0KTsKKwlpZiAoKHNldHRpbmcgPSAoKnApKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkoKnApID0gc2V0dGluZy0+bmV4dDsKKwkKKwlrZnJlZShzZXR0aW5nLT5uYW1lKTsKKwlrZnJlZShzZXR0aW5nKTsKK30KKworLyoqCisgKglpZGVfZmluZF9zZXR0aW5nX2J5X2lvY3RsCS0JZmluZCBhIGRyaXZlIHNwZWNpZmljIGlvY3RsCisgKglAZHJpdmU6IGRyaXZlIHRvIHNjYW4KKyAqCUBjbWQ6IGlvY3RsIGNvbW1hbmQgdG8gaGFuZGxlCisgKgorICoJU2NhbidzIHRoZSBkZXZpY2Ugc2V0dGluZyB0YWJsZSBmb3IgYSBtYXRjaGluZyBlbnRyeSBhbmQgcmV0dXJucworICoJdGhpcyBvciBOVUxMIGlmIG5vIGVudHJ5IGlzIGZvdW5kLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUKKyAqCXNldHRpbmcgc2VtYXBob3JlCisgKi8KKyAKK3N0YXRpYyBpZGVfc2V0dGluZ3NfdCAqaWRlX2ZpbmRfc2V0dGluZ19ieV9pb2N0bCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgY21kKQoreworCWlkZV9zZXR0aW5nc190ICpzZXR0aW5nID0gZHJpdmUtPnNldHRpbmdzOworCisJd2hpbGUgKHNldHRpbmcpIHsKKwkJaWYgKHNldHRpbmctPnJlYWRfaW9jdGwgPT0gY21kIHx8IHNldHRpbmctPndyaXRlX2lvY3RsID09IGNtZCkKKwkJCWJyZWFrOworCQlzZXR0aW5nID0gc2V0dGluZy0+bmV4dDsKKwl9CisJCisJcmV0dXJuIHNldHRpbmc7Cit9CisKKy8qKgorICoJaWRlX2ZpbmRfc2V0dGluZ19ieV9uYW1lCS0JZmluZCBhIGRyaXZlIHNwZWNpZmljIHNldHRpbmcKKyAqCUBkcml2ZTogZHJpdmUgdG8gc2NhbgorICoJQG5hbWU6IHNldHRpbmcgbmFtZQorICoKKyAqCVNjYW4ncyB0aGUgZGV2aWNlIHNldHRpbmcgdGFibGUgZm9yIGEgbWF0Y2hpbmcgZW50cnkgYW5kIHJldHVybnMKKyAqCXRoaXMgb3IgTlVMTCBpZiBubyBlbnRyeSBpcyBmb3VuZC4gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlCisgKglzZXR0aW5nIHNlbWFwaG9yZQorICovCisgCitpZGVfc2V0dGluZ3NfdCAqaWRlX2ZpbmRfc2V0dGluZ19ieV9uYW1lIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNoYXIgKm5hbWUpCit7CisJaWRlX3NldHRpbmdzX3QgKnNldHRpbmcgPSBkcml2ZS0+c2V0dGluZ3M7CisKKwl3aGlsZSAoc2V0dGluZykgeworCQlpZiAoc3RyY21wKHNldHRpbmctPm5hbWUsIG5hbWUpID09IDApCisJCQlicmVhazsKKwkJc2V0dGluZyA9IHNldHRpbmctPm5leHQ7CisJfQorCXJldHVybiBzZXR0aW5nOworfQorCisvKioKKyAqCWF1dG9fcmVtb3ZlX3NldHRpbmdzCS0JcmVtb3ZlIGRyaXZlciBzcGVjaWZpYyBzZXR0aW5ncworICoJQGRyaXZlOiBkcml2ZQorICoKKyAqCUF1dG9tYXRpY2FsbHkgcmVtb3ZlIGFsbCB0aGUgZHJpdmVyIHNwZWNpZmljIHNldHRpbmdzIGZvciB0aGlzCisgKglkcml2ZS4gVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIElSUQorICoJY29udGV4dC4gVGhlIGNhbGxlciBtdXN0IGhvbGQgaWRlX3NldHRpbmdfc2VtLgorICovCisgCitzdGF0aWMgdm9pZCBhdXRvX3JlbW92ZV9zZXR0aW5ncyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9zZXR0aW5nc190ICpzZXR0aW5nOworcmVwZWF0OgorCXNldHRpbmcgPSBkcml2ZS0+c2V0dGluZ3M7CisJd2hpbGUgKHNldHRpbmcpIHsKKwkJaWYgKHNldHRpbmctPmF1dG9fcmVtb3ZlKSB7CisJCQlfX2lkZV9yZW1vdmVfc2V0dGluZyhkcml2ZSwgc2V0dGluZy0+bmFtZSk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlzZXR0aW5nID0gc2V0dGluZy0+bmV4dDsKKwl9Cit9CisKKy8qKgorICoJaWRlX3JlYWRfc2V0dGluZwktCXJlYWQgYW4gSURFIHNldHRpbmcKKyAqCUBkcml2ZTogZHJpdmUgdG8gcmVhZCBmcm9tCisgKglAc2V0dGluZzogZHJpdmUgc2V0dGluZworICoKKyAqCVJlYWQgYSBkcml2ZSBzZXR0aW5nIGFuZCByZXR1cm4gdGhlIHZhbHVlLiBUaGUgY2FsbGVyCisgKgltdXN0IGhvbGQgdGhlIGlkZV9zZXR0aW5nX3NlbSB3aGVuIG1ha2luZyB0aGlzIGNhbGwuCisgKgorICoJQlVHUzogdGhlIGRhdGEgcmV0dXJuIGFuZCBlcnJvciBhcmUgdGhlIHNhbWUgcmV0dXJuIHZhbHVlCisgKglzbyBhbiBlcnJvciAtRUlOVkFMIGFuZCB0cnVlIHJldHVybiBvZiB0aGUgc2FtZSB2YWx1ZSBjYW5ub3QKKyAqCWJlIHRvbGQgYXBhcnQKKyAqLworIAoraW50IGlkZV9yZWFkX3NldHRpbmcgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX3NldHRpbmdzX3QgKnNldHRpbmcpCit7CisJaW50CQl2YWwgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoKHNldHRpbmctPnJ3ICYgU0VUVElOR19SRUFEKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJc3dpdGNoKHNldHRpbmctPmRhdGFfdHlwZSkgeworCQkJY2FzZSBUWVBFX0JZVEU6CisJCQkJdmFsID0gKigodTggKikgc2V0dGluZy0+ZGF0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRZUEVfU0hPUlQ6CisJCQkJdmFsID0gKigodTE2ICopIHNldHRpbmctPmRhdGEpOworCQkJCWJyZWFrOworCQkJY2FzZSBUWVBFX0lOVDoKKwkJCWNhc2UgVFlQRV9JTlRBOgorCQkJCXZhbCA9ICooKHUzMiAqKSBzZXR0aW5nLT5kYXRhKTsKKwkJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gdmFsOworfQorCisvKioKKyAqCWlkZV9zcGluX3dhaXRfaHdncm91cAktCXdhaXQgZm9yIGdyb3VwCisgKglAZHJpdmU6IGRyaXZlIGluIHRoZSBncm91cAorICoKKyAqCVdhaXQgZm9yIGFuIElERSBkZXZpY2UgZ3JvdXAgdG8gZ28gbm9uIGJ1c3kgYW5kIHRoZW4gcmV0dXJuCisgKglob2xkaW5nIHRoZSBpZGVfbG9jayB3aGljaCBndWFyZHMgdGhlIGh3Z3JvdXAtPmJ1c3kgc3RhdHVzCisgKglhbmQgcmlnaHQgdG8gdXNlIGl0LgorICovCisKK2ludCBpZGVfc3Bpbl93YWl0X2h3Z3JvdXAgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gSFdHUk9VUChkcml2ZSk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArICgzICogSFopOworCisJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCisJd2hpbGUgKGh3Z3JvdXAtPmJ1c3kpIHsKKwkJdW5zaWduZWQgbG9uZyBsZmxhZ3M7CisJCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCQlsb2NhbF9pcnFfc2V0KGxmbGFncyk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShsZmxhZ3MpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2hhbm5lbCBidXN5XG4iLCBkcml2ZS0+bmFtZSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWxvY2FsX2lycV9yZXN0b3JlKGxmbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX3NwaW5fd2FpdF9od2dyb3VwKTsKKworLyoqCisgKglpZGVfd3JpdGVfc2V0dGluZwktCXJlYWQgYW4gSURFIHNldHRpbmcKKyAqCUBkcml2ZTogZHJpdmUgdG8gcmVhZCBmcm9tCisgKglAc2V0dGluZzogZHJpdmUgc2V0dGluZworICoJQHZhbDogdmFsdWUKKyAqCisgKglXcml0ZSBhIGRyaXZlIHNldHRpbmcgaWYgaXQgaXMgcG9zc2libGUuIFRoZSBjYWxsZXIKKyAqCW11c3QgaG9sZCB0aGUgaWRlX3NldHRpbmdfc2VtIHdoZW4gbWFraW5nIHRoaXMgY2FsbC4KKyAqCisgKglCVUdTOiB0aGUgZGF0YSByZXR1cm4gYW5kIGVycm9yIGFyZSB0aGUgc2FtZSByZXR1cm4gdmFsdWUKKyAqCXNvIGFuIGVycm9yIC1FSU5WQUwgYW5kIHRydWUgcmV0dXJuIG9mIHRoZSBzYW1lIHZhbHVlIGNhbm5vdAorICoJYmUgdG9sZCBhcGFydAorICoKKyAqCUZJWE1FOiAgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byBlbnF1ZXVlIGEgc3BlY2lhbCByZXF1ZXN0CisgKgl0byB0aGUgZHJpdmVyIHRvIGNoYW5nZSBzZXR0aW5ncywgYW5kIHRoZW4gd2FpdCBvbiBhIHNlbWEgZm9yIGNvbXBsZXRpb24uCisgKglUaGUgY3VycmVudCBzY2hlbWUgb2YgcG9sbGluZyBpcyBrbHVkZ3ksIHRob3VnaCBzYWZlIGVub3VnaC4KKyAqLworCitpbnQgaWRlX3dyaXRlX3NldHRpbmcgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX3NldHRpbmdzX3QgKnNldHRpbmcsIGludCB2YWwpCit7CisJaW50IGk7CisJdTMyICpwOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoIShzZXR0aW5nLT5ydyAmIFNFVFRJTkdfV1JJVEUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICh2YWwgPCBzZXR0aW5nLT5taW4gfHwgdmFsID4gc2V0dGluZy0+bWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2V0dGluZy0+c2V0KQorCQlyZXR1cm4gc2V0dGluZy0+c2V0KGRyaXZlLCB2YWwpOworCWlmIChpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoZHJpdmUpKQorCQlyZXR1cm4gLUVCVVNZOworCXN3aXRjaCAoc2V0dGluZy0+ZGF0YV90eXBlKSB7CisJCWNhc2UgVFlQRV9CWVRFOgorCQkJKigodTggKikgc2V0dGluZy0+ZGF0YSkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUWVBFX1NIT1JUOgorCQkJKigodTE2ICopIHNldHRpbmctPmRhdGEpID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgVFlQRV9JTlQ6CisJCQkqKCh1MzIgKikgc2V0dGluZy0+ZGF0YSkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUWVBFX0lOVEE6CisJCQlwID0gKHUzMiAqKSBzZXR0aW5nLT5kYXRhOworCQkJZm9yIChpID0gMDsgaSA8IDEgPDwgUEFSVE5fQklUUzsgaSsrLCBwKyspCisJCQkJKnAgPSB2YWw7CisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lvXzMyYml0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKK3sKKwlkcml2ZS0+aW9fMzJiaXQgPSBhcmc7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfRFRDMjI3OAorCWlmIChIV0lGKGRyaXZlKS0+Y2hpcHNldCA9PSBpZGVfZHRjMjI3OCkKKwkJSFdJRihkcml2ZSktPmRyaXZlc1shZHJpdmUtPnNlbGVjdC5iLnVuaXRdLmlvXzMyYml0ID0gYXJnOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0RUQzIyNzggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdXNpbmdfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCit7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJaWYgKCFkcml2ZS0+aWQgfHwgIShkcml2ZS0+aWQtPmNhcGFiaWxpdHkgJiAxKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoSFdJRihkcml2ZSktPmlkZV9kbWFfY2hlY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoYXJnKSB7CisJCWlmIChIV0lGKGRyaXZlKS0+aWRlX2RtYV9jaGVjayhkcml2ZSkpIHJldHVybiAtRUlPOworCQlpZiAoSFdJRihkcml2ZSktPmlkZV9kbWFfb24oZHJpdmUpKSByZXR1cm4gLUVJTzsKKwl9IGVsc2UgeworCQlpZiAoX19pZGVfZG1hX29mZihkcml2ZSkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRVBFUk07CisjZW5kaWYKK30KKworc3RhdGljIGludCBzZXRfcGlvX21vZGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCBycTsKKworCWlmICghSFdJRihkcml2ZSktPnR1bmVwcm9jKQorCQlyZXR1cm4gLUVOT1NZUzsKKwlpZiAoZHJpdmUtPnNwZWNpYWwuYi5zZXRfdHVuZSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZGVfaW5pdF9kcml2ZV9jbWQoJnJxKTsKKwlkcml2ZS0+dHVuZV9yZXEgPSAodTgpIGFyZzsKKwlkcml2ZS0+c3BlY2lhbC5iLnNldF90dW5lID0gMTsKKwkodm9pZCkgaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQoreworCWludCBlcnIgPSBpZGVfd2FpdF9jbWQoZHJpdmUsCisJCQlXSU5fU0VURkVBVFVSRVMsICh1OCkgYXJnLAorCQkJU0VURkVBVFVSRVNfWEZFUiwgMCwgTlVMTCk7CisKKwlpZiAoIWVyciAmJiBhcmcpIHsKKwkJaWRlX3NldF94ZmVyX3JhdGUoZHJpdmUsICh1OCkgYXJnKTsKKwkJaWRlX2RyaXZlaWRfdXBkYXRlKGRyaXZlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglpZGVfYWRkX2dlbmVyaWNfc2V0dGluZ3MJLQlnZW5lcmljIGlkZSBzZXR0aW5ncworICoJQGRyaXZlOiBkcml2ZSBiZWluZyBjb25maWd1cmVkCisgKgorICoJQWRkIHRoZSBnZW5lcmljIHBhcnRzIG9mIHRoZSBzeXN0ZW0gc2V0dGluZ3MgdG8gdGhlIC9wcm9jIGZpbGVzIGFuZAorICoJaW9jdGxzIGZvciB0aGlzIElERSBkZXZpY2UuIFRoZSBjYWxsZXIgbXVzdCBub3QgYmUgaG9sZGluZyB0aGUKKyAqCWlkZV9zZXR0aW5nX3NlbS4KKyAqLworCit2b2lkIGlkZV9hZGRfZ2VuZXJpY19zZXR0aW5ncyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworLyoKKyAqCQkJICBkcml2ZQkJc2V0dGluZyBuYW1lCQlyZWFkL3dyaXRlIGFjY2VzcwkJCQlyZWFkIGlvY3RsCQl3cml0ZSBpb2N0bAkJZGF0YSB0eXBlCW1pbgltYXgJCQkJbXVsX2ZhY3RvcglkaXZfZmFjdG9yCWRhdGEgcG9pbnRlcgkJCXNldCBmdW5jdGlvbgorICovCisJX19pZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJpb18zMmJpdCIsCQlkcml2ZS0+bm9faW9fMzJiaXQgPyBTRVRUSU5HX1JFQUQgOiBTRVRUSU5HX1JXLAlIRElPX0dFVF8zMkJJVCwJCUhESU9fU0VUXzMyQklULAkJVFlQRV9CWVRFLAkwLAkxICsgKFNVUFBPUlRfVkxCX1NZTkMgPDwgMSksCTEsCQkxLAkJJmRyaXZlLT5pb18zMmJpdCwJCXNldF9pb18zMmJpdCwJMCk7CisJX19pZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJrZWVwc2V0dGluZ3MiLAkJU0VUVElOR19SVywJCQkJCUhESU9fR0VUX0tFRVBTRVRUSU5HUywJSERJT19TRVRfS0VFUFNFVFRJTkdTLAlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCQkxLAkJJmRyaXZlLT5rZWVwX3NldHRpbmdzLAkJTlVMTCwJCTApOworCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibmljZTEiLAkJU0VUVElOR19SVywJCQkJCS0xLAkJCS0xLAkJCVRZUEVfQllURSwJMCwJMSwJCQkJMSwJCTEsCQkmZHJpdmUtPm5pY2UxLAkJCU5VTEwsCQkwKTsKKwlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJInBpb19tb2RlIiwJCVNFVFRJTkdfV1JJVEUsCQkJCQktMSwJCQlIRElPX1NFVF9QSU9fTU9ERSwJVFlQRV9CWVRFLAkwLAkyNTUsCQkJCTEsCQkxLAkJTlVMTCwJCQkJc2V0X3Bpb19tb2RlLAkwKTsKKwlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJInVubWFza2lycSIsCQlkcml2ZS0+bm9fdW5tYXNrID8gU0VUVElOR19SRUFEIDogU0VUVElOR19SVywJSERJT19HRVRfVU5NQVNLSU5UUiwJSERJT19TRVRfVU5NQVNLSU5UUiwJVFlQRV9CWVRFLAkwLAkxLAkJCQkxLAkJMSwJCSZkcml2ZS0+dW5tYXNrLAkJCU5VTEwsCQkwKTsKKwlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJInVzaW5nX2RtYSIsCQlTRVRUSU5HX1JXLAkJCQkJSERJT19HRVRfRE1BLAkJSERJT19TRVRfRE1BLAkJVFlQRV9CWVRFLAkwLAkxLAkJCQkxLAkJMSwJCSZkcml2ZS0+dXNpbmdfZG1hLAkJc2V0X3VzaW5nX2RtYSwJMCk7CisJX19pZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJpbml0X3NwZWVkIiwJCVNFVFRJTkdfUlcsCQkJCQktMSwJCQktMSwJCQlUWVBFX0JZVEUsCTAsCTcwLAkJCQkxLAkJMSwJCSZkcml2ZS0+aW5pdF9zcGVlZCwJCU5VTEwsCQkwKTsKKwlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJImN1cnJlbnRfc3BlZWQiLAlTRVRUSU5HX1JXLAkJCQkJLTEsCQkJLTEsCQkJVFlQRV9CWVRFLAkwLAk3MCwJCQkJMSwJCTEsCQkmZHJpdmUtPmN1cnJlbnRfc3BlZWQsCQlzZXRfeGZlcl9yYXRlLAkwKTsKKwlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJIm51bWJlciIsCQlTRVRUSU5HX1JXLAkJCQkJLTEsCQkJLTEsCQkJVFlQRV9CWVRFLAkwLAkzLAkJCQkxLAkJMSwJCSZkcml2ZS0+ZG4sCQkJTlVMTCwJCTApOworfQorCisvKioKKyAqCXN5c3RlbV9idXNfY2xvY2sJLQljbG9jayBndWVzcworICoKKyAqCUV4dGVybmFsIHZlcnNpb24gb2YgdGhlIGJ1cyBjbG9jayBndWVzcyB1c2VkIGJ5IHZlcnkgb2xkIElERSBkcml2ZXJzCisgKglmb3IgdGhpbmdzIGxpa2UgVkxCIHRpbWluZ3MuIFNob3VsZCBub3QgYmUgdXNlZC4KKyAqLworCitpbnQgc3lzdGVtX2J1c19jbG9jayAodm9pZCkKK3sKKwlyZXR1cm4oKGludCkgKCghc3lzdGVtX2J1c19zcGVlZCkgPyBpZGVfc3lzdGVtX2J1c19zcGVlZCgpIDogc3lzdGVtX2J1c19zcGVlZCApKTsKK30KKworRVhQT1JUX1NZTUJPTChzeXN0ZW1fYnVzX2Nsb2NrKTsKKworLyoKKyAqCUxvY2tpbmcgaXMgYmFkbHkgYnJva2VuIGhlcmUgLSBzaW5jZSB3YXkgYmFjay4gIFRoYXQgc3Vja2VyIGlzCisgKiByb290LW9ubHksIGJ1dCB0aGF0J3Mgbm90IGFuIGV4Y3VzZS4uLiAgVGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hhdAorICogZXhjbHVzaW9uIHJ1bGVzIGRvIHdlIHdhbnQgaGVyZS4KKyAqLworaW50IGlkZV9yZXBsYWNlX3N1YmRyaXZlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICpkcml2ZXIpCit7CisJaWYgKCFkcml2ZS0+cHJlc2VudCB8fCBkcml2ZS0+dXNhZ2UgfHwgZHJpdmUtPmRlYWQpCisJCWdvdG8gYWJvcnQ7CisJaWYgKERSSVZFUihkcml2ZSktPmNsZWFudXAoZHJpdmUpKQorCQlnb3RvIGFib3J0OworCXN0cmxjcHkoZHJpdmUtPmRyaXZlcl9yZXEsIGRyaXZlciwgc2l6ZW9mKGRyaXZlLT5kcml2ZXJfcmVxKSk7CisJaWYgKGF0YV9hdHRhY2goZHJpdmUpKSB7CisJCXNwaW5fbG9jaygmZHJpdmVzX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZkcml2ZS0+bGlzdCk7CisJCXNwaW5fdW5sb2NrKCZkcml2ZXNfbG9jayk7CisJCWRyaXZlLT5kcml2ZXJfcmVxWzBdID0gMDsKKwkJYXRhX2F0dGFjaChkcml2ZSk7CisJfSBlbHNlIHsKKwkJZHJpdmUtPmRyaXZlcl9yZXFbMF0gPSAwOworCX0KKwlpZiAoZHJpdmUtPmRyaXZlciAmJiAhc3RyY21wKGRyaXZlLT5kcml2ZXItPm5hbWUsIGRyaXZlcikpCisJCXJldHVybiAwOworYWJvcnQ6CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJYXRhX2F0dGFjaAkJLQlhdHRhY2ggYW4gQVRBL0FUQVBJIGRldmljZQorICoJQGRyaXZlOiBkcml2ZSB0byBhdHRhY2gKKyAqCisgKglUYWtlcyBhIGRyaXZlIHRoYXQgaXMgYXMgeWV0IG5vdCBhc3NpZ25lZCB0byBhbnkgbWlkbGF5ZXIgSURFCisgKglkcml2ZXIgKG9yIGlzIGFzc2lnbmVkIHRvIHRoZSBkZWZhdWx0IGRyaXZlcikgYW5kIGZpZ3VyZXMgb3V0CisgKgl3aGljaCBkcml2ZXIgd291bGQgbGlrZSB0byBvd24gaXQuIElmIG5vYm9keSBjbGFpbXMgdGhlIGRyaXZlCisgKgl0aGVuIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gdGhlIGRlZmF1bHQgZHJpdmVyIHVzZWQgZm9yCisgKgl1bmNsYWltZWQgb2JqZWN0cy4KKyAqCisgKglBIHJldHVybiBvZiB6ZXJvIGluZGljYXRlcyBhdHRhY2htZW50IHRvIGEgZHJpdmVyLCBvZiBvbmUKKyAqCWF0dGFjaG1lbnQgdG8gdGhlIGRlZmF1bHQgZHJpdmVyLgorICoKKyAqCVRha2VzIGRyaXZlcnNfbG9jay4KKyAqLworCitpbnQgYXRhX2F0dGFjaChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzcGluX2xvY2soJmRyaXZlcnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwLCAmZHJpdmVycykgeworCQlpZGVfZHJpdmVyX3QgKmRyaXZlciA9IGxpc3RfZW50cnkocCwgaWRlX2RyaXZlcl90LCBkcml2ZXJzKTsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2ZXItPm93bmVyKSkKKwkJCWNvbnRpbnVlOworCQlzcGluX3VubG9jaygmZHJpdmVyc19sb2NrKTsKKwkJaWYgKGRyaXZlci0+YXR0YWNoKGRyaXZlKSA9PSAwKSB7CisJCQltb2R1bGVfcHV0KGRyaXZlci0+b3duZXIpOworCQkJZHJpdmUtPmdlbmRldi5kcml2ZXIgPSAmZHJpdmVyLT5nZW5fZHJpdmVyOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3Bpbl9sb2NrKCZkcml2ZXJzX2xvY2spOworCQltb2R1bGVfcHV0KGRyaXZlci0+b3duZXIpOworCX0KKwlkcml2ZS0+Z2VuZGV2LmRyaXZlciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmRyaXZlcnNfbG9jayk7CisJaWYgKGlkZV9yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsIE5VTEwpKQorCQlwYW5pYygiaWRlOiBkZWZhdWx0IGF0dGFjaCBmYWlsZWQiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZW5lcmljX2lkZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJlcXVlc3QgcnE7CisJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgcnFwbTsKKwlpZGVfdGFza190IGFyZ3M7CisKKwltZW1zZXQoJnJxLCAwLCBzaXplb2YocnEpKTsKKwltZW1zZXQoJnJxcG0sIDAsIHNpemVvZihycXBtKSk7CisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCXJxLmZsYWdzID0gUkVRX1BNX1NVU1BFTkQ7CisJcnEuc3BlY2lhbCA9ICZhcmdzOworCXJxLnBtID0gJnJxcG07CisJcnFwbS5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX3N0YXJ0X3N1c3BlbmQ7CisJcnFwbS5wbV9zdGF0ZSA9IHN0YXRlOworCisJcmV0dXJuIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsICZycSwgaWRlX3dhaXQpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCBycTsKKwlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOworCWlkZV90YXNrX3QgYXJnczsKKworCW1lbXNldCgmcnEsIDAsIHNpemVvZihycSkpOworCW1lbXNldCgmcnFwbSwgMCwgc2l6ZW9mKHJxcG0pKTsKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJcnEuZmxhZ3MgPSBSRVFfUE1fUkVTVU1FOworCXJxLnNwZWNpYWwgPSAmYXJnczsKKwlycS5wbSA9ICZycXBtOworCXJxcG0ucG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9zdGFydF9yZXN1bWU7CisJcnFwbS5wbV9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfaGVhZF93YWl0KTsKK30KKworaW50IGdlbmVyaWNfaWRlX2lvY3RsKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZGVfc2V0dGluZ3NfdCAqc2V0dGluZzsKKwlpZGVfZHJpdmVyX3QgKmRydjsKKwlpbnQgZXJyID0gMDsKKwl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWRvd24oJmlkZV9zZXR0aW5nX3NlbSk7CisJaWYgKChzZXR0aW5nID0gaWRlX2ZpbmRfc2V0dGluZ19ieV9pb2N0bChkcml2ZSwgY21kKSkgIT0gTlVMTCkgeworCQlpZiAoY21kID09IHNldHRpbmctPnJlYWRfaW9jdGwpIHsKKwkJCWVyciA9IGlkZV9yZWFkX3NldHRpbmcoZHJpdmUsIHNldHRpbmcpOworCQkJdXAoJmlkZV9zZXR0aW5nX3NlbSk7CisJCQlyZXR1cm4gZXJyID49IDAgPyBwdXRfdXNlcihlcnIsIChsb25nIF9fdXNlciAqKWFyZykgOiBlcnI7CisJCX0gZWxzZSB7CisJCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCWVyciA9IGlkZV93cml0ZV9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nLCBhcmcpOworCQkJdXAoJmlkZV9zZXR0aW5nX3NlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXVwKCZpZGVfc2V0dGluZ19zZW0pOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBIRElPX0dFVEdFTzoKKwkJeworCQkJc3RydWN0IGhkX2dlb21ldHJ5IGdlb207CisJCQlpZiAoIXAgfHwgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Zsb3BweSkpIHJldHVybiAtRUlOVkFMOworCQkJZ2VvbS5oZWFkcyA9IGRyaXZlLT5iaW9zX2hlYWQ7CisJCQlnZW9tLnNlY3RvcnMgPSBkcml2ZS0+Ymlvc19zZWN0OworCQkJZ2VvbS5jeWxpbmRlcnMgPSAodTE2KWRyaXZlLT5iaW9zX2N5bDsgLyogdHJ1bmNhdGUgKi8KKwkJCWdlb20uc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChiZGV2KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmdlb20sIHNpemVvZihzdHJ1Y3QgaGRfZ2VvbWV0cnkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBIRElPX09CU09MRVRFX0lERU5USVRZOgorCQljYXNlIEhESU9fR0VUX0lERU5USVRZOgorCQkJaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZHJpdmUtPmlkX3JlYWQgPT0gMCkKKwkJCQlyZXR1cm4gLUVOT01TRzsKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgZHJpdmUtPmlkLCAoY21kID09IEhESU9fR0VUX0lERU5USVRZKSA/IHNpemVvZigqZHJpdmUtPmlkKSA6IDE0MikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhESU9fR0VUX05JQ0U6CisJCQlyZXR1cm4gcHV0X3VzZXIoZHJpdmUtPmRzY19vdmVybGFwCTw8CUlERV9OSUNFX0RTQ19PVkVSTEFQCXwKKwkJCQkJZHJpdmUtPmF0YXBpX292ZXJsYXAJPDwJSURFX05JQ0VfQVRBUElfT1ZFUkxBUAl8CisJCQkJCWRyaXZlLT5uaWNlMAkJPDwgCUlERV9OSUNFXzAJCXwKKwkJCQkJZHJpdmUtPm5pY2UxCQk8PAlJREVfTklDRV8xCQl8CisJCQkJCWRyaXZlLT5uaWNlMgkJPDwJSURFX05JQ0VfMiwKKwkJCQkJKGxvbmcgX191c2VyICopIGFyZyk7CisKKyNpZmRlZiBDT05GSUdfSURFX1RBU0tfSU9DVEwKKwkJY2FzZSBIRElPX0RSSVZFX1RBU0tGSUxFOgorCQkgICAgICAgIGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCXN3aXRjaChkcml2ZS0+bWVkaWEpIHsKKwkJCQljYXNlIGlkZV9kaXNrOgorCQkJCQlyZXR1cm4gaWRlX3Rhc2tmaWxlX2lvY3RsKGRyaXZlLCBjbWQsIGFyZyk7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FTk9NU0c7CisJCQl9CisjZW5kaWYgLyogQ09ORklHX0lERV9UQVNLX0lPQ1RMICovCisKKwkJY2FzZSBIRElPX0RSSVZFX0NNRDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCXJldHVybiBpZGVfY21kX2lvY3RsKGRyaXZlLCBjbWQsIGFyZyk7CisKKwkJY2FzZSBIRElPX0RSSVZFX1RBU0s6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQlyZXR1cm4gaWRlX3Rhc2tfaW9jdGwoZHJpdmUsIGNtZCwgYXJnKTsKKworCQljYXNlIEhESU9fU0NBTl9IV0lGOgorCQl7CisJCQlod19yZWdzX3QgaHc7CisJCQlpbnQgYXJnc1szXTsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgcmV0dXJuIC1FQUNDRVM7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYXJncywgcCwgMyAqIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworCQkJaWRlX2luaXRfaHdpZl9wb3J0cygmaHcsICh1bnNpZ25lZCBsb25nKSBhcmdzWzBdLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGFyZ3NbMV0sIE5VTEwpOworCQkJaHcuaXJxID0gYXJnc1syXTsKKwkJCWlmIChpZGVfcmVnaXN0ZXJfaHcoJmh3LCBOVUxMKSA9PSAtMSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXJldHVybiAwOworCQl9CisJICAgICAgICBjYXNlIEhESU9fVU5SRUdJU1RFUl9IV0lGOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVBQ0NFUzsKKwkJCS8qIChhcmcgPiBNQVhfSFdJRlMpIGNoZWNrZWQgaW4gZnVuY3Rpb24gKi8KKwkJCWlkZV91bnJlZ2lzdGVyKGFyZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBIRElPX1NFVF9OSUNFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSByZXR1cm4gLUVBQ0NFUzsKKwkJCWlmIChhcmcgIT0gKGFyZyAmICgoMSA8PCBJREVfTklDRV9EU0NfT1ZFUkxBUCkgfCAoMSA8PCBJREVfTklDRV8xKSkpKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlkcml2ZS0+ZHNjX292ZXJsYXAgPSAoYXJnID4+IElERV9OSUNFX0RTQ19PVkVSTEFQKSAmIDE7CisJCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKiliZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJCQlpZiAoZHJpdmUtPmRzY19vdmVybGFwICYmICFkcnYtPnN1cHBvcnRzX2RzY19vdmVybGFwKSB7CisJCQkJZHJpdmUtPmRzY19vdmVybGFwID0gMDsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQkJZHJpdmUtPm5pY2UxID0gKGFyZyA+PiBJREVfTklDRV8xKSAmIDE7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBIRElPX0RSSVZFX1JFU0VUOgorCQl7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSByZXR1cm4gLUVBQ0NFUzsKKwkJCQorCQkJLyoKKwkJCSAqCUFib3J0IHRoZSBjdXJyZW50IGNvbW1hbmQgb24gdGhlCisJCQkgKglncm91cCBpZiB0aGVyZSBpcyBvbmUsIHRha2luZworCQkJICoJY2FyZSBub3QgdG8gYWxsb3cgYW55dGhpbmcgZWxzZQorCQkJICoJdG8gYmUgcXVldWVkIGFuZCB0byBkaWUgb24gdGhlCisJCQkgKglzcG90IGlmIHdlIG1pc3Mgb25lIHNvbWVob3cKKwkJCSAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCQkJaWRlX2Fib3J0KGRyaXZlLCAiZHJpdmUgcmVzZXQiKTsKKworCQkJaWYoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIpCisJCQkJQlVHKCk7CisJCQkJCisJCQkvKiBFbnN1cmUgbm90aGluZyBnZXRzIHF1ZXVlZCBhZnRlciB3ZQorCQkJICAgZHJvcCB0aGUgbG9jay4gUmVzZXQgd2lsbCBjbGVhciB0aGUgYnVzeSAqLworCQkgICAKKwkJCUhXR1JPVVAoZHJpdmUpLT5idXN5ID0gMTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQkodm9pZCkgaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIENEUk9NRUpFQ1Q6CisJCWNhc2UgQ0RST01DTE9TRVRSQVk6CisJCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmRldi0+YmRfZGlzaywgY21kLCBwKTsKKworCQljYXNlIEhESU9fR0VUX0JVU1NUQVRFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWYgKHB1dF91c2VyKEhXSUYoZHJpdmUpLT5idXNfc3RhdGUsIChsb25nIF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhESU9fU0VUX0JVU1NUQVRFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWYgKEhXSUYoZHJpdmUpLT5idXNwcm9jKQorCQkJCXJldHVybiBIV0lGKGRyaXZlKS0+YnVzcHJvYyhkcml2ZSwgKGludClhcmcpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfaWRlX2lvY3RsKTsKKworLyoKKyAqIHN0cmlkeCgpIHJldHVybnMgdGhlIG9mZnNldCBvZiBjIHdpdGhpbiBzLAorICogb3IgLTEgaWYgYyBpcyAnXDAnIG9yIG5vdCBmb3VuZCB3aXRoaW4gcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3RyaWR4IChjb25zdCBjaGFyICpzLCBjaGFyIGMpCit7CisJY2hhciAqaSA9IHN0cmNocihzLCBjKTsKKwlyZXR1cm4gKGkgJiYgYykgPyBpIC0gcyA6IC0xOworfQorCisvKgorICogbWF0Y2hfcGFybSgpIGRvZXMgcGFyc2luZyBmb3IgaWRlX3NldHVwKCk6CisgKgorICogMS4gdGhlIGZpcnN0IGNoYXIgb2YgcyBtdXN0IGJlICc9Jy4KKyAqIDIuIGlmIHRoZSByZW1haW5kZXIgbWF0Y2hlcyBvbmUgb2YgdGhlIHN1cHBsaWVkIGtleXdvcmRzLAorICogICAgIHRoZSBpbmRleCAoMSBiYXNlZCkgb2YgdGhlIGtleXdvcmQgaXMgbmVnYXRlZCBhbmQgcmV0dXJuZWQuCisgKiAzLiBpZiB0aGUgcmVtYWluZGVyIGlzIGEgc2VyaWVzIG9mIG5vIG1vcmUgdGhhbiBtYXhfdmFscyBudW1iZXJzCisgKiAgICAgc2VwYXJhdGVkIGJ5IGNvbW1hcywgdGhlIG51bWJlcnMgYXJlIHNhdmVkIGluIHZhbHNbXSBhbmQgYQorICogICAgIGNvdW50IG9mIGhvdyBtYW55IHdlcmUgc2F2ZWQgaXMgcmV0dXJuZWQuICBCYXNlMTAgaXMgYXNzdW1lZCwKKyAqICAgICBhbmQgYmFzZTE2IGlzIGFsbG93ZWQgd2hlbiBwcmVmaXhlZCB3aXRoICIweCIuCisgKiA0LiBvdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG1hdGNoX3Bhcm0gKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleXdvcmRzW10sIGludCB2YWxzW10sIGludCBtYXhfdmFscykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZGVjaW1hbCA9ICIwMTIzNDU2Nzg5IjsKKwlzdGF0aWMgY29uc3QgY2hhciAqaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCWludCBpLCBuOworCisJaWYgKCpzKysgPT0gJz0nKSB7CisJCS8qCisJCSAqIFRyeSBtYXRjaGluZyBhZ2FpbnN0IHRoZSBzdXBwbGllZCBrZXl3b3JkcywKKwkJICogYW5kIHJldHVybiAtKGluZGV4KzEpIGlmIHdlIG1hdGNoIG9uZQorCQkgKi8KKwkJaWYgKGtleXdvcmRzICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7ICprZXl3b3JkcyAhPSBOVUxMOyArK2kpIHsKKwkJCQlpZiAoIXN0cmNtcChzLCAqa2V5d29yZHMrKykpCisJCQkJCXJldHVybiAtKGkrMSk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogTG9vayBmb3IgYSBzZXJpZXMgb2Ygbm8gbW9yZSB0aGFuICJtYXhfdmFscyIKKwkJICogbnVtZXJpYyB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgaW4gYmFzZTEwLAorCQkgKiBvciBiYXNlMTYgd2hlbiBwcmVmaXhlZCB3aXRoICIweCIuCisJCSAqIFJldHVybiBhIGNvdW50IG9mIGhvdyBtYW55IHdlcmUgZm91bmQuCisJCSAqLworCQlmb3IgKG4gPSAwOyAoaSA9IHN0cmlkeChkZWNpbWFsLCAqcykpID49IDA7KSB7CisJCQl2YWxzW25dID0gaTsKKwkJCXdoaWxlICgoaSA9IHN0cmlkeChkZWNpbWFsLCAqKytzKSkgPj0gMCkKKwkJCQl2YWxzW25dID0gKHZhbHNbbl0gKiAxMCkgKyBpOworCQkJaWYgKCpzID09ICd4JyAmJiAhdmFsc1tuXSkgeworCQkJCXdoaWxlICgoaSA9IHN0cmlkeChoZXgsICorK3MpKSA+PSAwKQorCQkJCQl2YWxzW25dID0gKHZhbHNbbl0gKiAweDEwKSArIGk7CisJCQl9CisJCQlpZiAoKytuID09IG1heF92YWxzKQorCQkJCWJyZWFrOworCQkJaWYgKCpzID09ICcsJyB8fCAqcyA9PSAnOycpCisJCQkJKytzOworCQl9CisJCWlmICghKnMpCisJCQlyZXR1cm4gbjsKKwl9CisJcmV0dXJuIDA7CS8qIHplcm8gPSBub3RoaW5nIG1hdGNoZWQgKi8KK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0FMSTE0WFgKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9iZV9hbGkxNHh4OworZXh0ZXJuIGludCBhbGkxNHh4X2luaXQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9VTUM4NjcyCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcHJvYmVfdW1jODY3MjsKK2V4dGVybiBpbnQgdW1jODY3Ml9pbml0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfRFRDMjI3OAorc3RhdGljIGludCBfX2luaXRkYXRhIHByb2JlX2R0YzIyNzg7CitleHRlcm4gaW50IGR0YzIyNzhfaW5pdCh2b2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CTEtfREVWX0hUNjU2MEIKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9iZV9odDY1NjBiOworZXh0ZXJuIGludCBodDY1NjBiX2luaXQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9RRDY1WFgKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9iZV9xZDY1eHg7CitleHRlcm4gaW50IHFkNjV4eF9pbml0KHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpc19jaGlwc2V0X3NldFtNQVhfSFdJRlNdOworCisvKgorICogaWRlX3NldHVwKCkgZ2V0cyBjYWxsZWQgVkVSWSBFQVJMWSBkdXJpbmcgaW5pdGlhbGl6YXRpb24sCisgKiB0byBoYW5kbGUga2VybmVsICJjb21tYW5kIGxpbmUiIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggImhkeD0iIG9yICJpZGUiLgorICoKKyAqIFJlbWVtYmVyIHRvIHVwZGF0ZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgaWYgeW91IGNoYW5nZSBzb21ldGhpbmcgaGVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaWRlX3NldHVwKGNoYXIgKnMpCit7CisJaW50IGksIHZhbHNbM107CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJdW5zaWduZWQgaW50IGh3LCB1bml0OworCWNvbnN0IGNoYXIgbWF4X2RyaXZlID0gJ2EnICsgKChNQVhfSFdJRlMgKiBNQVhfRFJJVkVTKSAtIDEpOworCWNvbnN0IGNoYXIgbWF4X2h3aWYgID0gJzAnICsgKE1BWF9IV0lGUyAtIDEpOworCisJCisJaWYgKHN0cm5jbXAocywiaGQiLDIpID09IDAgJiYgc1syXSA9PSAnPScpCS8qIGhkPSBpcyBmb3IgaGQuYyAgICovCisJCXJldHVybiAwOwkJCQkvKiBkcml2ZXIgYW5kIG5vdCB1cyAqLworCisJaWYgKHN0cm5jbXAocywiaWRlIiwzKSAmJiBzdHJuY21wKHMsImlkZWJ1cyIsNikgJiYgc3RybmNtcChzLCJoZCIsMikpCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaWRlX3NldHVwOiAlcyIsIHMpOworCWluaXRfaWRlX2RhdGEgKCk7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVET1VCTEVSCisJaWYgKCFzdHJjbXAocywgImlkZT1kb3VibGVyIikpIHsKKwkJZXh0ZXJuIGludCBpZGVfZG91YmxlcjsKKworCQlwcmludGsoIiA6IEVuYWJsZWQgc3VwcG9ydCBmb3IgSURFIGRvdWJsZXJzXG4iKTsKKwkJaWRlX2RvdWJsZXIgPSAxOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE9VQkxFUiAqLworCisJaWYgKCFzdHJjbXAocywgImlkZT1ub2RtYSIpKSB7CisJCXByaW50aygiIDogUHJldmVudGVkIERNQVxuIik7CisJCW5vYXV0b2RtYSA9IDE7CisJCXJldHVybiAxOworCX0KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBDSQorCWlmICghc3RyY21wKHMsICJpZGU9cmV2ZXJzZSIpKSB7CisJCWlkZV9zY2FuX2RpcmVjdGlvbiA9IDE7CisJCXByaW50aygiIDogRW5hYmxlZCBzdXBwb3J0IGZvciBJREUgaW52ZXJzZSBzY2FuIG9yZGVyLlxuIik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVQQ0kgKi8KKworCS8qCisJICogTG9vayBmb3IgZHJpdmUgb3B0aW9uczogICJoZHg9IgorCSAqLworCWlmIChzWzBdID09ICdoJyAmJiBzWzFdID09ICdkJyAmJiBzWzJdID49ICdhJyAmJiBzWzJdIDw9IG1heF9kcml2ZSkgeworCQljb25zdCBjaGFyICpoZF93b3Jkc1tdID0geworCQkJIm5vbmUiLCAibm9wcm9iZSIsICJub3dlcnIiLCAiY2Ryb20iLCAic2VyaWFsaXplIiwKKwkJCSJhdXRvdHVuZSIsICJub2F1dG90dW5lIiwgIm1pbnVzOCIsICJzd2FwZGF0YSIsICJic3dhcCIsCisJCQkibWludXMxMSIsICJyZW1hcCIsICJyZW1hcDYzIiwgInNjc2kiLCBOVUxMIH07CisJCXVuaXQgPSBzWzJdIC0gJ2EnOworCQlodyAgID0gdW5pdCAvIE1BWF9EUklWRVM7CisJCXVuaXQgPSB1bml0ICUgTUFYX0RSSVZFUzsKKwkJaHdpZiA9ICZpZGVfaHdpZnNbaHddOworCQlkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisJCWlmIChzdHJuY21wKHMgKyA0LCAiaWRlLSIsIDQpID09IDApIHsKKwkJCXN0cmxjcHkoZHJpdmUtPmRyaXZlcl9yZXEsIHMgKyA0LCBzaXplb2YoZHJpdmUtPmRyaXZlcl9yZXEpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzd2l0Y2ggKG1hdGNoX3Bhcm0oJnNbM10sIGhkX3dvcmRzLCB2YWxzLCAzKSkgeworCQkJY2FzZSAtMTogLyogIm5vbmUiICovCisJCQljYXNlIC0yOiAvKiAibm9wcm9iZSIgKi8KKwkJCQlkcml2ZS0+bm9wcm9iZSA9IDE7CisJCQkJZ290byBkb25lOworCQkJY2FzZSAtMzogLyogIm5vd2VyciIgKi8KKwkJCQlkcml2ZS0+YmFkX3dzdGF0ID0gQkFEX1JfU1RBVDsKKwkJCQlod2lmLT5ub3Byb2JlID0gMDsKKwkJCQlnb3RvIGRvbmU7CisJCQljYXNlIC00OiAvKiAiY2Ryb20iICovCisJCQkJZHJpdmUtPnByZXNlbnQgPSAxOworCQkJCWRyaXZlLT5tZWRpYSA9IGlkZV9jZHJvbTsKKwkJCQkvKiBhbiBBVEFQSSBkZXZpY2UgaWdub3JlcyBEUkRZICovCisJCQkJZHJpdmUtPnJlYWR5X3N0YXQgPSAwOworCQkJCWh3aWYtPm5vcHJvYmUgPSAwOworCQkJCWdvdG8gZG9uZTsKKwkJCWNhc2UgLTU6IC8qICJzZXJpYWxpemUiICovCisJCQkJcHJpbnRrKCIgLS0gVVNFIFwiaWRlJWQ9c2VyaWFsaXplXCIgSU5TVEVBRCIsIGh3KTsKKwkJCQlnb3RvIGRvX3NlcmlhbGl6ZTsKKwkJCWNhc2UgLTY6IC8qICJhdXRvdHVuZSIgKi8KKwkJCQlkcml2ZS0+YXV0b3R1bmUgPSBJREVfVFVORV9BVVRPOworCQkJCWdvdG8gb2Jzb2xldGVfb3B0aW9uOworCQkJY2FzZSAtNzogLyogIm5vYXV0b3R1bmUiICovCisJCQkJZHJpdmUtPmF1dG90dW5lID0gSURFX1RVTkVfTk9BVVRPOworCQkJCWdvdG8gb2Jzb2xldGVfb3B0aW9uOworCQkJY2FzZSAtOTogLyogInN3YXBkYXRhIiAqLworCQkJY2FzZSAtMTA6IC8qICJic3dhcCIgKi8KKwkJCQlkcml2ZS0+YnN3YXAgPSAxOworCQkJCWdvdG8gZG9uZTsKKwkJCWNhc2UgLTEyOiAvKiAicmVtYXAiICovCisJCQkJZHJpdmUtPnJlbWFwXzBfdG9fMSA9IDE7CisJCQkJZ290byBkb25lOworCQkJY2FzZSAtMTM6IC8qICJyZW1hcDYzIiAqLworCQkJCWRyaXZlLT5zZWN0MCA9IDYzOworCQkJCWdvdG8gZG9uZTsKKwkJCWNhc2UgLTE0OiAvKiAic2NzaSIgKi8KKwkJCQlkcml2ZS0+c2NzaSA9IDE7CisJCQkJZ290byBkb25lOworCQkJY2FzZSAzOiAvKiBjeWwsaGVhZCxzZWN0ICovCisJCQkJZHJpdmUtPm1lZGlhCT0gaWRlX2Rpc2s7CisJCQkJZHJpdmUtPnJlYWR5X3N0YXQgPSBSRUFEWV9TVEFUOworCQkJCWRyaXZlLT5jeWwJPSBkcml2ZS0+Ymlvc19jeWwgID0gdmFsc1swXTsKKwkJCQlkcml2ZS0+aGVhZAk9IGRyaXZlLT5iaW9zX2hlYWQgPSB2YWxzWzFdOworCQkJCWRyaXZlLT5zZWN0CT0gZHJpdmUtPmJpb3Nfc2VjdCA9IHZhbHNbMl07CisJCQkJZHJpdmUtPnByZXNlbnQJPSAxOworCQkJCWRyaXZlLT5mb3JjZWRfZ2VvbSA9IDE7CisJCQkJaHdpZi0+bm9wcm9iZSA9IDA7CisJCQkJZ290byBkb25lOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCX0KKwl9CisKKwlpZiAoc1swXSAhPSAnaScgfHwgc1sxXSAhPSAnZCcgfHwgc1syXSAhPSAnZScpCisJCWdvdG8gYmFkX29wdGlvbjsKKwkvKgorCSAqIExvb2sgZm9yIGJ1cyBzcGVlZCBvcHRpb246ICAiaWRlYnVzPSIKKwkgKi8KKwlpZiAoc1szXSA9PSAnYicgJiYgc1s0XSA9PSAndScgJiYgc1s1XSA9PSAncycpIHsKKwkJaWYgKG1hdGNoX3Bhcm0oJnNbNl0sIE5VTEwsIHZhbHMsIDEpICE9IDEpCisJCQlnb3RvIGJhZF9vcHRpb247CisJCWlmICh2YWxzWzBdID49IDIwICYmIHZhbHNbMF0gPD0gNjYpIHsKKwkJCWlkZWJ1c19wYXJhbWV0ZXIgPSB2YWxzWzBdOworCQl9IGVsc2UKKwkJCXByaW50aygiIC0tIEJBRCBCVVMgU1BFRUQhIEV4cGVjdGVkIHZhbHVlIGZyb20gMjAgdG8gNjYiKTsKKwkJZ290byBkb25lOworCX0KKwkvKgorCSAqIExvb2sgZm9yIGludGVyZmFjZSBvcHRpb25zOiAgImlkZXg9IgorCSAqLworCWlmIChzWzNdID49ICcwJyAmJiBzWzNdIDw9IG1heF9od2lmKSB7CisJCS8qCisJCSAqIEJlIFZFUlkgQ0FSRUZVTCBjaGFuZ2luZyB0aGlzOiBub3RlIGhhcmRjb2RlZCBpbmRleGVzIGJlbG93CisJCSAqICgtOCwgLTksIC0xMCkgYXJlIHJlc2VydmVkIHRvIGVhc2UgdGhlIGhhcmRjb2RpbmcuCisJCSAqLworCQlzdGF0aWMgY29uc3QgY2hhciAqaWRlX3dvcmRzW10gPSB7CisJCQkibm9wcm9iZSIsICJzZXJpYWxpemUiLCAiYXV0b3R1bmUiLCAibm9hdXRvdHVuZSIsIAorCQkJInJlc2V0IiwgImRtYSIsICJhdGE2NiIsICJtaW51czgiLCAibWludXM5IiwKKwkJCSJtaW51czEwIiwgImZvdXIiLCAicWQ2NXh4IiwgImh0NjU2MGIiLCAiY21kNjQwX3ZsYiIsCisJCQkiZHRjMjI3OCIsICJ1bWM4NjcyIiwgImFsaTE0eHgiLCBOVUxMIH07CisJCWh3ID0gc1szXSAtICcwJzsKKwkJaHdpZiA9ICZpZGVfaHdpZnNbaHddOworCQlpID0gbWF0Y2hfcGFybSgmc1s0XSwgaWRlX3dvcmRzLCB2YWxzLCAzKTsKKworCQkvKgorCQkgKiBDcnlwdGljIGNoZWNrIHRvIGVuc3VyZSBjaGlwc2V0IG5vdCBhbHJlYWR5IHNldCBmb3IgaHdpZi4KKwkJICogTm90ZTogd2UgY2FuJ3QgZGVwZW5kIG9uIGh3aWYtPmNoaXBzZXQgaGVyZS4KKwkJICovCisJCWlmICgoaSA+PSAtMTggJiYgaSA8PSAtMTEpIHx8IChpID4gMCAmJiBpIDw9IDMpKSB7CisJCQkvKiBjaGlwc2V0IGFscmVhZHkgc3BlY2lmaWVkICovCisJCQlpZiAoaXNfY2hpcHNldF9zZXRbaHddKQorCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCWlmIChpID4gLTE4ICYmIGkgPD0gLTExKSB7CisJCQkJLyogdGhlc2UgZHJpdmVycyBhcmUgZm9yICJpZGUwPSIgb25seSAqLworCQkJCWlmIChodyAhPSAwKQorCQkJCQlnb3RvIGJhZF9od2lmOworCQkJCS8qIGNoaXBzZXQgYWxyZWFkeSBzcGVjaWZpZWQgZm9yIDJuZCBwb3J0ICovCisJCQkJaWYgKGlzX2NoaXBzZXRfc2V0W2h3KzFdKQorCQkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCQlpc19jaGlwc2V0X3NldFtod10gPSAxOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisKKwkJc3dpdGNoIChpKSB7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQUxJMTRYWAorCQkJY2FzZSAtMTc6IC8qICJhbGkxNHh4IiAqLworCQkJCXByb2JlX2FsaTE0eHggPSAxOworCQkJCWdvdG8gZG9uZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CTEtfREVWX1VNQzg2NzIKKwkJCWNhc2UgLTE2OiAvKiAidW1jODY3MiIgKi8KKwkJCQlwcm9iZV91bWM4NjcyID0gMTsKKwkJCQlnb3RvIGRvbmU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9EVEMyMjc4CisJCQljYXNlIC0xNTogLyogImR0YzIyNzgiICovCisJCQkJcHJvYmVfZHRjMjI3OCA9IDE7CisJCQkJZ290byBkb25lOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwCisJCQljYXNlIC0xNDogLyogImNtZDY0MF92bGIiICovCisJCQl7CisJCQkJZXh0ZXJuIGludCBjbWQ2NDBfdmxiOyAvKiBmbGFnIGZvciBjbWQ2NDAuYyAqLworCQkJCWNtZDY0MF92bGIgPSAxOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19CTEtfREVWX0hUNjU2MEIKKwkJCWNhc2UgLTEzOiAvKiAiaHQ2NTYwYiIgKi8KKwkJCQlwcm9iZV9odDY1NjBiID0gMTsKKwkJCQlnb3RvIGRvbmU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9RRDY1WFgKKwkJCWNhc2UgLTEyOiAvKiAicWQ2NXh4IiAqLworCQkJCXByb2JlX3FkNjV4eCA9IDE7CisJCQkJZ290byBkb25lOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfNERSSVZFUworCQkJY2FzZSAtMTE6IC8qICJmb3VyIiBkcml2ZXMgb24gb25lIHNldCBvZiBwb3J0cyAqLworCQkJeworCQkJCWlkZV9od2lmX3QgKm1hdGUgPSAmaWRlX2h3aWZzW2h3XjFdOworCQkJCW1hdGUtPmRyaXZlc1swXS5zZWxlY3QuYWxsIF49IDB4MjA7CisJCQkJbWF0ZS0+ZHJpdmVzWzFdLnNlbGVjdC5hbGwgXj0gMHgyMDsKKwkJCQlod2lmLT5jaGlwc2V0ID0gbWF0ZS0+Y2hpcHNldCA9IGlkZV80ZHJpdmVzOworCQkJCW1hdGUtPmlycSA9IGh3aWYtPmlycTsKKwkJCQltZW1jcHkobWF0ZS0+aW9fcG9ydHMsIGh3aWYtPmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKKwkJCQlnb3RvIGRvX3NlcmlhbGl6ZTsKKwkJCX0KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl80RFJJVkVTICovCisJCQljYXNlIC0xMDogLyogbWludXMxMCAqLworCQkJY2FzZSAtOTogLyogbWludXM5ICovCisJCQljYXNlIC04OiAvKiBtaW51czggKi8KKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQljYXNlIC03OiAvKiBhdGE2NiAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBDSQorCQkJCWh3aWYtPnVkbWFfZm91ciA9IDE7CisJCQkJZ290byBvYnNvbGV0ZV9vcHRpb247CisjZWxzZQorCQkJCWdvdG8gYmFkX2h3aWY7CisjZW5kaWYKKwkJCWNhc2UgLTY6IC8qIGRtYSAqLworCQkJCWh3aWYtPmF1dG9kbWEgPSAxOworCQkJCWdvdG8gb2Jzb2xldGVfb3B0aW9uOworCQkJY2FzZSAtNTogLyogInJlc2V0IiAqLworCQkJCWh3aWYtPnJlc2V0ID0gMTsKKwkJCQlnb3RvIG9ic29sZXRlX29wdGlvbjsKKwkJCWNhc2UgLTQ6IC8qICJub2F1dG90dW5lIiAqLworCQkJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IElERV9UVU5FX05PQVVUTzsKKwkJCQlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSBJREVfVFVORV9OT0FVVE87CisJCQkJZ290byBvYnNvbGV0ZV9vcHRpb247CisJCQljYXNlIC0zOiAvKiAiYXV0b3R1bmUiICovCisJCQkJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gSURFX1RVTkVfQVVUTzsKKwkJCQlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSBJREVfVFVORV9BVVRPOworCQkJCWdvdG8gb2Jzb2xldGVfb3B0aW9uOworCQkJY2FzZSAtMjogLyogInNlcmlhbGl6ZSIgKi8KKwkJCWRvX3NlcmlhbGl6ZToKKwkJCQlod2lmLT5tYXRlID0gJmlkZV9od2lmc1tod14xXTsKKwkJCQlod2lmLT5tYXRlLT5tYXRlID0gaHdpZjsKKwkJCQlod2lmLT5zZXJpYWxpemVkID0gaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IDE7CisJCQkJZ290byBvYnNvbGV0ZV9vcHRpb247CisKKwkJCWNhc2UgLTE6IC8qICJub3Byb2JlIiAqLworCQkJCWh3aWYtPm5vcHJvYmUgPSAxOworCQkJCWdvdG8gZG9uZTsKKworCQkJY2FzZSAxOgkvKiBiYXNlICovCisJCQkJdmFsc1sxXSA9IHZhbHNbMF0gKyAweDIwNjsgLyogZGVmYXVsdCBjdGwgKi8KKwkJCWNhc2UgMjogLyogYmFzZSxjdGwgKi8KKwkJCQl2YWxzWzJdID0gMDsJLyogZGVmYXVsdCBpcnEgPSBwcm9iZSBmb3IgaXQgKi8KKwkJCWNhc2UgMzogLyogYmFzZSxjdGwsaXJxICovCisJCQkJaHdpZi0+aHcuaXJxID0gdmFsc1syXTsKKwkJCQlpZGVfaW5pdF9od2lmX3BvcnRzKCZod2lmLT5odywgKHVuc2lnbmVkIGxvbmcpIHZhbHNbMF0sICh1bnNpZ25lZCBsb25nKSB2YWxzWzFdLCAmaHdpZi0+aXJxKTsKKwkJCQltZW1jcHkoaHdpZi0+aW9fcG9ydHMsIGh3aWYtPmh3LmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKKwkJCQlod2lmLT5pcnEgICAgICA9IHZhbHNbMl07CisJCQkJaHdpZi0+bm9wcm9iZSAgPSAwOworCQkJCWh3aWYtPmNoaXBzZXQgID0gaWRlX2ZvcmNlZDsKKwkJCQlnb3RvIG9ic29sZXRlX29wdGlvbjsKKworCQkJY2FzZSAwOiBnb3RvIGJhZF9vcHRpb247CisJCQlkZWZhdWx0OgorCQkJCXByaW50aygiIC0tIFNVUFBPUlQgTk9UIENPTkZJR1VSRUQgSU4gVEhJUyBLRVJORUxcbiIpOworCQkJCXJldHVybiAxOworCQl9CisJfQorYmFkX29wdGlvbjoKKwlwcmludGsoIiAtLSBCQUQgT1BUSU9OXG4iKTsKKwlyZXR1cm4gMTsKK29ic29sZXRlX29wdGlvbjoKKwlwcmludGsoIiAtLSBPQlNPTEVURSBPUFRJT04sIFdJTEwgQkUgUkVNT1ZFRCBTT09OIVxuIik7CisJcmV0dXJuIDE7CitiYWRfaHdpZjoKKwlwcmludGsoIi0tIE5PVCBTVVBQT1JURUQgT04gaWRlJWQiLCBodyk7Citkb25lOgorCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KKworZXh0ZXJuIHZvaWQgcG5waWRlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBoODMwMF9pZGVfaW5pdCh2b2lkKTsKKworLyoKKyAqIHByb2JlX2Zvcl9od2lmcygpIGZpbmRzL2luaXRpYWxpemVzICJrbm93biIgSURFIGludGVyZmFjZXMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHByb2JlX2Zvcl9od2lmcyAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVQQ0kKKwlpZGVfc2Nhbl9wY2lidXMoaWRlX3NjYW5fZGlyZWN0aW9uKTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVQQ0kgKi8KKworI2lmZGVmIENPTkZJR19FVFJBWF9JREUKKwl7CisJCWV4dGVybiB2b2lkIGluaXRfZTEwMF9pZGUodm9pZCk7CisJCWluaXRfZTEwMF9pZGUoKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0VUUkFYX0lERSAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0NNRDY0MAorCXsKKwkJZXh0ZXJuIHZvaWQgaWRlX3Byb2JlX2Zvcl9jbWQ2NDB4KHZvaWQpOworCQlpZGVfcHJvYmVfZm9yX2NtZDY0MHgoKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfQ01ENjQwICovCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1BNQUMKKwl7CisJCWV4dGVybiB2b2lkIHBtYWNfaWRlX3Byb2JlKHZvaWQpOworCQlwbWFjX2lkZV9wcm9iZSgpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0dBWUxFCisJeworCQlleHRlcm4gdm9pZCBnYXlsZV9pbml0KHZvaWQpOworCQlnYXlsZV9pbml0KCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0dBWUxFICovCisjaWZkZWYgQ09ORklHX0JMS19ERVZfRkFMQ09OX0lERQorCXsKKwkJZXh0ZXJuIHZvaWQgZmFsY29uaWRlX2luaXQodm9pZCk7CisJCWZhbGNvbmlkZV9pbml0KCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0ZBTENPTl9JREUgKi8KKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9NQUNfSURFCisJeworCQlleHRlcm4gdm9pZCBtYWNpZGVfaW5pdCh2b2lkKTsKKwkJbWFjaWRlX2luaXQoKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfTUFDX0lERSAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX1E0MElERQorCXsKKwkJZXh0ZXJuIHZvaWQgcTQwaWRlX2luaXQodm9pZCk7CisJCXE0MGlkZV9pbml0KCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX1E0MElERSAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0JVRERIQQorCXsKKwkJZXh0ZXJuIHZvaWQgYnVkZGhhX2luaXQodm9pZCk7CisJCWJ1ZGRoYV9pbml0KCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0JVRERIQSAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBOUAorCXBucGlkZV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSDgzMDAKKwloODMwMF9pZGVfaW5pdCgpOworI2VuZGlmCit9CisKK2ludCBpZGVfcmVnaXN0ZXJfc3ViZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2RyaXZlcl90ICpkcml2ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWlmICghZHJpdmUtPnByZXNlbnQgfHwgZHJpdmUtPmRyaXZlciAhPSBOVUxMIHx8CisJICAgIGRyaXZlLT51c2FnZSB8fCBkcml2ZS0+ZGVhZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisJZHJpdmUtPmRyaXZlciA9IGRyaXZlcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZHJpdmVzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmRyaXZlLT5saXN0LCBkcml2ZXIgPyAmZHJpdmVyLT5kcml2ZXMgOiAmaWRlX2RyaXZlcyk7CisJc3Bpbl91bmxvY2soJmRyaXZlc19sb2NrKTsKKy8vCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdHRhY2hlZCAlcyBkcml2ZXIuXG4iLCBkcml2ZS0+bmFtZSwgZHJpdmVyLT5uYW1lKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmIChkcml2ZXIpCisJCWlkZV9hZGRfcHJvY19lbnRyaWVzKGRyaXZlLT5wcm9jLCBkcml2ZXItPnByb2MsIGRyaXZlKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGlkZV9yZWdpc3Rlcl9zdWJkcml2ZXIpOworCisvKioKKyAqCWlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcgktCWRpc2Nvbm5lY3QgZHJpdmUgZnJvbSBkcml2ZXIKKyAqCUBkcml2ZTogZHJpdmUgdG8gdW5wbHVnCisgKgorICoJRGlzY29ubmVjdCBhIGRyaXZlIGZyb20gdGhlIGRyaXZlciBpdCB3YXMgYXR0YWNoZWQgdG8gYW5kIHRoZW4KKyAqCWNsZWFuIHVwIHRoZSB2YXJpb3VzIHByb2MgZmlsZXMgYW5kIG90aGVyIG9iamVjdHMgYXR0YWNoZWQgdG8gaXQuCisgKgorICoJVGFrZXMgaWRlX3NldHRpbmdfc2VtLCBpZGVfbG9jayBhbmQgZHJpdmVzX2xvY2suCisgKglDYWxsZXIgbXVzdCBob2xkIG5vbmUgb2YgdGhlIGxvY2tzLgorICoKKyAqCU5vIGxvY2tpbmcgdmVyc3VzIHN1YmRyaXZlciB1bmxvYWQgYmVjYXVzZSB3ZSBhcmUgbW92aW5nIHRvIHRoZQorICoJZGVmYXVsdCBkcml2ZXIgYW55d2F5LiBXYW50cyBkb3VibGUgY2hlY2tpbmcuCisgKi8KKworaW50IGlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlciAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJZG93bigmaWRlX3NldHRpbmdfc2VtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoZHJpdmUtPnVzYWdlIHx8IGRyaXZlLT5kcml2ZXIgPT0gTlVMTCB8fCBEUklWRVIoZHJpdmUpLT5idXN5KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXVwKCZpZGVfc2V0dGluZ19zZW0pOworCQlyZXR1cm4gMTsKKwl9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZGVfcmVtb3ZlX3Byb2NfZW50cmllcyhkcml2ZS0+cHJvYywgRFJJVkVSKGRyaXZlKS0+cHJvYyk7CisjZW5kaWYKKwlhdXRvX3JlbW92ZV9zZXR0aW5ncyhkcml2ZSk7CisJZHJpdmUtPmRyaXZlciA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwl1cCgmaWRlX3NldHRpbmdfc2VtKTsKKwlzcGluX2xvY2soJmRyaXZlc19sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZkcml2ZS0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmRyaXZlc19sb2NrKTsKKwkvKiBkcml2ZSB3aWxsIGJlIGFkZGVkIHRvICZpZGVfZHJpdmVzIGluIGF0YV9hdHRhY2goKSAqLworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcik7CisKK3N0YXRpYyBpbnQgaWRlX2RyaXZlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCWlkZV9kcml2ZV90ICogZHJpdmUgPSBjb250YWluZXJfb2YoZGV2LGlkZV9kcml2ZV90LGdlbmRldik7CisJRFJJVkVSKGRyaXZlKS0+Y2xlYW51cChkcml2ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaWRlX3JlZ2lzdGVyX2RyaXZlcgktCXJlZ2lzdGVyIElERSBkZXZpY2UgZHJpdmVyCisgKglAZHJpdmVyOiB0aGUgSURFIGRldmljZSBkcml2ZXIKKyAqCisgKglSZWdpc3RlciBhIG5ldyBkZXZpY2UgZHJpdmVyIGFuZCB0aGVuIHNjYW4gdGhlIGRldmljZXMKKyAqCW9uIHRoZSBJREUgYnVzIGluIGNhc2UgYW55IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUKKyAqCWRyaXZlciB3ZSBoYXZlIGp1c3QgcmVnaXN0ZXJlZC4gIElmIHNvIGF0dGFjaCB0aGVtLgorICoKKyAqCVRha2VzIGRyaXZlcnNfbG9jayBhbmQgZHJpdmVzX2xvY2suCisgKi8KKworaW50IGlkZV9yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlcl90ICpkcml2ZXIpCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfbG9vcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXBfc3RvcmFnZTsKKworCXNwaW5fbG9jaygmZHJpdmVyc19sb2NrKTsKKwlsaXN0X2FkZCgmZHJpdmVyLT5kcml2ZXJzLCAmZHJpdmVycyk7CisJc3Bpbl91bmxvY2soJmRyaXZlcnNfbG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CisJc3Bpbl9sb2NrKCZkcml2ZXNfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmaWRlX2RyaXZlcywgJmxpc3QpOworCXNwaW5fdW5sb2NrKCZkcml2ZXNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9sb29wLCB0bXBfc3RvcmFnZSwgJmxpc3QpIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gY29udGFpbmVyX29mKGxpc3RfbG9vcCwgaWRlX2RyaXZlX3QsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZkcml2ZS0+bGlzdCk7CisJCWlmIChkcml2ZS0+cHJlc2VudCkKKwkJCWF0YV9hdHRhY2goZHJpdmUpOworCX0KKwlkcml2ZXItPmdlbl9kcml2ZXIubmFtZSA9IChjaGFyICopIGRyaXZlci0+bmFtZTsKKwlkcml2ZXItPmdlbl9kcml2ZXIuYnVzID0gJmlkZV9idXNfdHlwZTsKKwlkcml2ZXItPmdlbl9kcml2ZXIucmVtb3ZlID0gaWRlX2RyaXZlX3JlbW92ZTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmdlbl9kcml2ZXIpOworfQorCitFWFBPUlRfU1lNQk9MKGlkZV9yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqCWlkZV91bnJlZ2lzdGVyX2RyaXZlcgktCXVucmVnaXN0ZXIgSURFIGRldmljZSBkcml2ZXIKKyAqCUBkcml2ZXI6IHRoZSBJREUgZGV2aWNlIGRyaXZlcgorICoKKyAqCUNhbGxlZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZC4gV2UgcmVhdHRhY2ggYW55CisgKglkZXZpY2VzIHRvIHdoYXRldmVyIGRyaXZlciBjbGFpbXMgdGhlbSBuZXh0ICh0eXBpY2FsbHkgdGhlIGRlZmF1bHQKKyAqCWRyaXZlcikuCisgKgorICoJVGFrZXMgZHJpdmVyc19sb2NrIGFuZCBjYWxsZWQgZnVuY3Rpb25zIHdpbGwgdGFrZSBpZGVfc2V0dGluZ19zZW0uCisgKi8KKwordm9pZCBpZGVfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlcl90ICpkcml2ZXIpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCisJc3Bpbl9sb2NrKCZkcml2ZXJzX2xvY2spOworCWxpc3RfZGVsKCZkcml2ZXItPmRyaXZlcnMpOworCXNwaW5fdW5sb2NrKCZkcml2ZXJzX2xvY2spOworCisJZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlci0+Z2VuX2RyaXZlcik7CisKKwl3aGlsZSghbGlzdF9lbXB0eSgmZHJpdmVyLT5kcml2ZXMpKSB7CisJCWRyaXZlID0gbGlzdF9lbnRyeShkcml2ZXItPmRyaXZlcy5uZXh0LCBpZGVfZHJpdmVfdCwgbGlzdCk7CisJCWlmIChkcml2ZXItPmNsZWFudXAoZHJpdmUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjbGVhbnVwX21vZHVsZSgpIGNhbGxlZCB3aGlsZSBzdGlsbCBidXN5XG4iLCBkcml2ZS0+bmFtZSk7CisJCQlCVUcoKTsKKwkJfQorCQlhdGFfYXR0YWNoKGRyaXZlKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woaWRlX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyoKKyAqIFByb2JlIG1vZHVsZQorICovCisKK0VYUE9SVF9TWU1CT0woaWRlX2xvY2spOworCitzdHJ1Y3QgYnVzX3R5cGUgaWRlX2J1c190eXBlID0geworCS5uYW1lCQk9ICJpZGUiLAorCS5zdXNwZW5kCT0gZ2VuZXJpY19pZGVfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGdlbmVyaWNfaWRlX3Jlc3VtZSwKK307CisKKy8qCisgKiBUaGlzIGlzIGdldHMgaW52b2tlZCBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbiwgdG8gc2V0ICpldmVyeXRoaW5nKiB1cAorICovCitzdGF0aWMgaW50IF9faW5pdCBpZGVfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlVuaWZvcm0gTXVsdGktUGxhdGZvcm0gRS1JREUgZHJpdmVyICIgUkVWSVNJT04gIlxuIik7CisJZGV2ZnNfbWtfZGlyKCJpZGUiKTsKKwlzeXN0ZW1fYnVzX3NwZWVkID0gaWRlX3N5c3RlbV9idXNfc3BlZWQoKTsKKworCWJ1c19yZWdpc3RlcigmaWRlX2J1c190eXBlKTsKKworCWluaXRfaWRlX2RhdGEoKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19pZGVfcm9vdCA9IHByb2NfbWtkaXIoImlkZSIsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9BTEkxNFhYCisJaWYgKHByb2JlX2FsaTE0eHgpCisJCSh2b2lkKWFsaTE0eHhfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfVU1DODY3MgorCWlmIChwcm9iZV91bWM4NjcyKQorCQkodm9pZCl1bWM4NjcyX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CTEtfREVWX0RUQzIyNzgKKwlpZiAocHJvYmVfZHRjMjI3OCkKKwkJKHZvaWQpZHRjMjI3OF9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9IVDY1NjBCCisJaWYgKHByb2JlX2h0NjU2MGIpCisJCSh2b2lkKWh0NjU2MGJfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfUUQ2NVhYCisJaWYgKHByb2JlX3FkNjV4eCkKKwkJKHZvaWQpcWQ2NXh4X2luaXQoKTsKKyNlbmRpZgorCisJaW5pdGlhbGl6aW5nID0gMTsKKwkvKiBQcm9iZSBmb3Igc3BlY2lhbCBQQ0kgYW5kIG90aGVyICJrbm93biIgaW50ZXJmYWNlIGNoaXBzZXRzLiAqLworCXByb2JlX2Zvcl9od2lmcygpOworCWluaXRpYWxpemluZyA9IDA7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfaWRlX2NyZWF0ZSgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBjaGFyICpvcHRpb25zID0gTlVMTDsKK21vZHVsZV9wYXJhbShvcHRpb25zLCBjaGFycCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9vcHRpb25zIChjaGFyICpsaW5lKQoreworCWNoYXIgKm5leHQgPSBsaW5lOworCisJaWYgKGxpbmUgPT0gTlVMTCB8fCAhKmxpbmUpCisJCXJldHVybjsKKwl3aGlsZSAoKGxpbmUgPSBuZXh0KSAhPSBOVUxMKSB7CisgCQlpZiAoKG5leHQgPSBzdHJjaHIobGluZSwnICcpKSAhPSBOVUxMKQorCQkJKm5leHQrKyA9IDA7CisJCWlmICghaWRlX3NldHVwKGxpbmUpKQorCQkJcHJpbnRrIChLRVJOX0lORk8gIlVua25vd24gb3B0aW9uICclcydcbiIsIGxpbmUpOworCX0KK30KKworaW50IGluaXRfbW9kdWxlICh2b2lkKQoreworCXBhcnNlX29wdGlvbnMob3B0aW9ucyk7CisJcmV0dXJuIGlkZV9pbml0KCk7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0hXSUZTOyArK2luZGV4KQorCQlpZGVfdW5yZWdpc3RlcihpbmRleCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfaWRlX2Rlc3Ryb3koKTsKKyNlbmRpZgorCWRldmZzX3JlbW92ZSgiaWRlIik7CisKKwlidXNfdW5yZWdpc3RlcigmaWRlX2J1c190eXBlKTsKK30KKworI2Vsc2UgLyogIU1PRFVMRSAqLworCitfX3NldHVwKCIiLCBpZGVfc2V0dXApOworCittb2R1bGVfaW5pdChpZGVfaW5pdCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzk3MTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKworb2JqLSQoQ09ORklHX0JMS19ERVZfQUxJMTRYWCkJCSs9IGFsaTE0eHgubworb2JqLSQoQ09ORklHX0JMS19ERVZfRFRDMjI3OCkJCSs9IGR0YzIyNzgubworb2JqLSQoQ09ORklHX0JMS19ERVZfSFQ2NTYwQikJCSs9IGh0NjU2MGIubworb2JqLSQoQ09ORklHX0JMS19ERVZfUUQ2NVhYKQkJKz0gcWQ2NXh4Lm8KK29iai0kKENPTkZJR19CTEtfREVWX1VNQzg2NzIpCQkrPSB1bWM4NjcyLm8KKworb2JqLSQoQ09ORklHX0JMS19ERVZfSURFQ1MpCQkrPSBpZGUtY3MubworCisjIExhc3Qgb2YgYWxsCitvYmotJChDT05GSUdfQkxLX0RFVl9IRCkJCSs9IGhkLm8KKworRVhUUkFfQ0ZMQUdTCTo9IC1JZHJpdmVycy9pZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9hbGkxNHh4LmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvYWxpMTR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODg3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvYWxpMTR4eC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9hbGkxNHh4LmMJCVZlcnNpb24gMC4wMwlGZWIgMDksIDE5OTYKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvciAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiBBTEkgTTE0eHggY2hpcHNldCBFSURFIGNvbnRyb2xsZXIKKyAqCisgKiBXb3JrcyBmb3IgQUxJIE0xNDM5LzE0NDMvMTQ0NS8xNDg3LzE0ODkgY2hpcHNldHMuCisgKgorICogQWRhcHRlZCBmcm9tIGNvZGUgZGV2ZWxvcGVkIGJ5IGRlcmVrbkB2dy5lY2UuY211LmVkdS4gIC1tbAorICogRGVyZWsncyBub3RlcyBmb2xsb3c6CisgKgorICogSSB0aGluayB0aGUgY29kZSBzaG91bGQgYmUgcHJldHR5IHVuZGVyc3RhbmRhYmxlLAorICogYnV0IEknbGwgYmUgaGFwcHkgdG8gKHRyeSB0bykgYW5zd2VyIHF1ZXN0aW9ucy4KKyAqCisgKiBUaGUgY3JpdGljYWwgcGFydCBpcyBpbiB0aGUgc2V0dXBEcml2ZSBmdW5jdGlvbi4gIFRoZSBpbml0UmVnaXN0ZXJzCisgKiBmdW5jdGlvbiBkb2Vzbid0IHNlZW0gdG8gYmUgbmVjZXNzYXJ5LCBidXQgdGhlIERPUyBkcml2ZXIgZG9lcyBpdCwgc28KKyAqIEkgdGhyZXcgaXQgaW4uCisgKgorICogSSd2ZSBvbmx5IHRlc3RlZCB0aGlzIG9uIG15IHN5c3RlbSwgd2hpY2ggb25seSBoYXMgb25lIGRpc2suICBJIHBvc3RlZAorICogaXQgdG8gY29tcC5zeXMubGludXguaGFyZHdhcmUsIHNvIG1heWJlIHNvbWUgb3RoZXIgcGVvcGxlIHdpbGwgdHJ5IGl0CisgKiBvdXQuCisgKgorICogRGVyZWsgTm9vbmJ1cmcgIChkZXJla25AZWNlLmNtdS5lZHUpCisgKiA5NS1zZXAtMjYKKyAqCisgKiBVcGRhdGUgOTYtanVsLTEzOgorICoKKyAqIEkndmUgc2luY2UgdXBncmFkZWQgdG8gdHdvIGRpc2tzIGFuZCBhIENELVJPTSwgd2l0aCBubyB0cm91YmxlLCBhbmQKKyAqIEkndmUgYWxzbyBoZWFyZCBmcm9tIHNldmVyYWwgb3RoZXJzIHdobyBoYXZlIHVzZWQgaXQgc3VjY2Vzc2Z1bGx5LgorICogVGhpcyBkcml2ZXIgYXBwZWFycyB0byB3b3JrIHdpdGggYm90aCB0aGUgMTQ0My8xNDQ1IGFuZCB0aGUgMTQ4Ny8xNDg5CisgKiBjaGlwc2V0cy4gIEkndmUgYWRkZWQgc3VwcG9ydCBmb3IgUElPIG1vZGUgNCBmb3IgdGhlIDE0ODcuICBUaGlzCisgKiBzZWVtcyB0byB3b3JrIGp1c3QgZmluZSBvbiB0aGUgMTQ0MyBhbHNvLCBhbHRob3VnaCBJJ20gbm90IHN1cmUgaXQncworICogYWR2ZXJ0aXNlZCBhcyBzdXBwb3J0aW5nIG1vZGUgNC4gIChJJ3ZlIGJlZW4gcnVubmluZyBhIFdEQyBBQzIxMjAwIGluCisgKiBtb2RlIDQgZm9yIGEgd2hpbGUgbm93IHdpdGggbm8gdHJvdWJsZS4pICAtRGVyZWsKKyAqLworCisjdW5kZWYgUkVBTExZX1NMT1dfSU8gICAgICAgICAgIC8qIG1vc3Qgc3lzdGVtcyBjYW4gc2FmZWx5IHVuZGVmIHRoaXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogcG9ydCBhZGRyZXNzZXMgZm9yIGF1dG8tZGV0ZWN0aW9uICovCisjZGVmaW5lIEFMSV9OVU1fUE9SVFMgNAorc3RhdGljIGludCBwb3J0c1tBTElfTlVNX1BPUlRTXSBfX2luaXRkYXRhID0gezB4MDc0LCAweDBmNCwgMHgwMzQsIDB4MGU0fTsKKworLyogcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1OCByZWcsIGRhdGE7IH0gUmVnSW5pdGlhbGl6ZXI7CisKK3N0YXRpYyBSZWdJbml0aWFsaXplciBpbml0RGF0YVtdIF9faW5pdGRhdGEgPSB7CisJezB4MDEsIDB4MGZ9LCB7MHgwMiwgMHgwMH0sIHsweDAzLCAweDAwfSwgezB4MDQsIDB4MDB9LAorCXsweDA1LCAweDAwfSwgezB4MDYsIDB4MDB9LCB7MHgwNywgMHgyYn0sIHsweDBhLCAweDBmfSwKKwl7MHgyNSwgMHgwMH0sIHsweDI2LCAweDAwfSwgezB4MjcsIDB4MDB9LCB7MHgyOCwgMHgwMH0sCisJezB4MjksIDB4MDB9LCB7MHgyYSwgMHgwMH0sIHsweDJmLCAweDAwfSwgezB4MmIsIDB4MDB9LAorCXsweDJjLCAweDAwfSwgezB4MmQsIDB4MDB9LCB7MHgyZSwgMHgwMH0sIHsweDMwLCAweDAwfSwKKwl7MHgzMSwgMHgwMH0sIHsweDMyLCAweDAwfSwgezB4MzMsIDB4MDB9LCB7MHgzNCwgMHhmZn0sCisJezB4MzUsIDB4MDN9LCB7MHgwMCwgMHgwMH0KK307CisKKyNkZWZpbmUgQUxJX01BWF9QSU8gNAorCisvKiB0aW1pbmcgcGFyYW1ldGVyIHJlZ2lzdGVycyBmb3IgZWFjaCBkcml2ZSAqLworc3RhdGljIHN0cnVjdCB7IHU4IHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQ7IH0gcmVnVGFiWzRdID0geworCXsweDAzLCAweDI2LCAweDA0LCAweDI3fSwgICAgIC8qIGRyaXZlIDAgKi8KKwl7MHgwNSwgMHgyOCwgMHgwNiwgMHgyOX0sICAgICAvKiBkcml2ZSAxICovCisJezB4MmIsIDB4MzAsIDB4MmMsIDB4MzF9LCAgICAgLyogZHJpdmUgMiAqLworCXsweDJkLCAweDMyLCAweDJlLCAweDMzfSwgICAgIC8qIGRyaXZlIDMgKi8KK307CisKK3N0YXRpYyBpbnQgYmFzZVBvcnQ7CS8qIGJhc2UgcG9ydCBhZGRyZXNzICovCitzdGF0aWMgaW50IHJlZ1BvcnQ7CS8qIHBvcnQgZm9yIHJlZ2lzdGVyIG51bWJlciAqLworc3RhdGljIGludCBkYXRhUG9ydDsJLyogcG9ydCBmb3IgcmVnaXN0ZXIgZGF0YSAqLworc3RhdGljIHU4IHJlZ09uOwkvKiBvdXRwdXQgdG8gYmFzZSBwb3J0IHRvIGFjY2VzcyByZWdpc3RlcnMgKi8KK3N0YXRpYyB1OCByZWdPZmY7CS8qIG91dHB1dCB0byBiYXNlIHBvcnQgdG8gY2xvc2UgcmVnaXN0ZXJzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFJlYWQgYSBjb250cm9sbGVyIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHU4IGluUmVnICh1OCByZWcpCit7CisJb3V0Yl9wKHJlZywgcmVnUG9ydCk7CisJcmV0dXJuIGluYihkYXRhUG9ydCk7Cit9CisKKy8qCisgKiBXcml0ZSBhIGNvbnRyb2xsZXIgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIG91dFJlZyAodTggZGF0YSwgdTggcmVnKQoreworCW91dGJfcChyZWcsIHJlZ1BvcnQpOworCW91dGJfcChkYXRhLCBkYXRhUG9ydCk7Cit9CisKKy8qCisgKiBTZXQgUElPIG1vZGUgZm9yIHRoZSBzcGVjaWZpZWQgZHJpdmUuCisgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRpbWluZyBwYXJhbWV0ZXJzCisgKiBhbmQgc2V0cyBjb250cm9sbGVyIHJlZ2lzdGVycyBhY2NvcmRpbmdseS4KKyAqLworc3RhdGljIHZvaWQgYWxpMTR4eF90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpbnQgZHJpdmVOdW07CisJaW50IHRpbWUxLCB0aW1lMjsKKwl1OCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZGVfcGlvX2RhdGFfdCBkOworCWludCBidXNfc3BlZWQgPSBzeXN0ZW1fYnVzX2Nsb2NrKCk7CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgQUxJX01BWF9QSU8sICZkKTsKKworCS8qIGNhbGN1bGF0ZSB0aW1pbmcsIGFjY29yZGluZyB0byBQSU8gbW9kZSAqLworCXRpbWUxID0gZC5jeWNsZV90aW1lOworCXRpbWUyID0gaWRlX3Bpb190aW1pbmdzW3Bpb10uYWN0aXZlX3RpbWU7CisJcGFyYW0zID0gcGFyYW0xID0gKHRpbWUyICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDA7CisJcGFyYW00ID0gcGFyYW0yID0gKHRpbWUxICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDAgLSBwYXJhbTE7CisJaWYgKHBpbyA8IDMpIHsKKwkJcGFyYW0zICs9IDg7CisJCXBhcmFtNCArPSA4OworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBJTyBtb2RlJWQsIHQxPSVkbnMsIHQyPSVkbnMsIGN5Y2xlcyA9ICVkKyVkLCAlZCslZFxuIiwKKwkJZHJpdmUtPm5hbWUsIHBpbywgdGltZTEsIHRpbWUyLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpOworCisJLyogc3R1ZmYgdGltaW5nIHBhcmFtZXRlcnMgaW50byBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCWRyaXZlTnVtID0gKEhXSUYoZHJpdmUpLT5pbmRleCA8PCAxKSArIGRyaXZlLT5zZWxlY3QuYi51bml0OworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCW91dGJfcChyZWdPbiwgYmFzZVBvcnQpOworCW91dFJlZyhwYXJhbTEsIHJlZ1RhYltkcml2ZU51bV0ucmVnMSk7CisJb3V0UmVnKHBhcmFtMiwgcmVnVGFiW2RyaXZlTnVtXS5yZWcyKTsKKwlvdXRSZWcocGFyYW0zLCByZWdUYWJbZHJpdmVOdW1dLnJlZzMpOworCW91dFJlZyhwYXJhbTQsIHJlZ1RhYltkcml2ZU51bV0ucmVnNCk7CisJb3V0Yl9wKHJlZ09mZiwgYmFzZVBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBBdXRvLWRldGVjdCB0aGUgSURFIGNvbnRyb2xsZXIgcG9ydC4KKyAqLworc3RhdGljIGludCBfX2luaXQgZmluZFBvcnQgKHZvaWQpCit7CisJaW50IGk7CisJdTggdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBBTElfTlVNX1BPUlRTOyArK2kpIHsKKwkJYmFzZVBvcnQgPSBwb3J0c1tpXTsKKwkJcmVnT2ZmID0gaW5iKGJhc2VQb3J0KTsKKwkJZm9yIChyZWdPbiA9IDB4MzA7IHJlZ09uIDw9IDB4MzM7ICsrcmVnT24pIHsKKwkJCW91dGJfcChyZWdPbiwgYmFzZVBvcnQpOworCQkJaWYgKGluYihiYXNlUG9ydCkgPT0gcmVnT24pIHsKKwkJCQlyZWdQb3J0ID0gYmFzZVBvcnQgKyA0OworCQkJCWRhdGFQb3J0ID0gYmFzZVBvcnQgKyA4OworCQkJCXQgPSBpblJlZygwKSAmIDB4ZjA7CisJCQkJb3V0Yl9wKHJlZ09mZiwgYmFzZVBvcnQpOworCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQlpZiAodCAhPSAweDUwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gMTsgIC8qIHN1Y2Nlc3MgKi8KKwkJCX0KKwkJfQorCQlvdXRiX3AocmVnT2ZmLCBiYXNlUG9ydCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgY29udHJvbGxlciByZWdpc3RlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdFJlZ2lzdGVycyAodm9pZCkgeworCVJlZ0luaXRpYWxpemVyICpwOworCXU4IHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlvdXRiX3AocmVnT24sIGJhc2VQb3J0KTsKKwlmb3IgKHAgPSBpbml0RGF0YTsgcC0+cmVnICE9IDA7ICsrcCkKKwkJb3V0UmVnKHAtPmRhdGEsIHAtPnJlZyk7CisJb3V0Yl9wKDB4MDEsIHJlZ1BvcnQpOworCXQgPSBpbmIocmVnUG9ydCkgJiAweDAxOworCW91dGJfcChyZWdPZmYsIGJhc2VQb3J0KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFsaTE0eHhfcHJvYmUodm9pZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmLCAqbWF0ZTsKKworCXByaW50ayhLRVJOX0RFQlVHICJhbGkxNHh4OiBiYXNlPTB4JTAzeCwgcmVnT249MHglMDJ4LlxuIiwKKwkJCSAgYmFzZVBvcnQsIHJlZ09uKTsKKworCS8qIGluaXRpYWxpemUgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKwlpZiAoIWluaXRSZWdpc3RlcnMoKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFsaTE0eHg6IENoaXAgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWh3aWYgPSAmaWRlX2h3aWZzWzBdOworCW1hdGUgPSAmaWRlX2h3aWZzWzFdOworCisJaHdpZi0+Y2hpcHNldCA9IGlkZV9hbGkxNHh4OworCWh3aWYtPnR1bmVwcm9jID0gJmFsaTE0eHhfdHVuZV9kcml2ZTsKKwlod2lmLT5tYXRlID0gbWF0ZTsKKworCW1hdGUtPmNoaXBzZXQgPSBpZGVfYWxpMTR4eDsKKwltYXRlLT50dW5lcHJvYyA9ICZhbGkxNHh4X3R1bmVfZHJpdmU7CisJbWF0ZS0+bWF0ZSA9IGh3aWY7CisJbWF0ZS0+Y2hhbm5lbCA9IDE7CisKKwlwcm9iZV9od2lmX2luaXQoaHdpZik7CisJcHJvYmVfaHdpZl9pbml0KG1hdGUpOworCisJY3JlYXRlX3Byb2NfaWRlX2ludGVyZmFjZXMoKTsKKworCXJldHVybiAwOworfQorCisvKiBDYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gaWRlLmMuICovCitpbnQgX19pbml0IGFsaTE0eHhfaW5pdCh2b2lkKQoreworCS8qIGF1dG8tZGV0ZWN0IElERSBjb250cm9sbGVyIHBvcnQgKi8KKwlpZiAoZmluZFBvcnQoKSkgeworCQlpZiAoYWxpMTR4eF9wcm9iZSgpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAwOworCX0KKwlwcmludGsoS0VSTl9FUlIgImFsaTE0eHg6IG5vdCBmb3VuZC5cbiIpOworCXJldHVybiAtRU5PREVWOworfQorCisjaWZkZWYgTU9EVUxFCittb2R1bGVfaW5pdChhbGkxNHh4X2luaXQpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoInNlZSBsb2NhbCBmaWxlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInN1cHBvcnQgb2YgQUxJIDE0WFggSURFIGNoaXBzZXRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvYnVkZGhhLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvYnVkZGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9idWRkaGEuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9sZWdhY3kvYnVkZGhhLmMgLS0gQW1pZ2EgQnVkZGhhLCBDYXR3ZWFzZWwgYW5kIFgtU3VyZiBJREUgRHJpdmVyCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAxIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiBhbmQgb3RoZXJzCisgKgorICogIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBzcGVjaWZpY2F0aW9ucyBpbiBSRUFETUUuYnVkZGhhIGFuZAorICogIHRoZSBYLVN1cmYgaW5mbyBmcm9tIEluc2lkZV9YU3VyZi50eHQgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5qc2Nob2VuZmVsZC5jb20KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFRPRE86CisgKiAgICAtIHRlc3QgaXQgOi0pCisgKiAgICAtIHR1bmUgdGhlIHRpbWluZ3MgdXNpbmcgdGhlIHNwZWVkLXJlZ2lzdGVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisKKworICAgIC8qCisgICAgICogIFRoZSBCdWRkaGEgaGFzIDIgSURFIGludGVyZmFjZXMsIHRoZSBDYXR3ZWFzZWwgaGFzIDMsIFgtU3VyZiBoYXMgMgorICAgICAqLworCisjZGVmaW5lIEJVRERIQV9OVU1fSFdJRlMJMgorI2RlZmluZSBDQVRXRUFTRUxfTlVNX0hXSUZTCTMKKyNkZWZpbmUgWFNVUkZfTlVNX0hXSUZTICAgICAgICAgMgorCisgICAgLyoKKyAgICAgKiAgQmFzZXMgb2YgdGhlIElERSBpbnRlcmZhY2VzIChyZWxhdGl2ZSB0byB0aGUgYm9hcmQgYWRkcmVzcykKKyAgICAgKi8KKworI2RlZmluZSBCVURESEFfQkFTRTEJMHg4MDAKKyNkZWZpbmUgQlVEREhBX0JBU0UyCTB4YTAwCisjZGVmaW5lIEJVRERIQV9CQVNFMwkweGMwMAorCisjZGVmaW5lIFhTVVJGX0JBU0UxICAgICAweGIwMDAgLyogMi41IiBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgWFNVUkZfQkFTRTIgICAgIDB4ZDAwMCAvKiAzLjUiIEludGVyZmFjZSAqLworCitzdGF0aWMgdV9pbnQgYnVkZGhhX2Jhc2VzW0NBVFdFQVNFTF9OVU1fSFdJRlNdIF9faW5pdGRhdGEgPSB7CisgICAgQlVEREhBX0JBU0UxLCBCVURESEFfQkFTRTIsIEJVRERIQV9CQVNFMworfTsKKworc3RhdGljIHVfaW50IHhzdXJmX2Jhc2VzW1hTVVJGX05VTV9IV0lGU10gX19pbml0ZGF0YSA9IHsKKyAgICAgWFNVUkZfQkFTRTEsIFhTVVJGX0JBU0UyCit9OworCisKKyAgICAvKgorICAgICAqICBPZmZzZXRzIGZyb20gb25lIG9mIHRoZSBhYm92ZSBiYXNlcworICAgICAqLworCisjZGVmaW5lIEJVRERIQV9EQVRBCTB4MDAKKyNkZWZpbmUgQlVEREhBX0VSUk9SCTB4MDYJCS8qIHNlZSBlcnItYml0cyAqLworI2RlZmluZSBCVURESEFfTlNFQ1RPUgkweDBhCQkvKiBuciBvZiBzZWN0b3JzIHRvIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQlVEREhBX1NFQ1RPUgkweDBlCQkvKiBzdGFydGluZyBzZWN0b3IgKi8KKyNkZWZpbmUgQlVEREhBX0xDWUwJMHgxMgkJLyogc3RhcnRpbmcgY3lsaW5kZXIgKi8KKyNkZWZpbmUgQlVEREhBX0hDWUwJMHgxNgkJLyogaGlnaCBieXRlIG9mIHN0YXJ0aW5nIGN5bCAqLworI2RlZmluZSBCVURESEFfU0VMRUNUCTB4MWEJCS8qIDEwMWRoaGhoICwgZD1kcml2ZSwgaGhoaD1oZWFkICovCisjZGVmaW5lIEJVRERIQV9TVEFUVVMJMHgxZQkJLyogc2VlIHN0YXR1cy1iaXRzICovCisjZGVmaW5lIEJVRERIQV9DT05UUk9MCTB4MTFhCisjZGVmaW5lIFhTVVJGX0NPTlRST0wgICAtMSAgICAgICAgICAgICAgLyogWC1TdXJmIGhhcyBubyBDUzEqIChDb250cm9sL0FsdFN0YXQpICovCisKK3N0YXRpYyBpbnQgYnVkZGhhX29mZnNldHNbSURFX05SX1BPUlRTXSBfX2luaXRkYXRhID0geworICAgIEJVRERIQV9EQVRBLCBCVURESEFfRVJST1IsIEJVRERIQV9OU0VDVE9SLCBCVURESEFfU0VDVE9SLCBCVURESEFfTENZTCwKKyAgICBCVURESEFfSENZTCwgQlVEREhBX1NFTEVDVCwgQlVEREhBX1NUQVRVUywgQlVEREhBX0NPTlRST0wsIC0xCit9OworCitzdGF0aWMgaW50IHhzdXJmX29mZnNldHNbSURFX05SX1BPUlRTXSBfX2luaXRkYXRhID0geworICAgIEJVRERIQV9EQVRBLCBCVURESEFfRVJST1IsIEJVRERIQV9OU0VDVE9SLCBCVURESEFfU0VDVE9SLCBCVURESEFfTENZTCwKKyAgICBCVURESEFfSENZTCwgQlVEREhBX1NFTEVDVCwgQlVEREhBX1NUQVRVUywgWFNVUkZfQ09OVFJPTCwgLTEKK307CisKKyAgICAvKgorICAgICAqICBPdGhlciByZWdpc3RlcnMKKyAgICAgKi8KKworI2RlZmluZSBCVURESEFfSVJRMQkweGYwMAkJLyogTVNCID0gMSwgSGFyZGRpc2sgaXMgc291cmNlIG9mICovCisjZGVmaW5lIEJVRERIQV9JUlEyCTB4ZjQwCQkvKiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQlVEREhBX0lSUTMJMHhmODAKKworI2RlZmluZSBYU1VSRl9JUlExICAgICAgMHg3ZQorI2RlZmluZSBYU1VSRl9JUlEyICAgICAgMHg3ZQorCitzdGF0aWMgaW50IGJ1ZGRoYV9pcnFwb3J0c1tDQVRXRUFTRUxfTlVNX0hXSUZTXSBfX2luaXRkYXRhID0geworICAgIEJVRERIQV9JUlExLCBCVURESEFfSVJRMiwgQlVEREhBX0lSUTMKK307CisKK3N0YXRpYyBpbnQgeHN1cmZfaXJxcG9ydHNbWFNVUkZfTlVNX0hXSUZTXSBfX2luaXRkYXRhID0geworICAgIFhTVVJGX0lSUTEsIFhTVVJGX0lSUTIKK307CisKKyNkZWZpbmUgQlVEREhBX0lSUV9NUgkweGZjMAkJLyogbWFzdGVyIGludGVycnVwdCBlbmFibGUgKi8KKworCisgICAgLyoKKyAgICAgKiAgQm9hcmQgaW5mb3JtYXRpb24KKyAgICAgKi8KKwordHlwZWRlZiBlbnVtIEJ1ZGRoYVR5cGVfRW51bSB7CisgICAgQk9BUkRfQlVEREhBLCBCT0FSRF9DQVRXRUFTRUwsIEJPQVJEX1hTVVJGCit9IEJ1ZGRoYVR5cGU7CisKKworICAgIC8qCisgICAgICogIENoZWNrIGFuZCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IHN0YXR1cworICAgICAqLworCitzdGF0aWMgaW50IGJ1ZGRoYV9hY2tfaW50cihpZGVfaHdpZl90ICpod2lmKQoreworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgICBjaCA9IHpfcmVhZGIoaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdKTsKKyAgICBpZiAoIShjaCAmIDB4ODApKQorCSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB4c3VyZl9hY2tfaW50cihpZGVfaHdpZl90ICpod2lmKQoreworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgICBjaCA9IHpfcmVhZGIoaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdKTsKKyAgICAvKiBYLVN1cmYgbmVlZHMgYSAwIHdyaXR0ZW4gdG8gSVJRIHJlZ2lzdGVyIHRvIGVuc3VyZSBJU0EgYml0IEExMSBzdGF5cyBhdCAwICovCisgICAgel93cml0ZWIoMCwgaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdKTsgCisgICAgaWYgKCEoY2ggJiAweDgwKSkKKwkgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKyAgICAvKgorICAgICAqICBQcm9iZSBmb3IgYSBCdWRkaGEgb3IgQ2F0d2Vhc2VsIElERSBpbnRlcmZhY2UKKyAgICAgKi8KKwordm9pZCBfX2luaXQgYnVkZGhhX2luaXQodm9pZCkKK3sKKwlod19yZWdzX3QgaHc7CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlpbnQgaSwgaW5kZXg7CisKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1X2xvbmcgYnVkZGhhX2JvYXJkID0gMDsKKwlCdWRkaGFUeXBlIHR5cGU7CisJaW50IGJ1ZGRoYV9udW1faHdpZnM7CisKKwl3aGlsZSAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19XSUxEQ0FSRCwgeikpKSB7CisJCXVuc2lnbmVkIGxvbmcgYm9hcmQ7CisJCWlmICh6LT5pZCA9PSBaT1JST19QUk9EX0lORElWSURVQUxfQ09NUFVURVJTX0JVRERIQSkgeworCQkJYnVkZGhhX251bV9od2lmcyA9IEJVRERIQV9OVU1fSFdJRlM7CisJCQl0eXBlPUJPQVJEX0JVRERIQTsKKwkJfSBlbHNlIGlmICh6LT5pZCA9PSBaT1JST19QUk9EX0lORElWSURVQUxfQ09NUFVURVJTX0NBVFdFQVNFTCkgeworCQkJYnVkZGhhX251bV9od2lmcyA9IENBVFdFQVNFTF9OVU1fSFdJRlM7CisJCQl0eXBlPUJPQVJEX0NBVFdFQVNFTDsKKwkJfSBlbHNlIGlmICh6LT5pZCA9PSBaT1JST19QUk9EX0lORElWSURVQUxfQ09NUFVURVJTX1hfU1VSRikgeworCQkJYnVkZGhhX251bV9od2lmcyA9IFhTVVJGX05VTV9IV0lGUzsKKwkJCXR5cGU9Qk9BUkRfWFNVUkY7CisJCX0gZWxzZSAKKwkJCWNvbnRpbnVlOworCQkKKwkJYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKworLyoKKyAqIEZJWE1FOiB3ZSBub3cgaGF2ZSBzZWxlY3RhYmxlIG1taW8gdi9zIGlvbWlvIHRyYW5zcG9ydHMuCisgKi8KKworCQlpZih0eXBlICE9IEJPQVJEX1hTVVJGKSB7CisJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtCVURESEFfQkFTRTEsIDB4ODAwLCAiSURFIikpCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtYU1VSRl9CQVNFMSwgMHgxMDAwLCAiSURFIikpCisJCQkJY29udGludWU7CisJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtYU1VSRl9CQVNFMiwgMHgxMDAwLCAiSURFIikpCisJCQkJZ290byBmYWlsX2Jhc2UyOworCQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrWFNVUkZfSVJRMSwgMHg4LCAiSURFIikpIHsKKwkJCQlyZWxlYXNlX21lbV9yZWdpb24oYm9hcmQrWFNVUkZfQkFTRTIsIDB4MTAwMCk7CitmYWlsX2Jhc2UyOgorCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihib2FyZCtYU1VSRl9CQVNFMSwgMHgxMDAwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQkgIAorCQlidWRkaGFfYm9hcmQgPSBaVFdPX1ZBRERSKGJvYXJkKTsKKwkJCisJCS8qIHdyaXRlIHRvIEJVRERIQV9JUlFfTVIgdG8gZW5hYmxlIHRoZSBib2FyZCBJUlEgKi8KKwkJLyogWC1TdXJmIGRvZXNuJ3QgaGF2ZSB0aGlzLiAgSVJRcyBhcmUgYWx3YXlzIG9uICovCisJCWlmICh0eXBlICE9IEJPQVJEX1hTVVJGKQorCQkJel93cml0ZWIoMCwgYnVkZGhhX2JvYXJkK0JVRERIQV9JUlFfTVIpOworCQkKKwkJZm9yKGk9MDtpPGJ1ZGRoYV9udW1faHdpZnM7aSsrKSB7CisJCQlpZih0eXBlICE9IEJPQVJEX1hTVVJGKSB7CisJCQkJaWRlX3NldHVwX3BvcnRzKCZodywgKGJ1ZGRoYV9ib2FyZCtidWRkaGFfYmFzZXNbaV0pLAorCQkJCQkJYnVkZGhhX29mZnNldHMsIDAsCisJCQkJCQkoYnVkZGhhX2JvYXJkK2J1ZGRoYV9pcnFwb3J0c1tpXSksCisJCQkJCQlidWRkaGFfYWNrX2ludHIsCisvLwkJCQkJCWJ1ZGRhX2lvcHMsCisJCQkJCQlJUlFfQU1JR0FfUE9SVFMpOworCQkJfSBlbHNlIHsKKwkJCQlpZGVfc2V0dXBfcG9ydHMoJmh3LCAoYnVkZGhhX2JvYXJkK3hzdXJmX2Jhc2VzW2ldKSwKKwkJCQkJCXhzdXJmX29mZnNldHMsIDAsCisJCQkJCQkoYnVkZGhhX2JvYXJkK3hzdXJmX2lycXBvcnRzW2ldKSwKKwkJCQkJCXhzdXJmX2Fja19pbnRyLAorLy8JCQkJCQl4c3VyZl9pb3BzLAorCQkJCQkJSVJRX0FNSUdBX1BPUlRTKTsKKwkJCX0JCisJCQkKKwkJCWluZGV4ID0gaWRlX3JlZ2lzdGVyX2h3KCZodywgJmh3aWYpOworCQkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQkJaHdpZi0+bW1pbyA9IDI7CisJCQkJcHJpbnRrKCJpZGUlZDogIiwgaW5kZXgpOworCQkJCXN3aXRjaCh0eXBlKSB7CisJCQkJY2FzZSBCT0FSRF9CVURESEE6CisJCQkJCXByaW50aygiQnVkZGhhIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQk9BUkRfQ0FUV0VBU0VMOgorCQkJCQlwcmludGsoIkNhdHdlYXNlbCIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEJPQVJEX1hTVVJGOgorCQkJCQlwcmludGsoIlgtU3VyZiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRrKCIgSURFIGludGVyZmFjZVxuIik7CSAgICAKKwkJCX0JCSAgICAgIAorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2R0YzIyNzguYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9kdGMyMjc4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYjViOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9kdGMyMjc4LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pZGUvbGVnYWN5L2R0YzIyNzguYwkJVmVyc2lvbiAwLjAyCUZlYiAxMCwgMTk5NgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9yIChzZWUgYmVsb3cpCisgKi8KKworI3VuZGVmIFJFQUxMWV9TTE9XX0lPICAgICAgICAgICAvKiBtb3N0IHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBDaGFuZ2luZyB0aGlzICN1bmRlZiB0byAjZGVmaW5lIG1heSBzb2x2ZSBzdGFydCB1cCBwcm9ibGVtcyBpbiBzb21lIHN5c3RlbXMuCisgKi8KKyN1bmRlZiBBTFdBWVNfU0VUX0RUQzIyNzhfUElPX01PREUKKworLyoKKyAqIEZyb206IGFuZHlAY2VyY2xlLmN0cy5jb20gKER5YW4gV2lsZSkKKyAqCisgKiBCZWxvdyBpcyBhIHBhdGNoIGZvciBEVEMtMjI3OCAtIGFsaWtlIHNvZnR3YXJlLXByb2dyYW1tYWJsZSBjb250cm9sbGVycworICogVGhlIGNvZGUgZW5hYmxlcyB0aGUgc2Vjb25kYXJ5IElERSBjb250cm9sbGVyIGFuZCB0aGUgUElPNCAoMz8pIHRpbWluZ3Mgb24KKyAqIHRoZSBwcmltYXJ5IChFSURFKS4gWW91IG1heSBwcm9iYWJseSBoYXZlIHRvIGVuYWJsZSB0aGUgMzItYml0IHN1cHBvcnQgdG8KKyAqIGdldCB0aGUgZnVsbCBzcGVlZC4gWW91IGJldHRlciBnZXQgdGhlIGRpc2sgaW50ZXJydXB0cyBkaXNhYmxlZCAoIGhkcGFybSAtdTAKKyAqIC9kZXYvaGQuLiApIGZvciB0aGUgZHJpdmVzIGNvbm5lY3RlZCB0byB0aGUgRUlERSBpbnRlcmZhY2UuIChJIGdldCBteQorICogZmlsZXN5c3RlbSAgY29ycnVwdGVkIHdpdGggLXUxLCBidXQgdW5kZXIgaGVhdnkgZGlzayBsb2FkIG9ubHkgOi0pCisgKgorICogVGhpcyBjYXJkIGlzIG5vdyBmb3JjZWQgdG8gdXNlIHRoZSAic2VyaWFsaXplIiBmZWF0dXJlLAorICogYW5kIGlycS11bm1hc2tpbmcgaXMgZGlzYWxsb3dlZC4gIElmIGlvXzMyYml0IGlzIGVuYWJsZWQsCisgKiBpdCBtdXN0IGJlIGRvbmUgZm9yIEJPVEggZHJpdmVzIG9uIGVhY2ggaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiBmb3IgdGhlIERUQzIyNzhFLCBidXQgbWlnaHQgd29yayB3aXRoIGFueSBvZiB0aGVzZToKKyAqCisgKiBEVEMyMjc4UyBoYXMgb25seSBhIHNpbmdsZSBJREUgaW50ZXJmYWNlLgorICogRFRDMjI3OEQgaGFzIHR3byBJREUgaW50ZXJmYWNlcyBhbmQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbCB0byB0aGUgUyB2ZXJzaW9uLgorICogRFRDMjI3OEUgYWxzbyBoYXMgc2VyaWFsIHBvcnRzIGFuZCBhIHByaW50ZXIgcG9ydAorICogRFRDMjI3OEVCOiBoYXMgb25ib2FyZCBCSU9TLCBhbmQgIndvcmtzIGxpa2UgYSBjaGFybSIgLS0gS2VudCBCcmFkZm9yZCA8a2VudEB0aGVvcnkuY2FsdGVjaC5lZHU+CisgKgorICogVGhlcmUgbWF5IGJlIGEgZm91cnRoIGNvbnRyb2xsZXIgdHlwZS4gVGhlIFMgYW5kIEQgdmVyc2lvbnMgdXNlIHRoZQorICogV2luYm9uZCBjaGlwLCBhbmQgSSB0aGluayB0aGUgRSB2ZXJzaW9uIGRvZXMgYWxzby4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgc3ViMjIgKGNoYXIgYiwgY2hhciBjKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCWluYigweDNmNik7CisJCW91dGJfcChiLDB4YjApOworCQlpbmIoMHgzZjYpOworCQlvdXRiX3AoYywweGI0KTsKKwkJaW5iKDB4M2Y2KTsKKwkJaWYoaW5iKDB4YjQpID09IGMpIHsKKwkJCW91dGJfcCg3LDB4YjApOworCQkJaW5iKDB4M2Y2KTsKKwkJCXJldHVybjsJLyogc3VjY2VzcyAqLworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB0dW5lX2R0YzIyNzggKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNCwgTlVMTCk7CisKKwlpZiAocGlvID49IDMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCS8qCisJCSAqIFRoaXMgZW5hYmxlcyBQSU8gbW9kZTQgKDM/KSBvbiB0aGUgZmlyc3QgaW50ZXJmYWNlCisJCSAqLworCQlzdWIyMigxLDB4YzMpOworCQlzdWIyMigwLDB4YTApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIHdlIGRvbid0IGtub3cgaG93IHRvIHNldCBpdCBiYWNrIGFnYWluLi4gKi8KKwl9CisKKwkvKgorCSAqIDMyYml0IEkvTyBoYXMgdG8gYmUgZW5hYmxlZCBmb3IgKmJvdGgqIGRyaXZlcyBhdCB0aGUgc2FtZSB0aW1lLgorCSAqLworCWRyaXZlLT5pb18zMmJpdCA9IDE7CisJSFdJRihkcml2ZSktPmRyaXZlc1shZHJpdmUtPnNlbGVjdC5iLnVuaXRdLmlvXzMyYml0ID0gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfZHRjMjI3OCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWRlX2h3aWZfdCAqaHdpZiwgKm1hdGU7CisKKwlod2lmID0gJmlkZV9od2lmc1swXTsKKwltYXRlID0gJmlkZV9od2lmc1sxXTsKKworCWlmIChod2lmLT5jaGlwc2V0ICE9IGlkZV91bmtub3duIHx8IG1hdGUtPmNoaXBzZXQgIT0gaWRlX3Vua25vd24pCisJCXJldHVybiAxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qCisJICogVGhpcyBlbmFibGVzIHRoZSBzZWNvbmQgaW50ZXJmYWNlCisJICovCisJb3V0Yl9wKDQsMHhiMCk7CisJaW5iKDB4M2Y2KTsKKwlvdXRiX3AoMHgyMCwweGI0KTsKKwlpbmIoMHgzZjYpOworI2lmZGVmIEFMV0FZU19TRVRfRFRDMjI3OF9QSU9fTU9ERQorCS8qCisJICogVGhpcyBlbmFibGVzIFBJTyBtb2RlNCAoMz8pIG9uIHRoZSBmaXJzdCBpbnRlcmZhY2UKKwkgKiBhbmQgbWF5IHNvbHZlIHN0YXJ0LXVwIHByb2JsZW1zIGZvciBzb21lIHBlb3BsZS4KKwkgKi8KKwlzdWIyMigxLDB4YzMpOworCXN1YjIyKDAsMHhhMCk7CisjZW5kaWYKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlod2lmLT5zZXJpYWxpemVkID0gMTsKKwlod2lmLT5jaGlwc2V0ID0gaWRlX2R0YzIyNzg7CisJaHdpZi0+dHVuZXByb2MgPSAmdHVuZV9kdGMyMjc4OworCWh3aWYtPmRyaXZlc1swXS5ub191bm1hc2sgPSAxOworCWh3aWYtPmRyaXZlc1sxXS5ub191bm1hc2sgPSAxOworCWh3aWYtPm1hdGUgPSBtYXRlOworCisJbWF0ZS0+c2VyaWFsaXplZCA9IDE7CisJbWF0ZS0+Y2hpcHNldCA9IGlkZV9kdGMyMjc4OworCW1hdGUtPmRyaXZlc1swXS5ub191bm1hc2sgPSAxOworCW1hdGUtPmRyaXZlc1sxXS5ub191bm1hc2sgPSAxOworCW1hdGUtPm1hdGUgPSBod2lmOworCW1hdGUtPmNoYW5uZWwgPSAxOworCisJcHJvYmVfaHdpZl9pbml0KGh3aWYpOworCXByb2JlX2h3aWZfaW5pdChtYXRlKTsKKworCWNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGlkZS5jLiAqLworaW50IF9faW5pdCBkdGMyMjc4X2luaXQodm9pZCkKK3sKKwlpZiAocHJvYmVfZHRjMjI3OCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHRjMjI3ODogaWRlIGludGVyZmFjZXMgYWxyZWFkeSBpbiB1c2UhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9pbml0KGR0YzIyNzhfaW5pdCk7CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiU2VlIExvY2FsIEZpbGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigic3VwcG9ydCBvZiBEVEMtMjI3OCBWTEIgSURFIGNoaXBzZXRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvZmFsY29uaWRlLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvZmFsY29uaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMmNkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9mYWxjb25pZGUuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9mYWxjb25pZGUuYyAtLSBBdGFyaSBGYWxjb24gSURFIERyaXZlcgorICoKKyAqICAgICBDcmVhdGVkIDEyIEp1bCAxOTk3IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+CisKKworICAgIC8qCisgICAgICogIEJhc2Ugb2YgdGhlIElERSBpbnRlcmZhY2UKKyAgICAgKi8KKworI2RlZmluZSBBVEFfSERfQkFTRQkweGZmZjAwMDAwCisKKyAgICAvKgorICAgICAqICBPZmZzZXRzIGZyb20gdGhlIGFib3ZlIGJhc2UKKyAgICAgKi8KKworI2RlZmluZSBBVEFfSERfREFUQQkweDAwCisjZGVmaW5lIEFUQV9IRF9FUlJPUgkweDA1CQkvKiBzZWUgZXJyLWJpdHMgKi8KKyNkZWZpbmUgQVRBX0hEX05TRUNUT1IJMHgwOQkJLyogbnIgb2Ygc2VjdG9ycyB0byByZWFkL3dyaXRlICovCisjZGVmaW5lIEFUQV9IRF9TRUNUT1IJMHgwZAkJLyogc3RhcnRpbmcgc2VjdG9yICovCisjZGVmaW5lIEFUQV9IRF9MQ1lMCTB4MTEJCS8qIHN0YXJ0aW5nIGN5bGluZGVyICovCisjZGVmaW5lIEFUQV9IRF9IQ1lMCTB4MTUJCS8qIGhpZ2ggYnl0ZSBvZiBzdGFydGluZyBjeWwgKi8KKyNkZWZpbmUgQVRBX0hEX1NFTEVDVAkweDE5CQkvKiAxMDFkaGhoaCAsIGQ9ZHJpdmUsIGhoaGg9aGVhZCAqLworI2RlZmluZSBBVEFfSERfU1RBVFVTCTB4MWQJCS8qIHNlZSBzdGF0dXMtYml0cyAqLworI2RlZmluZSBBVEFfSERfQ09OVFJPTAkweDM5CisKK3N0YXRpYyBpbnQgZmFsY29uaWRlX29mZnNldHNbSURFX05SX1BPUlRTXSBfX2luaXRkYXRhID0geworICAgIEFUQV9IRF9EQVRBLCBBVEFfSERfRVJST1IsIEFUQV9IRF9OU0VDVE9SLCBBVEFfSERfU0VDVE9SLCBBVEFfSERfTENZTCwKKyAgICBBVEFfSERfSENZTCwgQVRBX0hEX1NFTEVDVCwgQVRBX0hEX1NUQVRVUywgQVRBX0hEX0NPTlRST0wsIC0xCit9OworCisKKyAgICAvKgorICAgICAqICBmYWxjb25pZGVfaW50cl9sb2NrIGlzIHVzZWQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgSURFIGludGVycnVwdCwKKyAgICAgKiAgd2hpY2ggaXMgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbCBkcml2ZXJzLgorICAgICAqLworCitpbnQgZmFsY29uaWRlX2ludHJfbG9jazsKKworCisgICAgLyoKKyAgICAgKiAgUHJvYmUgZm9yIGEgRmFsY29uIElERSBpbnRlcmZhY2UKKyAgICAgKi8KKwordm9pZCBfX2luaXQgZmFsY29uaWRlX2luaXQodm9pZCkKK3sKKyAgICBpZiAoTUFDSF9JU19BVEFSSSAmJiBBVEFSSUhXX1BSRVNFTlQoSURFKSkgeworCWh3X3JlZ3NfdCBodzsKKwlpbnQgaW5kZXg7CisKKwlpZGVfc2V0dXBfcG9ydHMoJmh3LCBBVEFfSERfQkFTRSwgZmFsY29uaWRlX29mZnNldHMsCisJCQkwLCAwLCBOVUxMLAorLy8JCQlmYWxjb25pZGVfaW9wcywKKwkJCUlSUV9NRlBfSURFKTsKKwlpbmRleCA9IGlkZV9yZWdpc3Rlcl9odygmaHcsIE5VTEwpOworCisJaWYgKGluZGV4ICE9IC0xKQorCSAgICBwcmludGsoImlkZSVkOiBGYWxjb24gSURFIGludGVyZmFjZVxuIiwgaW5kZXgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9nYXlsZS5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L2dheWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYzNlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9nYXlsZS5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9nYXlsZS5jIC0tIEFtaWdhIEdheWxlIElERSBEcml2ZXIKKyAqCisgKiAgICAgQ3JlYXRlZCA5IEp1bCAxOTk3IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2F5bGUuaD4KKworCisgICAgLyoKKyAgICAgKiAgQmFzZXMgb2YgdGhlIElERSBpbnRlcmZhY2VzCisgICAgICovCisKKyNkZWZpbmUgR0FZTEVfQkFTRV80MDAwCTB4ZGQyMDIwCS8qIEE0MDAwL0E0MDAwVCAqLworI2RlZmluZSBHQVlMRV9CQVNFXzEyMDAJMHhkYTAwMDAJLyogQTEyMDAvQTYwMCBhbmQgRS1NYXRyaXggNTMwICovCisKKyAgICAvKgorICAgICAqICBPZmZzZXRzIGZyb20gb25lIG9mIHRoZSBhYm92ZSBiYXNlcworICAgICAqLworCisjZGVmaW5lIEdBWUxFX0RBVEEJMHgwMAorI2RlZmluZSBHQVlMRV9FUlJPUgkweDA2CQkvKiBzZWUgZXJyLWJpdHMgKi8KKyNkZWZpbmUgR0FZTEVfTlNFQ1RPUgkweDBhCQkvKiBuciBvZiBzZWN0b3JzIHRvIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgR0FZTEVfU0VDVE9SCTB4MGUJCS8qIHN0YXJ0aW5nIHNlY3RvciAqLworI2RlZmluZSBHQVlMRV9MQ1lMCTB4MTIJCS8qIHN0YXJ0aW5nIGN5bGluZGVyICovCisjZGVmaW5lIEdBWUxFX0hDWUwJMHgxNgkJLyogaGlnaCBieXRlIG9mIHN0YXJ0aW5nIGN5bCAqLworI2RlZmluZSBHQVlMRV9TRUxFQ1QJMHgxYQkJLyogMTAxZGhoaGggLCBkPWRyaXZlLCBoaGhoPWhlYWQgKi8KKyNkZWZpbmUgR0FZTEVfU1RBVFVTCTB4MWUJCS8qIHNlZSBzdGF0dXMtYml0cyAqLworI2RlZmluZSBHQVlMRV9DT05UUk9MCTB4MTAxYQorCitzdGF0aWMgaW50IGdheWxlX29mZnNldHNbSURFX05SX1BPUlRTXSBfX2luaXRkYXRhID0geworICAgIEdBWUxFX0RBVEEsIEdBWUxFX0VSUk9SLCBHQVlMRV9OU0VDVE9SLCBHQVlMRV9TRUNUT1IsIEdBWUxFX0xDWUwsCisgICAgR0FZTEVfSENZTCwgR0FZTEVfU0VMRUNULCBHQVlMRV9TVEFUVVMsIC0xLCAtMQorfTsKKworCisgICAgLyoKKyAgICAgKiAgVGhlc2UgYXJlIGF0IGRpZmZlcmVudCBvZmZzZXRzIGZyb20gdGhlIGJhc2UKKyAgICAgKi8KKworI2RlZmluZSBHQVlMRV9JUlFfNDAwMAkweGRkMzAyMAkvKiBNU0IgPSAxLCBIYXJkZGlzayBpcyBzb3VyY2Ugb2YgKi8KKyNkZWZpbmUgR0FZTEVfSVJRXzEyMDAJMHhkYTkwMDAJLyogaW50ZXJydXB0ICovCisKKworICAgIC8qCisgICAgICogIE9mZnNldCBvZiB0aGUgc2Vjb25kYXJ5IHBvcnQgZm9yIElERSBkb3VibGVycworICAgICAqICBOb3RlIHRoYXQgR0FZTEVfQ09OVFJPTCBpcyBOT1QgYXZhaWxhYmxlIHRoZW4hCisgICAgICovCisKKyNkZWZpbmUgR0FZTEVfTkVYVF9QT1JUCTB4MTAwMAorCisjaWZuZGVmIENPTkZJR19CTEtfREVWX0lERURPVUJMRVIKKyNkZWZpbmUgR0FZTEVfTlVNX0hXSUZTCQkxCisjZGVmaW5lIEdBWUxFX05VTV9QUk9CRV9IV0lGUwlHQVlMRV9OVU1fSFdJRlMKKyNkZWZpbmUgR0FZTEVfSEFTX0NPTlRST0xfUkVHCTEKKyNkZWZpbmUgR0FZTEVfSURFUkVHX1NJWkUJMHgyMDAwCisjZWxzZSAvKiBDT05GSUdfQkxLX0RFVl9JREVET1VCTEVSICovCisjZGVmaW5lIEdBWUxFX05VTV9IV0lGUwkJMgorI2RlZmluZSBHQVlMRV9OVU1fUFJPQkVfSFdJRlMJKGlkZV9kb3VibGVyID8gR0FZTEVfTlVNX0hXSUZTIDogXAorCQkJCQkgICAgICAgR0FZTEVfTlVNX0hXSUZTLTEpCisjZGVmaW5lIEdBWUxFX0hBU19DT05UUk9MX1JFRwkoIWlkZV9kb3VibGVyKQorI2RlZmluZSBHQVlMRV9JREVSRUdfU0laRQkoaWRlX2RvdWJsZXIgPyAweDEwMDAgOiAweDIwMDApCitpbnQgaWRlX2RvdWJsZXIgPSAwOwkvKiBzdXBwb3J0IElERSBkb3VibGVycz8gKi8KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVET1VCTEVSICovCisKKworICAgIC8qCisgICAgICogIENoZWNrIGFuZCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IHN0YXR1cworICAgICAqLworCitzdGF0aWMgaW50IGdheWxlX2Fja19pbnRyX2E0MDAwKGlkZV9od2lmX3QgKmh3aWYpCit7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKworICAgIGNoID0gel9yZWFkYihod2lmLT5pb19wb3J0c1tJREVfSVJRX09GRlNFVF0pOworICAgIGlmICghKGNoICYgR0FZTEVfSVJRX0lERSkpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2F5bGVfYWNrX2ludHJfYTEyMDAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworCisgICAgY2ggPSB6X3JlYWRiKGh3aWYtPmlvX3BvcnRzW0lERV9JUlFfT0ZGU0VUXSk7CisgICAgaWYgKCEoY2ggJiBHQVlMRV9JUlFfSURFKSkKKwlyZXR1cm4gMDsKKyAgICAodm9pZCl6X3JlYWRiKGh3aWYtPmlvX3BvcnRzW0lERV9TVEFUVVNfT0ZGU0VUXSk7CisgICAgel93cml0ZWIoMHg3YywgaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdKTsKKyAgICByZXR1cm4gMTsKK30KKworICAgIC8qCisgICAgICogIFByb2JlIGZvciBhIEdheWxlIElERSBpbnRlcmZhY2UgKGFuZCBvcHRpb25hbGx5IGZvciBhbiBJREUgZG91YmxlcikKKyAgICAgKi8KKwordm9pZCBfX2luaXQgZ2F5bGVfaW5pdCh2b2lkKQoreworICAgIGludCBhNDAwMCwgaTsKKworICAgIGlmICghTUFDSF9JU19BTUlHQSkKKwlyZXR1cm47CisKKyAgICBpZiAoKGE0MDAwID0gQU1JR0FIV19QUkVTRU5UKEE0MDAwX0lERSkpIHx8IEFNSUdBSFdfUFJFU0VOVChBMTIwMF9JREUpKQorCWdvdG8gZm91bmQ7CisKKyNpZmRlZiBDT05GSUdfWk9SUk8KKyAgICBpZiAoem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fUFJPRF9NVEVDX1ZJUEVSX01LX1ZfRV9NQVRSSVhfNTMwX1NDU0lfSURFLAorCQkJICBOVUxMKSkKKwlnb3RvIGZvdW5kOworI2VuZGlmCisgICAgcmV0dXJuOworCitmb3VuZDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgR0FZTEVfTlVNX1BST0JFX0hXSUZTOyBpKyspIHsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGN0cmxwb3J0LCBpcnFwb3J0OworCWlkZV9hY2tfaW50cl90ICphY2tfaW50cjsKKwlod19yZWdzX3QgaHc7CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2UsIHJlc19zdGFydCwgcmVzX247CisKKwlpZiAoYTQwMDApIHsKKwkgICAgcGh5c19iYXNlID0gR0FZTEVfQkFTRV80MDAwOworCSAgICBpcnFwb3J0ID0gKHVuc2lnbmVkIGxvbmcpWlRXT19WQUREUihHQVlMRV9JUlFfNDAwMCk7CisJICAgIGFja19pbnRyID0gZ2F5bGVfYWNrX2ludHJfYTQwMDA7CisJfSBlbHNlIHsKKwkgICAgcGh5c19iYXNlID0gR0FZTEVfQkFTRV8xMjAwOworCSAgICBpcnFwb3J0ID0gKHVuc2lnbmVkIGxvbmcpWlRXT19WQUREUihHQVlMRV9JUlFfMTIwMCk7CisJICAgIGFja19pbnRyID0gZ2F5bGVfYWNrX2ludHJfYTEyMDA7CisJfQorLyoKKyAqIEZJWE1FOiB3ZSBub3cgaGF2ZSBzZWxlY3RhYmxlIG1vZGVzIGJldHdlZW4gbW1pbyB2L3MgaW9taW8KKyAqLworCisJcGh5c19iYXNlICs9IGkqR0FZTEVfTkVYVF9QT1JUOworCisJcmVzX3N0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKXBoeXNfYmFzZSkgJiB+KEdBWUxFX05FWFRfUE9SVC0xKTsKKwlyZXNfbiA9IEdBWUxFX0lERVJFR19TSVpFOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzX3N0YXJ0LCByZXNfbiwgIklERSIpKQorCSAgICBjb250aW51ZTsKKworCWJhc2UgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKHBoeXNfYmFzZSk7CisJY3RybHBvcnQgPSBHQVlMRV9IQVNfQ09OVFJPTF9SRUcgPyAoYmFzZSArIEdBWUxFX0NPTlRST0wpIDogMDsKKworCWlkZV9zZXR1cF9wb3J0cygmaHcsIGJhc2UsIGdheWxlX29mZnNldHMsCisJCQljdHJscG9ydCwgaXJxcG9ydCwgYWNrX2ludHIsCisvLwkJCSZnYXlsZV9pb3BzLAorCQkJSVJRX0FNSUdBX1BPUlRTKTsKKworCWluZGV4ID0gaWRlX3JlZ2lzdGVyX2h3KCZodywgJmh3aWYpOworCWlmIChpbmRleCAhPSAtMSkgeworCSAgICBod2lmLT5tbWlvID0gMjsKKwkgICAgc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJICAgIHByaW50aygiaWRlJWQ6IEdheWxlIElERSBpbnRlcmZhY2UgKEElZCBzdHlsZSlcbiIsIGluZGV4LAorCQkJICAgYTQwMDAgPyA0MDAwIDogMTIwMCk7CisJCSAgICBicmVhazsKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVET1VCTEVSCisJCWNhc2UgMToKKwkJICAgIHByaW50aygiaWRlJWQ6IElERSBkb3VibGVyXG4iLCBpbmRleCk7CisJCSAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVET1VCTEVSICovCisJICAgIH0KKwl9IGVsc2UKKwkgICAgcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19zdGFydCwgcmVzX24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwOTA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgaGQgaW50ZXJydXB0IHN1cHBvcnQuIEl0IHRyYXZlcnNlcyB0aGUKKyAqIHJlcXVlc3QtbGlzdCwgdXNpbmcgaW50ZXJydXB0cyB0byBqdW1wIGJldHdlZW4gZnVuY3Rpb25zLiBBcworICogYWxsIHRoZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoaW4gaW50ZXJydXB0cywgd2UgbWF5IG5vdAorICogc2xlZXAuIFNwZWNpYWwgY2FyZSBpcyByZWNvbW1lbmRlZC4KKyAqCisgKiAgbW9kaWZpZWQgYnkgRHJldyBFY2toYXJkdCB0byBjaGVjayBuciBvZiBoZCdzIGZyb20gdGhlIENNT1MuCisgKgorICogIFRoYW5rcyB0byBCcmFua28gTGFua2VzdGVyLCBsYW5rZXN0ZUBmd2kudXZhLm5sLCB3aG8gZm91bmQgYSBidWcKKyAqICBpbiB0aGUgZWFybHkgZXh0ZW5kZWQtcGFydGl0aW9uIGNoZWNrcyBhbmQgYWRkZWQgRE0gcGFydGl0aW9ucworICoKKyAqICBJUlEtdW5tYXNrLCBkcml2ZS1pZCwgbXVsdGlwbGUtbW9kZSwgc3VwcG9ydCBmb3IgIj4xNiBoZWFkcyIsCisgKiAgYW5kIGdlbmVyYWwgc3RyZWFtbGluaW5nIGJ5IE1hcmsgTG9yZC4KKyAqCisgKiAgUmVtb3ZlZCA5OSUgb2YgYWJvdmUuIFVzZSBNYXJrJ3MgaWRlIGRyaXZlciBmb3IgdGhvc2Ugb3B0aW9ucy4KKyAqICBUaGlzIGlzIG5vdyBhIGxpZ2h0d2VpZ2h0IFNULTUwNiBkcml2ZXIuIChQYXVsIEdvcnRtYWtlcikKKyAqCisgKiAgTW9kaWZpZWQgMTk5NSBSdXNzZWxsIEtpbmcgZm9yIEFSTSBwcm9jZXNzb3IuCisgKgorICogIEJ1Z2ZpeDogbWF4X3NlY3RvcnMgbXVzdCBiZSA8PSAyNTUgb3IgdGhlIHdoZWVscyB0ZW5kIHRvIGNvbWUKKyAqICBvZmYgaW4gYSBodXJyeSBvbmNlIHlvdSBxdWV1ZSB0aGluZ3MgdXAgLSBQYXVsIEcuIDAyLzIwMDEKKyAqLworCisvKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCB2ZXJib3NlIGVycm9yIHJlcG9ydHMuICovCisvKiAjZGVmaW5lIFZFUkJPU0VfRVJST1JTICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPiAvKiBDTU9TIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorCisjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBfX2FybV9fCisjdW5kZWYgIEhEX0lSUQorI2VuZGlmCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2lmZGVmIF9fYXJtX18KKyNkZWZpbmUgSERfSVJRIElSUV9IQVJERElTSworI2VuZGlmCisKKy8qIEhkIGNvbnRyb2xsZXIgcmVnc3RlciBwb3J0cyAqLworCisjZGVmaW5lIEhEX0RBVEEJCTB4MWYwCQkvKiBfQ1RMIHdoZW4gd3JpdGluZyAqLworI2RlZmluZSBIRF9FUlJPUgkweDFmMQkJLyogc2VlIGVyci1iaXRzICovCisjZGVmaW5lIEhEX05TRUNUT1IJMHgxZjIJCS8qIG5yIG9mIHNlY3RvcnMgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZSBIRF9TRUNUT1IJMHgxZjMJCS8qIHN0YXJ0aW5nIHNlY3RvciAqLworI2RlZmluZSBIRF9MQ1lMCQkweDFmNAkJLyogc3RhcnRpbmcgY3lsaW5kZXIgKi8KKyNkZWZpbmUgSERfSENZTAkJMHgxZjUJCS8qIGhpZ2ggYnl0ZSBvZiBzdGFydGluZyBjeWwgKi8KKyNkZWZpbmUgSERfQ1VSUkVOVAkweDFmNgkJLyogMTAxZGhoaGggLCBkPWRyaXZlLCBoaGhoPWhlYWQgKi8KKyNkZWZpbmUgSERfU1RBVFVTCTB4MWY3CQkvKiBzZWUgc3RhdHVzLWJpdHMgKi8KKyNkZWZpbmUgSERfRkVBVFVSRQlIRF9FUlJPUgkvKiBzYW1lIGlvIGFkZHJlc3MsIHJlYWQ9ZXJyb3IsIHdyaXRlPWZlYXR1cmUgKi8KKyNkZWZpbmUgSERfUFJFQ09NUAlIRF9GRUFUVVJFCS8qIG9ic29sZXRlIHVzZSBvZiB0aGlzIHBvcnQgLSBwcmVkYXRlcyBJREUgKi8KKyNkZWZpbmUgSERfQ09NTUFORAlIRF9TVEFUVVMJLyogc2FtZSBpbyBhZGRyZXNzLCByZWFkPXN0YXR1cywgd3JpdGU9Y21kICovCisKKyNkZWZpbmUgSERfQ01ECQkweDNmNgkJLyogdXNlZCBmb3IgcmVzZXRzICovCisjZGVmaW5lIEhEX0FMVFNUQVRVUwkweDNmNgkJLyogc2FtZSBhcyBIRF9TVEFUVVMgYnV0IGRvZXNuJ3QgY2xlYXIgaXJxICovCisKKy8qIEJpdHMgb2YgSERfU1RBVFVTICovCisjZGVmaW5lIEVSUl9TVEFUCQkweDAxCisjZGVmaW5lIElOREVYX1NUQVQJCTB4MDIKKyNkZWZpbmUgRUNDX1NUQVQJCTB4MDQJLyogQ29ycmVjdGVkIGVycm9yICovCisjZGVmaW5lIERSUV9TVEFUCQkweDA4CisjZGVmaW5lIFNFRUtfU1RBVAkJMHgxMAorI2RlZmluZSBTRVJWSUNFX1NUQVQJCVNFRUtfU1RBVAorI2RlZmluZSBXUkVSUl9TVEFUCQkweDIwCisjZGVmaW5lIFJFQURZX1NUQVQJCTB4NDAKKyNkZWZpbmUgQlVTWV9TVEFUCQkweDgwCisKKy8qIEJpdHMgZm9yIEhEX0VSUk9SICovCisjZGVmaW5lIE1BUktfRVJSCQkweDAxCS8qIEJhZCBhZGRyZXNzIG1hcmsgKi8KKyNkZWZpbmUgVFJLMF9FUlIJCTB4MDIJLyogY291bGRuJ3QgZmluZCB0cmFjayAwICovCisjZGVmaW5lIEFCUlRfRVJSCQkweDA0CS8qIENvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZSBNQ1JfRVJSCQkJMHgwOAkvKiBtZWRpYSBjaGFuZ2UgcmVxdWVzdCAqLworI2RlZmluZSBJRF9FUlIJCQkweDEwCS8qIElEIGZpZWxkIG5vdCBmb3VuZCAqLworI2RlZmluZSBNQ19FUlIJCQkweDIwCS8qIG1lZGlhIGNoYW5nZWQgKi8KKyNkZWZpbmUgRUNDX0VSUgkJCTB4NDAJLyogVW5jb3JyZWN0YWJsZSBFQ0MgZXJyb3IgKi8KKyNkZWZpbmUgQkJEX0VSUgkJCTB4ODAJLyogcHJlLUVJREUgbWVhbmluZzogIGJsb2NrIG1hcmtlZCBiYWQgKi8KKyNkZWZpbmUgSUNSQ19FUlIJCTB4ODAJLyogbmV3IG1lYW5pbmc6ICBDUkMgZXJyb3IgZHVyaW5nIHRyYW5zZmVyICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaGRfbG9jayk7CitzdGF0aWMgc3RydWN0IHJlcXVlc3RfcXVldWUgKmhkX3F1ZXVlOworCisjZGVmaW5lIE1BSk9SX05SIEhEX01BSk9SCisjZGVmaW5lIFFVRVVFIChoZF9xdWV1ZSkKKyNkZWZpbmUgQ1VSUkVOVCBlbHZfbmV4dF9yZXF1ZXN0KGhkX3F1ZXVlKQorCisjZGVmaW5lIFRJTUVPVVRfVkFMVUUJKDYqSFopCisjZGVmaW5lCUhEX0RFTEFZCTAKKworI2RlZmluZSBNQVhfRVJST1JTICAgICAxNgkvKiBNYXggcmVhZC93cml0ZSBlcnJvcnMvc2VjdG9yICovCisjZGVmaW5lIFJFU0VUX0ZSRVEgICAgICA4CS8qIFJlc2V0IGNvbnRyb2xsZXIgZXZlcnkgOHRoIHJldHJ5ICovCisjZGVmaW5lIFJFQ0FMX0ZSRVEgICAgICA0CS8qIFJlY2FsaWJyYXRlIGV2ZXJ5IDR0aCByZXRyeSAqLworI2RlZmluZSBNQVhfSEQJCTIKKworI2RlZmluZSBTVEFUX09LCQkoUkVBRFlfU1RBVHxTRUVLX1NUQVQpCisjZGVmaW5lIE9LX1NUQVRVUyhzKQkoKChzKSYoU1RBVF9PS3woQlVTWV9TVEFUfFdSRVJSX1NUQVR8RVJSX1NUQVQpKSk9PVNUQVRfT0spCisKK3N0YXRpYyB2b2lkIHJlY2FsX2ludHIodm9pZCk7CitzdGF0aWMgdm9pZCBiYWRfcndfaW50cih2b2lkKTsKKworc3RhdGljIGludCByZXNldDsKK3N0YXRpYyBpbnQgaGRfZXJyb3I7CisKKy8qCisgKiAgVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgSEQncyBhbmQgdGhlaXIgdHlwZXMuCisgKi8KK3N0cnVjdCBoZF9pX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IGhlYWQsc2VjdCxjeWwsd3Bjb20sbHpvbmUsY3RsOworCWludCB1bml0OworCWludCByZWNhbGlicmF0ZTsKKwlpbnQgc3BlY2lhbF9vcDsKK307CisJCisjaWZkZWYgSERfVFlQRQorc3RhdGljIHN0cnVjdCBoZF9pX3N0cnVjdCBoZF9pbmZvW10gPSB7IEhEX1RZUEUgfTsKK3N0YXRpYyBpbnQgTlJfSEQgPSAoKHNpemVvZiAoaGRfaW5mbykpLyhzaXplb2YgKHN0cnVjdCBoZF9pX3N0cnVjdCkpKTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IGhkX2lfc3RydWN0IGhkX2luZm9bTUFYX0hEXTsKK3N0YXRpYyBpbnQgTlJfSEQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBnZW5kaXNrICpoZF9nZW5kaXNrW01BWF9IRF07CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZXZpY2VfdGltZXI7CisKKyNkZWZpbmUgVElNRU9VVF9WQUxVRSAoNipIWikKKworI2RlZmluZSBTRVRfVElNRVIJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJbW9kX3RpbWVyKCZkZXZpY2VfdGltZXIsIGppZmZpZXMgKyBUSU1FT1VUX1ZBTFVFKTsJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkICgqZG9faGQpKHZvaWQpID0gTlVMTDsKKyNkZWZpbmUgU0VUX0hBTkRMRVIoeCkgXAoraWYgKChkb19oZCA9ICh4KSkgIT0gTlVMTCkgXAorCVNFVF9USU1FUjsgXAorZWxzZSBcCisJZGVsX3RpbWVyKCZkZXZpY2VfdGltZXIpOworCisKKyNpZiAoSERfREVMQVkgPiAwKQordW5zaWduZWQgbG9uZyBsYXN0X3JlcTsKKwordW5zaWduZWQgbG9uZyByZWFkX3RpbWVyKHZvaWQpCit7CisgICAgICAgIGV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisJdW5zaWduZWQgbG9uZyB0LCBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJdCA9IGppZmZpZXMgKiAxMTkzMjsKKyAgICAJb3V0Yl9wKDAsIDB4NDMpOworCWkgPSBpbmJfcCgweDQwKTsKKwlpIHw9IGluYigweDQwKSA8PCA4OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4odCAtIGkpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBoZF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlpbnQgaGRpbmQgPSAwOworCisJaWYgKGludHNbMF0gIT0gMykKKwkJcmV0dXJuOworCWlmIChoZF9pbmZvWzBdLmhlYWQgIT0gMCkKKwkJaGRpbmQ9MTsKKwloZF9pbmZvW2hkaW5kXS5oZWFkID0gaW50c1syXTsKKwloZF9pbmZvW2hkaW5kXS5zZWN0ID0gaW50c1szXTsKKwloZF9pbmZvW2hkaW5kXS5jeWwgPSBpbnRzWzFdOworCWhkX2luZm9baGRpbmRdLndwY29tID0gMDsKKwloZF9pbmZvW2hkaW5kXS5sem9uZSA9IGludHNbMV07CisJaGRfaW5mb1toZGluZF0uY3RsID0gKGludHNbMl0gPiA4ID8gOCA6IDApOworCU5SX0hEID0gaGRpbmQrMTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zdGF0dXMgKGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IHN0YXQpCit7CisJY2hhciAqbmFtZSA9ICJoZD8iOworCWlmIChDVVJSRU5UKQorCQluYW1lID0gQ1VSUkVOVC0+cnFfZGlzay0+ZGlza19uYW1lOworCisjaWZkZWYgVkVSQk9TRV9FUlJPUlMKKwlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCB7ICIsIG5hbWUsIG1zZywgc3RhdCAmIDB4ZmYpOworCWlmIChzdGF0ICYgQlVTWV9TVEFUKQlwcmludGsoIkJ1c3kgIik7CisJaWYgKHN0YXQgJiBSRUFEWV9TVEFUKQlwcmludGsoIkRyaXZlUmVhZHkgIik7CisJaWYgKHN0YXQgJiBXUkVSUl9TVEFUKQlwcmludGsoIldyaXRlRmF1bHQgIik7CisJaWYgKHN0YXQgJiBTRUVLX1NUQVQpCXByaW50aygiU2Vla0NvbXBsZXRlICIpOworCWlmIChzdGF0ICYgRFJRX1NUQVQpCXByaW50aygiRGF0YVJlcXVlc3QgIik7CisJaWYgKHN0YXQgJiBFQ0NfU1RBVCkJcHJpbnRrKCJDb3JyZWN0ZWRFcnJvciAiKTsKKwlpZiAoc3RhdCAmIElOREVYX1NUQVQpCXByaW50aygiSW5kZXggIik7CisJaWYgKHN0YXQgJiBFUlJfU1RBVCkJcHJpbnRrKCJFcnJvciAiKTsKKwlwcmludGsoIn1cbiIpOworCWlmICgoc3RhdCAmIEVSUl9TVEFUKSA9PSAwKSB7CisJCWhkX2Vycm9yID0gMDsKKwl9IGVsc2UgeworCQloZF9lcnJvciA9IGluYihIRF9FUlJPUik7CisJCXByaW50aygiJXM6ICVzOiBlcnJvcj0weCUwMnggeyAiLCBuYW1lLCBtc2csIGhkX2Vycm9yICYgMHhmZik7CisJCWlmIChoZF9lcnJvciAmIEJCRF9FUlIpCQlwcmludGsoIkJhZFNlY3RvciAiKTsKKwkJaWYgKGhkX2Vycm9yICYgRUNDX0VSUikJCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOworCQlpZiAoaGRfZXJyb3IgJiBJRF9FUlIpCQlwcmludGsoIlNlY3RvcklkTm90Rm91bmQgIik7CisJCWlmIChoZF9lcnJvciAmIEFCUlRfRVJSKQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7CisJCWlmIChoZF9lcnJvciAmIFRSSzBfRVJSKQlwcmludGsoIlRyYWNrWmVyb05vdEZvdW5kICIpOworCQlpZiAoaGRfZXJyb3IgJiBNQVJLX0VSUikJcHJpbnRrKCJBZGRyTWFya05vdEZvdW5kICIpOworCQlwcmludGsoIn0iKTsKKwkJaWYgKGhkX2Vycm9yICYgKEJCRF9FUlJ8RUNDX0VSUnxJRF9FUlJ8TUFSS19FUlIpKSB7CisJCQlwcmludGsoIiwgQ0hTPSVkLyVkLyVkIiwgKGluYihIRF9IQ1lMKTw8OCkgKyBpbmIoSERfTENZTCksCisJCQkJaW5iKEhEX0NVUlJFTlQpICYgMHhmLCBpbmIoSERfU0VDVE9SKSk7CisJCQlpZiAoQ1VSUkVOVCkKKwkJCQlwcmludGsoIiwgc2VjdG9yPSVsZCIsIENVUlJFTlQtPnNlY3Rvcik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbHNlCisJcHJpbnRrKCIlczogJXM6IHN0YXR1cz0weCUwMnguXG4iLCBuYW1lLCBtc2csIHN0YXQgJiAweGZmKTsKKwlpZiAoKHN0YXQgJiBFUlJfU1RBVCkgPT0gMCkgeworCQloZF9lcnJvciA9IDA7CisJfSBlbHNlIHsKKwkJaGRfZXJyb3IgPSBpbmIoSERfRVJST1IpOworCQlwcmludGsoIiVzOiAlczogZXJyb3I9MHglMDJ4LlxuIiwgbmFtZSwgbXNnLCBoZF9lcnJvciAmIDB4ZmYpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjaGVja19zdGF0dXModm9pZCkKK3sKKwlpbnQgaSA9IGluYl9wKEhEX1NUQVRVUyk7CisKKwlpZiAoIU9LX1NUQVRVUyhpKSkgeworCQlkdW1wX3N0YXR1cygiY2hlY2tfc3RhdHVzIiwgaSk7CisJCWJhZF9yd19pbnRyKCk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbnRyb2xsZXJfYnVzeSh2b2lkKQoreworCWludCByZXRyaWVzID0gMTAwMDAwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJZG8geworCQlzdGF0dXMgPSBpbmJfcChIRF9TVEFUVVMpOworCX0gd2hpbGUgKChzdGF0dXMgJiBCVVNZX1NUQVQpICYmIC0tcmV0cmllcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBzdGF0dXNfb2sodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IGluYl9wKEhEX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgQlVTWV9TVEFUKQorCQlyZXR1cm4gMTsJLyogQW5jaWVudCwgYnV0IGRvZXMgaXQgbWFrZSBzZW5zZT8/PyAqLworCWlmIChzdGF0dXMgJiBXUkVSUl9TVEFUKQorCQlyZXR1cm4gMDsKKwlpZiAoIShzdGF0dXMgJiBSRUFEWV9TVEFUKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoc3RhdHVzICYgU0VFS19TVEFUKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbGxlcl9yZWFkeSh1bnNpZ25lZCBpbnQgZHJpdmUsIHVuc2lnbmVkIGludCBoZWFkKQoreworCWludCByZXRyeSA9IDEwMDsKKworCWRvIHsKKwkJaWYgKGNvbnRyb2xsZXJfYnVzeSgpICYgQlVTWV9TVEFUKQorCQkJcmV0dXJuIDA7CisJCW91dGJfcCgweEEwIHwgKGRyaXZlPDw0KSB8IGhlYWQsIEhEX0NVUlJFTlQpOworCQlpZiAoc3RhdHVzX29rKCkpCisJCQlyZXR1cm4gMTsKKwl9IHdoaWxlICgtLXJldHJ5KTsKKwlyZXR1cm4gMDsKK30KKworCQkKK3N0YXRpYyB2b2lkIGhkX291dChzdHJ1Y3QgaGRfaV9zdHJ1Y3QgKmRpc2ssCisJCSAgIHVuc2lnbmVkIGludCBuc2VjdCwKKwkJICAgdW5zaWduZWQgaW50IHNlY3QsCisJCSAgIHVuc2lnbmVkIGludCBoZWFkLAorCQkgICB1bnNpZ25lZCBpbnQgY3lsLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLAorCQkgICB2b2lkICgqaW50cl9hZGRyKSh2b2lkKSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwb3J0OworCisjaWYgKEhEX0RFTEFZID4gMCkKKwl3aGlsZSAocmVhZF90aW1lcigpIC0gbGFzdF9yZXEgPCBIRF9ERUxBWSkKKwkJLyogbm90aGluZyAqLzsKKyNlbmRpZgorCWlmIChyZXNldCkKKwkJcmV0dXJuOworCWlmICghY29udHJvbGxlcl9yZWFkeShkaXNrLT51bml0LCBoZWFkKSkgeworCQlyZXNldCA9IDE7CisJCXJldHVybjsKKwl9CisJU0VUX0hBTkRMRVIoaW50cl9hZGRyKTsKKwlvdXRiX3AoZGlzay0+Y3RsLEhEX0NNRCk7CisJcG9ydD1IRF9EQVRBOworCW91dGJfcChkaXNrLT53cGNvbT4+MiwrK3BvcnQpOworCW91dGJfcChuc2VjdCwrK3BvcnQpOworCW91dGJfcChzZWN0LCsrcG9ydCk7CisJb3V0Yl9wKGN5bCwrK3BvcnQpOworCW91dGJfcChjeWw+PjgsKytwb3J0KTsKKwlvdXRiX3AoMHhBMHwoZGlzay0+dW5pdDw8NCl8aGVhZCwrK3BvcnQpOworCW91dGJfcChjbWQsKytwb3J0KTsKK30KKworc3RhdGljIHZvaWQgaGRfcmVxdWVzdCAodm9pZCk7CisKK3N0YXRpYyBpbnQgZHJpdmVfYnVzeSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWZvciAoaSA9IDA7IGkgPCA1MDAwMDAgOyBpKyspIHsKKwkJYyA9IGluYl9wKEhEX1NUQVRVUyk7CisJCWlmICgoYyAmIChCVVNZX1NUQVQgfCBSRUFEWV9TVEFUIHwgU0VFS19TVEFUKSkgPT0gU1RBVF9PSykKKwkJCXJldHVybiAwOworCX0KKwlkdW1wX3N0YXR1cygicmVzZXQgdGltZWQgb3V0IiwgYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2NvbnRyb2xsZXIodm9pZCkKK3sKKwlpbnQJaTsKKworCW91dGJfcCg0LEhEX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBiYXJyaWVyKCk7CisJb3V0Yl9wKGhkX2luZm9bMF0uY3RsICYgMHgwZixIRF9DTUQpOworCWZvcihpID0gMDsgaSA8IDEwMDA7IGkrKykgYmFycmllcigpOworCWlmIChkcml2ZV9idXN5KCkpCisJCXByaW50aygiaGQ6IGNvbnRyb2xsZXIgc3RpbGwgYnVzeVxuIik7CisJZWxzZSBpZiAoKGhkX2Vycm9yID0gaW5iKEhEX0VSUk9SKSkgIT0gMSkKKwkJcHJpbnRrKCJoZDogY29udHJvbGxlciByZXNldCBmYWlsZWQ6ICUwMnhcbiIsaGRfZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9oZCh2b2lkKQoreworCXN0YXRpYyBpbnQgaTsKKworcmVwZWF0OgorCWlmIChyZXNldCkgeworCQlyZXNldCA9IDA7CisJCWkgPSAtMTsKKwkJcmVzZXRfY29udHJvbGxlcigpOworCX0gZWxzZSB7CisJCWNoZWNrX3N0YXR1cygpOworCQlpZiAocmVzZXQpCisJCQlnb3RvIHJlcGVhdDsKKwl9CisJaWYgKCsraSA8IE5SX0hEKSB7CisJCXN0cnVjdCBoZF9pX3N0cnVjdCAqZGlzayA9ICZoZF9pbmZvW2ldOworCQlkaXNrLT5zcGVjaWFsX29wID0gZGlzay0+cmVjYWxpYnJhdGUgPSAxOworCQloZF9vdXQoZGlzayxkaXNrLT5zZWN0LGRpc2stPnNlY3QsZGlzay0+aGVhZC0xLAorCQkJZGlzay0+Y3lsLFdJTl9TUEVDSUZZLCZyZXNldF9oZCk7CisJCWlmIChyZXNldCkKKwkJCWdvdG8gcmVwZWF0OworCX0gZWxzZQorCQloZF9yZXF1ZXN0KCk7Cit9CisKKy8qCisgKiBPaywgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlIHVuZXhwZWN0ZWQgaW50ZXJydXB0czogb24gc29tZSBtYWNoaW5lcworICogZG9pbmcgYSByZXNldCBhbmQgYSByZXRyeSBzZWVtcyB0byByZXN1bHQgaW4gYW4gZXRlcm5hbCBsb29wLiBSaWdodCBub3cgSQorICogaWdub3JlIGl0LCBhbmQganVzdCBzZXQgdGhlIHRpbWVvdXQuCisgKgorICogT24gbGFwdG9wcyAoYW5kICJncmVlbiIgUENzKSwgYW4gdW5leHBlY3RlZCBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyIHRoZQorICogZHJpdmUgZW50ZXJzICJpZGxlIiwgInN0YW5kYnkiLCBvciAic2xlZXAiIG1vZGUsIHNvIGlmIHRoZSBzdGF0dXMgbG9va3MKKyAqICJnb29kIiwgd2UganVzdCBpZ25vcmUgdGhlIGludGVycnVwdCBjb21wbGV0ZWx5LgorICovCitzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX2hkX2ludGVycnVwdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBzdGF0ID0gaW5iX3AoSERfU1RBVFVTKTsKKworCWlmIChzdGF0ICYgKEJVU1lfU1RBVHxEUlFfU1RBVHxFQ0NfU1RBVHxFUlJfU1RBVCkpIHsKKwkJZHVtcF9zdGF0dXMgKCJ1bmV4cGVjdGVkIGludGVycnVwdCIsIHN0YXQpOworCQlTRVRfVElNRVI7CisJfQorfQorCisvKgorICogYmFkX3J3X2ludHIoKSBub3cgdHJpZXMgdG8gYmUgYSBiaXQgc21hcnRlciBhbmQgZG9lcyB0aGluZ3MKKyAqIGFjY29yZGluZyB0byB0aGUgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRyb2xsZXIuCisgKiAtTWlrYSBMaWxqZWJlcmcgKGxpbGplYmVyQGNzLkhlbHNpbmtpLkZJKQorICovCitzdGF0aWMgdm9pZCBiYWRfcndfaW50cih2b2lkKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBDVVJSRU5UOworCWlmIChyZXEgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaGRfaV9zdHJ1Y3QgKmRpc2sgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJaWYgKCsrcmVxLT5lcnJvcnMgPj0gTUFYX0VSUk9SUyB8fCAoaGRfZXJyb3IgJiBCQkRfRVJSKSkgeworCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJCWRpc2stPnNwZWNpYWxfb3AgPSBkaXNrLT5yZWNhbGlicmF0ZSA9IDE7CisJCX0gZWxzZSBpZiAocmVxLT5lcnJvcnMgJSBSRVNFVF9GUkVRID09IDApCisJCQlyZXNldCA9IDE7CisJCWVsc2UgaWYgKChoZF9lcnJvciAmIFRSSzBfRVJSKSB8fCByZXEtPmVycm9ycyAlIFJFQ0FMX0ZSRVEgPT0gMCkKKwkJCWRpc2stPnNwZWNpYWxfb3AgPSBkaXNrLT5yZWNhbGlicmF0ZSA9IDE7CisJCS8qIE90aGVyd2lzZSBqdXN0IHJldHJ5ICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCB3YWl0X0RSUSh2b2lkKQoreworCWludCByZXRyaWVzID0gMTAwMDAwLCBzdGF0OworCisJd2hpbGUgKC0tcmV0cmllcyA+IDApCisJCWlmICgoc3RhdCA9IGluYl9wKEhEX1NUQVRVUykpICYgRFJRX1NUQVQpCisJCQlyZXR1cm4gMDsKKwlkdW1wX3N0YXR1cygid2FpdF9EUlEiLCBzdGF0KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaW50cih2b2lkKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJaW50IGksIHJldHJpZXMgPSAxMDAwMDA7CisKKwlkbyB7CisJCWkgPSAodW5zaWduZWQpIGluYl9wKEhEX1NUQVRVUyk7CisJCWlmIChpICYgQlVTWV9TVEFUKQorCQkJY29udGludWU7CisJCWlmICghT0tfU1RBVFVTKGkpKQorCQkJYnJlYWs7CisJCWlmIChpICYgRFJRX1NUQVQpCisJCQlnb3RvIG9rX3RvX3JlYWQ7CisJfSB3aGlsZSAoLS1yZXRyaWVzID4gMCk7CisJZHVtcF9zdGF0dXMoInJlYWRfaW50ciIsIGkpOworCWJhZF9yd19pbnRyKCk7CisJaGRfcmVxdWVzdCgpOworCXJldHVybjsKK29rX3RvX3JlYWQ6CisJcmVxID0gQ1VSUkVOVDsKKwlpbnN3KEhEX0RBVEEscmVxLT5idWZmZXIsMjU2KTsKKwlyZXEtPnNlY3RvcisrOworCXJlcS0+YnVmZmVyICs9IDUxMjsKKwlyZXEtPmVycm9ycyA9IDA7CisJaSA9IC0tcmVxLT5ucl9zZWN0b3JzOworCS0tcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CisjaWZkZWYgREVCVUcKKwlwcmludGsoIiVzOiByZWFkOiBzZWN0b3IgJWxkLCByZW1haW5pbmcgPSAlbGQsIGJ1ZmZlcj0lcFxuIiwKKwkJcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIHJlcS0+c2VjdG9yLCByZXEtPm5yX3NlY3RvcnMsCisJCXJlcS0+YnVmZmVyKzUxMikpOworI2VuZGlmCisJaWYgKHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw9IDApCisJCWVuZF9yZXF1ZXN0KHJlcSwgMSk7CisJaWYgKGkgPiAwKSB7CisJCVNFVF9IQU5ETEVSKCZyZWFkX2ludHIpOworCQlyZXR1cm47CisJfQorCSh2b2lkKSBpbmJfcChIRF9TVEFUVVMpOworI2lmIChIRF9ERUxBWSA+IDApCisJbGFzdF9yZXEgPSByZWFkX3RpbWVyKCk7CisjZW5kaWYKKwlpZiAoZWx2X25leHRfcmVxdWVzdChRVUVVRSkpCisJCWhkX3JlcXVlc3QoKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2ludHIodm9pZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gQ1VSUkVOVDsKKwlpbnQgaTsKKwlpbnQgcmV0cmllcyA9IDEwMDAwMDsKKworCWRvIHsKKwkJaSA9ICh1bnNpZ25lZCkgaW5iX3AoSERfU1RBVFVTKTsKKwkJaWYgKGkgJiBCVVNZX1NUQVQpCisJCQljb250aW51ZTsKKwkJaWYgKCFPS19TVEFUVVMoaSkpCisJCQlicmVhazsKKwkJaWYgKChyZXEtPm5yX3NlY3RvcnMgPD0gMSkgfHwgKGkgJiBEUlFfU1RBVCkpCisJCQlnb3RvIG9rX3RvX3dyaXRlOworCX0gd2hpbGUgKC0tcmV0cmllcyA+IDApOworCWR1bXBfc3RhdHVzKCJ3cml0ZV9pbnRyIiwgaSk7CisJYmFkX3J3X2ludHIoKTsKKwloZF9yZXF1ZXN0KCk7CisJcmV0dXJuOworb2tfdG9fd3JpdGU6CisJcmVxLT5zZWN0b3IrKzsKKwlpID0gLS1yZXEtPm5yX3NlY3RvcnM7CisJLS1yZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsKKwlyZXEtPmJ1ZmZlciArPSA1MTI7CisJaWYgKCFpIHx8IChyZXEtPmJpbyAmJiByZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKSkKKwkJZW5kX3JlcXVlc3QocmVxLCAxKTsKKwlpZiAoaSA+IDApIHsKKwkJU0VUX0hBTkRMRVIoJndyaXRlX2ludHIpOworCQlvdXRzdyhIRF9EQVRBLHJlcS0+YnVmZmVyLDI1Nik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9IGVsc2UgeworI2lmIChIRF9ERUxBWSA+IDApCisJCWxhc3RfcmVxID0gcmVhZF90aW1lcigpOworI2VuZGlmCisJCWhkX3JlcXVlc3QoKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWNhbF9pbnRyKHZvaWQpCit7CisJY2hlY2tfc3RhdHVzKCk7CisjaWYgKEhEX0RFTEFZID4gMCkKKwlsYXN0X3JlcSA9IHJlYWRfdGltZXIoKTsKKyNlbmRpZgorCWhkX3JlcXVlc3QoKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYW5vdGhlciBvZiB0aGUgZXJyb3Itcm91dGluZXMgSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aC4gVGhlCisgKiBiZXN0IGlkZWEgc2VlbXMgdG8ganVzdCBzZXQgcmVzZXQsIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgaGRfdGltZXNfb3V0KHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJY2hhciAqbmFtZTsKKworCWRvX2hkID0gTlVMTDsKKworCWlmICghQ1VSUkVOVCkKKwkJcmV0dXJuOworCisJZGlzYWJsZV9pcnEoSERfSVJRKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmVzZXQgPSAxOworCW5hbWUgPSBDVVJSRU5ULT5ycV9kaXNrLT5kaXNrX25hbWU7CisJcHJpbnRrKCIlczogdGltZW91dFxuIiwgbmFtZSk7CisJaWYgKCsrQ1VSUkVOVC0+ZXJyb3JzID49IE1BWF9FUlJPUlMpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiB0b28gbWFueSBlcnJvcnNcbiIsIG5hbWUpOworI2VuZGlmCisJCWVuZF9yZXF1ZXN0KENVUlJFTlQsIDApOworCX0KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWhkX3JlcXVlc3QoKTsKKwllbmFibGVfaXJxKEhEX0lSUSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fc3BlY2lhbF9vcChzdHJ1Y3QgaGRfaV9zdHJ1Y3QgKmRpc2ssIHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJaWYgKGRpc2stPnJlY2FsaWJyYXRlKSB7CisJCWRpc2stPnJlY2FsaWJyYXRlID0gMDsKKwkJaGRfb3V0KGRpc2ssZGlzay0+c2VjdCwwLDAsMCxXSU5fUkVTVE9SRSwmcmVjYWxfaW50cik7CisJCXJldHVybiByZXNldDsKKwl9CisJaWYgKGRpc2stPmhlYWQgPiAxNikgeworCQlwcmludGsgKCIlczogY2Fubm90IGhhbmRsZSBkZXZpY2Ugd2l0aCBtb3JlIHRoYW4gMTYgaGVhZHMgLSBnaXZpbmcgdXBcbiIsIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lKTsKKwkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwl9CisJZGlzay0+c3BlY2lhbF9vcCA9IDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgZHJpdmVyIGVuYWJsZXMgaW50ZXJydXB0cyBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSW4gb3JkZXIgdG8gZG8gdGhpcywKKyAqIChhKSB0aGUgZGV2aWNlLWludGVycnVwdCBpcyBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcgaGRfcmVxdWVzdCgpLAorICogYW5kIChiKSB0aGUgdGltZW91dC1pbnRlcnJ1cHQgaXMgZGlzYWJsZWQgYmVmb3JlIHRoZSBzdGkoKS4KKyAqCisgKiBJbnRlcnJ1cHRzIGFyZSBzdGlsbCBtYXNrZWQgKGJ5IGRlZmF1bHQpIHdoZW5ldmVyIHdlIGFyZSBleGNoYW5naW5nCisgKiBkYXRhL2NtZHMgd2l0aCBhIGRyaXZlLCBiZWNhdXNlIHNvbWUgZHJpdmVzIHNlZW0gdG8gaGF2ZSB2ZXJ5IHBvb3IKKyAqIHRvbGVyYW5jZSBmb3IgbGF0ZW5jeSBkdXJpbmcgSS9PLiBUaGUgSURFIGRyaXZlciBoYXMgc3VwcG9ydCB0byB1bm1hc2sKKyAqIGludGVycnVwdHMgZm9yIG5vbi1icm9rZW4gaGFyZHdhcmUsIHNvIHVzZSB0aGF0IGRyaXZlciBpZiByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQgaGRfcmVxdWVzdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBibG9jaywgbnNlY3QsIHNlYywgdHJhY2ssIGhlYWQsIGN5bDsKKwlzdHJ1Y3QgaGRfaV9zdHJ1Y3QgKmRpc2s7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCWlmIChkb19oZCkKKwkJcmV0dXJuOworcmVwZWF0OgorCWRlbF90aW1lcigmZGV2aWNlX3RpbWVyKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXEgPSBDVVJSRU5UOworCWlmICghcmVxKSB7CisJCWRvX2hkID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXNldCkgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlyZXNldF9oZCgpOworCQlyZXR1cm47CisJfQorCWRpc2sgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlibG9jayA9IHJlcS0+c2VjdG9yOworCW5zZWN0ID0gcmVxLT5ucl9zZWN0b3JzOworCWlmIChibG9jayA+PSBnZXRfY2FwYWNpdHkocmVxLT5ycV9kaXNrKSB8fAorCSAgICAoKGJsb2NrK25zZWN0KSA+IGdldF9jYXBhY2l0eShyZXEtPnJxX2Rpc2spKSkgeworCQlwcmludGsoIiVzOiBiYWQgYWNjZXNzOiBibG9jaz0lZCwgY291bnQ9JWRcbiIsCisJCQlyZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYmxvY2ssIG5zZWN0KTsKKwkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJaWYgKGRpc2stPnNwZWNpYWxfb3ApIHsKKwkJaWYgKGRvX3NwZWNpYWxfb3AoZGlzaywgcmVxKSkKKwkJCWdvdG8gcmVwZWF0OworCQlyZXR1cm47CisJfQorCXNlYyAgID0gYmxvY2sgJSBkaXNrLT5zZWN0ICsgMTsKKwl0cmFjayA9IGJsb2NrIC8gZGlzay0+c2VjdDsKKwloZWFkICA9IHRyYWNrICUgZGlzay0+aGVhZDsKKwljeWwgICA9IHRyYWNrIC8gZGlzay0+aGVhZDsKKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6ICVzaW5nOiBDSFM9JWQvJWQvJWQsIHNlY3RvcnM9JWQsIGJ1ZmZlcj0lcFxuIiwKKwkJcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIChyZXEtPmNtZCA9PSBSRUFEKT8icmVhZCI6IndyaXQiLAorCQljeWwsIGhlYWQsIHNlYywgbnNlY3QsIHJlcS0+YnVmZmVyKTsKKyNlbmRpZgorCWlmIChyZXEtPmZsYWdzICYgUkVRX0NNRCkgeworCQlzd2l0Y2ggKHJxX2RhdGFfZGlyKHJlcSkpIHsKKwkJY2FzZSBSRUFEOgorCQkJaGRfb3V0KGRpc2ssbnNlY3Qsc2VjLGhlYWQsY3lsLFdJTl9SRUFELCZyZWFkX2ludHIpOworCQkJaWYgKHJlc2V0KQorCQkJCWdvdG8gcmVwZWF0OworCQkJYnJlYWs7CisJCWNhc2UgV1JJVEU6CisJCQloZF9vdXQoZGlzayxuc2VjdCxzZWMsaGVhZCxjeWwsV0lOX1dSSVRFLCZ3cml0ZV9pbnRyKTsKKwkJCWlmIChyZXNldCkKKwkJCQlnb3RvIHJlcGVhdDsKKwkJCWlmICh3YWl0X0RSUSgpKSB7CisJCQkJYmFkX3J3X2ludHIoKTsKKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCW91dHN3KEhEX0RBVEEscmVxLT5idWZmZXIsMjU2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJ1bmtub3duIGhkLWNvbW1hbmRcbiIpOworCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19oZF9yZXF1ZXN0IChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQoreworCWRpc2FibGVfaXJxKEhEX0lSUSk7CisJaGRfcmVxdWVzdCgpOworCWVuYWJsZV9pcnEoSERfSVJRKTsKK30KKworc3RhdGljIGludCBoZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoZF9pX3N0cnVjdCAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICpsb2MgPSAoc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqKSBhcmc7CisJc3RydWN0IGhkX2dlb21ldHJ5IGc7IAorCisJaWYgKGNtZCAhPSBIRElPX0dFVEdFTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFsb2MpCisJCXJldHVybiAtRUlOVkFMOworCWcuaGVhZHMgPSBkaXNrLT5oZWFkOworCWcuc2VjdG9ycyA9IGRpc2stPnNlY3Q7CisJZy5jeWxpbmRlcnMgPSBkaXNrLT5jeWw7CisJZy5zdGFydCA9IGdldF9zdGFydF9zZWN0KGlub2RlLT5pX2JkZXYpOworCXJldHVybiBjb3B5X3RvX3VzZXIobG9jLCAmZywgc2l6ZW9mIGcpID8gLUVGQVVMVCA6IDA7IAorfQorCisvKgorICogUmVsZWFzaW5nIGEgYmxvY2sgZGV2aWNlIG1lYW5zIHdlIHN5bmMoKSBpdCwgc28gdGhhdCBpdCBjYW4gc2FmZWx5CisgKiBiZSBmb3Jnb3R0ZW4gYWJvdXQuLi4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaGRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9pZCAoKmhhbmRsZXIpKHZvaWQpID0gZG9faGQ7CisKKwlkb19oZCA9IE5VTEw7CisJZGVsX3RpbWVyKCZkZXZpY2VfdGltZXIpOworCWlmICghaGFuZGxlcikKKwkJaGFuZGxlciA9IHVuZXhwZWN0ZWRfaGRfaW50ZXJydXB0OworCWhhbmRsZXIoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGhkX2ZvcHMgPSB7CisJLmlvY3RsID0JaGRfaW9jdGwsCit9OworCisvKgorICogVGhpcyBpcyB0aGUgaGFyZCBkaXNrIElSUSBkZXNjcmlwdGlvbi4gVGhlIFNBX0lOVEVSUlVQVCBpbiBzYV9mbGFncworICogbWVhbnMgd2UgcnVuIHRoZSBJUlEtaGFuZGxlciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQ6ICB0aGlzIGlzIGJhZCBmb3IKKyAqIGludGVycnVwdCBsYXRlbmN5LCBidXQgYW55dGhpbmcgZWxzZSBoYXMgbGVkIHRvIHByb2JsZW1zIG9uIHNvbWUKKyAqIG1hY2hpbmVzLgorICoKKyAqIFdlIGVuYWJsZSBpbnRlcnJ1cHRzIGluIHNvbWUgb2YgdGhlIHJvdXRpbmVzIGFmdGVyIG1ha2luZyBzdXJlIGl0J3MKKyAqIHNhZmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaGRfaW5pdCh2b2lkKQoreworCWludCBkcml2ZTsKKworCWlmIChyZWdpc3Rlcl9ibGtkZXYoTUFKT1JfTlIsImhkIikpCisJCXJldHVybiAtMTsKKworCWhkX3F1ZXVlID0gYmxrX2luaXRfcXVldWUoZG9faGRfcmVxdWVzdCwgJmhkX2xvY2spOworCWlmICghaGRfcXVldWUpIHsKKwkJdW5yZWdpc3Rlcl9ibGtkZXYoTUFKT1JfTlIsImhkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhoZF9xdWV1ZSwgMjU1KTsKKwlpbml0X3RpbWVyKCZkZXZpY2VfdGltZXIpOworCWRldmljZV90aW1lci5mdW5jdGlvbiA9IGhkX3RpbWVzX291dDsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShoZF9xdWV1ZSwgNTEyKTsKKworI2lmZGVmIF9faTM4Nl9fCisJaWYgKCFOUl9IRCkgeworCQlleHRlcm4gc3RydWN0IGRyaXZlX2luZm8gZHJpdmVfaW5mbzsKKwkJdW5zaWduZWQgY2hhciAqQklPUyA9ICh1bnNpZ25lZCBjaGFyICopICZkcml2ZV9pbmZvOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgY21vc19kaXNrczsKKworCQlmb3IgKGRyaXZlPTAgOyBkcml2ZTwyIDsgZHJpdmUrKykgeworCQkJaGRfaW5mb1tkcml2ZV0uY3lsID0gKih1bnNpZ25lZCBzaG9ydCAqKSBCSU9TOworCQkJaGRfaW5mb1tkcml2ZV0uaGVhZCA9ICooMitCSU9TKTsKKwkJCWhkX2luZm9bZHJpdmVdLndwY29tID0gKih1bnNpZ25lZCBzaG9ydCAqKSAoNStCSU9TKTsKKwkJCWhkX2luZm9bZHJpdmVdLmN0bCA9ICooOCtCSU9TKTsKKwkJCWhkX2luZm9bZHJpdmVdLmx6b25lID0gKih1bnNpZ25lZCBzaG9ydCAqKSAoMTIrQklPUyk7CisJCQloZF9pbmZvW2RyaXZlXS5zZWN0ID0gKigxNCtCSU9TKTsKKyNpZmRlZiBkb2VzX25vdF93b3JrX2Zvcl9ldmVyeWJvZHlfd2l0aF9zY3NpX2J1dF9oZWxwc19pYm1fdnAKKwkJCWlmIChoZF9pbmZvW2RyaXZlXS5jeWwgJiYgTlJfSEQgPT0gZHJpdmUpCisJCQkJTlJfSEQrKzsKKyNlbmRpZgorCQkJQklPUyArPSAxNjsKKwkJfQorCisJLyoKKwkJV2UgcXVlcnkgQ01PUyBhYm91dCBoYXJkIGRpc2tzIDogaXQgY291bGQgYmUgdGhhdCAKKwkJd2UgaGF2ZSBhIFNDU0kvRVNESS9ldGMgY29udHJvbGxlciB0aGF0IGlzIEJJT1MKKwkJY29tcGF0aWJsZSB3aXRoIFNULTUwNiwgYW5kIHRodXMgc2hvd2luZyB1cCBpbiBvdXIKKwkJQklPUyB0YWJsZSwgYnV0IG5vdCByZWdpc3RlciBjb21wYXRpYmxlLCBhbmQgdGhlcmVmb3JlCisJCW5vdCBwcmVzZW50IGluIENNT1MuCisKKwkJRnVydGhlcm1vcmUsIHdlIHdpbGwgYXNzdW1lIHRoYXQgb3VyIFNULTUwNiBkcml2ZXMKKwkJPGlmIGFueT4gYXJlIHRoZSBwcmltYXJ5IGRyaXZlcyBpbiB0aGUgc3lzdGVtLCBhbmQgCisJCXRoZSBvbmVzIHJlZmxlY3RlZCBhcyBkcml2ZSAxIG9yIDIuCisKKwkJVGhlIGZpcnN0IGRyaXZlIGlzIHN0b3JlZCBpbiB0aGUgaGlnaCBuaWJibGUgb2YgQ01PUworCQlieXRlIDB4MTIsIHRoZSBzZWNvbmQgaW4gdGhlIGxvdyBuaWJibGUuICBUaGlzIHdpbGwgYmUKKwkJZWl0aGVyIGEgNCBiaXQgZHJpdmUgdHlwZSBvciAweGYgaW5kaWNhdGluZyB1c2UgYnl0ZSAweDE5IAorCQlmb3IgYW4gOCBiaXQgdHlwZSwgZHJpdmUgMSwgMHgxYSBmb3IgZHJpdmUgMiBpbiBDTU9TLgorCisJCU5lZWRsZXNzIHRvIHNheSwgYSBub24temVybyB2YWx1ZSBtZWFucyB3ZSBoYXZlIAorCQlhbiBBVCBjb250cm9sbGVyIGhhcmQgZGlzayBmb3IgdGhhdCBkcml2ZS4KKworCQlDdXJyZW50bHkgdGhlIHJ0Y19sb2NrIGlzIGEgYml0IGFjYWRlbWljIHNpbmNlIHRoaXMKKwkJZHJpdmVyIGlzIG5vbi1tb2R1bGFyLCBidXQgc29tZWRheS4uLiA/ICAgICAgICAgUGF1bCBHLgorCSovCisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJCWNtb3NfZGlza3MgPSBDTU9TX1JFQUQoMHgxMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNtb3NfZGlza3MgJiAweGYwKSB7CisJCQlpZiAoY21vc19kaXNrcyAmIDB4MGYpCisJCQkJTlJfSEQgPSAyOworCQkJZWxzZQorCQkJCU5SX0hEID0gMTsKKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyAqLworI2lmZGVmIF9fYXJtX18KKwlpZiAoIU5SX0hEKSB7CisJCS8qIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGRyaXZlLiAgVGhpcyBtZWFucworCQkgKiB0aGF0IHlvdSAqTVVTVCogc3BlY2lmeSB0aGUgZHJpdmUgcGFyYW1ldGVycyB0byB0aGUKKwkJICoga2VybmVsIHlvdXJzZWxmLgorCQkgKi8KKwkJcHJpbnRrKCJoZDogbm8gZHJpdmVzIHNwZWNpZmllZCAtIHVzZSBoZD1jeWwsaGVhZCxzZWN0b3JzIgorCQkJIiBvbiBrZXJuZWwgY29tbWFuZCBsaW5lXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAoIU5SX0hEKQorCQlnb3RvIG91dDsKKworCWZvciAoZHJpdmU9MCA7IGRyaXZlIDwgTlJfSEQgOyBkcml2ZSsrKSB7CisJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzayg2NCk7CisJCXN0cnVjdCBoZF9pX3N0cnVjdCAqcCA9ICZoZF9pbmZvW2RyaXZlXTsKKwkJaWYgKCFkaXNrKQorCQkJZ290byBFbm9tZW07CisJCWRpc2stPm1ham9yID0gTUFKT1JfTlI7CisJCWRpc2stPmZpcnN0X21pbm9yID0gZHJpdmUgPDwgNjsKKwkJZGlzay0+Zm9wcyA9ICZoZF9mb3BzOworCQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgImhkJWMiLCAnYScrZHJpdmUpOworCQlkaXNrLT5wcml2YXRlX2RhdGEgPSBwOworCQlzZXRfY2FwYWNpdHkoZGlzaywgcC0+aGVhZCAqIHAtPnNlY3QgKiBwLT5jeWwpOworCQlkaXNrLT5xdWV1ZSA9IGhkX3F1ZXVlOworCQlwLT51bml0ID0gZHJpdmU7CisJCWhkX2dlbmRpc2tbZHJpdmVdID0gZGlzazsKKwkJcHJpbnRrICgiJXM6ICVsdU1CLCBDSFM9JWQvJWQvJWRcbiIsCisJCQlkaXNrLT5kaXNrX25hbWUsICh1bnNpZ25lZCBsb25nKWdldF9jYXBhY2l0eShkaXNrKS8yMDQ4LAorCQkJcC0+Y3lsLCBwLT5oZWFkLCBwLT5zZWN0KTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoSERfSVJRLCBoZF9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgImhkIiwgTlVMTCkpIHsKKwkJcHJpbnRrKCJoZDogdW5hYmxlIHRvIGdldCBJUlElZCBmb3IgdGhlIGhhcmQgZGlzayBkcml2ZXJcbiIsCisJCQlIRF9JUlEpOworCQlnb3RvIG91dDE7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oSERfREFUQSwgOCwgImhkIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGQ6IHBvcnQgMHgleCBidXN5XG4iLCBIRF9EQVRBKTsKKwkJZ290byBvdXQyOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKEhEX0NNRCwgMSwgImhkKGNtZCkiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZDogcG9ydCAweCV4IGJ1c3lcbiIsIEhEX0NNRCk7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKiBMZXQgdGhlbSBmbHkgKi8KKwlmb3IoZHJpdmU9MDsgZHJpdmUgPCBOUl9IRDsgZHJpdmUrKykKKwkJYWRkX2Rpc2soaGRfZ2VuZGlza1tkcml2ZV0pOworCisJcmV0dXJuIDA7CisKK291dDM6CisJcmVsZWFzZV9yZWdpb24oSERfREFUQSwgOCk7CitvdXQyOgorCWZyZWVfaXJxKEhEX0lSUSwgTlVMTCk7CitvdXQxOgorCWZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IE5SX0hEOyBkcml2ZSsrKQorCQlwdXRfZGlzayhoZF9nZW5kaXNrW2RyaXZlXSk7CisJTlJfSEQgPSAwOworb3V0OgorCWRlbF90aW1lcigmZGV2aWNlX3RpbWVyKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihNQUpPUl9OUiwiaGQiKTsKKwlibGtfY2xlYW51cF9xdWV1ZShoZF9xdWV1ZSk7CisJcmV0dXJuIC0xOworRW5vbWVtOgorCXdoaWxlIChkcml2ZS0tKQorCQlwdXRfZGlzayhoZF9nZW5kaXNrW2RyaXZlXSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaGRfc2V0dXAgKGNoYXIgKmxpbmUpIHsKKwlpbnQgaW50c1s2XTsKKworCSh2b2lkKSBnZXRfb3B0aW9ucyhsaW5lLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwloZF9zZXR1cChOVUxMLCBpbnRzKTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgiaGQ9IiwgcGFyc2VfaGRfc2V0dXApOworCittb2R1bGVfaW5pdChoZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9odDY1NjBiLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaHQ2NTYwYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2ZiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaHQ2NTYwYi5jCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9odDY1NjBiLmMJCVZlcnNpb24gMC4wNwlGZWIgIDEsIDIwMDAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9yIChzZWUgYmVsb3cpCisgKi8KKworLyoKKyAqCisgKiAgVmVyc2lvbiAwLjAxICAgICAgICBJbml0aWFsIHZlcnNpb24gaGFja2VkIG91dCBvZiBpZGUuYworICoKKyAqICBWZXJzaW9uIDAuMDIgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIFBJTyBtb2RlcywgYXV0by10dW5lCisgKgorICogIFZlcnNpb24gMC4wMyAgICAgICAgU29tZSBjbGVhbnVwcworICoKKyAqICBWZXJzaW9uIDAuMDUgICAgICAgIFBJTyBtb2RlIGN5Y2xlIHRpbWluZ3MgYXV0by10dW5lIHVzaW5nIGJ1cy1zcGVlZAorICoKKyAqICBWZXJzaW9uIDAuMDYgICAgICAgIFByZWZldGNoIG1vZGUgbm93IGRlZmF1bHRzIG5vIE9GRi4gVG8gc2V0CisgKiAgICAgICAgICAgICAgICAgICAgICBwcmVmZXRjaCBtb2RlIE9GRi9PTiB1c2UgImhkcGFybSAtcDgvLXA5Ii4KKyAqICAgICAgICAgICAgICAgICAgICAgIFVubWFzayBpcnEgaXMgZGlzYWJsZWQgd2hlbiBwcmVmZXRjaCBtb2RlCisgKiAgICAgICAgICAgICAgICAgICAgICBpcyBlbmFibGVkLgorICoKKyAqICBWZXJzaW9uIDAuMDcgICAgICAgIFRyeWluZyB0byBmaXggQ0QtUk9NIGRldGVjdGlvbiBwcm9ibGVtLgorICogICAgICAgICAgICAgICAgICAgICAgIlByZWZldGNoIiBtb2RlIGJpdCBPRkYgZm9yIGlkZSBkaXNrcyBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIE9OIGZvciBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKiAgSFQtNjU2MEIgRUlERS1jb250cm9sbGVyIHN1cHBvcnQKKyAqICBUbyBhY3RpdmF0ZSBjb250cm9sbGVyIHN1cHBvcnQgdXNlIGtlcm5lbCBwYXJhbWV0ZXIgImlkZTA9aHQ2NTYwYiIuCisgKiAgVXNlIGhkcGFybSB1dGlsaXR5IHRvIGVuYWJsZSBQSU8gbW9kZSBzdXBwb3J0LgorICoKKyAqICBBdXRob3I6ICAgIE1pa2tvIEFsYS1Gb3NzaSAgICAgICAgICAgIDxtYWZAaWtpLmZpPgorICogICAgICAgICAgICAgSmFuIEV2ZXJ0IHZhbiBHcm9vdGhlZXN0ICAgPGphbmV2ZXJ0QGlhZS5ubD4KKyAqCisgKiAgVHJ5OiAgaHR0cDovL3d3dy5tYWYuaWtpLmZpL35tYWYvaHQ2NTYwYi8KKyAqLworCisjZGVmaW5lIEhUNjU2MEJfVkVSU0lPTiAidjAuMDciCisKKyN1bmRlZiBSRUFMTFlfU0xPV19JTwkJLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiAjZGVmaW5lIERFQlVHICovICAvKiByZW1vdmUgY29tbWVudHMgZm9yIERFQlVHIG1lc3NhZ2VzICovCisKKy8qCisgKiBUaGUgc3BlY2lhbCBpL28tcG9ydCB0aGF0IEhULTY1NjBCIHVzZXMgdG8gY29uZmlndXJhdGlvbjoKKyAqICAgIGJpdDAgKDB4MDEpOiAiMSIgc2VsZWN0cyBzZWNvbmRhcnkgaW50ZXJmYWNlCisgKiAgICBiaXQyICgweDA0KTogIjEiIGVuYWJsZXMgRklGTyBmdW5jdGlvbgorICogICAgYml0NSAoMHgyMCk6ICIxIiBlbmFibGVzIHByZWZldGNoZWQgZGF0YSByZWFkIGZ1bmN0aW9uICAoPz8/KQorICoKKyAqIFRoZSBzcGVjaWFsIGkvby1wb3J0IHRoYXQgSFQtNjU2MEEgdXNlcyB0byBjb25maWd1cmF0aW9uOgorICogICAgYml0MCAoMHgwMSk6ICIxIiBzZWxlY3RzIHNlY29uZGFyeSBpbnRlcmZhY2UKKyAqICAgIGJpdDEgKDB4MDIpOiAiMSIgZW5hYmxlcyBwcmVmZXRjaGVkIGRhdGEgcmVhZCBmdW5jdGlvbgorICogICAgYml0MiAoMHgwNCk6ICIwIiBlbmFibGVzIG11bHRpLW1hc3RlciBzeXN0ZW0JICAgICAgKD8pCisgKiAgICBiaXQzICgweDA4KTogIjEiIDMgY3ljbGUgdGltZSwgIjAiIDIgY3ljbGUgdGltZQkgICAgICAoPykKKyAqLworI2RlZmluZSBIVF9DT05GSUdfUE9SVAkgIDB4M2U2CisjZGVmaW5lIEhUX0NPTkZJRyhkcml2ZWEpICh1OCkoKChkcml2ZWEpLT5kcml2ZV9kYXRhICYgMHhmZjAwKSA+PiA4KQorLyoKKyAqIEZJRk8gKyBQUkVGRVRDSCAoYm90aCBhL2ItbW9kZWwpCisgKi8KKyNkZWZpbmUgSFRfQ09ORklHX0RFRkFVTFQgMHgxYyAvKiBubyBwcmVmZXRjaCAqLworLyogI2RlZmluZSBIVF9DT05GSUdfREVGQVVMVCAweDNjICovIC8qIHdpdGggcHJlZmV0Y2ggKi8KKyNkZWZpbmUgSFRfU0VDT05EQVJZX0lGCSAgMHgwMQorI2RlZmluZSBIVF9QUkVGRVRDSF9NT0RFICAweDIwCisKKy8qCisgKiBodDY1NjBiIFRpbWluZyB2YWx1ZXM6CisgKgorICogSSByZXZpZXdlZCBzb21lIGFzc2VtYmxlciBzb3VyY2UgbGlzdGluZ3Mgb2YgaHRpZGUgZHJpdmVycyBhbmQgZm91bmQKKyAqIG91dCBob3cgdGhleSBzZXR1cCB0aG9zZSBjeWNsZSB0aW1lIGludGVyZmFjaW5nIHZhbHVlcywgYXMgdGhleSBhdCBIb2x0ZWsKKyAqIGNhbGwgdGhlbS4gSURFU0VUVVAuQ09NIHRoYXQgaXMgc3VwcGxpZWQgd2l0aCB0aGUgZHJpdmVycyBmaWd1cmVzIG91dAorICogb3B0aW1hbCB2YWx1ZXMgYW5kIGZldGNoZXMgdGhvc2UgdmFsdWVzIHRvIGRyaXZlcnMuIEkgZm91bmQgb3V0IHRoYXQKKyAqIHRoZXkgdXNlIElERV9TRUxFQ1RfUkVHIHRvIGZldGNoIHRpbWluZ3MgdG8gdGhlIGlkZSBib2FyZCByaWdodCBhZnRlcgorICogaW50ZXJmYWNlIHN3aXRjaGluZy4gQWZ0ZXIgdGhhdCBpdCB3YXMgcXVpdGUgZWFzeSB0byBhZGQgY29kZSB0bworICogaHQ2NTYwYi5jLgorICoKKyAqIElERVNFVFVQLkNPTSBnYXZlIG1lIHZhbHVlcyAweDI0LCAweDQ1LCAweGFhLCAweGZmIHRoYXQgd29ya2VkIGZpbmUKKyAqIGZvciBoZGEgYW5kIGhkYy4gQnV0IGhkYiBuZWVkZWQgaGlnaGVyIHZhbHVlcyB0byB3b3JrLCBzbyBJIGd1ZXNzCisgKiB0aGF0IHNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gZ2l2ZSBoaWdoZXIgdmFsdWUgdGhhbiBJREVTRVRVUAorICogZ2l2ZXMuICAgW3NlZSBjbWQ2NDAuYyBmb3IgYW4gZXh0cmVtZSBleGFtcGxlIG9mIHRoaXMuIC1tbF0KKyAqCisgKiBQZXJoYXBzIEkgc2hvdWxkIGV4cGxhaW4gc29tZXRoaW5nIGFib3V0IHRoZXNlIHRpbWluZyB2YWx1ZXM6CisgKiBUaGUgaGlnaGVyIG5pYmJsZSBvZiB2YWx1ZSBpcyB0aGUgUmVjb3ZlcnkgVGltZSAgKHJ0KSBhbmQgdGhlIGxvd2VyIG5pYmJsZQorICogb2YgdGhlIHZhbHVlIGlzIHRoZSBBY3RpdmUgVGltZSAgKGF0KS4gTWluaW11bSB2YWx1ZSAyIGlzIHRoZSBmYXN0ZXN0IGFuZAorICogdGhlIG1heGltdW0gdmFsdWUgMTUgaXMgdGhlIHNsb3dlc3QuIERlZmF1bHQgdmFsdWVzIHNob3VsZCBiZSAxNSBmb3IgYm90aC4KKyAqIFNvIDB4MjQgbWVhbnMgMiBmb3IgcnQgYW5kIDQgZm9yIGF0LiBFYWNoIG9mIHRoZSBkcml2ZXMgc2hvdWxkIGhhdmUKKyAqIGJvdGggdmFsdWVzLCBhbmQgSURFU0VUVVAgZ2l2ZXMgYXV0b21hdGljYWxseSBydD0xNSBzdD0xNSBmb3IgQ0RST01zIG9yCisgKiBzaW1pbGFyLiBJZiB2YWx1ZSBpcyB0b28gc21hbGwgdGhlcmUgd2lsbCBiZSBhbGwgc29ydHMgb2YgZmFpbHVyZXMuCisgKgorICogVGltaW5nIGJ5dGUgY29uc2lzdHMgb2YKKyAqCUhpZ2ggbmliYmxlOiAgUmVjb3ZlcnkgQ3ljbGUgVGltZSAgKHJ0KQorICoJICAgICBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMiB0byAxNS4gVGhlIGRlZmF1bHQgaXMgMTUuCisgKgorICoJTG93IG5pYmJsZTogICBBY3RpdmUgQ3ljbGUgVGltZQkgICAoYXQpCisgKgkgICAgIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAyIHRvIDE1LiBUaGUgZGVmYXVsdCBpcyAxNS4KKyAqCisgKiBZb3UgY2FuIG9idGFpbiBvcHRpbWl6ZWQgdGltaW5nIHZhbHVlcyBieSBydW5uaW5nIEhvbHRlayBJREVTRVRVUC5DT00KKyAqIGZvciBET1MuIERPUyBkcml2ZXJzIGdldCB0aGVpciB0aW1pbmcgdmFsdWVzIGZyb20gY29tbWFuZCBsaW5lLCB3aGVyZQorICogdGhlIGZpcnN0IHZhbHVlIGlzIHRoZSBSZWNvdmVyeSBUaW1lIGFuZCB0aGUgc2Vjb25kIHZhbHVlIGlzIHRoZQorICogQWN0aXZlIFRpbWUgZm9yIGVhY2ggZHJpdmUuIFNtYWxsZXIgdmFsdWUgZ2l2ZXMgaGlnaGVyIHNwZWVkLgorICogSW4gY2FzZSBvZiBmYWlsdXJlcyB5b3Ugc2hvdWxkIHByb2JhYmx5IGZhbGwgYmFjayB0byBhIGhpZ2hlciB2YWx1ZS4KKyAqLworI2RlZmluZSBIVF9USU1JTkcoZHJpdmVhKSAodTgpKChkcml2ZWEpLT5kcml2ZV9kYXRhICYgMHgwMGZmKQorI2RlZmluZSBIVF9USU1JTkdfREVGQVVMVCAweGZmCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBpbnRlcmZhY2Ugc3dpdGNoaW5nIGZvciB0aGUgcGVjdWxpYXIgaGFyZHdhcmUgZGVzaWduCisgKiBvbiB0aGUgRi5HLkkuL0hvbHRlayBIVC02NTYwQiBWTEIgSURFIGludGVyZmFjZS4KKyAqIFRoZSBIVC02NTYwQiBjYW4gb25seSBlbmFibGUgb25lIElERSBwb3J0IGF0IGEgdGltZSwgYW5kIHJlcXVpcmVzIGEKKyAqIHNpbGx5IHNlcXVlbmNlIChiZWxvdykgd2hlbmV2ZXIgd2Ugc3dpdGNoIGJldHdlZW4gcHJpbWFyeSBhbmQgc2Vjb25kYXJ5LgorICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCBmcm9tIGlkZS5jIHRvIHByZXBhcmUgZm9yIGFjY2VzcyB0byBhIGdpdmVuIGRyaXZlLgorICovCitzdGF0aWMgdm9pZCBodDY1NjBiX3NlbGVjdHByb2MgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0YXRpYyB1OCBjdXJyZW50X3NlbGVjdCA9IDA7CisJc3RhdGljIHU4IGN1cnJlbnRfdGltaW5nID0gMDsKKwl1OCBzZWxlY3QsIHRpbWluZzsKKwkKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCisJc2VsZWN0ID0gSFRfQ09ORklHKGRyaXZlKTsKKwl0aW1pbmcgPSBIVF9USU1JTkcoZHJpdmUpOworCQorCWlmIChzZWxlY3QgIT0gY3VycmVudF9zZWxlY3QgfHwgdGltaW5nICE9IGN1cnJlbnRfdGltaW5nKSB7CisJCWN1cnJlbnRfc2VsZWN0ID0gc2VsZWN0OworCQljdXJyZW50X3RpbWluZyA9IHRpbWluZzsKKwkJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCAhZHJpdmUtPnByZXNlbnQpCisJCQlzZWxlY3QgfD0gSFRfUFJFRkVUQ0hfTU9ERTsKKwkJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIoSFRfQ09ORklHX1BPUlQpOworCQkodm9pZCkgSFdJRihkcml2ZSktPklOQihIVF9DT05GSUdfUE9SVCk7CisJCSh2b2lkKSBIV0lGKGRyaXZlKS0+SU5CKEhUX0NPTkZJR19QT1JUKTsKKwkJKHZvaWQpIEhXSUYoZHJpdmUpLT5JTkIoSFRfQ09ORklHX1BPUlQpOworCQlIV0lGKGRyaXZlKS0+T1VUQihzZWxlY3QsIEhUX0NPTkZJR19QT1JUKTsKKwkJLyoKKwkJICogU2V0IHRpbWluZyBmb3IgdGhpcyBkcml2ZToKKwkJICovCisJCUhXSUYoZHJpdmUpLT5PVVRCKHRpbWluZywgSURFX1NFTEVDVF9SRUcpOworCQkodm9pZCkgSFdJRihkcml2ZSktPklOQihJREVfU1RBVFVTX1JFRyk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJodDY1NjBiOiAlczogc2VsZWN0PSUjeCB0aW1pbmc9JSN4XG4iLAorCQkJZHJpdmUtPm5hbWUsIHNlbGVjdCwgdGltaW5nKTsKKyNlbmRpZgorCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBBdXRvZGV0ZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiBodDY1NjBiCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHRyeV90b19pbml0X2h0NjU2MGIodm9pZCkKK3sKKwl1OCBvcmlnX3ZhbHVlOworCWludCBpOworCQorCS8qIEF1dG9kZXRlY3QgaHQ2NTYwYiAqLworCWlmICgob3JpZ192YWx1ZSA9IGluYihIVF9DT05GSUdfUE9SVCkpID09IDB4ZmYpCisJCXJldHVybiAwOworCQorCWZvciAoaT0zO2k+MDtpLS0pIHsKKwkJb3V0YigweDAwLCBIVF9DT05GSUdfUE9SVCk7CisJCWlmICghKCAofmluYihIVF9DT05GSUdfUE9SVCkpICYgMHgzZiApKSB7CisJCQlvdXRiKG9yaWdfdmFsdWUsIEhUX0NPTkZJR19QT1JUKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCW91dGIoMHgwMCwgSFRfQ09ORklHX1BPUlQpOworCWlmICgofmluYihIVF9DT05GSUdfUE9SVCkpJiAweDNmKSB7CisJCW91dGIob3JpZ192YWx1ZSwgSFRfQ09ORklHX1BPUlQpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBIdDY1NjBiIGF1dG9kZXRlY3RlZAorCSAqLworCW91dGIoSFRfQ09ORklHX0RFRkFVTFQsIEhUX0NPTkZJR19QT1JUKTsKKwlvdXRiKEhUX1RJTUlOR19ERUZBVUxULCAweDFmNik7ICAvKiBJREVfU0VMRUNUX1JFRyAqLworCSh2b2lkKSBpbmIoMHgxZjcpOyAgICAgICAgICAgICAgIC8qIElERV9TVEFUVVNfUkVHICovCisJCisJcHJpbnRrKCJcbmh0NjU2MGIgIiBIVDY1NjBCX1ZFUlNJT04KKwkgICAgICAgIjogY2hpcHNldCBkZXRlY3RlZCBhbmQgaW5pdGlhbGl6ZWQiCisjaWZkZWYgREVCVUcKKwkgICAgICAgIiB3aXRoIGRlYnVnIGVuYWJsZWQiCisjZW5kaWYKKwkJKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHU4IGh0X3BpbzJ0aW1pbmdzKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCWludCBhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZTsKKwlpbnQgYWN0aXZlX2N5Y2xlcywgcmVjb3ZlcnlfY3ljbGVzOworCWlkZV9waW9fZGF0YV90IGQ7CisJaW50IGJ1c19zcGVlZCA9IHN5c3RlbV9idXNfY2xvY2soKTsKKwkKKyAgICAgICAgaWYgKHBpbykgeworCQlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNSwgJmQpOworCQkKKwkJLyoKKwkJICogIEp1c3QgbGlrZSBvcHRpNjIxLmMgd2UgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUKKwkJICogIGFjdHVhbCBjeWNsZSB0aW1lIGZvciByZWNvdmVyeSBhbmQgYWN0aXZpdHkKKwkJICogIGFjY29yZGluZyBzeXN0ZW0gYnVzIHNwZWVkLgorCQkgKi8KKwkJYWN0aXZlX3RpbWUgPSBpZGVfcGlvX3RpbWluZ3NbcGlvXS5hY3RpdmVfdGltZTsKKwkJcmVjb3ZlcnlfdGltZSA9IGQuY3ljbGVfdGltZSAKKwkJCS0gYWN0aXZlX3RpbWUKKwkJCS0gaWRlX3Bpb190aW1pbmdzW3Bpb10uc2V0dXBfdGltZTsKKwkJLyoKKwkJICogIEN5Y2xlIHRpbWVzIHNob3VsZCBiZSBWZXNhIGJ1cyBjeWNsZXMKKwkJICovCisJCWFjdGl2ZV9jeWNsZXMgICA9IChhY3RpdmVfdGltZSAgICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDA7CisJCXJlY292ZXJ5X2N5Y2xlcyA9IChyZWNvdmVyeV90aW1lICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDA7CisJCS8qCisJCSAqICBVcHBlciBhbmQgbG93ZXIgbGltaXRzCisJCSAqLworCQlpZiAoYWN0aXZlX2N5Y2xlcyAgIDwgMikgIGFjdGl2ZV9jeWNsZXMgICA9IDI7CisJCWlmIChyZWNvdmVyeV9jeWNsZXMgPCAyKSAgcmVjb3ZlcnlfY3ljbGVzID0gMjsKKwkJaWYgKGFjdGl2ZV9jeWNsZXMgICA+IDE1KSBhY3RpdmVfY3ljbGVzICAgPSAxNTsKKwkJaWYgKHJlY292ZXJ5X2N5Y2xlcyA+IDE1KSByZWNvdmVyeV9jeWNsZXMgPSAwOyAgLyogMD09MTYgKi8KKwkJCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJodDY1NjBiOiBkcml2ZSAlcyBzZXR0aW5nIHBpbz0lZCByZWNvdmVyeT0lZCAoJWRucykgYWN0aXZlPSVkICglZG5zKVxuIiwgZHJpdmUtPm5hbWUsIHBpbywgcmVjb3ZlcnlfY3ljbGVzLCByZWNvdmVyeV90aW1lLCBhY3RpdmVfY3ljbGVzLCBhY3RpdmVfdGltZSk7CisjZW5kaWYKKwkJCisJCXJldHVybiAodTgpKChyZWNvdmVyeV9jeWNsZXMgPDwgNCkgfCBhY3RpdmVfY3ljbGVzKTsKKwl9IGVsc2UgeworCQkKKyNpZmRlZiBERUJVRworCQlwcmludGsoImh0NjU2MGI6IGRyaXZlICVzIHNldHRpbmcgcGlvPTBcbiIsIGRyaXZlLT5uYW1lKTsKKyNlbmRpZgorCQkKKwkJcmV0dXJuIEhUX1RJTUlOR19ERUZBVUxUOyAgICAvKiBkZWZhdWx0IHNldHRpbmcgKi8KKwl9Cit9CisKKy8qCisgKiAgRW5hYmxlL0Rpc2FibGUgc28gY2FsbGVkIHByZWZldGNoIG1vZGUKKyAqLworc3RhdGljIHZvaWQgaHRfc2V0X3ByZWZldGNoKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdCA9IEhUX1BSRUZFVENIX01PREUgPDwgODsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkKKwkvKgorCSAqICBQcmVmZXRjaCBtb2RlIGFuZCB1bm1hc2sgaXJxIHNlZW1zIHRvIGNvbmZsaWN0CisJICovCisJaWYgKHN0YXRlKSB7CisJCWRyaXZlLT5kcml2ZV9kYXRhIHw9IHQ7ICAgLyogZW5hYmxlIHByZWZldGNoIG1vZGUgKi8KKwkJZHJpdmUtPm5vX3VubWFzayA9IDE7CisJCWRyaXZlLT51bm1hc2sgPSAwOworCX0gZWxzZSB7CisJCWRyaXZlLT5kcml2ZV9kYXRhICY9IH50OyAgLyogZGlzYWJsZSBwcmVmZXRjaCBtb2RlICovCisJCWRyaXZlLT5ub191bm1hc2sgPSAwOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHCisJcHJpbnRrKCJodDY1NjBiOiBkcml2ZSAlcyBwcmVmZXRjaCBtb2RlICVzYWJsZWRcbiIsIGRyaXZlLT5uYW1lLCAoc3RhdGUgPyAiZW4iIDogImRpcyIpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0dW5lX2h0NjU2MGIgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdGltaW5nOworCQorCXN3aXRjaCAocGlvKSB7CisJY2FzZSA4OiAgICAgICAgIC8qIHNldCBwcmVmZXRjaCBvZmYgKi8KKwljYXNlIDk6ICAgICAgICAgLyogc2V0IHByZWZldGNoIG9uICovCisJCWh0X3NldF9wcmVmZXRjaChkcml2ZSwgcGlvICYgMSk7CisJCXJldHVybjsKKwl9CisJCisJdGltaW5nID0gaHRfcGlvMnRpbWluZ3MoZHJpdmUsIHBpbyk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCisJZHJpdmUtPmRyaXZlX2RhdGEgJj0gMHhmZjAwOworCWRyaXZlLT5kcml2ZV9kYXRhIHw9IHRpbWluZzsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHCisJcHJpbnRrKCJodDY1NjBiOiBkcml2ZSAlcyB0dW5lZCB0byBwaW8gbW9kZSAlI3ggdGltaW5nPSUjeFxuIiwgZHJpdmUtPm5hbWUsIHBpbywgdGltaW5nKTsKKyNlbmRpZgorfQorCisvKiBDYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gaWRlLmMuICovCitpbnQgX19pbml0IGh0NjU2MGJfaW5pdCh2b2lkKQoreworCWlkZV9od2lmX3QgKmh3aWYsICptYXRlOworCWludCB0OworCisJaHdpZiA9ICZpZGVfaHdpZnNbMF07CisJbWF0ZSA9ICZpZGVfaHdpZnNbMV07CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKEhUX0NPTkZJR19QT1JULCAxLCBod2lmLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBIVF9DT05GSUdfUE9SVCBub3QgZm91bmRcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIXRyeV90b19pbml0X2h0NjU2MGIoKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBIQkEgbm90IGZvdW5kXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uOworCX0KKworCWh3aWYtPmNoaXBzZXQgPSBpZGVfaHQ2NTYwYjsKKwlod2lmLT5zZWxlY3Rwcm9jID0gJmh0NjU2MGJfc2VsZWN0cHJvYzsKKwlod2lmLT50dW5lcHJvYyA9ICZ0dW5lX2h0NjU2MGI7CisJaHdpZi0+c2VyaWFsaXplZCA9IDE7CS8qIGlzIHRoaXMgbmVlZGVkPyAqLworCWh3aWYtPm1hdGUgPSBtYXRlOworCisJbWF0ZS0+Y2hpcHNldCA9IGlkZV9odDY1NjBiOworCW1hdGUtPnNlbGVjdHByb2MgPSAmaHQ2NTYwYl9zZWxlY3Rwcm9jOworCW1hdGUtPnR1bmVwcm9jID0gJnR1bmVfaHQ2NTYwYjsKKwltYXRlLT5zZXJpYWxpemVkID0gMTsJLyogaXMgdGhpcyBuZWVkZWQ/ICovCisJbWF0ZS0+bWF0ZSA9IGh3aWY7CisJbWF0ZS0+Y2hhbm5lbCA9IDE7CisKKwkvKgorCSAqIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9ucyBmb3IgZHJpdmVzCisJICovCisJdCA9IChIVF9DT05GSUdfREVGQVVMVCA8PCA4KTsKKwl0IHw9IEhUX1RJTUlOR19ERUZBVUxUOworCWh3aWYtPmRyaXZlc1swXS5kcml2ZV9kYXRhID0gdDsKKwlod2lmLT5kcml2ZXNbMV0uZHJpdmVfZGF0YSA9IHQ7CisKKwl0IHw9IChIVF9TRUNPTkRBUllfSUYgPDwgOCk7CisJbWF0ZS0+ZHJpdmVzWzBdLmRyaXZlX2RhdGEgPSB0OworCW1hdGUtPmRyaXZlc1sxXS5kcml2ZV9kYXRhID0gdDsKKworCXByb2JlX2h3aWZfaW5pdChod2lmKTsKKwlwcm9iZV9od2lmX2luaXQobWF0ZSk7CisKKwljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJcmV0dXJuIDA7CisKK3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKEhUX0NPTkZJR19QT1JULCAxKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX2luaXQoaHQ2NTYwYl9pbml0KTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJTZWUgTG9jYWwgRmlsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIVC02NTYwQiBFSURFLWNvbnRyb2xsZXIgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDMyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBkcml2ZXIgZm9yIFBDTUNJQSBJREUvQVRBIGRpc2sgY2FyZHMKKworICAgIGlkZS1jcy5jIDEuMyAyMDAyLzEwLzI2IDA1OjQ1OjMxCisKKyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisKKyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAgICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgICAgd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAgICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorICAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAgICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENNQ0lBIEFUQS9JREUgY2FyZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImlkZS1jcy5jIDEuMyAyMDAyLzEwLzI2IDA1OjQ1OjMxIChEYXZpZCBIaW5kcykiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGNvbnN0IGNoYXIgaWRlX21ham9yW10gPSB7CisgICAgSURFMF9NQUpPUiwgSURFMV9NQUpPUiwgSURFMl9NQUpPUiwgSURFM19NQUpPUiwKKyAgICBJREU0X01BSk9SLCBJREU1X01BSk9SCit9OworCit0eXBlZGVmIHN0cnVjdCBpZGVfaW5mb190IHsKKyAgICBkZXZfbGlua190CWxpbms7CisgICAgaW50CQluZGV2OworICAgIGRldl9ub2RlX3QJbm9kZTsKKyAgICBpbnQJCWhkOworfSBpZGVfaW5mb190OworCitzdGF0aWMgdm9pZCBpZGVfcmVsZWFzZShkZXZfbGlua190ICopOworc3RhdGljIGludCBpZGVfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImlkZS1jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICppZGVfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgaWRlX2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGlkZV9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICppZGVfYXR0YWNoKHZvaWQpCit7CisgICAgaWRlX2luZm9fdCAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgImlkZV9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IGlkZSBkZXZpY2UgKi8KKyAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWluZm8pIHJldHVybiBOVUxMOworICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKyAgICBsaW5rID0gJmluZm8tPmxpbms7IGxpbmstPnByaXYgPSBpbmZvOworCisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMzsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZpZGVfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlpZGVfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGluazsKK30gLyogaWRlX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBpZGVfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworICAgIGludCByZXQ7CisKKyAgICBERUJVRygwLCAiaWRlX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJaWRlX3JlbGVhc2UobGluayk7CisgICAgCisgICAgaWYgKGxpbmstPmhhbmRsZSkgeworCXJldCA9IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBEZXJlZ2lzdGVyQ2xpZW50LCByZXQpOworICAgIH0KKyAgICAKKyAgICAvKiBVbmxpbmssIGZyZWUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAga2ZyZWUobGluay0+cHJpdik7CisgICAgCit9IC8qIGlkZV9kZXRhY2ggKi8KKworc3RhdGljIGludCBpZGVjc19yZWdpc3Rlcih1bnNpZ25lZCBsb25nIGlvLCB1bnNpZ25lZCBsb25nIGN0bCwgdW5zaWduZWQgbG9uZyBpcnEpCit7CisgICAgaHdfcmVnc190IGh3OworICAgIG1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworICAgIGlkZV9pbml0X2h3aWZfcG9ydHMoJmh3LCBpbywgY3RsLCBOVUxMKTsKKyAgICBody5pcnEgPSBpcnE7CisgICAgaHcuY2hpcHNldCA9IGlkZV9wY2k7CisgICAgcmV0dXJuIGlkZV9yZWdpc3Rlcl9od193aXRoX2ZpeHVwKCZodywgTlVMTCwgaWRlX3VuZGVjb2RlZF9zbGF2ZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgaWRlX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGlkZSBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGlkZV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIGlkZV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgc3RydWN0IHsKKwl1X3Nob3J0CQlidWZbMTI4XTsKKwljaXNwYXJzZV90CXBhcnNlOworCWNvbmZpZ19pbmZvX3QJY29uZjsKKwljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQ7CisgICAgfSAqc3RrID0gTlVMTDsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmc7CisgICAgaW50IGksIHBhc3MsIGxhc3RfcmV0ID0gMCwgbGFzdF9mbiA9IDAsIGhkLCBpc19rbWUgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgaW9fYmFzZSwgY3RsX2Jhc2U7CisKKyAgICBERUJVRygwLCAiaWRlX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICBzdGsgPSBrbWFsbG9jKHNpemVvZigqc3RrKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzdGspIGdvdG8gZXJyX21lbTsKKyAgICBtZW1zZXQoc3RrLCAwLCBzaXplb2YoKnN0aykpOworICAgIGNmZyA9ICZzdGstPnBhcnNlLmNmdGFibGVfZW50cnk7CisKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopJnN0ay0+YnVmOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZzdGstPnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gc3RrLT5wYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBzdGstPnBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisgICAgaWYgKCFwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSAmJgorCSFwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICYmCisJIXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnN0ay0+cGFyc2UpKQorCWlzX2ttZSA9ICgoc3RrLT5wYXJzZS5tYW5maWQubWFuZiA9PSBNQU5GSURfS01FKSAmJgorCQkgICgoc3RrLT5wYXJzZS5tYW5maWQuY2FyZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQSkgfHwKKwkJICAgKHN0ay0+cGFyc2UubWFuZmlkLmNhcmQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0IpKSk7CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0Li4uIGxvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCisgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJnN0ay0+Y29uZikpOworICAgIGxpbmstPmNvbmYuVmNjID0gc3RrLT5jb25mLlZjYzsKKworICAgIHBhc3MgPSBpb19iYXNlID0gY3RsX2Jhc2UgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB3aGlsZSAoMSkgeworICAgIAlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwKSBnb3RvIG5leHRfZW50cnk7CisJaWYgKHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnN0ay0+cGFyc2UpICE9IDApIGdvdG8gbmV4dF9lbnRyeTsKKworCS8qIENoZWNrIGZvciBtYXRjaGluZyBWY2MsIHVubGVzcyB3ZSdyZSBkZXNwZXJhdGUgKi8KKwlpZiAoIXBhc3MpIHsKKwkgICAgaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJaWYgKHN0ay0+Y29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApCisJCSAgICBnb3RvIG5leHRfZW50cnk7CisJICAgIH0gZWxzZSBpZiAoc3RrLT5kZmx0LnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmIChzdGstPmNvbmYuVmNjICE9IHN0ay0+ZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApCisJCSAgICBnb3RvIG5leHRfZW50cnk7CisJICAgIH0KKwl9CisKKwlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJICAgIGxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwllbHNlIGlmIChzdGstPmRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQorCSAgICBsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQlzdGstPmRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKworCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKHN0ay0+ZGZsdC5pby5ud2luID4gMCkpIHsKKwkgICAgY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZzdGstPmRmbHQuaW87CisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJICAgIGlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJICAgIGlmIChpby0+bndpbiA9PSAyKSB7CisJCWxpbmstPmlvLk51bVBvcnRzMSA9IDg7CisJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJbGluay0+aW8uTnVtUG9ydHMyID0gKGlzX2ttZSkgPyAyIDogMTsKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlpb19iYXNlID0gbGluay0+aW8uQmFzZVBvcnQxOworCQljdGxfYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MjsKKwkgICAgfSBlbHNlIGlmICgoaW8tPm53aW4gPT0gMSkgJiYgKGlvLT53aW5bMF0ubGVuID49IDE2KSkgeworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlpb19iYXNlID0gbGluay0+aW8uQmFzZVBvcnQxOworCQljdGxfYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDB4MGU7CisJICAgIH0gZWxzZSBnb3RvIG5leHRfZW50cnk7CisJICAgIC8qIElmIHdlJ3ZlIGdvdCB0aGlzIGZhciwgd2UncmUgZG9uZSAqLworCSAgICBicmVhazsKKwl9CisKKyAgICBuZXh0X2VudHJ5OgorCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKKwkgICAgbWVtY3B5KCZzdGstPmRmbHQsIGNmZywgc2l6ZW9mKHN0ay0+ZGZsdCkpOworCWlmIChwYXNzKSB7CisJICAgIENTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfSBlbHNlIGlmIChwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpICE9IDApIHsKKwkgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCSAgICBtZW1zZXQoJnN0ay0+ZGZsdCwgMCwgc2l6ZW9mKHN0ay0+ZGZsdCkpOworCSAgICBwYXNzKys7CisJfQorICAgIH0KKworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKyAgICAvKiBkaXNhYmxlIGRyaXZlIGludGVycnVwdHMgZHVyaW5nIElERSBwcm9iZSAqLworICAgIG91dGIoMHgwMiwgY3RsX2Jhc2UpOworCisgICAgLyogc3BlY2lhbCBzZXR1cCBmb3IgS1hMQzAwNSBjYXJkICovCisgICAgaWYgKGlzX2ttZSkKKwlvdXRiKDB4ODEsIGN0bF9iYXNlKzEpOworCisgICAgLyogcmV0cnkgcmVnaXN0cmF0aW9uIGluIGNhc2UgZGV2aWNlIGlzIHN0aWxsIHNwaW5uaW5nIHVwICovCisgICAgZm9yIChoZCA9IC0xLCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwloZCA9IGlkZWNzX3JlZ2lzdGVyKGlvX2Jhc2UsIGN0bF9iYXNlLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChoZCA+PSAwKSBicmVhazsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxID09IDB4MjApIHsKKwkgICAgb3V0YigweDAyLCBjdGxfYmFzZSArIDB4MTApOworCSAgICBoZCA9IGlkZWNzX3JlZ2lzdGVyKGlvX2Jhc2UgKyAweDEwLCBjdGxfYmFzZSArIDB4MTAsCisJCQkJbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwkgICAgaWYgKGhkID49IDApIHsKKwkJaW9fYmFzZSArPSAweDEwOworCQljdGxfYmFzZSArPSAweDEwOworCQlicmVhazsKKwkgICAgfQorCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKyAgICB9CisKKyAgICBpZiAoaGQgPCAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJpZGUtY3M6IGlkZV9yZWdpc3RlcigpIGF0IDB4JTNseCAmIDB4JTNseCIKKwkgICAgICAgIiwgaXJxICV1IGZhaWxlZFxuIiwgaW9fYmFzZSwgY3RsX2Jhc2UsCisJICAgICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgaW5mby0+bmRldiA9IDE7CisgICAgc3ByaW50ZihpbmZvLT5ub2RlLmRldl9uYW1lLCAiaGQlYyIsICdhJyArIChoZCAqIDIpKTsKKyAgICBpbmZvLT5ub2RlLm1ham9yID0gaWRlX21ham9yW2hkXTsKKyAgICBpbmZvLT5ub2RlLm1pbm9yID0gMDsKKyAgICBpbmZvLT5oZCA9IGhkOworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIHByaW50ayhLRVJOX0lORk8gImlkZS1jczogJXM6IFZjYyA9ICVkLiVkLCBWcHAgPSAlZC4lZFxuIiwKKwkgICBpbmZvLT5ub2RlLmRldl9uYW1lLCBsaW5rLT5jb25mLlZjYyAvIDEwLCBsaW5rLT5jb25mLlZjYyAlIDEwLAorCSAgIGxpbmstPmNvbmYuVnBwMSAvIDEwLCBsaW5rLT5jb25mLlZwcDEgJSAxMCk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIGtmcmVlKHN0ayk7CisgICAgcmV0dXJuOworCitlcnJfbWVtOgorICAgIHByaW50ayhLRVJOX05PVElDRSAiaWRlLWNzOiBpZGVfY29uZmlnIGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvblxuIik7CisgICAgZ290byBmYWlsZWQ7CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBrZnJlZShzdGspOworICAgIGlkZV9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Cit9IC8qIGlkZV9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgaWRlX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgaWRlX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpZGVfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKyAgICAKKyAgICBERUJVRygwLCAiaWRlX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgaWYgKGluZm8tPm5kZXYpIHsKKwkvKiBGSVhNRTogaWYgdGhpcyBmYWlscyB3ZSBuZWVkIHRvIHF1ZXVlIHRoZSBjbGVhbnVwIHNvbWVob3cKKwkgICAtLSBuZWVkIHRvIGludmVzdGlnYXRlIHRoZSByZXF1aXJlZCBQQ01DSUEgbWFnaWMgKi8KKwlpZGVfdW5yZWdpc3RlcihpbmZvLT5oZCk7CisgICAgfQorICAgIGluZm8tPm5kZXYgPSAwOworICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICAKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKworfSAvKiBpZGVfcmVsZWFzZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgaWRlIGRyaXZlcnMgZnJvbQorICAgIHRhbGtpbmcgdG8gdGhlIHBvcnRzLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCBpZGVfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisKKyAgICBERUJVRygxLCAiaWRlX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCWlkZV9yZWxlYXNlKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJaWRlX2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAoREVWX09LKGxpbmspKQorCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogaWRlX2V2ZW50ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBpZGVfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiaWRlLWNzIiwKKwl9LAorCS5hdHRhY2gJCT0gaWRlX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGlkZV9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2lkZV9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZpZGVfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaWRlX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZpZGVfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaWRlX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfaWRlX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9tYWNpZGUuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9tYWNpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNhYzYwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9tYWNpZGUuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9sZWdhY3kvbWFjaWRlLmMgLS0gTWFjaW50b3NoIElERSBEcml2ZXIKKyAqCisgKiAgICAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IE1pY2hhZWwgU2NobWl0egorICoKKyAqICBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBiYXNlZCBvbiBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBNYWNPUyBJREUKKyAqICBkcml2ZXIgYmluYXJ5IGJ5IE1pa2FlbCBGb3JzZWxpdXMKKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaHcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CisjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjX2JhYm9vbi5oPgorCisjZGVmaW5lIElERV9CQVNFIDB4NTBGMUEwMDAJLyogQmFzZSBhZGRyZXNzIG9mIElERSBjb250cm9sbGVyICovCisKKy8qCisgKiBHZW5lcmljIElERSByZWdpc3RlcnMgYXMgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlCisgKiBUaGVzZSBtYXRjaCBNa0xpbnV4IHNvIHRoZXkgc2hvdWxkIGJlIGNvcnJlY3QuCisgKi8KKworI2RlZmluZSBJREVfREFUQQkweDAwCisjZGVmaW5lIElERV9FUlJPUgkweDA0CS8qIHNlZSBlcnItYml0cyAqLworI2RlZmluZSBJREVfTlNFQ1RPUgkweDA4CS8qIG5yIG9mIHNlY3RvcnMgdG8gcmVhZC93cml0ZSAqLworI2RlZmluZSBJREVfU0VDVE9SCTB4MGMJLyogc3RhcnRpbmcgc2VjdG9yICovCisjZGVmaW5lIElERV9MQ1lMCTB4MTAJLyogc3RhcnRpbmcgY3lsaW5kZXIgKi8KKyNkZWZpbmUgSURFX0hDWUwJMHgxNAkvKiBoaWdoIGJ5dGUgb2Ygc3RhcnRpbmcgY3lsICovCisjZGVmaW5lIElERV9TRUxFQ1QJMHgxOAkvKiAxMDFkaGhoaCAsIGQ9ZHJpdmUsIGhoaGg9aGVhZCAqLworI2RlZmluZSBJREVfU1RBVFVTCTB4MWMJLyogc2VlIHN0YXR1cy1iaXRzICovCisjZGVmaW5lIElERV9DT05UUk9MCTB4MzgJLyogY29udHJvbC9hbHRzdGF0dXMgKi8KKworLyoKKyAqIE1hYy1zcGVjaWZpYyByZWdpc3RlcnMKKyAqLworCisvKgorICogdGhpcyByZWdpc3RlciBpcyBvZGQ7IGl0IGRvZXNuJ3Qgc2VlbSB0byBkbyBtdWNoIGFuZCBpdCdzCisgKiBub3Qgd29yZC1hbGlnbmVkIGxpa2UgdmlydHVhbGx5IGV2ZXJ5IG90aGVyIGhhcmR3YXJlIHJlZ2lzdGVyCisgKiBvbiB0aGUgTWFjLi4uCisgKi8KKworI2RlZmluZSBJREVfSUZSCQkweDEwMQkvKiAoMHgxMDEpIElERSBpbnRlcnJ1cHQgZmxhZ3Mgb24gUXVhZHJhOgorCQkJCSAqCisJCQkJICogQml0IDArMTogc29tZSBpbnRlcnJ1cHQgZmxhZ3MKKwkJCQkgKiBCaXQgMiszOiBzb21lIGludGVycnVwdCBlbmFibGUKKwkJCQkgKiBCaXQgNDogICA/PworCQkJCSAqIEJpdCA1OiAgIElERSBpbnRlcnJ1cHQgZmxhZyAoYW55IGh3aWYpCisJCQkJICogQml0IDY6ICAgbWF5YmUgSURFIGludGVycnVwdCBlbmFibGUgKGFueSBod2lmKSA/PworCQkJCSAqIEJpdCA3OiAgIEFueSBpbnRlcnJ1cHQgY29uZGl0aW9uCisJCQkJICovCisKK3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmlkZV9pZnIgPSAodW5zaWduZWQgY2hhciAqKSAoSURFX0JBU0UgKyBJREVfSUZSKTsKKworc3RhdGljIGludCBtYWNpZGVfb2Zmc2V0c1tJREVfTlJfUE9SVFNdID0geworICAgIElERV9EQVRBLCBJREVfRVJST1IsICBJREVfTlNFQ1RPUiwgSURFX1NFQ1RPUiwgSURFX0xDWUwsCisgICAgSURFX0hDWUwsIElERV9TRUxFQ1QsIElERV9TVEFUVVMsICBJREVfQ09OVFJPTAorfTsKKworaW50IG1hY2lkZV9hY2tfaW50cihpZGVfaHdpZl90KiBod2lmKQoreworCWlmICgqaWRlX2lmciAmIDB4MjApIHsKKwkJKmlkZV9pZnIgJj0gfjB4MjA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX01BQ19NRURJQUJBWQorc3RhdGljIHZvaWQgbWFjaWRlX21lZGlhYmF5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBzdGF0ZSA9IGJhYm9vbi0+bWJfc3RhdHVzICYgMHgwNDsKKworCXByaW50ayhLRVJOX0lORk8gIm1hY2lkZTogbWVkaWEgYmF5ICVzIGRldGVjdGVkXG4iLCBzdGF0ZT8gInJlbW92YWwiOiJpbnNlcnRpb24iKTsKK30KKyNlbmRpZgorCisvKgorICogUHJvYmUgZm9yIGEgTWFjaW50b3NoIElERSBpbnRlcmZhY2UKKyAqLworCit2b2lkIG1hY2lkZV9pbml0KHZvaWQpCit7CisJaHdfcmVnc190IGh3OworCWlkZV9od2lmX3QgKmh3aWY7CisJaW50IGluZGV4ID0gLTE7CisKKwlzd2l0Y2ggKG1hY2ludG9zaF9jb25maWctPmlkZV90eXBlKSB7CisJY2FzZSBNQUNfSURFX1FVQURSQToKKwkJaWRlX3NldHVwX3BvcnRzKCZodywgSURFX0JBU0UsIG1hY2lkZV9vZmZzZXRzLAorCQkJCTAsIDAsIG1hY2lkZV9hY2tfaW50ciwKKy8vCQkJCXF1YWRyYV9pZGVfaW9wcywKKwkJCQlJUlFfTlVCVVNfRik7CisJCWluZGV4ID0gaWRlX3JlZ2lzdGVyX2h3KCZodywgJmh3aWYpOworCQlicmVhazsKKwljYXNlIE1BQ19JREVfUEI6CisJCWlkZV9zZXR1cF9wb3J0cygmaHcsIElERV9CQVNFLCBtYWNpZGVfb2Zmc2V0cywKKwkJCQkwLCAwLCBtYWNpZGVfYWNrX2ludHIsCisvLwkJCQltYWNpZGVfcGJfaW9wcywKKwkJCQlJUlFfTlVCVVNfQyk7CisJCWluZGV4ID0gaWRlX3JlZ2lzdGVyX2h3KCZodywgJmh3aWYpOworCQlicmVhazsKKwljYXNlIE1BQ19JREVfQkFCT09OOgorCQlpZGVfc2V0dXBfcG9ydHMoJmh3LCBCQUJPT05fQkFTRSwgbWFjaWRlX29mZnNldHMsCisJCQkJMCwgMCwgTlVMTCwKKy8vCQkJCW1hY2lkZV9iYWJvb25faW9wcywKKwkJCQlJUlFfQkFCT09OXzEpOworCQlpbmRleCA9IGlkZV9yZWdpc3Rlcl9odygmaHcsICZod2lmKTsKKwkJaWYgKGluZGV4ID09IC0xKSBicmVhazsKKwkJaWYgKG1hY2ludG9zaF9jb25maWctPmlkZW50ID09IE1BQ19NT0RFTF9QQjE5MCkgeworCisJCQkvKiBGaXggYnJlYWthZ2UgaW4gaWRlLWRpc2suYzogZHJpdmUgY2FwYWNpdHkJKi8KKwkJCS8qIGlzIG5vdCBpbml0aWFsaXplZCBmb3IgZHJpdmVzIHdpdGhvdXQgYSAJKi8KKwkJCS8qIGhhcmR3YXJlIElELCBhbmQgd2UgY2FuJ3QgZ2V0IHRoYXQgd2l0aG91dAkqLworCQkJLyogcHJvYmluZyB0aGUgZHJpdmUgd2hpY2ggZnJlZXplcyBhIDE5MC4JKi8KKworCQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmlkZV9od2lmc1tpbmRleF0uZHJpdmVzWzBdOworCQkJZHJpdmUtPmNhcGFjaXR5NjQgPSBkcml2ZS0+Y3lsKmRyaXZlLT5oZWFkKmRyaXZlLT5zZWN0OworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfTUFDX01FRElBQkFZCisJCQlyZXF1ZXN0X2lycShJUlFfQkFCT09OXzIsIG1hY2lkZV9tZWRpYWJheV9pbnRlcnJ1cHQsCisJCQkJCUlSUV9GTEdfRkFTVCwgIm1lZGlhYmF5IiwKKwkJCQkJbWFjaWRlX21lZGlhYmF5X2ludGVycnVwdCk7CisjZW5kaWYKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHJldHVybjsKKwl9CisKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CisJCWh3aWYtPm1taW8gPSAyOworCQlpZiAobWFjaW50b3NoX2NvbmZpZy0+aWRlX3R5cGUgPT0gTUFDX0lERV9RVUFEUkEpCisJCQlwcmludGsoS0VSTl9JTkZPICJpZGUlZDogTWFjaW50b3NoIFF1YWRyYSBJREUgaW50ZXJmYWNlXG4iLCBpbmRleCk7CisJCWVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmlkZV90eXBlID09IE1BQ19JREVfUEIpCisJCQlwcmludGsoS0VSTl9JTkZPICJpZGUlZDogTWFjaW50b3NoIFBvd2VyYm9vayBJREUgaW50ZXJmYWNlXG4iLCBpbmRleCk7CisJCWVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmlkZV90eXBlID09IE1BQ19JREVfQkFCT09OKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlJWQ6IE1hY2ludG9zaCBQb3dlcmJvb2sgQmFib29uIElERSBpbnRlcmZhY2VcbiIsIGluZGV4KTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlJWQ6IFVua25vd24gTWFjaW50b3NoIElERSBpbnRlcmZhY2VcbiIsIGluZGV4KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3OGI3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMgLS0gUTQwIEkvTyBwb3J0IElERSBEcml2ZXIKKyAqCisgKiAgICAgKGMpIFJpY2hhcmQgWmlkbGlja3kKKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKworICAgIC8qCisgICAgICogIEJhc2VzIG9mIHRoZSBJREUgaW50ZXJmYWNlcworICAgICAqLworCisjZGVmaW5lIFE0MElERV9OVU1fSFdJRlMJMgorCisjZGVmaW5lIFBDSURFX0JBU0UxCTB4MWYwCisjZGVmaW5lIFBDSURFX0JBU0UyCTB4MTcwCisjZGVmaW5lIFBDSURFX0JBU0UzCTB4MWU4CisjZGVmaW5lIFBDSURFX0JBU0U0CTB4MTY4CisjZGVmaW5lIFBDSURFX0JBU0U1CTB4MWUwCisjZGVmaW5lIFBDSURFX0JBU0U2CTB4MTYwCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBjaWRlX2Jhc2VzW1E0MElERV9OVU1fSFdJRlNdID0geworICAgIFBDSURFX0JBU0UxLCBQQ0lERV9CQVNFMiwgLyogUENJREVfQkFTRTMsIFBDSURFX0JBU0U0ICAsIFBDSURFX0JBU0U1LAorICAgIFBDSURFX0JBU0U2ICovCit9OworCisKKyAgICAvKgorICAgICAqICBPZmZzZXRzIGZyb20gb25lIG9mIHRoZSBhYm92ZSBiYXNlcworICAgICAqLworCisvKiB1c2VkIHRvIGRvIGFkZHIgdHJhbnNsYXRpb24gaGVyZSBidXQgaXQgaXMgZWFzaWVyIHRvIGRvIGluIHNldHVwIHBvcnRzICovCisvKiNkZWZpbmUgSURFX09GRl9CKHgpCSgodW5zaWduZWQgbG9uZylRNDBfSVNBX0lPX0IoKElERV8jI3gjI19PRkZTRVQpKSkqLworCisjZGVmaW5lIElERV9PRkZfQih4KQkoKHVuc2lnbmVkIGxvbmcpKChJREVfIyN4IyNfT0ZGU0VUKSkpCisjZGVmaW5lIElERV9PRkZfVyh4KQkoKHVuc2lnbmVkIGxvbmcpKChJREVfIyN4IyNfT0ZGU0VUKSkpCisKK3N0YXRpYyBjb25zdCBpbnQgcGNpZGVfb2Zmc2V0c1tJREVfTlJfUE9SVFNdID0geworICAgIElERV9PRkZfVyhEQVRBKSwgSURFX09GRl9CKEVSUk9SKSwgSURFX09GRl9CKE5TRUNUT1IpLCBJREVfT0ZGX0IoU0VDVE9SKSwKKyAgICBJREVfT0ZGX0IoTENZTCksIElERV9PRkZfQihIQ1lMKSwgNiAvKklERV9PRkZfQihDVVJSRU5UKSovLCBJREVfT0ZGX0IoU1RBVFVTKSwKKyAgICA1MTgvKklERV9PRkYoQ01EKSovCit9OworCitzdGF0aWMgaW50IHE0MGlkZV9kZWZhdWx0X2lycSh1bnNpZ25lZCBsb25nIGJhc2UpCit7CisgICAgICAgICAgIHN3aXRjaCAoYmFzZSkgeworCSAgICAgICAgICAgIGNhc2UgMHgxZjA6IHJldHVybiAxNDsKKwkJICAgIGNhc2UgMHgxNzA6IHJldHVybiAxNTsKKwkJICAgIGNhc2UgMHgxZTg6IHJldHVybiAxMTsKKwkJICAgIGRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkgICB9Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGlkZV9zZXR1cF9wb3J0cyBleGNlcHQgdGhhdCBhZGRyZXNzZXMKKyAqIGFyZSBwcmV0cmFuc2xhdGVkIGZvciBxNDAgSVNBIGFjY2VzcworICovCit2b2lkIHE0MF9pZGVfc2V0dXBfcG9ydHMgKCBod19yZWdzX3QgKmh3LAorCQkJdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgKm9mZnNldHMsCisJCQl1bnNpZ25lZCBsb25nIGN0cmwsIHVuc2lnbmVkIGxvbmcgaW50ciwKKwkJCWlkZV9hY2tfaW50cl90ICphY2tfaW50ciwKKy8qCisgKgkJCWlkZV9pb19vcHNfdCAqaW9wcywKKyAqLworCQkJaW50IGlycSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJREVfTlJfUE9SVFM7IGkrKykgeworCQkvKiBCSUcgRkFUIFdBUk5JTkc6IAorCQkgICBhc3N1bXB0aW9uOiBvbmx5IERBVEEgcG9ydCBpcyBldmVyIHVzZWQgaW4gMTYgYml0IG1vZGUgKi8KKwkJaWYgKCBpPT0wICkKKwkJCWh3LT5pb19wb3J0c1tpXSA9IFE0MF9JU0FfSU9fVyhiYXNlICsgb2Zmc2V0c1tpXSk7CisJCWVsc2UKKwkJCWh3LT5pb19wb3J0c1tpXSA9IFE0MF9JU0FfSU9fQihiYXNlICsgb2Zmc2V0c1tpXSk7CisJfQorCQorCWh3LT5pcnEgPSBpcnE7CisJaHctPmRtYSA9IE5PX0RNQTsKKwlody0+YWNrX2ludHIgPSBhY2tfaW50cjsKKy8qCisgKglody0+aW9wcyA9IGlvcHM7CisgKi8KK30KKworCisKKy8qIAorICogdGhlIHN0YXRpYyBhcnJheSBpcyBuZWVkZWQgdG8gaGF2ZSB0aGUgbmFtZSByZXBvcnRlZCBpbiAvcHJvYy9pb3BvcnRzLAorICogaHdpZi0+bmFtZSB1bmZvcnR1bmF0ZWx5IGlzbrR0IGF2YWlsYWJsZSB5ZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnE0MF9pZGVfbmFtZXNbUTQwSURFX05VTV9IV0lGU109eworCSJpZGUwIiwgImlkZTEiCit9OworCisvKgorICogIFByb2JlIGZvciBRNDAgSURFIGludGVyZmFjZXMKKyAqLworCit2b2lkIHE0MGlkZV9pbml0KHZvaWQpCit7CisgICAgaW50IGk7CisgICAgaWRlX2h3aWZfdCAqaHdpZjsKKyAgICBpbnQgaW5kZXg7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIGlmICghTUFDSF9JU19RNDApCisgICAgICByZXR1cm4gOworCisgICAgZm9yIChpID0gMDsgaSA8IFE0MElERV9OVU1fSFdJRlM7IGkrKykgeworCWh3X3JlZ3NfdCBodzsKKworCW5hbWUgPSBxNDBfaWRlX25hbWVzW2ldOworCWlmICghcmVxdWVzdF9yZWdpb24ocGNpZGVfYmFzZXNbaV0sIDgsIG5hbWUpKSB7CisJCXByaW50aygiY291bGQgbm90IHJlc2VydmUgcG9ydHMgJWx4LSVseCBmb3IgJXNcbiIsCisJCSAgICAgICBwY2lkZV9iYXNlc1tpXSxwY2lkZV9iYXNlc1tpXSs4LG5hbWUpOworCQljb250aW51ZTsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lkZV9iYXNlc1tpXSsweDIwNiwgMSwgbmFtZSkpIHsKKwkJcHJpbnRrKCJjb3VsZCBub3QgcmVzZXJ2ZSBwb3J0ICVseCBmb3IgJXNcbiIsCisJCSAgICAgICBwY2lkZV9iYXNlc1tpXSsweDIwNixuYW1lKTsKKwkJcmVsZWFzZV9yZWdpb24ocGNpZGVfYmFzZXNbaV0sIDgpOworCQljb250aW51ZTsKKwl9CisJcTQwX2lkZV9zZXR1cF9wb3J0cygmaHcsKHVuc2lnbmVkIGxvbmcpIHBjaWRlX2Jhc2VzW2ldLCAoaW50ICopcGNpZGVfb2Zmc2V0cywgCisJCQlwY2lkZV9iYXNlc1tpXSsweDIwNiwgCisJCQkwLCBOVUxMLAorLy8JCQltNjhraWRlX2lvcHMsCisJCQlxNDBpZGVfZGVmYXVsdF9pcnEocGNpZGVfYmFzZXNbaV0pKTsKKwlpbmRleCA9IGlkZV9yZWdpc3Rlcl9odygmaHcsICZod2lmKTsKKwkvLyAqKkZJWE1FKioKKwlpZiAoaW5kZXggIT0gLTEpCisJCWh3aWYtPm1taW8gPSAyOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2ZhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvcWQ2NXh4LmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5jCQlWZXJzaW9uIDAuMDcJU2VwIDMwLCAyMDAxCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvciAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiAgVmVyc2lvbiAwLjAzCUNsZWFuZWQgYXV0by10dW5lLCBhZGRlZCBwcm9iZQorICogIFZlcnNpb24gMC4wNAlBZGRlZCBzZWNvbmQgY2hhbm5lbCB0dW5pbmcKKyAqICBWZXJzaW9uIDAuMDUJRW5oYW5jZWQgdHVuaW5nIDsgYWRkZWQgcWQ2NTAwIHN1cHBvcnQKKyAqICBWZXJzaW9uIDAuMDYJQWRkZWQgZG9zIGRyaXZlcidzIGxpc3QKKyAqICBWZXJzaW9uIDAuMDcJU2Vjb25kIGNoYW5uZWwgYnVnIGZpeCAKKyAqCisgKiBRREkgUUQ2NTAwL1FENjU4MCBFSURFIGNvbnRyb2xsZXIgZmFzdCBzdXBwb3J0CisgKgorICogUGxlYXNlIHNldCBsb2NhbCBidXMgc3BlZWQgdXNpbmcga2VybmVsIHBhcmFtZXRlciBpZGVidXMKKyAqIAlmb3IgZXhhbXBsZSwgImlkZWJ1cz0zMyIgc3RhbmRzIGZvciAzM01oeiBWTGJ1cworICogVG8gYWN0aXZhdGUgY29udHJvbGxlciBzdXBwb3J0LCB1c2UgImlkZTA9cWQ2NXh4IgorICogVG8gZW5hYmxlIHR1bmluZywgdXNlICJpZGUwPWF1dG90dW5lIgorICogVG8gZW5hYmxlIHNlY29uZCBjaGFubmVsIHR1bmluZyAocWQ2NTgwIG9ubHkpLCB1c2UgImlkZTE9YXV0b3R1bmUiCisgKi8KKworLyoKKyAqIFJld3JpdHRlbiBmcm9tIHRoZSB3b3JrIG9mIENvbHRlbiBFZHdhcmRzIDxwamUxMjBAY3MudXNhc2suY2E+IGJ5CisgKiBTYW11ZWwgVGhpYmF1bHQgPHNhbXVlbC50aGliYXVsdEBmbmFjLm5ldD4KKyAqLworCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JCS8qIG1vc3Qgc3lzdGVtcyBjYW4gc2FmZWx5IHVuZGVmIHRoaXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicWQ2NXh4LmgiCisKKy8qCisgKiBJL08gcG9ydHMgYXJlIDB4MzAtMHgzMSAoYW5kIDB4MzItMHgzMyBmb3IgcWQ2NTgwKQorICogICAgICAgICAgICBvciAweGIwLTB4YjEgKGFuZCAweGIyLTB4YjMgZm9yIHFkNjU4MCkKKyAqCS0tIHFkNjUwMCBpcyBhIHNpbmdsZSBJREUgaW50ZXJmYWNlCisgKgktLSBxZDY1ODAgaXMgYSBkdWFsIElERSBpbnRlcmZhY2UKKyAqCisgKiBNb3JlIHJlc2VhcmNoIG9uIHFkNjU4MCBiZWluZyBkb25lIGJ5IHdpbGxtb3JlQGNpZy5tb3QuY29tIChEYXZpZCkKKyAqIE1vcmUgSW5mb3JtYXRpb24gZ2l2ZW4gYnkgUGV0ciBTb3VjZWsgKHBldHJAcnlzdG9uLmN6KQorICogaHR0cDovL3d3dy5yeXN0b24uY3ovcGV0ci92bGIKKyAqLworCisvKgorICogYmFzZTogVGltZXIxCisgKgorICoKKyAqIGJhc2UrMHgwMTogQ29uZmlnIChSL08pCisgKgorICogYml0IDA6IGlkZSBiYXNlcG9ydDogMSA9IDB4MWYwIDsgMCA9IDB4MTcwIChvbmx5IHVzZWZ1bCBmb3IgcWQ2NTAwKQorICogYml0IDE6IHFkNjV4eCBiYXNlcG9ydDogMSA9IDB4YjAgOyAwID0gMHgzMAorICogYml0IDI6IElEMzogYnVzIHNwZWVkOiAxID0gPD0zM01IeiA7IDAgPSA+MzNNSHoKKyAqIGJpdCAzOiBxZDY1MDA6IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQKKyAqICAgICAgICBxZDY1ODA6IDEKKyAqIHVwcGVyIG5pYmJsZToKKyAqICAgICAgICBxZDY1MDA6IDExMDAKKyAqICAgICAgICBxZDY1ODA6IGVpdGhlciAxMDEwIG9yIDAxMDEKKyAqCisgKgorICogYmFzZSsweDAyOiBUaW1lcjIgKHFkNjU4MCBvbmx5KQorICoKKyAqCisgKiBiYXNlKzB4MDM6IENvbnRyb2wgKHFkNjU4MCBvbmx5KQorICoKKyAqIGJpdHMgMC0zIG11c3QgYWx3YXlzIGJlIHNldCAxCisgKiBiaXQgNCBtdXN0IGJlIHNldCAxLCBidXQgaXMgc2V0IDAgYnkgZG9zIGRyaXZlciB3aGlsZSBtZWFzdXJpbmcgdmxiIGNsb2NrCisgKiBiaXQgMCA6IDEgPSBPbmx5IHByaW1hcnkgcG9ydCBlbmFibGVkIDogY2hhbm5lbCAwIGZvciBoZGEsIGNoYW5uZWwgMSBmb3IgaGRiCisgKiAgICAgICAgIDAgPSBQcmltYXJ5IGFuZCBTZWNvbmRhcnkgcG9ydHMgZW5hYmxlZCA6IGNoYW5uZWwgMCBmb3IgaGRhICYgaGRiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgMSBmb3IgaGRjICYgaGRkCisgKiBiaXQgMSA6IDEgPSBvbmx5IGRpc2tzIG9uIHByaW1hcnkgcG9ydAorICogICAgICAgICAwID0gZGlza3MgJiBBVEFQSSBkZXZpY2VzIG9uIHByaW1hcnkgcG9ydAorICogYml0IDItNCA6IGFsd2F5cyAwCisgKiBiaXQgNSA6IHN0YXR1cywgYnV0IG9mIHdoYXQgPworICogYml0IDYgOiBhbHdheXMgc2V0IDEgYnkgZG9zIGRyaXZlcgorICogYml0IDcgOiBzZXQgMSBmb3Igbm9uLUFUQVBJIGRldmljZXMgb24gcHJpbWFyeSBwb3J0CisgKgkobWF5YmUgcmVhZC1haGVhZCBhbmQgcG9zdC13cml0ZSBidWZmZXIgPykKKyAqLworCitzdGF0aWMgaW50IHRpbWluZ3NbNF09ey0xLC0xLC0xLC0xfTsgLyogc3RvcmVzIGN1cnJlbnQgdGltaW5nIGZvciBlYWNoIHRpbWVyICovCisKK3N0YXRpYyB2b2lkIHFkX3dyaXRlX3JlZyAodTggY29udGVudCwgdW5zaWduZWQgbG9uZyByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCW91dGIoY29udGVudCxyZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1OCBfX2luaXQgcWRfcmVhZF9yZWcgKHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggcmVhZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJlYWQgPSBpbmIocmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJldHVybiByZWFkOworfQorCisvKgorICogcWRfc2VsZWN0OgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIGZyb20gaWRlLmMgdG8gcHJlcGFyZSBmb3IgYWNjZXNzIHRvIGEgZ2l2ZW4gZHJpdmUuCisgKi8KKworc3RhdGljIHZvaWQgcWRfc2VsZWN0IChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggaW5kZXggPSAoKAkoUURfVElNUkVHKGRyaXZlKSkgJiAweDgwICkgPj4gNykgfAorCQkJKFFEX1RJTVJFRyhkcml2ZSkgJiAweDAyKTsKKworCWlmICh0aW1pbmdzW2luZGV4XSAhPSBRRF9USU1JTkcoZHJpdmUpKQorCQlxZF93cml0ZV9yZWcodGltaW5nc1tpbmRleF0gPSBRRF9USU1JTkcoZHJpdmUpLCBRRF9USU1SRUcoZHJpdmUpKTsKK30KKworLyoKKyAqIHFkNjUwMF9jb21wdXRlX3RpbWluZworICoKKyAqIGNvbXB1dGVzIHRoZSB0aW1pbmcgdmFsdWUgd2hlcmUKKyAqCWxvd2VyIG5pYmJsZSByZXByZXNlbnRzIGFjdGl2ZSB0aW1lLCAgIGluIGNvdW50IG9mIFZMQiBjbG9ja3MKKyAqCXVwcGVyIG5pYmJsZSByZXByZXNlbnRzIHJlY292ZXJ5IHRpbWUsIGluIGNvdW50IG9mIFZMQiBjbG9ja3MKKyAqLworCitzdGF0aWMgdTggcWQ2NTAwX2NvbXB1dGVfdGltaW5nIChpZGVfaHdpZl90ICpod2lmLCBpbnQgYWN0aXZlX3RpbWUsIGludCByZWNvdmVyeV90aW1lKQoreworCXU4IGFjdGl2ZV9jeWNsZSxyZWNvdmVyeV9jeWNsZTsKKworCWlmIChzeXN0ZW1fYnVzX2Nsb2NrKCk8PTMzKSB7CisJCWFjdGl2ZV9jeWNsZSA9ICAgOSAgLSBJREVfSU4oYWN0aXZlX3RpbWUgICAqIHN5c3RlbV9idXNfY2xvY2soKSAvIDEwMDAgKyAxLCAyLCA5KTsKKwkJcmVjb3ZlcnlfY3ljbGUgPSAxNSAtIElERV9JTihyZWNvdmVyeV90aW1lICogc3lzdGVtX2J1c19jbG9jaygpIC8gMTAwMCArIDEsIDAsIDE1KTsKKwl9IGVsc2UgeworCQlhY3RpdmVfY3ljbGUgPSAgIDggIC0gSURFX0lOKGFjdGl2ZV90aW1lICAgKiBzeXN0ZW1fYnVzX2Nsb2NrKCkgLyAxMDAwICsgMSwgMSwgOCk7CisJCXJlY292ZXJ5X2N5Y2xlID0gMTggLSBJREVfSU4ocmVjb3ZlcnlfdGltZSAqIHN5c3RlbV9idXNfY2xvY2soKSAvIDEwMDAgKyAxLCAzLCAxOCk7CisJfQorCisJcmV0dXJuKChyZWNvdmVyeV9jeWNsZTw8NCkgfCAweDA4IHwgYWN0aXZlX2N5Y2xlKTsKK30KKworLyoKKyAqIHFkNjU4MF9jb21wdXRlX3RpbWluZworICoKKyAqIGlkZW0gZm9yIHFkNjU4MAorICovCisKK3N0YXRpYyB1OCBxZDY1ODBfY29tcHV0ZV90aW1pbmcgKGludCBhY3RpdmVfdGltZSwgaW50IHJlY292ZXJ5X3RpbWUpCit7CisJdTggYWN0aXZlX2N5Y2xlICAgPSAxNyAtIElERV9JTihhY3RpdmVfdGltZSAgICogc3lzdGVtX2J1c19jbG9jaygpIC8gMTAwMCArIDEsIDIsIDE3KTsKKwl1OCByZWNvdmVyeV9jeWNsZSA9IDE1IC0gSURFX0lOKHJlY292ZXJ5X3RpbWUgKiBzeXN0ZW1fYnVzX2Nsb2NrKCkgLyAxMDAwICsgMSwgMiwgMTUpOworCisJcmV0dXJuKChyZWNvdmVyeV9jeWNsZTw8NCkgfCBhY3RpdmVfY3ljbGUpOworfQorCisvKgorICogcWRfZmluZF9kaXNrX3R5cGUKKyAqCisgKiB0cmllcyB0byBmaW5kIHRpbWluZyBmcm9tIGRvcyBkcml2ZXIncyB0YWJsZQorICovCisKK3N0YXRpYyBpbnQgcWRfZmluZF9kaXNrX3R5cGUgKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJaW50ICphY3RpdmVfdGltZSwgaW50ICpyZWNvdmVyeV90aW1lKQoreworCXN0cnVjdCBxZDY1eHhfdGltaW5nX3MgKnA7CisJY2hhciBtb2RlbFs0MF07CisKKwlpZiAoISpkcml2ZS0+aWQtPm1vZGVsKSByZXR1cm4gMDsKKworCXN0cm5jcHkobW9kZWwsZHJpdmUtPmlkLT5tb2RlbCw0MCk7CisJaWRlX2ZpeHN0cmluZyhtb2RlbCw0MCwxKTsgLyogYnl0ZS1zd2FwICovCisKKwlmb3IgKHAgPSBxZDY1eHhfdGltaW5nIDsgcC0+b2Zmc2V0ICE9IC0xIDsgcCsrKSB7CisJCWlmICghc3RybmNtcChwLT5tb2RlbCwgbW9kZWwrcC0+b2Zmc2V0LCA0KSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsaXN0ZWQgIVxuIiwgZHJpdmUtPm5hbWUpOworCQkJKmFjdGl2ZV90aW1lID0gcC0+YWN0aXZlOworCQkJKnJlY292ZXJ5X3RpbWUgPSBwLT5yZWNvdmVyeTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogcWRfdGltaW5nX29rOgorICoKKyAqIGNoZWNrIHdoZXRoZXIgdGltaW5ncyBkb24ndCBjb25mbGljdAorICovCisKK3N0YXRpYyBpbnQgcWRfdGltaW5nX29rIChpZGVfZHJpdmVfdCBkcml2ZXNbXSkKK3sKKwlyZXR1cm4gKElERV9JTVBMWShkcml2ZXNbMF0ucHJlc2VudCAmJiBkcml2ZXNbMV0ucHJlc2VudCwKKwkJCUlERV9JTVBMWShRRF9USU1SRUcoZHJpdmVzKSA9PSBRRF9USU1SRUcoZHJpdmVzKzEpLAorCQkJICAgICAgICAgIFFEX1RJTUlORyhkcml2ZXMpID09IFFEX1RJTUlORyhkcml2ZXMrMSkpKSk7CisJLyogaWYgc2FtZSB0aW1pbmcgcmVnaXN0ZXIsIG11c3QgYmUgc2FtZSB0aW1pbmcgKi8KK30KKworLyoKKyAqIHFkX3NldF90aW1pbmc6CisgKgorICogcmVjb3JkcyB0aGUgdGltaW5nLCBhbmQgZW5hYmxlcyBzZWxlY3Rwcm9jIGFzIG5lZWRlZAorICovCisKK3N0YXRpYyB2b2lkIHFkX3NldF90aW1pbmcgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggdGltaW5nKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKworCWRyaXZlLT5kcml2ZV9kYXRhICY9IDB4ZmYwMDsKKwlkcml2ZS0+ZHJpdmVfZGF0YSB8PSB0aW1pbmc7CisJaWYgKHFkX3RpbWluZ19vayhod2lmLT5kcml2ZXMpKSB7CisJCXFkX3NlbGVjdChkcml2ZSk7IC8qIHNlbGVjdHMgb25jZSAqLworCQlod2lmLT5zZWxlY3Rwcm9jID0gTlVMTDsKKwl9IGVsc2UKKwkJaHdpZi0+c2VsZWN0cHJvYyA9ICZxZF9zZWxlY3Q7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICUjeFxuIiwgZHJpdmUtPm5hbWUsIHRpbWluZyk7Cit9CisKKy8qCisgKiBxZDY1MDBfdHVuZV9kcml2ZQorICovCisKK3N0YXRpYyB2b2lkIHFkNjUwMF90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpbnQgYWN0aXZlX3RpbWUgICA9IDE3NTsKKwlpbnQgcmVjb3ZlcnlfdGltZSA9IDQxNTsgLyogd29yc3QgY2FzZSB2YWx1ZXMgZnJvbSB0aGUgZG9zIGRyaXZlciAqLworCisJaWYgKGRyaXZlLT5pZCAmJiAhcWRfZmluZF9kaXNrX3R5cGUoZHJpdmUsICZhY3RpdmVfdGltZSwgJnJlY292ZXJ5X3RpbWUpCisJCSYmIGRyaXZlLT5pZC0+dFBJTyAmJiAoZHJpdmUtPmlkLT5maWVsZF92YWxpZCAmIDB4MDIpCisJCSYmIGRyaXZlLT5pZC0+ZWlkZV9waW8gPj0gMjQwKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBJTyBtb2RlJWRcbiIsIGRyaXZlLT5uYW1lLAorCQkJCWRyaXZlLT5pZC0+dFBJTyk7CisJCWFjdGl2ZV90aW1lID0gMTEwOworCQlyZWNvdmVyeV90aW1lID0gZHJpdmUtPmlkLT5laWRlX3BpbyAtIDEyMDsKKwl9CisKKwlxZF9zZXRfdGltaW5nKGRyaXZlLCBxZDY1MDBfY29tcHV0ZV90aW1pbmcoSFdJRihkcml2ZSksIGFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7Cit9CisKKy8qCisgKiBxZDY1ODBfdHVuZV9kcml2ZQorICovCisKK3N0YXRpYyB2b2lkIHFkNjU4MF90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfcGlvX2RhdGFfdCBkOworCWludCBiYXNlID0gSFdJRihkcml2ZSktPnNlbGVjdF9kYXRhOworCWludCBhY3RpdmVfdGltZSAgID0gMTc1OworCWludCByZWNvdmVyeV90aW1lID0gNDE1OyAvKiB3b3JzdCBjYXNlIHZhbHVlcyBmcm9tIHRoZSBkb3MgZHJpdmVyICovCisKKwlpZiAoZHJpdmUtPmlkICYmICFxZF9maW5kX2Rpc2tfdHlwZShkcml2ZSwgJmFjdGl2ZV90aW1lLCAmcmVjb3ZlcnlfdGltZSkpIHsKKwkJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDI1NSwgJmQpOworCQlwaW8gPSBtaW5fdCh1OCwgcGlvLCA0KTsKKworCQlzd2l0Y2ggKHBpbykgeworCQkJY2FzZSAwOiBicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlpZiAoZC5jeWNsZV90aW1lID49IDExMCkgeworCQkJCQlhY3RpdmVfdGltZSA9IDg2OworCQkJCQlyZWNvdmVyeV90aW1lID0gZC5jeWNsZV90aW1lIC0gMTAyOworCQkJCX0gZWxzZQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU3RyYW5nZSByZWNvdmVyeSB0aW1lICFcbiIsZHJpdmUtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWlmIChkLmN5Y2xlX3RpbWUgPj0gNjkpIHsKKwkJCQkJYWN0aXZlX3RpbWUgPSA3MDsKKwkJCQkJcmVjb3ZlcnlfdGltZSA9IGQuY3ljbGVfdGltZSAtIDYxOworCQkJCX0gZWxzZQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU3RyYW5nZSByZWNvdmVyeSB0aW1lICFcbiIsZHJpdmUtPm5hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoZC5jeWNsZV90aW1lID49IDE4MCkgeworCQkJCQlhY3RpdmVfdGltZSA9IDExMDsKKwkJCQkJcmVjb3ZlcnlfdGltZSA9IGQuY3ljbGVfdGltZSAtIDEyMDsKKwkJCQl9IGVsc2UgeworCQkJCQlhY3RpdmVfdGltZSA9IGlkZV9waW9fdGltaW5nc1twaW9dLmFjdGl2ZV90aW1lOworCQkJCQlyZWNvdmVyeV90aW1lID0gZC5jeWNsZV90aW1lCisJCQkJCQkJLWFjdGl2ZV90aW1lOworCQkJCX0KKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUElPIG1vZGUlZFxuIiwgZHJpdmUtPm5hbWUscGlvKTsKKwl9CisKKwlpZiAoIUhXSUYoZHJpdmUpLT5jaGFubmVsICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCQlxZF93cml0ZV9yZWcoMHg1ZiwgUURfQ09OVFJPTF9QT1JUKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFUQVBJOiBkaXNhYmxlZCByZWFkLWFoZWFkIEZJRk8gIgorCQkJImFuZCBwb3N0LXdyaXRlIGJ1ZmZlciBvbiAlcy5cbiIsCisJCQlkcml2ZS0+bmFtZSwgSFdJRihkcml2ZSktPm5hbWUpOworCX0KKworCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjU4MF9jb21wdXRlX3RpbWluZyhhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOworfQorCisvKgorICogcWRfdGVzdHJlZworICoKKyAqIHRlc3RzIGlmIHRoZSBnaXZlbiBwb3J0IGlzIGEgcmVnaXN0ZXIKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBxZF90ZXN0cmVnKGludCBwb3J0KQoreworCXU4IHNhdmVyZWc7CisJdTggcmVhZHJlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJc2F2ZXJlZyA9IGluYl9wKHBvcnQpOworCW91dGJfcChRRF9URVNUVkFMLCBwb3J0KTsJLyogc2FmZSB2YWx1ZSAqLworCXJlYWRyZWcgPSBpbmJfcChwb3J0KTsKKwlvdXRiKHNhdmVyZWcsIHBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2F2ZXJlZyA9PSBRRF9URVNUVkFMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT3V0Y2ggISB0aGUgcHJvYmUgZm9yIHFkNjV4eCBpc24ndCByZWxpYWJsZSAhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQbGVhc2UgY29udGFjdCBtYWludGFpbmVycyB0byB0ZWxsIGFib3V0IHlvdXIgaGFyZHdhcmVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkFzc3VtaW5nIHFkNjV4eCBpcyBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gKHJlYWRyZWcgIT0gUURfVEVTVFZBTCk7Cit9CisKKy8qCisgKiBxZF9zZXR1cDoKKyAqCisgKiBjYWxsZWQgdG8gc2V0dXAgYW4gYXRhIGNoYW5uZWwgOiBhZGp1c3RzIGF0dHJpYnV0ZXMgJiBsaW5rcyBmb3IgdHVuaW5nCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHFkX3NldHVwKGlkZV9od2lmX3QgKmh3aWYsIGludCBiYXNlLCBpbnQgY29uZmlnLAorCQkJICAgIHVuc2lnbmVkIGludCBkYXRhMCwgdW5zaWduZWQgaW50IGRhdGExLAorCQkJICAgIHZvaWQgKCp0dW5lcHJvYykgKGlkZV9kcml2ZV90ICosIHU4IHBpbykpCit7CisJaHdpZi0+Y2hpcHNldCA9IGlkZV9xZDY1eHg7CisJaHdpZi0+Y2hhbm5lbCA9IGh3aWYtPmluZGV4OworCWh3aWYtPnNlbGVjdF9kYXRhID0gYmFzZTsKKwlod2lmLT5jb25maWdfZGF0YSA9IGNvbmZpZzsKKwlod2lmLT5kcml2ZXNbMF0uZHJpdmVfZGF0YSA9IGRhdGEwOworCWh3aWYtPmRyaXZlc1sxXS5kcml2ZV9kYXRhID0gZGF0YTE7CisJaHdpZi0+ZHJpdmVzWzBdLmlvXzMyYml0ID0KKwlod2lmLT5kcml2ZXNbMV0uaW9fMzJiaXQgPSAxOworCWh3aWYtPnR1bmVwcm9jID0gdHVuZXByb2M7CisJcHJvYmVfaHdpZl9pbml0KGh3aWYpOworfQorCisvKgorICogcWRfdW5zZXR1cDoKKyAqCisgKiBjYWxsZWQgdG8gdW5zZXR1cCBhbiBhdGEgY2hhbm5lbCA6IGJhY2sgdG8gZGVmYXVsdCB2YWx1ZXMsIHVubGlua3MgdHVuaW5nCisgKi8KKy8qCitzdGF0aWMgdm9pZCBfX2V4aXQgcWRfdW5zZXR1cChpZGVfaHdpZl90ICpod2lmKQoreworCXU4IGNvbmZpZyA9IGh3aWYtPmNvbmZpZ19kYXRhOworCWludCBiYXNlID0gaHdpZi0+c2VsZWN0X2RhdGE7CisJdm9pZCAqdHVuZXByb2MgPSAodm9pZCAqKSBod2lmLT50dW5lcHJvYzsKKworCWlmIChod2lmLT5jaGlwc2V0ICE9IGlkZV9xZDY1eHgpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGJhY2sgdG8gZGVmYXVsdHNcbiIsIGh3aWYtPm5hbWUpOworCisJaHdpZi0+c2VsZWN0cHJvYyA9IE5VTEw7CisJaHdpZi0+dHVuZXByb2MgPSBOVUxMOworCisJaWYgKHR1bmVwcm9jID09ICh2b2lkICopIHFkNjUwMF90dW5lX2RyaXZlKSB7CisJCS8vIHdpbGwgZG8gaXQgZm9yIGJvdGgKKwkJcWRfd3JpdGVfcmVnKFFENjUwMF9ERUZfREFUQSwgUURfVElNUkVHKCZod2lmLT5kcml2ZXNbMF0pKTsKKwl9IGVsc2UgaWYgKHR1bmVwcm9jID09ICh2b2lkICopIHFkNjU4MF90dW5lX2RyaXZlKSB7CisJCWlmIChRRF9DT05UUk9MKGh3aWYpICYgUURfQ09OVFJfU0VDX0RJU0FCTEVEKSB7CisJCQlxZF93cml0ZV9yZWcoUUQ2NTgwX0RFRl9EQVRBLCBRRF9USU1SRUcoJmh3aWYtPmRyaXZlc1swXSkpOworCQkJcWRfd3JpdGVfcmVnKFFENjU4MF9ERUZfREFUQTIsIFFEX1RJTVJFRygmaHdpZi0+ZHJpdmVzWzFdKSk7CisJCX0gZWxzZSB7CisJCQlxZF93cml0ZV9yZWcoaHdpZi0+Y2hhbm5lbCA/IFFENjU4MF9ERUZfREFUQTIgOiBRRDY1ODBfREVGX0RBVEEsIFFEX1RJTVJFRygmaHdpZi0+ZHJpdmVzWzBdKSk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIHFkNjV4eCB0dW5pbmcgZm9uY3Rpb24gIVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImtlZXBpbmcgc2V0dGluZ3MgIVxuIik7CisJfQorfQorKi8KKworLyoKKyAqIHFkX3Byb2JlOgorICoKKyAqIGxvb2tzIGF0IHRoZSBzcGVjaWZpZWQgYmFzZXBvcnQsIGFuZCBpZiBxZCBmb3VuZCwgcmVnaXN0ZXJzICYgaW5pdGlhbGlzZXMgaXQKKyAqIHJldHVybiAxIGlmIGFub3RoZXIgcWQgbWF5IGJlIHByb2JlZAorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHFkX3Byb2JlKGludCBiYXNlKQoreworCWlkZV9od2lmX3QgKmh3aWY7CisJdTggY29uZmlnOworCXU4IHVuaXQ7CisKKwljb25maWcgPSBxZF9yZWFkX3JlZyhRRF9DT05GSUdfUE9SVCk7CisKKwlpZiAoISAoKGNvbmZpZyAmIFFEX0NPTkZJR19CQVNFUE9SVCkgPj4gMSA9PSAoYmFzZSA9PSAweGIwKSkgKQorCQlyZXR1cm4gMTsKKworCXVuaXQgPSAhIChjb25maWcgJiBRRF9DT05GSUdfSURFX0JBU0VQT1JUKTsKKworCWlmICgoY29uZmlnICYgMHhmMCkgPT0gUURfQ09ORklHX1FENjUwMCkgeworCisJCWlmIChxZF90ZXN0cmVnKGJhc2UpKSByZXR1cm4gMTsJCS8qIGJhZCByZWdpc3RlciAqLworCisJCS8qIHFkNjUwMCBmb3VuZCAqLworCisJCWh3aWYgPSAmaWRlX2h3aWZzW3VuaXRdOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBxZDY1MDAgYXQgJSN4XG4iLCBod2lmLT5uYW1lLCBiYXNlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInFkNjUwMDogY29uZmlnPSUjeCwgSUQzPSV1XG4iLAorCQkJY29uZmlnLCBRRF9JRDMpOworCQkKKwkJaWYgKGNvbmZpZyAmIFFEX0NPTkZJR19ESVNBQkxFRCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicWQ2NTAwIGlzIGRpc2FibGVkICFcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlxZF9zZXR1cChod2lmLCBiYXNlLCBjb25maWcsIFFENjUwMF9ERUZfREFUQSwgUUQ2NTAwX0RFRl9EQVRBLAorCQkJICZxZDY1MDBfdHVuZV9kcml2ZSk7CisKKwkJY3JlYXRlX3Byb2NfaWRlX2ludGVyZmFjZXMoKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKChjb25maWcgJiAweGYwKSA9PSBRRF9DT05GSUdfUUQ2NTgwX0EpIHx8CisJICAgICgoY29uZmlnICYgMHhmMCkgPT0gUURfQ09ORklHX1FENjU4MF9CKSkgeworCisJCXU4IGNvbnRyb2w7CisKKwkJaWYgKHFkX3Rlc3RyZWcoYmFzZSkgfHwgcWRfdGVzdHJlZyhiYXNlKzB4MDIpKSByZXR1cm4gMTsKKwkJCS8qIGJhZCByZWdpc3RlcnMgKi8KKworCQkvKiBxZDY1ODAgZm91bmQgKi8KKworCQljb250cm9sID0gcWRfcmVhZF9yZWcoUURfQ09OVFJPTF9QT1JUKTsKKworCQlwcmludGsoS0VSTl9OT1RJQ0UgInFkNjU4MCBhdCAlI3hcbiIsIGJhc2UpOworCQlwcmludGsoS0VSTl9ERUJVRyAicWQ2NTgwOiBjb25maWc9JSN4LCBjb250cm9sPSUjeCwgSUQzPSV1XG4iLAorCQkJY29uZmlnLCBjb250cm9sLCBRRF9JRDMpOworCisJCWlmIChjb250cm9sICYgUURfQ09OVFJfU0VDX0RJU0FCTEVEKSB7CisJCQkvKiBzZWNvbmRhcnkgZGlzYWJsZWQgKi8KKworCQkJaHdpZiA9ICZpZGVfaHdpZnNbdW5pdF07CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcWQ2NTgwOiBzaW5nbGUgSURFIGJvYXJkXG4iLAorCQkJCQkgaHdpZi0+bmFtZSk7CisJCQlxZF9zZXR1cChod2lmLCBiYXNlLCBjb25maWcgfCAoY29udHJvbCA8PCA4KSwKKwkJCQkgUUQ2NTgwX0RFRl9EQVRBLCBRRDY1ODBfREVGX0RBVEEyLAorCQkJCSAmcWQ2NTgwX3R1bmVfZHJpdmUpOworCQkJcWRfd3JpdGVfcmVnKFFEX0RFRl9DT05UUixRRF9DT05UUk9MX1BPUlQpOworCisJCQljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWlkZV9od2lmX3QgKm1hdGU7CisKKwkJCWh3aWYgPSAmaWRlX2h3aWZzWzBdOworCQkJbWF0ZSA9ICZpZGVfaHdpZnNbMV07CisJCQkvKiBzZWNvbmRhcnkgZW5hYmxlZCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMmJXM6IHFkNjU4MDogZHVhbCBJREUgYm9hcmRcbiIsCisJCQkJCWh3aWYtPm5hbWUsIG1hdGUtPm5hbWUpOworCisJCQlxZF9zZXR1cChod2lmLCBiYXNlLCBjb25maWcgfCAoY29udHJvbCA8PCA4KSwKKwkJCQkgUUQ2NTgwX0RFRl9EQVRBLCBRRDY1ODBfREVGX0RBVEEsCisJCQkJICZxZDY1ODBfdHVuZV9kcml2ZSk7CisJCQlxZF9zZXR1cChtYXRlLCBiYXNlLCBjb25maWcgfCAoY29udHJvbCA8PCA4KSwKKwkJCQkgUUQ2NTgwX0RFRl9EQVRBMiwgUUQ2NTgwX0RFRl9EQVRBMiwKKwkJCQkgJnFkNjU4MF90dW5lX2RyaXZlKTsKKwkJCXFkX3dyaXRlX3JlZyhRRF9ERUZfQ09OVFIsUURfQ09OVFJPTF9QT1JUKTsKKworCQkJY3JlYXRlX3Byb2NfaWRlX2ludGVyZmFjZXMoKTsKKworCQkJcmV0dXJuIDA7IC8qIG5vIG90aGVyIHFkNjV4eCBwb3NzaWJsZSAqLworCQl9CisJfQorCS8qIG5vIHFkNjV4eCBmb3VuZCAqLworCXJldHVybiAxOworfQorCisvKiBDYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gaWRlLmMuICovCitpbnQgX19pbml0IHFkNjV4eF9pbml0KHZvaWQpCit7CisJaWYgKHFkX3Byb2JlKDB4MzApKQorCQlxZF9wcm9iZSgweGIwKTsKKwlpZiAoaWRlX2h3aWZzWzBdLmNoaXBzZXQgIT0gaWRlX3FkNjV4eCAmJgorCSAgICBpZGVfaHdpZnNbMV0uY2hpcHNldCAhPSBpZGVfcWQ2NXh4KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX2luaXQocWQ2NXh4X2luaXQpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIlNhbXVlbCBUaGliYXVsdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzdXBwb3J0IG9mIHFkNjV4eCB2bGIgaWRlIGNoaXBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9xZDY1eHguaCBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9xZDY1eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNhNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwCUxpbnVzIFRvcnZhbGRzICYgYXV0aG9ycworICovCisKKy8qCisgKiBBdXRob3JzOglQZXRyIFNvdWNlayA8cGV0ckByeXN0b24uY3o+CisgKiAJCVNhbXVlbCBUaGliYXVsdCA8c2FtdWVsLnRoaWJhdWx0QGZuYWMubmV0PgorICovCisKKy8qIHRydW5jYXRlcyBhIGluIFtiLGNdICovCisjZGVmaW5lIElERV9JTihhLGIsYykgICAoICgoYSk8KGIpKSA/IChiKSA6ICggKGEpPihjKSA/IChjKSA6IChhKSkgKQorCisjZGVmaW5lIElERV9JTVBMWShhLGIpCSgoIShhKSkgfHwgKGIpKQorCisjZGVmaW5lIFFEX1RJTTFfUE9SVAkJKGJhc2UpCisjZGVmaW5lIFFEX0NPTkZJR19QT1JUCQkoYmFzZSsweDAxKQorI2RlZmluZSBRRF9USU0yX1BPUlQJCShiYXNlKzB4MDIpCisjZGVmaW5lIFFEX0NPTlRST0xfUE9SVAkJKGJhc2UrMHgwMykKKworI2RlZmluZSBRRF9DT05GSUdfSURFX0JBU0VQT1JUCTB4MDEKKyNkZWZpbmUgUURfQ09ORklHX0JBU0VQT1JUCTB4MDIKKyNkZWZpbmUgUURfQ09ORklHX0lEMwkJMHgwNAorI2RlZmluZSBRRF9DT05GSUdfRElTQUJMRUQJMHgwOAorI2RlZmluZSBRRF9DT05GSUdfUUQ2NTAwCTB4YzAKKyNkZWZpbmUgUURfQ09ORklHX1FENjU4MF9BCTB4YTAKKyNkZWZpbmUgUURfQ09ORklHX1FENjU4MF9CCTB4NTAKKworI2RlZmluZSBRRF9DT05UUl9TRUNfRElTQUJMRUQJMHgwMQorCisjZGVmaW5lIFFEX0lEMwkJCSgoY29uZmlnICYgUURfQ09ORklHX0lEMykhPTApCisKKyNkZWZpbmUgUURfQ09ORklHKGh3aWYpCQkoKGh3aWYpLT5jb25maWdfZGF0YSAmIDB4MDBmZikKKyNkZWZpbmUgUURfQ09OVFJPTChod2lmKQkoKChod2lmKS0+Y29uZmlnX2RhdGEgJiAweGZmMDApID4+IDgpCisKKyNkZWZpbmUgUURfVElNSU5HKGRyaXZlKQkoYnl0ZSkoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHgwMGZmKQorI2RlZmluZSBRRF9USU1SRUcoZHJpdmUpCShieXRlKSgoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHhmZjAwKSA+PiA4KQorCisjZGVmaW5lIFFENjUwMF9ERUZfREFUQQkJKChRRF9USU0xX1BPUlQ8PDgpIHwgKFFEX0lEMyA/IDB4MGMgOiAweDA4KSkKKyNkZWZpbmUgUUQ2NTgwX0RFRl9EQVRBCQkoKFFEX1RJTTFfUE9SVDw8OCkgfCAoUURfSUQzID8gMHgwYSA6IDB4MDApKQorI2RlZmluZSBRRDY1ODBfREVGX0RBVEEyCSgoUURfVElNMl9QT1JUPDw4KSB8IChRRF9JRDMgPyAweDBhIDogMHgwMCkpCisjZGVmaW5lIFFEX0RFRl9DT05UUgkJKDB4NDAgfCAoKGNvbnRyb2wgJiAweDAyKSA/IDB4OWYgOiAweDFmKSkKKworI2RlZmluZSBRRF9URVNUVkFMCQkweDE5CS8qIHNhZmUgdmFsdWUgKi8KKworLyogRHJpdmUgc3BlY2lmaWMgdGltaW5nIHRha2VuIGZyb20gRE9TIGRyaXZlciB2My43ICovCisKK3N0YXRpYyBzdHJ1Y3QgcWQ2NXh4X3RpbWluZ19zIHsKKwlzOAlvZmZzZXQ7ICAgLyogb2ZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIE1vZGVsIE51bWJlciIgKi8KKwljaGFyCW1vZGVsWzRdOyAgICAvKiA0IGNoYXJzIGZyb20gTW9kZWwgbnVtYmVyLCBubyBjb252ZXJzaW9uICovCisJczE2CWFjdGl2ZTsgICAvKiBhY3RpdmUgdGltZSAqLworCXMxNglyZWNvdmVyeTsgLyogcmVjb3ZlcnkgdGltZSAqLworfSBxZDY1eHhfdGltaW5nIFtdID0geworCXsgMzAsICIyMDQwIiwgMTEwLCAyMjUgfSwgIC8qIENvbm5lciBDUDMwMjA0CQkJKi8KKwl7IDMwLCAiMjA0NSIsIDEzNSwgMjI1IH0sICAvKiBDb25uZXIgQ1AzMDI1NAkJCSovCisJeyAzMCwgIjEwNDAiLCAxNTUsIDMyNSB9LCAgLyogQ29ubmVyIENQMzAxMDQJCQkqLworCXsgMzAsICIxMDQ3IiwgMTM1LCAyNjUgfSwgIC8qIENvbm5lciBDUDMwMTc0CQkJKi8KKwl7IDMwLCAiNTM0NCIsIDEzNSwgMjI1IH0sICAvKiBDb25uZXIgQ1AzNTQ0CQkJKi8KKwl7IDMwLCAiMDEgNCIsIDE3NSwgNDA1IH0sICAvKiBDb25uZXIgQ1AtMzEwNAkJCSovCisJeyAyNywgIkMwMzAiLCAxNzUsIDM3NSB9LCAgLyogQ29ubmVyIENQMzAwMAkJCSovCisJeyAgOCwgIlBMNDIiLCAxMTAsIDI5NSB9LCAgLyogUXVhbnR1bSBMUDI0MAkJCSovCisJeyAgOCwgIlBMMjEiLCAxMTAsIDMxNSB9LCAgLyogUXVhbnR1bSBMUDEyMAkJCSovCisJeyAgOCwgIlBMMjUiLCAxNzUsIDM4NSB9LCAgLyogUXVhbnR1bSBMUDUyCQkJKi8KKwl7ICA0LCAiUEEyNCIsIDExMCwgMjg1IH0sICAvKiBXRCBQaXJhbmhhIFNQNDIwMAkJCSovCisJeyAgNiwgIjIyMDAiLCAxMTAsIDI2MCB9LCAgLyogV0QgQ2F2aWFyIEFDMjIwMAkJCSovCisJeyAgNiwgIjMyMDQiLCAxMTAsIDIzNSB9LCAgLyogV0QgQ2F2aWFyIEFDMjM0MAkJCSovCisJeyAgNiwgIjEyMDIiLCAxMTAsIDI2NSB9LCAgLyogV0QgQ2F2aWFyIEFDMjEyMAkJCSovCisJeyAgMCwgIkRTMy0iLCAxMzUsIDMxNSB9LCAgLyogVGVhYyBTRDM0MAkJCSovCisJeyAgOCwgIktNMzIiLCAxNzUsIDM1NSB9LCAgLyogVG9zaGliYSBNSzIzNAkJCSovCisJeyAgMiwgIjUzQTEiLCAxNzUsIDM1NSB9LCAgLyogU2VhZ2F0ZSBTVDM1MUEJCQkqLworCXsgIDIsICI0MTA4IiwgMTc1LCAyOTUgfSwgIC8qIFNlYWdhdGUgU1QxNDgwQQkJCSovCisJeyAgMiwgIjEzNDQiLCAxNzUsIDMzNSB9LCAgLyogU2VhZ2F0ZSBTVDMxNDRBCQkJKi8KKwl7ICA2LCAiNyAxMiIsIDExMCwgMjI1IH0sICAvKiBNYXh0b3IgNzIxM0EJCQkqLworCXsgMzAsICIwMkY0IiwgMTQ1LCAyOTUgfSwgIC8qIENvbm5lciAzMjA0RgkJCSovCisJeyAgMiwgIjEzMDIiLCAxNzUsIDMzNSB9LCAgLyogU2VhZ2F0ZSBTVDMxMjBBCQkJKi8KKwl7ICAyLCAiMjMzNCIsIDE0NSwgMjY1IH0sICAvKiBTZWFnYXRlIFNUMzI0M0EJCQkqLworCXsgIDIsICIyMzM4IiwgMTQ1LCAyNzUgfSwgIC8qIFNlYWdhdGUgU1QzMjgzQQkJCSovCisJeyAgMiwgIjMzMDkiLCAxNDUsIDI3NSB9LCAgLyogU2VhZ2F0ZSBTVDMzOTBBCQkJKi8KKwl7ICAyLCAiNTMwNSIsIDE0NSwgMjc1IH0sICAvKiBTZWFnYXRlIFNUMzU1MEEJCQkqLworCXsgIDIsICI0MTAwIiwgMTc1LCAyOTUgfSwgIC8qIFNlYWdhdGUgU1QxNDAwQQkJCSovCisJeyAgMiwgIjQxMTAiLCAxNzUsIDI5NSB9LCAgLyogU2VhZ2F0ZSBTVDE0MDFBCQkJKi8KKwl7ICAyLCAiNjMwMCIsIDEzNSwgMjY1IH0sICAvKiBTZWFnYXRlIFNUMzYwMEEJCQkqLworCXsgIDIsICI1MzAwIiwgMTM1LCAyNjUgfSwgIC8qIFNlYWdhdGUgU1QzNTAwQQkJCSovCisJeyAgNiwgIjcgMzEiLCAxMzUsIDIyNSB9LCAgLyogTWF4dG9yIDcxMzEgQVQJCQkqLworCXsgIDYsICI3IDQzIiwgMTE1LCAyNjUgfSwgIC8qIE1heHRvciA3MzQ1IEFUCQkJKi8KKwl7ICA2LCAiNyA0MiIsIDExMCwgMjU1IH0sICAvKiBNYXh0b3IgNzI0NSBBVAkJCSovCisJeyAgNiwgIjMgMDQiLCAxMzUsIDI2NSB9LCAgLyogTWF4dG9yIDM0MCBBVAkJCSovCisJeyAgNiwgIjYxIDAiLCAxMzUsIDI4NSB9LCAgLyogV0QgQUMxNjAJCQkJKi8KKwl7ICA2LCAiMTEwNyIsIDEzNSwgMjM1IH0sICAvKiBXRCBBQzExNzAJCQkJKi8KKwl7ICA2LCAiMjEwMSIsIDExMCwgMjIwIH0sICAvKiBXRCBBQzEyMTAJCQkJKi8KKwl7ICA2LCAiNDIwMiIsIDEzNSwgMjQ1IH0sICAvKiBXRCBBQzI0MjAJCQkJKi8KKwl7ICA2LCAiNDEgMCIsIDE3NSwgMzU1IH0sICAvKiBXRCBDYXZpYXIgMTQwCQkJKi8KKwl7ICA2LCAiODIgMCIsIDE3NSwgMzU1IH0sICAvKiBXRCBDYXZpYXIgMjgwCQkJKi8KKwl7ICA4LCAiUEwwMSIsIDE3NSwgMzc1IH0sICAvKiBRdWFudHVtIExQMTA1CQkJKi8KKwl7ICA4LCAiUEwyNSIsIDExMCwgMjk1IH0sICAvKiBRdWFudHVtIExQNTI1CQkJKi8KKwl7IDEwLCAiNFMgMiIsIDE3NSwgMzg1IH0sICAvKiBRdWFudHVtIEVMUzQyCQkJKi8KKwl7IDEwLCAiOFMgNSIsIDE3NSwgMzg1IH0sICAvKiBRdWFudHVtIEVMUzg1CQkJKi8KKwl7IDEwLCAiMVM3MiIsIDE3NSwgMzg1IH0sICAvKiBRdWFudHVtIEVMUzEyNwkJCSovCisJeyAxMCwgIjFTMDciLCAxNzUsIDM4NSB9LCAgLyogUXVhbnR1bSBFTFMxNzAJCQkqLworCXsgIDgsICJaRTQyIiwgMTM1LCAyOTUgfSwgIC8qIFF1YW50dW0gRVoyNDAJCQkqLworCXsgIDgsICJaRTIxIiwgMTc1LCAzODUgfSwgIC8qIFF1YW50dW0gRVoxMjcJCQkqLworCXsgIDgsICJaRTU4IiwgMTc1LCAzODUgfSwgIC8qIFF1YW50dW0gRVo4NQkJCSovCisJeyAgOCwgIlpFMjQiLCAxNzUsIDM4NSB9LCAgLyogUXVhbnR1bSBFWjQyCQkJKi8KKwl7IDI3LCAiQzAzNiIsIDE1NSwgMzI1IH0sICAvKiBDb25uZXIgQ1AzMDA2NAkJCSovCisJeyAyNywgIkMwMzgiLCAxNTUsIDMyNSB9LCAgLyogQ29ubmVyIENQMzAwODQJCQkqLworCXsgIDYsICIyMjA1IiwgMTEwLCAyNTUgfSwgIC8qIFdEQyBBQzIyNTAJCQkqLworCXsgIDIsICIgQ0hBIiwgMTQwLCA0MTUgfSwgIC8qIFdEQyBBSCBzZXJpZXM7IFdEQyBBSDI2MCwgV0RDCSovCisJeyAgMiwgIiBDTEEiLCAxNDAsIDQxNSB9LCAgLyogV0RDIEFMIHNlcmllczogV0RDIEFMMjEyMCwgMjE3MCwJKi8KKwl7ICA0LCAiVUM0MSIsIDE0MCwgNDE1IH0sICAvKiBXREMgQ1UxNDAJCQkJKi8KKwl7ICA2LCAiMTIwNyIsIDEzMCwgMjc1IH0sICAvKiBXREMgQUMyMTcwCQkJKi8KKwl7ICA2LCAiMjEwNyIsIDEzMCwgMjc1IH0sICAvKiBXREMgQUMxMjcwCQkJKi8KKwl7ICA2LCAiNTIwNCIsIDEzMCwgMjc1IH0sICAvKiBXREMgQUMyNTQwCQkJKi8KKwl7IDMwLCAiMzAwNCIsIDExMCwgMjM1IH0sICAvKiBDb25uZXIgQ1AzMDM0MAkJCSovCisJeyAzMCwgIjAzNDUiLCAxMzUsIDI1NSB9LCAgLyogQ29ubmVyIENQMzA1NDQJCQkqLworCXsgMTIsICIxMkEzIiwgMTc1LCAzMjAgfSwgIC8qIE1BWFRPUiBMWFQtMjEzQQkJCSovCisJeyAxMiwgIjQzQTAiLCAxNDUsIDI0MCB9LCAgLyogTUFYVE9SIExYVC0zNDBBCQkJKi8KKwl7ICA2LCAiNyAyMSIsIDE4MCwgMjkwIH0sICAvKiBNYXh0b3IgNzEyMCBBVAkJCSovCisJeyAgNiwgIjcgNzEiLCAxMzUsIDI0MCB9LCAgLyogTWF4dG9yIDcxNzAgQVQJCQkqLworCXsgMTIsICI0NVwwMDAwIiwgMTEwLCAyMDUgfSwgICAvKiBNQVhUT1IgTVhULTU0MAkJKi8KKwl7ICA4LCAiUEwxMSIsIDE4MCwgMjkwIH0sICAvKiBRVUFOVFVNIExQMTEwQQkJCSovCisJeyAgOCwgIk9HMjEiLCAxNTAsIDI3NSB9LCAgLyogUVVBTlRVTSBHTzEyMAkJCSovCisJeyAxMiwgIjQyQTUiLCAxNzUsIDMyMCB9LCAgLyogTUFYVE9SIExYVC0yNDVBCQkJKi8KKwl7ICAyLCAiMjMwOSIsIDE3NSwgMjk1IH0sICAvKiBTVDMyOTBBCQkJCSovCisJeyAgMiwgIjMzNTgiLCAxODAsIDMxMCB9LCAgLyogU1QzMzg1QQkJCQkqLworCXsgIDIsICI2MzU1IiwgMTgwLCAzMTAgfSwgIC8qIFNUMzY1NUEJCQkJKi8KKwl7ICAyLCAiMTkwMCIsIDE3NSwgMjcwIH0sICAvKiBTVDkxMDBBCQkJCSovCisJeyAgMiwgIjE5NTQiLCAxNzUsIDI3MCB9LCAgLyogU1Q5MTQ1QQkJCQkqLworCXsgIDIsICIxOTA5IiwgMTc1LCAyNzAgfSwgIC8qIFNUOTE5MEFHCQkJCSovCisJeyAgMiwgIjI5NTMiLCAxNzUsIDI3MCB9LCAgLyogU1Q5MjM1QQkJCQkqLworCXsgIDIsICIxMzU5IiwgMTc1LCAyNzAgfSwgIC8qIFNUMzE5NUEJCQkJKi8KKwl7IDI0LCAiM1IxMSIsIDE3NSwgMjkwIH0sICAvKiBBTFBTIEVMRUNUUklDIENvLixMVEQsIERSMzExQwkqLworCXsgIDAsICIyTTI2IiwgMTc1LCAyMTUgfSwgIC8qIE0yNjJYVC0wQWgJCQkqLworCXsgIDQsICIyMjUzIiwgMTc1LCAzMDAgfSwgIC8qIEhQIEMyMjM1QQkJCQkqLworCXsgIDQsICItMzJBIiwgMTQ1LCAyNDUgfSwgIC8qIEgzMTMzLUEyCQkJCSovCisJeyAzMCwgIjAzMjYiLCAxNTAsIDI3MCB9LCAgLyogU2Ftc3VuZyBFbGVjdHJvbmljcyAxMjBNQgkJKi8KKwl7IDMwLCAiMzA0NCIsIDExMCwgMTk1IH0sICAvKiBDb25uZXIgQ0ZBMzQwQQkJCSovCisJeyAzMCwgIjQzQTAiLCAxMTAsIDE5NSB9LCAgLyogQ29ubmVyIENGQTM0MEEJCQkqLworCXsgLTEsICIgICAgIiwgMTc1LCA0MTUgfSAgIC8qIHVua25vd24gZGlzayBuYW1lCQkJKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvdW1jODY3Mi5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L3VtYzg2NzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJkYjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L3VtYzg2NzIuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9sZWdhY3kvdW1jODY3Mi5jCQlWZXJzaW9uIDAuMDUJSnVsIDMxLCAxOTk2CisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvciAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiAgUHJpbmNpcGFsIEF1dGhvci9NYWludGFpbmVyOiAgUE9ESUVOQGhtbDIuYXRsYXMuZGUgKFdvbGZyYW0gUG9kaWVuKQorICoKKyAqICBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGFkdmFuY2VkIGZlYXR1cmVzCisgKiAgb2YgdGhlIFVNQyA4NjcyIElERSBpbnRlcmZhY2UuCisgKgorICogIFZlcnNpb24gMC4wMQlJbml0aWFsIHZlcnNpb24sIGhhY2tlZCBvdXQgb2YgaWRlLmMsCisgKgkJCWFuZCAjaW5jbHVkZSdkIHJhdGhlciB0aGFuIGNvbXBpbGVkIHNlcGFyYXRlbHkuCisgKgkJCVRoaXMgd2lsbCBnZXQgY2xlYW5lZCB1cCBpbiBhIHN1YnNlcXVlbnQgcmVsZWFzZS4KKyAqCisgKiAgVmVyc2lvbiAwLjAyCW5vdyBjb25maWdzL2NvbXBpbGVzIHNlcGFyYXRlIGZyb20gaWRlLmMgIC1tbAorICogIFZlcnNpb24gMC4wMwllbmhhbmNlZCBhdXRvLXR1bmUsIGZpeCBkaXNwbGF5IGJ1ZworICogIFZlcnNpb24gMC4wNQlyZXBsYWNlIHN0aSgpIHdpdGggcmVzdG9yZV9mbGFncygpICAtbWwKKyAqCQkJYWRkIGRldGVjdGlvbiBvZiBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiAgLW1sCisgKi8KKworLyoKKyAqIFZMQiBDb250cm9sbGVyIFN1cHBvcnQgZnJvbSAKKyAqIFdvbGZyYW0gUG9kaWVuCisgKiBSb2hvZWZlIDMKKyAqIEQyODgzMiBBY2hpbQorICogR2VybWFueQorICoKKyAqIFRvIGVuYWJsZSBVTUM4NjcyIHN1cHBvcnQgdGhlcmUgbXVzdCBhIGxpbG8gbGluZSBsaWtlCisgKiBhcHBlbmQ9ImlkZTA9dW1jODY3MiIuLi4KKyAqIFRvIHNldCB0aGUgc3BlZWQgYWNjb3JkaW5nIHRvIHRoZSBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlIHRoZXJlIG11c3QgYmUgYQorICogbGluZSBsaWtlCisgKiAjZGVmaW5lIFVNQ19EUklWRTAgMTEKKyAqIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRyaXZlciwgd2hpY2ggc2V0cyB0aGUgc3BlZWQgb2YgZHJpdmUgMCB0byAxMSAodGhlcmUKKyAqIGFyZSBzb21lIGxpbmVzIHByZXNlbnQpLiAwIC0gMTEgYXJlIGFsbG93ZWQgc3BlZWQgdmFsdWVzLiBUaGVzZSB2YWx1ZXMgYXJlCisgKiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBET1Mgc3BlZWQgdGVzdCBwcm9ncmFtIHN1cHBsaWVkIGZyb20gVU1DLiAxMSBpcyB0aGUgCisgKiBoaWdoZXN0IHNwZWVkIChhYm91dCBQSU8gbW9kZSAzKQorICovCisjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCQkvKiBzb21lIHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBEZWZhdWx0IHNwZWVkcy4gIFRoZXNlIGNhbiBiZSBjaGFuZ2VkIHdpdGggImF1dG8tdHVuZSIgYW5kL29yIGhkcGFybS4KKyAqLworI2RlZmluZSBVTUNfRFJJVkUwICAgICAgMSAgICAgICAgICAgICAgLyogRE9TIG1lYXN1cmVkIGRyaXZlIHNwZWVkcyAqLworI2RlZmluZSBVTUNfRFJJVkUxICAgICAgMSAgICAgICAgICAgICAgLyogMCB0byAxMSBhbGxvd2VkICovCisjZGVmaW5lIFVNQ19EUklWRTIgICAgICAxICAgICAgICAgICAgICAvKiAxMSA9IEZhc3Rlc3QgU3BlZWQgKi8KKyNkZWZpbmUgVU1DX0RSSVZFMyAgICAgIDEgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgY3Jhc2ggcmVkdWNlIHNwZWVkICovCisKK3N0YXRpYyB1OCBjdXJyZW50X3NwZWVkc1s0XSA9IHtVTUNfRFJJVkUwLCBVTUNfRFJJVkUxLCBVTUNfRFJJVkUyLCBVTUNfRFJJVkUzfTsKK3N0YXRpYyBjb25zdCB1OCBwaW9fdG9fdW1jIFs1XSA9IHswLDMsNywxMCwxMX07CS8qIHJvdWdoIGd1ZXNzZXMgKi8KKworLyogICAgICAgMCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAxMCAgIDExICAgICAgKi8KK3N0YXRpYyBjb25zdCB1OCBzcGVlZHRhYiBbM11bMTJdID0geworCXsweGYsIDB4YiwgMHgyLCAweDIsIDB4MiwgMHgxLCAweDEsIDB4MSwgMHgxLCAweDEsIDB4MSwgMHgxIH0sCisJezB4MywgMHgyLCAweDIsIDB4MiwgMHgyLCAweDIsIDB4MSwgMHgxLCAweDEsIDB4MSwgMHgxLCAweDEgfSwKKwl7MHhmZiwweGNiLDB4YzAsMHg1OCwweDM2LDB4MzMsMHgyMywweDIyLDB4MjEsMHgxMSwweDEwLDB4MH19OworCitzdGF0aWMgdm9pZCBvdXRfdW1jIChjaGFyIHBvcnQsY2hhciB3ZXJ0KQoreworCW91dGJfcChwb3J0LDB4MTA4KTsKKwlvdXRiX3Aod2VydCwweDEwOSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaW5fdW1jIChjaGFyIHBvcnQpCit7CisJb3V0Yl9wKHBvcnQsMHgxMDgpOworCXJldHVybiBpbmJfcCgweDEwOSk7Cit9CisKK3N0YXRpYyB2b2lkIHVtY19zZXRfc3BlZWRzICh1OCBzcGVlZHNbXSkKK3sKKwlpbnQgaSwgdG1wOworCisJb3V0Yl9wKDB4NUEsMHgxMDgpOyAvKiBlbmFibGUgdW1jICovCisKKwlvdXRfdW1jICgweGQ3LChzcGVlZHRhYlswXVtzcGVlZHNbMl1dIHwgKHNwZWVkdGFiWzBdW3NwZWVkc1szXV08PDQpKSk7CisJb3V0X3VtYyAoMHhkNiwoc3BlZWR0YWJbMF1bc3BlZWRzWzBdXSB8IChzcGVlZHRhYlswXVtzcGVlZHNbMV1dPDw0KSkpOworCXRtcCA9IDA7CisJZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pIHsKKwkJdG1wID0gKHRtcCA8PCAyKSB8IHNwZWVkdGFiWzFdW3NwZWVkc1tpXV07CisJfQorCW91dF91bWMgKDB4ZGMsdG1wKTsKKwlmb3IgKGkgPSAwO2kgPCA0OyBpKyspIHsKKwkJb3V0X3VtYyAoMHhkMCtpLHNwZWVkdGFiWzJdW3NwZWVkc1tpXV0pOworCQlvdXRfdW1jICgweGQ4K2ksc3BlZWR0YWJbMl1bc3BlZWRzW2ldXSk7CisJfQorCW91dGJfcCgweGE1LDB4MTA4KTsgLyogZGlzYWJsZSB1bWMgKi8KKworCXByaW50ayAoInVtYzg2NzI6IGRyaXZlIHNwZWVkcyBbMCB0byAxMV06ICVkICVkICVkICVkXG4iLAorCQlzcGVlZHNbMF0sIHNwZWVkc1sxXSwgc3BlZWRzWzJdLCBzcGVlZHNbM10pOworfQorCitzdGF0aWMgdm9pZCB0dW5lX3VtYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaWRlX2h3aWZzW0hXSUYoZHJpdmUpLT5pbmRleF4xXS5od2dyb3VwOworCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDQsIE5VTEwpOworCXByaW50aygiJXM6IHNldHRpbmcgdW1jODY3MiB0byBQSU8gbW9kZSVkIChzcGVlZCAlZClcbiIsCisJCWRyaXZlLT5uYW1lLCBwaW8sIHBpb190b191bWNbcGlvXSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJaWYgKGh3Z3JvdXAgJiYgaHdncm91cC0+aGFuZGxlciAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW1jODY3Mjogb3RoZXIgaW50ZXJmYWNlIGlzIGJ1c3k6IGV4aXRpbmcgdHVuZV91bWMoKVxuIik7CisJfSBlbHNlIHsKKwkJY3VycmVudF9zcGVlZHNbZHJpdmUtPm5hbWVbMl0gLSAnYSddID0gcGlvX3RvX3VtY1twaW9dOworCQl1bWNfc2V0X3NwZWVkcyAoY3VycmVudF9zcGVlZHMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1bWM4NjcyX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZGVfaHdpZl90ICpod2lmLCAqbWF0ZTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oMHgxMDgsIDIsICJ1bWM4NjcyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1bWM4NjcyOiBwb3J0cyAweDEwOC0weDEwOSBhbHJlYWR5IGluIHVzZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW91dGJfcCgweDVBLDB4MTA4KTsgLyogZW5hYmxlIHVtYyAqLworCWlmIChpbl91bWMgKDB4ZDUpICE9IDB4YTApIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgInVtYzg2NzI6IG5vdCBmb3VuZFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKDB4MTA4LCAyKTsKKwkJcmV0dXJuIDE7ICAKKwl9CisJb3V0Yl9wKDB4YTUsMHgxMDgpOyAvKiBkaXNhYmxlIHVtYyAqLworCisJdW1jX3NldF9zcGVlZHMgKGN1cnJlbnRfc3BlZWRzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlod2lmID0gJmlkZV9od2lmc1swXTsKKwltYXRlID0gJmlkZV9od2lmc1sxXTsKKworCWh3aWYtPmNoaXBzZXQgPSBpZGVfdW1jODY3MjsKKwlod2lmLT50dW5lcHJvYyA9ICZ0dW5lX3VtYzsKKwlod2lmLT5tYXRlID0gbWF0ZTsKKworCW1hdGUtPmNoaXBzZXQgPSBpZGVfdW1jODY3MjsKKwltYXRlLT50dW5lcHJvYyA9ICZ0dW5lX3VtYzsKKwltYXRlLT5tYXRlID0gaHdpZjsKKwltYXRlLT5jaGFubmVsID0gMTsKKworCXByb2JlX2h3aWZfaW5pdChod2lmKTsKKwlwcm9iZV9od2lmX2luaXQobWF0ZSk7CisKKwljcmVhdGVfcHJvY19pZGVfaW50ZXJmYWNlcygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBpZGUuYy4gKi8KK2ludCBfX2luaXQgdW1jODY3Ml9pbml0KHZvaWQpCit7CisJaWYgKHVtYzg2NzJfcHJvYmUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9pbml0KHVtYzg2NzJfaW5pdCk7CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiV29sZnJhbSBQb2RpZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgVU1DIDg2NzIgSURFIGNoaXBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL3BjaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWU2ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL01ha2VmaWxlCkBAIC0wLDAgKzEsMzQgQEAKKworb2JqLSQoQ09ORklHX0JMS19ERVZfQUVDNjJYWCkJCSs9IGFlYzYyeHgubworb2JqLSQoQ09ORklHX0JMS19ERVZfQUxJMTVYMykJCSs9IGFsaW0xNXgzLm8KK29iai0kKENPTkZJR19CTEtfREVWX0FNRDc0WFgpCQkrPSBhbWQ3NHh4Lm8KK29iai0kKENPTkZJR19CTEtfREVWX0FUSUlYUCkJCSs9IGF0aWl4cC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9DTUQ2NFgpCQkrPSBjbWQ2NHgubworb2JqLSQoQ09ORklHX0JMS19ERVZfQ1M1NTIwKQkJKz0gY3M1NTIwLm8KK29iai0kKENPTkZJR19CTEtfREVWX0NTNTUzMCkJCSs9IGNzNTUzMC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9TQzEyMDApCQkrPSBzYzEyMDAubworb2JqLSQoQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMpCQkrPSBjeTgyYzY5My5vCitvYmotJChDT05GSUdfQkxLX0RFVl9IUFQzNFgpCQkrPSBocHQzNHgubworb2JqLSQoQ09ORklHX0JMS19ERVZfSFBUMzY2KQkJKz0gaHB0MzY2Lm8KKyNvYmotJChDT05GSUdfQkxLX0RFVl9IUFQzN1gpCQkrPSBocHQzN3gubworb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MTcyKQkJKz0gaXQ4MTcyLm8KK29iai0kKENPTkZJR19CTEtfREVWX05TODc0MTUpCQkrPSBuczg3NDE1Lm8KK29iai0kKENPTkZJR19CTEtfREVWX09QVEk2MjEpCQkrPSBvcHRpNjIxLm8KK29iai0kKENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCkJKz0gcGRjMjAyeHhfb2xkLm8KK29iai0kKENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVykJKz0gcGRjMjAyeHhfbmV3Lm8KK29iai0kKENPTkZJR19CTEtfREVWX1BJSVgpCQkrPSBwaWl4Lm8KK29iai0kKENPTkZJR19CTEtfREVWX1JaMTAwMCkJCSs9IHJ6MTAwMC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9TVldLUykJCSs9IHNlcnZlcndvcmtzLm8KK29iai0kKENPTkZJR19CTEtfREVWX1NHSUlPQzQpCQkrPSBzZ2lpb2M0Lm8KK29iai0kKENPTkZJR19CTEtfREVWX1NJSU1BR0UpCQkrPSBzaWltYWdlLm8KK29iai0kKENPTkZJR19CTEtfREVWX1NJUzU1MTMpCQkrPSBzaXM1NTEzLm8KK29iai0kKENPTkZJR19CTEtfREVWX1NMODJDMTA1KQkJKz0gc2w4MmMxMDUubworb2JqLSQoQ09ORklHX0JMS19ERVZfU0xDOTBFNjYpCQkrPSBzbGM5MGU2Ni5vCitvYmotJChDT05GSUdfQkxLX0RFVl9UUklGTEVYKQkJKz0gdHJpZmxleC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9UUk0yOTApCQkrPSB0cm0yOTAubworb2JqLSQoQ09ORklHX0JMS19ERVZfVklBODJDWFhYKQkJKz0gdmlhODJjeHh4Lm8KKworIyBNdXN0IGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaworb2JqLSQoQ09ORklHX0JMS19ERVZfR0VORVJJQykgICAgICAgICAgKz0gZ2VuZXJpYy5vCisKK0VYVFJBX0NGTEFHUwk6PSAtSWRyaXZlcnMvaWRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYWVjNjJ4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FlYzYyeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNhZGMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2FlYzYyeHguYwpAQCAtMCwwICsxLDQ4NSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9hZWM2Mnh4LmMJCVZlcnNpb24gMC4xMQlNYXJjaCAyNywgMjAwMgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAyCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgeworCXU4IHhmZXJfc3BlZWQ7CisJdTggY2hpcHNldF9zZXR0aW5nczsKKwl1OCB1bHRyYV9zZXR0aW5nczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBhZWM2eHh4XzMzX2Jhc2UgW10gPSB7CisJewlYRkVSX1VETUFfNiwJMHgzMSwJMHgwNwl9LAorCXsJWEZFUl9VRE1BXzUsCTB4MzEsCTB4MDYJfSwKKwl7CVhGRVJfVURNQV80LAkweDMxLAkweDA1CX0sCisJewlYRkVSX1VETUFfMywJMHgzMSwJMHgwNAl9LAorCXsJWEZFUl9VRE1BXzIsCTB4MzEsCTB4MDMJfSwKKwl7CVhGRVJfVURNQV8xLAkweDMxLAkweDAyCX0sCisJewlYRkVSX1VETUFfMCwJMHgzMSwJMHgwMQl9LAorCisJewlYRkVSX01XX0RNQV8yLAkweDMxLAkweDAwCX0sCisJewlYRkVSX01XX0RNQV8xLAkweDMxLAkweDAwCX0sCisJewlYRkVSX01XX0RNQV8wLAkweDBhLAkweDAwCX0sCisJewlYRkVSX1BJT180LAkweDMxLAkweDAwCX0sCisJewlYRkVSX1BJT18zLAkweDMzLAkweDAwCX0sCisJewlYRkVSX1BJT18yLAkweDA4LAkweDAwCX0sCisJewlYRkVSX1BJT18xLAkweDBhLAkweDAwCX0sCisJewlYRkVSX1BJT18wLAkweDAwLAkweDAwCX0sCisJewkwLAkJMHgwMCwJMHgwMAl9Cit9OworCitzdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgYWVjNnh4eF8zNF9iYXNlIFtdID0geworCXsJWEZFUl9VRE1BXzYsCTB4NDEsCTB4MDYJfSwKKwl7CVhGRVJfVURNQV81LAkweDQxLAkweDA1CX0sCisJewlYRkVSX1VETUFfNCwJMHg0MSwJMHgwNAl9LAorCXsJWEZFUl9VRE1BXzMsCTB4NDEsCTB4MDMJfSwKKwl7CVhGRVJfVURNQV8yLAkweDQxLAkweDAyCX0sCisJewlYRkVSX1VETUFfMSwJMHg0MSwJMHgwMQl9LAorCXsJWEZFUl9VRE1BXzAsCTB4NDEsCTB4MDEJfSwKKworCXsJWEZFUl9NV19ETUFfMiwJMHg0MSwJMHgwMAl9LAorCXsJWEZFUl9NV19ETUFfMSwJMHg0MiwJMHgwMAl9LAorCXsJWEZFUl9NV19ETUFfMCwJMHg3YSwJMHgwMAl9LAorCXsJWEZFUl9QSU9fNCwJMHg0MSwJMHgwMAl9LAorCXsJWEZFUl9QSU9fMywJMHg0MywJMHgwMAl9LAorCXsJWEZFUl9QSU9fMiwJMHg3OCwJMHgwMAl9LAorCXsJWEZFUl9QSU9fMSwJMHg3YSwJMHgwMAl9LAorCXsJWEZFUl9QSU9fMCwJMHg3MCwJMHgwMAl9LAorCXsJMCwJCTB4MDAsCTB4MDAJfQorfTsKKworI2RlZmluZSBCVVNDTE9DSyhEKQlcCisJKChzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqKSBwY2lfZ2V0X2RydmRhdGEoKEQpKSkKKworI2lmIDAKKwkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODUwVUYpIHsKKwkJCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTQsICZhcnQpOworCQkJcCArPSBzcHJpbnRmKHAsICJETUEgTW9kZTogICAgICAgJXMoJXMpIiwKKwkJCQkoYzAmMHgyMCk/KChhcnQmMHgwMyk/IlVETUEiOiIgRE1BIik6IiBQSU8iLAorCQkJCShhcnQmMHgwMik/IjIiOihhcnQmMHgwMSk/IjEiOiIwIik7CisJCQlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAlcyglcykiLAorCQkJCShjMCYweDQwKT8oKGFydCYweDBjKT8iVURNQSI6IiBETUEiKToiIFBJTyIsCisJCQkJKGFydCYweDA4KT8iMiI6KGFydCYweDA0KT8iMSI6IjAiKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiICAgICAgICAgJXMoJXMpIiwKKwkJCQkoYzEmMHgyMCk/KChhcnQmMHgzMCk/IlVETUEiOiIgRE1BIik6IiBQSU8iLAorCQkJCShhcnQmMHgyMCk/IjIiOihhcnQmMHgxMCk/IjEiOiIwIik7CisJCQlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgJXMoJXMpXG4iLAorCQkJCShjMSYweDQwKT8oKGFydCYweGMwKT8iVURNQSI6IiBETUEiKToiIFBJTyIsCisJCQkJKGFydCYweDgwKT8iMiI6KGFydCYweDQwKT8iMSI6IjAiKTsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCisvKgorICogVE8gRE86IGFjdGl2ZSB0dW5pbmcgYW5kIGNvcnJlY3Rpb24gb2YgY2FyZHMgd2l0aG91dCBhIGJpb3MuCisgKi8KK3N0YXRpYyB1OCBwY2lfYnVzX2Nsb2NrX2xpc3QgKHU4IHNwZWVkLCBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqIGNoaXBzZXRfdGFibGUpCit7CisJZm9yICggOyBjaGlwc2V0X3RhYmxlLT54ZmVyX3NwZWVkIDsgY2hpcHNldF90YWJsZSsrKQorCQlpZiAoY2hpcHNldF90YWJsZS0+eGZlcl9zcGVlZCA9PSBzcGVlZCkgeworCQkJcmV0dXJuIGNoaXBzZXRfdGFibGUtPmNoaXBzZXRfc2V0dGluZ3M7CisJCX0KKwlyZXR1cm4gY2hpcHNldF90YWJsZS0+Y2hpcHNldF9zZXR0aW5nczsKK30KKworc3RhdGljIHU4IHBjaV9idXNfY2xvY2tfbGlzdF91bHRyYSAodTggc3BlZWQsIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICogY2hpcHNldF90YWJsZSkKK3sKKwlmb3IgKCA7IGNoaXBzZXRfdGFibGUtPnhmZXJfc3BlZWQgOyBjaGlwc2V0X3RhYmxlKyspCisJCWlmIChjaGlwc2V0X3RhYmxlLT54ZmVyX3NwZWVkID09IHNwZWVkKSB7CisJCQlyZXR1cm4gY2hpcHNldF90YWJsZS0+dWx0cmFfc2V0dGluZ3M7CisJCX0KKwlyZXR1cm4gY2hpcHNldF90YWJsZS0+dWx0cmFfc2V0dGluZ3M7Cit9CisKK3N0YXRpYyB1OCBhZWM2Mnh4X3JhdGVtYXNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXU4IG1vZGU7CisKKwlzd2l0Y2goaHdpZi0+cGNpX2Rldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjU6CisJCWNhc2UgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjVSOgorI2lmIDAKKwkJCW1vZGUgPSAoaHdpZi0+SU5CKGh3aWYtPmRtYV9tYXN0ZXIpICYgMHgxMCkgPyA0IDogMzsKKyNlbHNlCisJCQltb2RlID0gKGh3aWYtPklOQigoKGh3aWYtPmNoYW5uZWwpID8KKwkJCQkJaHdpZi0+bWF0ZS0+ZG1hX3N0YXR1cyA6CisJCQkJCWh3aWYtPmRtYV9zdGF0dXMpKSAmIDB4MTApID8gNCA6IDM7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwUjoKKwkJCW1vZGUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NTBVRjoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KKworCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgYWVjNjIxMF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1MTYgZF9jb25mCQk9IDA7CisJdTggc3BlZWQJPSBpZGVfcmF0ZV9maWx0ZXIoYWVjNjJ4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisJdTggdWx0cmEgPSAwLCB1bHRyYV9jb25mID0gMDsKKwl1OCB0bXAwID0gMCwgdG1wMSA9IDAsIHRtcDIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogMHg0MHwoMipkcml2ZS0+ZG4pOiBBY3RpdmUsIDB4NDF8KDIqZHJpdmUtPmRuKTogUmVjb3ZlcnkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDB8KDIqZHJpdmUtPmRuKSwgJmRfY29uZik7CisJdG1wMCA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwgQlVTQ0xPQ0soZGV2KSk7CisJZF9jb25mID0gKCh0bXAwICYgMHhmMCkgPDwgNCkgfCAodG1wMCAmIDB4Zik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MHwoMipkcml2ZS0+ZG4pLCBkX2NvbmYpOworCisJdG1wMSA9IDB4MDA7CisJdG1wMiA9IDB4MDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDU0LCAmdWx0cmEpOworCXRtcDEgPSAoKDB4MDAgPDwgKDIqZHJpdmUtPmRuKSkgfCAodWx0cmEgJiB+KDMgPDwgKDIqZHJpdmUtPmRuKSkpKTsKKwl1bHRyYV9jb25mID0gcGNpX2J1c19jbG9ja19saXN0X3VsdHJhKHNwZWVkLCBCVVNDTE9DSyhkZXYpKTsKKwl0bXAyID0gKCh1bHRyYV9jb25mIDw8ICgyKmRyaXZlLT5kbikpIHwgKHRtcDEgJiB+KDMgPDwgKDIqZHJpdmUtPmRuKSkpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCB0bXAyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuKGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKSk7Cit9CisKK3N0YXRpYyBpbnQgYWVjNjI2MF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1OCBzcGVlZAk9IGlkZV9yYXRlX2ZpbHRlcihhZWM2Mnh4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKwl1OCB1bml0CQk9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOworCXU4IHRtcDEgPSAwLCB0bXAyID0gMDsKKwl1OCB1bHRyYSA9IDAsIGRyaXZlX2NvbmYgPSAwLCB1bHRyYV9jb25mID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIGhpZ2ggNC1iaXRzOiBBY3RpdmUsIGxvdyA0LWJpdHM6IFJlY292ZXJ5ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQwfGRyaXZlLT5kbiwgJmRyaXZlX2NvbmYpOworCWRyaXZlX2NvbmYgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsIEJVU0NMT0NLKGRldikpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDB8ZHJpdmUtPmRuLCBkcml2ZV9jb25mKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKDB4NDR8aHdpZi0+Y2hhbm5lbCksICZ1bHRyYSk7CisJdG1wMSA9ICgoMHgwMCA8PCAoNCp1bml0KSkgfCAodWx0cmEgJiB+KDcgPDwgKDQqdW5pdCkpKSk7CisJdWx0cmFfY29uZiA9IHBjaV9idXNfY2xvY2tfbGlzdF91bHRyYShzcGVlZCwgQlVTQ0xPQ0soZGV2KSk7CisJdG1wMiA9ICgodWx0cmFfY29uZiA8PCAoNCp1bml0KSkgfCAodG1wMSAmIH4oNyA8PCAoNCp1bml0KSkpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoMHg0NHxod2lmLT5jaGFubmVsKSwgdG1wMik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybihpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCkpOworfQorCitzdGF0aWMgaW50IGFlYzYyeHhfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNwZWVkKQoreworCXN3aXRjaCAoSFdJRihkcml2ZSktPnBjaV9kZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODY1OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODY1UjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MFI6CisJCQlyZXR1cm4gKChpbnQpIGFlYzYyNjBfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCkpOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODUwVUY6CisJCQlyZXR1cm4gKChpbnQpIGFlYzYyMTBfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCkpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBhZWM2Mnh4X3JhdGVtYXNrKGRyaXZlKSk7CQorCisJaWYgKCEoc3BlZWQpKQorCQlyZXR1cm4gMDsKKworCSh2b2lkKSBhZWM2Mnh4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFlYzYyeHhfdHVuZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJdTggc3BlZWQgPSAwOworCXU4IG5ld19waW8gPSBYRkVSX1BJT18wICsgaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCAyNTUsIDUsIE5VTEwpOworCisJc3dpdGNoKHBpbykgeworCQljYXNlIDU6CQlzcGVlZCA9IG5ld19waW87IGJyZWFrOworCQljYXNlIDQ6CQlzcGVlZCA9IFhGRVJfUElPXzQ7IGJyZWFrOworCQljYXNlIDM6CQlzcGVlZCA9IFhGRVJfUElPXzM7IGJyZWFrOworCQljYXNlIDI6CQlzcGVlZCA9IFhGRVJfUElPXzI7IGJyZWFrOworCQljYXNlIDE6CQlzcGVlZCA9IFhGRVJfUElPXzE7IGJyZWFrOworCQlkZWZhdWx0OglzcGVlZCA9IFhGRVJfUElPXzA7IGJyZWFrOworCX0KKwkodm9pZCkgYWVjNjJ4eF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKK30KKworc3RhdGljIGludCBhZWM2Mnh4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJYWVjNjJ4eF90dW5lX2RyaXZlKGRyaXZlLCA1KTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWVjNjJ4eF9pcnFfdGltZW91dCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKworCXN3aXRjaChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwUjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NVI6CisJCQlwcmludGsoIiBBRUM2MlhYIHRpbWUgb3V0ICIpOworI2lmIDAKKwkJCXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJdTggcmVnNDloID0gMDsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg0OSwgJnJlZzQ5aCk7CisJCQkJZm9yIChpPTA7aTwyNTY7aSsrKQorCQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NDksIHJlZzQ5aHwweDEwKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NDksIHJlZzQ5aCAmIH4weDEwKTsKKwkJCX0KKwkJCXJldHVybiAwOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisjaWYgMAorCXsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwkJdTggdG1wMSA9IDAsIHRtcDIgPSAwLCBtb2RlNiA9IDA7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAmdG1wMSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0NSwgJnRtcDIpOworCQlwcmludGsoIiBBRUM2MjgwIHI0ND0leCByNDU9JXggIix0bXAxLHRtcDIpOworCQltb2RlNiA9IEhXSUYoZHJpdmUpLT5JTkIoKChod2lmLT5jaGFubmVsKSA/CisJCQkJCSAgIGh3aWYtPm1hdGUtPmRtYV9zdGF0dXMgOgorCQkJCQkgICBod2lmLT5kbWFfc3RhdHVzKSk7CisJCXByaW50aygiIEFFQzYyODAgMTMzPSV4ICIsIChtb2RlNiAmIDB4MTApKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2FlYzYyeHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgYnVzX3NwZWVkID0gc3lzdGVtX2J1c19jbG9jaygpOworCisJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUk9NIGVuYWJsZWQgYXQgMHglMDhseFxuIiwgbmFtZSwgZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCk7CisJfQorCisJaWYgKGJ1c19zcGVlZCA8PSAzMykKKwkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgYWVjNnh4eF8zM19iYXNlKTsKKwllbHNlCisJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGFlYzZ4eHhfMzRfYmFzZSk7CisKKwlyZXR1cm4gZGV2LT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfYWVjNjJ4eChpZGVfaHdpZl90ICpod2lmKQoreworCWh3aWYtPmF1dG9kbWEgPSAwOworCWh3aWYtPnR1bmVwcm9jID0gJmFlYzYyeHhfdHVuZV9kcml2ZTsKKwlod2lmLT5zcGVlZHByb2MgPSAmYWVjNjJ4eF90dW5lX2NoaXBzZXQ7CisKKwlpZiAoaHdpZi0+cGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODUwVUYpIHsKKwkJaHdpZi0+c2VyaWFsaXplZCA9IGh3aWYtPmNoYW5uZWw7CisJCWh3aWYtPm5vX2RzYyA9IDE7CisJfQorCisJaWYgKGh3aWYtPm1hdGUpCisJCWh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSBod2lmLT5zZXJpYWxpemVkOworCisJaWYgKCFod2lmLT5kbWFfYmFzZSkgeworCQlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCQlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSAxOworCQlyZXR1cm47CisJfQorCisJaHdpZi0+dWx0cmFfbWFzayA9IDB4N2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7CisKKwlod2lmLT5pZGVfZG1hX2NoZWNrCT0gJmFlYzYyeHhfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKKwlod2lmLT5pZGVfZG1hX2xvc3RpcnEJPSAmYWVjNjJ4eF9pcnFfdGltZW91dDsKKwlod2lmLT5pZGVfZG1hX3RpbWVvdXQJPSAmYWVjNjJ4eF9pcnFfdGltZW91dDsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX2FlYzYyeHgoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFiYXNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCisJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODUwVUYpIHsKKwkJdTggcmVnNTRoID0gMDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDU0LCAmcmVnNTRoKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgcmVnNTRoICYgfihod2lmLT5jaGFubmVsID8gMHhGMCA6IDB4MEYpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQl1OCBhdGE2Ngk9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NDksICZhdGE2Nik7CisJICAgICAgICBpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQkJaHdpZi0+dWRtYV9mb3VyID0gKGF0YTY2Jihod2lmLT5jaGFubmVsPzB4MDI6MHgwMSkpPzA6MTsKKwl9CisKKwlpZGVfc2V0dXBfZG1hKGh3aWYsIGRtYWJhc2UsIDgpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NldHVwX2FlYzYyeHgoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9hZWM2eDgwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQpCit7CisJdW5zaWduZWQgbG9uZyBiYXI0cmVnID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisKKwlpZiAoaW5iKGJhcjRyZWcrMikgJiAweDEwKSB7CisJCXN0cmNweShkLT5uYW1lLCAiQUVDNjg4MCIpOworCQlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjVSKQorCQkJc3RyY3B5KGQtPm5hbWUsICJBRUM2ODgwUiIpOworCX0gZWxzZSB7CisJCXN0cmNweShkLT5uYW1lLCAiQUVDNjI4MCIpOworCQlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjVSKQorCQkJc3RyY3B5KGQtPm5hbWUsICJBRUM2MjgwUiIpOworCX0KKworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBhZWM2Mnh4X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIkFFQzYyMTAiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfYWVjNjJ4eCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9hZWM2Mnh4LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FlYzYyeHgsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX2FlYzYyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NGEsMHgwMiwweDAyfSwgezB4NGEsMHgwNCwweDA0fX0sCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogMSAqLworCQkubmFtZQkJPSAiQUVDNjI2MCIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9hZWM2Mnh4LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2FlYzYyeHgsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfYWVjNjJ4eCwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfYWVjNjJ4eCwKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogMiAqLworCQkubmFtZQkJPSAiQUVDNjI2MFIiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfYWVjNjJ4eCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9hZWM2Mnh4LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FlYzYyeHgsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX2FlYzYyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NGEsMHgwMiwweDAyfSwgezB4NGEsMHgwNCwweDA0fX0sCisJCS5ib290YWJsZQk9IE5FVkVSX0JPQVJELAorCX0sewkvKiAzICovCisJCS5uYW1lCQk9ICJBRUM2WDgwIiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2FlYzZ4ODAsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfYWVjNjJ4eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9hZWM2Mnh4LAorCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9hZWM2Mnh4LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogNCAqLworCQkubmFtZQkJPSAiQUVDNlg4MFIiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfYWVjNng4MCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9hZWM2Mnh4LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FlYzYyeHgsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX2FlYzYyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NGEsMHgwMiwweDAyfSwgezB4NGEsMHgwNCwweDA0fX0sCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9Cit9OworCisvKioKKyAqCWFlYzYyeHhfaW5pdF9vbmUJLQljYWxsZWQgd2hlbiBhIEFFQyBpcyBmb3VuZAorICoJQGRldjogdGhlIGFlYzYyeHggZGV2aWNlCisgKglAaWQ6IHRoZSBtYXRjaGluZyBwY2kgaWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgUENJIHJlZ2lzdHJhdGlvbiBsYXllciAob3IgdGhlIElERSBpbml0aWFsaXphdGlvbikKKyAqCWZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nIG91ciBJREUgZGV2aWNlIHRhYmxlcy4KKyAqLworIAorc3RhdGljIGludCBfX2RldmluaXQgYWVjNjJ4eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWRlX3BjaV9kZXZpY2VfdCAqZCA9ICZhZWM2Mnh4X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CisKKwlyZXR1cm4gZC0+aW5pdF9zZXR1cChkZXYsIGQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWVjNjJ4eF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg1MFVGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MCwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2MFIsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NSwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NVIsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0IH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZWM2Mnh4X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJBRUM2Mnh4X0lERSIsCisJLmlkX3RhYmxlCT0gYWVjNjJ4eF9wY2lfdGJsLAorCS5wcm9iZQkJPSBhZWM2Mnh4X2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBhZWM2Mnh4X2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZWM2Mnh4X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmUgSGVkcmljayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgQVJUT1AgQUVDNjJ4eCBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hbGltMTV4My5jIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZmIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hbGltMTV4My5jCkBAIC0wLDAgKzEsOTEzIEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMJCVZlcnNpb24gMC4xNwkyMDAzLzAxLzAyCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIE1pY2hlbCBBdWJyeSwgTWFpbnRhaW5lcgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3osIE1haW50YWluZXIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBDSiwgY2p0c2FpQGFsaS5jb20udHcsIE1haW50YWluZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgQW5kcmUgSGVkcmljayAoYW5kcmVAbGludXgtaWRlLm9yZykKKyAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICBBTGkgKG5vdyBVTGkgTTUyMjgpIHN1cHBvcnQgYnkgQ2xlYXIgWmhhbmcgPENsZWFyLlpoYW5nQGFsaS5jb20udHc+CisgKgorICogIChVKURNQSBjYXBhYmxlIHZlcnNpb24gb2YgYWxpIDE1MzMvMTU0MyhDKSwgMTUzNShEKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgOS83Lzk5IC0tUGFydHMgZnJvbSB0aGUgYWJvdmUgYXV0aG9yIGFyZSBpbmNsdWRlZCBhbmQgbmVlZCB0byBiZQorICogIGNvbnZlcnRlZCBpbnRvIHN0YW5kYXJkIGludGVyZmFjZSwgb25jZSBJIGZpbmlzaCB0aGUgdGhvdWdodC4KKyAqCisgKiAgUmVjZW50IGNoYW5nZXMKKyAqCURvbid0IHVzZSBMQkE0OCBtb2RlIG9uIEFMaSA8PSAweEM0CisgKglEb24ndCBwb2tlIDB4Nzkgd2l0aCBhIG5vbiBBTGkgbm9ydGhicmlkZ2UKKyAqCURvbid0IGZsaXAgdW5kZWZpbmVkIGJpdHMgb24gbmV3ZXIgY2hpcHNldHMgKGZpeCBGdWppdHN1IGxhcHRvcCBoYW5nKQorICoJQWxsb3cgVURNQTYgb24gcmV2aXNpb25zID4gMHhDNAorICoKKyAqICBEb2N1bWVudGF0aW9uCisgKglDaGlwc2V0IGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIHVuZGVyIE5EQSBvbmx5CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBESVNQTEFZX0FMSV9USU1JTkdTCisKKy8qCisgKglBTGkgZGV2aWNlcyBhcmUgbm90IHBsdWcgaW4uIE90aGVyd2lzZSB0aGVzZSBzdGF0aWMgdmFsdWVzIHdvdWxkCisgKgluZWVkIHRvIGdvLiBUaGV5IG91Z2h0IHRvIGdvIGF3YXkgYW55d2F5CisgKi8KKyAKK3N0YXRpYyB1OCBtNTIyOV9yZXZpc2lvbjsKK3N0YXRpYyB1OCBjaGlwX2lzXzE1NDNjX2U7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmlzYV9kZXY7CisKKyNpZiBkZWZpbmVkKERJU1BMQVlfQUxJX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RhdGljIHU4IGFsaV9wcm9jID0gMDsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpibWlkZV9kZXY7CisKK3N0YXRpYyBjaGFyICpmaWZvWzRdID0geworCSJGSUZPIE9mZiIsCisJIkZJRk8gT24gIiwKKwkiRE1BIG1vZGUiLAorCSJQSU8gbW9kZSIgfTsKKworc3RhdGljIGNoYXIgKnVkbWFUWzhdID0geworCSIxLjVUIiwKKwkiICAyVCIsCisJIjIuNVQiLAorCSIgIDNUIiwKKwkiMy41VCIsCisJIiAgNFQiLAorCSIgIDZUIiwKKwkiICA4VCIKK307CisKK3N0YXRpYyBjaGFyICpjaGFubmVsX3N0YXR1c1s4XSA9IHsKKwkiT0sgICAgICAgICAgICAiLAorCSJidXN5ICAgICAgICAgICIsCisJIkRSUSAgICAgICAgICAgIiwKKwkiRFJRIGJ1c3kgICAgICAiLAorCSJlcnJvciAgICAgICAgICIsCisJImVycm9yIGJ1c3kgICAgIiwKKwkiZXJyb3IgRFJRICAgICAiLAorCSJlcnJvciBEUlEgYnVzeSIKK307CisKKy8qKgorICoJYWxpX2dldF9pbmZvCQktCWdlbmVyYXRlIHByb2MgZmlsZSBmb3IgQUxpIElERQorICoJQGJ1ZmZlcjogYnVmZmVyIHRvIGZpbGwKKyAqCUBhZGRyOiBhZGRyZXNzIG9mIHVzZXIgc3RhcnQgaW4gYnVmZmVyCisgKglAb2Zmc2V0OiBvZmZzZXQgaW50byAnZmlsZScKKyAqCUBjb3VudDogYnVmZmVyIGNvdW50CisgKgorICoJV2Fsa3MgdGhlIEFsaSBkZXZpY2VzIGFuZCBvdXRwdXRzIHN1bW1hcnkgZGF0YSBvbiB0aGUgdHVuaW5nIGFuZAorICoJYW55dGhpbmcgZWxzZSB0aGF0IHdpbGwgaGVscCB3aXRoIGRlYnVnZ2luZworICovCisgCitzdGF0aWMgaW50IGFsaV9nZXRfaW5mbyAoY2hhciAqYnVmZmVyLCBjaGFyICoqYWRkciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBiaWJtYTsKKwl1OCByZWc1M2gsIHJlZzV4aCwgcmVnNXloLCByZWc1eGgxLCByZWc1eWgxLCBjMCwgYzEsIHJldiwgdG1wOworCWNoYXIgKnEsICpwID0gYnVmZmVyOworCisJLyogZmV0Y2ggcmV2LiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHgwOCwgJnJldik7CisJaWYgKHJldiA+PSAweGMxKQkvKiBNMTU0M0Mgb3IgbmV3ZXIgKi8KKwkJdWRtYVRbN10gPSAiID8/PyI7CisJZWxzZQorCQlmaWZvWzNdICA9ICIgICA/Pz8gICI7CisKKwkvKiBmaXJzdCBmZXRjaCBiaWJtYTogKi8KKwkKKwliaWJtYSA9IHBjaV9yZXNvdXJjZV9zdGFydChibWlkZV9kZXYsIDQpOworCisJLyoKKwkgKiBhdCB0aGF0IHBvaW50IGJpYm1hKzB4MiBldCBiaWJtYSsweGEgYXJlIGJ5dGUKKwkgKiByZWdpc3RlcnMgdG8gaW52ZXN0aWdhdGU6CisJICovCisJYzAgPSBpbmIoYmlibWEgKyAweDAyKTsKKwljMSA9IGluYihiaWJtYSArIDB4MGEpOworCisJcCArPSBzcHJpbnRmKHAsCisJCSJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpIE0xNXgzIENoaXBzZXQuXG4iKTsKKwlwICs9IHNwcmludGYocCwKKwkJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NzgsICZyZWc1M2gpOworCXAgKz0gc3ByaW50ZihwLCAiUENJIENsb2NrOiAlZC5cbiIsIHJlZzUzaCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NTMsICZyZWc1M2gpOworCXAgKz0gc3ByaW50ZihwLAorCQkiQ0RfUk9NIEZJRk86JXMsIENEX1JPTSBETUE6JXNcbiIsCisJCShyZWc1M2ggJiAweDAyKSA/ICJZZXMiIDogIk5vICIsCisJCShyZWc1M2ggJiAweDAxKSA/ICJZZXMiIDogIk5vICIgKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NzQsICZyZWc1M2gpOworCXAgKz0gc3ByaW50ZihwLAorCQkiRklGTyBTdGF0dXM6IGNvbnRhaW5zICVkIFdvcmRzLCBydW5zJXMlc1xuXG4iLAorCQkocmVnNTNoICYgMHgzZiksCisJCShyZWc1M2ggJiAweDQwKSA/ICIgT1ZFUldSIiA6ICIiLAorCQkocmVnNTNoICYgMHg4MCkgPyAiIE9WRVJSRC4iIDogIi4iICk7CisKKwlwICs9IHNwcmludGYocCwKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS1wcmltYXJ5IGNoYW5uZWwiCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tc2Vjb25kYXJ5IGNoYW5uZWwiCisJCSItLS0tLS0tLS1cblxuIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4MDksICZyZWc1M2gpOworCXAgKz0gc3ByaW50ZihwLAorCQkiY2hhbm5lbCBzdGF0dXM6ICAgICAgICVzIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkocmVnNTNoICYgMHgyMCkgPyAiT24gIiA6ICJPZmYiLAorCQkocmVnNTNoICYgMHgxMCkgPyAiT24gIiA6ICJPZmYiICk7CisKKwlwICs9IHNwcmludGYocCwKKwkJImJvdGggY2hhbm5lbHMgdG9ndGg6ICAlcyIKKwkJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJKGMwJjB4ODApID8gIk5vICIgOiAiWWVzIiwKKwkJKGMxJjB4ODApID8gIk5vICIgOiAiWWVzIiApOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDc2LCAmcmVnNTNoKTsKKwlwICs9IHNwcmludGYocCwKKwkJIkNoYW5uZWwgc3RhdGU6ICAgICAgICAlcyAgICAgICAgICAgICAgICAgICAgJXNcbiIsCisJCWNoYW5uZWxfc3RhdHVzW3JlZzUzaCAmIDB4MDddLAorCQljaGFubmVsX3N0YXR1c1socmVnNTNoICYgMHg3MCkgPj4gNF0gKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg1OCwgJnJlZzV4aCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDVjLCAmcmVnNXloKTsKKwlwICs9IHNwcmludGYocCwKKwkJIkFkZC4gU2V0dXAgVGltaW5nOiAgICAlZFQiCisJCSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkVFxuIiwKKwkJKHJlZzV4aCAmIDB4MDcpID8gKHJlZzV4aCAmIDB4MDcpIDogOCwKKwkJKHJlZzV5aCAmIDB4MDcpID8gKHJlZzV5aCAmIDB4MDcpIDogOCApOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDU5LCAmcmVnNXhoKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NWQsICZyZWc1eWgpOworCXAgKz0gc3ByaW50ZihwLAorCQkiQ29tbWFuZCBBY3QuIENvdW50OiAgICVkVCIKKwkJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRUXG4iCisJCSJDb21tYW5kIFJlYy4gQ291bnQ6ICAgJWRUIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkVFxuXG4iLAorCQkocmVnNXhoICYgMHg3MCkgPyAoKHJlZzV4aCAmIDB4NzApID4+IDQpIDogOCwKKwkJKHJlZzV5aCAmIDB4NzApID8gKChyZWc1eWggJiAweDcwKSA+PiA0KSA6IDgsIAorCQkocmVnNXhoICYgMHgwZikgPyAocmVnNXhoICYgMHgwZikgOiAxNiwKKwkJKHJlZzV5aCAmIDB4MGYpID8gKHJlZzV5aCAmIDB4MGYpIDogMTYgKTsKKworCXAgKz0gc3ByaW50ZihwLAorCQkiLS0tLS0tLS0tLS0tLS0tLWRyaXZlMC0tLS0tLS0tLS0tZHJpdmUxIgorCQkiLS0tLS0tLS0tLS0tZHJpdmUwLS0tLS0tLS0tLS1kcml2ZTEtLS0tLS1cblxuIik7CisJcCArPSBzcHJpbnRmKHAsCisJCSJETUEgZW5hYmxlZDogICAgICAlcyAgICAgICAgICAgICAgJXMiCisJCSIgICAgICAgICAgICAgICAlcyAgICAgICAgICAgICAgJXNcbiIsCisJCShjMCYweDIwKSA/ICJZZXMiIDogIk5vICIsCisJCShjMCYweDQwKSA/ICJZZXMiIDogIk5vICIsCisJCShjMSYweDIwKSA/ICJZZXMiIDogIk5vICIsCisJCShjMSYweDQwKSA/ICJZZXMiIDogIk5vICIgKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg1NCwgJnJlZzV4aCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDU1LCAmcmVnNXloKTsKKwlxID0gIkZJRk8gdGhyZXNob2xkOiAgICUyZCBXb3JkcyAgICAgICAgICUyZCBXb3JkcyIKKwkJIiAgICAgICAgICAlMmQgV29yZHMgICAgICAgICAlMmQgV29yZHNcbiI7CisJaWYgKHJldiA8IDB4YzEpIHsKKwkJaWYgKChyZXYgPT0gMHgyMCkgJiYKKwkJICAgIChwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NGYsICZ0bXApLCAodG1wICY9IDB4MjApKSkgeworCQkJcCArPSBzcHJpbnRmKHAsIHEsIDgsIDgsIDgsIDgpOworCQl9IGVsc2UgeworCQkJcCArPSBzcHJpbnRmKHAsIHEsCisJCQkJKHJlZzV4aCAmIDB4MDMpICsgMTIsCisJCQkJKChyZWc1eGggJiAweDMwKT4+NCkgKyAxMiwKKwkJCQkocmVnNXloICYgMHgwMykgKyAxMiwKKwkJCQkoKHJlZzV5aCAmIDB4MzApPj40KSArIDEyICk7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgdDEgPSAodG1wID0gKHJlZzV4aCAmIDB4MDMpKSA/ICh0bXAgPDwgMykgOiA0OworCQlpbnQgdDIgPSAodG1wID0gKChyZWc1eGggJiAweDMwKT4+NCkpID8gKHRtcCA8PCAzKSA6IDQ7CisJCWludCB0MyA9ICh0bXAgPSAocmVnNXloICYgMHgwMykpID8gKHRtcCA8PCAzKSA6IDQ7CisJCWludCB0NCA9ICh0bXAgPSAoKHJlZzV5aCAmIDB4MzApPj40KSkgPyAodG1wIDw8IDMpIDogNDsKKwkJcCArPSBzcHJpbnRmKHAsIHEsIHQxLCB0MiwgdDMsIHQ0KTsKKwl9CisKKyNpZiAwCisJcCArPSBzcHJpbnRmKHAsIAorCQkiRklGTyB0aHJlc2hvbGQ6ICAgJTJkIFdvcmRzICAgICAgICAgJTJkIFdvcmRzIgorCQkiICAgICAgICAgICUyZCBXb3JkcyAgICAgICAgICUyZCBXb3Jkc1xuIiwKKwkJKHJlZzV4aCAmIDB4MDMpICsgMTIsCisJCSgocmVnNXhoICYgMHgzMCk+PjQpICsgMTIsCisJCShyZWc1eWggJiAweDAzKSArIDEyLAorCQkoKHJlZzV5aCAmIDB4MzApPj40KSArIDEyICk7CisjZW5kaWYKKworCXAgKz0gc3ByaW50ZihwLAorCQkiRklGTyBtb2RlOiAgICAgICAgJXMgICAgICAgICAlcyAgICAgICAgICAlcyAgICAgICAgICVzXG4iLAorCQlmaWZvWygocmVnNXhoICYgMHgwYykgPj4gMildLAorCQlmaWZvWygocmVnNXhoICYgMHhjMCkgPj4gNildLAorCQlmaWZvWygocmVnNXloICYgMHgwYykgPj4gMildLAorCQlmaWZvWygocmVnNXloICYgMHhjMCkgPj4gNildICk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NWEsICZyZWc1eGgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg1YiwgJnJlZzV4aDEpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg1ZSwgJnJlZzV5aCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDVmLCAmcmVnNXloMSk7CisKKwlwICs9IHNwcmludGYocCwvKgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tZHJpdmUwLS0tLS0tLS0tLS1kcml2ZTEiCisJCSItLS0tLS0tLS0tLS1kcml2ZTAtLS0tLS0tLS0tLWRyaXZlMS0tLS0tLVxuIikqLworCQkiRHQgUlcgYWN0LiBDbnQgICAgJTJkVCAgICAgICAgICAgICAgJTJkVCIKKwkJIiAgICAgICAgICAgICAgICUyZFQgICAgICAgICAgICAgICUyZFRcbiIKKwkJIkR0IFJXIHJlYy4gQ250ICAgICUyZFQgICAgICAgICAgICAgICUyZFQiCisJCSIgICAgICAgICAgICAgICAlMmRUICAgICAgICAgICAgICAlMmRUXG5cbiIsCisJCShyZWc1eGggJiAweDcwKSA/ICgocmVnNXhoICYgMHg3MCkgPj4gNCkgOiA4LAorCQkocmVnNXhoMSAmIDB4NzApID8gKChyZWc1eGgxICYgMHg3MCkgPj4gNCkgOiA4LAorCQkocmVnNXloICYgMHg3MCkgPyAoKHJlZzV5aCAmIDB4NzApID4+IDQpIDogOCwKKwkJKHJlZzV5aDEgJiAweDcwKSA/ICgocmVnNXloMSAmIDB4NzApID4+IDQpIDogOCwKKwkJKHJlZzV4aCAmIDB4MGYpID8gKHJlZzV4aCAmIDB4MGYpIDogMTYsCisJCShyZWc1eGgxICYgMHgwZikgPyAocmVnNXhoMSAmIDB4MGYpIDogMTYsCisJCShyZWc1eWggJiAweDBmKSA/IChyZWc1eWggJiAweDBmKSA6IDE2LAorCQkocmVnNXloMSAmIDB4MGYpID8gKHJlZzV5aDEgJiAweDBmKSA6IDE2ICk7CisKKwlwICs9IHNwcmludGYocCwKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVURNQSBUaW1pbmdzIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NTYsICZyZWc1eGgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg1NywgJnJlZzV5aCk7CisJcCArPSBzcHJpbnRmKHAsCisJCSJVRE1BOiAgICAgICAgICAgICAlcyAgICAgICAgICAgICAgICVzIgorCQkiICAgICAgICAgICAgICAgICVzICAgICAgICAgICAgICAgJXNcbiIKKwkJIlVETUEgdGltaW5nczogICAgICVzICAgICAgICAgICAgICVzIgorCQkiICAgICAgICAgICAgICAlcyAgICAgICAgICAgICAlc1xuXG4iLAorCQkocmVnNXhoICYgMHgwOCkgPyAiT0siIDogIk5vIiwKKwkJKHJlZzV4aCAmIDB4ODApID8gIk9LIiA6ICJObyIsCisJCShyZWc1eWggJiAweDA4KSA/ICJPSyIgOiAiTm8iLAorCQkocmVnNXloICYgMHg4MCkgPyAiT0siIDogIk5vIiwKKwkJdWRtYVRbKHJlZzV4aCAmIDB4MDcpXSwKKwkJdWRtYVRbKHJlZzV4aCAmIDB4NzApID4+IDRdLAorCQl1ZG1hVFtyZWc1eWggJiAweDA3XSwKKwkJdWRtYVRbKHJlZzV5aCAmIDB4NzApID4+IDRdICk7CisKKwlyZXR1cm4gcC1idWZmZXI7IC8qID0+IG11c3QgYmUgbGVzcyB0aGFuIDRrISAqLworfQorI2VuZGlmICAvKiBkZWZpbmVkKERJU1BMQVlfQUxJX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICovCisKKy8qKgorICoJYWxpMTV4M190dW5lX2RyaXZlCS0Jc2V0IHVwIGEgZHJpdmUKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoJQHBpbzogdW51c2VkCisgKgorICoJU2VsZWN0IHRoZSBiZXN0IFBJTyB0aW1pbmcgZm9yIHRoZSBkcml2ZSBpbiBxdWVzdGlvbi4gVGhlbgorICoJcHJvZ3JhbSB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkcml2ZSBzZXQgdXAKKyAqLworIAorc3RhdGljIHZvaWQgYWxpMTV4M190dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfcGlvX2RhdGFfdCBkOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwlpbnQgc190aW1lLCBhX3RpbWUsIGNfdGltZTsKKwl1OCBzX2NsYywgYV9jbGMsIHJfY2xjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJ1c19zcGVlZCA9IHN5c3RlbV9idXNfY2xvY2soKTsKKwlpbnQgcG9ydCA9IGh3aWYtPmNoYW5uZWwgPyAweDVjIDogMHg1ODsKKwlpbnQgcG9ydEZJRk8gPSBod2lmLT5jaGFubmVsID8gMHg1NSA6IDB4NTQ7CisJdTggY2RfZG1hX2ZpZm8gPSAwOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAxOworCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDUsICZkKTsKKwlzX3RpbWUgPSBpZGVfcGlvX3RpbWluZ3NbcGlvXS5zZXR1cF90aW1lOworCWFfdGltZSA9IGlkZV9waW9fdGltaW5nc1twaW9dLmFjdGl2ZV90aW1lOworCWlmICgoc19jbGMgPSAoc190aW1lICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDApID49IDgpCisJCXNfY2xjID0gMDsKKwlpZiAoKGFfY2xjID0gKGFfdGltZSAqIGJ1c19zcGVlZCArIDk5OSkgLyAxMDAwKSA+PSA4KQorCQlhX2NsYyA9IDA7CisJY190aW1lID0gaWRlX3Bpb190aW1pbmdzW3Bpb10uY3ljbGVfdGltZTsKKworI2lmIDAKKwlpZiAoKHJfY2xjID0gKChjX3RpbWUgLSBzX3RpbWUgLSBhX3RpbWUpICogYnVzX3NwZWVkICsgOTk5KSAvIDEwMDApID49IDE2KQorCQlyX2NsYyA9IDA7CisjZW5kaWYKKworCWlmICghKHJfY2xjID0gKGNfdGltZSAqIGJ1c19zcGVlZCArIDk5OSkgLyAxMDAwIC0gYV9jbGMgLSBzX2NsYykpIHsKKwkJcl9jbGMgPSAxOworCX0gZWxzZSB7CisJCWlmIChyX2NsYyA+PSAxNikKKwkJCXJfY2xjID0gMDsKKwl9CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQorCS8qIAorCSAqIFBJTyBtb2RlID0+IEFUQSBGSUZPIG9uLCBBVEFQSSBGSUZPIG9mZgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcG9ydEZJRk8sICZjZF9kbWFfZmlmbyk7CisJaWYgKGRyaXZlLT5tZWRpYT09aWRlX2Rpc2spIHsKKwkJaWYgKHVuaXQpIHsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHBvcnRGSUZPLCAoY2RfZG1hX2ZpZm8gJiAweDBGKSB8IDB4NTApOworCQl9IGVsc2UgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcG9ydEZJRk8sIChjZF9kbWFfZmlmbyAmIDB4RjApIHwgMHgwNSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodW5pdCkgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcG9ydEZJRk8sIGNkX2RtYV9maWZvICYgMHgwRik7CisJCX0gZWxzZSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwb3J0RklGTywgY2RfZG1hX2ZpZm8gJiAweEYwKTsKKwkJfQorCX0KKwkKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwb3J0LCBzX2NsYyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcG9ydCtkcml2ZS0+c2VsZWN0LmIudW5pdCsyLCAoYV9jbGMgPDwgNCkgfCByX2NsYyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyoKKwkgKiBzZXR1cCAgIGFjdGl2ZSAgcmVjCisJICogeyA3MCwgICAxNjUsICAgIDM2NSB9LCAgIFBJTyBNb2RlIDAKKwkgKiB7IDUwLCAgIDEyNSwgICAgMjA4IH0sICAgUElPIE1vZGUgMQorCSAqIHsgMzAsICAgMTAwLCAgICAxMTAgfSwgICBQSU8gTW9kZSAyCisJICogeyAzMCwgICA4MCwgICAgIDcwICB9LCAgIFBJTyBNb2RlIDMgd2l0aCBJT1JEWQorCSAqIHsgMjUsICAgNzAsICAgICAyNSAgfSwgICBQSU8gTW9kZSA0IHdpdGggSU9SRFkgIG5zCisJICogeyAyMCwgICA1MCwgICAgIDMwICB9ICAgIFBJTyBNb2RlIDUgd2l0aCBJT1JEWSAobm9uc3RhbmRhcmQpCisJICovCisKK30KKworLyoqCisgKglhbGkxNXgzX2Nhbl91bHRyYQktCWNoZWNrIGZvciB1bHRyYSBETUEgc3VwcG9ydAorICoJQGRyaXZlOiBkcml2ZSB0byBkbyB0aGUgY2hlY2sKKyAqCisgKglDaGVjayB0aGUgZHJpdmUgYW5kIGNvbnRyb2xsZXIgcmV2aXNpb25zLiBSZXR1cm4gMCBpZiBVRE1BIGlzCisgKglub3QgYXZhaWxhYmxlLCBvciAxIGlmIFVETUEgY2FuIGJlIHVzZWQuIFRoZSBhY3R1YWwgcnVsZXMgZm9yCisgKgl0aGUgQUxpIGFyZQorICoJCU5vIFVETUEgb24gcmV2aXNpb25zIDw9IDB4MjAKKyAqCQlEaXNrIG9ubHkgZm9yIHJldmlzaW9ucyA8IDB4QzIKKyAqCQlOb3QgV0RDIGRyaXZlcyBmb3IgcmV2aXNpb25zIDwgMHhDMgorICoKKyAqCUZJWE1FOiBXREMgaWZkZWYgbmVlZHMgdG8gZGllCisgKi8KKyAKK3N0YXRpYyB1OCBhbGkxNXgzX2Nhbl91bHRyYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworI2lmbmRlZiBDT05GSUdfV0RDX0FMSTE1WDMKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisjZW5kaWYgLyogQ09ORklHX1dEQ19BTEkxNVgzICovCisKKwlpZiAobTUyMjlfcmV2aXNpb24gPD0gMHgyMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKChtNTIyOV9yZXZpc2lvbiA8IDB4QzIpICYmCisjaWZuZGVmIENPTkZJR19XRENfQUxJMTVYMworCQkgICAoKGNoaXBfaXNfMTU0M2NfZSAmJiBzdHJzdHIoaWQtPm1vZGVsLCAiV0RDICIpKSB8fAorCQkgICAgKGRyaXZlLT5tZWRpYSE9aWRlX2Rpc2spKSkgeworI2Vsc2UgLyogQ09ORklHX1dEQ19BTEkxNVgzICovCisJCSAgIChkcml2ZS0+bWVkaWEhPWlkZV9kaXNrKSkgeworI2VuZGlmIC8qIENPTkZJR19XRENfQUxJMTVYMyAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qKgorICoJYWxpMTV4M19yYXRlbWFzawktCWdlbmVyYXRlIERNQSBtb2RlIGxpc3QKKyAqCUBkcml2ZTogZHJpdmUgdG8gY29tcHV0ZSBhZ2FpbnN0CisgKgorICoJR2VuZXJhdGUgYSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgRE1BIG1vZGVzIGZvciB0aGUgZHJpdmUuIAorICoJRklYTUU6IHRoaXMgZnVuY3Rpb24gY29udGFpbnMgbG90cyBvZiBib2d1cyBtYXNraW5nIHdlIGNhbiBkdW1wCisgKgorICoJUmV0dXJuIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBtb2RlIChVRE1BMzMsIFVETUE2NiwgVURNQTEwMCwuLikKKyAqLworIAorc3RhdGljIHU4IGFsaTE1eDNfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBtb2RlID0gMCwgY2FuX3VsdHJhCT0gYWxpMTV4M19jYW5fdWx0cmEoZHJpdmUpOworCisJaWYgKG01MjI5X3JldmlzaW9uID4gMHhDNCAmJiBjYW5fdWx0cmEpIHsKKwkJbW9kZSA9IDQ7CisJfSBlbHNlIGlmIChtNTIyOV9yZXZpc2lvbiA9PSAweEM0ICYmIGNhbl91bHRyYSkgeworCQltb2RlID0gMzsKKwl9IGVsc2UgaWYgKG01MjI5X3JldmlzaW9uID49IDB4QzIgJiYgY2FuX3VsdHJhKSB7CisJCW1vZGUgPSAyOworCX0gZWxzZSBpZiAoY2FuX3VsdHJhKSB7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICoJSWYgdGhlIGRyaXZlIHNlZXMgbm8gc3VpdGFibGUgY2FibGUgdGhlbiBVRE1BIDMzCisJICoJaXMgdGhlIGhpZ2hlc3QgcGVybWl0dGVkIG1vZGUKKwkgKi8KKwkgCisJaWYgKCFlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpKQorCQltb2RlID0gbWluKG1vZGUsICh1OCkxKTsKKwlyZXR1cm4gbW9kZTsKK30KKworLyoqCisgKglhbGkxNXgzX3R1bmVfY2hpcHNldAktCXNldCB1cCBjaGlzZXQgZm9yIG5ldyBzcGVlZAorICoJQGRyaXZlOiBkcml2ZSB0byBjb25maWd1cmUgZm9yCisgKglAeGZlcnNwZWVkOiBkZXNpcmVkIHNwZWVkCisgKgorICoJQ29uZmlndXJlIHRoZSBoYXJkd2FyZSBmb3IgdGhlIGRlc2lyZWQgSURFIHRyYW5zZmVyIG1vZGUuCisgKglXZSBhbHNvIGRvIHRoZSBuZWVkZWQgZHJpdmUgY29uZmlndXJhdGlvbiB0aHJvdWdoIGhlbHBlcnMKKyAqLworIAorc3RhdGljIGludCBhbGkxNXgzX3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXU4IHNwZWVkCQk9IGlkZV9yYXRlX2ZpbHRlcihhbGkxNXgzX3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKwl1OCBzcGVlZDEJCT0gc3BlZWQ7CisJdTggdW5pdAkJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggdG1wYnl0ZQkJPSAweDAwOworCWludCBtNTIyOV91ZG1hCQk9IChod2lmLT5jaGFubmVsKSA/IDB4NTcgOiAweDU2OworCisJaWYgKHNwZWVkID09IFhGRVJfVURNQV82KQorCQlzcGVlZDEgPSAweDQ3OworCisJaWYgKHNwZWVkIDwgWEZFUl9VRE1BXzApIHsKKwkJdTggdWx0cmFfZW5hYmxlCT0gKHVuaXQpID8gMHg3ZiA6IDB4Zjc7CisJCS8qCisJCSAqIGNsZWFyICJ1bHRyYSBlbmFibGUiIGJpdAorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBtNTIyOV91ZG1hLCAmdG1wYnl0ZSk7CisJCXRtcGJ5dGUgJj0gdWx0cmFfZW5hYmxlOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBtNTIyOV91ZG1hLCB0bXBieXRlKTsKKworCQlpZiAoc3BlZWQgPCBYRkVSX1NXX0RNQV8wKQorCQkJYWxpMTV4M190dW5lX2RyaXZlKGRyaXZlLCBzcGVlZCk7CisJfSBlbHNlIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBtNTIyOV91ZG1hLCAmdG1wYnl0ZSk7CisJCXRtcGJ5dGUgJj0gKDB4MGYgPDwgKCgxLXVuaXQpIDw8IDIpKTsKKwkJLyoKKwkJICogZW5hYmxlIHVsdHJhIGRtYSBhbmQgc2V0IHRpbWluZworCQkgKi8KKwkJdG1wYnl0ZSB8PSAoKDB4MDggfCAoKDQtc3BlZWQxKSYweDA3KSkgPDwgKHVuaXQgPDwgMikpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBtNTIyOV91ZG1hLCB0bXBieXRlKTsKKwkJaWYgKHNwZWVkID49IFhGRVJfVURNQV8zKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NGIsICZ0bXBieXRlKTsKKwkJCXRtcGJ5dGUgfD0gMTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGIsIHRtcGJ5dGUpOworCQl9CisJfQorCXJldHVybiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKK30KKworCisvKioKKyAqCWNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEJLQlzZXQgdXAgRE1BIG1vZGUKKyAqCUBkcml2ZTogZHJpdmUgdG8gY29uZmlndXJlIGZvcgorICoKKyAqCVBsYWNlIGEgZHJpdmUgaW50byBETUEgbW9kZSBhbmQgdHVuZSB0aGUgY2hpcHNldCBmb3IKKyAqCXRoZSBzZWxlY3RlZCBzcGVlZC4KKyAqCisgKglSZXR1cm5zIHRydWUgaWYgRE1BIG1vZGUgY2FuIGJlIHVzZWQKKyAqLworIAorc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBhbGkxNXgzX3JhdGVtYXNrKGRyaXZlKSk7CisKKwlpZiAoIShzcGVlZCkpCisJCXJldHVybiAwOworCisJKHZvaWQpIGFsaTE1eDNfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworLyoqCisgKglhbGkxNXgzX2NvbmZpZ19kcml2ZV9mb3JfZG1hCS0JY29uZmlndXJlIGZvciBETUEKKyAqCUBkcml2ZTogZHJpdmUgdG8gY29uZmlndXJlCisgKgorICoJQ29uZmlndXJlIGEgZHJpdmUgZm9yIERNQSBvcGVyYXRpb24uIElmIERNQSBpcyBub3QgcG9zc2libGUgd2UKKyAqCWRyb3AgdGhlIGRyaXZlIGludG8gUElPIG1vZGUgaW5zdGVhZC4KKyAqCisgKglGSVhNRTogZXhhY3RseSB3aGF0IGFyZSB3ZSB0cnlpbmcgdG8gcmV0dXJuIGhlcmUKKyAqLworIAorc3RhdGljIGludCBhbGkxNXgzX2NvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJaWYgKChtNTIyOV9yZXZpc2lvbjw9MHgyMCkgJiYgKGRyaXZlLT5tZWRpYSE9aWRlX2Rpc2spKQorCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisKKwlkcml2ZS0+aW5pdF9zcGVlZCA9IDA7CisKKwlpZiAoKGlkICE9IE5VTEwpICYmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAhPSAwKSAmJiBkcml2ZS0+YXV0b2RtYSkgeworCQkvKiBDb25zdWx0IHRoZSBsaXN0IG9mIGtub3duICJiYWQiIGRyaXZlcyAqLworCQlpZiAoX19pZGVfZG1hX2JhZF9kcml2ZShkcml2ZSkpCisJCQlnb3RvIGF0YV9waW87CisJCWlmICgoaWQtPmZpZWxkX3ZhbGlkICYgNCkgJiYgKG01MjI5X3JldmlzaW9uID49IDB4QzIpKSB7CisJCQlpZiAoaWQtPmRtYV91bHRyYSAmIGh3aWYtPnVsdHJhX21hc2spIHsKKwkJCQkvKiBGb3JjZSBpZiBDYXBhYmxlIFVsdHJhRE1BICovCisJCQkJaW50IGRtYSA9IGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpOworCQkJCWlmICgoaWQtPmZpZWxkX3ZhbGlkICYgMikgJiYgIWRtYSkKKwkJCQkJZ290byB0cnlfZG1hX21vZGVzOworCQkJfQorCQl9IGVsc2UgaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpIHsKK3RyeV9kbWFfbW9kZXM6CisJCQlpZiAoKGlkLT5kbWFfbXdvcmQgJiBod2lmLT5td2RtYV9tYXNrKSB8fAorCQkJICAgIChpZC0+ZG1hXzF3b3JkICYgaHdpZi0+c3dkbWFfbWFzaykpIHsKKwkJCQkvKiBGb3JjZSBpZiBDYXBhYmxlIHJlZ3VsYXIgRE1BIG1vZGVzICovCisJCQkJaWYgKCFjb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKKwkJCQkJZ290byBub19kbWFfc2V0OworCQkJfQorCQl9IGVsc2UgaWYgKF9faWRlX2RtYV9nb29kX2RyaXZlKGRyaXZlKSAmJgorCQkJICAgKGlkLT5laWRlX2RtYV90aW1lIDwgMTUwKSkgeworCQkJLyogQ29uc3VsdCB0aGUgbGlzdCBvZiBrbm93biAiZ29vZCIgZHJpdmVzICovCisJCQlpZiAoIWNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorCQkJCWdvdG8gbm9fZG1hX3NldDsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gYXRhX3BpbzsKKwkJfQorCX0gZWxzZSB7CithdGFfcGlvOgorCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgMjU1KTsKK25vX2RtYV9zZXQ6CisJCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwl9CisJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworfQorCisvKioKKyAqCWFsaTE1eDNfZG1hX3NldHVwCS0JYmVnaW4gYSBETUEgcGhhc2UKKyAqCUBkcml2ZToJdGFyZ2V0IGRldmljZQorICoKKyAqCVJldHVybnMgMSBpZiB0aGUgRE1BIGNhbm5vdCBiZSBwZXJmb3JtZWQsIHplcm8gb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IGFsaTE1eDNfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAobTUyMjlfcmV2aXNpb24gPCAweEMyICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCQlpZiAocnFfZGF0YV9kaXIoZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxKSkKKwkJCXJldHVybiAxOwkvKiB0cnkgUElPIGluc3RlYWQgb2YgRE1BICovCisJfQorCXJldHVybiBpZGVfZG1hX3NldHVwKGRyaXZlKTsKK30KKworLyoqCisgKglpbml0X2NoaXBzZXRfYWxpMTV4MwktCUluaXRpYWxpc2UgYW4gQUxpIElERSBjb250cm9sbGVyCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAbmFtZTogTmFtZSBvZiB0aGUgY29udHJvbGxlcgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIEFMSSBJREUgY29udHJvbGxlciBhbmQgd2hlcmUgCisgKglhcHByb3ByaWF0ZSBhbHNvIHNldHMgdXAgdGhlIDE1MzMgc291dGhicmlkZ2UuCisgKi8KKyAgCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfYWxpMTV4MyAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHRtcGJ5dGU7CisJc3RydWN0IHBjaV9kZXYgKm5vcnRoID0gcGNpX2ZpbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJm01MjI5X3JldmlzaW9uKTsKKworCWlzYV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMywgTlVMTCk7CisKKyNpZiBkZWZpbmVkKERJU1BMQVlfQUxJX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisJaWYgKCFhbGlfcHJvYykgeworCQlhbGlfcHJvYyA9IDE7CisJCWJtaWRlX2RldiA9IGRldjsKKwkJaWRlX3BjaV9jcmVhdGVfaG9zdF9wcm9jKCJhbGkiLCBhbGlfZ2V0X2luZm8pOworCX0KKyNlbmRpZiAgLyogZGVmaW5lZChESVNQTEFZX0FMSV9USU1JTkdTKSAmJiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAqLworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKG01MjI5X3JldmlzaW9uIDwgMHhDMikgeworCQkvKgorCQkgKiByZXZpc2lvbiAweDIwICgxNTQzLUUsIDE1NDMtRikKKwkJICogcmV2aXNpb24gMHhDMCwgMHhDMSAoMTU0M0MtQywgMTU0M0MtRCwgMTU0M0MtRSkKKwkJICogY2xlYXIgQ0QtUk9NIERNQSB3cml0ZSBiaXQsIG01MjI5LCAweDRiLCBiaXQgNworCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmdG1wYnl0ZSk7CisJCS8qCisJCSAqIGNsZWFyIGJpdCA3CisJCSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDRiLCB0bXBieXRlICYgMHg3Rik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAxNTQzQy1CPywgMTUzNSwgMTUzNUQsIDE1NTMKKwkgKiBOb3RlIDE6IG5vdCBhbGwgIm1vdGhlcmJvYXJkIiBzdXBwb3J0IHRoaXMgZGV0ZWN0aW9uCisJICogTm90ZSAyOiBpZiBubyB1ZG1hIDY2IGRldmljZSwgdGhlIGRldGVjdGlvbiBtYXkgImVycm9yIi4KKwkgKiAgICAgICAgIGJ1dCBpbiB0aGlzIGNhc2UsIHdlIHdpbGwgbm90IHNldCB0aGUgZGV2aWNlIHRvCisJICogICAgICAgICB1bHRyYSA2NiwgdGhlIGRldGVjdGlvbiByZXN1bHQgaXMgbm90IGltcG9ydGFudAorCSAqLworCisJLyoKKwkgKiBlbmFibGUgIkNhYmxlIERldGVjdGlvbiIsIG01MjI5LCAweDRiLCBiaXQzCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmdG1wYnl0ZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YiwgdG1wYnl0ZSB8IDB4MDgpOworCisJLyoKKwkgKiBXZSBzaG91bGQgb25seSB0dW5lIHRoZSAxNTMzIGVuYWJsZSBpZiB3ZSBhcmUgdXNpbmcgYW4gQUxpCisJICogTm9ydGggYnJpZGdlLiBXZSBtaWdodCBoYXZlIG5vIG5vcnRoIGZvdW5kIG9uIHNvbWUgemFueQorCSAqIGJveCB3aXRob3V0IGEgZGV2aWNlIGF0IDA6MC4wLiBUaGUgQUxpIGJyaWRnZSB3aWxsIGJlIGF0CisJICogMDowLjAgc28gaWYgd2UgZGlkbid0IGZpbmQgb25lIHdlIGtub3cgd2hhdCBpcyBjb29raW5nLgorCSAqLworCWlmIChub3J0aCAmJiBub3J0aC0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQUwpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICAgICAgcmV0dXJuIDA7CisJfQorCisJaWYgKG01MjI5X3JldmlzaW9uIDwgMHhDNSAmJiBpc2FfZGV2KQorCXsJCisJCS8qCisJCSAqIHNldCBzb3V0aC1icmlkZ2UncyBlbmFibGUgYml0LCBtMTUzMywgMHg3OQorCQkgKi8KKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfZGV2LCAweDc5LCAmdG1wYnl0ZSk7CisJCWlmIChtNTIyOV9yZXZpc2lvbiA9PSAweEMyKSB7CisJCQkvKgorCQkJICogMTU0M0MtQjAgKG0xNTMzLCAweDc5LCBiaXQgMikKKwkJCSAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9kZXYsIDB4NzksIHRtcGJ5dGUgfCAweDA0KTsKKwkJfSBlbHNlIGlmIChtNTIyOV9yZXZpc2lvbiA+PSAweEMzKSB7CisJCQkvKgorCQkJICogMTU1My8xNTM1IChtMTUzMywgMHg3OSwgYml0IDEpCisJCQkgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfZGV2LCAweDc5LCB0bXBieXRlIHwgMHgwMik7CisJCX0KKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YTY2X2FsaTE1eDMJLQljaGVjayBmb3IgVURNQSA2NiBzdXBwb3J0CisgKglAaHdpZjogSURFIGludGVyZmFjZQorICoKKyAqCVRoaXMgY2hlY2tzIGlmIHRoZSBjb250cm9sbGVyIGFuZCB0aGUgY2FibGUgYXJlIGNhcGFibGUKKyAqCW9mIFVETUE2NiB0cmFuc2ZlcnMuIEl0IGRvZXNuJ3QgY2hlY2sgdGhlIGRyaXZlcy4KKyAqCUJ1dCBzZWUgbm90ZSAyIGJlbG93IQorICoKKyAqCUZJWE1FOiBmcm9icyBiaXRzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIG9uIG5ld2VyIEFMaSBkZXZpY2VhCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgYXRhNjYJPSAwOworCXU4IGNhYmxlXzgwX3BpblsyXQk9IHsgMCwgMCB9OworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB0bXBieXRlOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKG01MjI5X3JldmlzaW9uID49IDB4QzIpIHsKKwkJLyoKKwkJICogVWx0cmE2NiBjYWJsZSBkZXRlY3Rpb24gKGZyb20gSG9zdCBWaWV3KQorCQkgKiBtNTIyOSwgMHg0YSwgYml0MDogcHJpbWFyeSwgYml0MTogc2Vjb25kYXJ5IDgwIHBpbgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRhLCAmdG1wYnl0ZSk7CisJCS8qCisJCSAqIDB4NGEsIGJpdDAgaXMgMCA9PiBwcmltYXJ5IGNoYW5uZWwKKwkJICogaGFzIDgwLXBpbiAoZnJvbSBob3N0IHZpZXcpCisJCSAqLworCQlpZiAoISh0bXBieXRlICYgMHgwMSkpIGNhYmxlXzgwX3BpblswXSA9IDE7CisJCS8qCisJCSAqIDB4NGEsIGJpdDEgaXMgMCA9PiBzZWNvbmRhcnkgY2hhbm5lbAorCQkgKiBoYXMgODAtcGluIChmcm9tIGhvc3QgdmlldykKKwkJICovCisJCWlmICghKHRtcGJ5dGUgJiAweDAyKSkgY2FibGVfODBfcGluWzFdID0gMTsKKwkJLyoKKwkJICogQWxsb3cgYXRhNjYgaWYgY2FibGUgb2YgY3VycmVudCBjaGFubmVsIGhhcyA4MCBwaW5zCisJCSAqLworCQlhdGE2NiA9IChod2lmLT5jaGFubmVsKT9jYWJsZV84MF9waW5bMV06Y2FibGVfODBfcGluWzBdOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGNoZWNrIG0xNTMzLCAweDVlLCBiaXQgMX40ID09IDEwMDEgPT4gJiAwMDAxMTExMCA9IDAwMDEwMDEwCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfZGV2LCAweDVlLCAmdG1wYnl0ZSk7CisJCWNoaXBfaXNfMTU0M2NfZSA9ICgodG1wYnl0ZSAmIDB4MWUpID09IDB4MTIpID8gMTogMDsKKwl9CisKKwkvKgorCSAqIENEX1JPTSBETUEgb24gKG01MjI5LCAweDUzLCBiaXQwKQorCSAqICAgICAgRW5hYmxlIHRoaXMgYml0IGV2ZW4gaWYgd2Ugd2FudCB0byB1c2UgUElPCisJICogUElPIEZJRk8gb2ZmIChtNTIyOSwgMHg1MywgYml0MSkKKwkgKiAgICAgIFRoZSBoYXJkd2FyZSB3aWxsIHVzZSAweDU0aCBhbmQgMHg1NWggdG8gY29udHJvbCBQSU8gRklGTworCSAqCShOb3Qgb24gbGF0ZXIgZGV2aWNlcyBpdCBzZWVtcykKKwkgKgorCSAqCTB4NTMgY2hhbmdlcyBtZWFuaW5nIG9uIGxhdGVyIHJldnMgLSB3ZSBtdXN0IG5vIHRvdWNoCisJICoJYml0IDEgb24gdGhlbS4gTmVlZCB0byBjaGVjayBpZiAweDIwIGlzIHRoZSByaWdodCBicmVhaworCSAqLworCSAKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZ0bXBieXRlKTsKKwkKKwlpZihtNTIyOV9yZXZpc2lvbiA8PSAweDIwKQorCQl0bXBieXRlID0gKHRtcGJ5dGUgJiAofjB4MDIpKSB8IDB4MDE7CisJZWxzZQorCQl0bXBieXRlIHw9IDB4MDE7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUzLCB0bXBieXRlKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybihhdGE2Nik7Cit9CisKKy8qKgorICoJaW5pdF9od2lmX2NvbW1vbl9hbGkxNXgzCS0JU2V0IHVwIEFMSSBJREUgaGFyZHdhcmUKKyAqCUBod2lmOiBJREUgaW50ZXJmYWNlCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgSURFIHN0cnVjdHVyZSBzaWRlIG9mIHRoZSBBTGkgMTV4MyBkcml2ZXIuCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfY29tbW9uX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YXV0b2RtYSA9IDA7CisJaHdpZi0+dHVuZXByb2MgPSAmYWxpMTV4M190dW5lX2RyaXZlOworCWh3aWYtPnNwZWVkcHJvYyA9ICZhbGkxNXgzX3R1bmVfY2hpcHNldDsKKworCS8qIGRvbid0IHVzZSBMQkE0OCBETUEgb24gQUxpIGRldmljZXMgYmVmb3JlIHJldiAweEM1ICovCisJaHdpZi0+bm9fbGJhNDhfZG1hID0gKG01MjI5X3JldmlzaW9uIDw9IDB4QzQpID8gMSA6IDA7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCisJaWYgKG01MjI5X3JldmlzaW9uID4gMHgyMCkKKwkJaHdpZi0+dWx0cmFfbWFzayA9IDB4N2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7CisKKyAgICAgICAgaWYgKG01MjI5X3JldmlzaW9uID49IDB4MjApIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIE0xNTQzQyBvciBuZXdlciBmb3IgRE1BaW5nCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaHdpZi0+aWRlX2RtYV9jaGVjayA9ICZhbGkxNXgzX2NvbmZpZ19kcml2ZV9mb3JfZG1hOworCQlod2lmLT5kbWFfc2V0dXAgPSAmYWxpMTV4M19kbWFfc2V0dXA7CisJCWlmICghbm9hdXRvZG1hKQorCQkJaHdpZi0+YXV0b2RtYSA9IDE7CisJCWlmICghKGh3aWYtPnVkbWFfZm91cikpCisJCQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9hbGkxNXgzKGh3aWYpOworCX0KKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCisvKioKKyAqCWluaXRfaHdpZl9hbGkxNXgzCS0JSW5pdGlhbGl6ZSB0aGUgQUxJIElERSB4ODYgc3R1ZmYKKyAqCUBod2lmOiBpbnRlcmZhY2UgdG8gY29uZmlndXJlCisgKgorICoJT2J0YWluIHRoZSBJUlEgdGFibGVzIGZvciBhbiBBTGkgYmFzZWQgSURFIHNvbHV0aW9uIG9uIHRoZSBQQworICoJY2xhc3MgcGxhdGZvcm1zLiBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUKKyAqCVNwYXJjIHN5c3RlbXMKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTggaWRlaWMsIGlubWlyOworCXM4IGlycV9yb3V0aW5nX3RhYmxlW10gPSB7IC0xLCAgOSwgMywgMTAsIDQsICA1LCA3LCAgNiwKKwkJCQkgICAgICAxLCAxMSwgMCwgMTIsIDAsIDE0LCAwLCAxNSB9OworCWludCBpcnEgPSAtMTsKKworCWlmIChod2lmLT5wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTF9NNTIyOSkKKwkJaHdpZi0+aXJxID0gaHdpZi0+Y2hhbm5lbCA/IDE1IDogMTQ7CisKKwlpZiAoaXNhX2RldikgeworCQkvKgorCQkgKiByZWFkIElERSBpbnRlcmZhY2UgY29udHJvbAorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2RldiwgMHg1OCwgJmlkZWljKTsKKworCQkvKiBiaXQwLCBiaXQxICovCisJCWlkZWljID0gaWRlaWMgJiAweDAzOworCisJCS8qIGdldCBJUlEgZm9yIElERSBDb250cm9sbGVyICovCisJCWlmICgoaHdpZi0+Y2hhbm5lbCAmJiBpZGVpYyA9PSAweDAzKSB8fAorCQkgICAgKCFod2lmLT5jaGFubmVsICYmICFpZGVpYykpIHsKKwkJCS8qCisJCQkgKiBnZXQgU0lSUTEgcm91dGluZyB0YWJsZQorCQkJICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfZGV2LCAweDQ0LCAmaW5taXIpOworCQkJaW5taXIgPSBpbm1pciAmIDB4MGY7CisJCQlpcnEgPSBpcnFfcm91dGluZ190YWJsZVtpbm1pcl07CisJCX0gZWxzZSBpZiAoaHdpZi0+Y2hhbm5lbCAmJiAhKGlkZWljICYgMHgwMSkpIHsKKwkJCS8qCisJCQkgKiBnZXQgU0lSUTIgcm91dGluZyB0YWJsZQorCQkJICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfZGV2LCAweDc1LCAmaW5taXIpOworCQkJaW5taXIgPSBpbm1pciAmIDB4MGY7CisJCQlpcnEgPSBpcnFfcm91dGluZ190YWJsZVtpbm1pcl07CisJCX0KKwkJaWYoaXJxID49IDApCisJCQlod2lmLT5pcnEgPSBpcnE7CisJfQorCisJaW5pdF9od2lmX2NvbW1vbl9hbGkxNXgzKGh3aWYpOworfQorCisvKioKKyAqCWluaXRfZG1hX2FsaTE1eDMJLQlzZXQgdXAgRE1BIG9uIEFMaTE1eDMKKyAqCUBod2lmOiBJREUgaW50ZXJmYWNlCisgKglAZG1hYmFzZTogRE1BIGludGVyZmFjZSBiYXNlIFBDSSBhZGRyZXNzCisgKgorICoJU2V0IHVwIHRoZSBETUEgZnVuY3Rpb25hbGl0eSBvbiB0aGUgQUxpIDE1eDMuIEZvciB0aGUgQUxpCisgKgljb250cm9sbGVycyB0aGlzIGlzIGdlbmVyaWMgc28gd2UgY2FuIGxldCB0aGUgZ2VuZXJpYyBjb2RlIGRvCisgKgl0aGUgYWN0dWFsIHdvcmsuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfZG1hX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hYmFzZSkKK3sKKwlpZiAobTUyMjlfcmV2aXNpb24gPCAweDIwKQorCQlyZXR1cm47CisJaWYgKCEoaHdpZi0+Y2hhbm5lbCkpCisJCWh3aWYtPk9VVEIoaHdpZi0+SU5CKGRtYWJhc2UrMikgJiAweDYwLCBkbWFiYXNlKzIpOworCWlkZV9zZXR1cF9kbWEoaHdpZiwgZG1hYmFzZSwgOCk7Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IGFsaTE1eDNfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJBTEkxNVgzIiwKKwkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2FsaTE1eDMsCisJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9hbGkxNXgzLAorCS5pbml0X2RtYQk9IGluaXRfZG1hX2FsaTE1eDMsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IEFVVE9ETUEsCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCisvKioKKyAqCWFsaW0xNXgzX2luaXRfb25lCS0Jc2V0IHVwIGFuIEFMaTE1eDMgSURFIGNvbnRyb2xsZXIKKyAqCUBkZXY6IFBDSSBkZXZpY2UgdG8gc2V0IHVwCisgKgorICoJUGVyZm9ybSB0aGUgYWN0dWFsIHNldCB1cCBmb3IgYW4gQUxpMTV4MyB0aGF0IGhhcyBiZWVuIGZvdW5kIGJ5IHRoZQorICoJaG90IHBsdWcgbGF5ZXIuCisgKi8KKyAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFsaW0xNXgzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZGVfcGNpX2RldmljZV90ICpkID0gJmFsaTE1eDNfY2hpcHNldDsKKworCWlmKHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0RFVklDRV9JRF9BVElfUlMxMDAsIE5VTEwpKQorCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmc6IEFUSSBSYWRlb24gSUdQIE5vcnRoYnJpZGdlIGlzIG5vdCB5ZXQgZnVsbHkgdGVzdGVkLlxuIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQorCWQtPmluaXRfaHdpZiA9IGluaXRfaHdpZl9jb21tb25fYWxpMTV4MzsKKyNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbGltMTV4M19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX001MjI5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX001MjI4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhbGltMTV4M19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkJPSAiQUxJMTV4M19JREUiLAorCS5pZF90YWJsZQk9IGFsaW0xNXgzX3BjaV90YmwsCisJLnByb2JlCQk9IGFsaW0xNXgzX2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBhbGkxNXgzX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbGkxNXgzX2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBBdWJyeSwgQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiwgQ0osIEFuZHJlIEhlZHJpY2ssIEFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBBTGkgMTV4MyBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMgYi9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjI1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogVmVyc2lvbiAyLjEzCisgKgorICogQU1EIDc1NS83NTYvNzY2LzgxMTEgYW5kIG5WaWRpYSBuRm9yY2UvMi8ycy8zLzNzL0NLODA0L01DUDA0CisgKiBJREUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIEJhc2VkIG9uIHRoZSB3b3JrIG9mOgorICogICAgICBBbmRyZSBIZWRyaWNrCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImlkZS10aW1pbmcuaCIKKworI2RlZmluZSBESVNQTEFZX0FNRF9USU1JTkdTCisKKyNkZWZpbmUgQU1EX0lERV9FTkFCTEUJCSgweDAwICsgYW1kX2NvbmZpZy0+YmFzZSkKKyNkZWZpbmUgQU1EX0lERV9DT05GSUcJCSgweDAxICsgYW1kX2NvbmZpZy0+YmFzZSkKKyNkZWZpbmUgQU1EX0NBQkxFX0RFVEVDVAkoMHgwMiArIGFtZF9jb25maWctPmJhc2UpCisjZGVmaW5lIEFNRF9EUklWRV9USU1JTkcJKDB4MDggKyBhbWRfY29uZmlnLT5iYXNlKQorI2RlZmluZSBBTURfOEJJVF9USU1JTkcJCSgweDBlICsgYW1kX2NvbmZpZy0+YmFzZSkKKyNkZWZpbmUgQU1EX0FERFJFU1NfU0VUVVAJKDB4MGMgKyBhbWRfY29uZmlnLT5iYXNlKQorI2RlZmluZSBBTURfVURNQV9USU1JTkcJCSgweDEwICsgYW1kX2NvbmZpZy0+YmFzZSkKKworI2RlZmluZSBBTURfVURNQQkJMHgwNworI2RlZmluZSBBTURfVURNQV8zMwkJMHgwMQorI2RlZmluZSBBTURfVURNQV82NgkJMHgwMgorI2RlZmluZSBBTURfVURNQV8xMDAJCTB4MDMKKyNkZWZpbmUgQU1EX1VETUFfMTMzCQkweDA0CisjZGVmaW5lIEFNRF9DSEVDS19TV0RNQQkJMHgwOAorI2RlZmluZSBBTURfQkFEX1NXRE1BCQkweDEwCisjZGVmaW5lIEFNRF9CQURfRklGTwkJMHgyMAorI2RlZmluZSBBTURfQ0hFQ0tfU0VSRU5BREUJMHg0MAorCisvKgorICogQU1EIFNvdXRoQnJpZGdlIGNoaXBzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYW1kX2lkZV9jaGlwIHsKKwl1bnNpZ25lZCBzaG9ydCBpZDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgY2hhciBmbGFnczsKK30gYW1kX2lkZV9jaGlwc1tdID0geworCXsgUENJX0RFVklDRV9JRF9BTURfQ09CUkFfNzQwMSwJCTB4NDAsIEFNRF9VRE1BXzMzIHwgQU1EX0JBRF9TV0RNQSB9LAorCXsgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwOSwJCTB4NDAsIEFNRF9VRE1BXzY2IHwgQU1EX0NIRUNLX1NXRE1BIH0sCisJeyBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDExLAkJMHg0MCwgQU1EX1VETUFfMTAwIHwgQU1EX0JBRF9GSUZPIH0sCisJeyBQQ0lfREVWSUNFX0lEX0FNRF9PUFVTXzc0NDEsCQkweDQwLCBBTURfVURNQV8xMDAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfSURFLAkJMHg0MCwgQU1EX1VETUFfMTMzIHwgQU1EX0NIRUNLX1NFUkVOQURFIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfSURFLAkweDUwLCBBTURfVURNQV8xMDAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJTX0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyU19TQVRBLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNTX0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzU19TQVRBLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNTX1NBVEEyLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9DSzgwNF9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAorCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1kX2lkZV9jaGlwICphbWRfY29uZmlnOworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgKmFtZF9jaGlwc2V0Oworc3RhdGljIHVuc2lnbmVkIGludCBhbWRfODB3Oworc3RhdGljIHVuc2lnbmVkIGludCBhbWRfY2xvY2s7CisKK3N0YXRpYyBjaGFyICphbWRfZG1hW10gPSB7ICJNV0RNQTE2IiwgIlVETUEzMyIsICJVRE1BNjYiLCAiVURNQTEwMCIsICJVRE1BMTMzIiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgYW1kX2N5YzJ1ZG1hW10gPSB7IDYsIDYsIDUsIDQsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDcgfTsKKworLyoKKyAqIEFNRCAvcHJvYyBlbnRyeS4KKyAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK3N0YXRpYyB1OCBhbWQ3NHh4X3Byb2M7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFtZF91ZG1hMmN5Y1tdID0geyA0LCA2LCA4LCAxMCwgMywgMiwgMSwgMTUgfTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFtZF9iYXNlOworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpibWlkZV9kZXY7CitleHRlcm4gaW50ICgqYW1kNzR4eF9kaXNwbGF5X2luZm8pKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCk7IC8qIGlkZS1wcm9jLmMgKi8KKworI2RlZmluZSBhbWRfcHJpbnQoZm9ybWF0LCBhcmcuLi4pIHAgKz0gc3ByaW50ZihwLCBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgYW1kX3ByaW50X2RyaXZlKG5hbWUsIGZvcm1hdCwgYXJnLi4uKVwKKwlwICs9IHNwcmludGYocCwgbmFtZSk7IGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHAgKz0gc3ByaW50ZihwLCBmb3JtYXQsICMjIGFyZyk7IHAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKworc3RhdGljIGludCBhbWQ3NHh4X2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKmFkZHIsIG9mZl90IG9mZnNldCwgaW50IGNvdW50KQoreworCWludCBzcGVlZFs0XSwgY3ljbGVbNF0sIHNldHVwWzRdLCBhY3RpdmVbNF0sIHJlY292ZXJbNF0sIGRlbls0XSwKKwkJIHVlbls0XSwgdWRtYVs0XSwgYWN0aXZlOGJbNF0sIHJlY292ZXI4Yls0XTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYm1pZGVfZGV2OworCXVuc2lnbmVkIGludCB2LCB1LCBpOworCXVuc2lnbmVkIHNob3J0IGMsIHc7CisJdW5zaWduZWQgY2hhciB0OworCWludCBsZW47CisJY2hhciAqcCA9IGJ1ZmZlcjsKKworCWFtZF9wcmludCgiLS0tLS0tLS0tLUFNRCBCdXNNYXN0ZXJpbmcgSURFIENvbmZpZ3VyYXRpb24tLS0tLS0tLS0tLS0tLS0tIik7CisKKwlhbWRfcHJpbnQoIkRyaXZlciBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgIDIuMTMiKTsKKwlhbWRfcHJpbnQoIlNvdXRoIEJyaWRnZTogICAgICAgICAgICAgICAgICAgICAgICVzIiwgcGNpX25hbWUoYm1pZGVfZGV2KSk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnQpOworCWFtZF9wcmludCgiUmV2aXNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFICUjeCIsIHQpOworCWFtZF9wcmludCgiSGlnaGVzdCBETUEgcmF0ZTogICAgICAgICAgICAgICAgICAgJXMiLCBhbWRfZG1hW2FtZF9jb25maWctPmZsYWdzICYgQU1EX1VETUFdKTsKKworCWFtZF9wcmludCgiQk0tRE1BIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgJSNseCIsIGFtZF9iYXNlKTsKKwlhbWRfcHJpbnQoIlBDSSBjbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICVkLiVkTUh6IiwgYW1kX2Nsb2NrIC8gMTAwMCwgYW1kX2Nsb2NrIC8gMTAwICUgMTApOworCQorCWFtZF9wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QcmltYXJ5IElERS0tLS0tLS1TZWNvbmRhcnkgSURFLS0tLS0tIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFNRF9JREVfQ09ORklHLCAmdCk7CisJYW1kX3ByaW50KCJQcmVmZXRjaCBCdWZmZXI6ICAgICAgICUxMHMlMjBzIiwgKHQgJiAweDgwKSA/ICJ5ZXMiIDogIm5vIiwgKHQgJiAweDIwKSA/ICJ5ZXMiIDogIm5vIik7CisJYW1kX3ByaW50KCJQb3N0IFdyaXRlIEJ1ZmZlcjogICAgICUxMHMlMjBzIiwgKHQgJiAweDQwKSA/ICJ5ZXMiIDogIm5vIiwgKHQgJiAweDEwKSA/ICJ5ZXMiIDogIm5vIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFNRF9JREVfRU5BQkxFLCAmdCk7CisJYW1kX3ByaW50KCJFbmFibGVkOiAgICAgICAgICAgICAgICUxMHMlMjBzIiwgKHQgJiAweDAyKSA/ICJ5ZXMiIDogIm5vIiwgKHQgJiAweDAxKSA/ICJ5ZXMiIDogIm5vIik7CisKKwljID0gaW5iKGFtZF9iYXNlICsgMHgwMikgfCAoaW5iKGFtZF9iYXNlICsgMHgwYSkgPDwgOCk7CisJYW1kX3ByaW50KCJTaW1wbGV4IG9ubHk6ICAgICAgICAgICUxMHMlMjBzIiwgKGMgJiAweDgwKSA/ICJ5ZXMiIDogIm5vIiwgKGMgJiAweDgwMDApID8gInllcyIgOiAibm8iKTsKKworCWFtZF9wcmludCgiQ2FibGUgVHlwZTogICAgICAgICAgICAlMTBzJTIwcyIsIChhbWRfODB3ICYgMSkgPyAiODB3IiA6ICI0MHciLCAoYW1kXzgwdyAmIDIpID8gIjgwdyIgOiAiNDB3Iik7CisKKwlpZiAoIWFtZF9jbG9jaykKKyAgICAgICAgICAgICAgICByZXR1cm4gcCAtIGJ1ZmZlcjsKKworCWFtZF9wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLWRyaXZlMC0tLS1kcml2ZTEtLS0tZHJpdmUyLS0tLWRyaXZlMy0tLS0tIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFNRF9BRERSRVNTX1NFVFVQLCAmdCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgQU1EX0RSSVZFX1RJTUlORywgJnYpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgQU1EXzhCSVRfVElNSU5HLCAmdyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgQU1EX1VETUFfVElNSU5HLCAmdSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXNldHVwW2ldICAgICA9ICgodCA+PiAoKDMgLSBpKSA8PCAxKSkgJiAweDMpICsgMTsKKwkJcmVjb3ZlcjhiW2ldID0gKCh3ID4+ICgoMSAtIChpID4+IDEpKSA8PCAzKSkgJiAweGYpICsgMTsKKwkJYWN0aXZlOGJbaV0gID0gKCh3ID4+ICgoKDEgLSAoaSA+PiAxKSkgPDwgMykgKyA0KSkgJiAweGYpICsgMTsKKwkJYWN0aXZlW2ldICAgID0gKCh2ID4+ICgoKDMgLSBpKSA8PCAzKSArIDQpKSAmIDB4ZikgKyAxOworCQlyZWNvdmVyW2ldICAgPSAoKHYgPj4gKCgzIC0gaSkgPDwgMykpICYgMHhmKSArIDE7CisKKwkJdWRtYVtpXSA9IGFtZF91ZG1hMmN5Y1soKHUgPj4gKCgzIC0gaSkgPDwgMykpICYgMHg3KV07CisJCXVlbltpXSAgPSAoKHUgPj4gKCgzIC0gaSkgPDwgMykpICYgMHg0MCkgPyAxIDogMDsKKwkJZGVuW2ldICA9IChjICYgKChpICYgMSkgPyAweDQwIDogMHgyMCkgPDwgKChpICYgMikgPDwgMikpOworCisJCWlmIChkZW5baV0gJiYgdWVuW2ldICYmIHVkbWFbaV0gPT0gMSkgeworCQkJc3BlZWRbaV0gPSBhbWRfY2xvY2sgKiAzOworCQkJY3ljbGVbaV0gPSA2NjY2NjYgLyBhbWRfY2xvY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkZW5baV0gJiYgdWVuW2ldICYmIHVkbWFbaV0gPT0gMTUpIHsKKwkJCXNwZWVkW2ldID0gYW1kX2Nsb2NrICogNDsKKwkJCWN5Y2xlW2ldID0gNTAwMDAwIC8gYW1kX2Nsb2NrOworCQkJY29udGludWU7CisJCX0KKworCQlzcGVlZFtpXSA9IDQgKiBhbWRfY2xvY2sgLyAoKGRlbltpXSAmJiB1ZW5baV0pID8gdWRtYVtpXSA6IChhY3RpdmVbaV0gKyByZWNvdmVyW2ldKSAqIDIpOworCQljeWNsZVtpXSA9IDEwMDAwMDAgKiAoKGRlbltpXSAmJiB1ZW5baV0pID8gdWRtYVtpXSA6IChhY3RpdmVbaV0gKyByZWNvdmVyW2ldKSAqIDIpIC8gYW1kX2Nsb2NrIC8gMjsKKwl9CisKKwlhbWRfcHJpbnRfZHJpdmUoIlRyYW5zZmVyIE1vZGU6ICIsICIlMTBzIiwgZGVuW2ldID8gKHVlbltpXSA/ICJVRE1BIiA6ICJETUEiKSA6ICJQSU8iKTsKKworCWFtZF9wcmludF9kcml2ZSgiQWRkcmVzcyBTZXR1cDogIiwgIiU4ZG5zIiwgMTAwMDAwMCAqIHNldHVwW2ldIC8gYW1kX2Nsb2NrKTsKKwlhbWRfcHJpbnRfZHJpdmUoIkNtZCBBY3RpdmU6ICAgICIsICIlOGRucyIsIDEwMDAwMDAgKiBhY3RpdmU4YltpXSAvIGFtZF9jbG9jayk7CisJYW1kX3ByaW50X2RyaXZlKCJDbWQgUmVjb3Zlcnk6ICAiLCAiJThkbnMiLCAxMDAwMDAwICogcmVjb3ZlcjhiW2ldIC8gYW1kX2Nsb2NrKTsKKwlhbWRfcHJpbnRfZHJpdmUoIkRhdGEgQWN0aXZlOiAgICIsICIlOGRucyIsIDEwMDAwMDAgKiBhY3RpdmVbaV0gLyBhbWRfY2xvY2spOworCWFtZF9wcmludF9kcml2ZSgiRGF0YSBSZWNvdmVyeTogIiwgIiU4ZG5zIiwgMTAwMDAwMCAqIHJlY292ZXJbaV0gLyBhbWRfY2xvY2spOworCWFtZF9wcmludF9kcml2ZSgiQ3ljbGUgVGltZTogICAgIiwgIiU4ZG5zIiwgY3ljbGVbaV0pOworCWFtZF9wcmludF9kcml2ZSgiVHJhbnNmZXIgUmF0ZTogIiwgIiU0ZC4lZE1CL3MiLCBzcGVlZFtpXSAvIDEwMDAsIHNwZWVkW2ldIC8gMTAwICUgMTApOworCisJLyogaG9waW5nIHAgLSBidWZmZXIgaXMgbGVzcyB0aGFuIDRLLi4uICovCisJbGVuID0gKHAgLSBidWZmZXIpIC0gb2Zmc2V0OworCSphZGRyID0gYnVmZmVyICsgb2Zmc2V0OworCQorCXJldHVybiBsZW4gPiBjb3VudCA/IGNvdW50IDogbGVuOworfQorCisjZW5kaWYKKworLyoKKyAqIGFtZF9zZXRfc3BlZWQoKSB3cml0ZXMgdGltaW5nIHZhbHVlcyB0byB0aGUgY2hpcHNldCByZWdpc3RlcnMKKyAqLworCitzdGF0aWMgdm9pZCBhbWRfc2V0X3NwZWVkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgZG4sIHN0cnVjdCBpZGVfdGltaW5nICp0aW1pbmcpCit7CisJdW5zaWduZWQgY2hhciB0OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBBTURfQUREUkVTU19TRVRVUCwgJnQpOworCXQgPSAodCAmIH4oMyA8PCAoKDMgLSBkbikgPDwgMSkpKSB8ICgoRklUKHRpbWluZy0+c2V0dXAsIDEsIDQpIC0gMSkgPDwgKCgzIC0gZG4pIDw8IDEpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBTURfQUREUkVTU19TRVRVUCwgdCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBTURfOEJJVF9USU1JTkcgKyAoMSAtIChkbiA+PiAxKSksCisJCSgoRklUKHRpbWluZy0+YWN0OGIsIDEsIDE2KSAtIDEpIDw8IDQpIHwgKEZJVCh0aW1pbmctPnJlYzhiLCAxLCAxNikgLSAxKSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBTURfRFJJVkVfVElNSU5HICsgKDMgLSBkbiksCisJCSgoRklUKHRpbWluZy0+YWN0aXZlLCAxLCAxNikgLSAxKSA8PCA0KSB8IChGSVQodGltaW5nLT5yZWNvdmVyLCAxLCAxNikgLSAxKSk7CisKKwlzd2l0Y2ggKGFtZF9jb25maWctPmZsYWdzICYgQU1EX1VETUEpIHsKKwkJY2FzZSBBTURfVURNQV8zMzogIHQgPSB0aW1pbmctPnVkbWEgPyAoMHhjMCB8IChGSVQodGltaW5nLT51ZG1hLCAyLCA1KSAtIDIpKSA6IDB4MDM7IGJyZWFrOworCQljYXNlIEFNRF9VRE1BXzY2OiAgdCA9IHRpbWluZy0+dWRtYSA/ICgweGMwIHwgYW1kX2N5YzJ1ZG1hW0ZJVCh0aW1pbmctPnVkbWEsIDIsIDEwKV0pIDogMHgwMzsgYnJlYWs7CisJCWNhc2UgQU1EX1VETUFfMTAwOiB0ID0gdGltaW5nLT51ZG1hID8gKDB4YzAgfCBhbWRfY3ljMnVkbWFbRklUKHRpbWluZy0+dWRtYSwgMSwgMTApXSkgOiAweDAzOyBicmVhazsKKwkJY2FzZSBBTURfVURNQV8xMzM6IHQgPSB0aW1pbmctPnVkbWEgPyAoMHhjMCB8IGFtZF9jeWMydWRtYVtGSVQodGltaW5nLT51ZG1hLCAxLCAxNSldKSA6IDB4MDM7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm47CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgQU1EX1VETUFfVElNSU5HICsgKDMgLSBkbiksIHQpOworfQorCisvKgorICogYW1kX3NldF9kcml2ZSgpIGNvbXB1dGVzIHRpbWluZyB2YWx1ZXMgY29uZmlndXJlcyB0aGUgZHJpdmUgYW5kCisgKiB0aGUgY2hpcHNldCB0byBhIGRlc2lyZWQgdHJhbnNmZXIgbW9kZS4gSXQgYWxzbyBjYW4gYmUgY2FsbGVkCisgKiBieSB1cHBlciBsYXllcnMuCisgKi8KKworc3RhdGljIGludCBhbWRfc2V0X2RyaXZlKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpCit7CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBIV0lGKGRyaXZlKS0+ZHJpdmVzICsgKH5kcml2ZS0+ZG4gJiAxKTsKKwlzdHJ1Y3QgaWRlX3RpbWluZyB0LCBwOworCWludCBULCBVVDsKKworCWlmIChzcGVlZCAhPSBYRkVSX1BJT19TTE9XICYmIHNwZWVkICE9IGRyaXZlLT5jdXJyZW50X3NwZWVkKQorCQlpZiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlJWQ6IERyaXZlICVkIGRpZG4ndCBhY2NlcHQgc3BlZWQgc2V0dGluZy4gT2gsIHdlbGwuXG4iLAorCQkJCWRyaXZlLT5kbiA+PiAxLCBkcml2ZS0+ZG4gJiAxKTsKKworCVQgPSAxMDAwMDAwMDAwIC8gYW1kX2Nsb2NrOworCVVUID0gVCAvIG1pbl90KGludCwgbWF4X3QoaW50LCBhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9VRE1BLCAxKSwgMik7CisKKwlpZGVfdGltaW5nX2NvbXB1dGUoZHJpdmUsIHNwZWVkLCAmdCwgVCwgVVQpOworCisJaWYgKHBlZXItPnByZXNlbnQpIHsKKwkJaWRlX3RpbWluZ19jb21wdXRlKHBlZXIsIHBlZXItPmN1cnJlbnRfc3BlZWQsICZwLCBULCBVVCk7CisJCWlkZV90aW1pbmdfbWVyZ2UoJnAsICZ0LCAmdCwgSURFX1RJTUlOR184QklUKTsKKwl9CisKKwlpZiAoc3BlZWQgPT0gWEZFUl9VRE1BXzUgJiYgYW1kX2Nsb2NrIDw9IDMzMzMzKSB0LnVkbWEgPSAxOworCWlmIChzcGVlZCA9PSBYRkVSX1VETUFfNiAmJiBhbWRfY2xvY2sgPD0gMzMzMzMpIHQudWRtYSA9IDE1OworCisJYW1kX3NldF9zcGVlZChIV0lGKGRyaXZlKS0+cGNpX2RldiwgZHJpdmUtPmRuLCAmdCk7CisKKwlpZiAoIWRyaXZlLT5pbml0X3NwZWVkKQkKKwkJZHJpdmUtPmluaXRfc3BlZWQgPSBzcGVlZDsKKwlkcml2ZS0+Y3VycmVudF9zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhbWQ3NHh4X3R1bmVfZHJpdmUoKSBpcyBhIGNhbGxiYWNrIGZyb20gdXBwZXIgbGF5ZXJzIGZvcgorICogUElPLW9ubHkgdHVuaW5nLgorICovCisKK3N0YXRpYyB2b2lkIGFtZDc0eHhfdHVuZV9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZiAocGlvID09IDI1NSkgeworCQlhbWRfc2V0X2RyaXZlKGRyaXZlLCBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsIFhGRVJfUElPIHwgWEZFUl9FUElPKSk7CisJCXJldHVybjsKKwl9CisKKwlhbWRfc2V0X2RyaXZlKGRyaXZlLCBYRkVSX1BJT18wICsgbWluX3QoYnl0ZSwgcGlvLCA1KSk7Cit9CisKKy8qCisgKiBhbWQ3NHh4X2RtYXByb2MoKSBpcyBhIGNhbGxiYWNrIGZyb20gdXBwZXIgbGF5ZXJzIHRoYXQgY2FuIGRvCisgKiBhIGxvdCwgYnV0IHdlIHVzZSBpdCBmb3IgRE1BL1BJTyB0dW5pbmcgb25seSwgZGVsZWdhdGluZyBldmVyeXRoaW5nCisgKiBlbHNlIHRvIHRoZSBkZWZhdWx0IGlkZV9kbWFwcm9jKCkuCisgKi8KKworc3RhdGljIGludCBhbWQ3NHh4X2lkZV9kbWFfY2hlY2soaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludCB3ODAgPSBIV0lGKGRyaXZlKS0+dWRtYV9mb3VyOworCisJdTggc3BlZWQgPSBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsCisJCVhGRVJfUElPIHwgWEZFUl9FUElPIHwgWEZFUl9NV0RNQSB8IFhGRVJfVURNQSB8CisJCSgoYW1kX2NvbmZpZy0+ZmxhZ3MgJiBBTURfQkFEX1NXRE1BKSA/IDAgOiBYRkVSX1NXRE1BKSB8CisJCSh3ODAgJiYgKGFtZF9jb25maWctPmZsYWdzICYgQU1EX1VETUEpID49IEFNRF9VRE1BXzY2ID8gWEZFUl9VRE1BXzY2IDogMCkgfAorCQkodzgwICYmIChhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9VRE1BKSA+PSBBTURfVURNQV8xMDAgPyBYRkVSX1VETUFfMTAwIDogMCkgfAorCQkodzgwICYmIChhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9VRE1BKSA+PSBBTURfVURNQV8xMzMgPyBYRkVSX1VETUFfMTMzIDogMCkpOworCisJYW1kX3NldF9kcml2ZShkcml2ZSwgc3BlZWQpOworCisJaWYgKGRyaXZlLT5hdXRvZG1hICYmIChzcGVlZCAmIFhGRVJfTU9ERSkgIT0gWEZFUl9QSU8pCisJCXJldHVybiBIV0lGKGRyaXZlKS0+aWRlX2RtYV9vbihkcml2ZSk7CisJcmV0dXJuIEhXSUYoZHJpdmUpLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKK30KKworLyoKKyAqIFRoZSBpbml0aWFsaXphdGlvbiBjYWxsYmFjay4gSGVyZSB3ZSBkZXRlcm1pbmUgdGhlIElERSBjaGlwIHR5cGUKKyAqIGFuZCBpbml0aWFsaXplIGl0cyBkcml2ZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X2FtZDc0eHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHQ7CisJdW5zaWduZWQgaW50IHU7CisJaW50IGk7CisKKy8qCisgKiBDaGVjayBmb3IgYmFkIFNXRE1BLgorICovCisKKwlpZiAoYW1kX2NvbmZpZy0+ZmxhZ3MgJiBBTURfQ0hFQ0tfU1dETUEpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZ0KTsKKwkJaWYgKHQgPD0gNykKKwkJCWFtZF9jb25maWctPmZsYWdzIHw9IEFNRF9CQURfU1dETUE7CisJfQorCisvKgorICogQ2hlY2sgODAtd2lyZSBjYWJsZSBwcmVzZW5jZS4KKyAqLworCisJc3dpdGNoIChhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9VRE1BKSB7CisKKwkJY2FzZSBBTURfVURNQV8xMzM6CisJCWNhc2UgQU1EX1VETUFfMTAwOgorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBBTURfQ0FCTEVfREVURUNULCAmdCk7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBBTURfVURNQV9USU1JTkcsICZ1KTsKKwkJCWFtZF84MHcgPSAoKHQgJiAweDMpID8gMSA6IDApIHwgKCh0ICYgMHhjKSA/IDIgOiAwKTsKKwkJCWZvciAoaSA9IDI0OyBpID49IDA7IGkgLT0gOCkKKwkJCQlpZiAoKCh1ID4+IGkpICYgNCkgJiYgIShhbWRfODB3ICYgKDEgPDwgKDEgLSAoaSA+PiA0KSkpKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQklPUyBkaWRuJ3Qgc2V0IGNhYmxlIGJpdHMgY29ycmVjdGx5LiBFbmFibGluZyB3b3JrYXJvdW5kLlxuIiwKKwkJCQkJCWFtZF9jaGlwc2V0LT5uYW1lKTsKKwkJCQkJYW1kXzgwdyB8PSAoMSA8PCAoMSAtIChpID4+IDQpKSk7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTURfVURNQV82NjoKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEFNRF9VRE1BX1RJTUlORywgJnUpOworCQkJZm9yIChpID0gMjQ7IGkgPj0gMDsgaSAtPSA4KQorCQkJCWlmICgodSA+PiBpKSAmIDQpCisJCQkJCWFtZF84MHcgfD0gKDEgPDwgKDEgLSAoaSA+PiA0KSkpOworCQkJYnJlYWs7CisJfQorCisvKgorICogVGFrZSBjYXJlIG9mIHByZWZldGNoICYgcG9zdHdyaXRlLgorICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFNRF9JREVfQ09ORklHLCAmdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgQU1EX0lERV9DT05GSUcsCisJCShhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9CQURfRklGTykgPyAodCAmIDB4MGYpIDogKHQgfCAweGYwKSk7CisKKy8qCisgKiBUYWtlIGNhcmUgb2YgaW5jb3JyZWN0bHkgd2lyZWQgU2VyZW5hZGUgbWFpbmJvYXJkcy4KKyAqLworCisJaWYgKChhbWRfY29uZmlnLT5mbGFncyAmIEFNRF9DSEVDS19TRVJFTkFERSkgJiYKKwkJZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCisJCWRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9TRVJFTkFERSkKKwkJCWFtZF9jb25maWctPmZsYWdzID0gQU1EX1VETUFfMTAwOworCisvKgorICogRGV0ZXJtaW5lIHRoZSBzeXN0ZW0gYnVzIGNsb2NrLgorICovCisKKwlhbWRfY2xvY2sgPSBzeXN0ZW1fYnVzX2Nsb2NrKCkgKiAxMDAwOworCisJc3dpdGNoIChhbWRfY2xvY2spIHsKKwkJY2FzZSAzMzAwMDogYW1kX2Nsb2NrID0gMzMzMzM7IGJyZWFrOworCQljYXNlIDM3MDAwOiBhbWRfY2xvY2sgPSAzNzUwMDsgYnJlYWs7CisJCWNhc2UgNDEwMDA6IGFtZF9jbG9jayA9IDQxNjY2OyBicmVhazsKKwl9CisKKwlpZiAoYW1kX2Nsb2NrIDwgMjAwMDAgfHwgYW1kX2Nsb2NrID4gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVzZXIgZ2l2ZW4gUENJIGNsb2NrIHNwZWVkIGltcG9zc2libGUgKCVkKSwgdXNpbmcgMzMgTUh6IGluc3RlYWQuXG4iLAorCQkJYW1kX2NoaXBzZXQtPm5hbWUsIGFtZF9jbG9jayk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVc2UgaWRlMD1hdGE2NiBpZiB5b3Ugd2FudCB0byBhc3N1bWUgODAtd2lyZSBjYWJsZVxuIiwKKwkJCWFtZF9jaGlwc2V0LT5uYW1lKTsKKwkJYW1kX2Nsb2NrID0gMzMzMzM7CisJfQorCisvKgorICogUHJpbnQgdGhlIGJvb3QgbWVzc2FnZS4KKyAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZ0KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgKHJldiAlMDJ4KSAlcyBjb250cm9sbGVyXG4iLAorCQlhbWRfY2hpcHNldC0+bmFtZSwgcGNpX25hbWUoZGV2KSwgdCwgYW1kX2RtYVthbWRfY29uZmlnLT5mbGFncyAmIEFNRF9VRE1BXSk7CisKKy8qCisgKiBSZWdpc3RlciAvcHJvYy9pZGUvYW1kNzR4eCBlbnRyeQorICovCisKKyNpZiBkZWZpbmVkKERJU1BMQVlfQU1EX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisgICAgICAgIGlmICghYW1kNzR4eF9wcm9jKSB7CisgICAgICAgICAgICAgICAgYW1kX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKKyAgICAgICAgICAgICAgICBibWlkZV9kZXYgPSBkZXY7CisJCWlkZV9wY2lfY3JlYXRlX2hvc3RfcHJvYygiYW1kNzR4eCIsIGFtZDc0eHhfZ2V0X2luZm8pOworICAgICAgICAgICAgICAgIGFtZDc0eHhfcHJvYyA9IDE7CisgICAgICAgIH0KKyNlbmRpZiAvKiBESVNQTEFZX0FNRF9USU1JTkdTICYmIENPTkZJR19QUk9DX0ZTICovCisKKwlyZXR1cm4gZGV2LT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfYW1kNzR4eChpZGVfaHdpZl90ICpod2lmKQoreworCWludCBpOworCisJaWYgKGh3aWYtPmlycSA9PSAwKSAvKiAwIGlzIGJvZ3VzIGJ1dCB3aWxsIGRvIGZvciBub3cgKi8KKwkJaHdpZi0+aXJxID0gcGNpX2dldF9sZWdhY3lfaWRlX2lycShod2lmLT5wY2lfZGV2LCBod2lmLT5jaGFubmVsKTsKKworCWh3aWYtPmF1dG9kbWEgPSAwOworCisJaHdpZi0+dHVuZXByb2MgPSAmYW1kNzR4eF90dW5lX2RyaXZlOworCWh3aWYtPnNwZWVkcHJvYyA9ICZhbWRfc2V0X2RyaXZlOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlod2lmLT5kcml2ZXNbaV0uaW9fMzJiaXQgPSAxOworCQlod2lmLT5kcml2ZXNbaV0udW5tYXNrID0gMTsKKwkJaHdpZi0+ZHJpdmVzW2ldLmF1dG90dW5lID0gMTsKKwkJaHdpZi0+ZHJpdmVzW2ldLmRuID0gaHdpZi0+Y2hhbm5lbCAqIDIgKyBpOworCX0KKworCWlmICghaHdpZi0+ZG1hX2Jhc2UpCisJCXJldHVybjsKKworICAgICAgICBod2lmLT5hdGFwaV9kbWEgPSAxOworICAgICAgICBod2lmLT51bHRyYV9tYXNrID0gMHg3ZjsKKyAgICAgICAgaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisgICAgICAgIGh3aWYtPnN3ZG1hX21hc2sgPSAweDA3OworCisJaWYgKCFod2lmLT51ZG1hX2ZvdXIpCisJCWh3aWYtPnVkbWFfZm91ciA9IChhbWRfODB3ID4+IGh3aWYtPmNoYW5uZWwpICYgMTsKKyAgICAgICAgaHdpZi0+aWRlX2RtYV9jaGVjayA9ICZhbWQ3NHh4X2lkZV9kbWFfY2hlY2s7CisgICAgICAgIGlmICghbm9hdXRvZG1hKQorICAgICAgICAgICAgICAgIGh3aWYtPmF1dG9kbWEgPSAxOworICAgICAgICBod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisgICAgICAgIGh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworI2RlZmluZSBERUNMQVJFX0FNRF9ERVYobmFtZV9zdHIpCQkJCQlcCisJewkJCQkJCQkJXAorCQkubmFtZQkJPSBuYW1lX3N0ciwJCQkJXAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2FtZDc0eHgsCQkJXAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FtZDc0eHgsCQkJXAorCQkuY2hhbm5lbHMJPSAyLAkJCQkJXAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCQkJCVwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NDAsMHgwMiwweDAyfSwgezB4NDAsMHgwMSwweDAxfX0sCVwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCQkJCVwKKwl9CisKKyNkZWZpbmUgREVDTEFSRV9OVl9ERVYobmFtZV9zdHIpCQkJCQlcCisJewkJCQkJCQkJXAorCQkubmFtZQkJPSBuYW1lX3N0ciwJCQkJXAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2FtZDc0eHgsCQkJXAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2FtZDc0eHgsCQkJXAorCQkuY2hhbm5lbHMJPSAyLAkJCQkJXAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCQkJCVwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NTAsMHgwMiwweDAyfSwgezB4NTAsMHgwMSwweDAxfX0sCVwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCQkJCVwKKwl9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IGFtZDc0eHhfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0geworCS8qICAwICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENzQwMSIpLAorCS8qICAxICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENzQwOSIpLAorCS8qICAyICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENzQxMSIpLAorCS8qICAzICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENzQ0MSIpLAorCS8qICA0ICovIERFQ0xBUkVfQU1EX0RFVigiQU1EODExMSIpLAorCisJLyogIDUgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRSIpLAorCS8qICA2ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UyIiksCisJLyogIDcgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRTItVTQwMFIiKSwKKwkvKiAgOCAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFMi1VNDAwUi1TQVRBIiksCisJLyogIDkgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRTMtMTUwIiksCisJLyogMTAgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRTMtMjUwIiksCisJLyogMTEgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRTMtMjUwLVNBVEEiKSwKKwkvKiAxMiAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFMy0yNTAtU0FUQTIiKSwKKwkvKiAxMyAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLUNLODA0IiksCisJLyogMTQgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1AwNCIpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYW1kNzR4eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJYW1kX2NoaXBzZXQgPSBhbWQ3NHh4X2NoaXBzZXRzICsgaWQtPmRyaXZlcl9kYXRhOworCWFtZF9jb25maWcgPSBhbWRfaWRlX2NoaXBzICsgaWQtPmRyaXZlcl9kYXRhOworCWlmIChkZXYtPmRldmljZSAhPSBhbWRfY29uZmlnLT5pZCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhc3NlcnRpb24gMHglMDJ4ID09IDB4JTAyeCBmYWlsZWQgIVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldiksIGRldi0+ZGV2aWNlLCBhbWRfY29uZmlnLT5pZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBhbWRfY2hpcHNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbWQ3NHh4X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAxLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDA5LAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDEgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDExLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDIgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9PUFVTXzc0NDEsCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAgMyB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfSURFLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAgNSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAgNiB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJTX0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDcgfSwKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfU0FUQQorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJTX1NBVEEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA4IH0sCisjZW5kaWYKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzX0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgIDkgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzU19JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwIH0sCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1NBVEEKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzU19TQVRBLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNTX1NBVEEyLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMiB9LAorI2VuZGlmCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX0NLODA0X0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQMDRfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNCB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNzR4eF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkJPSAiQU1EX0lERSIsCisJLmlkX3RhYmxlCT0gYW1kNzR4eF9wY2lfdGJsLAorCS5wcm9iZQkJPSBhbWQ3NHh4X3Byb2JlLAorfTsKKworc3RhdGljIGludCBhbWQ3NHh4X2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbWQ3NHh4X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiVm9qdGVjaCBQYXZsaWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQU1EIFBDSSBJREUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYXRpaXhwLmMgYi9kcml2ZXJzL2lkZS9wY2kvYXRpaXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5ZWU5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hdGlpeHAuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9wY2kvYXRpaXhwLmMJVmVyc2lvbiAwLjAxLWJhcnQyCUZlYi4gMjYsIDIwMDQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEFUSSBJbmMuIDxoeXVAYXRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQmFydGxvbWllaiBab2xuaWVya2lld2ljegorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgQVRJSVhQX0lERV9QSU9fVElNSU5HCQkweDQwCisjZGVmaW5lIEFUSUlYUF9JREVfTURNQV9USU1JTkcJCTB4NDQKKyNkZWZpbmUgQVRJSVhQX0lERV9QSU9fQ09OVFJPTAkJMHg0OAorI2RlZmluZSBBVElJWFBfSURFX1BJT19NT0RFCQkweDRhCisjZGVmaW5lIEFUSUlYUF9JREVfVURNQV9DT05UUk9MCQkweDU0CisjZGVmaW5lIEFUSUlYUF9JREVfVURNQV9NT0RFCQkweDU2CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBjb21tYW5kX3dpZHRoOworCXU4IHJlY292ZXJfd2lkdGg7Cit9IGF0aWl4cF9pZGVfdGltaW5nOworCitzdGF0aWMgYXRpaXhwX2lkZV90aW1pbmcgcGlvX3RpbWluZ1tdID0geworCXsgMHgwNSwgMHgwZCB9LAorCXsgMHgwNCwgMHgwNyB9LAorCXsgMHgwMywgMHgwNCB9LAorCXsgMHgwMiwgMHgwMiB9LAorCXsgMHgwMiwgMHgwMCB9LAorfTsKKworc3RhdGljIGF0aWl4cF9pZGVfdGltaW5nIG1kbWFfdGltaW5nW10gPSB7CisJeyAweDA3LCAweDA3IH0sCisJeyAweDAyLCAweDAxIH0sCisJeyAweDAyLCAweDAwIH0sCit9OworCitzdGF0aWMgaW50IHNhdmVfbWRtYV9tb2RlWzRdOworCisvKioKKyAqCWF0aWl4cF9yYXRlbWFzawkJLQljb21wdXRlIHJhdGUgbWFzayBmb3IgQVRJSVhQIElERQorICoJQGRyaXZlOiBJREUgZHJpdmUgdG8gY29tcHV0ZSBmb3IKKyAqCisgKglSZXR1cm5zIHRoZSBhdmFpbGFibGUgbW9kZXMgZm9yIHRoZSBBVElJWFAgSURFIGNvbnRyb2xsZXIuCisgKi8KKworc3RhdGljIHU4IGF0aWl4cF9yYXRlbWFzayhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggbW9kZSA9IDM7CisKKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCisvKioKKyAqCWF0aWl4cF9kbWFfMl9waW8JCS0JcmV0dXJuIHRoZSBQSU8gbW9kZSBtYXRjaGluZyBETUEKKyAqCUB4ZmVyX3JhdGU6IHRyYW5zZmVyIHNwZWVkCisgKgorICoJUmV0dXJucyB0aGUgbmVhcmVzdCBlcXVpdmFsZW50IFBJTyB0aW1pbmcgZm9yIHRoZSBQSU8gb3IgRE1BCisgKgltb2RlIHJlcXVlc3RlZCBieSB0aGUgY29udHJvbGxlci4KKyAqLworCitzdGF0aWMgdTggYXRpaXhwX2RtYV8yX3Bpbyh1OCB4ZmVyX3JhdGUpIHsKKwlzd2l0Y2goeGZlcl9yYXRlKSB7CisJCWNhc2UgWEZFUl9VRE1BXzY6CisJCWNhc2UgWEZFUl9VRE1BXzU6CisJCWNhc2UgWEZFUl9VRE1BXzQ6CisJCWNhc2UgWEZFUl9VRE1BXzM6CisJCWNhc2UgWEZFUl9VRE1BXzI6CisJCWNhc2UgWEZFUl9VRE1BXzE6CisJCWNhc2UgWEZFUl9VRE1BXzA6CisJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJY2FzZSBYRkVSX1BJT180OgorCQkJcmV0dXJuIDQ7CisJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJY2FzZSBYRkVSX1BJT18zOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgWEZFUl9TV19ETUFfMjoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJY2FzZSBYRkVSX1NXX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzA6CisJCWNhc2UgWEZFUl9QSU9fMToKKwkJY2FzZSBYRkVSX1BJT18wOgorCQljYXNlIFhGRVJfUElPX1NMT1c6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXRpaXhwX2lkZV9kbWFfaG9zdF9vbihpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGRyaXZlLT5od2lmLT5wY2lfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHRtcDE2OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEFUSUlYUF9JREVfVURNQV9DT05UUk9MLCAmdG1wMTYpOworCWlmIChzYXZlX21kbWFfbW9kZVtkcml2ZS0+ZG5dKQorCQl0bXAxNiAmPSB+KDEgPDwgZHJpdmUtPmRuKTsKKwllbHNlCisJCXRtcDE2IHw9ICgxIDw8IGRyaXZlLT5kbik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgQVRJSVhQX0lERV9VRE1BX0NPTlRST0wsIHRtcDE2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gX19pZGVfZG1hX2hvc3Rfb24oZHJpdmUpOworfQorCitzdGF0aWMgaW50IGF0aWl4cF9pZGVfZG1hX2hvc3Rfb2ZmKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZHJpdmUtPmh3aWYtPnBjaV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdG1wMTY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgQVRJSVhQX0lERV9VRE1BX0NPTlRST0wsICZ0bXAxNik7CisJdG1wMTYgJj0gfigxIDw8IGRyaXZlLT5kbik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgQVRJSVhQX0lERV9VRE1BX0NPTlRST0wsIHRtcDE2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gX19pZGVfZG1hX2hvc3Rfb2ZmKGRyaXZlKTsKK30KKworLyoqCisgKglhdGlpeHBfdHVuZV9kcml2ZQkJLQl0dW5lIGEgZHJpdmUgYXR0YWNoZWQgdG8gYSBBVElJWFAKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoJQHBpbzogZGVzaXJlZCBQSU8gbW9kZQorICoKKyAqCVNldCB0aGUgaW50ZXJmYWNlIFBJTyBtb2RlLgorICovCisKK3N0YXRpYyB2b2lkIGF0aWl4cF90dW5lcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZHJpdmUtPmh3aWYtPnBjaV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGltaW5nX3NoaWZ0ID0gKGRyaXZlLT5kbiAmIDIpID8gMTYgOiAwICsgKGRyaXZlLT5kbiAmIDEpID8gMCA6IDg7CisJdTMyIHBpb190aW1pbmdfZGF0YTsKKwl1MTYgcGlvX21vZGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBBVElJWFBfSURFX1BJT19NT0RFLCAmcGlvX21vZGVfZGF0YSk7CisJcGlvX21vZGVfZGF0YSAmPSB+KDB4MDcgPDwgKGRyaXZlLT5kbiAqIDQpKTsKKwlwaW9fbW9kZV9kYXRhIHw9IChwaW8gPDwgKGRyaXZlLT5kbiAqIDQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBBVElJWFBfSURFX1BJT19NT0RFLCBwaW9fbW9kZV9kYXRhKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEFUSUlYUF9JREVfUElPX1RJTUlORywgJnBpb190aW1pbmdfZGF0YSk7CisJcGlvX3RpbWluZ19kYXRhICY9IH4oMHhmZiA8PCB0aW1pbmdfc2hpZnQpOworCXBpb190aW1pbmdfZGF0YSB8PSAocGlvX3RpbWluZ1twaW9dLnJlY292ZXJfd2lkdGggPDwgdGltaW5nX3NoaWZ0KSB8CisJCSAocGlvX3RpbWluZ1twaW9dLmNvbW1hbmRfd2lkdGggPDwgKHRpbWluZ19zaGlmdCArIDQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgQVRJSVhQX0lERV9QSU9fVElNSU5HLCBwaW9fdGltaW5nX2RhdGEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglhdGlpeHBfdHVuZV9jaGlwc2V0CS0JdHVuZSBhIEFUSUlYUCBpbnRlcmZhY2UKKyAqCUBkcml2ZTogSURFIGRyaXZlIHRvIHR1bmUKKyAqCUB4ZmVyc3BlZWQ6IHNwZWVkIHRvIGNvbmZpZ3VyZQorICoKKyAqCVNldCBhIEFUSUlYUCBpbnRlcmZhY2UgY2hhbm5lbCB0byB0aGUgZGVzaXJlZCBzcGVlZHMuIFRoaXMgaW52b2x2ZXMKKyAqCXJlcXVpcmVzIHRoZSByaWdodCB0aW1pbmcgZGF0YSBpbnRvIHRoZSBBVElJWFAgY29uZmlndXJhdGlvbiBzcGFjZQorICoJdGhlbiBzZXR0aW5nIHRoZSBkcml2ZSBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkKKyAqLworCitzdGF0aWMgaW50IGF0aWl4cF9zcGVlZHByb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGRyaXZlLT5od2lmLT5wY2lfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWluZ19zaGlmdCA9IChkcml2ZS0+ZG4gJiAyKSA/IDE2IDogMCArIChkcml2ZS0+ZG4gJiAxKSA/IDAgOiA4OworCXUzMiB0bXAzMjsKKwl1MTYgdG1wMTY7CisJdTggc3BlZWQsIHBpbzsKKworCXNwZWVkID0gaWRlX3JhdGVfZmlsdGVyKGF0aWl4cF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCXNhdmVfbWRtYV9tb2RlW2RyaXZlLT5kbl0gPSAwOworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEFUSUlYUF9JREVfVURNQV9NT0RFLCAmdG1wMTYpOworCQl0bXAxNiAmPSB+KDB4MDcgPDwgKGRyaXZlLT5kbiAqIDQpKTsKKwkJdG1wMTYgfD0gKChzcGVlZCAmIDB4MDcpIDw8IChkcml2ZS0+ZG4gKiA0KSk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIEFUSUlYUF9JREVfVURNQV9NT0RFLCB0bXAxNik7CisJfSBlbHNlIHsKKwkJaWYgKChzcGVlZCA+PSBYRkVSX01XX0RNQV8wKSAmJiAoc3BlZWQgPD0gWEZFUl9NV19ETUFfMikpIHsKKwkJCXNhdmVfbWRtYV9tb2RlW2RyaXZlLT5kbl0gPSBzcGVlZDsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEFUSUlYUF9JREVfTURNQV9USU1JTkcsICZ0bXAzMik7CisJCQl0bXAzMiAmPSB+KDB4ZmYgPDwgdGltaW5nX3NoaWZ0KTsKKwkJCXRtcDMyIHw9IChtZG1hX3RpbWluZ1tzcGVlZCAmIDB4MDNdLnJlY292ZXJfd2lkdGggPDwgdGltaW5nX3NoaWZ0KSB8CisJCQkJKG1kbWFfdGltaW5nW3NwZWVkICYgMHgwM10uY29tbWFuZF93aWR0aCA8PCAodGltaW5nX3NoaWZ0ICsgNCkpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIEFUSUlYUF9JREVfTURNQV9USU1JTkcsIHRtcDMyKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3BlZWQgPj0gWEZFUl9TV19ETUFfMCkKKwkJcGlvID0gYXRpaXhwX2RtYV8yX3BpbyhzcGVlZCk7CisJZWxzZQorCQlwaW8gPSBzcGVlZCAtIFhGRVJfUElPXzA7CisKKwlhdGlpeHBfdHVuZXByb2MoZHJpdmUsIHBpbyk7CisKKwlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOworfQorCisvKioKKyAqCWF0aWl4cF9jb25maWdfZHJpdmVfZm9yX2RtYQktCWNvbmZpZ3VyZSBkcml2ZSBmb3IgRE1BCisgKglAZHJpdmU6IElERSBkcml2ZSB0byBjb25maWd1cmUKKyAqCisgKglTZXQgdXAgYSBBVElJWFAgaW50ZXJmYWNlIGNoYW5uZWwgZm9yIHRoZSBiZXN0IGF2YWlsYWJsZSBzcGVlZC4KKyAqCVdlIHByZWZlciBVRE1BIGlmIGl0IGlzIGF2YWlsYWJsZSBhbmQgdGhlbiBNV0RNQS4gSWYgRE1BIGlzCisgKglub3QgYXZhaWxhYmxlIHdlIHN3aXRjaCB0byBQSU8gYW5kIHJldHVybiAwLgorICovCisKK3N0YXRpYyBpbnQgYXRpaXhwX2NvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBzcGVlZCA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIGF0aWl4cF9yYXRlbWFzayhkcml2ZSkpOworCisJLyogSWYgbm8gRE1BIHNwZWVkIHdhcyBhdmFpbGFibGUgdGhlbiBkaXNhYmxlIERNQSBhbmQgdXNlIFBJTy4gKi8KKwlpZiAoIXNwZWVkKSB7CisJCXU4IHRzcGVlZCA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCA1LCBOVUxMKTsKKwkJc3BlZWQgPSBhdGlpeHBfZG1hXzJfcGlvKFhGRVJfUElPXzAgKyB0c3BlZWQpICsgWEZFUl9QSU9fMDsKKwl9CisKKwkodm9pZCkgYXRpaXhwX3NwZWVkcHJvYyhkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKKy8qKgorICoJYXRpaXhwX2RtYV9jaGVjawktCXNldCB1cCBhbiBJREUgZGV2aWNlCisgKglAZHJpdmU6IElERSBkcml2ZSB0byBjb25maWd1cmUKKyAqCisgKglTZXQgdXAgdGhlIEFUSUlYUCBpbnRlcmZhY2UgZm9yIHRoZSBiZXN0IGF2YWlsYWJsZSBzcGVlZCBvbiB0aGlzCisgKglpbnRlcmZhY2UsIHByZWZlcnJpbmcgRE1BIHRvIFBJTy4KKyAqLworCitzdGF0aWMgaW50IGF0aWl4cF9kbWFfY2hlY2soaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisJdTggdHNwZWVkLCBzcGVlZDsKKworCWRyaXZlLT5pbml0X3NwZWVkID0gMDsKKworCWlmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAmJiBkcml2ZS0+YXV0b2RtYSkgeworCisJCWlmIChpZGVfdXNlX2RtYShkcml2ZSkpIHsKKwkJCWlmIChhdGlpeHBfY29uZmlnX2RyaXZlX2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJdHNwZWVkID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCAyNTUsIDUsIE5VTEwpOworCQlzcGVlZCA9IGF0aWl4cF9kbWFfMl9waW8oWEZFUl9QSU9fMCArIHRzcGVlZCkgKyBYRkVSX1BJT18wOworCQlod2lmLT5zcGVlZHByb2MoZHJpdmUsIHNwZWVkKTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaW5pdF9od2lmX2F0aWl4cAkJLQlmaWxsIGluIHRoZSBod2lmIGZvciB0aGUgQVRJSVhQCisgKglAaHdpZjogSURFIGludGVyZmFjZQorICoKKyAqCVNldCB1cCB0aGUgaWRlX2h3aWZfdCBmb3IgdGhlIEFUSUlYUCBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZQorICoJY2FwYWJpbGl0aWVzIG9mIHRoZSBoYXJkd2FyZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2F0aWl4cChpZGVfaHdpZl90ICpod2lmKQoreworCWlmICghaHdpZi0+aXJxKQorCQlod2lmLT5pcnEgPSBod2lmLT5jaGFubmVsID8gMTUgOiAxNDsKKworCWh3aWYtPmF1dG9kbWEgPSAwOworCWh3aWYtPnR1bmVwcm9jID0gJmF0aWl4cF90dW5lcHJvYzsKKwlod2lmLT5zcGVlZHByb2MgPSAmYXRpaXhwX3NwZWVkcHJvYzsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKQorCQlyZXR1cm47CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCWh3aWYtPnVsdHJhX21hc2sgPSAweDNmOworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA2OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA0OworCisJLyogRklYTUU6IHByb3BlciBjYWJsZSBkZXRlY3Rpb24gbmVlZGVkICovCisJaHdpZi0+dWRtYV9mb3VyID0gMTsKKwlod2lmLT5pZGVfZG1hX2hvc3Rfb24gPSAmYXRpaXhwX2lkZV9kbWFfaG9zdF9vbjsKKwlod2lmLT5pZGVfZG1hX2hvc3Rfb2ZmID0gJmF0aWl4cF9pZGVfZG1hX2hvc3Rfb2ZmOworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmYXRpaXhwX2RtYV9jaGVjazsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBhdGlpeHBfcGNpX2luZm9bXSBfX2RldmluaXRkYXRhID0geworCXsJLyogMCAqLworCQkubmFtZQkJPSAiQVRJSVhQIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9hdGlpeHAsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NDgsMHgwMSwweDAwfSwgezB4NDgsMHgwOCwweDAwfX0sCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0KK307CisKKy8qKgorICoJYXRpaXhwX2luaXRfb25lCS0JY2FsbGVkIHdoZW4gYSBBVElJWFAgaXMgZm91bmQKKyAqCUBkZXY6IHRoZSBhdGlpeHAgZGV2aWNlCisgKglAaWQ6IHRoZSBtYXRjaGluZyBwY2kgaWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgUENJIHJlZ2lzdHJhdGlvbiBsYXllciAob3IgdGhlIElERSBpbml0aWFsaXphdGlvbikKKyAqCWZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nIG91ciBJREUgZGV2aWNlIHRhYmxlcy4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGlpeHBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZhdGlpeHBfcGNpX2luZm9baWQtPmRyaXZlcl9kYXRhXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGlpeHBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDIwMF9JREUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDMwMF9JREUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDQwMF9JREUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXRpaXhwX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJBVElJWFBfSURFIiwKKwkuaWRfdGFibGUJPSBhdGlpeHBfcGNpX3RibCwKKwkucHJvYmUJCT0gYXRpaXhwX2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBhdGlpeHBfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0aWl4cF9pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkhVSSBZVSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgQVRJIElYUCBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9jbWQ2NDAuYyBiL2RyaXZlcnMvaWRlL3BjaS9jbWQ2NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmEyYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2NtZDY0MC5jCkBAIC0wLDAgKzEsODc5IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9jbWQ2NDAuYwkJVmVyc2lvbiAxLjAyICBTZXAgMDEsIDE5OTYKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycyAoc2VlIGJlbG93KQorICovCisKKy8qCisgKiAgT3JpZ2luYWwgYXV0aG9yczoJYWJyYW1vdkBjZWNtb3cuZW5ldC5kZWMuY29tIChJZ29yIEFicmFtb3YpCisgKiAgCQkJbWxvcmRAcG9ib3guY29tIChNYXJrIExvcmQpCisgKgorICogIFNlZSBsaW51eC9NQUlOVEFJTkVSUyBmb3IgYWRkcmVzcyBvZiBjdXJyZW50IG1haW50YWluZXIuCisgKgorICogIFRoaXMgZmlsZSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIGJ1Z3MKKyAqICBvZiBJREUgaW50ZXJmYWNlcyB1c2luZyB0aGUgQ01EIFRlY2hub2xvZ2llcyAwNjQwIElERSBpbnRlcmZhY2UgY2hpcC4KKyAqCisgKiAgVGhlc2UgY2hpcHMgYXJlIGJhc2ljYWxseSBmdWNrZWQgYnkgZGVzaWduLCBhbmQgZ2V0dGluZyB0aGlzIGRyaXZlcgorICogIHRvIHdvcmsgb24gZXZlcnkgbW90aGVyYm9hcmQgZGVzaWduIHRoYXQgdXNlcyB0aGlzIHNjcmV3ZWQgY2hpcCBzZWVtcworICogIGJsb29keSB3ZWxsIGltcG9zc2libGUuICBIb3dldmVyLCB3ZSdyZSBzdGlsbCB0cnlpbmcuCisgKgorICogIFZlcnNpb24gMC45NyB3b3JrZWQgZm9yIGV2ZXJ5Ym9keS4KKyAqCisgKiAgVXNlciBmZWVkYmFjayBpcyBlc3NlbnRpYWwuICBNYW55IHRoYW5rcyB0byB0aGUgYmV0YSB0ZXN0IHRlYW06CisgKgorICogIEEuSGFydGdlcnNAc3R1ZC50dWUubmwsIEpaRFFDQENVTllWTS5DVU5ZLmVkdSwgYWJyYW1vdkBjZWNtb3cuZW5ldC5kZWMuY29tLAorICogIGJhcmRqQHV0b3BpYS5wcHAuc24ubm8sIGJhcnRAZ2FnYS50dWUubmwsIGJib2wwMDFAY3MuYXVja2xhbmQuYWMubnosCisgKiAgY2hyaXNjQGRiYXNzLmRlbW9uLmNvLnVrLCBkYWxlY2tpQG5hbXUyNi5OdW0uTWF0aC5VbmktR29ldHRpbmdlbi5kZSwKKyAqICBkZXJla25AdncuZWNlLmNtdS5lZHUsIGZsb3JpYW5AYnRwMngzLnBoeS51bmktYmF5cmV1dGguZGUsCisgKiAgZmx5bm5AZGVpLnVuaXBkLml0LCBnYWRpb0BuZXR2aXNpb24ubmV0LmlsLCBnb2R6aWxsYUBmdXR1cmlzLm5ldCwKKyAqICBqQHBvYm94LmNvbSwgamtlbXAxQG1pc2VzLnVuaS1wYWRlcmJvcm4uZGUsIGp0b3BwZUBoaXdhYXkubmV0LAorICogIGtlcm91YWNAc3NuZXQuY29tLCBtZXNrZXNAaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZSwgaHpvbGlAY3MuZWx0ZS5odSwKKyAqICBwZXRlckB1ZGdhYXJkLmlzZ3RlYy5jb20sIHBoaWxAdGF6ZW5kYS5kZW1vbi5jby51aywgcm9hZGNhcHdAY2Z3LmNvbSwKKyAqICBzMDAzM2xhc0BzdW4xMC52c3ouYm1lLmh1LCBzY2hhZmZlckB0YW0uY29ybmVsbC5lZHUsIHNqZEBzbGlwLm5ldCwKKyAqICBzdGV2ZUBlaS5vcmcsIHVscnBlZ0BiaWdjb21tLmd1bi5kZSwgaXNtQHRhcmRpcy5lZC5hYy51aywgbWFja0BjcmF5LmNvbQorICogIGxpdWdAbWFtYS5pbmRzdGF0ZS5lZHUsIGFuZCBvdGhlcnMuCisgKgorICogIFZlcnNpb24gMC4wMQlJbml0aWFsIHZlcnNpb24sIGhhY2tlZCBvdXQgb2YgaWRlLmMsCisgKgkJCWFuZCAjaW5jbHVkZSdkIHJhdGhlciB0aGFuIGNvbXBpbGVkIHNlcGFyYXRlbHkuCisgKgkJCVRoaXMgd2lsbCBnZXQgY2xlYW5lZCB1cCBpbiBhIHN1YnNlcXVlbnQgcmVsZWFzZS4KKyAqCisgKiAgVmVyc2lvbiAwLjAyCUZpeGVzIGZvciB2bGIgaW5pdGlhbGl6YXRpb24gY29kZSwgZW5hYmxlIHByZWZldGNoCisgKgkJCWZvciB2ZXJzaW9ucyAnQicgYW5kICdDJyBvZiBjaGlwIGJ5IGRlZmF1bHQsCisgKgkJCXNvbWUgY29kZSBjbGVhbnVwLgorICoKKyAqICBWZXJzaW9uIDAuMDMJQWRkZWQgcmVzZXQgb2Ygc2Vjb25kYXJ5IGludGVyZmFjZSwKKyAqCQkJYW5kIGJsYWNrIGxpc3QgZm9yIGRldmljZXMgd2hpY2ggYXJlIG5vdCBjb21wYXRpYmxlCisgKgkJCXdpdGggcHJlZmV0Y2ggbW9kZS4gU2VwYXJhdGUgZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAqCQkJcHJlZmV0Y2ggaXMgYWRkZWQsIHBvc3NpYmx5IGl0IHdpbGwgYmUgY2FsbGVkIHNvbWUKKyAqCQkJZGF5IGZyb20gaW9jdGwgcHJvY2Vzc2luZyBjb2RlLgorICoKKyAqICBWZXJzaW9uIDAuMDQJTm93IGNvbmZpZ3MvY29tcGlsZXMgc2VwYXJhdGUgZnJvbSBpZGUuYworICoKKyAqICBWZXJzaW9uIDAuMDUJTWFqb3IgcmV3cml0ZSBvZiBpbnRlcmZhY2UgdGltaW5nIGNvZGUuCisgKgkJCUFkZGVkIG5ldyBmdW5jdGlvbiBjbWQ2NDBfc2V0X21vZGUgdG8gc2V0IFBJTyBtb2RlCisgKgkJCWZyb20gaW9jdGwgY2FsbC4gTmV3IGRyaXZlcyBhZGRlZCB0byBibGFjayBsaXN0LgorICoKKyAqICBWZXJzaW9uIDAuMDYJTW9yZSBjb2RlIGNsZWFudXAuIFByZWZldGNoIGlzIGVuYWJsZWQgb25seSBmb3IKKyAqCQkJZGV0ZWN0ZWQgaGFyZCBkcml2ZXMsIG5vdCBpbmNsdWRlZCBpbiBwcmVmZXRjaAorICoJCQlibGFjayBsaXN0LgorICoKKyAqICBWZXJzaW9uIDAuMDcJQ2hhbmdlZCB0byBtb3JlIGNvbnNlcnZhdGl2ZSBkcml2ZSB0dW5pbmcgcG9saWN5LgorICoJCQlVbmtub3duIGRyaXZlcywgd2hpY2ggcmVwb3J0IFBJTyA8IDQgYXJlIHNldCB0bworICoJCQkocmVwb3J0ZWRfUElPIC0gMSkgaWYgaXQgaXMgc3VwcG9ydGVkLCBvciB0byBQSU8wLgorICoJCQlMaXN0IG9mIGtub3duIGRyaXZlcyBleHRlbmRlZCBieSBpbmZvIHByb3ZpZGVkIGJ5CisgKgkJCUNNRCBhdCB0aGVpciBmdHAgc2l0ZS4KKyAqCisgKiAgVmVyc2lvbiAwLjA4CUFkZGVkIGF1dG90dW5lL25vYXV0b3R1bmUgc3VwcG9ydC4KKyAqCisgKiAgVmVyc2lvbiAwLjA5CVRyeSB0byBiZSBzbWFydGVyIGFib3V0IDJuZCBwb3J0IGVuYWJsaW5nLgorICogIFZlcnNpb24gMC4xMAlCZSBuaWNlIGFuZCBkb24ndCByZXNldCAybmQgcG9ydC4KKyAqICBWZXJzaW9uIDAuMTEJVHJ5IHRvIGhhbmRsZSBtb3JlIHdlaXJkIHNpdHVhdGlvbnMuCisgKgorICogIFZlcnNpb24gMC4xMglMb3RzIG9mIGJ1ZyBmaXhlcyBmcm9tIExhc3psbyBQZXRlcgorICoJCQlpcnEgdW5tYXNraW5nIGRpc2FibGVkIGZvciByZWxpYWJpbGl0eS4KKyAqCQkJdHJ5IHRvIGJlIGV2ZW4gc21hcnRlciBhYm91dCB0aGUgc2Vjb25kIHBvcnQuCisgKgkJCXRpZHkgdXAgc291cmNlIGNvZGUgZm9ybWF0dGluZy4KKyAqICBWZXJzaW9uIDAuMTMJcGVybWl0IGlycSB1bm1hc2tpbmcgYWdhaW4uCisgKiAgVmVyc2lvbiAwLjkwCW1hc3NpdmUgY29kZSBjbGVhbnVwLCBzb21lIGJ1Z3MgZml4ZWQuCisgKgkJCWRlZmF1bHRzIGFsbCBkcml2ZXMgdG8gUElPIG1vZGUwLCBwcmVmZXRjaCBvZmYuCisgKgkJCWF1dG90dW5lIGlzIE9GRiBieSBkZWZhdWx0LCB3aXRoIGNvbXBpbGUgdGltZSBmbGFnLgorICoJCQlwcmVmZXRjaCBjYW4gYmUgdHVybmVkIE9GRi9PTiB1c2luZyAiaGRwYXJtIC1wOC8tcDkiCisgKgkJCSAocmVxdWlyZXMgaGRwYXJtLTMuMSBvciBuZXdlcikKKyAqICBWZXJzaW9uIDAuOTEJZmlyc3QgcmVsZWFzZSB0byBsaW51eC1rZXJuZWwgbGlzdC4KKyAqICBWZXJzaW9uIDAuOTIJbW92ZSBpbml0aWFsIHJlZyBkdW1wIHRvIHNlcGFyYXRlIGNhbGxhYmxlIGZ1bmN0aW9uCisgKgkJCWNoYW5nZSAicmVhZGFoZWFkIiB0byAicHJlZmV0Y2giIHRvIGF2b2lkIGNvbmZ1c2lvbgorICogIFZlcnNpb24gMC45NQlyZXNwZWN0IG9yaWdpbmFsIEJJT1MgdGltaW5ncyB1bmxlc3MgYXV0b3R1bmluZy4KKyAqCQkJdG9ucyBvZiBjb2RlIGNsZWFudXAgYW5kIHJlYXJyYW5nZW1lbnQuCisgKgkJCWFkZGVkIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCBvcHRpb24KKyAqCQkJcHJldmVudCB1c2Ugb2YgdW5tYXNrIHdoZW4gcHJlZmV0Y2ggaXMgb24KKyAqICBWZXJzaW9uIDAuOTYJcHJldmVudCB1c2Ugb2YgaW9fMzJiaXQgd2hlbiBwcmVmZXRjaCBpcyBvZmYKKyAqICBWZXJzaW9uIDAuOTcJZml4IFZMQiBzZWNvbmRhcnkgaW50ZXJmYWNlIGZvciBzamRAc2xpcC5uZXQKKyAqCQkJb3RoZXIgbWlub3IgdHVuZS11cHM6ICAwLjk2IHdhcyB2ZXJ5IGdvb2QuCisgKiAgVmVyc2lvbiAwLjk4CWlnbm9yZSBQQ0kgdmVyc2lvbiB3aGVuIGRpc2FibGVkIGJ5IEJJT1MKKyAqICBWZXJzaW9uIDAuOTkJZGlzcGxheSBzZXR1cC9hY3RpdmUvcmVjb3ZlcnkgY2xvY2tzIHdpdGggUElPIG1vZGUKKyAqICBWZXJzaW9uIDEuMDAJTW1tLi4gY2Fubm90IGRlcGVuZCBvbiBQQ01EX0VOQSBpbiBhbGwgc3lzdGVtcworICogIFZlcnNpb24gMS4wMQlzbG93L2Zhc3QgZGV2c2VsIGNhbiBiZSBzZWxlY3RlZCB3aXRoICJoZHBhcm0gLXA2Ly1wNyIKKyAqCQkJICgiZmFzdCIgaXMgbmVjZXNzYXJ5IGZvciAzMmJpdCBJL08gaW4gc29tZSBzeXN0ZW1zKQorICogIFZlcnNpb24gMS4wMglmaXggYnVnIHRoYXQgcmVzdWx0ZWQgaW4gc2xvdyAic2V0dXAgdGltZXMiCisgKgkJCSAocGF0Y2ggY291cnRlc3kgb2YgWm9sdGFuIEhpZHZlZ2kpCisgKi8KKworI3VuZGVmIFJFQUxMWV9TTE9XX0lPCQkvKiBtb3N0IHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisjZGVmaW5lIENNRDY0MF9QUkVGRVRDSF9NQVNLUyAxCisKKy8vI2RlZmluZSBDTUQ2NDBfRFVNUF9SRUdTCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBUaGlzIGZsYWcgaXMgc2V0IGluIGlkZS5jIGJ5IHRoZSBwYXJhbWV0ZXI6ICBpZGUwPWNtZDY0MF92bGIKKyAqLworaW50IGNtZDY0MF92bGIgPSAwOworCisvKgorICogQ01ENjQwIHNwZWNpZmljIHJlZ2lzdGVycyBkZWZpbml0aW9uLgorICovCisKKyNkZWZpbmUgVklECQkweDAwCisjZGVmaW5lIERJRAkJMHgwMgorI2RlZmluZSBQQ01ECQkweDA0CisjZGVmaW5lICAgUENNRF9FTkEJMHgwMQorI2RlZmluZSBQU1RUUwkJMHgwNgorI2RlZmluZSBSRVZJRAkJMHgwOAorI2RlZmluZSBQUk9HSUYJCTB4MDkKKyNkZWZpbmUgU1VCQ0wJCTB4MGEKKyNkZWZpbmUgQkFTQ0wJCTB4MGIKKyNkZWZpbmUgQmFzZUEwCQkweDEwCisjZGVmaW5lIEJhc2VBMQkJMHgxNAorI2RlZmluZSBCYXNlQTIJCTB4MTgKKyNkZWZpbmUgQmFzZUEzCQkweDFjCisjZGVmaW5lIElOVExJTkUJCTB4M2MKKyNkZWZpbmUgSU5QSU5FCQkweDNkCisKKyNkZWZpbmUJQ0ZSCQkweDUwCisjZGVmaW5lICAgQ0ZSX0RFVlJFVgkJMHgwMworI2RlZmluZSAgIENGUl9JREUwMUlOVFIJCTB4MDQKKyNkZWZpbmUJICBDRlJfREVWSUQJCTB4MTgKKyNkZWZpbmUJICBDRlJfQVRfVkVTQV8wNzhoCTB4MjAKKyNkZWZpbmUJICBDRlJfRFNBMQkJMHg0MAorI2RlZmluZQkgIENGUl9EU0EwCQkweDgwCisKKyNkZWZpbmUgQ05UUkwJCTB4NTEKKyNkZWZpbmUJICBDTlRSTF9ESVNfUkEwCQkweDQwCisjZGVmaW5lICAgQ05UUkxfRElTX1JBMQkJMHg4MAorI2RlZmluZQkgIENOVFJMX0VOQV8yTkQJCTB4MDgKKworI2RlZmluZQlDTURUSU0JCTB4NTIKKyNkZWZpbmUJQVJUVElNMAkJMHg1MworI2RlZmluZQlEUldUSU0wCQkweDU0CisjZGVmaW5lIEFSVFRJTTEgCTB4NTUKKyNkZWZpbmUgRFJXVElNMQkJMHg1NgorI2RlZmluZSBBUlRUSU0yMwkweDU3CisjZGVmaW5lICAgQVJUVElNMjNfRElTX1JBMgkweDA0CisjZGVmaW5lICAgQVJUVElNMjNfRElTX1JBMwkweDA4CisjZGVmaW5lIERSV1RJTTIzCTB4NTgKKyNkZWZpbmUgQlJTVAkJMHg1OQorCisvKgorICogUmVnaXN0ZXJzIGFuZCBtYXNrcyBmb3IgZWFzeSBhY2Nlc3MgYnkgZHJpdmUgaW5kZXg6CisgKi8KK3N0YXRpYyB1OCBwcmVmZXRjaF9yZWdzWzRdICA9IHtDTlRSTCwgQ05UUkwsIEFSVFRJTTIzLCBBUlRUSU0yM307CitzdGF0aWMgdTggcHJlZmV0Y2hfbWFza3NbNF0gPSB7Q05UUkxfRElTX1JBMCwgQ05UUkxfRElTX1JBMSwgQVJUVElNMjNfRElTX1JBMiwgQVJUVElNMjNfRElTX1JBM307CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQKKworc3RhdGljIHU4IGFydHRpbV9yZWdzWzRdID0ge0FSVFRJTTAsIEFSVFRJTTEsIEFSVFRJTTIzLCBBUlRUSU0yM307CitzdGF0aWMgdTggZHJ3dGltX3JlZ3NbNF0gPSB7RFJXVElNMCwgRFJXVElNMSwgRFJXVElNMjMsIERSV1RJTTIzfTsKKworLyoKKyAqIEN1cnJlbnQgY21kNjQwIHRpbWluZyB2YWx1ZXMgZm9yIGVhY2ggZHJpdmUuCisgKiBUaGUgZGVmYXVsdHMgZm9yIGVhY2ggYXJlIHRoZSBzbG93ZXN0IHBvc3NpYmxlIHRpbWluZ3MuCisgKi8KK3N0YXRpYyB1OCBzZXR1cF9jb3VudHNbNF0gICAgPSB7NCwgNCwgNCwgNH07ICAgICAvKiBBZGRyZXNzIHNldHVwIGNvdW50IChpbiBjbG9ja3MpICovCitzdGF0aWMgdTggYWN0aXZlX2NvdW50c1s0XSAgID0gezE2LCAxNiwgMTYsIDE2fTsgLyogQWN0aXZlIGNvdW50ICAgKGVuY29kZWQpICovCitzdGF0aWMgdTggcmVjb3ZlcnlfY291bnRzWzRdID0gezE2LCAxNiwgMTYsIDE2fTsgLyogUmVjb3ZlcnkgY291bnQgKGVuY29kZWQpICovCisKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBpbml0aWFsaXplZCB0byBwb2ludCBhdCB0aGUgZGV2aWNlcyB3ZSBjb250cm9sCisgKi8KK3N0YXRpYyBpZGVfaHdpZl90ICAqY21kX2h3aWYwLCAqY21kX2h3aWYxOworc3RhdGljIGlkZV9kcml2ZV90ICpjbWRfZHJpdmVzWzRdOworCisvKgorICogSW50ZXJmYWNlIHRvIGFjY2VzcyBjbWQ2NDB4IHJlZ2lzdGVycworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNtZDY0MF9rZXk7CitzdGF0aWMgdm9pZCAoKl9fcHV0X2NtZDY0MF9yZWcpKHUxNiByZWcsIHU4IHZhbCk7CitzdGF0aWMgdTggKCpfX2dldF9jbWQ2NDBfcmVnKSh1MTYgcmVnKTsKKworLyoKKyAqIFRoaXMgaXMgcmVhZCBmcm9tIHRoZSBDRlIgcmVnLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBjbWQ2NDBfY2hpcF92ZXJzaW9uOworCisvKgorICogVGhlIENNRDY0MHggY2hpcCBkb2VzIG5vdCBzdXBwb3J0IERXT1JEIGNvbmZpZyB3cml0ZSBjeWNsZXMsIGJ1dCBzb21lCisgKiBvZiB0aGUgQklPU2VzIHVzZSB0aGVtIHRvIGltcGxlbWVudCB0aGUgY29uZmlnIHNlcnZpY2VzLgorICogVGhlcmVmb3JlLCB3ZSBtdXN0IHVzZSBkaXJlY3QgSU8gaW5zdGVhZC4KKyAqLworCisvKiBQQ0kgbWV0aG9kIDEgYWNjZXNzICovCisKK3N0YXRpYyB2b2lkIHB1dF9jbWQ2NDBfcmVnX3BjaTEgKHUxNiByZWcsIHU4IHZhbCkKK3sKKwlvdXRsX3AoKHJlZyAmIDB4ZmMpIHwgY21kNjQwX2tleSwgMHhjZjgpOworCW91dGJfcCh2YWwsIChyZWcgJiAzKSB8IDB4Y2ZjKTsKK30KKworc3RhdGljIHU4IGdldF9jbWQ2NDBfcmVnX3BjaTEgKHUxNiByZWcpCit7CisJb3V0bF9wKChyZWcgJiAweGZjKSB8IGNtZDY0MF9rZXksIDB4Y2Y4KTsKKwlyZXR1cm4gaW5iX3AoKHJlZyAmIDMpIHwgMHhjZmMpOworfQorCisvKiBQQ0kgbWV0aG9kIDIgYWNjZXNzIChmcm9tIENNRCBkYXRhc2hlZXQpICovCisKK3N0YXRpYyB2b2lkIHB1dF9jbWQ2NDBfcmVnX3BjaTIgKHUxNiByZWcsIHU4IHZhbCkKK3sKKwlvdXRiX3AoMHgxMCwgMHhjZjgpOworCW91dGJfcCh2YWwsIGNtZDY0MF9rZXkgKyByZWcpOworCW91dGJfcCgwLCAweGNmOCk7Cit9CisKK3N0YXRpYyB1OCBnZXRfY21kNjQwX3JlZ19wY2kyICh1MTYgcmVnKQoreworCXU4IGI7CisKKwlvdXRiX3AoMHgxMCwgMHhjZjgpOworCWIgPSBpbmJfcChjbWQ2NDBfa2V5ICsgcmVnKTsKKwlvdXRiX3AoMCwgMHhjZjgpOworCXJldHVybiBiOworfQorCisvKiBWTEIgYWNjZXNzICovCisKK3N0YXRpYyB2b2lkIHB1dF9jbWQ2NDBfcmVnX3ZsYiAodTE2IHJlZywgdTggdmFsKQoreworCW91dGJfcChyZWcsIGNtZDY0MF9rZXkpOworCW91dGJfcCh2YWwsIGNtZDY0MF9rZXkgKyA0KTsKK30KKworc3RhdGljIHU4IGdldF9jbWQ2NDBfcmVnX3ZsYiAodTE2IHJlZykKK3sKKwlvdXRiX3AocmVnLCBjbWQ2NDBfa2V5KTsKKwlyZXR1cm4gaW5iX3AoY21kNjQwX2tleSArIDQpOworfQorCitzdGF0aWMgdTggZ2V0X2NtZDY0MF9yZWcodTE2IHJlZykKK3sKKwl1OCBiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwliID0gX19nZXRfY21kNjQwX3JlZyhyZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jbWQ2NDBfcmVnKHUxNiByZWcsIHU4IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJX19wdXRfY21kNjQwX3JlZyhyZWcsdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtYXRjaF9wY2lfY21kNjQwX2RldmljZSAodm9pZCkKK3sKKwljb25zdCB1OCB2ZW5fZGV2WzRdID0gezB4OTUsIDB4MTAsIDB4NDAsIDB4MDZ9OworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGdldF9jbWQ2NDBfcmVnKGkpICE9IHZlbl9kZXZbaV0pCisJCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgU1RVUElETFlfVFJVU1RfQlJPS0VOX1BDTURfRU5BX0JJVAorCWlmICgoZ2V0X2NtZDY0MF9yZWcoUENNRCkgJiBQQ01EX0VOQSkgPT0gMCkgeworCQlwcmludGsoImlkZTogY21kNjQwIG9uIFBDSSBkaXNhYmxlZCBieSBCSU9TXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIFNUVVBJRExZX1RSVVNUX0JST0tFTl9QQ01EX0VOQV9CSVQgKi8KKwlyZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCisvKgorICogUHJvYmUgZm9yIENNRDY0MHggLS0gcGNpIG1ldGhvZCAxCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2Zvcl9jbWQ2NDBfcGNpMSAodm9pZCkKK3sKKwlfX2dldF9jbWQ2NDBfcmVnID0gZ2V0X2NtZDY0MF9yZWdfcGNpMTsKKwlfX3B1dF9jbWQ2NDBfcmVnID0gcHV0X2NtZDY0MF9yZWdfcGNpMTsKKwlmb3IgKGNtZDY0MF9rZXkgPSAweDgwMDAwMDAwOworCSAgICAgY21kNjQwX2tleSA8PSAweDgwMDBmODAwOworCSAgICAgY21kNjQwX2tleSArPSAweDgwMCkgeworCQlpZiAobWF0Y2hfcGNpX2NtZDY0MF9kZXZpY2UoKSkKKwkJCXJldHVybiAxOyAvKiBzdWNjZXNzICovCisJfQorCXJldHVybiAwOworfQorCisvKgorICogUHJvYmUgZm9yIENNRDY0MHggLS0gcGNpIG1ldGhvZCAyCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2Zvcl9jbWQ2NDBfcGNpMiAodm9pZCkKK3sKKwlfX2dldF9jbWQ2NDBfcmVnID0gZ2V0X2NtZDY0MF9yZWdfcGNpMjsKKwlfX3B1dF9jbWQ2NDBfcmVnID0gcHV0X2NtZDY0MF9yZWdfcGNpMjsKKwlmb3IgKGNtZDY0MF9rZXkgPSAweGMwMDA7IGNtZDY0MF9rZXkgPD0gMHhjZjAwOyBjbWQ2NDBfa2V5ICs9IDB4MTAwKSB7CisJCWlmIChtYXRjaF9wY2lfY21kNjQwX2RldmljZSgpKQorCQkJcmV0dXJuIDE7IC8qIHN1Y2Nlc3MgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9iZSBmb3IgQ01ENjQweCAtLSB2bGIKKyAqLworc3RhdGljIGludCBfX2luaXQgcHJvYmVfZm9yX2NtZDY0MF92bGIgKHZvaWQpCit7CisJdTggYjsKKworCV9fZ2V0X2NtZDY0MF9yZWcgPSBnZXRfY21kNjQwX3JlZ192bGI7CisJX19wdXRfY21kNjQwX3JlZyA9IHB1dF9jbWQ2NDBfcmVnX3ZsYjsKKwljbWQ2NDBfa2V5ID0gMHgxNzg7CisJYiA9IGdldF9jbWQ2NDBfcmVnKENGUik7CisJaWYgKGIgPT0gMHhmZiB8fCBiID09IDB4MDAgfHwgKGIgJiBDRlJfQVRfVkVTQV8wNzhoKSkgeworCQljbWQ2NDBfa2V5ID0gMHg3ODsKKwkJYiA9IGdldF9jbWQ2NDBfcmVnKENGUik7CisJCWlmIChiID09IDB4ZmYgfHwgYiA9PSAweDAwIHx8ICEoYiAmIENGUl9BVF9WRVNBXzA3OGgpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOyAvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiAgUmV0dXJucyAxIGlmIGFuIElERSBpbnRlcmZhY2UvZHJpdmUgZXhpc3RzIGF0IDB4MTcwLAorICogIFJldHVybnMgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNlY29uZGFyeV9wb3J0X3Jlc3BvbmRpbmcgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCisJb3V0Yl9wKDB4MGEsIDB4MTcwICsgSURFX1NFTEVDVF9PRkZTRVQpOwkvKiBzZWxlY3QgZHJpdmUwICovCisJdWRlbGF5KDEwMCk7CisJaWYgKChpbmJfcCgweDE3MCArIElERV9TRUxFQ1RfT0ZGU0VUKSAmIDB4MWYpICE9IDB4MGEpIHsKKwkJb3V0Yl9wKDB4MWEsIDB4MTcwICsgSURFX1NFTEVDVF9PRkZTRVQpOyAvKiBzZWxlY3QgZHJpdmUxICovCisJCXVkZWxheSgxMDApOworCQlpZiAoKGluYl9wKDB4MTcwICsgSURFX1NFTEVDVF9PRkZTRVQpICYgMHgxZikgIT0gMHgxYSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOyAvKiBub3RoaW5nIHJlc3BvbmRlZCAqLworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7IC8qIHN1Y2Nlc3MgKi8KK30KKworI2lmZGVmIENNRDY0MF9EVU1QX1JFR1MKKy8qCisgKiBEdW1wIG91dCBhbGwgY21kNjQwIHJlZ2lzdGVycy4gIE1heSBiZSBjYWxsZWQgZnJvbSBpZGUuYworICovCitzdGF0aWMgdm9pZCBjbWQ2NDBfZHVtcF9yZWdzICh2b2lkKQoreworCXVuc2lnbmVkIGludCByZWcgPSBjbWQ2NDBfdmxiID8gMHg1MCA6IDB4MDA7CisKKwkvKiBEdW1wIGN1cnJlbnQgc3RhdGUgb2YgY2hpcCByZWdpc3RlcnMgKi8KKwlwcmludGsoImlkZTogY21kNjQwIGludGVybmFsIHJlZ2lzdGVyIGR1bXA6Iik7CisJZm9yICg7IHJlZyA8PSAweDU5OyByZWcrKykgeworCQlpZiAoIShyZWcgJiAweDBmKSkKKwkJCXByaW50aygiXG4lMDR4OiIsIHJlZyk7CisJCXByaW50aygiICUwMngiLCBnZXRfY21kNjQwX3JlZyhyZWcpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHByZWZldGNoIGlzIG9uIGZvciBhIGRyaXZlLAorICogYW5kIGluaXRpYWxpemUgdGhlIHVubWFzayBmbGFncyBmb3Igc2FmZSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja19wcmVmZXRjaCAodW5zaWduZWQgaW50IGluZGV4KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGNtZF9kcml2ZXNbaW5kZXhdOworCXU4IGIgPSBnZXRfY21kNjQwX3JlZyhwcmVmZXRjaF9yZWdzW2luZGV4XSk7CisKKwlpZiAoYiAmIHByZWZldGNoX21hc2tzW2luZGV4XSkgewkvKiBpcyBwcmVmZXRjaCBvZmY/ICovCisJCWRyaXZlLT5ub191bm1hc2sgPSAwOworCQlkcml2ZS0+bm9faW9fMzJiaXQgPSAxOworCQlkcml2ZS0+aW9fMzJiaXQgPSAwOworCX0gZWxzZSB7CisjaWYgQ01ENjQwX1BSRUZFVENIX01BU0tTCisJCWRyaXZlLT5ub191bm1hc2sgPSAxOworCQlkcml2ZS0+dW5tYXNrID0gMDsKKyNlbmRpZgorCQlkcml2ZS0+bm9faW9fMzJiaXQgPSAwOworCX0KK30KKworLyoKKyAqIEZpZ3VyZSBvdXQgd2hpY2ggZGV2aWNlcyB3ZSBjb250cm9sCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9kZXZpY2VfcHRycyAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNtZF9od2lmMCA9ICZpZGVfaHdpZnNbMF07IC8qIGRlZmF1bHQsIGlmIG5vdCBmb3VuZCBiZWxvdyAqLworCWNtZF9od2lmMSA9ICZpZGVfaHdpZnNbMV07IC8qIGRlZmF1bHQsIGlmIG5vdCBmb3VuZCBiZWxvdyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdJRlM7IGkrKykgeworCQlpZGVfaHdpZl90ICpod2lmID0gJmlkZV9od2lmc1tpXTsKKwkJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3Vua25vd24gfHwgaHdpZi0+Y2hpcHNldCA9PSBpZGVfZm9yY2VkKSB7CisJCQlpZiAoaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSA9PSAweDFmMCkKKwkJCQljbWRfaHdpZjAgPSBod2lmOworCQkJZWxzZSBpZiAoaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSA9PSAweDE3MCkKKwkJCQljbWRfaHdpZjEgPSBod2lmOworCQl9CisJfQorCWNtZF9kcml2ZXNbMF0gPSAmY21kX2h3aWYwLT5kcml2ZXNbMF07CisJY21kX2RyaXZlc1sxXSA9ICZjbWRfaHdpZjAtPmRyaXZlc1sxXTsKKwljbWRfZHJpdmVzWzJdID0gJmNtZF9od2lmMS0+ZHJpdmVzWzBdOworCWNtZF9kcml2ZXNbM10gPSAmY21kX2h3aWYxLT5kcml2ZXNbMV07Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQKKworLyoKKyAqIFNldHMgcHJlZmV0Y2ggbW9kZSBmb3IgYSBkcml2ZS4KKyAqLworc3RhdGljIHZvaWQgc2V0X3ByZWZldGNoX21vZGUgKHVuc2lnbmVkIGludCBpbmRleCwgaW50IG1vZGUpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gY21kX2RyaXZlc1tpbmRleF07CisJaW50IHJlZyA9IHByZWZldGNoX3JlZ3NbaW5kZXhdOworCXU4IGI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWIgPSBfX2dldF9jbWQ2NDBfcmVnKHJlZyk7CisJaWYgKG1vZGUpIHsJLyogd2FudCBwcmVmZXRjaCBvbj8gKi8KKyNpZiBDTUQ2NDBfUFJFRkVUQ0hfTUFTS1MKKwkJZHJpdmUtPm5vX3VubWFzayA9IDE7CisJCWRyaXZlLT51bm1hc2sgPSAwOworI2VuZGlmCisJCWRyaXZlLT5ub19pb18zMmJpdCA9IDA7CisJCWIgJj0gfnByZWZldGNoX21hc2tzW2luZGV4XTsJLyogZW5hYmxlIHByZWZldGNoICovCisJfSBlbHNlIHsKKwkJZHJpdmUtPm5vX3VubWFzayA9IDA7CisJCWRyaXZlLT5ub19pb18zMmJpdCA9IDE7CisJCWRyaXZlLT5pb18zMmJpdCA9IDA7CisJCWIgfD0gcHJlZmV0Y2hfbWFza3NbaW5kZXhdOwkvKiBkaXNhYmxlIHByZWZldGNoICovCisJfQorCV9fcHV0X2NtZDY0MF9yZWcocmVnLCBiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogRHVtcCBvdXQgY3VycmVudCBkcml2ZSBjbG9ja3Mgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQgZGlzcGxheV9jbG9ja3MgKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1OCBhY3RpdmVfY291bnQsIHJlY292ZXJ5X2NvdW50OworCisJYWN0aXZlX2NvdW50ID0gYWN0aXZlX2NvdW50c1tpbmRleF07CisJaWYgKGFjdGl2ZV9jb3VudCA9PSAxKQorCQkrK2FjdGl2ZV9jb3VudDsKKwlyZWNvdmVyeV9jb3VudCA9IHJlY292ZXJ5X2NvdW50c1tpbmRleF07CisJaWYgKGFjdGl2ZV9jb3VudCA+IDMgJiYgcmVjb3ZlcnlfY291bnQgPT0gMSkKKwkJKytyZWNvdmVyeV9jb3VudDsKKwlpZiAoY21kNjQwX2NoaXBfdmVyc2lvbiA+IDEpCisJCXJlY292ZXJ5X2NvdW50ICs9IDE7ICAvKiBjbWQ2NDBiIHVzZXMgKGNvdW50ICsgMSkqLworCXByaW50aygiLCBjbG9ja3M9JWQvJWQvJWRcbiIsIHNldHVwX2NvdW50c1tpbmRleF0sIGFjdGl2ZV9jb3VudCwgcmVjb3ZlcnlfY291bnQpOworfQorCisvKgorICogUGFjayBhY3RpdmUgYW5kIHJlY292ZXJ5IGNvdW50cyBpbnRvIHNpbmdsZSBieXRlIHJlcHJlc2VudGF0aW9uCisgKiB1c2VkIGJ5IGNvbnRyb2xsZXIKKyAqLworaW5saW5lIHN0YXRpYyB1OCBwYWNrX25pYmJsZXMgKHU4IHVwcGVyLCB1OCBsb3dlcikKK3sKKwlyZXR1cm4gKCh1cHBlciAmIDB4MGYpIDw8IDQpIHwgKGxvd2VyICYgMHgwZik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmV0cmlldmVzIHRoZSBpbml0aWFsIGRyaXZlIHRpbWluZ3MgZnJvbSB0aGUgY2hpcHNldC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJldHJpZXZlX2RyaXZlX2NvdW50cyAodW5zaWduZWQgaW50IGluZGV4KQoreworCXU4IGI7CisKKwkvKgorCSAqIEdldCB0aGUgaW50ZXJuYWwgc2V0dXAgdGltaW5nLCBhbmQgY29udmVydCB0byBjbG9jayBjb3VudAorCSAqLworCWIgPSBnZXRfY21kNjQwX3JlZyhhcnR0aW1fcmVnc1tpbmRleF0pICYgfjB4M2Y7CisJc3dpdGNoIChiKSB7CisJCWNhc2UgMHgwMDogYiA9IDQ7IGJyZWFrOworCQljYXNlIDB4ODA6IGIgPSAzOyBicmVhazsKKwkJY2FzZSAweDQwOiBiID0gMjsgYnJlYWs7CisJCWRlZmF1bHQ6ICAgYiA9IDU7IGJyZWFrOworCX0KKwlzZXR1cF9jb3VudHNbaW5kZXhdID0gYjsKKworCS8qCisJICogR2V0IHRoZSBhY3RpdmUvcmVjb3ZlcnkgY291bnRzCisJICovCisJYiA9IGdldF9jbWQ2NDBfcmVnKGRyd3RpbV9yZWdzW2luZGV4XSk7CisJYWN0aXZlX2NvdW50c1tpbmRleF0gICA9IChiID4+IDQpICAgPyAoYiA+PiA0KSAgIDogMHgxMDsKKwlyZWNvdmVyeV9jb3VudHNbaW5kZXhdID0gKGIgJiAweDBmKSA/IChiICYgMHgwZikgOiAweDEwOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd3JpdGVzIHRoZSBwcmVwYXJlZCBzZXR1cC9hY3RpdmUvcmVjb3ZlcnkgY291bnRzCisgKiBmb3IgYSBkcml2ZSBpbnRvIHRoZSBjbWQ2NDAgY2hpcHNldCByZWdpc3RlcnMgdG8gYWN0aXZlIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkIHByb2dyYW1fZHJpdmVfY291bnRzICh1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBzZXR1cF9jb3VudCAgICA9IHNldHVwX2NvdW50c1tpbmRleF07CisJdTggYWN0aXZlX2NvdW50ICAgPSBhY3RpdmVfY291bnRzW2luZGV4XTsKKwl1OCByZWNvdmVyeV9jb3VudCA9IHJlY292ZXJ5X2NvdW50c1tpbmRleF07CisKKwkvKgorCSAqIFNldCB1cCBhZGRyZXNzIHNldHVwIGNvdW50IGFuZCBkcml2ZSByZWFkL3dyaXRlIHRpbWluZyByZWdpc3RlcnMuCisJICogUHJpbWFyeSBpbnRlcmZhY2UgaGFzIGluZGl2aWR1YWwgY291bnQvdGltaW5nIHJlZ2lzdGVycyBmb3IKKwkgKiBlYWNoIGRyaXZlLiAgU2Vjb25kYXJ5IGludGVyZmFjZSBoYXMgb25lIGNvbW1vbiBzZXQgb2YgcmVnaXN0ZXJzLAorCSAqIHNvIHdlIG1lcmdlIHRoZSB0aW1pbmdzLCB1c2luZyB0aGUgc2xvd2VzdCB2YWx1ZSBmb3IgZWFjaCB0aW1pbmcuCisJICovCisJaWYgKGluZGV4ID4gMSkgeworCQl1bnNpZ25lZCBpbnQgbWF0ZTsKKwkJaWYgKGNtZF9kcml2ZXNbbWF0ZSA9IGluZGV4IF4gMV0tPnByZXNlbnQpIHsKKwkJCWlmIChzZXR1cF9jb3VudCA8IHNldHVwX2NvdW50c1ttYXRlXSkKKwkJCQlzZXR1cF9jb3VudCA9IHNldHVwX2NvdW50c1ttYXRlXTsKKwkJCWlmIChhY3RpdmVfY291bnQgPCBhY3RpdmVfY291bnRzW21hdGVdKQorCQkJCWFjdGl2ZV9jb3VudCA9IGFjdGl2ZV9jb3VudHNbbWF0ZV07CisJCQlpZiAocmVjb3ZlcnlfY291bnQgPCByZWNvdmVyeV9jb3VudHNbbWF0ZV0pCisJCQkJcmVjb3ZlcnlfY291bnQgPSByZWNvdmVyeV9jb3VudHNbbWF0ZV07CisJCX0KKwl9CisKKwkvKgorCSAqIENvbnZlcnQgc2V0dXBfY291bnQgdG8gaW50ZXJuYWwgY2hpcHNldCByZXByZXNlbnRhdGlvbgorCSAqLworCXN3aXRjaCAoc2V0dXBfY291bnQpIHsKKwkJY2FzZSA0Ogkgc2V0dXBfY291bnQgPSAweDAwOyBicmVhazsKKwkJY2FzZSAzOgkgc2V0dXBfY291bnQgPSAweDgwOyBicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CSBzZXR1cF9jb3VudCA9IDB4NDA7IGJyZWFrOworCQlkZWZhdWx0OiBzZXR1cF9jb3VudCA9IDB4YzA7IC8qIGNhc2UgNSAqLworCX0KKworCS8qCisJICogTm93IHRoYXQgZXZlcnl0aGluZyBpcyByZWFkeSwgcHJvZ3JhbSB0aGUgbmV3IHRpbWluZ3MKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFByb2dyYW0gdGhlIGFkZHJlc3Nfc2V0dXAgY2xvY2tzIGludG8gQVJUVElNIHJlZywKKwkgKiBhbmQgdGhlbiB0aGUgYWN0aXZlL3JlY292ZXJ5IGNvdW50cyBpbnRvIHRoZSBEUldUSU0gcmVnCisJICogKHRoaXMgY29udmVydHMgY291bnRzIG9mIDE2IGludG8gY291bnRzIG9mIHplcm8gLS0gb2theSkuCisJICovCisJc2V0dXBfY291bnQgfD0gX19nZXRfY21kNjQwX3JlZyhhcnR0aW1fcmVnc1tpbmRleF0pICYgMHgzZjsKKwlfX3B1dF9jbWQ2NDBfcmVnKGFydHRpbV9yZWdzW2luZGV4XSwgc2V0dXBfY291bnQpOworCV9fcHV0X2NtZDY0MF9yZWcoZHJ3dGltX3JlZ3NbaW5kZXhdLCBwYWNrX25pYmJsZXMoYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBTZXQgYSBzcGVjaWZpYyBwaW9fbW9kZSBmb3IgYSBkcml2ZQorICovCitzdGF0aWMgdm9pZCBjbWQ2NDBfc2V0X21vZGUgKHVuc2lnbmVkIGludCBpbmRleCwgdTggcGlvX21vZGUsIHVuc2lnbmVkIGludCBjeWNsZV90aW1lKQoreworCWludCBzZXR1cF90aW1lLCBhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSwgY2xvY2tfdGltZTsKKwl1OCBzZXR1cF9jb3VudCwgYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCwgcmVjb3ZlcnlfY291bnQyLCBjeWNsZV9jb3VudDsKKwlpbnQgYnVzX3NwZWVkID0gc3lzdGVtX2J1c19jbG9jaygpOworCisJaWYgKHBpb19tb2RlID4gNSkKKwkJcGlvX21vZGUgPSA1OworCXNldHVwX3RpbWUgID0gaWRlX3Bpb190aW1pbmdzW3Bpb19tb2RlXS5zZXR1cF90aW1lOworCWFjdGl2ZV90aW1lID0gaWRlX3Bpb190aW1pbmdzW3Bpb19tb2RlXS5hY3RpdmVfdGltZTsKKwlyZWNvdmVyeV90aW1lID0gY3ljbGVfdGltZSAtIChzZXR1cF90aW1lICsgYWN0aXZlX3RpbWUpOworCWNsb2NrX3RpbWUgPSAxMDAwIC8gYnVzX3NwZWVkOworCWN5Y2xlX2NvdW50ID0gKGN5Y2xlX3RpbWUgKyBjbG9ja190aW1lIC0gMSkgLyBjbG9ja190aW1lOworCisJc2V0dXBfY291bnQgPSAoc2V0dXBfdGltZSArIGNsb2NrX3RpbWUgLSAxKSAvIGNsb2NrX3RpbWU7CisKKwlhY3RpdmVfY291bnQgPSAoYWN0aXZlX3RpbWUgKyBjbG9ja190aW1lIC0gMSkgLyBjbG9ja190aW1lOworCWlmIChhY3RpdmVfY291bnQgPCAyKQorCQlhY3RpdmVfY291bnQgPSAyOyAvKiBtaW5pbXVtIGFsbG93ZWQgYnkgY21kNjQwICovCisKKwlyZWNvdmVyeV9jb3VudCA9IChyZWNvdmVyeV90aW1lICsgY2xvY2tfdGltZSAtIDEpIC8gY2xvY2tfdGltZTsKKwlyZWNvdmVyeV9jb3VudDIgPSBjeWNsZV9jb3VudCAtIChzZXR1cF9jb3VudCArIGFjdGl2ZV9jb3VudCk7CisJaWYgKHJlY292ZXJ5X2NvdW50MiA+IHJlY292ZXJ5X2NvdW50KQorCQlyZWNvdmVyeV9jb3VudCA9IHJlY292ZXJ5X2NvdW50MjsKKwlpZiAocmVjb3ZlcnlfY291bnQgPCAyKQorCQlyZWNvdmVyeV9jb3VudCA9IDI7IC8qIG1pbmltdW0gYWxsb3dlZCBieSBjbWQ2NDAgKi8KKwlpZiAocmVjb3ZlcnlfY291bnQgPiAxNykgeworCQlhY3RpdmVfY291bnQgKz0gcmVjb3ZlcnlfY291bnQgLSAxNzsKKwkJcmVjb3ZlcnlfY291bnQgPSAxNzsKKwl9CisJaWYgKGFjdGl2ZV9jb3VudCA+IDE2KQorCQlhY3RpdmVfY291bnQgPSAxNjsgLyogbWF4aW11bSBhbGxvd2VkIGJ5IGNtZDY0MCAqLworCWlmIChjbWQ2NDBfY2hpcF92ZXJzaW9uID4gMSkKKwkJcmVjb3ZlcnlfY291bnQgLT0gMTsgIC8qIGNtZDY0MGIgdXNlcyAoY291bnQgKyAxKSovCisJaWYgKHJlY292ZXJ5X2NvdW50ID4gMTYpCisJCXJlY292ZXJ5X2NvdW50ID0gMTY7IC8qIG1heGltdW0gYWxsb3dlZCBieSBjbWQ2NDAgKi8KKworCXNldHVwX2NvdW50c1tpbmRleF0gICAgPSBzZXR1cF9jb3VudDsKKwlhY3RpdmVfY291bnRzW2luZGV4XSAgID0gYWN0aXZlX2NvdW50OworCXJlY292ZXJ5X2NvdW50c1tpbmRleF0gPSByZWNvdmVyeV9jb3VudDsKKworCS8qCisJICogSW4gYSBwZXJmZWN0IHdvcmxkLCB3ZSBtaWdodCBzZXQgdGhlIGRyaXZlIHBpbyBtb2RlIGhlcmUKKwkgKiAodXNpbmcgV0lOX1NFVEZFQVRVUkUpIGJlZm9yZSBjb250aW51aW5nLgorCSAqCisJICogQnV0IHdlIGRvIG5vdCwgYmVjYXVzZToKKwkgKgkxKSB0aGlzIGlzIHRoZSB3cm9uZyBwbGFjZSB0byBkbyBpdCAocHJvcGVyIGlzIGRvX3NwZWNpYWwoKSBpbiBpZGUuYykKKwkgKiAJMikgaW4gcHJhY3RpY2UgdGhpcyBpcyByYXJlbHksIGlmIGV2ZXIsIG5lY2Vzc2FyeQorCSAqLworCXByb2dyYW1fZHJpdmVfY291bnRzIChpbmRleCk7Cit9CisKKy8qCisgKiBEcml2ZSBQSU8gbW9kZSBzZWxlY3Rpb246CisgKi8KK3N0YXRpYyB2b2lkIGNtZDY0MF90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkKQoreworCXU4IGI7CisJaWRlX3Bpb19kYXRhX3QgIGQ7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKworCXdoaWxlIChkcml2ZSAhPSBjbWRfZHJpdmVzW2luZGV4XSkgeworCQlpZiAoKytpbmRleCA+IDMpIHsKKwkJCXByaW50aygiJXM6IGJhZCBuZXdzIGluIGNtZDY0MF90dW5lX2RyaXZlXG4iLCBkcml2ZS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc3dpdGNoIChtb2RlX3dhbnRlZCkgeworCQljYXNlIDY6IC8qIHNldCBmYXN0LWRldnNlbCBvZmYgKi8KKwkJY2FzZSA3OiAvKiBzZXQgZmFzdC1kZXZzZWwgb24gKi8KKwkJCW1vZGVfd2FudGVkICY9IDE7CisJCQliID0gZ2V0X2NtZDY0MF9yZWcoQ05UUkwpICYgfjB4Mjc7CisJCQlpZiAobW9kZV93YW50ZWQpCisJCQkJYiB8PSAweDI3OworCQkJcHV0X2NtZDY0MF9yZWcoQ05UUkwsIGIpOworCQkJcHJpbnRrKCIlczogJXNhYmxlZCBjbWQ2NDAgZmFzdCBob3N0IHRpbWluZyAoZGV2c2VsKVxuIiwgZHJpdmUtPm5hbWUsIG1vZGVfd2FudGVkID8gImVuIiA6ICJkaXMiKTsKKwkJCXJldHVybjsKKworCQljYXNlIDg6IC8qIHNldCBwcmVmZXRjaCBvZmYgKi8KKwkJY2FzZSA5OiAvKiBzZXQgcHJlZmV0Y2ggb24gKi8KKwkJCW1vZGVfd2FudGVkICY9IDE7CisJCQlzZXRfcHJlZmV0Y2hfbW9kZShpbmRleCwgbW9kZV93YW50ZWQpOworCQkJcHJpbnRrKCIlczogJXNhYmxlZCBjbWQ2NDAgcHJlZmV0Y2hcbiIsIGRyaXZlLT5uYW1lLCBtb2RlX3dhbnRlZCA/ICJlbiIgOiAiZGlzIik7CisJCQlyZXR1cm47CisJfQorCisJKHZvaWQpIGlkZV9nZXRfYmVzdF9waW9fbW9kZSAoZHJpdmUsIG1vZGVfd2FudGVkLCA1LCAmZCk7CisJY21kNjQwX3NldF9tb2RlIChpbmRleCwgZC5waW9fbW9kZSwgZC5jeWNsZV90aW1lKTsKKworCXByaW50ayAoIiVzOiBzZWxlY3RlZCBjbWQ2NDAgUElPIG1vZGUlZCAoJWRucyklcyIsCisJCWRyaXZlLT5uYW1lLAorCQlkLnBpb19tb2RlLAorCQlkLmN5Y2xlX3RpbWUsCisJCWQub3ZlcnJpZGRlbiA/ICIgKG92ZXJyaWRpbmcgdmVuZG9yIG1vZGUpIiA6ICIiKTsKKwlkaXNwbGF5X2Nsb2NrcyhpbmRleCk7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VEICovCisKK3N0YXRpYyBpbnQgcGNpX2NvbmYxKHZvaWQpCit7CisJdTMyIHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJb3V0YigweDAxLCAweENGQik7CisJdG1wID0gaW5sKDB4Q0Y4KTsKKwlvdXRsKDB4ODAwMDAwMDAsIDB4Q0Y4KTsKKwlpZiAoaW5sKDB4Q0Y4KSA9PSAweDgwMDAwMDAwKSB7CisJCW91dGwodG1wLCAweENGOCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKwlvdXRsKHRtcCwgMHhDRjgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2NvbmYyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCW91dGIoMHgwMCwgMHhDRkIpOworCW91dGIoMHgwMCwgMHhDRjgpOworCW91dGIoMHgwMCwgMHhDRkEpOworCWlmIChpbmIoMHhDRjgpID09IDB4MDAgJiYgaW5iKDB4Q0Y4KSA9PSAweDAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogUHJvYmUgZm9yIGEgY21kNjQwIGNoaXBzZXQsIGFuZCBpbml0aWFsaXplIGl0IGlmIGZvdW5kLiAgQ2FsbGVkIGZyb20gaWRlLmMKKyAqLworaW50IF9faW5pdCBpZGVfcHJvYmVfZm9yX2NtZDY0MHggKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJaW50IHNlY29uZF9wb3J0X3RvZ2dsZWQgPSAwOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCAqLworCWludCBzZWNvbmRfcG9ydF9jbWQ2NDAgPSAwOworCWNvbnN0IGNoYXIgKmJ1c190eXBlLCAqcG9ydDI7CisJdW5zaWduZWQgaW50IGluZGV4OworCXU4IGIsIGNmcjsKKworCWlmIChjbWQ2NDBfdmxiICYmIHByb2JlX2Zvcl9jbWQ2NDBfdmxiKCkpIHsKKwkJYnVzX3R5cGUgPSAiVkxCIjsKKwl9IGVsc2UgeworCQljbWQ2NDBfdmxiID0gMDsKKwkJLyogRmluZCBvdXQgd2hhdCBraW5kIG9mIFBDSSBwcm9iaW5nIGlzIHN1cHBvcnRlZCBvdGhlcndpc2UKKwkJICAgSnVzdGluIEdpYmJzIHdpbGwgc3Vsay4uICovCisJCWlmIChwY2lfY29uZjEoKSAmJiBwcm9iZV9mb3JfY21kNjQwX3BjaTEoKSkKKwkJCWJ1c190eXBlID0gIlBDSSAodHlwZTEpIjsKKwkJZWxzZSBpZiAocGNpX2NvbmYyKCkgJiYgcHJvYmVfZm9yX2NtZDY0MF9wY2kyKCkpCisJCQlidXNfdHlwZSA9ICJQQ0kgKHR5cGUyKSI7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFVuZG9jdW1lbnRlZCBtYWdpYyAodGhlcmUgaXMgbm8gMHg1YiByZWcgaW4gc3BlY3MpCisJICovCisJcHV0X2NtZDY0MF9yZWcoMHg1YiwgMHhiZCk7CisJaWYgKGdldF9jbWQ2NDBfcmVnKDB4NWIpICE9IDB4YmQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGU6IGNtZDY0MCBpbml0IGZhaWxlZDogd3JvbmcgdmFsdWUgaW4gcmVnIDB4NWJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcHV0X2NtZDY0MF9yZWcoMHg1YiwgMCk7CisKKyNpZmRlZiBDTUQ2NDBfRFVNUF9SRUdTCisJY21kNjQwX2R1bXBfcmVncygpOworI2VuZGlmCisKKwkvKgorCSAqIERvY3VtZW50ZWQgbWFnaWMgYmVnaW5zIGhlcmUKKwkgKi8KKwljZnIgPSBnZXRfY21kNjQwX3JlZyhDRlIpOworCWNtZDY0MF9jaGlwX3ZlcnNpb24gPSBjZnIgJiBDRlJfREVWUkVWOworCWlmIChjbWQ2NDBfY2hpcF92ZXJzaW9uID09IDApIHsKKwkJcHJpbnRrICgiaWRlOiBiYWQgY21kNjQwIHJldmlzaW9uOiAlZFxuIiwgY21kNjQwX2NoaXBfdmVyc2lvbik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBkYXRhIGZvciBwcmltYXJ5IHBvcnQKKwkgKi8KKwlzZXR1cF9kZXZpY2VfcHRycyAoKTsKKwlwcmludGsoIiVzOiBidWdneSBjbWQ2NDAlYyBpbnRlcmZhY2Ugb24gJXMsIGNvbmZpZz0weCUwMnhcbiIsCisJICAgICAgIGNtZF9od2lmMC0+bmFtZSwgJ2EnICsgY21kNjQwX2NoaXBfdmVyc2lvbiAtIDEsIGJ1c190eXBlLCBjZnIpOworCWNtZF9od2lmMC0+Y2hpcHNldCA9IGlkZV9jbWQ2NDA7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJY21kX2h3aWYwLT50dW5lcHJvYyA9ICZjbWQ2NDBfdHVuZV9kcml2ZTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQgKi8KKworCS8qCisJICogRW5zdXJlIGNvbXBhdGliaWxpdHkgYnkgYWx3YXlzIHVzaW5nIHRoZSBzbG93ZXN0IHRpbWluZ3MKKwkgKiBmb3IgYWNjZXNzIHRvIHRoZSBkcml2ZSdzIGNvbW1hbmQgcmVnaXN0ZXIgYmxvY2ssCisJICogYW5kIHJlc2V0IHRoZSBwcmVmZXRjaCBidXJzdHNpemUgdG8gZGVmYXVsdCAoNTEyIGJ5dGVzKS4KKwkgKgorCSAqIE1heWJlIHdlIG5lZWQgYSB3YXkgdG8gTk9UIGRvIHRoZXNlIG9uICpzb21lKiBzeXN0ZW1zPworCSAqLworCXB1dF9jbWQ2NDBfcmVnKENNRFRJTSwgMCk7CisJcHV0X2NtZDY0MF9yZWcoQlJTVCwgMHg0MCk7CisKKwkvKgorCSAqIFRyeSB0byBlbmFibGUgdGhlIHNlY29uZGFyeSBpbnRlcmZhY2UsIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQKKwkgKi8KKwlpZiAoY21kX2h3aWYxLT5ub3Byb2JlKSB7CisJCXBvcnQyID0gIm5vdCBwcm9iZWQiOworCX0gZWxzZSB7CisJCWIgPSBnZXRfY21kNjQwX3JlZyhDTlRSTCk7CisJCWlmIChzZWNvbmRhcnlfcG9ydF9yZXNwb25kaW5nKCkpIHsKKwkJCWlmICgoYiAmIENOVFJMX0VOQV8yTkQpKSB7CisJCQkJc2Vjb25kX3BvcnRfY21kNjQwID0gMTsKKwkJCQlwb3J0MiA9ICJva2F5IjsKKwkJCX0gZWxzZSBpZiAoY21kNjQwX3ZsYikgeworCQkJCXNlY29uZF9wb3J0X2NtZDY0MCA9IDE7CisJCQkJcG9ydDIgPSAiYWxpdmUiOworCQkJfSBlbHNlCisJCQkJcG9ydDIgPSAibm90IGNtZDY0MCI7CisJCX0gZWxzZSB7CisJCQlwdXRfY21kNjQwX3JlZyhDTlRSTCwgYiBeIENOVFJMX0VOQV8yTkQpOyAvKiB0b2dnbGUgdGhlIGJpdCAqLworCQkJaWYgKHNlY29uZGFyeV9wb3J0X3Jlc3BvbmRpbmcoKSkgeworCQkJCXNlY29uZF9wb3J0X2NtZDY0MCA9IDE7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJCQkJc2Vjb25kX3BvcnRfdG9nZ2xlZCA9IDE7CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VEICovCisJCQkJcG9ydDIgPSAiZW5hYmxlZCI7CisJCQl9IGVsc2UgeworCQkJCXB1dF9jbWQ2NDBfcmVnKENOVFJMLCBiKTsgLyogcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5nICovCisJCQkJcG9ydDIgPSAibm90IHJlc3BvbmRpbmciOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGRhdGEgZm9yIHNlY29uZGFyeSBjbWQ2NDAgcG9ydCwgaWYgZW5hYmxlZAorCSAqLworCWlmIChzZWNvbmRfcG9ydF9jbWQ2NDApIHsKKwkJY21kX2h3aWYwLT5zZXJpYWxpemVkID0gMTsKKwkJY21kX2h3aWYxLT5zZXJpYWxpemVkID0gMTsKKwkJY21kX2h3aWYxLT5jaGlwc2V0ID0gaWRlX2NtZDY0MDsKKwkJY21kX2h3aWYwLT5tYXRlID0gY21kX2h3aWYxOworCQljbWRfaHdpZjEtPm1hdGUgPSBjbWRfaHdpZjA7CisJCWNtZF9od2lmMS0+Y2hhbm5lbCA9IDE7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJCWNtZF9od2lmMS0+dHVuZXByb2MgPSAmY21kNjQwX3R1bmVfZHJpdmU7CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VEICovCisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc3NlcmlhbGl6ZWQsIHNlY29uZGFyeSBpbnRlcmZhY2UgJXNcbiIsIGNtZF9od2lmMS0+bmFtZSwKKwkJY21kX2h3aWYwLT5zZXJpYWxpemVkID8gIiIgOiAibm90ICIsIHBvcnQyKTsKKworCS8qCisJICogRXN0YWJsaXNoIGluaXRpYWwgdGltaW5ncy9wcmVmZXRjaCBmb3IgYWxsIGRyaXZlcy4KKwkgKiBEbyBub3QgdW5uZWNlc3NhcmlseSBkaXN0dXJiIGFueSBwcmlvciBCSU9TIHNldHVwIG9mIHRoZXNlLgorCSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8ICgyICsgKHNlY29uZF9wb3J0X2NtZDY0MCA8PCAxKSk7IGluZGV4KyspIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gY21kX2RyaXZlc1tpbmRleF07CisjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECisJCWlmIChkcml2ZS0+YXV0b3R1bmUgfHwgKChpbmRleCA+IDEpICYmIHNlY29uZF9wb3J0X3RvZ2dsZWQpKSB7CisJIAkJLyoKKwkgCQkgKiBSZXNldCB0aW1pbmcgdG8gdGhlIHNsb3dlc3Qgc3BlZWQgYW5kIHR1cm4gb2ZmIHByZWZldGNoLgorCQkJICogVGhpcyB3YXksIHRoZSBkcml2ZSBpZGVudGlmeSBjb2RlIGhhcyBhIGJldHRlciBjaGFuY2UuCisJCQkgKi8KKwkJCXNldHVwX2NvdW50cyAgICBbaW5kZXhdID0gNDsJLyogbWF4IHBvc3NpYmxlICovCisJCQlhY3RpdmVfY291bnRzICAgW2luZGV4XSA9IDE2OwkvKiBtYXggcG9zc2libGUgKi8KKwkJCXJlY292ZXJ5X2NvdW50cyBbaW5kZXhdID0gMTY7CS8qIG1heCBwb3NzaWJsZSAqLworCQkJcHJvZ3JhbV9kcml2ZV9jb3VudHMgKGluZGV4KTsKKwkJCXNldF9wcmVmZXRjaF9tb2RlIChpbmRleCwgMCk7CisJCQlwcmludGsoImNtZDY0MDogZHJpdmUlZCB0aW1pbmdzL3ByZWZldGNoIGNsZWFyZWRcbiIsIGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBSZWNvcmQgdGltaW5ncy9wcmVmZXRjaCB3aXRob3V0IGNoYW5naW5nIHRoZW0uCisJCQkgKiBUaGlzIHByZXNlcnZlcyBhbnkgcHJpb3IgQklPUyBzZXR1cC4KKwkJCSAqLworCQkJcmV0cmlldmVfZHJpdmVfY291bnRzIChpbmRleCk7CisJCQljaGVja19wcmVmZXRjaCAoaW5kZXgpOworCQkJcHJpbnRrKCJjbWQ2NDA6IGRyaXZlJWQgdGltaW5ncy9wcmVmZXRjaCglcykgcHJlc2VydmVkIiwKKwkJCQlpbmRleCwgZHJpdmUtPm5vX2lvXzMyYml0ID8gIm9mZiIgOiAib24iKTsKKwkJCWRpc3BsYXlfY2xvY2tzKGluZGV4KTsKKwkJfQorI2Vsc2UKKwkJLyoKKwkJICogU2V0IHRoZSBkcml2ZSB1bm1hc2sgZmxhZ3MgdG8gbWF0Y2ggdGhlIHByZWZldGNoIHNldHRpbmcKKwkJICovCisJCWNoZWNrX3ByZWZldGNoIChpbmRleCk7CisJCXByaW50aygiY21kNjQwOiBkcml2ZSVkIHRpbWluZ3MvcHJlZmV0Y2goJXMpIHByZXNlcnZlZFxuIiwKKwkJCWluZGV4LCBkcml2ZS0+bm9faW9fMzJiaXQgPyAib2ZmIiA6ICJvbiIpOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0NNRDY0MF9FTkhBTkNFRCAqLworCX0KKworI2lmZGVmIENNRDY0MF9EVU1QX1JFR1MKKwljbWQ2NDBfZHVtcF9yZWdzKCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvcGNpL2NtZDY0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTlhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvY21kNjR4LmMKQEAgLTAsMCArMSw4MjEgQEAKKy8qICRJZDogY21kNjR4LmMsdiAxLjIxIDIwMDAvMDEvMzAgMjM6MjM6MTYKKyAqCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvY21kNjR4LmMJCVZlcnNpb24gMS4zMAlTZXB0IDEwLCAyMDAyCisgKgorICogY21kNjR4LmM6IEVuYWJsZSBpbnRlcnJ1cHRzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgb24gVWx0cmEvUENJIG1hY2hpbmVzLgorICogICAgICAgICAgIE5vdGUsIHRoaXMgZHJpdmVyIGlzIG5vdCB1c2VkIGF0IGFsbCBvbiBvdGhlciBzeXN0ZW1zIGJlY2F1c2UKKyAqICAgICAgICAgICB0aGVyZSB0aGUgIkJJT1MiIGhhcyBkb25lIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFscmVhZHkuCisgKiAgICAgICAgICAgRHVlIHRvIG1hc3NpdmUgaGFyZHdhcmUgYnVncywgVWx0cmFETUEgaXMgb25seSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICBvbiB0aGUgNjQ2VTIgYW5kIG5vdCBvbiB0aGUgNjQ2VS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgJCUVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQorICogQ29weXJpZ2h0IChDKSAxOTk4CQlEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRElTUExBWV9DTUQ2NFhfVElNSU5HUworCisjZGVmaW5lIENNRF9ERUJVRyAwCisKKyNpZiBDTURfREVCVUcKKyNkZWZpbmUgY21kcHJpbnRrKHguLi4pCXByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgY21kcHJpbnRrKHguLi4pCisjZW5kaWYKKworLyoKKyAqIENNRDY0eCBzcGVjaWZpYyByZWdpc3RlcnMgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBDRlIJCTB4NTAKKyNkZWZpbmUgICBDRlJfSU5UUl9DSDAJCTB4MDIKKyNkZWZpbmUgQ05UUkwJCTB4NTEKKyNkZWZpbmUJICBDTlRSTF9ESVNfUkEwCQkweDQwCisjZGVmaW5lICAgQ05UUkxfRElTX1JBMQkJMHg4MAorI2RlZmluZQkgIENOVFJMX0VOQV8yTkQJCTB4MDgKKworI2RlZmluZQlDTURUSU0JCTB4NTIKKyNkZWZpbmUJQVJUVElNMAkJMHg1MworI2RlZmluZQlEUldUSU0wCQkweDU0CisjZGVmaW5lIEFSVFRJTTEgCTB4NTUKKyNkZWZpbmUgRFJXVElNMQkJMHg1NgorI2RlZmluZSBBUlRUSU0yMwkweDU3CisjZGVmaW5lICAgQVJUVElNMjNfRElTX1JBMgkweDA0CisjZGVmaW5lICAgQVJUVElNMjNfRElTX1JBMwkweDA4CisjZGVmaW5lICAgQVJUVElNMjNfSU5UUl9DSDEJMHgxMAorI2RlZmluZSBBUlRUSU0yCQkweDU3CisjZGVmaW5lIEFSVFRJTTMJCTB4NTcKKyNkZWZpbmUgRFJXVElNMjMJMHg1OAorI2RlZmluZSBEUldUSU0yCQkweDU4CisjZGVmaW5lIEJSU1QJCTB4NTkKKyNkZWZpbmUgRFJXVElNMwkJMHg1YgorCisjZGVmaW5lIEJNSURFQ1IwCTB4NzAKKyNkZWZpbmUgTVJETU9ERQkJMHg3MQorI2RlZmluZSAgIE1SRE1PREVfSU5UUl9DSDAJMHgwNAorI2RlZmluZSAgIE1SRE1PREVfSU5UUl9DSDEJMHgwOAorI2RlZmluZSAgIE1SRE1PREVfQkxLX0NIMAkweDEwCisjZGVmaW5lICAgTVJETU9ERV9CTEtfQ0gxCTB4MjAKKyNkZWZpbmUgQk1JREVTUjAJMHg3MgorI2RlZmluZSBVRElERVRDUjAJMHg3MworI2RlZmluZSBEVFBSMAkJMHg3NAorI2RlZmluZSBCTUlERUNSMQkweDc4CisjZGVmaW5lIEJNSURFQ1NSCTB4NzkKKyNkZWZpbmUgQk1JREVTUjEJMHg3QQorI2RlZmluZSBVRElERVRDUjEJMHg3QgorI2RlZmluZSBEVFBSMQkJMHg3QworCisjaWYgZGVmaW5lZChESVNQTEFZX0NNRDY0WF9USU1JTkdTKSAmJiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK3N0YXRpYyB1OCBjbWQ2NHhfcHJvYyA9IDA7CisKKyNkZWZpbmUgQ01EX01BWF9ERVZTCQk1CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqY21kX2RldnNbQ01EX01BWF9ERVZTXTsKK3N0YXRpYyBpbnQgbl9jbWRfZGV2czsKKworc3RhdGljIGNoYXIgKiBwcmludF9jbWQ2NHhfZ2V0X2luZm8gKGNoYXIgKmJ1Ziwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGluZGV4KQoreworCWNoYXIgKnAgPSBidWY7CisKKwl1OCByZWc1MyA9IDAsIHJlZzU0ID0gMCwgcmVnNTUgPSAwLCByZWc1NiA9IDA7CS8qIHByaW1hcnkgKi8KKwl1OCByZWc1NyA9IDAsIHJlZzU4ID0gMCwgcmVnNWI7CQkJLyogc2Vjb25kYXJ5ICovCisJdTggcmVnNzIgPSAwLCByZWc3MyA9IDA7CQkJLyogcHJpbWFyeSAqLworCXU4IHJlZzdhID0gMCwgcmVnN2IgPSAwOwkJCS8qIHNlY29uZGFyeSAqLworCXU4IHJlZzUwID0gMCwgcmVnNzEgPSAwOwkJCS8qIGV4dHJhICovCisKKwlwICs9IHNwcmludGYocCwgIlxuQ29udHJvbGxlcjogJWRcbiIsIGluZGV4KTsKKwlwICs9IHNwcmludGYocCwgIkNNRCV4IENoaXBzZXQuXG4iLCBkZXYtPmRldmljZSk7CisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ0ZSLCAgICAgICAmcmVnNTApOworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFSVFRJTTAsICAgJnJlZzUzKTsKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBEUldUSU0wLCAgICZyZWc1NCk7CisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQVJUVElNMSwgICAmcmVnNTUpOworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIERSV1RJTTEsICAgJnJlZzU2KTsKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBBUlRUSU0yLCAgICZyZWc1Nyk7CisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgRFJXVElNMiwgICAmcmVnNTgpOworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIERSV1RJTTMsICAgJnJlZzViKTsKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBNUkRNT0RFLCAgICZyZWc3MSk7CisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQk1JREVTUjAsICAmcmVnNzIpOworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFVESURFVENSMCwgJnJlZzczKTsKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBCTUlERVNSMSwgICZyZWc3YSk7CisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgVURJREVUQ1IxLCAmcmVnN2IpOworCisJcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0gUHJpbWFyeSBDaGFubmVsICIKKwkJCSItLS0tLS0tLS0tLS0tLS0tIFNlY29uZGFyeSBDaGFubmVsICIKKwkJCSItLS0tLS0tLS0tLS0tXG4iKTsKKwlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgICAlc2FibGVkICAgICAgICAgICAiCisJCQkiICAgICAgICAgICAgICAlc2FibGVkXG4iLAorCQkocmVnNzImMHg4MCk/ImRpcyI6IiBlbiIsCisJCShyZWc3YSYweDgwKT8iZGlzIjoiIGVuIik7CisJcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0gZHJpdmUwICIKKwkJIi0tLS0tLS0tLSBkcml2ZTEgLS0tLS0tLS0gZHJpdmUwICIKKwkJIi0tLS0tLS0tLS0gZHJpdmUxIC0tLS0tLVxuIik7CisJcCArPSBzcHJpbnRmKHAsICJETUEgZW5hYmxlZDogICAgJXMgICAgICAgICAgICAgICVzIgorCQkJIiAgICAgICAgICAgICAlcyAgICAgICAgICAgICAgICVzXG4iLAorCQkocmVnNzImMHgyMCk/InllcyI6Im5vICIsIChyZWc3MiYweDQwKT8ieWVzIjoibm8gIiwKKwkJKHJlZzdhJjB4MjApPyJ5ZXMiOiJubyAiLCAocmVnN2EmMHg0MCk/InllcyI6Im5vICIpOworCisJcCArPSBzcHJpbnRmKHAsICJETUEgTW9kZTogICAgICAgJXMoJXMpICAgICAgICAgICVzKCVzKSIsCisJCShyZWc3MiYweDIwKT8oKHJlZzczJjB4MDEpPyJVRE1BIjoiIERNQSIpOiIgUElPIiwKKwkJKHJlZzcyJjB4MjApPygKKwkJCSgocmVnNzMmMHgzMCk9PTB4MzApPygoKHJlZzczJjB4MzUpPT0weDM1KT8iMyI6IjAiKToKKwkJCSgocmVnNzMmMHgyMCk9PTB4MjApPygoKHJlZzczJjB4MjUpPT0weDI1KT8iMyI6IjEiKToKKwkJCSgocmVnNzMmMHgxMCk9PTB4MTApPygoKHJlZzczJjB4MTUpPT0weDE1KT8iNCI6IjIiKToKKwkJCSgocmVnNzMmMHgwMCk9PTB4MDApPygoKHJlZzczJjB4MDUpPT0weDA1KT8iNSI6IjIiKToKKwkJCSJYIik6Ij8iLAorCQkocmVnNzImMHg0MCk/KChyZWc3MyYweDAyKT8iVURNQSI6IiBETUEiKToiIFBJTyIsCisJCShyZWc3MiYweDQwKT8oCisJCQkoKHJlZzczJjB4QzApPT0weEMwKT8oKChyZWc3MyYweEM1KT09MHhDNSk/IjMiOiIwIik6CisJCQkoKHJlZzczJjB4ODApPT0weDgwKT8oKChyZWc3MyYweDg1KT09MHg4NSk/IjMiOiIxIik6CisJCQkoKHJlZzczJjB4NDApPT0weDQwKT8oKChyZWc3MyYweDRBKT09MHg0QSk/IjQiOiIyIik6CisJCQkoKHJlZzczJjB4MDApPT0weDAwKT8oKChyZWc3MyYweDBBKT09MHgwQSk/IjUiOiIyIik6CisJCQkiWCIpOiI/Iik7CisJcCArPSBzcHJpbnRmKHAsICIgICAgICAgICAlcyglcykgICAgICAgICAgICVzKCVzKVxuIiwKKwkJKHJlZzdhJjB4MjApPygocmVnN2ImMHgwMSk/IlVETUEiOiIgRE1BIik6IiBQSU8iLAorCQkocmVnN2EmMHgyMCk/KAorCQkJKChyZWc3YiYweDMwKT09MHgzMCk/KCgocmVnN2ImMHgzNSk9PTB4MzUpPyIzIjoiMCIpOgorCQkJKChyZWc3YiYweDIwKT09MHgyMCk/KCgocmVnN2ImMHgyNSk9PTB4MjUpPyIzIjoiMSIpOgorCQkJKChyZWc3YiYweDEwKT09MHgxMCk/KCgocmVnN2ImMHgxNSk9PTB4MTUpPyI0IjoiMiIpOgorCQkJKChyZWc3YiYweDAwKT09MHgwMCk/KCgocmVnN2ImMHgwNSk9PTB4MDUpPyI1IjoiMiIpOgorCQkJIlgiKToiPyIsCisJCShyZWc3YSYweDQwKT8oKHJlZzdiJjB4MDIpPyJVRE1BIjoiIERNQSIpOiIgUElPIiwKKwkJKHJlZzdhJjB4NDApPygKKwkJCSgocmVnN2ImMHhDMCk9PTB4QzApPygoKHJlZzdiJjB4QzUpPT0weEM1KT8iMyI6IjAiKToKKwkJCSgocmVnN2ImMHg4MCk9PTB4ODApPygoKHJlZzdiJjB4ODUpPT0weDg1KT8iMyI6IjEiKToKKwkJCSgocmVnN2ImMHg0MCk9PTB4NDApPygoKHJlZzdiJjB4NEEpPT0weDRBKT8iNCI6IjIiKToKKwkJCSgocmVnN2ImMHgwMCk9PTB4MDApPygoKHJlZzdiJjB4MEEpPT0weDBBKT8iNSI6IjIiKToKKwkJCSJYIik6Ij8iICk7CisJcCArPSBzcHJpbnRmKHAsICJQSU8gTW9kZTogICAgICAgJXMgICAgICAgICAgICAgICAgJXMiCisJCQkiICAgICAgICAgICAgICAgJXMgICAgICAgICAgICAgICAgICVzXG4iLAorCQkJIj8iLCAiPyIsICI/IiwgIj8iKTsKKwlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgICAlcyAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkocmVnNTAgJiBDRlJfSU5UUl9DSDApID8gImludGVycnVwdGluZyIgOiAicG9sbGluZyAgICAgIiwKKwkJKHJlZzU3ICYgQVJUVElNMjNfSU5UUl9DSDEpID8gImludGVycnVwdGluZyIgOiAicG9sbGluZyIpOworCXAgKz0gc3ByaW50ZihwLCAiICAgICAgICAgICAgICAgICVzICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJKHJlZzcxICYgTVJETU9ERV9JTlRSX0NIMCkgPyAicGVuZGluZyIgOiAiY2xlYXIgICIsCisJCShyZWc3MSAmIE1SRE1PREVfSU5UUl9DSDEpID8gInBlbmRpbmciIDogImNsZWFyIik7CisJcCArPSBzcHJpbnRmKHAsICIgICAgICAgICAgICAgICAgJXMgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkocmVnNzEgJiBNUkRNT0RFX0JMS19DSDApID8gImJsb2NrZWQiIDogImVuYWJsZWQiLAorCQkocmVnNzEgJiBNUkRNT0RFX0JMS19DSDEpID8gImJsb2NrZWQiIDogImVuYWJsZWQiKTsKKworCXJldHVybiAoY2hhciAqKXA7Cit9CisKK3N0YXRpYyBpbnQgY21kNjR4X2dldF9pbmZvIChjaGFyICpidWZmZXIsIGNoYXIgKiphZGRyLCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCkKK3sKKwljaGFyICpwID0gYnVmZmVyOworCWludCBpOworCisJcCArPSBzcHJpbnRmKHAsICJcbiIpOworCWZvciAoaSA9IDA7IGkgPCBuX2NtZF9kZXZzOyBpKyspIHsKKwkJc3RydWN0IHBjaV9kZXYgKmRldgk9IGNtZF9kZXZzW2ldOworCQlwID0gcHJpbnRfY21kNjR4X2dldF9pbmZvKHAsIGRldiwgaSk7CisJfQorCXJldHVybiBwLWJ1ZmZlcjsJLyogPT4gbXVzdCBiZSBsZXNzIHRoYW4gNGshICovCit9CisKKyNlbmRpZgkvKiBkZWZpbmVkKERJU1BMQVlfQ01ENjRYX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICovCisKKy8qCisgKiBSZWdpc3RlcnMgYW5kIG1hc2tzIGZvciBlYXN5IGFjY2VzcyBieSBkcml2ZSBpbmRleDoKKyAqLworI2lmIDAKK3N0YXRpYyB1OCBwcmVmZXRjaF9yZWdzWzRdICA9IHtDTlRSTCwgQ05UUkwsIEFSVFRJTTIzLCBBUlRUSU0yM307CitzdGF0aWMgdTggcHJlZmV0Y2hfbWFza3NbNF0gPSB7Q05UUkxfRElTX1JBMCwgQ05UUkxfRElTX1JBMSwgQVJUVElNMjNfRElTX1JBMiwgQVJUVElNMjNfRElTX1JBM307CisjZW5kaWYKKworLyoKKyAqIFRoaXMgcm91dGluZSB3cml0ZXMgdGhlIHByZXBhcmVkIHNldHVwL2FjdGl2ZS9yZWNvdmVyeSBjb3VudHMKKyAqIGZvciBhIGRyaXZlIGludG8gdGhlIGNtZDY0NiBjaGlwc2V0IHJlZ2lzdGVycyB0byBhY3RpdmUgdGhlbS4KKyAqLworc3RhdGljIHZvaWQgcHJvZ3JhbV9kcml2ZV9jb3VudHMgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHNldHVwX2NvdW50LCBpbnQgYWN0aXZlX2NvdW50LCBpbnQgcmVjb3ZlcnlfY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2RyaXZlX3QgKmRyaXZlcyA9IEhXSUYoZHJpdmUpLT5kcml2ZXM7CisJdTggdGVtcF9iOworCXN0YXRpYyBjb25zdCB1OCBzZXR1cF9jb3VudHNbXSA9IHsweDQwLCAweDQwLCAweDQwLCAweDgwLCAwLCAweGMwfTsKKwlzdGF0aWMgY29uc3QgdTggcmVjb3ZlcnlfY291bnRzW10gPQorCQl7MTUsIDE1LCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDB9OworCXN0YXRpYyBjb25zdCB1OCBhcnR0aW1fcmVnc1syXVsyXSA9IHsKKwkJCXsgQVJUVElNMCwgQVJUVElNMSB9LAorCQkJeyBBUlRUSU0yMywgQVJUVElNMjMgfQorCQl9OworCXN0YXRpYyBjb25zdCB1OCBkcnd0aW1fcmVnc1syXVsyXSA9IHsKKwkJCXsgRFJXVElNMCwgRFJXVElNMSB9LAorCQkJeyBEUldUSU0yLCBEUldUSU0zIH0KKwkJfTsKKwlpbnQgY2hhbm5lbCA9IChpbnQpIEhXSUYoZHJpdmUpLT5jaGFubmVsOworCWludCBzbGF2ZSA9IChkcml2ZXMgIT0gZHJpdmUpOyAgLyogSXMgdGhpcyByZWFsbHkgdGhlIGJlc3Qgd2F5IHRvIGRldGVybWluZSB0aGlzPz8gKi8KKworCWNtZHByaW50aygicHJvZ3JhbV9kcml2ZV9jb3VudCBwYXJhbWV0ZXJzID0gcyglZCksYSglZCksciglZCkscCglZClcbiIsCisJCXNldHVwX2NvdW50LCBhY3RpdmVfY291bnQsIHJlY292ZXJ5X2NvdW50LCBkcml2ZS0+cHJlc2VudCk7CisJLyoKKwkgKiBTZXQgdXAgYWRkcmVzcyBzZXR1cCBjb3VudCByZWdpc3RlcnMuCisJICogUHJpbWFyeSBpbnRlcmZhY2UgaGFzIGluZGl2aWR1YWwgY291bnQvdGltaW5nIHJlZ2lzdGVycyBmb3IKKwkgKiBlYWNoIGRyaXZlLiAgU2Vjb25kYXJ5IGludGVyZmFjZSBoYXMgb25lIGNvbW1vbiBzZXQgb2YgcmVnaXN0ZXJzLAorCSAqIGZvciBhZGRyZXNzIHNldHVwIHNvIHdlIG1lcmdlIHRoZXNlIHRpbWluZ3MsIHVzaW5nIHRoZSBzbG93ZXN0CisJICogdmFsdWUuCisJICovCisJaWYgKGNoYW5uZWwpIHsKKwkJZHJpdmUtPmRyaXZlX2RhdGEgPSBzZXR1cF9jb3VudDsKKwkJc2V0dXBfY291bnQgPSBtYXgoZHJpdmVzWzBdLmRyaXZlX2RhdGEsCisJCQkJCWRyaXZlc1sxXS5kcml2ZV9kYXRhKTsKKwkJY21kcHJpbnRrKCJTZWNvbmRhcnkgaW50ZXJmYWNlLCBzZXR1cF9jb3VudCA9ICVkXG4iLAorCQkJCQlzZXR1cF9jb3VudCk7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHZhbHVlcyB0byBpbnRlcm5hbCBjaGlwc2V0IHJlcHJlc2VudGF0aW9uCisJICovCisJc2V0dXBfY291bnQgPSAoc2V0dXBfY291bnQgPiA1KSA/IDB4YzAgOiAoaW50KSBzZXR1cF9jb3VudHNbc2V0dXBfY291bnRdOworCWFjdGl2ZV9jb3VudCAmPSAweGY7IC8qIFJlbWVtYmVyLCBtYXggdmFsdWUgaXMgMTYgKi8KKwlyZWNvdmVyeV9jb3VudCA9IChpbnQpIHJlY292ZXJ5X2NvdW50c1tyZWNvdmVyeV9jb3VudF07CisKKwljbWRwcmludGsoIkZpbmFsIHZhbHVlcyA9ICVkLCVkLCVkXG4iLAorCQlzZXR1cF9jb3VudCwgYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCk7CisKKwkvKgorCSAqIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaXMgcmVhZHksIHByb2dyYW0gdGhlIG5ldyB0aW1pbmdzCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qCisJICogUHJvZ3JhbSB0aGUgYWRkcmVzc19zZXR1cCBjbG9ja3MgaW50byBBUlRUSU0gcmVnLAorCSAqIGFuZCB0aGVuIHRoZSBhY3RpdmUvcmVjb3ZlcnkgY291bnRzIGludG8gdGhlIERSV1RJTSByZWcKKwkgKi8KKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBhcnR0aW1fcmVnc1tjaGFubmVsXVtzbGF2ZV0sICZ0ZW1wX2IpOworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBhcnR0aW1fcmVnc1tjaGFubmVsXVtzbGF2ZV0sCisJCSgodTgpIHNldHVwX2NvdW50KSB8ICh0ZW1wX2IgJiAweDNmKSk7CisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRyd3RpbV9yZWdzW2NoYW5uZWxdW3NsYXZlXSwKKwkJKHU4KSAoKGFjdGl2ZV9jb3VudCA8PCA0KSB8IHJlY292ZXJ5X2NvdW50KSk7CisJY21kcHJpbnRrICgiV3JpdGUgJXggdG8gJXhcbiIsCisJCSgodTgpIHNldHVwX2NvdW50KSB8ICh0ZW1wX2IgJiAweDNmKSwKKwkJYXJ0dGltX3JlZ3NbY2hhbm5lbF1bc2xhdmVdKTsKKwljbWRwcmludGsgKCJXcml0ZSAleCB0byAleFxuIiwKKwkJKHU4KSAoKGFjdGl2ZV9jb3VudCA8PCA0KSB8IHJlY292ZXJ5X2NvdW50KSwKKwkJZHJ3dGltX3JlZ3NbY2hhbm5lbF1bc2xhdmVdKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBBdHRlbXB0cyB0byBzZXQgdGhlIGludGVyZmFjZSBQSU8gbW9kZS4KKyAqIFRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIHNlbGVjdGluZyBQSU8gbW9kZXMgKGUuZy4gbW9kZSA0KSBpcyAKKyAqICJlY2hvICdwaW9tb2RlOjQnID4gL3Byb2MvaWRlL2hkeC9zZXR0aW5ncyIuICBTcGVjaWFsIGNhc2VzIGFyZQorICogODogcHJlZmV0Y2ggb2ZmLCA5OiBwcmVmZXRjaCBvbiwgMjU1OiBhdXRvLXNlbGVjdCBiZXN0IG1vZGUuCisgKiBDYWxsZWQgd2l0aCAyNTUgYXQgYm9vdCB0aW1lLgorICovCisKK3N0YXRpYyB2b2lkIGNtZDY0eF90dW5lcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBtb2RlX3dhbnRlZCkKK3sKKwlpbnQgc2V0dXBfdGltZSwgYWN0aXZlX3RpbWUsIHJlY292ZXJ5X3RpbWU7CisJaW50IGNsb2NrX3RpbWUsIHBpb19tb2RlLCBjeWNsZV90aW1lOworCXU4IHJlY292ZXJ5X2NvdW50MiwgY3ljbGVfY291bnQ7CisJaW50IHNldHVwX2NvdW50LCBhY3RpdmVfY291bnQsIHJlY292ZXJ5X2NvdW50OworCWludCBidXNfc3BlZWQgPSBzeXN0ZW1fYnVzX2Nsb2NrKCk7CisJLypieXRlIGI7Ki8KKwlpZGVfcGlvX2RhdGFfdCAgZDsKKworCXN3aXRjaCAobW9kZV93YW50ZWQpIHsKKwkJY2FzZSA4OiAvKiBzZXQgcHJlZmV0Y2ggb2ZmICovCisJCWNhc2UgOTogLyogc2V0IHByZWZldGNoIG9uICovCisJCQltb2RlX3dhbnRlZCAmPSAxOworCQkJLypzZXRfcHJlZmV0Y2hfbW9kZShpbmRleCwgbW9kZV93YW50ZWQpOyovCisJCQljbWRwcmludGsoIiVzOiAlc2FibGVkIGNtZDY0MCBwcmVmZXRjaFxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgbW9kZV93YW50ZWQgPyAiZW4iIDogImRpcyIpOworCQkJcmV0dXJuOworCX0KKworCW1vZGVfd2FudGVkID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlIChkcml2ZSwgbW9kZV93YW50ZWQsIDUsICZkKTsKKwlwaW9fbW9kZSA9IGQucGlvX21vZGU7CisJY3ljbGVfdGltZSA9IGQuY3ljbGVfdGltZTsKKworCS8qCisJICogSSBjb3BpZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgc3R1ZmYgZnJvbSBjbWQ2NDAuYyBhbmQgbWFkZSBhIGZldworCSAqIG1pbm9yIGNoYW5nZXMuICBGb3Igbm93IEkgYW0ganVzdCBnb2luZyB0byBwcmF5IHRoYXQgaXQgaXMgY29ycmVjdC4KKwkgKi8KKwlpZiAocGlvX21vZGUgPiA1KQorCQlwaW9fbW9kZSA9IDU7CisJc2V0dXBfdGltZSAgPSBpZGVfcGlvX3RpbWluZ3NbcGlvX21vZGVdLnNldHVwX3RpbWU7CisJYWN0aXZlX3RpbWUgPSBpZGVfcGlvX3RpbWluZ3NbcGlvX21vZGVdLmFjdGl2ZV90aW1lOworCXJlY292ZXJ5X3RpbWUgPSBjeWNsZV90aW1lIC0gKHNldHVwX3RpbWUgKyBhY3RpdmVfdGltZSk7CisJY2xvY2tfdGltZSA9IDEwMDAgLyBidXNfc3BlZWQ7CisJY3ljbGVfY291bnQgPSAoY3ljbGVfdGltZSArIGNsb2NrX3RpbWUgLSAxKSAvIGNsb2NrX3RpbWU7CisKKwlzZXR1cF9jb3VudCA9IChzZXR1cF90aW1lICsgY2xvY2tfdGltZSAtIDEpIC8gY2xvY2tfdGltZTsKKworCWFjdGl2ZV9jb3VudCA9IChhY3RpdmVfdGltZSArIGNsb2NrX3RpbWUgLSAxKSAvIGNsb2NrX3RpbWU7CisKKwlyZWNvdmVyeV9jb3VudCA9IChyZWNvdmVyeV90aW1lICsgY2xvY2tfdGltZSAtIDEpIC8gY2xvY2tfdGltZTsKKwlyZWNvdmVyeV9jb3VudDIgPSBjeWNsZV9jb3VudCAtIChzZXR1cF9jb3VudCArIGFjdGl2ZV9jb3VudCk7CisJaWYgKHJlY292ZXJ5X2NvdW50MiA+IHJlY292ZXJ5X2NvdW50KQorCQlyZWNvdmVyeV9jb3VudCA9IHJlY292ZXJ5X2NvdW50MjsKKwlpZiAocmVjb3ZlcnlfY291bnQgPiAxNikgeworCQlhY3RpdmVfY291bnQgKz0gcmVjb3ZlcnlfY291bnQgLSAxNjsKKwkJcmVjb3ZlcnlfY291bnQgPSAxNjsKKwl9CisJaWYgKGFjdGl2ZV9jb3VudCA+IDE2KQorCQlhY3RpdmVfY291bnQgPSAxNjsgLyogbWF4aW11bSBhbGxvd2VkIGJ5IGNtZDY0NiAqLworCisJLyoKKwkgKiBJbiBhIHBlcmZlY3Qgd29ybGQsIHdlIG1pZ2h0IHNldCB0aGUgZHJpdmUgcGlvIG1vZGUgaGVyZQorCSAqICh1c2luZyBXSU5fU0VURkVBVFVSRSkgYmVmb3JlIGNvbnRpbnVpbmcuCisJICoKKwkgKiBCdXQgd2UgZG8gbm90LCBiZWNhdXNlOgorCSAqCTEpIHRoaXMgaXMgdGhlIHdyb25nIHBsYWNlIHRvIGRvIGl0CisJICoJCShwcm9wZXIgaXMgZG9fc3BlY2lhbCgpIGluIGlkZS5jKQorCSAqIAkyKSBpbiBwcmFjdGljZSB0aGlzIGlzIHJhcmVseSwgaWYgZXZlciwgbmVjZXNzYXJ5CisJICovCisJcHJvZ3JhbV9kcml2ZV9jb3VudHMgKGRyaXZlLCBzZXR1cF9jb3VudCwgYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCk7CisKKwljbWRwcmludGsoIiVzOiBzZWxlY3RlZCBjbWQ2NDYgUElPIG1vZGUlZCA6ICVkICglZG5zKSVzLCAiCisJCSJjbG9ja3M9JWQvJWQvJWRcbiIsCisJCWRyaXZlLT5uYW1lLCBwaW9fbW9kZSwgbW9kZV93YW50ZWQsIGN5Y2xlX3RpbWUsCisJCWQub3ZlcnJpZGRlbiA/ICIgKG92ZXJyaWRpbmcgdmVuZG9yIG1vZGUpIiA6ICIiLAorCQlzZXR1cF9jb3VudCwgYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCk7Cit9CisKK3N0YXRpYyB1OCBjbWQ2NHhfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJdTggbW9kZSA9IDA7CisKKwlzd2l0Y2goZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRF82NDk6CisJCQltb2RlID0gMzsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0ODoKKwkJCW1vZGUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DTURfNjQzOgorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NNRF82NDY6CisJCXsKKwkJCXVuc2lnbmVkIGludCBjbGFzc19yZXYJPSAwOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwKKwkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOworCQkJY2xhc3NfcmV2ICY9IDB4ZmY7CisJCS8qCisJCSAqIFVsdHJhRE1BIG9ubHkgc3VwcG9ydGVkIG9uIFBDSTY0NlUgYW5kIFBDSTY0NlUyLCB3aGljaAorCQkgKiBjb3JyZXNwb25kIHRvIHJldmlzaW9ucyAweDAzLCAweDA1IGFuZCAweDA3IHJlc3BlY3RpdmVseS4KKwkJICogQWN0dWFsbHksIGFsdGhvdWdoIHRoZSBDTUQgdGVjaCBzdXBwb3J0IHBlb3BsZSB3b24ndAorCQkgKiB0ZWxsIG1lIHRoZSBkZXRhaWxzLCB0aGUgMHgwMyByZXZpc2lvbiBjYW5ub3Qgc3VwcG9ydAorCQkgKiBVRE1BIGNvcnJlY3RseSB3aXRob3V0IGhhcmR3YXJlIG1vZGlmaWNhdGlvbnMsIGFuZCBldmVuCisJCSAqIHRoZW4gaXQgb25seSB3b3JrcyB3aXRoIFF1YW50dW0gZGlza3MgZHVlIHRvIHNvbWUKKwkJICogaG9sZCB0aW1lIGFzc3VtcHRpb25zIGluIHRoZSA2NDZVIHBhcnQgd2hpY2ggYXJlIGZpeGVkCisJCSAqIGluIHRoZSA2NDZVMi4KKwkJICoKKwkJICogU28gd2Ugb25seSBkbyBVbHRyYURNQSBvbiByZXZpc2lvbiAweDA1IGFuZCAweDA3IGNoaXBzZXRzLgorCQkgKi8KKwkJCXN3aXRjaChjbGFzc19yZXYpIHsKKwkJCQljYXNlIDB4MDc6CisJCQkJY2FzZSAweDA1OgorCQkJCQlyZXR1cm4gMTsKKwkJCQljYXNlIDB4MDM6CisJCQkJY2FzZSAweDAxOgorCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19jbWQ2NHhfY2hpcHNldF9mb3JfcGlvIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNldF9zcGVlZCkKK3sKKwl1OCBzcGVlZAk9IDB4MDA7CisJdTggc2V0X3Bpbwk9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgNCwgNSwgTlVMTCk7CisKKwljbWQ2NHhfdHVuZXByb2MoZHJpdmUsIHNldF9waW8pOworCXNwZWVkID0gWEZFUl9QSU9fMCArIHNldF9waW87CisJaWYgKHNldF9zcGVlZCkKKwkJKHZvaWQpIGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2NoaXBzZXRfZm9yX3BpbyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBzZXRfc3BlZWQpCit7CisJY29uZmlnX2NtZDY0eF9jaGlwc2V0X2Zvcl9waW8oZHJpdmUsIHNldF9zcGVlZCk7Cit9CisKK3N0YXRpYyBpbnQgY21kNjR4X3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCisJdTggdW5pdAkJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggcmVnVSA9IDAsIHBjaVUJPSAoaHdpZi0+Y2hhbm5lbCkgPyBVRElERVRDUjEgOiBVRElERVRDUjA7CisJdTggcmVnRCA9IDAsIHBjaUQJPSAoaHdpZi0+Y2hhbm5lbCkgPyBCTUlERVNSMSA6IEJNSURFU1IwOworCisJdTggc3BlZWQJPSBpZGVfcmF0ZV9maWx0ZXIoY21kNjR4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKworCWlmIChzcGVlZCA+IFhGRVJfUElPXzQpIHsKKwkJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcGNpRCwgJnJlZ0QpOworCQkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBwY2lVLCAmcmVnVSk7CisJCXJlZ0QgJj0gfih1bml0ID8gMHg0MCA6IDB4MjApOworCQlyZWdVICY9IH4odW5pdCA/IDB4Q0EgOiAweDM1KTsKKwkJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHBjaUQsIHJlZ0QpOworCQkodm9pZCkgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcGNpVSwgcmVnVSk7CisJCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHBjaUQsICZyZWdEKTsKKwkJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcGNpVSwgJnJlZ1UpOworCX0KKworCXN3aXRjaChzcGVlZCkgeworCQljYXNlIFhGRVJfVURNQV81OglyZWdVIHw9ICh1bml0ID8gMHgwQSA6IDB4MDUpOyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfNDoJcmVnVSB8PSAodW5pdCA/IDB4NEEgOiAweDE1KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzM6CXJlZ1UgfD0gKHVuaXQgPyAweDhBIDogMHgyNSk7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV8yOglyZWdVIHw9ICh1bml0ID8gMHg0MiA6IDB4MTEpOyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfMToJcmVnVSB8PSAodW5pdCA/IDB4ODIgOiAweDIxKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXJlZ1UgfD0gKHVuaXQgPyAweEMyIDogMHgzMSk7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzI6CXJlZ0QgfD0gKHVuaXQgPyAweDQwIDogMHgxMCk7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzE6CXJlZ0QgfD0gKHVuaXQgPyAweDgwIDogMHgyMCk7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzA6CXJlZ0QgfD0gKHVuaXQgPyAweEMwIDogMHgzMCk7IGJyZWFrOworCQljYXNlIFhGRVJfU1dfRE1BXzI6CXJlZ0QgfD0gKHVuaXQgPyAweDQwIDogMHgxMCk7IGJyZWFrOworCQljYXNlIFhGRVJfU1dfRE1BXzE6CXJlZ0QgfD0gKHVuaXQgPyAweDgwIDogMHgyMCk7IGJyZWFrOworCQljYXNlIFhGRVJfU1dfRE1BXzA6CXJlZ0QgfD0gKHVuaXQgPyAweEMwIDogMHgzMCk7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzQ6CWNtZDY0eF90dW5lcHJvYyhkcml2ZSwgNCk7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzM6CWNtZDY0eF90dW5lcHJvYyhkcml2ZSwgMyk7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzI6CWNtZDY0eF90dW5lcHJvYyhkcml2ZSwgMik7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzE6CWNtZDY0eF90dW5lcHJvYyhkcml2ZSwgMSk7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzA6CWNtZDY0eF90dW5lcHJvYyhkcml2ZSwgMCk7IGJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc3BlZWQgPiBYRkVSX1BJT180KSB7CisJCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwY2lVLCByZWdVKTsKKwkJcmVnRCB8PSAodW5pdCA/IDB4NDAgOiAweDIwKTsKKwkJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHBjaUQsIHJlZ0QpOworCX0KKworCXJldHVybiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKK30KKworc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQJPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBjbWQ2NHhfcmF0ZW1hc2soZHJpdmUpKTsKKworCWNvbmZpZ19jaGlwc2V0X2Zvcl9waW8oZHJpdmUsICFzcGVlZCk7CisKKwlpZiAoIXNwZWVkKQorCQlyZXR1cm4gMDsKKworCWlmKGlkZV9zZXRfeGZlcl9yYXRlKGRyaXZlLCBzcGVlZCkpCisJCXJldHVybiAwOyAKKworCWlmICghZHJpdmUtPmluaXRfc3BlZWQpCisJCWRyaXZlLT5pbml0X3NwZWVkID0gc3BlZWQ7CisKKwlyZXR1cm4gaWRlX2RtYV9lbmFibGUoZHJpdmUpOworfQorCitzdGF0aWMgaW50IGNtZDY0eF9jb25maWdfZHJpdmVfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisKKwlpZiAoKGlkICE9IE5VTEwpICYmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAhPSAwKSAmJiBkcml2ZS0+YXV0b2RtYSkgeworCisJCWlmIChpZGVfdXNlX2RtYShkcml2ZSkpIHsKKwkJCWlmIChjb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJCX0KKworCQlnb3RvIGZhc3RfYXRhX3BpbzsKKworCX0gZWxzZSBpZiAoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSB7CitmYXN0X2F0YV9waW86CisJCWNvbmZpZ19jaGlwc2V0X2Zvcl9waW8oZHJpdmUsIDEpOworCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJfQorCS8qIElPUkRZIG5vdCBzdXBwb3J0ZWQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWQ2NHhfYWx0X2RtYV9zdGF0dXMgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3dpdGNoKGRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DTURfNjQ4OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0OToKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZDY0eF9pZGVfZG1hX2VuZCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCisJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CisJLyogcmVhZCBETUEgY29tbWFuZCBzdGF0ZSAqLworCWRtYV9jbWQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX2NvbW1hbmQpOworCS8qIHN0b3AgRE1BICovCisJaHdpZi0+T1VUQigoZG1hX2NtZCAmIH4xKSwgaHdpZi0+ZG1hX2NvbW1hbmQpOworCS8qIGdldCBETUEgc3RhdHVzICovCisJZG1hX3N0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisJLyogY2xlYXIgdGhlIElOVFIgJiBFUlJPUiBiaXRzICovCisJaHdpZi0+T1VUQihkbWFfc3RhdHw2LCBod2lmLT5kbWFfc3RhdHVzKTsKKwlpZiAoY21kNjR4X2FsdF9kbWFfc3RhdHVzKGRldikpIHsKKwkJdTggZG1hX2ludHIJPSAwOworCQl1OCBkbWFfbWFzawk9IChod2lmLT5jaGFubmVsKSA/IEFSVFRJTTIzX0lOVFJfQ0gxIDoKKwkJCQkJCSAgICBDRlJfSU5UUl9DSDA7CisJCXU4IGRtYV9yZWcJPSAoaHdpZi0+Y2hhbm5lbCkgPyBBUlRUSU0yIDogQ0ZSOworCQkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBkbWFfcmVnLCAmZG1hX2ludHIpOworCQkvKiBjbGVhciB0aGUgSU5UUiBiaXQgKi8KKwkJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRtYV9yZWcsIGRtYV9pbnRyfGRtYV9tYXNrKTsKKwl9CisJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCisJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOworCS8qIHZlcmlmeSBnb29kIERNQSBzdGF0dXMgKi8KKwlyZXR1cm4gKGRtYV9zdGF0ICYgNykgIT0gNDsKK30KKworc3RhdGljIGludCBjbWQ2NHhfaWRlX2RtYV90ZXN0X2lycSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgkJPSBod2lmLT5wY2lfZGV2OworICAgICAgICB1OCBkbWFfYWx0X3N0YXQgPSAwLCBtYXNrCT0gKGh3aWYtPmNoYW5uZWwpID8gTVJETU9ERV9JTlRSX0NIMSA6CisJCQkJCQkJICAgIE1SRE1PREVfSU5UUl9DSDA7CisJdTggZG1hX3N0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBNUkRNT0RFLCAmZG1hX2FsdF9zdGF0KTsKKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6IGRtYV9zdGF0OiAweCUwMnggZG1hX2FsdF9zdGF0OiAiCisJCSIweCUwMnggbWFzazogMHglMDJ4XG4iLCBkcml2ZS0+bmFtZSwKKwkJZG1hX3N0YXQsIGRtYV9hbHRfc3RhdCwgbWFzayk7CisjZW5kaWYKKwlpZiAoIShkbWFfYWx0X3N0YXQgJiBtYXNrKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCisJaWYgKChkbWFfc3RhdCAmIDQpID09IDQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBU1VTIFA1NVQyUDREIHdpdGggQ01ENjQ2IGNoaXBzZXQgcmV2aXNpb24gMHgwMSByZXF1aXJlcyB0aGUgb2xkCisgKiBldmVudCBvcmRlciBmb3IgRE1BIHRyYW5zZmVycy4KKyAqLworCitzdGF0aWMgaW50IGNtZDY0Nl8xX2lkZV9kbWFfZW5kIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKKwkvKiBnZXQgRE1BIHN0YXR1cyAqLworCWRtYV9zdGF0ID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCS8qIHJlYWQgRE1BIGNvbW1hbmQgc3RhdGUgKi8KKwlkbWFfY21kID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9jb21tYW5kKTsKKwkvKiBzdG9wIERNQSAqLworCWh3aWYtPk9VVEIoKGRtYV9jbWQgJiB+MSksIGh3aWYtPmRtYV9jb21tYW5kKTsKKwkvKiBjbGVhciB0aGUgSU5UUiAmIEVSUk9SIGJpdHMgKi8KKwlod2lmLT5PVVRCKGRtYV9zdGF0fDYsIGh3aWYtPmRtYV9zdGF0dXMpOworCS8qIGFuZCBmcmVlIGFueSBETUEgcmVzb3VyY2VzICovCisJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOworCS8qIHZlcmlmeSBnb29kIERNQSBzdGF0dXMgKi8KKwlyZXR1cm4gKGRtYV9zdGF0ICYgNykgIT0gNDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2NtZDY0eChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXUzMiBjbGFzc19yZXYgPSAwOworCXU4IG1yZG1vZGUgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKworI2lmZGVmIF9faTM4Nl9fCisJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1JPTV9BRERSRVNTLCBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0IHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBST00gZW5hYmxlZCBhdCAweCUwOGx4XG4iLCBuYW1lLCBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KTsKKwl9CisjZW5kaWYKKworCXN3aXRjaChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0MzoKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0NjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjaGlwc2V0IHJldmlzaW9uIDB4JTAyWCwgIiwgbmFtZSwgY2xhc3NfcmV2KTsKKwkJCXN3aXRjaChjbGFzc19yZXYpIHsKKwkJCQljYXNlIDB4MDc6CisJCQkJY2FzZSAweDA1OgorCQkJCQlwcmludGsoIlVsdHJhRE1BIENhcGFibGUiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDAzOgorCQkJCQlwcmludGsoIk11bHRpV29yZCBETUEgRm9yY2UgTGltaXRlZCIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDE6CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKCJNdWx0aVdvcmQgRE1BIExpbWl0ZWQsIElSUSB3b3JrYXJvdW5kIGVuYWJsZWQiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DTURfNjQ4OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0OToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLyogU2V0IGEgZ29vZCBsYXRlbmN5IHRpbWVyIGFuZCBjYWNoZSBsaW5lIHNpemUgdmFsdWUuICovCisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CisJLyogRklYTUU6IHBjaV9zZXRfbWFzdGVyKCkgdG8gZW5zdXJlIGEgZ29vZCBsYXRlbmN5IHRpbWVyIHZhbHVlICovCisKKwkvKiBTZXR1cCBpbnRlcnJ1cHRzLiAqLworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIE1SRE1PREUsICZtcmRtb2RlKTsKKwltcmRtb2RlICY9IH4oMHgzMCk7CisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIE1SRE1PREUsIG1yZG1vZGUpOworCisJLyogVXNlIE1FTU9SWSBSRUFEIExJTkUgZm9yIHJlYWRzLgorCSAqIE5PVEU6IEFsdGhvdWdoIG5vdCBtZW50aW9uZWQgaW4gdGhlIFBDSTA2NDZVIHNwZWNzLAorCSAqICAgICAgIHRoZXNlIGJpdHMgYXJlIHdyaXRlIG9ubHkgYW5kIHdvbid0IGJlIHJlYWQKKwkgKiAgICAgICBiYWNrIGFzIHNldCBvciBub3QuICBUaGUgUENJMDY0NlUyIHNwZWNzIGNsYXJpZnkKKwkgKiAgICAgICB0aGlzIHBvaW50LgorCSAqLworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBNUkRNT0RFLCBtcmRtb2RlIHwgMHgwMik7CisKKwkvKiBTZXQgcmVhc29uYWJsZSBhY3RpdmUvcmVjb3ZlcnkvYWRkcmVzcy1zZXR1cCB2YWx1ZXMuICovCisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEFSVFRJTTAsICAweDQwKTsKKwkodm9pZCkgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRFJXVElNMCwgIDB4M2YpOworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBUlRUSU0xLCAgMHg0MCk7CisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIERSV1RJTTEsICAweDNmKTsKKyNpZmRlZiBfX2kzODZfXworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBUlRUSU0yMywgMHgxYyk7CisjZWxzZQorCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBBUlRUSU0yMywgMHg1Yyk7CisjZW5kaWYKKwkodm9pZCkgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRFJXVElNMjMsIDB4M2YpOworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBEUldUSU0zLCAgMHgzZik7CisjaWZkZWYgQ09ORklHX1BQQworCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBVRElERVRDUjAsIDB4ZjApOworI2VuZGlmIC8qIENPTkZJR19QUEMgKi8KKworI2lmIGRlZmluZWQoRElTUExBWV9DTUQ2NFhfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKworCWNtZF9kZXZzW25fY21kX2RldnMrK10gPSBkZXY7CisKKwlpZiAoIWNtZDY0eF9wcm9jKSB7CisJCWNtZDY0eF9wcm9jID0gMTsKKwkJaWRlX3BjaV9jcmVhdGVfaG9zdF9wcm9jKCJjbWQ2NHgiLCBjbWQ2NHhfZ2V0X2luZm8pOworCX0KKyNlbmRpZiAvKiBESVNQTEFZX0NNRDY0WF9USU1JTkdTICYmIENPTkZJR19QUk9DX0ZTICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYXRhNjZfY21kNjR4KGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTggYXRhNjYgPSAwLCBtYXNrID0gKGh3aWYtPmNoYW5uZWwpID8gMHgwMiA6IDB4MDE7CisKKwlzd2l0Y2goaHdpZi0+cGNpX2Rldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DTURfNjQzOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0NjoKKwkJCXJldHVybiBhdGE2NjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCBCTUlERUNTUiwgJmF0YTY2KTsKKwlyZXR1cm4gKGF0YTY2ICYgbWFzaykgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9jbWQ2NHgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgY2xhc3NfcmV2OworCisJaHdpZi0+YXV0b2RtYSA9IDA7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKworCWh3aWYtPnR1bmVwcm9jICA9ICZjbWQ2NHhfdHVuZXByb2M7CisJaHdpZi0+c3BlZWRwcm9jID0gJmNtZDY0eF90dW5lX2NoaXBzZXQ7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCisJaHdpZi0+dWx0cmFfbWFzayA9IDB4M2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7CisKKwlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DTURfNjQzKQorCQlod2lmLT51bHRyYV9tYXNrID0gMHg4MDsKKwlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DTURfNjQ2KQorCQlod2lmLT51bHRyYV9tYXNrID0gKGNsYXNzX3JldiA+IDB4MDQpID8gMHgwNyA6IDB4ODA7CisJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ01EXzY0OCkKKwkJaHdpZi0+dWx0cmFfbWFzayA9IDB4MWY7CisKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJmNtZDY0eF9jb25maWdfZHJpdmVfZm9yX2RtYTsKKwlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9jbWQ2NHgoaHdpZik7CisKKwlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DTURfNjQ2KSB7CisJCWh3aWYtPmNoaXBzZXQgPSBpZGVfY21kNjQ2OworCQlpZiAoY2xhc3NfcmV2ID09IDB4MDEpIHsKKwkJCWh3aWYtPmlkZV9kbWFfZW5kID0gJmNtZDY0Nl8xX2lkZV9kbWFfZW5kOworCQl9IGVsc2UgeworCQkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmY21kNjR4X2lkZV9kbWFfZW5kOworCQkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZjbWQ2NHhfaWRlX2RtYV90ZXN0X2lycTsKKwkJfQorCX0gZWxzZSB7CisJCWh3aWYtPmlkZV9kbWFfZW5kID0gJmNtZDY0eF9pZGVfZG1hX2VuZDsKKwkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZjbWQ2NHhfaWRlX2RtYV90ZXN0X2lycTsKKwl9CisKKworCWlmICghbm9hdXRvZG1hKQorCQlod2lmLT5hdXRvZG1hID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBjbWQ2NHhfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0geworCXsJLyogMCAqLworCQkubmFtZQkJPSAiQ01ENjQzIiwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9jbWQ2NHgsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfY21kNjR4LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAxICovCisJCS5uYW1lCQk9ICJDTUQ2NDYiLAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2NtZDY0eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9jbWQ2NHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4MDAsMHgwMCwweDAwfSwgezB4NTEsMHg4MCwweDgwfX0sCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAyICovCisJCS5uYW1lCQk9ICJDTUQ2NDgiLAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2NtZDY0eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9jbWQ2NHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDMgKi8KKwkJLm5hbWUJCT0gIkNNRDY0OSIsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfY21kNjR4LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2NtZDY0eCwKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbWQ2NHhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZjbWQ2NHhfY2hpcHNldHNbaWQtPmRyaXZlcl9kYXRhXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjbWQ2NHhfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DTUQsIFBDSV9ERVZJQ0VfSURfQ01EXzY0MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9DTURfNjQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKwl7IFBDSV9WRU5ET1JfSURfQ01ELCBQQ0lfREVWSUNFX0lEX0NNRF82NDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorCXsgUENJX1ZFTkRPUl9JRF9DTUQsIFBDSV9ERVZJQ0VfSURfQ01EXzY0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgM30sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjbWQ2NHhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIkNNRDY0eF9JREUiLAorCS5pZF90YWJsZQk9IGNtZDY0eF9wY2lfdGJsLAorCS5wcm9iZQkJPSBjbWQ2NHhfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGNtZDY0eF9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY21kNjR4X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiRWRkaWUgRG9zdCwgRGF2aWQgTWlsbGVyLCBBbmRyZSBIZWRyaWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBDTUQ2NHggSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvY3M1NTIwLmMgYi9kcml2ZXJzL2lkZS9wY2kvY3M1NTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9jczU1MjAuYwpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqCUlERSB0dW5pbmcgYW5kIGJ1cyBtYXN0ZXJpbmcgc3VwcG9ydCBmb3IgdGhlIENTNTUxMC9DUzU1MjAKKyAqCWNoaXBzZXRzCisgKgorICoJVGhlIENTNTUxMC9DUzU1MjAgYXJlIHNsaWdodGx5IHVudXN1YWwgZGV2aWNlcy4gVW5saWtlIHRoZSAKKyAqCXR5cGljYWwgSURFIGNvbnRyb2xsZXJzIHRoZXkgZG8gYnVzIG1hc3RlcmluZyB3aXRoIHRoZSBkcml2ZSBpbgorICoJUElPIG1vZGUgYW5kIHNtYXJ0ZXIgc2lsaWNvbi4KKyAqCisgKglUaGUgcHJhY3RpY2FsIHVwc2hvdCBvZiB0aGlzIGlzIHRoYXQgd2UgbXVzdCBhbHdheXMgdHVuZSB0aGUKKyAqCWRyaXZlIGZvciB0aGUgcmlnaHQgUElPIG1vZGUuIFdlIG11c3QgYWxzbyBpZ25vcmUgYWxsIHRoZSBibGFja2xpc3RzCisgKglhbmQgdGhlIGRyaXZlIGJ1cyBtYXN0ZXJpbmcgRE1BIGluZm9ybWF0aW9uLgorICoKKyAqCSoqKiBUaGlzIGRyaXZlciBpcyBzdHJpY3RseSBleHBlcmltZW50YWwgKioqCisgKgorICoJKGMpIENvcHlyaWdodCBSZWQgSGF0IEluYyAyMDAyCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCisgKiBpcyBpbiBhbiBvcGVuIG5vbiBwYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKKyAqIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCisgKiBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgorICoKKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdHJ1Y3QgcGlvX2Nsb2NrcworeworCWludCBhZGRyZXNzOworCWludCBhc3NlcnQ7CisJaW50IHJlY292ZXJ5OworfTsKKworc3RhdGljIHN0cnVjdCBwaW9fY2xvY2tzIGNzNTUyMF9waW9fY2xvY2tzW109eworCXszLCA2LCAxMX0sCisJezIsIDUsIDZ9LAorCXsxLCA0LCAzfSwKKwl7MSwgMywgMn0sCisJezEsIDIsIDF9Cit9OworCitzdGF0aWMgaW50IGNzNTUyMF90dW5lX2NoaXBzZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1OCBzcGVlZCA9IG1pbigodTgpWEZFUl9QSU9fNCwgeGZlcnNwZWVkKTsKKwlpbnQgcGlvID0gc3BlZWQ7CisJdTggcmVnOworCWludCBjb250cm9sbGVyID0gZHJpdmUtPmRuID4gMSA/IDEgOiAwOworCWludCBlcnJvcjsKKwkKKwlzd2l0Y2goc3BlZWQpCisJeworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzE6CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJCXBpbyAtPSBYRkVSX1BJT18wOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwaW8gPSAwOworCQkJcHJpbnRrKEtFUk5fRVJSICJjczU1eDA6IGJhZCBpZGUgdGltaW5nLlxuIik7CisJfQorCQorCXByaW50aygiUElPIGNsb2NraW5nID0gJWRcbiIsIHBpbyk7CisJCisJLyogRklYTUU6IGlmIERNQSA9IDEgZG8gd2UgbmVlZCB0byBzZXQgdGhlIERNQSBiaXQgaGVyZSA/ICovCisKKwkvKiA4Yml0IENBVC9DUlQgLSA4Yml0IGNvbW1hbmQgdGltaW5nIGZvciBjaGFubmVsICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjIgKyBjb250cm9sbGVyLCAKKwkJKGNzNTUyMF9waW9fY2xvY2tzW3Bpb10ucmVjb3ZlcnkgPDwgNCkgfAorCQkoY3M1NTIwX3Bpb19jbG9ja3NbcGlvXS5hc3NlcnQpKTsKKworCS8qIDB4NjQgLSAxNmJpdCBQcmltYXJ5LCAweDY4IC0gMTZiaXQgU2Vjb25kYXJ5ICovCisKKwkvKiBGSVhNRTogc2hvdWxkIHRoZXNlIHVzZSBhZGRyZXNzID8gKi8KKwkvKiBEYXRhIHJlYWQgdGltaW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjQgKyA0KmNvbnRyb2xsZXIgKyAoZHJpdmUtPmRuJjEpLAorCQkoY3M1NTIwX3Bpb19jbG9ja3NbcGlvXS5yZWNvdmVyeSA8PCA0KSB8CisJCShjczU1MjBfcGlvX2Nsb2Nrc1twaW9dLmFzc2VydCkpOworCS8qIFdyaXRlIGNvbW1hbmQgdGltaW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjYgKyA0KmNvbnRyb2xsZXIgKyAoZHJpdmUtPmRuJjEpLAorCQkoY3M1NTIwX3Bpb19jbG9ja3NbcGlvXS5yZWNvdmVyeSA8PCA0KSB8CisJCShjczU1MjBfcGlvX2Nsb2Nrc1twaW9dLmFzc2VydCkpOworCQkKKwkvKiBTZXQgdGhlIERNQSBlbmFibGUvZGlzYWJsZSBmbGFnICovCisJcmVnID0gaW5iKGh3aWYtPmRtYV9iYXNlICsgMHgwMiArIDgqY29udHJvbGxlcik7CisJcmVnIHw9IDE8PCgoZHJpdmUtPmRuJjEpKzUpOworCW91dGIocmVnLCBod2lmLT5kbWFfYmFzZSArIDB4MDIgKyA4KmNvbnRyb2xsZXIpOworCQkKKwllcnJvciA9IGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKTsKKwkvKiBBVEFQSSBpcyBoYXJkZXIgc28gbGVhdmUgaXQgZm9yIG5vdyAqLworCWlmKCFlcnJvciAmJiBkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCWVycm9yID0gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CQorCQorc3RhdGljIHZvaWQgY3M1NTIwX3R1bmVfZHJpdmUoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDQsIE5VTEwpOworCWNzNTUyMF90dW5lX2NoaXBzZXQoZHJpdmUsIChYRkVSX1BJT18wICsgcGlvKSk7Cit9CisKK3N0YXRpYyBpbnQgY3M1NTIwX2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKworCS8qIFR1bmUgdGhlIGRyaXZlIGZvciBQSU8gbW9kZXMgdXAgdG8gUElPIDQgKi8JCisJY3M1NTIwX3R1bmVfZHJpdmUoZHJpdmUsIDQpOworCS8qIFRoZW4gdGVsbCB0aGUgY29yZSB0byB1c2UgRE1BIG9wZXJhdGlvbnMgKi8KKwlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7Cit9CisKKy8qCisgKglXZSBwcm92aWRlIGEgY2FsbGJhY2sgZm9yIG91ciBub25zdGFuZGFyZCBETUEgbG9jYXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY3M1NTIwX2luaXRfc2V0dXBfZG1hKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQsIGlkZV9od2lmX3QgKmh3aWYpCit7CisJdW5zaWduZWQgbG9uZyBibWlkZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpOwkvKiBOb3QgdGhlIHVzdWFsIDQgKi8KKwlpZihod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmRtYV9iYXNlKQkvKiBTZWNvbmQgY2hhbm5lbCBhdCBwcmltYXJ5ICsgOCAqLworCQlibWlkZSArPSA4OworCWlkZV9zZXR1cF9kbWEoaHdpZiwgYm1pZGUsIDgpOworfQorCisvKgorICoJV2Ugd3JhcCB0aGUgRE1BIGFjdGl2YXRlIHRvIHNldCB0aGUgdmRtYSBmbGFnLiBUaGlzIGlzIG5lZWRlZAorICoJc28gdGhhdCB0aGUgSURFIERNQSBsYXllciBpc3N1ZXMgUElPIG5vdCBETUEgY29tbWFuZHMgb3ZlciB0aGUKKyAqCURNQSBjaGFubmVsCisgKi8KKyAKK3N0YXRpYyBpbnQgY3M1NTIwX2RtYV9vbihpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJZHJpdmUtPnZkbWEgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2NzNTUyMChpZGVfaHdpZl90ICpod2lmKQoreworCWh3aWYtPnR1bmVwcm9jID0gJmNzNTUyMF90dW5lX2RyaXZlOworCWh3aWYtPnNwZWVkcHJvYyA9ICZjczU1MjBfdHVuZV9jaGlwc2V0OworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmY3M1NTIwX2NvbmZpZ19kcml2ZV94ZmVyX3JhdGU7CisJaHdpZi0+aWRlX2RtYV9vbiA9ICZjczU1MjBfZG1hX29uOworCisJaWYoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJCisJaWYoIWh3aWYtPmRtYV9iYXNlKQorCXsKKwkJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gMTsKKwkJaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gMTsKKwkJcmV0dXJuOworCX0KKwkKKwlod2lmLT5hdGFwaV9kbWEgPSAwOworCWh3aWYtPnVsdHJhX21hc2sgPSAwOworCWh3aWYtPnN3ZG1hX21hc2sgPSAwOworCWh3aWYtPm13ZG1hX21hc2sgPSAwOworCQorCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9DU19ERVYobmFtZV9zdHIpCQkJCVwKKwl7CQkJCQkJCVwKKwkJLm5hbWUJCT0gbmFtZV9zdHIsCQkJXAorCQkuaW5pdF9zZXR1cF9kbWEgPSBjczU1MjBfaW5pdF9zZXR1cF9kbWEsCVwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9jczU1MjAsCQlcCisJCS5jaGFubmVscwk9IDIsCQkJCVwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAkJCVwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCQkJXAorCQkuZmxhZ3MJCT0gSURFUENJX0ZMQUdfSVNBX1BPUlRTLAlcCisJfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBjeXJpeF9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogMCAqLyBERUNMQVJFX0NTX0RFVigiQ3lyaXggNTUxMCIpLAorCS8qIDEgKi8gREVDTEFSRV9DU19ERVYoIkN5cml4IDU1MjAiKQorfTsKKworLyoKKyAqCVRoZSA1NTEwLzU1MjAgYXJlIGEgYml0IHdlaXJkLiBUaGV5IGRvbid0IHF1aXRlIHNldCB1cCB0aGUgd2F5CisgKgl0aGUgUENJIGhlbHBlciBsYXllciBleHBlY3RzIHNvIHdlIG11c3QgZG8gbXVjaCBvZiB0aGUgc2V0IHVwIAorICoJd29yayBsb25naGFuZC4KKyAqLworIAorc3RhdGljIGludCBfX2RldmluaXQgY3M1NTIwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlhdGFfaW5kZXhfdCBpbmRleDsKKwlpZGVfcGNpX2RldmljZV90ICpkID0gJmN5cml4X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CisKKwlpZGVfc2V0dXBfcGNpX25vaXNlKGRldiwgZCk7CisKKwkvKiBXZSBtdXN0IG5vdCBncmFiIHRoZSBlbnRpcmUgZGV2aWNlLCBpdCBoYXMgJ0lTQScgc3BhY2UgaW4gaXRzCisJICAgQkFSUyB0b28gYW5kIHdlIHdpbGwgZnJlYWsgb3V0IG90aGVyIGJpdHMgb2YgdGhlIGtlcm5lbCAqLworCWlmKHBjaV9lbmFibGVfZGV2aWNlX2JhcnMoZGV2LCAxPDwyKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZW5hYmxlIDU1eDAuXG4iLCBkLT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCXBjaV9zZXRfbWFzdGVyKGRldik7CisJaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M1NTIwOiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZGV4LmFsbCA9IDB4ZjBmMDsKKworCS8qCisJICoJTm93IHRoZSBjaGlwc2V0IGlzIGNvbmZpZ3VyZWQgd2UgY2FuIGxldCB0aGUgY29yZQorCSAqCWRvIGFsbCB0aGUgZGV2aWNlIHNldHVwIGZvciB1cworCSAqLworCisJaWRlX3BjaV9zZXR1cF9wb3J0cyhkZXYsIGQsIDE0LCAmaW5kZXgpOworCisJaWYoKGluZGV4LmIubG93ICYgMHhmMCkgIT0gMHhmMCkKKwkJcHJvYmVfaHdpZl9pbml0KCZpZGVfaHdpZnNbaW5kZXguYi5sb3ddKTsKKwlpZigoaW5kZXguYi5oaWdoICYgMHhmMCkgIT0gMHhmMCkKKwkJcHJvYmVfaHdpZl9pbml0KCZpZGVfaHdpZnNbaW5kZXguYi5oaWdoXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczU1MjBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczU1MjBfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIkN5cml4X0lERSIsCisJLmlkX3RhYmxlCT0gY3M1NTIwX3BjaV90YmwsCisJLnByb2JlCQk9IGNzNTUyMF9pbml0X29uZSwKK307CisKK3N0YXRpYyBpbnQgY3M1NTIwX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjczU1MjBfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgQ3lyaXggNTUxMC81NTIwIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jIGIvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODE5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMJCVZlcnNpb24gMC43CVNlcHQgMTAsIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAJCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICogRGl0dG8gb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwCQkJTWFyayBMb3JkIDxtbG9yZEBwb2JveC5jb20+CisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNoaXBzZXQgZHJpdmVyIHdhcyBmdW5kZWQKKyAqIGJ5IHRoZSBuaWNlIGZvbGtzIGF0IE5hdGlvbmFsIFNlbWljb25kdWN0b3IuCisgKgorICogRG9jdW1lbnRhdGlvbjoKKyAqCUNTNTUzMCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3IuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKioKKyAqCWNzNTUzMF94ZmVyX3NldF9tb2RlCS0Jc2V0IGEgbmV3IHRyYW5zZmVyIG1vZGUgYXQgdGhlIGRyaXZlCisgKglAZHJpdmU6IGRyaXZlIHRvIHR1bmUKKyAqCUBtb2RlOiBuZXcgbW9kZQorICoKKyAqCUxvZ2dpbmcgd3JhcHBlciB0byB0aGUgSURFIGRyaXZlciBzcGVlZCBjb25maWd1cmF0aW9uLiBUaGlzIGNhbgorICoJcHJvYmFibHkgZ28gYXdheSBub3cuCisgKi8KKyAKK3N0YXRpYyBpbnQgY3M1NTMwX3NldF94ZmVyX21vZGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggbW9kZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNzNTUzMF9zZXRfeGZlcl9tb2RlKCVzKVxuIiwKKwkJZHJpdmUtPm5hbWUsIGlkZV94ZmVyX3ZlcmJvc2UobW9kZSkpOworCXJldHVybiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgbW9kZSkpOworfQorCisvKgorICogSGVyZSBhcmUgdGhlIHN0YW5kYXJkIFBJTyBtb2RlIDAtNCB0aW1pbmdzIGZvciBlYWNoICJmb3JtYXQiLgorICogRm9ybWF0LTAgdXNlcyBmYXN0IGRhdGEgcmVnIHRpbWluZ3MsIHdpdGggc2xvd2VyIGNvbW1hbmQgcmVnIHRpbWluZ3MuCisgKiBGb3JtYXQtMSB1c2VzIGZhc3QgdGltaW5ncyBmb3IgYWxsIHJlZ2lzdGVycywgYnV0IHdvbid0IHdvcmsgd2l0aCBhbGwgZHJpdmVzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNzNTUzMF9waW9fdGltaW5nc1syXVs1XSA9IHsKKwl7MHgwMDAwOTE3MiwgMHgwMDAxMjE3MSwgMHgwMDAyMDA4MCwgMHgwMDAzMjAxMCwgMHgwMDA0MDAxMH0sCisJezB4ZDEzMjkxNzIsIDB4NzEyMTIxNzEsIDB4MzAyMDAwODAsIDB4MjAxMDIwMTAsIDB4MDAxMDAwMTB9Cit9OworCisvKgorICogQWZ0ZXIgY2hpcCByZXNldCwgdGhlIFBJTyB0aW1pbmdzIGFyZSBzZXQgdG8gMHgwMDAwZTEzMiwgd2hpY2ggaXMgbm90IHZhbGlkLgorICovCisjZGVmaW5lIENTNTUzMF9CQURfUElPKHRpbWluZ3MpICgoKHRpbWluZ3MpJn4weDgwMDAwMDAwKT09MHgwMDAwZTEzMikKKyNkZWZpbmUgQ1M1NTMwX0JBU0VSRUcoaHdpZikJKCgoaHdpZiktPmRtYV9iYXNlICYgfjB4ZikgKyAoKGh3aWYpLT5jaGFubmVsID8gMHgzMCA6IDB4MjApKQorCisvKioKKyAqCWNzNTUzMF90dW5lcHJvYwkJLQlzZWxlY3Qvc2V0IFBJTyBtb2RlcworICoKKyAqCWNzNTUzMF90dW5lcHJvYygpIGhhbmRsZXMgc2VsZWN0aW9uL3NldHRpbmcgb2YgUElPIG1vZGVzCisgKglmb3IgYm90aCB0aGUgY2hpcHNldCBhbmQgZHJpdmUuCisgKgorICoJVGhlIGlkZV9pbml0X2NzNTUzMCgpIHJvdXRpbmUgZ3VhcmFudGVlcyB0aGF0IGFsbCBkcml2ZXMKKyAqCXdpbGwgaGF2ZSB2YWxpZCBkZWZhdWx0IFBJTyB0aW1pbmdzIHNldCB1cCBiZWZvcmUgd2UgZ2V0IGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgY3M1NTMwX3R1bmVwcm9jIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykJLyogcGlvPTI1NSBtZWFucyAiYXV0b3R1bmUiICovCit7CisJaWRlX2h3aWZfdAkqaHdpZiA9IEhXSUYoZHJpdmUpOworCXVuc2lnbmVkIGludAlmb3JtYXQ7CisJdW5zaWduZWQgbG9uZyBiYXNlcmVnID0gQ1M1NTMwX0JBU0VSRUcoaHdpZik7CisJc3RhdGljIHU4CW1vZGVzWzVdID0geyBYRkVSX1BJT18wLCBYRkVSX1BJT18xLCBYRkVSX1BJT18yLCBYRkVSX1BJT18zLCBYRkVSX1BJT180fTsKKworCXBpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgcGlvLCA0LCBOVUxMKTsKKwlpZiAoIWNzNTUzMF9zZXRfeGZlcl9tb2RlKGRyaXZlLCBtb2Rlc1twaW9dKSkgeworCQlmb3JtYXQgPSAoaHdpZi0+SU5MKGJhc2VyZWcrNCkgPj4gMzEpICYgMTsKKwkJaHdpZi0+T1VUTChjczU1MzBfcGlvX3RpbWluZ3NbZm9ybWF0XVtwaW9dLAorCQkJYmFzZXJlZysoZHJpdmUtPnNlbGVjdC5iLnVuaXQ8PDMpKTsKKwl9Cit9CisKKy8qKgorICoJY3M1NTMwX2NvbmZpZ19kbWEJLQlzZWxlY3Qvc2V0IERNQSBhbmQgVURNQSBtb2RlcworICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKgorICoJY3M1NTMwX2NvbmZpZ19kbWEoKSBoYW5kbGVzIHNlbGVjdGlvbi9zZXR0aW5nIG9mIERNQS9VRE1BIG1vZGVzCisgKglmb3IgYm90aCB0aGUgY2hpcHNldCBhbmQgZHJpdmUuIFRoZSBDUzU1MzAgaGFzIGxpbWl0YXRpb25zIGFib3V0CisgKgltaXhpbmcgRE1BL1VETUEgb24gdGhlIHNhbWUgY2FibGUuCisgKi8KKyAKK3N0YXRpYyBpbnQgY3M1NTMwX2NvbmZpZ19kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpbnQJCQl1ZG1hX29rID0gMSwgbW9kZSA9IDA7CisJaWRlX2h3aWZfdAkJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpbnQJCQl1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJaWRlX2RyaXZlX3QJCSptYXRlID0gJmh3aWYtPmRyaXZlc1t1bml0XjFdOworCXN0cnVjdCBoZF9kcml2ZWlkCSppZCA9IGRyaXZlLT5pZDsKKwl1bnNpZ25lZCBpbnQJCXJlZywgdGltaW5nczsKKwl1bnNpZ25lZCBsb25nCQliYXNlcmVnOworCisJLyoKKwkgKiBEZWZhdWx0IHRvIERNQS1vZmYgaW4gY2FzZSB3ZSBydW4gaW50byB0cm91YmxlIGhlcmUuCisJICovCisJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJLyogdHVybiBvZmYgRE1BIHdoaWxlIHdlIGZpZGRsZSAqLworCWh3aWYtPmlkZV9kbWFfaG9zdF9vZmYoZHJpdmUpOworCS8qIGNsZWFyIERNQV9jYXBhYmxlIGJpdCAqLworCisJLyoKKwkgKiBUaGUgQ1M1NTMwIHNwZWNpZmllcyB0aGF0IHR3byBkcml2ZXMgc2hhcmluZyBhIGNhYmxlIGNhbm5vdAorCSAqIG1peCBVRE1BL01ETUEuICBJdCBoYXMgdG8gYmUgb25lIG9yIHRoZSBvdGhlciwgZm9yIHRoZSBwYWlyLAorCSAqIHRob3VnaCBkaWZmZXJlbnQgdGltaW5ncyBjYW4gc3RpbGwgYmUgY2hvc2VuIGZvciBlYWNoIGRyaXZlLgorCSAqIFdlIGNvdWxkIHNldCB0aGUgYXBwcm9wcmlhdGUgdGltaW5nIGJpdHMgb24gdGhlIGZseSwKKwkgKiBidXQgdGhhdCBtaWdodCBiZSBhIGJpdCBjb25mdXNpbmcuICBTbywgZm9yIG5vdyB3ZSBzdGF0aWNhbGx5CisJICogaGFuZGxlIHRoaXMgcmVxdWlyZW1lbnQgYnkgbG9va2luZyBhdCBvdXIgbWF0ZSBkcml2ZSB0byBzZWUKKwkgKiB3aGF0IGl0IGlzIGNhcGFibGUgb2YsIGJlZm9yZSBjaG9vc2luZyBhIG1vZGUgZm9yIG91ciBvd24gZHJpdmUuCisJICoKKwkgKiBOb3RlOiBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB3ZSBuZXZlciBmYWlsIGZyb20gVURNQSB0byBNV0RNQV8yCisJICogYnV0IGluc3RlYWQgZHJvcCB0byBQSU8KKwkgKi8KKwlpZiAobWF0ZS0+cHJlc2VudCkgeworCQlzdHJ1Y3QgaGRfZHJpdmVpZCAqbWF0ZWlkID0gbWF0ZS0+aWQ7CisJCWlmIChtYXRlaWQgJiYgKG1hdGVpZC0+Y2FwYWJpbGl0eSAmIDEpICYmCisJCSAgICAhX19pZGVfZG1hX2JhZF9kcml2ZShtYXRlKSkgeworCQkJaWYgKChtYXRlaWQtPmZpZWxkX3ZhbGlkICYgNCkgJiYKKwkJCSAgICAobWF0ZWlkLT5kbWFfdWx0cmEgJiA3KSkKKwkJCQl1ZG1hX29rID0gMTsKKwkJCWVsc2UgaWYgKChtYXRlaWQtPmZpZWxkX3ZhbGlkICYgMikgJiYKKwkJCQkgKG1hdGVpZC0+ZG1hX213b3JkICYgNykpCisJCQkJdWRtYV9vayA9IDA7CisJCQllbHNlCisJCQkJdWRtYV9vayA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyBzZWUgd2hhdCB0aGUgY3VycmVudCBkcml2ZSBpcyBjYXBhYmxlIG9mLAorCSAqIHNlbGVjdGluZyBVRE1BIG9ubHkgaWYgdGhlIG1hdGUgc2FpZCBpdCB3YXMgb2suCisJICovCisJaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hICYmCisJICAgICFfX2lkZV9kbWFfYmFkX2RyaXZlKGRyaXZlKSkgeworCQlpZiAodWRtYV9vayAmJiAoaWQtPmZpZWxkX3ZhbGlkICYgNCkgJiYgKGlkLT5kbWFfdWx0cmEgJiA3KSkgeworCQkJaWYgICAgICAoaWQtPmRtYV91bHRyYSAmIDQpCisJCQkJbW9kZSA9IFhGRVJfVURNQV8yOworCQkJZWxzZSBpZiAoaWQtPmRtYV91bHRyYSAmIDIpCisJCQkJbW9kZSA9IFhGRVJfVURNQV8xOworCQkJZWxzZSBpZiAoaWQtPmRtYV91bHRyYSAmIDEpCisJCQkJbW9kZSA9IFhGRVJfVURNQV8wOworCQl9CisJCWlmICghbW9kZSAmJiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgJiYgKGlkLT5kbWFfbXdvcmQgJiA3KSkgeworCQkJaWYgICAgICAoaWQtPmRtYV9td29yZCAmIDQpCisJCQkJbW9kZSA9IFhGRVJfTVdfRE1BXzI7CisJCQllbHNlIGlmIChpZC0+ZG1hX213b3JkICYgMikKKwkJCQltb2RlID0gWEZFUl9NV19ETUFfMTsKKwkJCWVsc2UgaWYgKGlkLT5kbWFfbXdvcmQgJiAxKQorCQkJCW1vZGUgPSBYRkVSX01XX0RNQV8wOworCQl9CisJfQorCisJLyoKKwkgKiBUZWxsIHRoZSBkcml2ZSB0byBzd2l0Y2ggdG8gdGhlIG5ldyBtb2RlOyBhYm9ydCBvbiBmYWlsdXJlLgorCSAqLworCWlmICghbW9kZSB8fCBjczU1MzBfc2V0X3hmZXJfbW9kZShkcml2ZSwgbW9kZSkpCisJCXJldHVybiAxOwkvKiBmYWlsdXJlICovCisKKwkvKgorCSAqIE5vdyB0dW5lIHRoZSBjaGlwc2V0IHRvIG1hdGNoIHRoZSBkcml2ZToKKwkgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBYRkVSX1VETUFfMDoJdGltaW5ncyA9IDB4MDA5MjEyNTA7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV8xOgl0aW1pbmdzID0gMHgwMDkxMTE0MDsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzI6CXRpbWluZ3MgPSAweDAwOTExMDMwOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8wOgl0aW1pbmdzID0gMHgwMDA3Nzc3MTsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMToJdGltaW5ncyA9IDB4MDAwMTIxMjE7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzI6CXRpbWluZ3MgPSAweDAwMDAyMDIwOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNzNTUzMF9jb25maWdfZG1hOiBodWg/IG1vZGU9JTAyeFxuIiwKKwkJCQlkcml2ZS0+bmFtZSwgbW9kZSk7CisJCQlyZXR1cm4gMTsJLyogZmFpbHVyZSAqLworCX0KKwliYXNlcmVnID0gQ1M1NTMwX0JBU0VSRUcoaHdpZik7CisJcmVnID0gaHdpZi0+SU5MKGJhc2VyZWcrNCk7CQkvKiBnZXQgZHJpdmUwIGNvbmZpZyByZWdpc3RlciAqLworCXRpbWluZ3MgfD0gcmVnICYgMHg4MDAwMDAwMDsJCS8qIHByZXNlcnZlIFBJTyBmb3JtYXQgYml0ICovCisJaWYgKHVuaXQgPT0gMCkgewkJCS8qIGFyZSB3ZSBjb25maWd1cmluZyBkcml2ZTA/ICovCisJCWh3aWYtPk9VVEwodGltaW5ncywgYmFzZXJlZys0KTsJLyogd3JpdGUgZHJpdmUwIGNvbmZpZyByZWdpc3RlciAqLworCX0gZWxzZSB7CisJCWlmICh0aW1pbmdzICYgMHgwMDEwMDAwMCkKKwkJCXJlZyB8PSAgMHgwMDEwMDAwMDsJLyogZW5hYmxlIFVETUEgdGltaW5ncyBmb3IgYm90aCBkcml2ZXMgKi8KKwkJZWxzZQorCQkJcmVnICY9IH4weDAwMTAwMDAwOwkvKiBkaXNhYmxlIFVETUEgdGltaW5ncyBmb3IgYm90aCBkcml2ZXMgKi8KKwkJaHdpZi0+T1VUTChyZWcsICAgICBiYXNlcmVnKzQpOwkvKiB3cml0ZSBkcml2ZTAgY29uZmlnIHJlZ2lzdGVyICovCisJCWh3aWYtPk9VVEwodGltaW5ncywgYmFzZXJlZysxMik7CS8qIHdyaXRlIGRyaXZlMSBjb25maWcgcmVnaXN0ZXIgKi8KKwl9CisJKHZvaWQpIGh3aWYtPmlkZV9kbWFfaG9zdF9vbihkcml2ZSk7CisJLyogc2V0IERNQV9jYXBhYmxlIGJpdCAqLworCisJLyoKKwkgKiBGaW5hbGx5LCB0dXJuIERNQSBvbiBpbiBzb2Z0d2FyZSwgYW5kIGV4aXQuCisJICovCisJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOwkvKiBzdWNjZXNzICovCit9CisKKy8qKgorICoJaW5pdF9jaGlwc2V0XzU1MzAJLQlzZXQgdXAgNTUzMCBicmlkZ2UKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCUBuYW1lOiBkZXZpY2UgbmFtZQorICoKKyAqCUluaXRpYWxpemUgdGhlIGNzNTUzMCBicmlkZ2UgZm9yIHJlbGlhYmxlIElERSBETUEgb3BlcmF0aW9uLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9jczU1MzAgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHBjaV9kZXYgKm1hc3Rlcl8wID0gTlVMTCwgKmNzNTUzMF8wID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2ID0gTlVMTDsKKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9DWVJJWF9QQ0lfTUFTVEVSOgorCQkJCW1hc3Rlcl8wID0gZGV2OworCQkJCWJyZWFrOworCQkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZOgorCQkJCWNzNTUzMF8wID0gZGV2OworCQkJCWJyZWFrOworCQl9CisJfQorCWlmICghbWFzdGVyXzApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGxvY2F0ZSBQQ0kgTUFTVEVSIGZ1bmN0aW9uXG4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghY3M1NTMwXzApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGxvY2F0ZSBDUzU1MzAgTEVHQUNZIGZ1bmN0aW9uXG4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCS8qIGFsbCBDUFVzICh0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgQ1BVIHdpdGggdGhpcyBjaGlwc2V0KSAqLworCisJLyoKKwkgKiBFbmFibGUgQnVzTWFzdGVyIGFuZCBNZW1vcnlXcml0ZUFuZEludmFsaWRhdGUgZm9yIHRoZSBjczU1MzA6CisJICogLS0+ICBPUiAweDE0IGludG8gMTYtYml0IFBDSSBDT01NQU5EIHJlZyBvZiBmdW5jdGlvbiAwIG9mIHRoZSBjczU1MzAKKwkgKi8KKworCXBjaV9zZXRfbWFzdGVyKGNzNTUzMF8wKTsKKwlwY2lfc2V0X213aShjczU1MzBfMCk7CisKKwkvKgorCSAqIFNldCBQQ0kgQ2FjaGVMaW5lU2l6ZSB0byAxNi1ieXRlczoKKwkgKiAtLT4gV3JpdGUgMHgwNCBpbnRvIDgtYml0IFBDSSBDQUNIRUxJTkVTSVpFIHJlZyBvZiBmdW5jdGlvbiAwIG9mIHRoZSBjczU1MzAKKwkgKi8KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShjczU1MzBfMCwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHgwNCk7CisKKwkvKgorCSAqIERpc2FibGUgdHJhcHBpbmcgb2YgVURNQSByZWdpc3RlciBhY2Nlc3NlcyAoV2luOTggaGFjayk6CisJICogLS0+IFdyaXRlIDB4NTAwNiBpbnRvIDE2LWJpdCByZWcgYXQgb2Zmc2V0IDB4ZDAgb2YgZnVuY3Rpb24gMCBvZiB0aGUgY3M1NTMwCisJICovCisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY3M1NTMwXzAsIDB4ZDAsIDB4NTAwNik7CisKKwkvKgorCSAqIEJpdC0xIGF0IDB4NDAgZW5hYmxlcyBNZW1vcnlXcml0ZUFuZEludmFsaWRhdGUgb24gaW50ZXJuYWwgWC1idXM6CisJICogVGhlIG90aGVyIHNldHRpbmdzIGFyZSB3aGF0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHJlZ2lzdGVyCisJICogaW50byBhIHNhbmUgc3RhdGUgZm9yIElERSBETUEgb3BlcmF0aW9uLgorCSAqLworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG1hc3Rlcl8wLCAweDQwLCAweDFlKTsKKworCS8qIAorCSAqIFNldCBtYXggUENJIGJ1cnN0IHNpemUgKDE2LWJ5dGVzIHNlZW1zIHRvIHdvcmsgYmVzdCk6CisJICoJICAgMTZieXRlczogc2V0IGJpdC0xIGF0IDB4NDEgKHJlZyB2YWx1ZSBvZiAweDE2KQorCSAqCWFsbCBvdGhlcnM6IGNsZWFyIGJpdC0xIGF0IDB4NDEsIGFuZCBkbzoKKwkgKgkgIDEyOGJ5dGVzOiBPUiAweDAwIGF0IDB4NDEKKwkgKgkgIDI1NmJ5dGVzOiBPUiAweDA0IGF0IDB4NDEKKwkgKgkgIDUxMmJ5dGVzOiBPUiAweDA4IGF0IDB4NDEKKwkgKgkgMTAyNGJ5dGVzOiBPUiAweDBjIGF0IDB4NDEKKwkgKi8KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShtYXN0ZXJfMCwgMHg0MSwgMHgxNCk7CisKKwkvKgorCSAqIFRoZXNlIHNldHRpbmdzIGFyZSBuZWNlc3NhcnkgdG8gZ2V0IHRoZSBjaGlwCisJICogaW50byBhIHNhbmUgc3RhdGUgZm9yIElERSBETUEgb3BlcmF0aW9uLgorCSAqLworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG1hc3Rlcl8wLCAweDQyLCAweDAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUobWFzdGVyXzAsIDB4NDMsIDB4YzEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWluaXRfaHdpZl9jczU1MzAJLQlpbml0aWFsaXNlIGFuIElERSBjaGFubmVsCisgKglAaHdpZjogSURFIHRvIGluaXRpYWxpemUKKyAqCisgKglUaGlzIGdldHMgaW52b2tlZCBieSB0aGUgSURFIGRyaXZlciBvbmNlIGZvciBlYWNoIGNoYW5uZWwuIEl0CisgKglwZXJmb3JtcyBjaGFubmVsLXNwZWNpZmljIHByZS1pbml0aWFsaXphdGlvbiBiZWZvcmUgZHJpdmUgcHJvYmluZy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX2NzNTUzMCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2VyZWc7CisJdTMyIGQwX3RpbWluZ3M7CisJaHdpZi0+YXV0b2RtYSA9IDA7CisKKwlpZiAoaHdpZi0+bWF0ZSkKKwkJaHdpZi0+c2VyaWFsaXplZCA9IGh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSAxOworCisJaHdpZi0+dHVuZXByb2MgPSAmY3M1NTMwX3R1bmVwcm9jOworCWJhc2VyZWcgPSBDUzU1MzBfQkFTRVJFRyhod2lmKTsKKwlkMF90aW1pbmdzID0gaHdpZi0+SU5MKGJhc2VyZWcrMCk7CisJaWYgKENTNTUzMF9CQURfUElPKGQwX3RpbWluZ3MpKSB7CisJCS8qIFBJTyB0aW1pbmdzIG5vdCBpbml0aWFsaXplZD8gKi8KKwkJaHdpZi0+T1VUTChjczU1MzBfcGlvX3RpbWluZ3NbKGQwX3RpbWluZ3M+PjMxKSYxXVswXSwgYmFzZXJlZyswKTsKKwkJaWYgKCFod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUpCisJCQlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCQkJLyogbmVlZHMgYXV0b3R1bmluZyBsYXRlciAqLworCX0KKwlpZiAoQ1M1NTMwX0JBRF9QSU8oaHdpZi0+SU5MKGJhc2VyZWcrOCkpKSB7CisJLyogUElPIHRpbWluZ3Mgbm90IGluaXRpYWxpemVkPyAqLworCQlod2lmLT5PVVRMKGNzNTUzMF9waW9fdGltaW5nc1soZDBfdGltaW5ncz4+MzEpJjFdWzBdLCBiYXNlcmVnKzgpOworCQlpZiAoIWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSkKKwkJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCQkvKiBuZWVkcyBhdXRvdHVuaW5nIGxhdGVyICovCisJfQorCisJaHdpZi0+YXRhcGlfZG1hID0gMTsKKwlod2lmLT51bHRyYV9tYXNrID0gMHgwNzsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmY3M1NTMwX2NvbmZpZ19kbWE7CisJaWYgKCFub2F1dG9kbWEpCisJCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IGNzNTUzMF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUJCT0gIkNTNTUzMCIsCisJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9jczU1MzAsCisJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9jczU1MzAsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IEFVVE9ETUEsCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjczU1MzBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZjczU1MzBfY2hpcHNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczU1MzBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0lERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczU1MzBfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIkNTNTUzMCBJREUiLAorCS5pZF90YWJsZQk9IGNzNTUzMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBjczU1MzBfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGNzNTUzMF9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3M1NTMwX2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBMb3JkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBDeXJpeC9OUyA1NTMwIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMgYi9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYwkJVmVyc2lvbiAwLjQwCVNlcC4gMTAsIDIwMDIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgQW5kcmVhcyBTLiBLcmVicyAoYWtyZWJzQGFsdGF2aXN0YS5uZXQpLCBNYWludGFpbmVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIgQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4sIEludGVncmF0b3IKKyAqCisgKiBDWVBSRVNTIENZODJDNjkzIGNoaXBzZXQgSURFIGNvbnRyb2xsZXIKKyAqCisgKiBUaGUgQ1k4MkM2OTMgY2hpcHNldCBpcyB1c2VkIG9uIERpZ2l0YWwncyBQQy1BbHBoYSAxNjRTWCBib2FyZHMuCisgKiBXcml0aW5nIHRoZSBkcml2ZXIgd2FzIHF1aXRlIHNpbXBsZSwgc2luY2UgbW9zdCBvZiB0aGUgam9iIGlzCisgKiBkb25lIGJ5IHRoZSBnZW5lcmljIHBjaS1pZGUgc3VwcG9ydC4gCisgKiBUaGUgaGFyZCBwYXJ0IHdhcyBmaW5kaW5nIHRoZSBDWTgyQzY5MydzIGRhdGFzaGVldCBvbiBDeXByZXNzJ3MKKyAqIHdlYiBwYWdlIDotKC4gQnV0IEFsdGF2aXN0YSBzb2x2ZWQgdGhpcyBwcm9ibGVtIDotKS4KKyAqCisgKgorICogTm90ZXM6CisgKiAtIEkgcmVjZW50bHkgZ290IGEgMTYuOEcgSUJNIERUVEEsIHNvIEkgd2FzIGFibGUgdG8gdGVzdCBpdCB3aXRoCisgKiAgIGEgbGFyZ2UgYW5kIGZhc3QgZGlzayAtIHRoZSByZXN1bHRzIGxvb2sgZ3JlYXQsIHNvIEknZCBzYXkgdGhlCisgKiAgIGRyaXZlciBpcyB3b3JraW5nIGZpbmUgOi0pCisgKiAgIGhkcGFybSAtdCByZXBvcnRzIDguMTcgTUIvc2VjIGF0IGFib3V0IDYlIENQVSB1c2FnZSBmb3IgdGhlIERUVEEgCisgKiAtIHRoaXMgaXMgbXkgZmlyc3QgbGludXggZHJpdmVyLCBzbyB0aGVyZSdzIHByb2JhYmx5IGEgbG90ICBvZiByb29tIAorICogICBmb3Igb3B0aW1pemF0aW9ucyBhbmQgYnVnIGZpeGluZywgc28gZmVlbCBmcmVlIHRvIGRvIGl0LgorICogLSB1c2UgaWRlYnVzPXh4IHBhcmFtZXRlciB0byBzZXQgUENJIGJ1cyBzcGVlZCAtIG5lZWRlZCB0byBjYWxjCisgKiAgIHRpbWluZ3MgZm9yIFBJTyBtb2RlcyAoZGVmYXVsdCB3aWxsIGJlIDQwKQorICogLSBpZiB1c2luZyBQSU8gbW9kZSBpdCdzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGUgUElPIG1vZGUgYW5kIAorICogICAzMi1iaXQgSS9PIHN1cHBvcnQgKGlmIHBvc3NpYmxlKSwgZS5nLiBoZHBhcm0gLXAyIC1jMSAvZGV2L2hkYQorICogLSBJIGhhZCBzb21lIHByb2JsZW1zIHdpdGggbXkgSUJNIERIRUEgd2l0aCBQSU8gbW9kZXMgPCAyCisgKiAgIChsb3N0IGludGVycnVwdHMpID8/Pz8/CisgKiAtIGZpcnN0IHRlc3RzIHdpdGggRE1BIGxvb2sgb2theSwgdGhleSBzZWVtIHRvIHdvcmssIGJ1dCB0aGVyZSBpcyBhCisgKiAgIHByb2JsZW0gd2l0aCBzb3VuZCAtIHRoZSBCdXNNYXN0ZXIgSURFIFRpbWVPdXQgc2hvdWxkIGZpeGVkIHRoaXMKKyAqCisgKiBBbmNpZW50IEhpc3Rvcnk6CisgKiBBTUhAMTk5OS0wOC0yNDogdjAuMzQgaW5pdF9jeTgyYzY5M19jaGlwIG1vdmVkIHRvIHBjaV9pbml0X2N5ODJjNjkzCisgKiBBU0tAMTk5OS0wMS0yMzogdjAuMzMgbWFkZSBhIGZldyBtaW5vciBjb2RlIGNsZWFuIHVwcworICogICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgRE1BIGNsb2NrIHNwZWVkIHNldHRpbmcgYnkgZGVmYXVsdAorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGJvb3QgbWVzc2FnZQorICogQVNLQDE5OTgtMTEtMDE6IHYwLjMyIGFkZGVkIHN1cHBvcnQgdG8gc2V0IEJ1c01hc3RlciBJREUgVGltZU91dAorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgdG8gc2V0IERNQSBDb250cm9sbGVyIENsb2NrIFNwZWVkCisgKiBBU0tAMTk5OC0xMC0zMTogdjAuMzEgZml4ZWQgcHJvYmxlbSB3aXRoIHNldHRpbmcgdG8gaGlnaCBETUEgbW9kZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIGRyaXZlcy4KKyAqIEFTS0AxOTk4LTEwLTI5OiB2MC4zIGFkZGVkIHN1cHBvcnQgdG8gc2V0IERNQSBtb2RlcworICogQVNLQDE5OTgtMTAtMjg6IHYwLjIgYWRkZWQgc3VwcG9ydCB0byBzZXQgUElPIG1vZGVzCisgKiBBU0tAMTk5OC0xMC0yNzogdjAuMSBmaXJzdCB2ZXJzaW9uIC0gY2hpcHNldCBkZXRlY3Rpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogdGhlIGN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBDWTgyX1ZFUlNJT04JIkNZODJDNjkzVSBkcml2ZXIgdjAuMzQgOTktMTMtMTIgQW5kcmVhcyBTLiBLcmVicyAoYWtyZWJzQGFsdGF2aXN0YS5uZXQpIgorCisvKgorICoJVGhlIGZvbGxvd2luZyBhcmUgdXNlZCB0byBkZWJ1ZyB0aGUgZHJpdmVyLgorICovCisjZGVmaW5lIENZODJDNjkzX0RFQlVHX0xPR1MJMAorI2RlZmluZSBDWTgyQzY5M19ERUJVR19JTkZPCTAKKworLyogZGVmaW5lIENZODJDNjkzX1NFVERNQV9DTE9DSyB0byBzZXQgRE1BIENvbnRyb2xsZXIgQ2xvY2sgU3BlZWQgdG8gQVRDTEsgKi8KKyN1bmRlZiBDWTgyQzY5M19TRVRETUFfQ0xPQ0sKKworLyoKKyAqCU5PVEU6IHRoZSB2YWx1ZSBmb3IgYnVzbWFzdGVyIHRpbWVvdXQgaXMgdHJpY2t5IGFuZCBJIGdvdCBpdCBieQorICoJdHJpYWwgYW5kIGVycm9yISAgQnkgdXNpbmcgYSB0byBsb3cgdmFsdWUgd2lsbCBjYXVzZSBETUEgdGltZW91dHMKKyAqCWFuZCBkcm9wIElERSBwZXJmb3JtYW5jZSwgYW5kIGJ5IHVzaW5nIGEgdG8gaGlnaCB2YWx1ZSB3aWxsIGNhdXNlCisgKglhdWRpbyBwbGF5YmFjayB0byBzY2F0dGVyLgorICoJSWYgeW91IGtub3cgYSBiZXR0ZXIgdmFsdWUgb3IgaG93IHRvIGNhbGMgaXQsIHBsZWFzZSBsZXQgbWUga25vdy4KKyAqLworCisvKiB0d2ljZSB0aGUgdmFsdWUgd3JpdHRlbiBpbiBjeTgyYzY5M3ViIGRhdGFzaGVldCAqLworI2RlZmluZSBCVVNNQVNURVJfVElNRU9VVAkweDUwCisvKgorICogdGhlIHZhbHVlIGFib3ZlIHdhcyB0ZXN0ZWQgb24gbXkgbWFjaGluZSBhbmQgaXQgc2VlbXMgdG8gd29yayBva2F5CisgKi8KKworLyogaGVyZSBhcmUgdGhlIG9mZnNldCBkZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycyAqLworI2RlZmluZSBDWTgyX0lERV9DTURSRUcJCTB4MDQKKyNkZWZpbmUgQ1k4Ml9JREVfQUREUlNFVFVQCTB4NDgKKyNkZWZpbmUgQ1k4Ml9JREVfTUFTVEVSX0lPUgkweDRDCisjZGVmaW5lIENZODJfSURFX01BU1RFUl9JT1cJMHg0RAorI2RlZmluZSBDWTgyX0lERV9TTEFWRV9JT1IJMHg0RQorI2RlZmluZSBDWTgyX0lERV9TTEFWRV9JT1cJMHg0RgorI2RlZmluZSBDWTgyX0lERV9NQVNURVJfOEJJVAkweDUwCisjZGVmaW5lIENZODJfSURFX1NMQVZFXzhCSVQJMHg1MQorCisjZGVmaW5lIENZODJfSU5ERVhfUE9SVAkJMHgyMgorI2RlZmluZSBDWTgyX0RBVEFfUE9SVAkJMHgyMworCisjZGVmaW5lIENZODJfSU5ERVhfQ1RSTFJFRzEJMHgwMQorI2RlZmluZSBDWTgyX0lOREVYX0NIQU5ORUwwCTB4MzAKKyNkZWZpbmUgQ1k4Ml9JTkRFWF9DSEFOTkVMMQkweDMxCisjZGVmaW5lIENZODJfSU5ERVhfVElNRU9VVAkweDMyCisKKy8qIHRoZSBtYXggUElPIG1vZGUgLSBmcm9tIGRhdGFzaGVldCAqLworI2RlZmluZSBDWTgyQzY5M19NQVhfUElPCTQKKworLyogdGhlIG1pbiBhbmQgbWF4IFBDSSBidXMgc3BlZWQgaW4gTUh6IC0gZnJvbSBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgQ1k4MkM5NjNfTUlOX0JVU19TUEVFRAkyNQorI2RlZmluZSBDWTgyQzk2M19NQVhfQlVTX1NQRUVECTMzCisKKy8qIHRoZSBzdHJ1Y3QgZm9yIHRoZSBQSU8gbW9kZSB0aW1pbmdzICovCit0eXBlZGVmIHN0cnVjdCBwaW9fY2xvY2tzX3MgeworCXU4CWFkZHJlc3NfdGltZTsJLyogQWRkcmVzcyBzZXR1cCAoY2xvY2tzKSAqLworCXU4CXRpbWVfMTZyOwkvKiBjbG9ja3MgZm9yIDE2Yml0IElPUiAoMHhGMD1BY3RpdmUvZGF0YSwgMHgwRj1SZWNvdmVyeSkgKi8KKwl1OAl0aW1lXzE2dzsJLyogY2xvY2tzIGZvciAxNmJpdCBJT1cgKDB4RjA9QWN0aXZlL2RhdGEsIDB4MEY9UmVjb3ZlcnkpICovCisJdTgJdGltZV84OwkJLyogY2xvY2tzIGZvciA4Yml0ICgweEYwPUFjdGl2ZS9kYXRhLCAweDBGPVJlY292ZXJ5KSAqLworfSBwaW9fY2xvY2tzX3Q7CisKKy8qCisgKiBjYWxjIGNsb2NrcyB1c2luZyBidXNfc3BlZWQKKyAqIHJldHVybnMgKHJvdW5kZWQgdXApIHRpbWUgaW4gYnVzIGNsb2NrcyBmb3IgdGltZSBpbiBucworICovCitzdGF0aWMgaW50IGNhbGNfY2xrIChpbnQgdGltZSwgaW50IGJ1c19zcGVlZCkKK3sKKwlpbnQgY2xvY2tzOworCisJY2xvY2tzID0gKHRpbWUqYnVzX3NwZWVkKzk5OSkvMTAwMCAtMTsKKworCWlmIChjbG9ja3MgPCAwKQorCQljbG9ja3MgPSAwOworCisJaWYgKGNsb2NrcyA+IDB4MEYpCisJCWNsb2NrcyA9IDB4MEY7CisKKwlyZXR1cm4gY2xvY2tzOworfQorCisvKgorICogY29tcHV0ZSB0aGUgdmFsdWVzIGZvciB0aGUgY2xvY2sgcmVnaXN0ZXJzIGZvciBQSU8KKyAqIG1vZGUgYW5kIHBjaV9jbGsgW01Iel0gc3BlZWQKKyAqCisgKiBOT1RFOiBmb3IgbW9kZSAwLDEgYW5kIDIgZHJpdmVzIDgtYml0IElERSBjb21tYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSB1c2VkCisgKiAgICAgICBmb3IgbW9kZSAzIGFuZCA0IGRyaXZlcyA4IGFuZCAxNi1iaXQgdGltaW5ncyBhcmUgdGhlIHNhbWUKKyAqCisgKi8gCitzdGF0aWMgdm9pZCBjb21wdXRlX2Nsb2NrcyAodTggcGlvLCBwaW9fY2xvY2tzX3QgKnBfcGNsaykKK3sKKwlpbnQgY2xrMSwgY2xrMjsKKwlpbnQgYnVzX3NwZWVkID0gc3lzdGVtX2J1c19jbG9jaygpOwkvKiBnZXQgc3BlZWQgb2YgUENJIGJ1cyAqLworCisJLyogd2UgZG9uJ3QgY2hlY2sgYWdhaW5zdCBDWTgyQzY5MydzIG1pbiBhbmQgbWF4IHNwZWVkLAorCSAqIHNvIHlvdSBjYW4gcGxheSB3aXRoIHRoZSBpZGVidXM9eHggcGFyYW1ldGVyCisJICovCisKKwlpZiAocGlvID4gQ1k4MkM2OTNfTUFYX1BJTykKKwkJcGlvID0gQ1k4MkM2OTNfTUFYX1BJTzsKKworCS8qIGxldCdzIGNhbGMgdGhlIGFkZHJlc3Mgc2V0dXAgdGltZSBjbG9ja3MgKi8KKwlwX3BjbGstPmFkZHJlc3NfdGltZSA9ICh1OCljYWxjX2NsayhpZGVfcGlvX3RpbWluZ3NbcGlvXS5zZXR1cF90aW1lLCBidXNfc3BlZWQpOworCisJLyogbGV0J3MgY2FsYyB0aGUgYWN0aXZlIGFuZCByZWNvdmVyeSB0aW1lIGNsb2NrcyAqLworCWNsazEgPSBjYWxjX2NsayhpZGVfcGlvX3RpbWluZ3NbcGlvXS5hY3RpdmVfdGltZSwgYnVzX3NwZWVkKTsKKworCS8qIGNhbGMgcmVjb3ZlcnkgdGltaW5nICovCisJY2xrMiA9CWlkZV9waW9fdGltaW5nc1twaW9dLmN5Y2xlX3RpbWUgLQorCQlpZGVfcGlvX3RpbWluZ3NbcGlvXS5hY3RpdmVfdGltZSAtCisJCWlkZV9waW9fdGltaW5nc1twaW9dLnNldHVwX3RpbWU7CisKKwljbGsyID0gY2FsY19jbGsoY2xrMiwgYnVzX3NwZWVkKTsKKworCWNsazEgPSAoY2xrMTw8NCl8Y2xrMjsJLyogY29tYmluZSBhY3RpdmUgYW5kIHJlY292ZXJ5IGNsb2NrcyAqLworCisJLyogbm90ZTogd2UgdXNlIHRoZSBzYW1lIHZhbHVlcyBmb3IgMTZiaXQgSU9SIGFuZCBJT1cKKyAgICAgICAgICoJdGhvc2UgYXJlIGFsbCB0aGUgc2FtZSwgc2luY2UgSSBkb24ndCBoYXZlIG90aGVyCisJICoJdGltaW5ncyB0aGFuIHRob3NlIGZyb20gaWRlLWxpYi5jCisJICovCisKKwlwX3BjbGstPnRpbWVfMTZyID0gKHU4KWNsazE7CisJcF9wY2xrLT50aW1lXzE2dyA9ICh1OCljbGsxOworCisJLyogd2hhdCBhcmUgZ29vZCB2YWx1ZXMgZm9yIDhiaXQgPz8gKi8KKwlwX3BjbGstPnRpbWVfOCA9ICh1OCljbGsxOworfQorCisvKgorICogc2V0IERNQSBtb2RlIGEgc3BlY2lmaWMgY2hhbm5lbCBmb3IgQ1k4MkM2OTMKKyAqLworCitzdGF0aWMgdm9pZCBjeTgyYzY5M19kbWFfZW5hYmxlIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtb2RlLCBpbnQgc2luZ2xlKQoreworCXU4IGluZGV4ID0gMCwgZGF0YSA9IDA7CisKKwlpZiAobW9kZT4yKQkvKiBtYWtlIHN1cmUgd2Ugc2V0IGEgdmFsaWQgbW9kZSAqLworCQltb2RlID0gMjsKKwkJCSAgIAorCWlmIChtb2RlID4gZHJpdmUtPmlkLT50RE1BKSAgLyogdG8gYmUgYWJzb2x1dGx5IHN1cmUgd2UgaGF2ZSBhIHZhbGlkIG1vZGUgKi8KKwkJbW9kZSA9IGRyaXZlLT5pZC0+dERNQTsKKwkKKwlpbmRleCA9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbD09MCkgPyBDWTgyX0lOREVYX0NIQU5ORUwwIDogQ1k4Ml9JTkRFWF9DSEFOTkVMMTsKKworI2lmIENZODJDNjkzX0RFQlVHX0xPR1MKKwkvKiBmb3IgZGVidWcgbGV0J3Mgc2hvdyB0aGUgcHJldmlvdXMgdmFsdWVzICovCisKKwlIV0lGKGRyaXZlKS0+T1VUQihpbmRleCwgQ1k4Ml9JTkRFWF9QT1JUKTsKKwlkYXRhID0gSFdJRihkcml2ZSktPklOQihDWTgyX0RBVEFfUE9SVCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXMgKGNoPSVkLCBkZXY9JWQpOiBETUEgbW9kZSBpcyAlZCAoc2luZ2xlPSVkKVxuIiwKKwkJZHJpdmUtPm5hbWUsIEhXSUYoZHJpdmUpLT5jaGFubmVsLCBkcml2ZS0+c2VsZWN0LmIudW5pdCwKKwkJKGRhdGEmMHgzKSwgKChkYXRhPj4yKSYxKSk7CisjZW5kaWYgLyogQ1k4MkM2OTNfREVCVUdfTE9HUyAqLworCisJZGF0YSA9ICh1OCltb2RlfCh1OCkoc2luZ2xlPDwyKTsKKworCUhXSUYoZHJpdmUpLT5PVVRCKGluZGV4LCBDWTgyX0lOREVYX1BPUlQpOworCUhXSUYoZHJpdmUpLT5PVVRCKGRhdGEsIENZODJfREFUQV9QT1JUKTsKKworI2lmIENZODJDNjkzX0RFQlVHX0lORk8KKwlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IHNldCBETUEgbW9kZSB0byAlZCAoc2luZ2xlPSVkKVxuIiwKKwkJZHJpdmUtPm5hbWUsIEhXSUYoZHJpdmUpLT5jaGFubmVsLCBkcml2ZS0+c2VsZWN0LmIudW5pdCwKKwkJbW9kZSwgc2luZ2xlKTsKKyNlbmRpZiAvKiBDWTgyQzY5M19ERUJVR19JTkZPICovCisKKwkvKiAKKwkgKiBub3RlOiBiZWxvdyB3ZSBzZXQgdGhlIHZhbHVlIGZvciBCdXMgTWFzdGVyIElERSBUaW1lT3V0IFJlZ2lzdGVyCisJICogSSdtIG5vdCBhYnNvbHV0bHkgc3VyZSB3aGF0IHRoaXMgZG9lcywgYnV0IGl0IHNvbHZlZCBteSBwcm9ibGVtCisJICogd2l0aCBJREUgRE1BIGFuZCBzb3VuZCwgc28gSSBub3cgY2FuIHBsYXkgc291bmQgYW5kIHdvcmsgd2l0aAorCSAqIG15IElERSBkcml2ZXIgYXQgdGhlIHNhbWUgdGltZSA6LSkKKwkgKgorCSAqIElmIHlvdSBrbm93IHRoZSBjb3JyZWN0IChiZXN0KSB2YWx1ZSBmb3IgdGhpcyByZWdpc3RlciBwbGVhc2UKKwkgKiBsZXQgbWUga25vdyAtIEFTSworCSAqLworCisJZGF0YSA9IEJVU01BU1RFUl9USU1FT1VUOworCUhXSUYoZHJpdmUpLT5PVVRCKENZODJfSU5ERVhfVElNRU9VVCwgQ1k4Ml9JTkRFWF9QT1JUKTsKKwlIV0lGKGRyaXZlKS0+T1VUQihkYXRhLCBDWTgyX0RBVEFfUE9SVCk7CisKKyNpZiBDWTgyQzY5M19ERUJVR19JTkZPCQorCXByaW50ayAoS0VSTl9JTkZPICIlczogU2V0IElERSBCdXMgTWFzdGVyIFRpbWVPdXQgUmVnaXN0ZXIgdG8gMHglWFxuIiwKKwkJZHJpdmUtPm5hbWUsIGRhdGEpOworI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KK30KKworLyogCisgKiB1c2VkIHRvIHNldCBETUEgbW9kZSBmb3IgQ1k4MkM2OTMgKHNpbmdsZSBhbmQgbXVsdGkgbW9kZXMpCisgKi8KK3N0YXRpYyBpbnQgY3k4MmM2OTNfaWRlX2RtYV9vbiAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworI2lmIENZODJDNjkzX0RFQlVHX0lORk8KKwlwcmludGsgKEtFUk5fSU5GTyAiZG1hX29uOiAlc1xuIiwgZHJpdmUtPm5hbWUpOworI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KKworCWlmIChpZCAhPSBOVUxMKSB7CQkKKwkJLyogRW5hYmxlIERNQSBvbiBhbnkgZHJpdmUgdGhhdCBoYXMgRE1BCisJCSAqIChtdWx0aSBvciBzaW5nbGUpIGVuYWJsZWQKKwkJICovCisJCWlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7CS8qIHJlZ3VsYXIgRE1BICovCisJCQlpbnQgbW1vZGUsIHNtb2RlOworCisJCQltbW9kZSA9IGlkLT5kbWFfbXdvcmQgJiAoaWQtPmRtYV9td29yZCA+PiA4KTsKKwkJCXNtb2RlID0gaWQtPmRtYV8xd29yZCAmIChpZC0+ZG1hXzF3b3JkID4+IDgpOworCQkJICAgICAgIAkJICAgICAgCisJCQlpZiAobW1vZGUgIT0gMCkgeworCQkJCS8qIGVuYWJsZSBtdWx0aSAqLworCQkJCWN5ODJjNjkzX2RtYV9lbmFibGUoZHJpdmUsIChtbW9kZSA+PiAxKSwgMCk7CisJCQl9IGVsc2UgaWYgKHNtb2RlICE9IDApIHsKKwkJCQkvKiBlbmFibGUgc2luZ2xlICovCisJCQkJY3k4MmM2OTNfZG1hX2VuYWJsZShkcml2ZSwgKHNtb2RlID4+IDEpLCAxKTsKKwkJCX0KKwkJfQorCX0KKyAgICAgICAgcmV0dXJuIF9faWRlX2RtYV9vbihkcml2ZSk7Cit9CisKKy8qCisgKiB0dW5lIGlkZSBkcml2ZSAtIHNldCBQSU8gbW9kZQorICovCitzdGF0aWMgdm9pZCBjeTgyYzY5M190dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisJcGlvX2Nsb2Nrc190IHBjbGs7CisJdW5zaWduZWQgaW50IGFkZHJDdHJsOworCisJLyogc2VsZWN0IHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNoYW5uZWwgKi8KKwlpZiAoaHdpZi0+aW5kZXggPiAwKSB7ICAvKiBkcml2ZSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwgKi8KKwkJZGV2ID0gcGNpX2ZpbmRfc2xvdChkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKzEpOworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdHVuZV9kcml2ZTogIgorCQkJCSJDYW5ub3QgZmluZCBzZWNvbmRhcnkgaW50ZXJmYWNlIVxuIiwKKwkJCQlkcml2ZS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKyNpZiBDWTgyQzY5M19ERUJVR19MT0dTCisJLyogZm9yIGRlYnVnIGxldCdzIHNob3cgdGhlIHJlZ2lzdGVyIHZhbHVlcyAqLworCQorICAgICAgIAlpZiAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgPT0gMCkgeworCQkvKgorCQkgKiBnZXQgbWFzdGVyIGRyaXZlIHJlZ2lzdGVycyAgICAgICAgICAgICAgIAkKKwkJICogYWRkcmVzcyBzZXR1cCBjb250cm9sIHJlZ2lzdGVyCisJCSAqIGlzIDMyIGJpdCAhISEKKwkJICovIAorCSAgCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIENZODJfSURFX0FERFJTRVRVUCwgJmFkZHJDdHJsKTsgICAgICAgICAgICAgICAgCisJCWFkZHJDdHJsICY9IDB4MEY7CisKKwkJLyogbm93IGxldCdzIGdldCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX01BU1RFUl9JT1IsICZwY2xrLnRpbWVfMTZyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9NQVNURVJfSU9XLCAmcGNsay50aW1lXzE2dyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfTUFTVEVSXzhCSVQsICZwY2xrLnRpbWVfOCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogc2V0IHNsYXZlIGRyaXZlIHJlZ2lzdGVycworCQkgKiBhZGRyZXNzIHNldHVwIGNvbnRyb2wgcmVnaXN0ZXIKKwkJICogaXMgMzIgYml0ICEhIQorCQkgKi8gCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIENZODJfSURFX0FERFJTRVRVUCwgJmFkZHJDdHJsKTsKKworCQlhZGRyQ3RybCAmPSAweEYwOworCQlhZGRyQ3RybCA+Pj0gNDsKKworCQkvKiBub3cgbGV0J3MgZ2V0IHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfSU9SLCAmcGNsay50aW1lXzE2cik7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfSU9XLCAmcGNsay50aW1lXzE2dyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfOEJJVCwgJnBjbGsudGltZV84KTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IFBJTyB0aW1pbmcgaXMgIgorCQkiKGFkZHI9MHglWCwgaW9yPTB4JVgsIGlvdz0weCVYLCA4Yml0PTB4JVgpXG4iLAorCQlkcml2ZS0+bmFtZSwgaHdpZi0+Y2hhbm5lbCwgZHJpdmUtPnNlbGVjdC5iLnVuaXQsCisJCWFkZHJDdHJsLCBwY2xrLnRpbWVfMTZyLCBwY2xrLnRpbWVfMTZ3LCBwY2xrLnRpbWVfOCk7CisjZW5kaWYgLyogQ1k4MkM2OTNfREVCVUdfTE9HUyAqLworCisJLyogZmlyc3QgbGV0J3MgY2FsYyB0aGUgcGlvIG1vZGVzICovCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIENZODJDNjkzX01BWF9QSU8sIE5VTEwpOworCisjaWYgQ1k4MkM2OTNfREVCVUdfSU5GTworCXByaW50ayAoS0VSTl9JTkZPICIlczogU2VsZWN0ZWQgUElPIG1vZGUgJWRcbiIsIGRyaXZlLT5uYW1lLCBwaW8pOworI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KKworCS8qIGxldCdzIGNhbGMgdGhlIHZhbHVlcyBmb3IgdGhpcyBQSU8gbW9kZSAqLworCWNvbXB1dGVfY2xvY2tzKHBpbywgJnBjbGspOworCisJLyogbm93IGxldCdzIHdyaXRlICB0aGUgY2xvY2tzIHJlZ2lzdGVycyAqLworCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCA9PSAwKSB7CisJCS8qCisJCSAqIHNldCBtYXN0ZXIgZHJpdmUKKwkJICogYWRkcmVzcyBzZXR1cCBjb250cm9sIHJlZ2lzdGVyCisJCSAqIGlzIDMyIGJpdCAhISEKKwkJICovIAorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBDWTgyX0lERV9BRERSU0VUVVAsICZhZGRyQ3RybCk7CisJCQorCQlhZGRyQ3RybCAmPSAofjB4Rik7CisJCWFkZHJDdHJsIHw9ICh1bnNpZ25lZCBpbnQpcGNsay5hZGRyZXNzX3RpbWU7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBDWTgyX0lERV9BRERSU0VUVVAsIGFkZHJDdHJsKTsKKworCQkvKiBub3cgbGV0J3Mgc2V0IHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX01BU1RFUl9JT1IsIHBjbGsudGltZV8xNnIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9NQVNURVJfSU9XLCBwY2xrLnRpbWVfMTZ3KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfTUFTVEVSXzhCSVQsIHBjbGsudGltZV84KTsKKwkJCisJCWFkZHJDdHJsICY9IDB4RjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBzZXQgc2xhdmUgZHJpdmUKKwkJICogYWRkcmVzcyBzZXR1cCBjb250cm9sIHJlZ2lzdGVyCisJCSAqIGlzIDMyIGJpdCAhISEKKwkJICovIAorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBDWTgyX0lERV9BRERSU0VUVVAsICZhZGRyQ3RybCk7CisKKwkJYWRkckN0cmwgJj0gKH4weEYwKTsKKwkJYWRkckN0cmwgfD0gKCh1bnNpZ25lZCBpbnQpcGNsay5hZGRyZXNzX3RpbWU8PDQpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgQ1k4Ml9JREVfQUREUlNFVFVQLCBhZGRyQ3RybCk7CisKKwkJLyogbm93IGxldCdzIHNldCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9TTEFWRV9JT1IsIHBjbGsudGltZV8xNnIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9TTEFWRV9JT1csIHBjbGsudGltZV8xNncpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9TTEFWRV84QklULCBwY2xrLnRpbWVfOCk7CisKKwkJYWRkckN0cmwgPj49IDQ7CisJCWFkZHJDdHJsICY9IDB4RjsKKwl9CQorCisjaWYgQ1k4MkM2OTNfREVCVUdfSU5GTworCXByaW50ayhLRVJOX0lORk8gIiVzIChjaD0lZCwgZGV2PSVkKTogc2V0IFBJTyB0aW1pbmcgdG8gIgorCQkiKGFkZHI9MHglWCwgaW9yPTB4JVgsIGlvdz0weCVYLCA4Yml0PTB4JVgpXG4iLAorCQlkcml2ZS0+bmFtZSwgaHdpZi0+Y2hhbm5lbCwgZHJpdmUtPnNlbGVjdC5iLnVuaXQsCisJCWFkZHJDdHJsLCBwY2xrLnRpbWVfMTZyLCBwY2xrLnRpbWVfMTZ3LCBwY2xrLnRpbWVfOCk7CisjZW5kaWYgLyogQ1k4MkM2OTNfREVCVUdfSU5GTyAqLworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGluaXQgYW5kIGlzIHVzZWQgdG8gc2V0dXAgdGhlIGN5ODJjNjkzIGNoaXAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X2N5ODJjNjkzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICE9IDEpCisJCXJldHVybiAwOworCisjaWZkZWYgQ1k4MkM2OTNfU0VURE1BX0NMT0NLCisJdTggZGF0YSA9IDA7CisjZW5kaWYgLyogQ1k4MkM2OTNfU0VURE1BX0NMT0NLICovIAorCisJLyogd3JpdGUgaW5mbyBhYm91dCB0aGlzIHZlcmlvbiBvZiB0aGUgZHJpdmVyICovCisJcHJpbnRrKEtFUk5fSU5GTyBDWTgyX1ZFUlNJT04gIlxuIik7CisKKyNpZmRlZiBDWTgyQzY5M19TRVRETUFfQ0xPQ0sKKyAgICAgICAvKiBva2F5IGxldCdzIHNldCB0aGUgRE1BIGNsb2NrIHNwZWVkICovCisgICAgICAgIAorICAgICAgICBvdXRiKENZODJfSU5ERVhfQ1RSTFJFRzEsIENZODJfSU5ERVhfUE9SVCk7CisgICAgICAgIGRhdGEgPSBpbmIoQ1k4Ml9EQVRBX1BPUlQpOworCisjaWYgQ1k4MkM2OTNfREVCVUdfSU5GTworCXByaW50ayhLRVJOX0lORk8gIiVzOiBQZXJpcGhlcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXI6IDB4JVhcbiIsCisJCW5hbWUsIGRhdGEpOworI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KKworICAgICAgICAvKgorCSAqIGZvciBzb21lIHJlYXNvbiBzb21ldGltZXMgdGhlIERNQSBjb250cm9sbGVyCisJICogc3BlZWQgaXMgc2V0IHRvIEFUQ0xLLzIgPz8/PyAtIHdlIGZpeCB0aGlzIGhlcmUKKwkgKiAKKwkgKiBub3RlOiBpIGRvbid0IGtub3cgd2hhdCBjYXVzZXMgdGhpcyBzdHJhbmdlIGJlaGF2aW91ciwKKwkgKiAgICAgICBidXQgZXZlbiBjaGFuZ2luZyB0aGUgZG1hIHNwZWVkIGRvZXNuJ3Qgc29sdmUgaXQgOi0oCisJICogICAgICAgdGhlIGlkZSBwZXJmb3JtYW5jZSBpcyBzdGlsbCBvbmx5IGhhbGYgdGhlIG5vcm1hbCBzcGVlZCAKKwkgKiAKKwkgKiAgICAgICBpZiBhbnlib2R5IGtub3dzIHdoYXQgZ29lcyB3cm9uZyB3aXRoIG15IG1hY2hpbmUsIHBsZWFzZQorCSAqICAgICAgIGxldCBtZSBrbm93IC0gQVNLCisgICAgICAgICAqLworCisJZGF0YSB8PSAweDAzOworCisgICAgICAgIG91dGIoQ1k4Ml9JTkRFWF9DVFJMUkVHMSwgQ1k4Ml9JTkRFWF9QT1JUKTsKKyAgICAgICAgb3V0YihkYXRhLCBDWTgyX0RBVEFfUE9SVCk7CisKKyNpZiBDWTgyQzY5M19ERUJVR19JTkZPCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBOZXcgUGVyaXBoZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyOiAweCVYXG4iLAorCQluYW1lLCBkYXRhKTsKKyNlbmRpZiAvKiBDWTgyQzY5M19ERUJVR19JTkZPICovCisKKyNlbmRpZiAvKiBDWTgyQzY5M19TRVRETUFfQ0xPQ0sgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoZSBpbml0IGZ1bmN0aW9uIC0gY2FsbGVkIGZvciBlYWNoIGlkZSBjaGFubmVsIG9uY2UKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9jeTgyYzY5MyhpZGVfaHdpZl90ICpod2lmKQoreworCWh3aWYtPmF1dG9kbWEgPSAwOworCisJaHdpZi0+Y2hpcHNldCA9IGlkZV9jeTgyYzY5MzsKKwlod2lmLT50dW5lcHJvYyA9ICZjeTgyYzY5M190dW5lX2RyaXZlOworCisJaWYgKCFod2lmLT5kbWFfYmFzZSkgeworCQlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCQlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSAxOworCQlyZXR1cm47CisJfQorCisJaHdpZi0+YXRhcGlfZG1hID0gMTsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNDsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNDsKKworCWh3aWYtPmlkZV9kbWFfb24gPSAmY3k4MmM2OTNfaWRlX2RtYV9vbjsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworc3RhdGljIF9faW5pdGRhdGEgaWRlX2h3aWZfdCAqcHJpbWFyeTsKKwordm9pZCBfX2luaXQgaW5pdF9pb3BzX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWYgKFBDSV9GVU5DKGh3aWYtPnBjaV9kZXYtPmRldmZuKSA9PSAxKQorCQlwcmltYXJ5ID0gaHdpZjsKKwllbHNlIHsKKwkJaHdpZi0+bWF0ZSA9IHByaW1hcnk7CisJCWh3aWYtPmNoYW5uZWwgPSAxOworCX0KK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgY3k4MmM2OTNfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0geworCXsJLyogMCAqLworCQkubmFtZQkJPSAiQ1k4MkM2OTMiLAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2N5ODJjNjkzLAorCQkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2N5ODJjNjkzLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2N5ODJjNjkzLAorCQkuY2hhbm5lbHMJPSAxLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN5ODJjNjkzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZGVfcGNpX2RldmljZV90ICpkID0gJmN5ODJjNjkzX2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CisJc3RydWN0IHBjaV9kZXYgKmRldjI7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwkvKiBDWTgyQzY5MyBpcyBtb3JlIHRoYW4gb25seSBhIElERSBjb250cm9sbGVyLgorCSAgIEZ1bmN0aW9uIDEgaXMgcHJpbWFyeSBJREUgY2hhbm5lbCwgZnVuY3Rpb24gMiAtIHNlY29uZGFyeS4gKi8KKyAgICAgICAgaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJgorCSAgICBQQ0lfRlVOQyhkZXYtPmRldmZuKSA9PSAxKSB7CisJCWRldjIgPSBwY2lfZmluZF9zbG90KGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4gKyAxKTsKKwkJcmV0ID0gaWRlX3NldHVwX3BjaV9kZXZpY2VzKGRldiwgZGV2MiwgZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeTgyYzY5M19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NPTlRBUSwgUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGN5ODJjNjkzX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJDeXByZXNzX0lERSIsCisJLmlkX3RhYmxlCT0gY3k4MmM2OTNfcGNpX3RibCwKKwkucHJvYmUJCT0gY3k4MmM2OTNfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGN5ODJjNjkzX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjeTgyYzY5M19pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgS3JlYnMsIEFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIHRoZSBDeXByZXNzIENZODJDNjkzIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYyBiL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2NWNjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwlWZXJzaW9uIDAuMTEJRGVjZW1iZXIgMzAsIDIwMDIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqICBQb3J0aW9ucyAoQykgQ29weXJpZ2h0IDIwMDIgIFJlZCBIYXQgSW5jIDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisgKi8KKworI3VuZGVmIFJFQUxMWV9TTE9XX0lPCQkvKiBtb3N0IHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19CTEtfREVWX0lERVBDSSAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9nZW5lcmljIChpZGVfaHdpZl90ICpod2lmKQoreworCXN3aXRjaChod2lmLT5wY2lfZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1VNQ19VTTg2NzNGOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QkY6CisJCQlod2lmLT5pcnEgPSBod2lmLT5jaGFubmVsID8gMTUgOiAxNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJaWYgKCEoaHdpZi0+ZG1hX2Jhc2UpKQorCQlyZXR1cm47CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCWh3aWYtPnVsdHJhX21hc2sgPSAweDdmOworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA3OworCisJaWYgKCFub2F1dG9kbWEpCisJCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKKyNpZiAwCisJLyogTG9naWMgdG8gYWRkIGJhY2sgbGF0ZXIgb24gKi8KKworCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpIHsKKwkJaWRlX3BjaV9kZXZpY2VfdCAqdW5rbm93biA9IHVua25vd25fY2hpcHNldDsKKwkJaW5pdF9zZXR1cF91bmtub3duKGRldiwgdW5rbm93bik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKyNlbmRpZgkKKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgZ2VuZXJpY19jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJewkvKiAwICovCisJCS5uYW1lCQk9ICJOUzg3NDEwIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5lbmFibGViaXRzCT0ge3sweDQzLDB4MDgsMHgwOH0sIHsweDQ3LDB4MDgsMHgwOH19LAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKKyAgICAgICAgfSx7CS8qIDEgKi8KKwkJLm5hbWUJCT0gIlNBTVVSQUkiLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDIgKi8KKwkJLm5hbWUJCT0gIkhUNjU2NSIsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKKwl9LHsJLyogMyAqLworCQkubmFtZQkJPSAiVU04NjczRiIsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBOT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDQgKi8KKwkJLm5hbWUJCT0gIlVNODg4NkEiLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gTk9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiA1ICovCisJCS5uYW1lCQk9ICJVTTg4ODZCRiIsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBOT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDYgKi8KKwkJLm5hbWUJCT0gIkhJTlRfSURFIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiA3ICovCisJCS5uYW1lCQk9ICJWSUFfSURFIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDggKi8KKwkJLm5hbWUJCT0gIk9QVEk2MjFWIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDkgKi8KKwkJLm5hbWUJCT0gIlZJQTgyMzdTQVRBIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogMTAgKi8KKwkJLm5hbWUgCQk9ICJQaWNjb2xvMDEwMiIsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAxMSAqLworCQkubmFtZSAJCT0gIlBpY2NvbG8wMTAzIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDEyICovCisJCS5uYW1lIAkJPSAiUGljY29sbzAxMDUiLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gTk9BVVRPRE1BLAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKKwl9Cit9OworCisvKioKKyAqCWdlbmVyaWNfaW5pdF9vbmUJLQljYWxsZWQgd2hlbiBhIFBJSVggaXMgZm91bmQKKyAqCUBkZXY6IHRoZSBnZW5lcmljIGRldmljZQorICoJQGlkOiB0aGUgbWF0Y2hpbmcgcGNpIGlkCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIFBDSSByZWdpc3RyYXRpb24gbGF5ZXIgKG9yIHRoZSBJREUgaW5pdGlhbGl6YXRpb24pCisgKglmaW5kcyBhIGRldmljZSBtYXRjaGluZyBvdXIgSURFIGRldmljZSB0YWJsZXMuCisgKi8KKyAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdlbmVyaWNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlkZV9wY2lfZGV2aWNlX3QgKmQgPSAmZ2VuZXJpY19jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdOworCXUxNiBjb21tYW5kOworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfVU1DICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkEgJiYKKwkgICAgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkpCisJCWdvdG8gb3V0OyAvKiBVTTg4ODZBL0JGIHBhaXIgKi8KKworCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX09QVEkgJiYKKwkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9PUFRJXzgyQzU1OCAmJgorCSAgICAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSkKKwkJZ290byBvdXQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJaWYgKCEoY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJTa2lwcGluZyBkaXNhYmxlZCAlcyBJREUgY29udHJvbGxlci5cbiIsIGQtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ2VuZXJpY19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX05TLCAgICAgUENJX0RFVklDRV9JRF9OU184NzQxMCwgICAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9TQU1VUkFJX0lERSwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAorCXsgUENJX1ZFTkRPUl9JRF9IT0xURUssIFBDSV9ERVZJQ0VfSURfSE9MVEVLXzY1NjUsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCisJeyBQQ0lfVkVORE9SX0lEX1VNQywgICAgUENJX0RFVklDRV9JRF9VTUNfVU04NjczRiwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzfSwKKwl7IFBDSV9WRU5ET1JfSURfVU1DLCAgICBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4ODZBLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXsgUENJX1ZFTkRPUl9JRF9VTUMsICAgIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkJGLCAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJeyBQQ0lfVkVORE9SX0lEX0hJTlQsICAgUENJX0RFVklDRV9JRF9ISU5UX1ZYUFJPSUlfSURFLCAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2fSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NjEsICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDd9LAorCXsgUENJX1ZFTkRPUl9JRF9PUFRJLCAgIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM1NTgsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOH0sCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1NBVEEKKwl7IFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM3X1NBVEEsCSAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDl9LAorI2VuZGlmCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE8sICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMH0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMSwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMX0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMiwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMn0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBnZW5lcmljX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJQQ0lfSURFIiwKKwkuaWRfdGFibGUJPSBnZW5lcmljX3BjaV90YmwsCisJLnByb2JlCQk9IGdlbmVyaWNfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGdlbmVyaWNfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdlbmVyaWNfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRyZSBIZWRyaWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBnZW5lcmljIFBDSSBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNHguYyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRlNDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM0eC5jCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogbGludXgvZHJpdmVycy9pZGUvcGNpL2hwdDM0eC5jCQlWZXJzaW9uIDAuNDAJU2VwdCAxMCwgMjAwMgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKgorICogMDA6MTIuMCBVbmtub3duIG1hc3Mgc3RvcmFnZSBjb250cm9sbGVyOgorICogVHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIFVua25vd24gZGV2aWNlIDAwMDMgKHJldiAwMSkKKyAqCisgKiBoZGU6IFVETUEgMiAoMHgwMDAwIDB4MDAwMikgKDB4MDAwMCAweDAwMTApCisgKiBoZGY6IFVETUEgMiAoMHgwMDAyIDB4MDAxMikgKDB4MDAxMCAweDAwMzApCisgKiBoZGU6IERNQSAyICAoMHgwMDAwIDB4MDAwMikgKDB4MDAwMCAweDAwMTApCisgKiBoZGY6IERNQSAyICAoMHgwMDAyIDB4MDAxMikgKDB4MDAxMCAweDAwMzApCisgKiBoZGc6IERNQSAxICAoMHgwMDEyIDB4MDA1MikgKDB4MDAzMCAweDAwNzApCisgKiBoZGg6IERNQSAxICAoMHgwMDUyIDB4MDI1MikgKDB4MDA3MCAweDAwZjApCisgKgorICogaWRlLXBjaS5jIHJlZmVyZW5jZQorICoKKyAqIFNpbmNlIHRoZXJlIGFyZSB0d28gY2FyZHMgdGhhdCByZXBvcnQgYWxtb3N0IGlkZW50aWNhbGx5LAorICogdGhlIG9ubHkgZGlzY2VybmFibGUgZGlmZmVyZW5jZSBpcyB0aGUgdmFsdWVzIHJlcG9ydGVkIGluIHBjaWNtZC4KKyAqIEJvb3RpbmctQklPUyBjYXJkIG9yIEhQVDM2MyA6OiBwY2ljbWQgPT0gMHgwNworICogTm9uLWJvb3RhYmxlIGNhcmQgb3IgSFBUMzQzIDo6IHBjaWNtZCA9PSAweDA1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgSFBUMzQzX0RFQlVHX0RSSVZFX0lORk8JCTAKKworc3RhdGljIHU4IGhwdDM0eF9yYXRlbWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocHQzNHhfY2xlYXJfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwl1MzIgcmVnMSA9IDAsIHRtcDEgPSAwLCByZWcyID0gMCwgdG1wMiA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQ0LCAmcmVnMSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0OCwgJnJlZzIpOworCXRtcDEgPSAoKDB4MDAgPDwgKDMqZHJpdmUtPmRuKSkgfCAocmVnMSAmIH4oNyA8PCAoMypkcml2ZS0+ZG4pKSkpOworCXRtcDIgPSAocmVnMiAmIH4oMHgxMSA8PCBkcml2ZS0+ZG4pKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgdG1wMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsIHRtcDIpOworfQorCitzdGF0aWMgaW50IGhwdDM0eF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwl1OCBzcGVlZAk9IGlkZV9yYXRlX2ZpbHRlcihocHQzNHhfcmF0ZW1hc2soZHJpdmUpLCB4ZmVyc3BlZWQpOworCXUzMiByZWcxPSAwLCB0bXAxID0gMCwgcmVnMiA9IDAsIHRtcDIgPSAwOworCXU4CQkJaGlfc3BlZWQsIGxvX3NwZWVkOworCisJaGlfc3BlZWQgPSBzcGVlZCA+PiA0OworCWxvX3NwZWVkID0gc3BlZWQgJiAweDBmOworCisJaWYgKGhpX3NwZWVkICYgNykgeworCQloaV9zcGVlZCA9IChoaV9zcGVlZCAmIDQpID8gMHgwMSA6IDB4MTA7CisJfSBlbHNlIHsKKwkJbG9fc3BlZWQgPDw9IDU7CisJCWxvX3NwZWVkID4+PSA1OworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDQsICZyZWcxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQ4LCAmcmVnMik7CisJdG1wMSA9ICgobG9fc3BlZWQgPDwgKDMqZHJpdmUtPmRuKSkgfCAocmVnMSAmIH4oNyA8PCAoMypkcml2ZS0+ZG4pKSkpOworCXRtcDIgPSAoKGhpX3NwZWVkIDw8IGRyaXZlLT5kbikgfCByZWcyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgdG1wMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsIHRtcDIpOworCisjaWYgSFBUMzQzX0RFQlVHX0RSSVZFX0lORk8KKwlwcmludGsoIiVzOiAlcyBkcml2ZSVkICgweCUwNHggMHglMDR4KSAoMHglMDR4IDB4JTA0eCkiIFwKKwkJIiAoMHglMDJ4IDB4JTAyeClcbiIsCisJCWRyaXZlLT5uYW1lLCBpZGVfeGZlcl92ZXJib3NlKHNwZWVkKSwKKwkJZHJpdmUtPmRuLCByZWcxLCB0bXAxLCByZWcyLCB0bXAyLAorCQloaV9zcGVlZCwgbG9fc3BlZWQpOworI2VuZGlmIC8qIEhQVDM0M19ERUJVR19EUklWRV9JTkZPICovCisKKwlyZXR1cm4oaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKK30KKworc3RhdGljIHZvaWQgaHB0MzR4X3R1bmVfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCXBpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgcGlvLCA1LCBOVUxMKTsKKwlocHQzNHhfY2xlYXJfY2hpcHNldChkcml2ZSk7CisJKHZvaWQpIGhwdDM0eF90dW5lX2NoaXBzZXQoZHJpdmUsIChYRkVSX1BJT18wICsgcGlvKSk7Cit9CisKKy8qCisgKiBUaGlzIGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiBpZGVfcGNpIGNoaXBzZXQgcmVnaXN0ZXJzCisgKiBmb3IgY2FyZHMgdGhhdCBsZWFybiBhYm91dCB0aGUgZHJpdmUncyBVRE1BLCBETUEsIFBJTyBjYXBhYmlsaXRpZXMKKyAqIGFmdGVyIHRoZSBkcml2ZSBpcyByZXBvcnRlZCBieSB0aGUgT1MuICBJbml0aWFsbHkgZm9yIGRlc2lnbmVkIGZvcgorICogSFBUMzQzIFVETUEgY2hpcHNldCBieSBIaWdoUG9pbnR8VHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KKyAqLworCitzdGF0aWMgaW50IGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBzcGVlZCA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIGhwdDM0eF9yYXRlbWFzayhkcml2ZSkpOworCisJaWYgKCEoc3BlZWQpKQorCQlyZXR1cm4gMDsKKworCWhwdDM0eF9jbGVhcl9jaGlwc2V0KGRyaXZlKTsKKwkodm9pZCkgaHB0MzR4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaHB0MzR4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJZHJpdmUtPmluaXRfc3BlZWQgPSAwOworCisJaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorI2lmbmRlZiBDT05GSUdfSFBUMzRYX0FVVE9ETUEKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisjZWxzZQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKyNlbmRpZgorCQl9CisKKwkJZ290byBmYXN0X2F0YV9waW87CisKKwl9IGVsc2UgaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDgpIHx8IChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgeworZmFzdF9hdGFfcGlvOgorCQlocHQzNHhfdHVuZV9kcml2ZShkcml2ZSwgMjU1KTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZiB0aGUgQklPUyBkb2VzIG5vdCBzZXQgdGhlIElPIGJhc2UgYWRkYXJlc3MgdG8gWFgwMCwgMzQzIHdpbGwgZmFpbC4KKyAqLworI2RlZmluZQlIUFQzNFhfUENJX0lOSVRfUkVHCQkweDgwCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9ocHQzNHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyBocHQzNHhJb0Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKKwl1bnNpZ25lZCBsb25nIGhwdF9hZGRyWzRdID0geyAweDIwLCAweDM0LCAweDI4LCAweDNjIH07CisJdW5zaWduZWQgbG9uZyBocHRfYWRkcl9sZW5bNF0gPSB7IDcsIDMsIDcsIDMgfTsKKwl1MTYgY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBIUFQzNFhfUENJX0lOSVRfUkVHLCAweDAwKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKworCWlmIChjbWQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpIHsKKwkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIFBDSV9ST01fUkVTT1VSQ0UpKSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUk9NX0FERFJFU1MsCisJCQkJZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFBUMzQ1OiBST00gZW5hYmxlZCBhdCAweCUwOGx4XG4iLAorCQkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpOworCQl9CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweEYwKTsKKwl9IGVsc2UgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHgyMCk7CisJfQorCisJLyoKKwkgKiBTaW5jZSAyMC0yMyBjYW4gYmUgYXNzaWduZWQgYW5kIGFyZSBSL1csIHdlIGNvcnJlY3QgdGhlbS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kICYgflBDSV9DT01NQU5EX0lPKTsKKwlmb3IoaT0wOyBpPDQ7IGkrKykgeworCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gKGhwdDM0eElvQmFzZSArIGhwdF9hZGRyW2ldKTsKKwkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgaHB0X2FkZHJfbGVuW2ldOworCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsCisJCQkJKFBDSV9CQVNFX0FERFJFU1NfMCArIChpICogNCkpLAorCQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQpOworCX0KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBkZXYtPmlycTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9ocHQzNHgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1MTYgcGNpY21kID0gMDsKKworCWh3aWYtPmF1dG9kbWEgPSAwOworCisJaHdpZi0+dHVuZXByb2MgPSAmaHB0MzR4X3R1bmVfZHJpdmU7CisJaHdpZi0+c3BlZWRwcm9jID0gJmhwdDM0eF90dW5lX2NoaXBzZXQ7CisJaHdpZi0+bm9fZHNjID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgJnBjaWNtZCk7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKQorCQlyZXR1cm47CisKKwlod2lmLT51bHRyYV9tYXNrID0gMHgwNzsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmaHB0MzR4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGU7CisJaWYgKCFub2F1dG9kbWEpCisJCWh3aWYtPmF1dG9kbWEgPSAocGNpY21kICYgUENJX0NPTU1BTkRfTUVNT1JZKSA/IDEgOiAwOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IGhwdDM0eF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUJCT0gIkhQVDM0WCIsCisJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNHgsCisJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNHgsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKKwkuYm9vdGFibGUJPSBORVZFUl9CT0FSRCwKKwkuZXh0cmEJCT0gMTYKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwdDM0eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWRlX3BjaV9kZXZpY2VfdCAqZCA9ICZocHQzNHhfY2hpcHNldDsKKwlzdGF0aWMgY2hhciAqY2hpcHNldF9uYW1lc1tdID0geyJIUFQzNDMiLCAiSFBUMzQ1In07CisJdTE2IHBjaWNtZCA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmcGNpY21kKTsKKworCWQtPm5hbWUgPSBjaGlwc2V0X25hbWVzWyhwY2ljbWQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpID8gMSA6IDBdOworCWQtPmJvb3RhYmxlID0gKHBjaWNtZCAmIFBDSV9DT01NQU5EX01FTU9SWSkgPyBPRkZfQk9BUkQgOiBORVZFUl9CT0FSRDsKKworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHB0MzR4X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfVFRJLCBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaHB0MzR4X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJIUFQzNHhfSURFIiwKKwkuaWRfdGFibGUJPSBocHQzNHhfcGNpX3RibCwKKwkucHJvYmUJCT0gaHB0MzR4X2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBocHQzNHhfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGhwdDM0eF9pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIEhpZ2hwb2ludCAzNHggSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMgYi9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYwpAQCAtMCwwICsxLDE3NDUgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMJCVZlcnNpb24gMC4zNglBcHJpbCAyNSwgMjAwMworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxCSAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzCQlSZWQgSGF0IEluYworICoKKyAqIFRoYW5rcyB0byBIaWdoUG9pbnQgVGVjaG5vbG9naWVzIGZvciB0aGVpciBhc3Npc3RhbmNlLCBhbmQgaGFyZHdhcmUuCisgKiBTcGVjaWFsIFRoYW5rcyB0byBKb24gQnVyY2htb3JlIGluIFNhbkRpZWdvIGZvciB0aGUgZGVlcCBwb2NrZXRzLCBoaXMKKyAqIGRvbmF0aW9uIG9mIGFuIEFCaXQgQlA2IG1haW5ib2FyZCwgcHJvY2Vzc29yLCBhbmQgbWVtb3J5IGFjZWxsZXJhdGVkCisgKiBkZXZlbG9wbWVudCBhbmQgc3VwcG9ydC4KKyAqCisgKiBOb3RlIHRoYXQgZmluYWwgSFBUMzcwIHN1cHBvcnQgd2FzIGRvbmUgYnkgZm9yY2UgZXh0cmFjdGlvbiBvZiBHUEwuCisgKgorICogLSBhZGQgZnVuY3Rpb24gZm9yIGdldHRpbmcvc2V0dGluZyBwb3dlciBzdGF0dXMgb2YgZHJpdmUKKyAqIC0gdGhlIEhQVDM3MCdzIHN0YXRlIG1hY2hpbmUgY2FuIGdldCBjb25mdXNlZC4gcmVzZXQgaXQgYmVmb3JlIGVhY2ggZG1hIAorICogICB4ZmVyIHRvIHByZXZlbnQgdGhhdCBmcm9tIGhhcHBlbmluZy4KKyAqIC0gcmVzZXQgc3RhdGUgZW5naW5lIHdoZW5ldmVyIHdlIGdldCBhbiBlcnJvci4KKyAqIC0gY2hlY2sgZm9yIGJ1c21hc3RlciBzdGF0ZSBhdCBlbmQgb2YgZG1hLiAKKyAqIC0gdXNlIG5ldyBoaWdocG9pbnQgdGltaW5ncy4KKyAqIC0gZGV0ZWN0IGJ1cyBzcGVlZCB1c2luZyBoaWdocG9pbnQgcmVnaXN0ZXIuCisgKiAtIHVzZSBwbGwgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNsb2NrIHRhYmxlLiBhZGRlZCBhIDY2TUh6IHRhYmxlIHRoYXQncworICogICBqdXN0IDJ4IHRoZSAzM01IeiB0YWJsZS4KKyAqIC0gcmVtb3ZlZCB0dXJuYXJvdW5kLiBOT1RFOiB3ZSBuZXZlciB3YW50IHRvIHN3aXRjaCBiZXR3ZWVuIHBsbCBhbmQKKyAqICAgcGNpIGNsb2NrcyBhcyB0aGUgY2hpcCBjYW4gZ2xpdGNoIGluIHRob3NlIGNhc2VzLiB0aGUgaGlnaHBvaW50CisgKiAgIGFwcHJvdmVkIHdvcmthcm91bmQgc2xvd3MgZXZlcnl0aGluZyBkb3duIHRvbyBtdWNoIHRvIGJlIHVzZWZ1bC4gaW4KKyAqICAgYWRkaXRpb24sIHdlIHdvdWxkIGhhdmUgdG8gc2VyaWFsaXplIGFjY2VzcyB0byBlYWNoIGNoaXAuCisgKiAJQWRyaWFuIFN1biA8YS5zdW5Ac3VuLmNvbT4KKyAqCisgKiBhZGQgZHJpdmUgdGltaW5ncyBmb3IgNjZNSHogUENJIGJ1cywKKyAqIGZpeCBBVEEgQ2FibGUgc2lnbmFsIGRldGVjdGlvbiwgZml4IGluY29ycmVjdCAvcHJvYyBpbmZvCisgKiBhZGQgL3Byb2MgZGlzcGxheSBmb3IgcGVyLWRyaXZlIFBJTy9ETUEvVURNQSBtb2RlIGFuZAorICogcGVyLWNoYW5uZWwgQVRBLTMzLzY2IENhYmxlIGRldGVjdC4KKyAqIAlEdW5jYW4gTGF1cmllIDx2b2lkQHN1bi5jb20+CisgKgorICogZml4dXAgL3Byb2Mgb3V0cHV0IGZvciBtdWx0aXBsZSBjb250cm9sbGVycworICoJVGltIEhvY2tpbiA8dGhvY2tpbkBzdW4uY29tPgorICoKKyAqIE9uIGhwdDM2NjogCisgKiBSZXNldCB0aGUgaHB0MzY2IG9uIGVycm9yLCByZXNldCBvbiBkbWEKKyAqIEZpeCBkaXNhYmxpbmcgRmFzdCBJbnRlcnJ1cHQgaHB0MzY2LgorICogCU1pa2UgV2F5Y2hpc29uIDxjcmxmQHN1bi5jb20+CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3IgMzcyTiBjbG9ja2luZyBhbmQgY2xvY2sgc3dpdGNoaW5nLiBUaGUgMzcyTiBuZWVkcworICogZGlmZmVyZW50IGNsb2NrcyBvbiByZWFkL3dyaXRlLiBUaGlzIHJlcXVpcmVzIG92ZXJsb2FkaW5nIHJ3X2Rpc2sgYW5kCisgKiBvdGhlciBkZWVwbHkgY3JhenkgdGhpbmdzLiBUaGFua3MgdG8gPGh0dHA6Ly93d3cuaG9lcnN0cmVpY2guZGU+IGZvcgorICoga2VlcGluZyBtZSBzYW5lLiAKKyAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogdmFyaW91cyB0dW5pbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBIUFRfUkVTRVRfU1RBVEVfRU5HSU5FCisjdW5kZWYgSFBUX0RFTEFZX0lOVEVSUlVQVAorI3VuZGVmIEhQVF9TRVJJQUxJWkVfSU8KKworc3RhdGljIGNvbnN0IGNoYXIgKnF1aXJrX2RyaXZlc1tdID0geworCSJRVUFOVFVNIEZJUkVCQUxMbGN0MDggMDgiLAorCSJRVUFOVFVNIEZJUkVCQUxMUCBLQTYuNCIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNCIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNSIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGExMDBfNVtdID0geworCSJJQk0tRFRMQS0zMDcwNzUiLAorCSJJQk0tRFRMQS0zMDcwNjAiLAorCSJJQk0tRFRMQS0zMDcwNDUiLAorCSJJQk0tRFRMQS0zMDcwMzAiLAorCSJJQk0tRFRMQS0zMDcwMjAiLAorCSJJQk0tRFRMQS0zMDcwMTUiLAorCSJJQk0tRFRMQS0zMDUwNDAiLAorCSJJQk0tRFRMQS0zMDUwMzAiLAorCSJJQk0tRFRMQS0zMDUwMjAiLAorCSJJQzM1TDAxMEFWRVIwNy0wIiwKKwkiSUMzNUwwMjBBVkVSMDctMCIsCisJIklDMzVMMDMwQVZFUjA3LTAiLAorCSJJQzM1TDA0MEFWRVIwNy0wIiwKKwkiSUMzNUwwNjBBVkVSMDctMCIsCisJIldEQyBBQzMxMDIwMFIiLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhNjZfNFtdID0geworCSJJQk0tRFRMQS0zMDcwNzUiLAorCSJJQk0tRFRMQS0zMDcwNjAiLAorCSJJQk0tRFRMQS0zMDcwNDUiLAorCSJJQk0tRFRMQS0zMDcwMzAiLAorCSJJQk0tRFRMQS0zMDcwMjAiLAorCSJJQk0tRFRMQS0zMDcwMTUiLAorCSJJQk0tRFRMQS0zMDUwNDAiLAorCSJJQk0tRFRMQS0zMDUwMzAiLAorCSJJQk0tRFRMQS0zMDUwMjAiLAorCSJJQzM1TDAxMEFWRVIwNy0wIiwKKwkiSUMzNUwwMjBBVkVSMDctMCIsCisJIklDMzVMMDMwQVZFUjA3LTAiLAorCSJJQzM1TDA0MEFWRVIwNy0wIiwKKwkiSUMzNUwwNjBBVkVSMDctMCIsCisJIldEQyBBQzMxMDIwMFIiLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhNjZfM1tdID0geworCSJXREMgQUMzMTAyMDBSIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTMzW10gPSB7CisJIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwgIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKKwkiTWF4dG9yIDkxMzYwRDgiLCAiTWF4dG9yIDkxMTkwRDciLCAiTWF4dG9yIDkxMDIwRDYiLCAiTWF4dG9yIDkwODQ1RDUiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNTEwRDMiLCAiTWF4dG9yIDkwMzQwRDIiLAorCSJNYXh0b3IgOTExNTJEOCIsICJNYXh0b3IgOTEwMDhENyIsICJNYXh0b3IgOTA4NDVENiIsICJNYXh0b3IgOTA4NDBENiIsICJNYXh0b3IgOTA3MjBENSIsICJNYXh0b3IgOTA2NDhENSIsICJNYXh0b3IgOTA1NzZENCIsCisJIk1heHRvciA5MDUxMEQ0IiwKKwkiTWF4dG9yIDkwNDMyRDMiLCAiTWF4dG9yIDkwMjg4RDIiLCAiTWF4dG9yIDkwMjU2RDIiLAorCSJNYXh0b3IgOTEwMDBEOCIsICJNYXh0b3IgOTA5MTBEOCIsICJNYXh0b3IgOTA4NzVENyIsICJNYXh0b3IgOTA4NDBENyIsICJNYXh0b3IgOTA3NTBENiIsICJNYXh0b3IgOTA2MjVENSIsICJNYXh0b3IgOTA1MDBENCIsCisJIk1heHRvciA5MTcyOEQ4IiwgIk1heHRvciA5MTUxMkQ3IiwgIk1heHRvciA5MTMwM0Q2IiwgIk1heHRvciA5MTA4MEQ1IiwgIk1heHRvciA5MDg0NUQ0IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDY0OEQzIiwgIk1heHRvciA5MDQzMkQyIiwKKwlOVUxMCit9OworCitzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB7CisJdTgJCXhmZXJfc3BlZWQ7CisJdW5zaWduZWQgaW50CWNoaXBzZXRfc2V0dGluZ3M7Cit9OworCisvKiBrZXkgZm9yIGJ1cyBjbG9jayB0aW1pbmdzCisgKiBiaXQKKyAqIDA6MyAgICBkYXRhX2hpZ2hfdGltZS4gaW5hY3RpdmUgdGltZSBvZiBESU9XXy9ESU9SXyBmb3IgUElPIGFuZCBNVworICogICAgICAgIERNQS4gY3ljbGVzID0gdmFsdWUgKyAxCisgKiA0OjggICAgZGF0YV9sb3dfdGltZS4gYWN0aXZlIHRpbWUgb2YgRElPV18vRElPUl8gZm9yIFBJTyBhbmQgTVcKKyAqICAgICAgICBETUEuIGN5Y2xlcyA9IHZhbHVlICsgMQorICogOToxMiAgIGNtZF9oaWdoX3RpbWUuIGluYWN0aXZlIHRpbWUgb2YgRElPV18vRElPUl8gZHVyaW5nIHRhc2sgZmlsZQorICogICAgICAgIHJlZ2lzdGVyIGFjY2Vzcy4KKyAqIDEzOjE3ICBjbWRfbG93X3RpbWUuIGFjdGl2ZSB0aW1lIG9mIERJT1dfL0RJT1JfIGR1cmluZyB0YXNrIGZpbGUKKyAqICAgICAgICByZWdpc3RlciBhY2Nlc3MuCisgKiAxODoyMSAgdWRtYV9jeWNsZV90aW1lLiBjbG9jayBmcmVxIGFuZCBjbG9jayBjeWNsZXMgZm9yIFVETUEgeGZlci4KKyAqICAgICAgICBkdXJpbmcgdGFzayBmaWxlIHJlZ2lzdGVyIGFjY2Vzcy4KKyAqIDIyOjI0ICBwcmVfaGlnaF90aW1lLiB0aW1lIHRvIGluaXRpYWxpemUgMXN0IGN5Y2xlIGZvciBQSU8gYW5kIE1XIERNQQorICogICAgICAgIHhmZXIuCisgKiAyNToyNyAgY21kX3ByZV9oaWdoX3RpbWUuIHRpbWUgdG8gaW5pdGlhbGl6ZSAxc3QgUElPIGN5Y2xlIGZvciB0YXNrCisgKiAgICAgICAgcmVnaXN0ZXIgYWNjZXNzLgorICogMjggICAgIFVETUEgZW5hYmxlCisgKiAyOSAgICAgRE1BIGVuYWJsZQorICogMzAgICAgIFBJT19NU1QgZW5hYmxlLiBpZiBzZXQsIHRoZSBjaGlwIGlzIGluIGJ1cyBtYXN0ZXIgbW9kZSBkdXJpbmcKKyAqICAgICAgICBQSU8uCisgKiAzMSAgICAgRklGTyBlbmFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBmb3J0eV9iYXNlX2hwdDM2NltdID0geworCXsJWEZFUl9VRE1BXzQsCTB4OTAwZmQ5NDMJfSwKKwl7CVhGRVJfVURNQV8zLAkweDkwMGFkOTQzCX0sCisJewlYRkVSX1VETUFfMiwJMHg5MDBiZDk0Mwl9LAorCXsJWEZFUl9VRE1BXzEsCTB4OTAwOGQ5NDMJfSwKKwl7CVhGRVJfVURNQV8wLAkweDkwMDhkOTQzCX0sCisKKwl7CVhGRVJfTVdfRE1BXzIsCTB4YTAwOGQ5NDMJfSwKKwl7CVhGRVJfTVdfRE1BXzEsCTB4YTAxMGQ5NTUJfSwKKwl7CVhGRVJfTVdfRE1BXzAsCTB4YTAxMGQ5ZmMJfSwKKworCXsJWEZFUl9QSU9fNCwJMHhjMDA4ZDk2Mwl9LAorCXsJWEZFUl9QSU9fMywJMHhjMDEwZDk3NAl9LAorCXsJWEZFUl9QSU9fMiwJMHhjMDEwZDk5Nwl9LAorCXsJWEZFUl9QSU9fMSwJMHhjMDEwZDljNwl9LAorCXsJWEZFUl9QSU9fMCwJMHhjMDE4ZDlkOQl9LAorCXsJMCwJCTB4MDEyMGQ5ZDkJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM2NltdID0geworCXsJWEZFUl9VRE1BXzQsCTB4OTBjOWE3MzEJfSwKKwl7CVhGRVJfVURNQV8zLAkweDkwY2ZhNzMxCX0sCisJewlYRkVSX1VETUFfMiwJMHg5MGNhYTczMQl9LAorCXsJWEZFUl9VRE1BXzEsCTB4OTBjYmE3MzEJfSwKKwl7CVhGRVJfVURNQV8wLAkweDkwYzhhNzMxCX0sCisKKwl7CVhGRVJfTVdfRE1BXzIsCTB4YTBjOGE3MzEJfSwKKwl7CVhGRVJfTVdfRE1BXzEsCTB4YTBjOGE3MzIJfSwJLyogMHhhMGM4YTczMyAqLworCXsJWEZFUl9NV19ETUFfMCwJMHhhMGM4YTc5Nwl9LAorCisJewlYRkVSX1BJT180LAkweGMwYzhhNzMxCX0sCisJewlYRkVSX1BJT18zLAkweGMwYzhhNzQyCX0sCisJewlYRkVSX1BJT18yLAkweGMwZDBhNzUzCX0sCisJewlYRkVSX1BJT18xLAkweGMwZDBhN2EzCX0sCS8qIDB4YzBkMGE3OTMgKi8KKwl7CVhGRVJfUElPXzAsCTB4YzBkMGE3YWEJfSwJLyogMHhjMGQwYTdhNyAqLworCXsJMCwJCTB4MDEyMGE3YTcJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHR3ZW50eV9maXZlX2Jhc2VfaHB0MzY2W10gPSB7CisJewlYRkVSX1VETUFfNCwJMHg5MGM5ODUyMQl9LAorCXsJWEZFUl9VRE1BXzMsCTB4OTBjZjg1MjEJfSwKKwl7CVhGRVJfVURNQV8yLAkweDkwY2Y4NTIxCX0sCisJewlYRkVSX1VETUFfMSwJMHg5MGNiODUyMQl9LAorCXsJWEZFUl9VRE1BXzAsCTB4OTBjYjg1MjEJfSwKKworCXsJWEZFUl9NV19ETUFfMiwJMHhhMGNhODUyMQl9LAorCXsJWEZFUl9NV19ETUFfMSwJMHhhMGNhODUzMgl9LAorCXsJWEZFUl9NV19ETUFfMCwJMHhhMGNhODU3NQl9LAorCisJewlYRkVSX1BJT180LAkweGMwY2E4NTIxCX0sCisJewlYRkVSX1BJT18zLAkweGMwY2E4NTMyCX0sCisJewlYRkVSX1BJT18yLAkweGMwY2E4NTQyCX0sCisJewlYRkVSX1BJT18xLAkweGMwZDA4NTcyCX0sCisJewlYRkVSX1BJT18wLAkweGMwZDA4NTg1CX0sCisJewkwLAkJMHgwMTIwODU4NQl9Cit9OworCisvKiBmcm9tIGhpZ2hwb2ludCBkb2N1bWVudGF0aW9uLiB0aGVzZSBhcmUgb2xkIHZhbHVlcyAqLworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MFtdID0geworLyoJewlYRkVSX1VETUFfNSwJMHgxQTg1RjQ0MiwJMHgxNjQ1NGUzMQl9LCAqLworCXsJWEZFUl9VRE1BXzUsCTB4MTY0NTRlMzEJfSwKKwl7CVhGRVJfVURNQV80LAkweDE2NDU0ZTMxCX0sCisJewlYRkVSX1VETUFfMywJMHgxNjZkNGUzMQl9LAorCXsJWEZFUl9VRE1BXzIsCTB4MTY0OTRlMzEJfSwKKwl7CVhGRVJfVURNQV8xLAkweDE2NGQ0ZTMxCX0sCisJewlYRkVSX1VETUFfMCwJMHgxNjUxNGUzMQl9LAorCisJewlYRkVSX01XX0RNQV8yLAkweDI2NTE0ZTIxCX0sCisJewlYRkVSX01XX0RNQV8xLAkweDI2NTE0ZTMzCX0sCisJewlYRkVSX01XX0RNQV8wLAkweDI2NTE0ZTk3CX0sCisKKwl7CVhGRVJfUElPXzQsCTB4MDY1MTRlMjEJfSwKKwl7CVhGRVJfUElPXzMsCTB4MDY1MTRlMjIJfSwKKwl7CVhGRVJfUElPXzIsCTB4MDY1MTRlMzMJfSwKKwl7CVhGRVJfUElPXzEsCTB4MDY5MTRlNDMJfSwKKwl7CVhGRVJfUElPXzAsCTB4MDY5MTRlNTcJfSwKKwl7CTAsCQkweDA2NTE0ZTU3CX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBzaXh0eV9zaXhfYmFzZV9ocHQzNzBbXSA9IHsKKwl7CVhGRVJfVURNQV81LAkweDE0ODQ2MjMxCX0sCisJewlYRkVSX1VETUFfNCwJMHgxNDg4NjIzMQl9LAorCXsJWEZFUl9VRE1BXzMsCTB4MTQ4YzYyMzEJfSwKKwl7CVhGRVJfVURNQV8yLAkweDE0OGM2MjMxCX0sCisJewlYRkVSX1VETUFfMSwJMHgxNDkwNjIzMQl9LAorCXsJWEZFUl9VRE1BXzAsCTB4MTQ5ODYyMzEJfSwKKworCXsJWEZFUl9NV19ETUFfMiwJMHgyNjUxNGUyMQl9LAorCXsJWEZFUl9NV19ETUFfMSwJMHgyNjUxNGUzMwl9LAorCXsJWEZFUl9NV19ETUFfMCwJMHgyNjUxNGU5Nwl9LAorCisJewlYRkVSX1BJT180LAkweDA2NTE0ZTIxCX0sCisJewlYRkVSX1BJT18zLAkweDA2NTE0ZTIyCX0sCisJewlYRkVSX1BJT18yLAkweDA2NTE0ZTMzCX0sCisJewlYRkVSX1BJT18xLAkweDA2OTE0ZTQzCX0sCisJewlYRkVSX1BJT18wLAkweDA2OTE0ZTU3CX0sCisJewkwLAkJMHgwNjUxNGU1Nwl9Cit9OworCisvKiB0aGVzZSBhcmUgdGhlIGN1cnJlbnQgKDQgc2VwIDIwMDEpIHRpbWluZ3MgZnJvbSBoaWdocG9pbnQgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBhW10gPSB7CisJewlYRkVSX1VETUFfNSwJMHgxMjQ0NjIzMQl9LAorCXsJWEZFUl9VRE1BXzQsCTB4MTI0NDYyMzEJfSwKKwl7CVhGRVJfVURNQV8zLAkweDEyNmM2MjMxCX0sCisJewlYRkVSX1VETUFfMiwJMHgxMjQ4NjIzMQl9LAorCXsJWEZFUl9VRE1BXzEsCTB4MTI0YzYyMzMJfSwKKwl7CVhGRVJfVURNQV8wLAkweDEyNTA2Mjk3CX0sCisKKwl7CVhGRVJfTVdfRE1BXzIsCTB4MjI0MDZjMzEJfSwKKwl7CVhGRVJfTVdfRE1BXzEsCTB4MjI0MDZjMzMJfSwKKwl7CVhGRVJfTVdfRE1BXzAsCTB4MjI0MDZjOTcJfSwKKworCXsJWEZFUl9QSU9fNCwJMHgwNjQxNGUzMQl9LAorCXsJWEZFUl9QSU9fMywJMHgwNjQxNGU0Mgl9LAorCXsJWEZFUl9QSU9fMiwJMHgwNjQxNGU1Mwl9LAorCXsJWEZFUl9QSU9fMSwJMHgwNjgxNGU5Mwl9LAorCXsJWEZFUl9QSU9fMCwJMHgwNjgxNGVhNwl9LAorCXsJMCwJCTB4MDY4MTRlYTcJfQorfTsKKworLyogMnggMzNNSHogdGltaW5ncyAqLworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHNpeHR5X3NpeF9iYXNlX2hwdDM3MGFbXSA9IHsKKwl7CVhGRVJfVURNQV81LAkweDE0ODhlNjczCX0sCisJewlYRkVSX1VETUFfNCwJMHgxNDg4ZTY3Mwl9LAorCXsJWEZFUl9VRE1BXzMsCTB4MTQ5OGU2NzMJfSwKKwl7CVhGRVJfVURNQV8yLAkweDE0OTBlNjczCX0sCisJewlYRkVSX1VETUFfMSwJMHgxNDk4ZTY3Nwl9LAorCXsJWEZFUl9VRE1BXzAsCTB4MTRhMGU3M2YJfSwKKworCXsJWEZFUl9NV19ETUFfMiwJMHgyNDgwZmE3Mwl9LAorCXsJWEZFUl9NV19ETUFfMSwJMHgyNDgwZmE3Nwl9LCAKKwl7CVhGRVJfTVdfRE1BXzAsCTB4MjQ4MGZiM2YJfSwKKworCXsJWEZFUl9QSU9fNCwJMHgwYzgyYmU3Mwl9LAorCXsJWEZFUl9QSU9fMywJMHgwYzgyYmU5NQl9LAorCXsJWEZFUl9QSU9fMiwJMHgwYzgyYmViNwl9LAorCXsJWEZFUl9QSU9fMSwJMHgwZDAyYmYzNwl9LAorCXsJWEZFUl9QSU9fMCwJMHgwZDAyYmY1Zgl9LAorCXsJMCwJCTB4MGQwMmJmNWYJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IGZpZnR5X2Jhc2VfaHB0MzcwYVtdID0geworCXsJWEZFUl9VRE1BXzUsCTB4MTI4NDgyNDIJfSwKKwl7CVhGRVJfVURNQV80LAkweDEyYWM4MjQyCX0sCisJewlYRkVSX1VETUFfMywJMHgxMjhjODI0Mgl9LAorCXsJWEZFUl9VRE1BXzIsCTB4MTIwYzgyNDIJfSwKKwl7CVhGRVJfVURNQV8xLAkweDEyMTQ4MjU0CX0sCisJewlYRkVSX1VETUFfMCwJMHgxMjE4ODJlYQl9LAorCisJewlYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyCX0sCisJewlYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0CX0sCisJewlYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhCX0sCisKKwl7CVhGRVJfUElPXzQsCTB4MGE4MWY0NDIJfSwKKwl7CVhGRVJfUElPXzMsCTB4MGE4MWY0NDMJfSwKKwl7CVhGRVJfUElPXzIsCTB4MGE4MWY0NTQJfSwKKwl7CVhGRVJfUElPXzEsCTB4MGFjMWY0NjUJfSwKKwl7CVhGRVJfUElPXzAsCTB4MGFjMWY0OGEJfSwKKwl7CTAsCQkweDBhYzFmNDhhCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzJbXSA9IHsKKwl7CVhGRVJfVURNQV82LAkweDFjODFkYzYyCX0sCisJewlYRkVSX1VETUFfNSwJMHgxYzZkZGM2Mgl9LAorCXsJWEZFUl9VRE1BXzQsCTB4MWM4ZGRjNjIJfSwKKwl7CVhGRVJfVURNQV8zLAkweDFjOGVkYzYyCX0sCS8qIGNoZWNrbWUgKi8KKwl7CVhGRVJfVURNQV8yLAkweDFjOTFkYzYyCX0sCisJewlYRkVSX1VETUFfMSwJMHgxYzlhZGM2Mgl9LAkvKiBjaGVja21lICovCisJewlYRkVSX1VETUFfMCwJMHgxYzgyZGM2Mgl9LAkvKiBjaGVja21lICovCisKKwl7CVhGRVJfTVdfRE1BXzIsCTB4MmM4MjkyNjIJfSwKKwl7CVhGRVJfTVdfRE1BXzEsCTB4MmM4MjkyNjYJfSwJLyogY2hlY2ttZSAqLworCXsJWEZFUl9NV19ETUFfMCwJMHgyYzgyOTIyZQl9LAkvKiBjaGVja21lICovCisKKwl7CVhGRVJfUElPXzQsCTB4MGM4MjljNjIJfSwKKwl7CVhGRVJfUElPXzMsCTB4MGM4MjljODQJfSwKKwl7CVhGRVJfUElPXzIsCTB4MGM4MjljYTYJfSwKKwl7CVhGRVJfUElPXzEsCTB4MGQwMjlkMjYJfSwKKwl7CVhGRVJfUElPXzAsCTB4MGQwMjlkNWUJfSwKKwl7CTAsCQkweDBkMDI5ZDVlCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBmaWZ0eV9iYXNlX2hwdDM3MltdID0geworCXsJWEZFUl9VRE1BXzUsCTB4MTI4NDgyNDIJfSwKKwl7CVhGRVJfVURNQV80LAkweDEyYWM4MjQyCX0sCisJewlYRkVSX1VETUFfMywJMHgxMjhjODI0Mgl9LAorCXsJWEZFUl9VRE1BXzIsCTB4MTIwYzgyNDIJfSwKKwl7CVhGRVJfVURNQV8xLAkweDEyMTQ4MjU0CX0sCisJewlYRkVSX1VETUFfMCwJMHgxMjE4ODJlYQl9LAorCisJewlYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyCX0sCisJewlYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0CX0sCisJewlYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhCX0sCisKKwl7CVhGRVJfUElPXzQsCTB4MGE4MWY0NDIJfSwKKwl7CVhGRVJfUElPXzMsCTB4MGE4MWY0NDMJfSwKKwl7CVhGRVJfUElPXzIsCTB4MGE4MWY0NTQJfSwKKwl7CVhGRVJfUElPXzEsCTB4MGFjMWY0NjUJfSwKKwl7CVhGRVJfUElPXzAsCTB4MGFjMWY0OGEJfSwKKwl7CTAsCQkweDBhODFmNDQzCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBzaXh0eV9zaXhfYmFzZV9ocHQzNzJbXSA9IHsKKwl7CVhGRVJfVURNQV82LAkweDFjODY5YzYyCX0sCisJewlYRkVSX1VETUFfNSwJMHgxY2FlOWM2Mgl9LAorCXsJWEZFUl9VRE1BXzQsCTB4MWM4YTljNjIJfSwKKwl7CVhGRVJfVURNQV8zLAkweDFjOGU5YzYyCX0sCisJewlYRkVSX1VETUFfMiwJMHgxYzkyOWM2Mgl9LAorCXsJWEZFUl9VRE1BXzEsCTB4MWM5YTljNjIJfSwKKwl7CVhGRVJfVURNQV8wLAkweDFjODI5YzYyCX0sCisKKwl7CVhGRVJfTVdfRE1BXzIsCTB4MmM4MjljNjIJfSwKKwl7CVhGRVJfTVdfRE1BXzEsCTB4MmM4MjljNjYJfSwKKwl7CVhGRVJfTVdfRE1BXzAsCTB4MmM4MjlkMmUJfSwKKworCXsJWEZFUl9QSU9fNCwJMHgwYzgyOWM2Mgl9LAorCXsJWEZFUl9QSU9fMywJMHgwYzgyOWM4NAl9LAorCXsJWEZFUl9QSU9fMiwJMHgwYzgyOWNhNgl9LAorCXsJWEZFUl9QSU9fMSwJMHgwZDAyOWQyNgl9LAorCXsJWEZFUl9QSU9fMCwJMHgwZDAyOWQ1ZQl9LAorCXsJMCwJCTB4MGQwMjlkMjYJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3NFtdID0geworCXsJWEZFUl9VRE1BXzYsCTB4MTI4MDgyNDIJfSwKKwl7CVhGRVJfVURNQV81LAkweDEyODQ4MjQyCX0sCisJewlYRkVSX1VETUFfNCwJMHgxMmFjODI0Mgl9LAorCXsJWEZFUl9VRE1BXzMsCTB4MTI4YzgyNDIJfSwKKwl7CVhGRVJfVURNQV8yLAkweDEyMGM4MjQyCX0sCisJewlYRkVSX1VETUFfMSwJMHgxMjE0ODI1NAl9LAorCXsJWEZFUl9VRE1BXzAsCTB4MTIxODgyZWEJfSwKKworCXsJWEZFUl9NV19ETUFfMiwJMHgyMjgwODI0Mgl9LAorCXsJWEZFUl9NV19ETUFfMSwJMHgyMjgwODI1NAl9LAorCXsJWEZFUl9NV19ETUFfMCwJMHgyMjgwODJlYQl9LAorCisJewlYRkVSX1BJT180LAkweDBhODFmNDQyCX0sCisJewlYRkVSX1BJT18zLAkweDBhODFmNDQzCX0sCisJewlYRkVSX1BJT18yLAkweDBhODFmNDU0CX0sCisJewlYRkVSX1BJT18xLAkweDBhYzFmNDY1CX0sCisJewlYRkVSX1BJT18wLAkweDBhYzFmNDhhCX0sCisJewkwLAkJMHgwNjgxNGU5Mwl9Cit9OworCisvKiBGSVhNRTogNTBNSHogdGltaW5ncyBmb3IgSFBUMzc0ICovCisKKyNpZiAwCitzdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgc2l4dHlfc2l4X2Jhc2VfaHB0Mzc0W10gPSB7CisJewlYRkVSX1VETUFfNiwJMHgxMjQwNjIzMQl9LAkvKiBjaGVja21lICovCisJewlYRkVSX1VETUFfNSwJMHgxMjQ0NjIzMQl9LAkvKiAweDE0ODQ2MjMxICovCisJewlYRkVSX1VETUFfNCwJMHgxNjgxNGVhNwl9LAkvKiAweDE0ODg2MjMxICovCisJewlYRkVSX1VETUFfMywJMHgxNjgxNGVhNwl9LAkvKiAweDE0OGM2MjMxICovCisJewlYRkVSX1VETUFfMiwJMHgxNjgxNGVhNwl9LAkvKiAweDE0OGM2MjMxICovCisJewlYRkVSX1VETUFfMSwJMHgxNjgxNGVhNwl9LAkvKiAweDE0OTA2MjMxICovCisJewlYRkVSX1VETUFfMCwJMHgxNjgxNGVhNwl9LAkvKiAweDE0OTg2MjMxICovCisJewlYRkVSX01XX0RNQV8yLAkweDE2ODE0ZWE3CX0sCS8qIDB4MjY1MTRlMjEgKi8KKwl7CVhGRVJfTVdfRE1BXzEsCTB4MTY4MTRlYTcJfSwJLyogMHgyNjUxNGU5NyAqLworCXsJWEZFUl9NV19ETUFfMCwJMHgxNjgxNGVhNwl9LAkvKiAweDI2NTE0ZTk3ICovCisJewlYRkVSX1BJT180LAkweDA2ODE0ZWE3CX0sCS8qIDB4MDY1MTRlMjEgKi8KKwl7CVhGRVJfUElPXzMsCTB4MDY4MTRlYTcJfSwJLyogMHgwNjUxNGUyMiAqLworCXsJWEZFUl9QSU9fMiwJMHgwNjgxNGVhNwl9LAkvKiAweDA2NTE0ZTMzICovCisJewlYRkVSX1BJT18xLAkweDA2ODE0ZWE3CX0sCS8qIDB4MDY5MTRlNDMgKi8KKwl7CVhGRVJfUElPXzAsCTB4MDY4MTRlYTcJfSwJLyogMHgwNjkxNGU1NyAqLworCXsJMCwJCTB4MDY4MTRlYTcJfQorfTsKKyNlbmRpZgorCisjZGVmaW5lIEhQVDM2Nl9ERUJVR19EUklWRV9JTkZPCQkwCisjZGVmaW5lIEhQVDM3NF9BTExPV19BVEExMzNfNgkJMAorI2RlZmluZSBIUFQzNzFfQUxMT1dfQVRBMTMzXzYJCTAKKyNkZWZpbmUgSFBUMzAyX0FMTE9XX0FUQTEzM182CQkwCisjZGVmaW5lIEhQVDM3Ml9BTExPV19BVEExMzNfNgkJMQorI2RlZmluZSBIUFQzNzBfQUxMT1dfQVRBMTAwXzUJCTEKKyNkZWZpbmUgSFBUMzY2X0FMTE9XX0FUQTY2XzQJCTEKKyNkZWZpbmUgSFBUMzY2X0FMTE9XX0FUQTY2XzMJCTEKKyNkZWZpbmUgSFBUMzY2X01BWF9ERVZTCQkJOAorCisjZGVmaW5lIEZfTE9XX1BDSV8zMwkweDIzCisjZGVmaW5lIEZfTE9XX1BDSV80MAkweDI5CisjZGVmaW5lIEZfTE9XX1BDSV81MAkweDJkCisjZGVmaW5lIEZfTE9XX1BDSV82NgkweDQyCisKKy8qIEZJWE1FOiBjb21wYXJlIHdpdGggZHJpdmVyJ3MgY29kZSBiZWZvcmUgcmVtb3ZpbmcgKi8KKyNpZiAwCisJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKSB7CisJCQl1OCBjYmw7CisJCQljYmwgPSBpbmIoaW9iYXNlICsgMHg3Yik7CisJCQlvdXRiKGNibCB8IDEsIGlvYmFzZSArIDB4N2IpOworCQkJb3V0YihjYmwgJiB+MSwgaW9iYXNlICsgMHg3Yik7CisJCQljYmwgPSBpbmIoaW9iYXNlICsgMHg3YSk7CisJCQlwICs9IHNwcmludGYocCwgIkNhYmxlOiAgICAgICAgICBBVEEtJWQiCisJCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQS0lZFxuIiwKKwkJCQkoY2JsICYgMHgwMikgPyAzMyA6IDY2LAorCQkJCShjYmwgJiAweDAxKSA/IDMzIDogNjYpOworCQkJcCArPSBzcHJpbnRmKHAsICJcbiIpOworCQl9CisJCXsKKwkJCXU4IGMyLCBjMzsKKwkJCS8qIG9sZGVyIHJldnMgZG9uJ3QgaGF2ZSB0aGVzZSByZWdpc3RlcnMgbWFwcGVkIAorCQkJICogaW50byBpbyBzcGFjZSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQzLCAmYzApOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ3LCAmYzEpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmYzIpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRmLCAmYzMpOworCisJCQlwICs9IHNwcmludGYocCwgIk1vZGU6ICAgICAgICAgICAlcyAgICAgICAgICAgICAlcyIKKwkJCQkJIiAgICAgICAgICAgJXMgICAgICAgICAgICAgICVzXG4iLAorCQkJCShjMCAmIDB4MTApID8gIlVETUEiIDogKGMwICYgMHgyMCkgPyAiRE1BICIgOiAKKwkJCQkJKGMwICYgMHg4MCkgPyAiUElPICIgOiAib2ZmICIsCisJCQkJKGMxICYgMHgxMCkgPyAiVURNQSIgOiAoYzEgJiAweDIwKSA/ICJETUEgIiA6CisJCQkJCShjMSAmIDB4ODApID8gIlBJTyAiIDogIm9mZiAiLAorCQkJCShjMiAmIDB4MTApID8gIlVETUEiIDogKGMyICYgMHgyMCkgPyAiRE1BICIgOgorCQkJCQkoYzIgJiAweDgwKSA/ICJQSU8gIiA6ICJvZmYgIiwKKwkJCQkoYzMgJiAweDEwKSA/ICJVRE1BIiA6IChjMyAmIDB4MjApID8gIkRNQSAiIDoKKwkJCQkJKGMzICYgMHg4MCkgPyAiUElPICIgOiAib2ZmICIpOworCQl9CisJfQorI2VuZGlmCisKK3N0YXRpYyB1MzIgaHB0X3JldmlzaW9uIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiBjbGFzc19yZXY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKworCXN3aXRjaChkZXYtPmRldmljZSkgeworCQkvKiBSZW1hcCBuZXcgMzcyTiBvbnRvIDM3MiAqLworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3Mk46CisJCQljbGFzc19yZXYgPSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzI7IGJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3NDoKKwkJCWNsYXNzX3JldiA9IFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3NDsgYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOgorCQkJY2xhc3NfcmV2ID0gUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOyBicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI6CisJCQljbGFzc19yZXYgPSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI7IGJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjoKKwkJCWNsYXNzX3JldiA9IFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGNsYXNzX3JldjsKK30KKworc3RhdGljIHUzMiBocHRfbWluaW11bV9yZXZpc2lvbiAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJldmlzaW9uKQoreworCXVuc2lnbmVkIGludCBjbGFzc19yZXYgPSBocHRfcmV2aXNpb24oZGV2KTsKKwlyZXZpc2lvbi0tOworCXJldHVybiAoKGludCkgKGNsYXNzX3JldiA+IHJldmlzaW9uKSA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCBjaGVja19pbl9kcml2ZV9saXN0cyhpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKipsaXN0KTsKKworc3RhdGljIHU4IGhwdDN4eF9yYXRlbWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwl1OCBtb2RlCQkJPSAwOworCisJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgOCkpIHsJCS8qIEhQVDM3NCAqLworCQltb2RlID0gKEhQVDM3NF9BTExPV19BVEExMzNfNikgPyA0IDogMzsKKwl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNykpIHsJLyogSFBUMzcxICovCisJCW1vZGUgPSAoSFBUMzcxX0FMTE9XX0FUQTEzM182KSA/IDQgOiAzOworCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA2KSkgewkvKiBIUFQzMDIgKi8KKwkJbW9kZSA9IChIUFQzMDJfQUxMT1dfQVRBMTMzXzYpID8gNCA6IDM7CisJfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDUpKSB7CS8qIEhQVDM3MiAqLworCQltb2RlID0gKEhQVDM3Ml9BTExPV19BVEExMzNfNikgPyA0IDogMzsKKwl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNCkpIHsJLyogSFBUMzcwQSAqLworCQltb2RlID0gKEhQVDM3MF9BTExPV19BVEExMDBfNSkgPyAzIDogMjsKKwl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsJLyogSFBUMzcwICovCisJCW1vZGUgPSAoSFBUMzcwX0FMTE9XX0FUQTEwMF81KSA/IDMgOiAyOworCQltb2RlID0gKGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBiYWRfYXRhMzMpKSA/IDAgOiBtb2RlOworCX0gZWxzZSB7CQkJCS8qIEhQVDM2NiBhbmQgSFBUMzY4ICovCisJCW1vZGUgPSAoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGEzMykpID8gMCA6IDI7CisJfQorCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSAmJiAobW9kZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCisvKgorICoJTm90ZSBmb3IgdGhlIGZ1dHVyZTsgdGhlIFNBVEEgaHB0Mzd4IHdlIG11c3Qgc2V0CisgKgllaXRoZXIgUElPIG9yIFVETUEgbW9kZXMgMCw0LDUKKyAqLworIAorc3RhdGljIHU4IGhwdDN4eF9yYXRlZmlsdGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNwZWVkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwl1OCBtb2RlCQkJPSBocHQzeHhfcmF0ZW1hc2soZHJpdmUpOworCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJcmV0dXJuIG1pbihzcGVlZCwgKHU4KVhGRVJfUElPXzQpOworCisJc3dpdGNoKG1vZGUpIHsKKwkJY2FzZSAweDA0OgorCQkJc3BlZWQgPSBtaW4oc3BlZWQsICh1OClYRkVSX1VETUFfNik7CisJCQlicmVhazsKKwkJY2FzZSAweDAzOgorCQkJc3BlZWQgPSBtaW4oc3BlZWQsICh1OClYRkVSX1VETUFfNSk7CisJCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA1KSkKKwkJCQlicmVhazsKKwkJCWlmIChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTEwMF81KSkKKwkJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfVURNQV80KTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfVURNQV80KTsKKwkvKgorCSAqIENIRUNLIE1FLCBEb2VzIHRoaXMgbmVlZCB0byBiZSBzZXQgdG8gNSA/PworCSAqLworCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpCisJCQkJYnJlYWs7CisJCQlpZiAoKGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBiYWRfYXRhNjZfNCkpIHx8CisJCQkgICAgKCEoSFBUMzY2X0FMTE9XX0FUQTY2XzQpKSkKKwkJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfVURNQV8zKTsKKwkJCWlmICgoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGE2Nl8zKSkgfHwKKwkJCSAgICAoIShIUFQzNjZfQUxMT1dfQVRBNjZfMykpKQorCQkJCXNwZWVkID0gbWluKHNwZWVkLCAodTgpWEZFUl9VRE1BXzIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXNwZWVkID0gbWluKHNwZWVkLCAodTgpWEZFUl9VRE1BXzIpOworCS8qCisJICogQ0hFQ0sgTUUsIERvZXMgdGhpcyBuZWVkIHRvIGJlIHNldCB0byA1ID8/CisJICovCisJCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAzKSkKKwkJCQlicmVhazsKKwkJCWlmIChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTMzKSkKKwkJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfTVdfRE1BXzIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDoKKwkJZGVmYXVsdDoKKwkJCXNwZWVkID0gbWluKHNwZWVkLCAodTgpWEZFUl9NV19ETUFfMik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNwZWVkOworfQorCitzdGF0aWMgaW50IGNoZWNrX2luX2RyaXZlX2xpc3RzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKipsaXN0KQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworCWlmIChxdWlya19kcml2ZXMgPT0gbGlzdCkgeworCQl3aGlsZSAoKmxpc3QpCisJCQlpZiAoc3Ryc3RyKGlkLT5tb2RlbCwgKmxpc3QrKykpCisJCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCpsaXN0KQorCQkJaWYgKCFzdHJjbXAoKmxpc3QrKyxpZC0+bW9kZWwpKQorCQkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2lfYnVzX2Nsb2NrX2xpc3QgKHU4IHNwZWVkLCBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqIGNoaXBzZXRfdGFibGUpCit7CisJZm9yICggOyBjaGlwc2V0X3RhYmxlLT54ZmVyX3NwZWVkIDsgY2hpcHNldF90YWJsZSsrKQorCQlpZiAoY2hpcHNldF90YWJsZS0+eGZlcl9zcGVlZCA9PSBzcGVlZCkKKwkJCXJldHVybiBjaGlwc2V0X3RhYmxlLT5jaGlwc2V0X3NldHRpbmdzOworCXJldHVybiBjaGlwc2V0X3RhYmxlLT5jaGlwc2V0X3NldHRpbmdzOworfQorCitzdGF0aWMgaW50IGhwdDM2eF90dW5lX2NoaXBzZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCXU4IHNwZWVkCQk9IGhwdDN4eF9yYXRlZmlsdGVyKGRyaXZlLCB4ZmVyc3BlZWQpOworLy8JdTggc3BlZWQJCT0gaWRlX3JhdGVfZmlsdGVyKGhwdDN4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisJdTggcmVndGltZQkJPSAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxKSA/IDB4NDQgOiAweDQwOworCXU4IHJlZ2Zhc3QJCT0gKEhXSUYoZHJpdmUpLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOworCXU4IGRyaXZlX2Zhc3QJCT0gMDsKKwl1MzIgcmVnMSA9IDAsIHJlZzIJPSAwOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSAiZmFzdCBpbnRlcnJ1cHQiIHByZWRpY3Rpb24uCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCAmZHJpdmVfZmFzdCk7CisjaWYgMAorCWlmIChkcml2ZV9mYXN0ICYgMHgwMikKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcmVnZmFzdCwgZHJpdmVfZmFzdCAmIH4weDIwKTsKKyNlbHNlCisJaWYgKGRyaXZlX2Zhc3QgJiAweDgwKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBkcml2ZV9mYXN0ICYgfjB4ODApOworI2VuZGlmCisKKwlyZWcyID0gcGNpX2J1c19jbG9ja19saXN0KHNwZWVkLAorCQkoc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKikgcGNpX2dldF9kcnZkYXRhKGRldikpOworCS8qCisJICogRGlzYWJsZSBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlcgorCSAqICAodG8gYXZvaWQgcHJvYmxlbXMgaGFuZGxpbmcgSS9PIGVycm9ycyBsYXRlcikKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWd0aW1lLCAmcmVnMSk7CisJaWYgKHNwZWVkID49IFhGRVJfTVdfRE1BXzApIHsKKwkJcmVnMiA9IChyZWcyICYgfjB4YzAwMDAwMDApIHwgKHJlZzEgJiAweGMwMDAwMDAwKTsKKwl9IGVsc2UgeworCQlyZWcyID0gKHJlZzIgJiB+MHgzMDA3MDAwMCkgfCAocmVnMSAmIDB4MzAwNzAwMDApOworCX0JCisJcmVnMiAmPSB+MHg4MDAwMDAwMDsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWd0aW1lLCByZWcyKTsKKworCXJldHVybiBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCk7Cit9CisKK3N0YXRpYyBpbnQgaHB0MzcwX3R1bmVfY2hpcHNldChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJdTggc3BlZWQJPSBocHQzeHhfcmF0ZWZpbHRlcihkcml2ZSwgeGZlcnNwZWVkKTsKKy8vCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKGhwdDN4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisJdTggcmVnZmFzdAk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKKwl1OCBkcml2ZV9wY2kJPSAweDQwICsgKGRyaXZlLT5kbiAqIDQpOworCXU4IG5ld19mYXN0CT0gMCwgZHJpdmVfZmFzdCA9IDA7CisJdTMyIGxpc3RfY29uZgk9IDAsIGRyaXZlX2NvbmYgPSAwOworCXUzMiBjb25mX21hc2sJPSAoc3BlZWQgPj0gWEZFUl9NV19ETUFfMCkgPyAweGMwMDAwMDAwIDogMHgzMDA3MDAwMDsKKworCS8qCisJICogRGlzYWJsZSB0aGUgImZhc3QgaW50ZXJydXB0IiBwcmVkaWN0aW9uLgorCSAqIGRvbid0IGhvbGRvZmYgb24gaW50ZXJydXB0cy4gKD09IDB4MDEgZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkgCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCAmZHJpdmVfZmFzdCk7CisJbmV3X2Zhc3QgPSBkcml2ZV9mYXN0OworCWlmIChuZXdfZmFzdCAmIDB4MDIpCisJCW5ld19mYXN0ICY9IH4weDAyOworCisjaWZkZWYgSFBUX0RFTEFZX0lOVEVSUlVQVAorCWlmIChuZXdfZmFzdCAmIDB4MDEpCisJCW5ld19mYXN0ICY9IH4weDAxOworI2Vsc2UKKwlpZiAoKG5ld19mYXN0ICYgMHgwMSkgPT0gMCkKKwkJbmV3X2Zhc3QgfD0gMHgwMTsKKyNlbmRpZgorCWlmIChuZXdfZmFzdCAhPSBkcml2ZV9mYXN0KQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBuZXdfZmFzdCk7CisKKwlsaXN0X2NvbmYgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsIAorCQkJCSAgICAgICAoc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKikKKwkJCQkgICAgICAgcGNpX2dldF9kcnZkYXRhKGRldikpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7CisJbGlzdF9jb25mID0gKGxpc3RfY29uZiAmIH5jb25mX21hc2spIHwgKGRyaXZlX2NvbmYgJiBjb25mX21hc2spOworCQorCWlmIChzcGVlZCA8IFhGRVJfTVdfRE1BXzApIHsKKwkJbGlzdF9jb25mICY9IH4weDgwMDAwMDAwOyAvKiBEaXNhYmxlIG9uLWNoaXAgUElPIEZJRk8vYnVmZmVyICovCisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgbGlzdF9jb25mKTsKKworCXJldHVybiBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCk7Cit9CisKK3N0YXRpYyBpbnQgaHB0MzcyX3R1bmVfY2hpcHNldChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJdTggc3BlZWQJPSBocHQzeHhfcmF0ZWZpbHRlcihkcml2ZSwgeGZlcnNwZWVkKTsKKy8vCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKGhwdDN4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisJdTggcmVnZmFzdAk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKKwl1OCBkcml2ZV9mYXN0CT0gMCwgZHJpdmVfcGNpID0gMHg0MCArIChkcml2ZS0+ZG4gKiA0KTsKKwl1MzIgbGlzdF9jb25mCT0gMCwgZHJpdmVfY29uZiA9IDA7CisJdTMyIGNvbmZfbWFzawk9IChzcGVlZCA+PSBYRkVSX01XX0RNQV8wKSA/IDB4YzAwMDAwMDAgOiAweDMwMDcwMDAwOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSAiZmFzdCBpbnRlcnJ1cHQiIHByZWRpY3Rpb24uCisJICogZG9uJ3QgaG9sZG9mZiBvbiBpbnRlcnJ1cHRzLiAoPT0gMHgwMSBkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KQorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcmVnZmFzdCwgJmRyaXZlX2Zhc3QpOworCWRyaXZlX2Zhc3QgJj0gfjB4MDc7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcmVnZmFzdCwgZHJpdmVfZmFzdCk7CisJCQkJCQorCWxpc3RfY29uZiA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwKKwkJCShzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqKQorCQkJCQlwY2lfZ2V0X2RydmRhdGEoZGV2KSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7CisJbGlzdF9jb25mID0gKGxpc3RfY29uZiAmIH5jb25mX21hc2spIHwgKGRyaXZlX2NvbmYgJiBjb25mX21hc2spOworCWlmIChzcGVlZCA8IFhGRVJfTVdfRE1BXzApCisJCWxpc3RfY29uZiAmPSB+MHg4MDAwMDAwMDsgLyogRGlzYWJsZSBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlciAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkcml2ZV9wY2ksIGxpc3RfY29uZik7CisKKwlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOworfQorCitzdGF0aWMgaW50IGhwdDN4eF90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCisJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgOCkpCisJCXJldHVybiBocHQzNzJfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7IC8qIG5vdCBhIHR5cG8gKi8KKyNpZiAwCisJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA3KSkKKwkJaHB0MzcxX3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNikpCisJCWhwdDMwMl90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKyNlbmRpZgorCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNSkpCisJCXJldHVybiBocHQzNzJfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CisJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAzKSkKKwkJcmV0dXJuIGhwdDM3MF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKwllbHNlCS8qIGhwdDM2ODogaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAyKSAqLworCQlyZXR1cm4gaHB0MzZ4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworfQorCitzdGF0aWMgdm9pZCBocHQzeHhfdHVuZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCAyNTUsIHBpbywgTlVMTCk7CisJKHZvaWQpIGhwdDN4eF90dW5lX2NoaXBzZXQoZHJpdmUsIChYRkVSX1BJT18wICsgcGlvKSk7Cit9CisKKy8qCisgKiBUaGlzIGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiBpZGVfcGNpIGNoaXBzZXQgcmVnaXN0ZXJzCisgKiBmb3IgY2FyZHMgdGhhdCBsZWFybiBhYm91dCB0aGUgZHJpdmUncyBVRE1BLCBETUEsIFBJTyBjYXBhYmlsaXRpZXMKKyAqIGFmdGVyIHRoZSBkcml2ZSBpcyByZXBvcnRlZCBieSB0aGUgT1MuICBJbml0aWFsbHkgZm9yIGRlc2lnbmVkIGZvcgorICogSFBUMzY2IFVETUEgY2hpcHNldCBieSBIaWdoUG9pbnR8VHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTY2XzQpCisgKiBjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTY2XzMpCisgKiBjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTMzKQorICoKKyAqLworc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBocHQzeHhfcmF0ZW1hc2soZHJpdmUpKTsKKworCWlmICghKHNwZWVkKSkKKwkJcmV0dXJuIDA7CisKKwkodm9pZCkgaHB0M3h4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaHB0M3h4X3F1aXJrcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiAoKGludCkgY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIHF1aXJrX2RyaXZlcykpOworfQorCitzdGF0aWMgdm9pZCBocHQzeHhfaW50cnByb2MgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisKKwlpZiAoZHJpdmUtPnF1aXJrX2xpc3QpCisJCXJldHVybjsKKwkvKiBkcml2ZXMgaW4gdGhlIHF1aXJrX2xpc3QgbWF5IG5vdCBsaWtlIGludHIgc2V0dXBzL2NsZWFudXBzICovCisJaHdpZi0+T1VUQihkcml2ZS0+Y3RsfDIsIElERV9DT05UUk9MX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGhwdDN4eF9tYXNrcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisKKwlpZiAoZHJpdmUtPnF1aXJrX2xpc3QpIHsKKwkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwzKSkgeworCQkJdTggcmVnNWEgPSAwOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAmcmVnNWEpOworCQkJaWYgKCgocmVnNWEgJiAweDEwKSA+PiA0KSAhPSBtYXNrKQorCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWEsIG1hc2sgPyAocmVnNWEgfCAweDEwKSA6IChyZWc1YSAmIH4weDEwKSk7CisJCX0gZWxzZSB7CisJCQlpZiAobWFzaykgeworCQkJCWRpc2FibGVfaXJxKEhXSUYoZHJpdmUpLT5pcnEpOworCQkJfSBlbHNlIHsKKwkJCQllbmFibGVfaXJxKEhXSUYoZHJpdmUpLT5pcnEpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKElERV9DT05UUk9MX1JFRykKKwkJCUhXSUYoZHJpdmUpLT5PVVRCKG1hc2sgPyAoZHJpdmUtPmN0bCB8IDIpIDoKKwkJCQkJCSAoZHJpdmUtPmN0bCAmIH4yKSwKKwkJCQkJCSBJREVfQ09OVFJPTF9SRUcpOworCX0KK30KKworc3RhdGljIGludCBocHQzNjZfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisKKwlkcml2ZS0+aW5pdF9zcGVlZCA9IDA7CisKKwlpZiAoaWQgJiYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKKworCQlpZiAoaWRlX3VzZV9kbWEoZHJpdmUpKSB7CisJCQlpZiAoY29uZmlnX2NoaXBzZXRfZm9yX2RtYShkcml2ZSkpCisJCQkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCQl9CisKKwkJZ290byBmYXN0X2F0YV9waW87CisKKwl9IGVsc2UgaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDgpIHx8IChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgeworZmFzdF9hdGFfcGlvOgorCQlocHQzeHhfdHVuZV9kcml2ZShkcml2ZSwgNSk7CisJCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwl9CisJLyogSU9SRFkgbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgSFBUMzY2IFVETUEgYmlvcyBjaGlwc2V0CisgKiBieSBIaWdoUG9pbnR8VHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KKyAqLworc3RhdGljIGludCBocHQzNjZfaWRlX2RtYV9sb3N0aXJxIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCXU4IHJlZzUwaCA9IDAsIHJlZzUyaCA9IDAsIHJlZzVhaCA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTAsICZyZWc1MGgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MiwgJnJlZzUyaCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAmcmVnNWFoKTsKKwlwcmludGsoIiVzOiAoJXMpICByZWc1MGg9MHglMDJ4LCByZWc1Mmg9MHglMDJ4LCByZWc1YWg9MHglMDJ4XG4iLAorCQlkcml2ZS0+bmFtZSwgX19GVU5DVElPTl9fLCByZWc1MGgsIHJlZzUyaCwgcmVnNWFoKTsKKwlpZiAocmVnNWFoICYgMHgxMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgcmVnNWFoICYgfjB4MTApOworI2lmIDAKKwkvKiBob3cgYWJvdXQgd2UgZmx1c2ggYW5kIHJlc2V0LCBtbW1rYXk/ICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgMHgxRik7CisJLyogZmFsbCB0aHJvdWdoIHRvIGEgcmVzZXQgKi8KKwljYXNlIGRtYV9zdGFydDoKKwljYXNlIGlkZV9kbWFfZW5kOgorCS8qIHJlc2V0IHRoZSBjaGlwcyBzdGF0ZSBvdmVyIGFuZCBvdmVyLi4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUxLCAweDEzKTsKKyNlbmRpZgorCXJldHVybiBfX2lkZV9kbWFfbG9zdGlycShkcml2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhwdDM3MF9jbGVhcl9lbmdpbmUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCByZWdzdGF0ZSA9IEhXSUYoZHJpdmUpLT5jaGFubmVsID8gMHg1NCA6IDB4NTA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCByZWdzdGF0ZSwgMHgzNyk7CisJdWRlbGF5KDEwKTsKK30KKworc3RhdGljIHZvaWQgaHB0MzcwX2lkZV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworI2lmZGVmIEhQVF9SRVNFVF9TVEFURV9FTkdJTkUKKwlocHQzNzBfY2xlYXJfZW5naW5lKGRyaXZlKTsKKyNlbmRpZgorCWlkZV9kbWFfc3RhcnQoZHJpdmUpOworfQorCitzdGF0aWMgaW50IGhwdDM3MF9pZGVfZG1hX2VuZCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBkbWFfc3RhdAkJPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisKKwlpZiAoZG1hX3N0YXQgJiAweDAxKSB7CisJCS8qIHdhaXQgYSBsaXR0bGUgKi8KKwkJdWRlbGF5KDIwKTsKKwkJZG1hX3N0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisJfQorCWlmICgoZG1hX3N0YXQgJiAweDAxKSAhPSAwKSAKKwkJLyogZmFsbHRocm91Z2ggKi8KKwkJKHZvaWQpIEhXSUYoZHJpdmUpLT5pZGVfZG1hX3RpbWVvdXQoZHJpdmUpOworCisJcmV0dXJuIF9faWRlX2RtYV9lbmQoZHJpdmUpOworfQorCitzdGF0aWMgdm9pZCBocHQzNzBfbG9zdGlycV90aW1lb3V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXU4IGJmaWZvID0gMCwgcmVnaW5mbwk9IGh3aWYtPmNoYW5uZWwgPyAweDU2IDogMHg1MjsKKwl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIHJlZ2luZm8sICZiZmlmbyk7CisJcHJpbnRrKCIlczogJWQgYnl0ZXMgaW4gRklGT1xuIiwgZHJpdmUtPm5hbWUsIGJmaWZvKTsKKwlocHQzNzBfY2xlYXJfZW5naW5lKGRyaXZlKTsKKwkvKiBnZXQgZG1hIGNvbW1hbmQgbW9kZSAqLworCWRtYV9jbWQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX2NvbW1hbmQpOworCS8qIHN0b3AgZG1hICovCisJaHdpZi0+T1VUQihkbWFfY21kICYgfjB4MSwgaHdpZi0+ZG1hX2NvbW1hbmQpOworCWRtYV9zdGF0ID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCS8qIGNsZWFyIGVycm9ycyAqLworCWh3aWYtPk9VVEIoZG1hX3N0YXQgfCAweDYsIGh3aWYtPmRtYV9zdGF0dXMpOworfQorCitzdGF0aWMgaW50IGhwdDM3MF9pZGVfZG1hX3RpbWVvdXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlocHQzNzBfbG9zdGlycV90aW1lb3V0KGRyaXZlKTsKKwlocHQzNzBfY2xlYXJfZW5naW5lKGRyaXZlKTsKKwlyZXR1cm4gX19pZGVfZG1hX3RpbWVvdXQoZHJpdmUpOworfQorCitzdGF0aWMgaW50IGhwdDM3MF9pZGVfZG1hX2xvc3RpcnEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlocHQzNzBfbG9zdGlycV90aW1lb3V0KGRyaXZlKTsKKwlocHQzNzBfY2xlYXJfZW5naW5lKGRyaXZlKTsKKwlyZXR1cm4gX19pZGVfZG1hX2xvc3RpcnEoZHJpdmUpOworfQorCisvKiByZXR1cm5zIDEgaWYgRE1BIElSUSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IGhwdDM3NF9pZGVfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTE2IGJmaWZvCQk9IDA7CisJdTggcmVnaW5mbwkJPSBod2lmLT5jaGFubmVsID8gMHg1NiA6IDB4NTI7CisJdTggZG1hX3N0YXQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCByZWdpbmZvLCAmYmZpZm8pOworCWlmIChiZmlmbyAmIDB4MUZGKSB7CisvLwkJcHJpbnRrKCIlczogJWQgYnl0ZXMgaW4gRklGT1xuIiwgZHJpdmUtPm5hbWUsIGJmaWZvKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1hX3N0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisJLyogcmV0dXJuIDEgaWYgSU5UUiBhc3NlcnRlZCAqLworCWlmICgoZG1hX3N0YXQgJiA0KSA9PSA0KQorCQlyZXR1cm4gMTsKKworCWlmICghZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICglcykgY2FsbGVkIHdoaWxlIG5vdCB3YWl0aW5nXG4iLAorCQkJCWRyaXZlLT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwdDM3NF9pZGVfZG1hX2VuZCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTggbXNjX3N0YXQgPSAwLCBtc2NyZWcJPSBod2lmLT5jaGFubmVsID8gMHg1NCA6IDB4NTA7CisJdTggYndzcl9zdGF0ID0gMCwgYndzcl9tYXNrID0gaHdpZi0+Y2hhbm5lbCA/IDB4MDIgOiAweDAxOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDZhLCAmYndzcl9zdGF0KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIG1zY3JlZywgJm1zY19zdGF0KTsKKwlpZiAoKGJ3c3Jfc3RhdCAmIGJ3c3JfbWFzaykgPT0gYndzcl9tYXNrKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBtc2NyZWcsIG1zY19zdGF0fDB4MzApOworCXJldHVybiBfX2lkZV9kbWFfZW5kKGRyaXZlKTsKK30KKworLyoqCisgKglocHQzNzJuX3NldF9jbG9jawktCXBlcmZvcm0gY2xvY2sgc3dpdGNoaW5nIGRhbmNlCisgKglAZHJpdmU6IERyaXZlIHRvIHN3aXRjaAorICoJQG1vZGU6IFN3aXRjaGluZyBtb2RlICgweDIxIGZvciB3cml0ZSwgMHgyMyBvdGhlcndpc2UpCisgKgorICoJU3dpdGNoIHRoZSBEUExMIGNsb2NrIG9uIHRoZSBIUFQzNzJOIGRldmljZXMuIFRoaXMgaXMgYQorICoJcmlnaHQgbWVzcy4KKyAqLworIAorc3RhdGljIHZvaWQgaHB0Mzcybl9zZXRfY2xvY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbW9kZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJCisJLyogRklYTUU6IHNob3VsZCB3ZSBjaGVjayBmb3IgRE1BIGFjdGl2ZSBhbmQgQlVHKCkgKi8KKwkvKiBUcmlzdGF0ZSB0aGUgYnVzICovCisJb3V0YigweDgwLCBod2lmLT5kbWFfYmFzZSsweDczKTsKKwlvdXRiKDB4ODAsIGh3aWYtPmRtYV9iYXNlKzB4NzcpOworCQorCS8qIFN3aXRjaCBjbG9jayBhbmQgcmVzZXQgY2hhbm5lbHMgKi8KKwlvdXRiKG1vZGUsIGh3aWYtPmRtYV9iYXNlKzB4N0IpOworCW91dGIoMHhDMCwgaHdpZi0+ZG1hX2Jhc2UrMHg3OSk7CisJCisJLyogUmVzZXQgc3RhdGUgbWFjaGluZXMgKi8KKwlvdXRiKDB4MzcsIGh3aWYtPmRtYV9iYXNlKzB4NzApOworCW91dGIoMHgzNywgaHdpZi0+ZG1hX2Jhc2UrMHg3NCk7CisJCisJLyogQ29tcGxldGUgcmVzZXQgKi8KKwlvdXRiKDB4MDAsIGh3aWYtPmRtYV9iYXNlKzB4NzkpOworCQorCS8qIFJlY29ubmVjdCBjaGFubmVscyB0byBidXMgKi8KKwlvdXRiKDB4MDAsIGh3aWYtPmRtYV9iYXNlKzB4NzMpOworCW91dGIoMHgwMCwgaHdpZi0+ZG1hX2Jhc2UrMHg3Nyk7Cit9CisKKy8qKgorICoJaHB0Mzcybl9yd19kaXNrCQktCXByZXBhcmUgZm9yIEkvTworICoJQGRyaXZlOiBkcml2ZSBmb3IgY29tbWFuZAorICoJQHJxOiBibG9jayByZXF1ZXN0IHN0cnVjdHVyZQorICoKKyAqCVRoaXMgaXMgY2FsbGVkIHdoZW4gYSBkaXNrIEkvTyBpcyBpc3N1ZWQgdG8gdGhlIDM3Mk4uCisgKglXZSBuZWVkIGl0IGJlY2F1c2Ugb2YgdGhlIGNsb2NrIHN3aXRjaGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBocHQzNzJuX3J3X2Rpc2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCWludCB3YW50Y2xvY2s7CisKKwl3YW50Y2xvY2sgPSBycV9kYXRhX2RpcihycSkgPyAweDIzIDogMHgyMTsKKworCWlmIChod2lmLT5jb25maWdfZGF0YSAhPSB3YW50Y2xvY2spIHsKKwkJaHB0Mzcybl9zZXRfY2xvY2soZHJpdmUsIHdhbnRjbG9jayk7CisJCWh3aWYtPmNvbmZpZ19kYXRhID0gd2FudGNsb2NrOworCX0KK30KKworLyoKKyAqIFNpbmNlIFNVTiBDb2JhbHQgaXMgYXR0ZW1wdGluZyB0byBkbyB0aGlzIG9wZXJhdGlvbiwgSSBzaG91bGQgZGlzY2xvc2UKKyAqIHRoaXMgaGFzIGJlZW4gYSBsb25nIHRpbWUgYWdvIFRodSBKdWwgMjcgMTY6NDA6NTcgMjAwMCB3YXMgdGhlIHBhdGNoIGRhdGUKKyAqIEhPVFNXQVAgQVRBIEluZnJhc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB2b2lkIGhwdDN4eF9yZXNldCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworI2lmIDAKKwl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBwY2lfcmVzb3VyY2Vfc3RhcnQoSFdJRihkcml2ZSktPnBjaV9kZXYsIDQpOworCXU4IHJlc2V0CT0gKEhXSUYoZHJpdmUpLT5jaGFubmVsKSA/IDB4ODAgOiAweDQwOworCXU4IHJlZzU5aAk9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg1OSwgJnJlZzU5aCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCAweDU5LCByZWc1OWh8cmVzZXQpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg1OSwgcmVnNTloKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGhwdDN4eF90cmlzdGF0ZSAoaWRlX2RyaXZlX3QgKiBkcml2ZSwgaW50IHN0YXRlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1OCByZWc1OWggPSAwLCByZXNldAk9IChod2lmLT5jaGFubmVsKSA/IDB4ODAgOiAweDQwOworCXU4IHJlZ1hYaCA9IDAsIHN0YXRlX3JlZz0gKGh3aWYtPmNoYW5uZWwpID8gMHg1NyA6IDB4NTM7CisKKy8vCWh3aWYtPmJ1c19zdGF0ZSA9IHN0YXRlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDU5LCAmcmVnNTloKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHN0YXRlX3JlZywgJnJlZ1hYaCk7CisKKwlpZiAoc3RhdGUpIHsKKwkJKHZvaWQpIGlkZV9kb19yZXNldChkcml2ZSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHN0YXRlX3JlZywgcmVnWFhofDB4ODApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU5LCByZWc1OWh8cmVzZXQpOworCX0gZWxzZSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTksIHJlZzU5aCAmIH4ocmVzZXQpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgc3RhdGVfcmVnLCByZWdYWGggJiB+KDB4ODApKTsKKwkJKHZvaWQpIGlkZV9kb19yZXNldChkcml2ZSk7CisJfQorCXJldHVybiAwOworfQorCisvKiAKKyAqIHNldC9nZXQgcG93ZXIgc3RhdGUgZm9yIGEgZHJpdmUuCisgKiB0dXJuaW5nIHRoZSBwb3dlciBvZmYgZG9lcyB0aGUgZm9sbG93aW5nIHRoaW5nczoKKyAqICAgMSkgc29mdC1yZXNldCB0aGUgZHJpdmUKKyAqICAgMikgdHJpLXN0YXRlcyB0aGUgaWRlIGJ1cworICoKKyAqIHdoZW4gd2UgdHVybiB0aGluZ3MgYmFjayBvbiwgd2UgbmVlZCB0byByZS1pbml0aWFsaXplIHRoaW5ncy4KKyAqLworI2RlZmluZSBUUklTVEFURV9CSVQgIDB4ODAwMAorc3RhdGljIGludCBocHQzNzBfYnVzcHJvYyhpZGVfZHJpdmVfdCAqIGRyaXZlLCBpbnQgc3RhdGUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXU4IHRyaXN0YXRlID0gMCwgcmVzZXRtYXNrID0gMCwgYnVzX3JlZyA9IDA7CisJdTE2IHRyaV9yZWc7CisKKwlod2lmLT5idXNfc3RhdGUgPSBzdGF0ZTsKKworCWlmIChod2lmLT5jaGFubmVsKSB7IAorCQkvKiBzZWNvbmRhcnkgY2hhbm5lbCAqLworCQl0cmlzdGF0ZSA9IDB4NTY7CisJCXJlc2V0bWFzayA9IDB4ODA7IAorCX0gZWxzZSB7IAorCQkvKiBwcmltYXJ5IGNoYW5uZWwgKi8KKwkJdHJpc3RhdGUgPSAweDUyOworCQlyZXNldG1hc2sgPSAweDQwOworCX0KKworCS8qIGdyYWIgc3RhdHVzICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCB0cmlzdGF0ZSwgJnRyaV9yZWcpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1OSwgJmJ1c19yZWcpOworCisJLyogc2V0IHRoZSBzdGF0ZS4gd2UgZG9uJ3Qgc2V0IGl0IGlmIHdlIGRvbid0IG5lZWQgdG8gZG8gc28uCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlIGtub3dzIHRoYXQgaXQgaGFzIGZhaWxlZCBpZiBpdCdzIG9mZiAqLworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJVU1NUQVRFX09OOgorCQlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSAwOworCQlod2lmLT5kcml2ZXNbMV0uZmFpbHVyZXMgPSAwOworCQlpZiAoKGJ1c19yZWcgJiByZXNldG1hc2spID09IDApCisJCQlyZXR1cm4gMDsKKwkJdHJpX3JlZyAmPSB+VFJJU1RBVEVfQklUOworCQlidXNfcmVnICY9IH5yZXNldG1hc2s7CisJCWJyZWFrOworCWNhc2UgQlVTU1RBVEVfT0ZGOgorCQlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMF0ubWF4X2ZhaWx1cmVzICsgMTsKKwkJaHdpZi0+ZHJpdmVzWzFdLmZhaWx1cmVzID0gaHdpZi0+ZHJpdmVzWzFdLm1heF9mYWlsdXJlcyArIDE7CisJCWlmICgodHJpX3JlZyAmIFRSSVNUQVRFX0JJVCkgPT0gMCAmJiAoYnVzX3JlZyAmIHJlc2V0bWFzaykpCisJCQlyZXR1cm4gMDsKKwkJdHJpX3JlZyAmPSB+VFJJU1RBVEVfQklUOworCQlidXNfcmVnIHw9IHJlc2V0bWFzazsKKwkJYnJlYWs7CisJY2FzZSBCVVNTVEFURV9UUklTVEFURToKKwkJaHdpZi0+ZHJpdmVzWzBdLmZhaWx1cmVzID0gaHdpZi0+ZHJpdmVzWzBdLm1heF9mYWlsdXJlcyArIDE7CisJCWh3aWYtPmRyaXZlc1sxXS5mYWlsdXJlcyA9IGh3aWYtPmRyaXZlc1sxXS5tYXhfZmFpbHVyZXMgKyAxOworCQlpZiAoKHRyaV9yZWcgJiBUUklTVEFURV9CSVQpICYmIChidXNfcmVnICYgcmVzZXRtYXNrKSkKKwkJCXJldHVybiAwOworCQl0cmlfcmVnIHw9IFRSSVNUQVRFX0JJVDsKKwkJYnVzX3JlZyB8PSByZXNldG1hc2s7CisJCWJyZWFrOworCX0KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU5LCBidXNfcmVnKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCB0cmlzdGF0ZSwgdHJpX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9ocHQzN3goc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgYWRqdXN0LCBpOworCXUxNiBmcmVxOworCXUzMiBwbGw7CisJdTggcmVnNWJoOworCXU4IHJlZzVhaCA9IDA7CisJdW5zaWduZWQgbG9uZyBkbWFiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJdTggZGlkLCByaWQ7CQorCWludCBpc18zNzJuID0gMDsKKwkKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZyZWc1YWgpOworCS8qIGludGVycnVwdCBmb3JjZSBlbmFibGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAocmVnNWFoICYgfjB4MTApKTsKKworCWlmKGRtYWJhc2UpCisJeworCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOworCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOworCQorCQlpZigoZGlkID09IDQgJiYgcmlkID09IDYpIHx8IChkaWQgPT0gNSAmJiByaWQgPiAxKSkKKwkJCWlzXzM3Mm4gPSAxOworCX0KKworCS8qCisJICogZGVmYXVsdCB0byBwY2kgY2xvY2suIG1ha2Ugc3VyZSBNQTE1LzE2IGFyZSBzZXQgdG8gb3V0cHV0CisJICogdG8gcHJldmVudCBkcml2ZXMgaGF2aW5nIHByb2JsZW1zIHdpdGggNDAtcGluIGNhYmxlcy4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCAweDIzKTsKKworCS8qCisJICogc2V0IHVwIHRoZSBQTEwuIHdlIG5lZWQgdG8gYWRqdXN0IGl0IHNvIHRoYXQgaXQncyBzdGFibGUuIAorCSAqIGZyZXEgPSBUcGxsICogMTkyIC8gVHBjaQorCSAqCisJICogVG9kby4gRm9yIG5vbiB4ODYgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoZSBkd29yZCBpcworCSAqIHNldCB0byAweEFCQ0RFeHh4IGluZGljYXRpbmcgdGhlIEJJT1Mgc2F2ZWQgZl9DTlQKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NzgsICZmcmVxKTsKKwlmcmVxICY9IDB4MUZGOworCQorCS8qCisJICogVGhlIDM3Mk4gdXNlcyBkaWZmZXJlbnQgUENJIGNsb2NrIGluZm9ybWF0aW9uIGFuZCBoYXMKKwkgKiBzb21lIG90aGVyIGNvbXBsaWNhdGlvbnMKKwkgKglPbiBQQ0kzMyB0aW1pbmcgd2UgbXVzdCBjbG9jayBzd2l0Y2gKKwkgKglPbiBQQ0k2NiB0aW1pbmcgd2UgbXVzdCBOT1QgdXNlIHRoZSBQQ0kgY2xvY2sKKwkgKgorCSAqIEN1cnJlbnRseSB3ZSBhbHdheXMgc2V0IHVwIHRoZSBQTEwgZm9yIHRoZSAzNzJOCisJICovCisJIAorCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCQorCWlmKGlzXzM3Mm4pCisJeworCQlwcmludGsoS0VSTl9JTkZPICJocHQ6IEhQVDM3Mk4gZGV0ZWN0ZWQsIHVzaW5nIDM3Mk4gdGltaW5nLlxuIik7CisJCWlmKGZyZXEgPCAweDU1KQorCQkJcGxsID0gRl9MT1dfUENJXzMzOworCQllbHNlIGlmKGZyZXEgPCAweDcwKQorCQkJcGxsID0gRl9MT1dfUENJXzQwOworCQllbHNlIGlmKGZyZXEgPCAweDdGKQorCQkJcGxsID0gRl9MT1dfUENJXzUwOworCQllbHNlCisJCQlwbGwgPSBGX0xPV19QQ0lfNjY7CisJCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRlJFUTogJWQgUExMOiAlZFxuIiwgZnJlcSwgcGxsKTsKKwkJCQorCQkvKiBXZSBhbHdheXMgdXNlIHRoZSBwbGwgbm90IHRoZSBQQ0kgY2xvY2sgb24gMzcyTiAqLworCX0KKwllbHNlCisJeworCQlpZihmcmVxIDwgMHg5QykKKwkJCXBsbCA9IEZfTE9XX1BDSV8zMzsKKwkJZWxzZSBpZihmcmVxIDwgMHhiMCkKKwkJCXBsbCA9IEZfTE9XX1BDSV80MDsKKwkJZWxzZSBpZihmcmVxIDwweGM4KQorCQkJcGxsID0gRl9MT1dfUENJXzUwOworCQllbHNlCisJCQlwbGwgPSBGX0xPV19QQ0lfNjY7CisJCisJCWlmIChwbGwgPT0gRl9MT1dfUENJXzMzKSB7CisJCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKQorCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3NCk7CisJCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCisJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcyKTsKKwkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw0KSkKKwkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBhKTsKKwkJCWVsc2UKKwkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzApOworCQkJcHJpbnRrKCJIUFQzN1g6IHVzaW5nIDMzTUh6IFBDSSBjbG9ja1xuIik7CisJCX0gZWxzZSBpZiAocGxsID09IEZfTE9XX1BDSV80MCkgeworCQkJLyogVW5zdXBwb3J0ZWQgKi8KKwkJfSBlbHNlIGlmIChwbGwgPT0gRl9MT1dfUENJXzUwKSB7CisJCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKQorCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7CisJCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCisJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzIpOworCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDQpKQorCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7CisJCQllbHNlCisJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKKwkJCXByaW50aygiSFBUMzdYOiB1c2luZyA1ME1IeiBQQ0kgY2xvY2tcbiIpOworCQl9IGVsc2UgeworCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw4KSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkhQVDM3eDogNjZNSHogdGltaW5ncyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJfQorCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDUpKQorCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHNpeHR5X3NpeF9iYXNlX2hwdDM3Mik7CisJCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNCkpCisJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgc2l4dHlfc2l4X2Jhc2VfaHB0MzcwYSk7CisJCQllbHNlCisJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgc2l4dHlfc2l4X2Jhc2VfaHB0MzcwKTsKKwkJCXByaW50aygiSFBUMzdYOiB1c2luZyA2Nk1IeiBQQ0kgY2xvY2tcbiIpOworCQl9CisJfQorCQorCS8qCisJICogb25seSB0cnkgdGhlIHBsbCBpZiB3ZSBkb24ndCBoYXZlIGEgdGFibGUgZm9yIHRoZSBjbG9jaworCSAqIHNwZWVkIHRoYXQgd2UncmUgcnVubmluZyBhdC4gTk9URTogdGhlIGludGVybmFsIFBMTCB3aWxsCisJICogcmVzdWx0IGluIHNsb3cgcmVhZHMgd2hlbiB1c2luZyBhIDMzTUh6IFBDSSBjbG9jay4gd2UgYWxzbworCSAqIGRvbid0IGxpa2UgdG8gdXNlIHRoZSBQTEwgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGdsaXRjaGVzCisJICogb24gUFJTVC9TUlNUIHdoZW4gdGhlIEhQVCBzdGF0ZSBlbmdpbmUgZ2V0cyByZXNldC4KKwkgKi8KKwlpZiAocGNpX2dldF9kcnZkYXRhKGRldikpIAorCQlnb3RvIGluaXRfaHB0MzdYX2RvbmU7CisJCisJLyoKKwkgKiBhZGp1c3QgUExMIGJhc2VkIHVwb24gUENJIGNsb2NrLCBlbmFibGUgaXQsIGFuZCB3YWl0IGZvcgorCSAqIHN0YWJpbGl6YXRpb24uCisJICovCisJYWRqdXN0ID0gMDsKKwlmcmVxID0gKHBsbCA8IEZfTE9XX1BDSV81MCkgPyAyIDogNDsKKwl3aGlsZSAoYWRqdXN0KysgPCA2KSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAoZnJlcSArIHBsbCkgPDwgMTYgfAorCQkJCSAgICAgICBwbGwgfCAweDEwMCk7CisKKwkJLyogd2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMHg1MDAwMDsgaSsrKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsICZyZWc1YmgpOworCQkJaWYgKHJlZzViaCAmIDB4ODApIHsKKwkJCQkvKiBzcGluIGxvb2tpbmcgZm9yIHRoZSBjbG9jayB0byBkZXN0YWJpbGl6ZSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAweDEwMDA7ICsraSkgeworCQkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsIAorCQkJCQkJCSAgICAgJnJlZzViaCk7CisJCQkJCWlmICgocmVnNWJoICYgMHg4MCkgPT0gMCkKKwkJCQkJCWdvdG8gcGxsX3JlY2FsOworCQkJCX0KKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAmcGxsKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgCisJCQkJCQkgICAgICAgcGxsICYgfjB4MTAwKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCAweDIxKTsKKwkJCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKQorCQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3MGEpOworCQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw1KSkKKwkJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzIpOworCQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw0KSkKKwkJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKKwkJCQllbHNlCisJCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7CisJCQkJcHJpbnRrKCJIUFQzN1g6IHVzaW5nIDUwTUh6IGludGVybmFsIFBMTFxuIik7CisJCQkJZ290byBpbml0X2hwdDM3WF9kb25lOworCQkJfQorCQl9CitwbGxfcmVjYWw6CisJCWlmIChhZGp1c3QgJiAxKQorCQkJcGxsIC09IChhZGp1c3QgPj4gMSk7CisJCWVsc2UKKwkJCXBsbCArPSAoYWRqdXN0ID4+IDEpOworCX0gCisKK2luaXRfaHB0MzdYX2RvbmU6CisJLyogcmVzZXQgc3RhdGUgZW5naW5lICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgMHgzNyk7IAorCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIDB4MzcpOyAKKwl1ZGVsYXkoMTAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9ocHQzNjYoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgcmVnMQk9IDA7CisJdTggZHJpdmVfZmFzdAk9IDA7CisKKwkvKgorCSAqIERpc2FibGUgdGhlICJmYXN0IGludGVycnVwdCIgcHJlZGljdGlvbi4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTEsICZkcml2ZV9mYXN0KTsKKwlpZiAoZHJpdmVfZmFzdCAmIDB4ODApCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTEsIGRyaXZlX2Zhc3QgJiB+MHg4MCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnJlZzEpOworCQkJCQkJCQkJCisJLyogZGV0ZWN0IGJ1cyBzcGVlZCBieSBsb29raW5nIGF0IGNvbnRyb2wgcmVnIHRpbWluZzogKi8KKwlzd2l0Y2goKHJlZzEgPj4gOCkgJiA3KSB7CisJCWNhc2UgNToKKwkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZvcnR5X2Jhc2VfaHB0MzY2KTsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0d2VudHlfZml2ZV9iYXNlX2hwdDM2Nik7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQlkZWZhdWx0OgorCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzY2KTsKKwkJCWJyZWFrOworCX0KKworCWlmICghcGNpX2dldF9kcnZkYXRhKGRldikpCisJeworCQlwcmludGsoS0VSTl9FUlIgImhwdDM2NjogdW5rbm93biBidXMgdGltaW5nLlxuIik7CisJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2hwdDM2NihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQgPSAwOworCXU4IHRlc3QgPSAwOworCisJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9ST01fQUREUkVTUywKKwkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJnRlc3QpOworCWlmICh0ZXN0ICE9IChMMV9DQUNIRV9CWVRFUyAvIDQpKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLAorCQkJKEwxX0NBQ0hFX0JZVEVTIC8gNCkpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnRlc3QpOworCWlmICh0ZXN0ICE9IDB4NzgpCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDc4KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsICZ0ZXN0KTsKKwlpZiAodGVzdCAhPSAweDA4KQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUlOX0dOVCwgMHgwOCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAmdGVzdCk7CisJaWYgKHRlc3QgIT0gMHgwOCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01BWF9MQVQsIDB4MDgpOworCisJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsKKwkJcmV0ID0gaW5pdF9ocHQzN3goZGV2KTsKKwl9IGVsc2UgeworCQlyZXQgPWluaXRfaHB0MzY2KGRldik7CisJfQorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZGV2LT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldgkJPSBod2lmLT5wY2lfZGV2OworCXU4IGF0YTY2ID0gMCwgcmVnbWFzawkJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDAxIDogMHgwMjsKKwl1OCBkaWQsIHJpZDsKKwl1bnNpZ25lZCBsb25nIGRtYWJhc2UJCT0gaHdpZi0+ZG1hX2Jhc2U7CisJaW50IGlzXzM3Mm4gPSAwOworCQorCWlmKGRtYWJhc2UpCisJeworCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOworCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOworCQorCQlpZigoZGlkID09IDQgJiYgcmlkID09IDYpIHx8IChkaWQgPT0gNSAmJiByaWQgPiAxKSkKKwkJCWlzXzM3Mm4gPSAxOworCX0KKwkJCisJaHdpZi0+dHVuZXByb2MJCQk9ICZocHQzeHhfdHVuZV9kcml2ZTsKKwlod2lmLT5zcGVlZHByb2MJCQk9ICZocHQzeHhfdHVuZV9jaGlwc2V0OworCWh3aWYtPnF1aXJrcHJvYwkJCT0gJmhwdDN4eF9xdWlya3Byb2M7CisJaHdpZi0+aW50cnByb2MJCQk9ICZocHQzeHhfaW50cnByb2M7CisJaHdpZi0+bWFza3Byb2MJCQk9ICZocHQzeHhfbWFza3Byb2M7CisJCisJaWYoaXNfMzcybikKKwkJaHdpZi0+cndfZGlzayA9ICZocHQzNzJuX3J3X2Rpc2s7CisKKwkvKgorCSAqIFRoZSBIUFQzN3ggdXNlcyB0aGUgQ0JMSUQgcGlucyBhcyBvdXRwdXRzIGZvciBNQTE1L01BMTYKKwkgKiBhZGRyZXNzIGxpbmVzIHRvIGFjY2VzcyBhbiBleHRlcm5hbCBlZXByb20uICBUbyByZWFkIHZhbGlkCisJICogY2FibGUgZGV0ZWN0IHN0YXRlIHRoZSBwaW5zIG11c3QgYmUgZW5hYmxlZCBhcyBpbnB1dHMuCisJICovCisJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgOCkgJiYgUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSB7CisJCS8qCisJCSAqIEhQVDM3NCBQQ0kgZnVuY3Rpb24gMQorCQkgKiAtIHNldCBiaXQgMTUgb2YgcmVnIDB4NTIgdG8gZW5hYmxlIFRDQkxJRCBhcyBpbnB1dAorCQkgKiAtIHNldCBiaXQgMTUgb2YgcmVnIDB4NTYgdG8gZW5hYmxlIEZDQkxJRCBhcyBpbnB1dAorCQkgKi8KKwkJdTE2IG1jcjMsIG1jcjY7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg1MiwgJm1jcjMpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NTYsICZtY3I2KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg1MiwgbWNyMyB8IDB4ODAwMCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTYsIG1jcjYgfCAweDgwMDApOworCQkvKiBub3cgcmVhZCBjYWJsZSBpZCByZWdpc3RlciAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZhdGE2Nik7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTIsIG1jcjMpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDU2LCBtY3I2KTsKKwl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpIHsKKwkJLyoKKwkJICogSFBUMzcwLzM3MiBhbmQgMzc0IHBjaWZuIDAKKwkJICogLSBjbGVhciBiaXQgMCBvZiAweDViIHRvIGVuYWJsZSBQL1NDQkxJRCBhcyBpbnB1dHMKKwkJICovCisJCXU4IHNjcjI7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgJnNjcjIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCBzY3IyICYgfjEpOworCQkvKiBub3cgcmVhZCBjYWJsZSBpZCByZWdpc3RlciAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZhdGE2Nik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIHNjcjIpOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgJmF0YTY2KTsKKwl9CisKKyNpZmRlZiBERUJVRworCXByaW50aygiSFBUMzY2OiByZWc1YWg9MHglMDJ4IEFUQS0lcyBDYWJsZSBQb3J0JWRcbiIsCisJCWF0YTY2LCAoYXRhNjYgJiByZWdtYXNrKSA/ICIzMyIgOiAiNjYiLAorCQlQQ0lfRlVOQyhod2lmLT5wY2lfZGV2LT5kZXZmbikpOworI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBIUFRfU0VSSUFMSVpFX0lPCisJLyogc2VyaWFsaXplIGFjY2VzcyB0byB0aGlzIGRldmljZSAqLworCWlmIChod2lmLT5tYXRlKQorCQlod2lmLT5zZXJpYWxpemVkID0gaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IDE7CisjZW5kaWYKKworCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMykpIHsKKwkJdTggcmVnNWFoID0gMDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWEsIHJlZzVhaCAmIH4weDEwKTsKKwkJLyoKKwkJICogc2V0IHVwIGlvY3RsIGZvciBwb3dlciBzdGF0dXMuCisJCSAqIG5vdGU6IHBvd2VyIGFmZmVjdHMgYm90aAorCQkgKiBkcml2ZXMgb24gZWFjaCBjaGFubmVsCisJCSAqLworCQlod2lmLT5yZXNldHByb2MJPSAmaHB0M3h4X3Jlc2V0OworCQlod2lmLT5idXNwcm9jCT0gJmhwdDM3MF9idXNwcm9jOworLy8JCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IGh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMikpIHsKKwkJaHdpZi0+cmVzZXRwcm9jCT0gJmhwdDN4eF9yZXNldDsKKwkJaHdpZi0+YnVzcHJvYwk9ICZocHQzeHhfdHJpc3RhdGU7CisJfSBlbHNlIHsKKwkJaHdpZi0+cmVzZXRwcm9jID0gJmhwdDN4eF9yZXNldDsKKwkJaHdpZi0+YnVzcHJvYyAgID0gJmhwdDN4eF90cmlzdGF0ZTsKKwl9CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT51bHRyYV9tYXNrID0gMHg3ZjsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKworCWlmICghKGh3aWYtPnVkbWFfZm91cikpCisJCWh3aWYtPnVkbWFfZm91ciA9ICgoYXRhNjYgJiByZWdtYXNrKSA/IDAgOiAxKTsKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJmhwdDM2Nl9jb25maWdfZHJpdmVfeGZlcl9yYXRlOworCisJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw4KSkgeworCQlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJmhwdDM3NF9pZGVfZG1hX3Rlc3RfaXJxOworCQlod2lmLT5pZGVfZG1hX2VuZCA9ICZocHQzNzRfaWRlX2RtYV9lbmQ7CisJfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpIHsKKwkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZocHQzNzRfaWRlX2RtYV90ZXN0X2lycTsKKwkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmaHB0Mzc0X2lkZV9kbWFfZW5kOworCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDMpKSB7CisJCWh3aWYtPmRtYV9zdGFydCA9ICZocHQzNzBfaWRlX2RtYV9zdGFydDsKKwkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmaHB0MzcwX2lkZV9kbWFfZW5kOworCQlod2lmLT5pZGVfZG1hX3RpbWVvdXQgPSAmaHB0MzcwX2lkZV9kbWFfdGltZW91dDsKKwkJaHdpZi0+aWRlX2RtYV9sb3N0aXJxID0gJmhwdDM3MF9pZGVfZG1hX2xvc3RpcnE7CisJfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMikpCisJCWh3aWYtPmlkZV9kbWFfbG9zdGlycSA9ICZocHQzNjZfaWRlX2RtYV9sb3N0aXJxOworCWVsc2UKKwkJaHdpZi0+aWRlX2RtYV9sb3N0aXJxID0gJmhwdDM2Nl9pZGVfZG1hX2xvc3RpcnE7CisKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX2hwdDM2NihpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGRtYWJhc2UpCit7CisJdTggbWFzdGVyZG1hCT0gMCwgc2xhdmVkbWEgPSAwOworCXU4IGRtYV9uZXcJPSAwLCBkbWFfb2xkID0gMDsKKwl1OCBwcmltYXJ5CT0gaHdpZi0+Y2hhbm5lbCA/IDB4NGIgOiAweDQzOworCXU4IHNlY29uZGFyeQk9IGh3aWYtPmNoYW5uZWwgPyAweDRmIDogMHg0NzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkbWFiYXNlKQorCQlyZXR1cm47CisJCQorCWlmKHBjaV9nZXRfZHJ2ZGF0YShod2lmLT5wY2lfZGV2KSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB0OiBubyBrbm93biBJREUgdGltaW5ncywgZGlzYWJsaW5nIERNQS5cbiIpOworCQlyZXR1cm47CisJfQorCisJZG1hX29sZCA9IGh3aWYtPklOQihkbWFiYXNlKzIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZG1hX25ldyA9IGRtYV9vbGQ7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgcHJpbWFyeSwgJm1hc3RlcmRtYSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2Rldiwgc2Vjb25kYXJ5LCAmc2xhdmVkbWEpOworCisJaWYgKG1hc3RlcmRtYSAmIDB4MzApCWRtYV9uZXcgfD0gMHgyMDsKKwlpZiAoc2xhdmVkbWEgJiAweDMwKQlkbWFfbmV3IHw9IDB4NDA7CisJaWYgKGRtYV9uZXcgIT0gZG1hX29sZCkKKwkJaHdpZi0+T1VUQihkbWFfbmV3LCBkbWFiYXNlKzIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWRlX3NldHVwX2RtYShod2lmLCBkbWFiYXNlLCA4KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9ocHQzNzQoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZmluZGV2ID0gTlVMTDsKKworCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChmaW5kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZmluZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoKGZpbmRldi0+dmVuZG9yID09IGRldi0+dmVuZG9yKSAmJgorCQkgICAgKGZpbmRldi0+ZGV2aWNlID09IGRldi0+ZGV2aWNlKSAmJgorCQkgICAgKChmaW5kZXYtPmRldmZuIC0gZGV2LT5kZXZmbikgPT0gMSkgJiYKKwkJICAgIChQQ0lfRlVOQyhmaW5kZXYtPmRldmZuKSAmIDEpKSB7CisJCQlpZiAoZmluZGV2LT5pcnEgIT0gZGV2LT5pcnEpIHsKKwkJCQkvKiBGSVhNRTogd2UgbmVlZCBhIGNvcmUgcGNpX3NldF9pbnRlcnJ1cHQoKSAqLworCQkJCWZpbmRldi0+aXJxID0gZGV2LT5pcnE7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBjaS1jb25maWcgc3BhY2UgaW50ZXJydXB0ICIKKwkJCQkJImZpeGVkLlxuIiwgZC0+bmFtZSk7CisJCQl9CisJCQlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2VzKGRldiwgZmluZGV2LCBkKTsKKwkJfQorCX0KKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9ocHQzN3goc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9ocHQzNjYoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZmluZGV2ID0gTlVMTDsKKwl1OCBwaW4xID0gMCwgcGluMiA9IDA7CisJdW5zaWduZWQgaW50IGNsYXNzX3JldjsKKwljaGFyICpjaGlwc2V0X25hbWVzW10gPSB7IkhQVDM2NiIsICJIUFQzNjYiLCAgIkhQVDM2OCIsCisJCQkJICJIUFQzNzAiLCAiSFBUMzcwQSIsICJIUFQzNzIiLAorCQkJCSAiSFBUMzcyTiIgfTsKKworCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKworCWlmKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3Mk4pCisJCWNsYXNzX3JldiA9IDY7CisJCQorCWlmKGNsYXNzX3JldiA8PSA2KQorCQlkLT5uYW1lID0gY2hpcHNldF9uYW1lc1tjbGFzc19yZXZdOworCisJc3dpdGNoKGNsYXNzX3JldikgeworCQljYXNlIDY6CisJCWNhc2UgNToKKwkJY2FzZSA0OgorCQljYXNlIDM6CisJCQlnb3RvIGluaXRfc2luZ2xlOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJZC0+Y2hhbm5lbHMgPSAxOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbjEpOworCXdoaWxlICgoZmluZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGZpbmRldikpICE9IE5VTEwpIHsKKwkJaWYgKChmaW5kZXYtPnZlbmRvciA9PSBkZXYtPnZlbmRvcikgJiYKKwkJICAgIChmaW5kZXYtPmRldmljZSA9PSBkZXYtPmRldmljZSkgJiYKKwkJICAgICgoZmluZGV2LT5kZXZmbiAtIGRldi0+ZGV2Zm4pID09IDEpICYmCisJCSAgICAoUENJX0ZVTkMoZmluZGV2LT5kZXZmbikgJiAxKSkgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZmluZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbjIpOworCQkJaWYgKChwaW4xICE9IHBpbjIpICYmIChkZXYtPmlycSA9PSBmaW5kZXYtPmlycSkpIHsKKwkJCQlkLT5ib290YWJsZSA9IE9OX0JPQVJEOworCQkJCXByaW50aygiJXM6IG9uYm9hcmQgdmVyc2lvbiBvZiBjaGlwc2V0LCAiCisJCQkJCSJwaW4xPSVkIHBpbjI9JWRcbiIsIGQtPm5hbWUsCisJCQkJCXBpbjEsIHBpbjIpOworCQkJfQorCQkJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlcyhkZXYsIGZpbmRldiwgZCk7CisJCX0KKwl9Citpbml0X3NpbmdsZToKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgaHB0MzY2X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIkhQVDM2NiIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzNjYsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwkJLmV4dHJhCQk9IDI0MAorCX0sewkvKiAxICovCisJCS5uYW1lCQk9ICJIUFQzNzJBIiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3eCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAorCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAorCX0sewkvKiAyICovCisJCS5uYW1lCQk9ICJIUFQzMDIiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzd4LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAorCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCisJfSx7CS8qIDMgKi8KKwkJLm5hbWUJCT0gIkhQVDM3MSIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzN3gsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogNCAqLworCQkubmFtZQkJPSAiSFBUMzc0IiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3NCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAorCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCisJCS5jaGFubmVscwk9IDIsCS8qIDQgKi8KKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAorCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCisJfSx7CS8qIDUgKi8KKwkJLm5hbWUJCT0gIkhQVDM3Mk4iLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzd4LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKKwkJLmNoYW5uZWxzCT0gMiwJLyogNCAqLworCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9Cit9OworCisvKioKKyAqCWhwdDM2Nl9pbml0X29uZQktCWNhbGxlZCB3aGVuIGFuIEhQVDM2NiBpcyBmb3VuZAorICoJQGRldjogdGhlIGhwdDM2NiBkZXZpY2UKKyAqCUBpZDogdGhlIG1hdGNoaW5nIHBjaSBpZAorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBQQ0kgcmVnaXN0cmF0aW9uIGxheWVyIChvciB0aGUgSURFIGluaXRpYWxpemF0aW9uKQorICoJZmluZHMgYSBkZXZpY2UgbWF0Y2hpbmcgb3VyIElERSBkZXZpY2UgdGFibGVzLgorICovCisgCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocHQzNjZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlkZV9wY2lfZGV2aWNlX3QgKmQgPSAmaHB0MzY2X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CisKKwlyZXR1cm4gZC0+aW5pdF9zZXR1cChkZXYsIGQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHB0MzY2X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfVFRJLCBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9UVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyBQQ0lfVkVORE9SX0lEX1RUSSwgUENJX0RFVklDRV9JRF9UVElfSFBUMzAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKKwl7IFBDSV9WRU5ET1JfSURfVFRJLCBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDN9LAorCXsgUENJX1ZFTkRPUl9JRF9UVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJeyBQQ0lfVkVORE9SX0lEX1RUSSwgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyTiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBocHQzNjZfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIkhQVDM2Nl9JREUiLAorCS5pZF90YWJsZQk9IGhwdDM2Nl9wY2lfdGJsLAorCS5wcm9iZQkJPSBocHQzNjZfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGhwdDM2Nl9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaHB0MzY2X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmUgSGVkcmljayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgSGlnaHBvaW50IEhQVDM2NiBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9pdDgxNzIuYyBiL2RyaXZlcnMvaWRlL3BjaS9pdDgxNzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE5MjdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2l0ODE3Mi5jCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogICAgICBJVDgxNzIgSURFIGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgICAgICAgc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyX2ludC5oPgorCisvKgorICogUHJvdG90eXBlcworICovCitzdGF0aWMgdTggaXQ4MTcyX3JhdGVtYXNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGl0ODE3Ml90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJaW50IGlzX3NsYXZlCQk9ICgmaHdpZi0+ZHJpdmVzWzFdID09IGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBkcml2ZV9lbmFibGVzOworCXUzMiBkcml2ZV90aW1pbmc7CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNCwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDQwLCAmZHJpdmVfZW5hYmxlcyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgJmRyaXZlX3RpbWluZyk7CisKKwkvKgorCSAqIEZJWCEgVGhlIERJT1IvRElPVyBwdWxzZSB3aWR0aCBhbmQgcmVjb3ZlcnkgdGltZXMgaW4gcG9ydCAweDQ0CisJICogYXJlIGJlaW5nIGxlZnQgYXQgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIDggUENJIGNsb2NrcyAoMjQyIG5zZWMKKwkgKiBmb3IgYSAzMyBNSHogY2xvY2spLiBUaGVzZSBjYW4gYmUgc2FmZWx5IHNob3J0ZW5lZCBhdCBoaWdoZXIKKwkgKiBQSU8gbW9kZXMuIFRoZSBESU9SL0RJT1cgcHVsc2Ugd2lkdGggYW5kIHJlY292ZXJ5IHRpbWVzIG9ubHkKKwkgKiBhcHBseSB0byBQSU8gbW9kZXMsIG5vdCB0byB0aGUgRE1BIG1vZGVzLgorCSAqLworCisJLyoKKwkgKiBFbmFibGUgcG9ydCAweDQ0LiBUaGUgSVQ4MTcyRyBzcGVjIGlzIGNvbmZ1c2VkOyBpdCBjYWxscworCSAqIHRoaXMgcmVnaXN0ZXIgdGhlICJTbGF2ZSBJREUgVGltaW5nIFJlZ2lzdGVyIiwgYnV0IGluIGZhY3QsCisJICogaXQgY29udHJvbHMgdGltaW5nIGZvciBib3RoIG1hc3RlciBhbmQgc2xhdmUgZHJpdmVzLgorCSAqLworCWRyaXZlX2VuYWJsZXMgfD0gMHg0MDAwOworCisJaWYgKGlzX3NsYXZlKSB7CisJCWRyaXZlX2VuYWJsZXMgJj0gMHhjMDA2OworCQlpZiAocGlvID4gMSkKKwkJCS8qIGVuYWJsZSBwcmVmZXRjaCBhbmQgSU9SRFkgc2FtcGxlLXBvaW50ICovCisJCQlkcml2ZV9lbmFibGVzIHw9IDB4MDA2MDsKKwl9IGVsc2UgeworCQlkcml2ZV9lbmFibGVzICY9IDB4YzA2MDsKKwkJaWYgKHBpbyA+IDEpCisJCQkvKiBlbmFibGUgcHJlZmV0Y2ggYW5kIElPUkRZIHNhbXBsZS1wb2ludCAqLworCQkJZHJpdmVfZW5hYmxlcyB8PSAweDAwMDY7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MCwgZHJpdmVfZW5hYmxlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHU4IGl0ODE3Ml9kbWFfMl9waW8gKHU4IHhmZXJfcmF0ZSkKK3sKKwlzd2l0Y2goeGZlcl9yYXRlKSB7CisJCWNhc2UgWEZFUl9VRE1BXzU6CisJCWNhc2UgWEZFUl9VRE1BXzQ6CisJCWNhc2UgWEZFUl9VRE1BXzM6CisJCWNhc2UgWEZFUl9VRE1BXzI6CisJCWNhc2UgWEZFUl9VRE1BXzE6CisJCWNhc2UgWEZFUl9VRE1BXzA6CisJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJY2FzZSBYRkVSX1BJT180OgorCQkJcmV0dXJuIDQ7CisJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJY2FzZSBYRkVSX1BJT18zOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgWEZFUl9TV19ETUFfMjoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJY2FzZSBYRkVSX1NXX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzA6CisJCWNhc2UgWEZFUl9QSU9fMToKKwkJY2FzZSBYRkVSX1BJT18wOgorCQljYXNlIFhGRVJfUElPX1NMT1c6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKGl0ODE3Ml9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisJaW50IGFfc3BlZWQJCT0gMyA8PCAoZHJpdmUtPmRuICogNCk7CisJaW50IHVfZmxhZwkJPSAxIDw8IGRyaXZlLT5kbjsKKwlpbnQgdV9zcGVlZAkJPSAwOworCXU4IHJlZzQ4LCByZWc0YTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgJnJlZzQ4KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NGEsICZyZWc0YSk7CisKKyAgICAvKgorICAgICAqIFNldHRpbmcgdGhlIERNQSBjeWNsZSB0aW1lIHRvIDIgb3IgMyBQQ0kgY2xvY2tzICg2MCBhbmQgOTEgbnNlYworICAgICAqIGF0IDMzIE1IeiBQQ0kgY2xvY2spIHNlZW1zIHRvIGNhdXNlIEJhZENSQyBlcnJvcnMgZHVyaW5nIERNQQorICAgICAqIHRyYW5zZmVycyBvbiBzb21lIGRyaXZlcywgZXZlbiB0aG91Z2ggYm90aCBudW1iZXJzIG1lZXQgdGhlIG1pbmltdW0KKyAgICAgKiBBVEFQSS00IHNwZWMgb2YgNzMgYW5kIDU0IG5zZWMgZm9yIFVETUEgMSBhbmQgMiByZXNwZWN0aXZlbHkuCisgICAgICogU28gdGhlIGZhc3RlciB0aW1lcyBhcmUganVzdCBjb21tZW50ZWQgb3V0IGhlcmUuIFRoZSBnb29kIG5ld3MgaXMKKyAgICAgKiB0aGF0IHRoZSBzbG93ZXIgY3ljbGUgdGltZSBoYXMgdmVyeSBsaXR0bGUgYWZmZWN0IG9uIHRyYW5zZmVyCisgICAgICogcGVyZm9ybWFuY2UuCisgICAgICovCisgICAgCisJc3dpdGNoKHNwZWVkKSB7CisJCWNhc2UgWEZFUl9VRE1BXzQ6CisJCWNhc2UgWEZFUl9VRE1BXzI6CS8vdV9zcGVlZCA9IDIgPDwgKGRyaXZlLT5kbiAqIDQpOyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfNToKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMToJLy91X3NwZWVkID0gMSA8PCAoZHJpdmUtPmRuICogNCk7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV8wOgl1X3NwZWVkID0gMCA8PCAoZHJpdmUtPmRuICogNCk7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzI6CisJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJY2FzZSBYRkVSX01XX0RNQV8wOgorCQljYXNlIFhGRVJfU1dfRE1BXzI6CWJyZWFrOworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzA6CWJyZWFrOworCQlkZWZhdWx0OgkJcmV0dXJuIC0xOworCX0KKworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCByZWc0OCB8IHVfZmxhZyk7CisJCXJlZzRhICY9IH5hX3NwZWVkOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDRhLCByZWc0YSB8IHVfc3BlZWQpOworCX0gZWxzZSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4ICYgfnVfZmxhZyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOworCX0KKworCWl0ODE3Ml90dW5lX2RyaXZlKGRyaXZlLCBpdDgxNzJfZG1hXzJfcGlvKHNwZWVkKSk7CisJcmV0dXJuIChpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCkpOworfQorCitzdGF0aWMgaW50IGl0ODE3Ml9jb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBpdDgxNzJfcmF0ZW1hc2soZHJpdmUpKTsKKworCWlmICghKHNwZWVkKSkgeworCQl1OCB0c3BlZWQgPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDI1NSwgNCwgTlVMTCk7CisJCXNwZWVkID0gaXQ4MTcyX2RtYV8yX3BpbyhYRkVSX1BJT18wICsgdHNwZWVkKTsKKwl9CisKKwkodm9pZCkgaXQ4MTcyX3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJZHJpdmUtPmluaXRfc3BlZWQgPSAwOworCisJaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGl0ODE3Ml9jb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJCX0KKworCQlnb3RvIGZhc3RfYXRhX3BpbzsKKworCX0gZWxzZSBpZiAoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSB7CitmYXN0X2F0YV9waW86CisJCWl0ODE3Ml90dW5lX2RyaXZlKGRyaXZlLCA1KTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9pdDgxNzIgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgY2hhciBwcm9naWY7CisgICAgCisJLyoKKwkgKiBQbGFjZSBib3RoIElERSBpbnRlcmZhY2VzIGludG8gUENJICJuYXRpdmUiIG1vZGUKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJvZ2lmKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUFJPRywgcHJvZ2lmIHwgMHgwNSk7ICAgIAorCisJcmV0dXJuIElUODE3Ml9JREVfSVJROworfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfaXQ4MTcyIChpZGVfaHdpZl90ICpod2lmKQoreworCXN0cnVjdCBwY2lfZGV2KiBkZXYgPSBod2lmLT5wY2lfZGV2OworCXVuc2lnbmVkIGxvbmcgY21kQmFzZSwgY3RybEJhc2U7CisgICAgCisJaHdpZi0+YXV0b2RtYSA9IDA7CisJaHdpZi0+dHVuZXByb2MgPSAmaXQ4MTcyX3R1bmVfZHJpdmU7CisJaHdpZi0+c3BlZWRwcm9jID0gJml0ODE3Ml90dW5lX2NoaXBzZXQ7CisKKwljbWRCYXNlID0gZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwljdHJsQmFzZSA9IGRldi0+cmVzb3VyY2VbMV0uc3RhcnQ7CisgICAgCisJaWRlX2luaXRfaHdpZl9wb3J0cygmaHdpZi0+aHcsIGNtZEJhc2UsIGN0cmxCYXNlIHwgMiwgTlVMTCk7CisJbWVtY3B5KGh3aWYtPmlvX3BvcnRzLCBod2lmLT5ody5pb19wb3J0cywgc2l6ZW9mKGh3aWYtPmlvX3BvcnRzKSk7CisJaHdpZi0+bm9wcm9iZSA9IDA7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCWh3aWYtPnVsdHJhX21hc2sgPSAweDA3OworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA2OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA0OworCisJaHdpZi0+aWRlX2RtYV9jaGVjayA9ICZpdDgxNzJfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgaXQ4MTcyX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIklUODE3MkciLAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2l0ODE3MiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9pdDgxNzIsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4MDAsMHgwMCwweDAwfSwgezB4NDAsMHgwMCwweDAxfX0sCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGl0ODE3Ml9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisgICAgICAgIGlmICgoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpIHx8CisgICAgICAgICAgICAoISgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpKSkpCisJCXJldHVybiAtRU5PREVWOyAvKiBJVDgxNzIgaXMgbW9yZSB0aGFuIGFuIElERSBjb250cm9sbGVyICovCisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJml0ODE3Ml9jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl0ODE3Ml9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lURSwgUENJX0RFVklDRV9JRF9JVEVfSVQ4MTcyRywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpdDgxNzJfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIklUODE3Ml9JREUiLAorCS5pZF90YWJsZQk9IGl0ODE3Ml9wY2lfdGJsLAorCS5wcm9iZQkJPSBpdDgxNzJfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IGl0ODE3Ml9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXQ4MTcyX2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiU3RldmVMQG12aXN0YS5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIElURSA4MTcyIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYyBiL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1YTMyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvbnM4NzQxNS5jCQlWZXJzaW9uIDIuMDAgIFNlcC4gMTAsIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OAlNYXJrIExvcmQgPG1sb3JkQHBvYm94LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMTk5OAkJRWRkaWUgQy4gRG9zdCA8ZWNkQHNreW5ldC5iZT4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQJCUdyYW50IEdydW5kbGVyIDxncnVuZGxlciBhdCBwYXJpc2MtbGludXgub3JnPgorICoKKyAqIEluc3BpcmVkIGJ5IGFuIGVhcmxpZXIgZWZmb3J0IGZyb20gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfU1VQRVJJTworLyogU1VQRVJJTyA4NzU2MCBpcyBhIFBvUyBjaGlwIHRoYXQgTmF0U2VtIGRlbmllcyBleGlzdHMuCisgKiBVbmZvcnR1bmF0ZWx5LCBpdCdzIGJ1aWx0LWluIG9uIGFsbCBBc3Ryby1iYXNlZCBQQS1SSVNDIHdvcmtzdGF0aW9ucworICogd2hpY2ggdXNlIHRoZSBpbnRlZ3JhdGVkIE5TODc1MTQgY2VsbCBmb3IgQ0QtUk9NIHN1cHBvcnQuCisgKiBpLmUgd2UgaGF2ZSB0byBzdXBwb3J0IGZvciBDRC1ST00gaW5zdGFsbHMuCisgKiBTZWUgZHJpdmVycy9wYXJpc2Mvc3VwZXJpby5jIGZvciBtb3JlIGdvcnkgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGFzbS9zdXBlcmlvLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1cGVyaW9faWRlX3N0YXR1c1syXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1cGVyaW9faWRlX3NlbGVjdFsyXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1cGVyaW9faWRlX2RtYV9zdGF0dXNbMl07CisKKyNkZWZpbmUgU1VQRVJJT19JREVfTUFYX1JFVFJJRVMgMjUKKworLyogQmVjYXVzZSBvZiBhIGRlZmVjdCBpbiBTdXBlciBJL08sIGFsbCByZWFkcyBvZiB0aGUgUENJIERNQSBzdGF0dXMgCisgKiByZWdpc3RlcnMsIElERSBzdGF0dXMgcmVnaXN0ZXIgYW5kIHRoZSBJREUgc2VsZWN0IHJlZ2lzdGVyIG5lZWQgdG8gYmUgCisgKiByZXRyaWVkCisgKi8KK3N0YXRpYyB1OCBzdXBlcmlvX2lkZV9pbmIgKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAocG9ydCA9PSBzdXBlcmlvX2lkZV9zdGF0dXNbMF0gfHwKKwkgICAgcG9ydCA9PSBzdXBlcmlvX2lkZV9zdGF0dXNbMV0gfHwKKwkgICAgcG9ydCA9PSBzdXBlcmlvX2lkZV9zZWxlY3RbMF0gfHwKKwkgICAgcG9ydCA9PSBzdXBlcmlvX2lkZV9zZWxlY3RbMV0gfHwKKwkgICAgcG9ydCA9PSBzdXBlcmlvX2lkZV9kbWFfc3RhdHVzWzBdIHx8CisJICAgIHBvcnQgPT0gc3VwZXJpb19pZGVfZG1hX3N0YXR1c1sxXSkgeworCQl1OCB0bXA7CisJCWludCByZXRyaWVzID0gU1VQRVJJT19JREVfTUFYX1JFVFJJRVM7CisKKwkJLyogcHJpbnRrKCIgWyByZWFkaW5nIHBvcnQgMHgleCB3aXRoIHJldHJ5IF0gIiwgcG9ydCk7ICovCisKKwkJZG8geworCQkJdG1wID0gaW5iKHBvcnQpOworCQkJaWYgKHRtcCA9PSAwKQorCQkJCXVkZWxheSg1MCk7CisJCX0gd2hpbGUgKHRtcCA9PSAwICYmIHJldHJpZXMtLSA+IDApOworCisJCXJldHVybiB0bXA7CisJfQorCisJcmV0dXJuIGluYihwb3J0KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHN1cGVyaW9faWRlX2luaXRfaW9wcyAoc3RydWN0IGh3aWZfcyAqaHdpZikKK3sKKwl1MzIgYmFzZSwgZG1hYmFzZTsKKwl1OCB0bXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBod2lmLT5wY2lfZGV2OworCXU4IHBvcnQgPSBod2lmLT5jaGFubmVsOworCisJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBwb3J0ICogMikgJiB+MzsKKwlkbWFiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICYgfjM7CisKKwlzdXBlcmlvX2lkZV9zdGF0dXNbcG9ydF0gPSBiYXNlICsgSURFX1NUQVRVU19PRkZTRVQ7CisJc3VwZXJpb19pZGVfc2VsZWN0W3BvcnRdID0gYmFzZSArIElERV9TRUxFQ1RfT0ZGU0VUOworCXN1cGVyaW9faWRlX2RtYV9zdGF0dXNbcG9ydF0gPSBkbWFiYXNlICsgKCFwb3J0ID8gMiA6IDB4YSk7CisKKwkvKiBDbGVhciBlcnJvci9pbnRlcnJ1cHQsIGVuYWJsZSBkbWEgKi8KKwl0bXAgPSBzdXBlcmlvX2lkZV9pbmIoc3VwZXJpb19pZGVfZG1hX3N0YXR1c1twb3J0XSk7CisJb3V0Yih0bXAgfCAweDY2LCBzdXBlcmlvX2lkZV9kbWFfc3RhdHVzW3BvcnRdKTsKKworCS8qIFdlIG5lZWQgdG8gb3ZlcnJpZGUgaW5iIHRvIHdvcmthcm91bmQgYSBTdXBlcklPIGVycmF0YSAqLworCWh3aWYtPklOQiA9IHN1cGVyaW9faWRlX2luYjsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaW9wc19uczg3NDE1KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWYgKFBDSV9TTE9UKGh3aWYtPnBjaV9kZXYtPmRldmZuKSA9PSAweEUpIHsKKwkJLyogQnVpbHQtaW4gLSBhc3N1bWUgaXQncyB1bmRlciBzdXBlcmlvLiAqLworCQlzdXBlcmlvX2lkZV9pbml0X2lvcHMoaHdpZik7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnM4NzQxNV9jb3VudCA9IDAsIG5zODc0MTVfY29udHJvbFtNQVhfSFdJRlNdID0geyAwIH07CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZWl0aGVyIGVuYWJsZXMvZGlzYWJsZXMgKGFjY29yZGluZyB0byBkcml2ZS0+cHJlc2VudCkKKyAqIHRoZSBJUlEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0IChIV0lGKGRyaXZlKSksCisgKiBhbmQgc2VsZWN0cyBlaXRoZXIgUElPIG9yIERNQSBoYW5kc2hha2luZyBmb3IgdGhlIG5leHQgSS9PIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgbnM4NzQxNV9wcmVwYXJlX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCB1c2VfZG1hKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBpbnQgYml0LCBvdGhlciwgbmV3LCAqb2xkID0gKHVuc2lnbmVkIGludCAqKSBod2lmLT5zZWxlY3RfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW5ldyA9ICpvbGQ7CisKKwkvKiBBZGp1c3QgSVJRIGVuYWJsZSBiaXQgKi8KKwliaXQgPSAxIDw8ICg4ICsgaHdpZi0+Y2hhbm5lbCk7CisJbmV3ID0gZHJpdmUtPnByZXNlbnQgPyAobmV3ICYgfmJpdCkgOiAobmV3IHwgYml0KTsKKworCS8qIFNlbGVjdCBQSU8gb3IgRE1BLCBETUEgbWF5IG9ubHkgYmUgc2VsZWN0ZWQgZm9yIG9uZSBkcml2ZS9jaGFubmVsLiAqLworCWJpdCAgID0gMSA8PCAoMjAgKyBkcml2ZS0+c2VsZWN0LmIudW5pdCAgICAgICArIChod2lmLT5jaGFubmVsIDw8IDEpKTsKKwlvdGhlciA9IDEgPDwgKDIwICsgKDEgLSBkcml2ZS0+c2VsZWN0LmIudW5pdCkgKyAoaHdpZi0+Y2hhbm5lbCA8PCAxKSk7CisJbmV3ID0gdXNlX2RtYSA/ICgobmV3ICYgfm90aGVyKSB8IGJpdCkgOiAobmV3ICYgfmJpdCk7CisKKwlpZiAobmV3ICE9ICpvbGQpIHsKKwkJdW5zaWduZWQgY2hhciBzdGF0OworCisJCS8qCisJCSAqIERvbid0IGNoYW5nZSBETUEgZW5naW5lIHNldHRpbmdzIHdoaWxlIFdyaXRlIEJ1ZmZlcnMKKwkJICogYXJlIGJ1c3kuCisJCSAqLworCQkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQzLCAmc3RhdCk7CisJCXdoaWxlIChzdGF0ICYgMHgwMykgeworCQkJdWRlbGF5KDEpOworCQkJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MywgJnN0YXQpOworCQl9CisKKwkJKm9sZCA9IG5ldzsKKwkJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCBuZXcpOworCisJCS8qCisJCSAqIEFuZCBsZXQgdGhpbmdzIHNldHRsZS4uLgorCQkgKi8KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG5zODc0MTVfc2VsZWN0cHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCW5zODc0MTVfcHJlcGFyZV9kcml2ZSAoZHJpdmUsIGRyaXZlLT51c2luZ19kbWEpOworfQorCitzdGF0aWMgaW50IG5zODc0MTVfaWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICAgICAgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwOworCisJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CisJZG1hX3N0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisJLyogZ2V0IGRtYSBjb21tYW5kIG1vZGUgKi8KKwlkbWFfY21kID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9jb21tYW5kKTsKKwkvKiBzdG9wIERNQSAqLworCWh3aWYtPk9VVEIoZG1hX2NtZCAmIH4xLCBod2lmLT5kbWFfY29tbWFuZCk7CisJLyogZnJvbSBFUlJBVEE6IGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLworCWRtYV9jbWQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX2NvbW1hbmQpOworCWh3aWYtPk9VVEIoZG1hX2NtZHw2LCBod2lmLT5kbWFfY29tbWFuZCk7CisJLyogYW5kIGZyZWUgYW55IERNQSByZXNvdXJjZXMgKi8KKwlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisJLyogdmVyaWZ5IGdvb2QgRE1BIHN0YXR1cyAqLworCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0OworfQorCitzdGF0aWMgaW50IG5zODc0MTVfaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJLyogc2VsZWN0IERNQSB4ZmVyICovCisJbnM4NzQxNV9wcmVwYXJlX2RyaXZlKGRyaXZlLCAxKTsKKwlpZiAoIWlkZV9kbWFfc2V0dXAoZHJpdmUpKQorCQlyZXR1cm4gMDsKKwkvKiBETUEgZmFpbGVkOiBzZWxlY3QgUElPIHhmZXIgKi8KKwluczg3NDE1X3ByZXBhcmVfZHJpdmUoZHJpdmUsIDApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG5zODc0MTVfaWRlX2RtYV9jaGVjayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCisJCXJldHVybiBIV0lGKGRyaXZlKS0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJcmV0dXJuIF9faWRlX2RtYV9jaGVjayhkcml2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfbnM4NzQxNSAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgY3RybCwgdXNpbmdfaW50YTsKKwl1OCBwcm9naWY7CisjaWZkZWYgX19zcGFyY192OV9fCisJaW50IHRpbWVvdXQ7CisJdTggc3RhdDsKKyNlbmRpZgorCisJaHdpZi0+YXV0b2RtYSA9IDA7CisJaHdpZi0+c2VsZWN0cHJvYyA9ICZuczg3NDE1X3NlbGVjdHByb2M7CisKKwkvKgorCSAqIFdlIGNhbm5vdCBwcm9iZSBmb3IgSVJROiBib3RoIHBvcnRzIHNoYXJlIGNvbW1vbiBJUlEgb24gSU5UQS4KKwkgKiBBbHNvLCBsZWF2ZSBJUlEgbWFza2VkIGR1cmluZyBkcml2ZSBwcm9iaW5nLCB0byBwcmV2ZW50IGluZmluaXRlCisJICogaW50ZXJydXB0cyBmcm9tIGEgcG90ZW50aWFsbHkgZmxvYXRpbmcgSU5UQS4uCisJICoKKwkgKiBJUlFzIGdldCB1bm1hc2tlZCBpbiBzZWxlY3Rwcm9jIHdoZW4gZHJpdmUgaXMgZmlyc3QgdXNlZC4KKwkgKi8KKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJmN0cmwpOworCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4MDksICZwcm9naWYpOworCS8qIGlzIGlycSBpbiAibmF0aXZlIiBtb2RlPyAqLworCXVzaW5nX2ludGEgPSBwcm9naWYgJiAoMSA8PCAoaHdpZi0+Y2hhbm5lbCA8PCAxKSk7CisJaWYgKCF1c2luZ19pbnRhKQorCQl1c2luZ19pbnRhID0gY3RybCAmICgxIDw8ICg0ICsgaHdpZi0+Y2hhbm5lbCkpOworCWlmIChod2lmLT5tYXRlKSB7CisJCWh3aWYtPnNlbGVjdF9kYXRhID0gaHdpZi0+bWF0ZS0+c2VsZWN0X2RhdGE7CisJfSBlbHNlIHsKKwkJaHdpZi0+c2VsZWN0X2RhdGEgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJJm5zODc0MTVfY29udHJvbFtuczg3NDE1X2NvdW50KytdOworCQljdHJsIHw9ICgxIDw8IDgpIHwgKDEgPDwgOSk7CS8qIG1hc2sgYm90aCBJUlFzICovCisJCWlmICh1c2luZ19pbnRhKQorCQkJY3RybCAmPSB+KDEgPDwgNik7CS8qIHVubWFzayBJTlRBICovCisJCSooKHVuc2lnbmVkIGludCAqKWh3aWYtPnNlbGVjdF9kYXRhKSA9IGN0cmw7CisJCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgY3RybCk7CisKKwkJLyoKKwkJICogU2V0IHByZWZldGNoIHNpemUgdG8gNTEyIGJ5dGVzIGZvciBib3RoIHBvcnRzLAorCQkgKiBidXQgZG9uJ3QgdHVybiBvbi9vZmYgcHJlZmV0Y2hpbmcgaGVyZS4KKwkJICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTUsIDB4ZWUpOworCisjaWZkZWYgX19zcGFyY192OV9fCisJCS8qCisJCSAqIFhYWDogUmVzZXQgdGhlIGRldmljZSwgaWYgd2UgZG9uJ3QgaXQgd2lsbCBub3QgcmVzcG9uZAorCQkgKiAgICAgIHRvIFNFTEVDVF9EUklWRSgpIHByb3Blcmx5IGR1cmluZyBmaXJzdCBwcm9iZV9od2lmKCkuCisJCSAqLworCQl0aW1lb3V0ID0gMTAwMDA7CisJCWh3aWYtPk9VVEIoMTIsIGh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0pOworCQl1ZGVsYXkoMTApOworCQlod2lmLT5PVVRCKDgsIGh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0pOworCQlkbyB7CisJCQl1ZGVsYXkoNTApOworCQkJc3RhdCA9IGh3aWYtPklOQihod2lmLT5pb19wb3J0c1tJREVfU1RBVFVTX09GRlNFVF0pOworICAgICAgICAgICAgICAgIAlpZiAoc3RhdCA9PSAweGZmKQorICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAJfSB3aGlsZSAoKHN0YXQgJiBCVVNZX1NUQVQpICYmIC0tdGltZW91dCk7CisjZW5kaWYKKwl9CisKKwlpZiAoIXVzaW5nX2ludGEpCisJCWh3aWYtPmlycSA9IGlkZV9kZWZhdWx0X2lycShod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdKTsKKwllbHNlIGlmICghaHdpZi0+aXJxICYmIGh3aWYtPm1hdGUgJiYgaHdpZi0+bWF0ZS0+aXJxKQorCQlod2lmLT5pcnEgPSBod2lmLT5tYXRlLT5pcnE7CS8qIHNoYXJlIElSUSB3aXRoIG1hdGUgKi8KKworCWlmICghaHdpZi0+ZG1hX2Jhc2UpCisJCXJldHVybjsKKworCWh3aWYtPk9VVEIoMHg2MCwgaHdpZi0+ZG1hX3N0YXR1cyk7CisJaHdpZi0+ZG1hX3NldHVwID0gJm5zODc0MTVfaWRlX2RtYV9zZXR1cDsKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJm5zODc0MTVfaWRlX2RtYV9jaGVjazsKKwlod2lmLT5pZGVfZG1hX2VuZCA9ICZuczg3NDE1X2lkZV9kbWFfZW5kOworCisJaWYgKCFub2F1dG9kbWEpCisJCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IG5zODc0MTVfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJOUzg3NDE1IiwKKyNpZmRlZiBDT05GSUdfU1VQRVJJTworCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfbnM4NzQxNSwKKyNlbmRpZgorCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfbnM4NzQxNSwKKwkuY2hhbm5lbHMJPSAyLAorCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkuYm9vdGFibGUJPSBPTl9CT0FSRCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5zODc0MTVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZuczg3NDE1X2NoaXBzZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbnM4NzQxNV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TXzg3NDE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5zODc0MTVfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIk5TODc0MTVfSURFIiwKKwkuaWRfdGFibGUJPSBuczg3NDE1X3BjaV90YmwsCisJLnByb2JlCQk9IG5zODc0MTVfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IG5zODc0MTVfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5zODc0MTVfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIExvcmQsIEVkZGllIERvc3QsIEFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIE5TODc0MTUgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jIGIvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjRmZDkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jCQlWZXJzaW9uIDAuNwlTZXB0IDEwLCAyMDAyCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMgKHNlZSBiZWxvdykKKyAqLworCisvKgorICogQXV0aG9yczoKKyAqIEphcm9taXIgS291dGVrIDxtaXJpQHB1bmtuZXQuY3o+LAorICogSmFuIEhhcmtlcyA8amFoYXJrZXNAY3dpLm5sPiwKKyAqIE1hcmsgTG9yZCA8bWxvcmRAcG9ib3guY29tPgorICogU29tZSBwYXJ0cyBvZiBjb2RlIGFyZSBmcm9tIGFsaTE0eHguYyBhbmQgZnJvbSByejEwMDAuYy4KKyAqCisgKiBPUFRpIGlzIHRyYWRlbWFyayBvZiBPUFRpLCBPY3RlayBpcyB0cmFkZW1hcmsgb2YgT2N0ZWsuCisgKgorICogSSB1c2VkIGRvY3MgZnJvbSBPUFRpIGRhdGFib29rLCBmcm9tIGZ0cC5vcHRpLmNvbSwgZmlsZSA5MTIzLTAwMDIucHMKKyAqIGFuZCBkaXNhc3NlbWJsZWQvdHJhY2VkIHNldHVwdmljLmV4ZSAoRE9TIHByb2dyYW0pLgorICogSXQgaW5jcmVhc2VzIGtlcm5lbCBjb2RlIGFib3V0IDIga0IuCisgKiBJIGRvbid0IGhhdmUgdGhpcyBjYXJkIG5vIG1vcmUsIGJ1dCBJIGhvcGUgSSBjYW4gZ2V0IHNvbWUgaW4gY2FzZQorICogb2YgbmVlZGVkIGRldmVsb3BtZW50LgorICogTXkgY2FyZCBpcyBPY3RlayBQSURFIDEuMDEgKG9uIGNhcmQpIG9yIE9QVGlWaUMgKHByb2dyYW0pLgorICogSXQgaGFzIGEgcGxhY2UgZm9yIGEgc2Vjb25kYXJ5IGNvbm5lY3RvciBpbiBjaXJjdWl0LCBidXQgbm90aGluZworICogaXMgdGhlcmUuIEFsc28gQklPUyBzYXlzIG5vIGFkZHJlc3MgZm9yCisgKiBzZWNvbmRhcnkgY29udHJvbGxlciAoc2VlIGJlbGxvdyBpbiBpZGVfaW5pdF9vcHRpNjIxKS4KKyAqIEkndmUgb25seSB0ZXN0ZWQgdGhpcyBvbiBteSBzeXN0ZW0sIHdoaWNoIG9ubHkgaGFzIG9uZSBkaXNrLgorICogSXQncyBXZXN0ZXJuIERpZ2l0YWwgV0RBQzI4NTAsIHdpdGggUElPIG1vZGUgMy4gVGhlIFBDSSBidXMKKyAqIGlzIGF0IDIwIE1IeiAoSSBoYXZlIERYMi84MCwgSSB0cmllZCBQQ0kgYXQgNDAsIGJ1dCBJIGdvdCByYW5kb20KKyAqIGxvY2t1cHMpLiBJIHRyaWVkIHRoZSBPQ1RFSyBkb3VibGUgc3BlZWQgQ0QtUk9NIGFuZAorICogaXQgZG9lcyBub3Qgd29yayEgQnV0IEkgY2FuJ3QgYm9vdCBET1MgYWxzbywgc28gaXQncyBwcm9iYWJseQorICogaGFyZHdhcmUgZmF1bHQuIEkgaGF2ZSBjb25uZWN0ZWQgQ29ubmVyIDgwTUIsIHRoZSBTZWFnYXRlIDg1ME1CIChubworICogcHJvYmxlbXMpIGFuZCBTZWFnYXRlIDFHQiAoYXMgc2xhdmUsIFdEIGFzIG1hc3RlcikuIE15IGV4cGVyaWVuY2VzCisgKiB3aXRoIHRoZSB0aGlyZCwgMUdCIGRyaXZlOiBJIGdvdCAzTUIvcyAoaGRwYXJtKSwgYnV0IHNvbWV0aW1lcworICogaXQgc2xvd3MgdG8gYWJvdXQgMTAwa0IvcyEgSSBkb24ndCBrbm93IHdoeSBhbmQgSSBoYXZlCisgKiBub3QgdGhpcyBkcml2ZSBub3csIHNvIEkgY2FuJ3QgdHJ5IGl0IGFnYWluLgorICogSSB3cml0ZSB0aGlzIGRyaXZlciBiZWNhdXNlIEkgbG9zdCB0aGUgcGFwZXIgKCJtYW51YWwiKSB3aXRoCisgKiBzZXR0aW5ncyBvZiBqdW1wZXJzIG9uIHRoZSBjYXJkIGFuZCBJIGhhdmUgdG8gYm9vdCBMaW51eCB3aXRoCisgKiBMb2FkbGluIGV4Y2VwdCBMSUxPLCBjYXVzZSBJIGhhdmUgdG8gcnVuIHRoZSBzZXR1cHZpYy5leGUgcHJvZ3JhbQorICogYWxyZWFkeSBvciBJIGdldCBkaXNrIGVycm9ycyAobXkgdGVzdDogcnBtIC1WZgorICogL3Vzci9YMTFSNi9iaW4vWEY4Nl9TVkdBIC0gb3IgYW55IGJpZyBmaWxlKS4KKyAqIFNvbWUgbnVtYmVycyBmcm9tIGhkcGFybSAtdCAvZGV2L2hkYToKKyAqIFRpbWluZyBidWZmZXItY2FjaGUgcmVhZHM6ICAgMzIgTUIgaW4gIDMuMDIgc2Vjb25kcyA9MTAuNjAgTUIvc2VjCisgKiBUaW1pbmcgYnVmZmVyZWQgZGlzayByZWFkczogIDE2IE1CIGluICA1LjUyIHNlY29uZHMgPSAyLjkwIE1CL3NlYworICogSSBoYXZlIDQgTWVncy9zIGJlZm9yZSwgYnV0IEkgZG9uJ3Qga25vdyB3aHkgKG1heWJlIGNoYW5nZXMKKyAqIGluIGhkcGFybSB0ZXN0KS4KKyAqIEFmdGVyIHJlbGVhc2Ugb2YgMC4xLCBJIGdvdCBzb21lIHN1Y2Nlc3NmdWwgcmVwb3J0cywgc28gaXQgbWlnaHQgd29yay4KKyAqCisgKiBUaGUgbWFpbiBwcm9ibGVtIHdpdGggT1BUaSBpcyB0aGF0IHNvbWUgdGltaW5ncyBmb3IgbWFzdGVyCisgKiBhbmQgc2xhdmUgbXVzdCBiZSB0aGUgc2FtZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIG1hc3RlcgorICogUElPIDMgYW5kIHNsYXZlIFBJTyAwLCBkcml2ZXIgaGF2ZSB0byBzZXQgc29tZSB0aW1pbmdzIG9mCisgKiBtYXN0ZXIgZm9yIFBJTyAwLiBTZWNvbmQgcHJvYmxlbSBpcyB0aGF0IG9wdGk2MjFfdHVuZV9kcml2ZQorICogZ290IG9ubHkgb25lIGRyaXZlIHRvIHNldCwgYnV0IGhhdmUgdG8gc2V0IGJvdGggZHJpdmVzLgorICogVGhpcyBpcyBzb2x2ZWQgaW4gY29tcHV0ZV9waW9zLiBJZiB5b3UgZG9uJ3Qgc2V0CisgKiB0aGUgc2Vjb25kIGRyaXZlLCBjb21wdXRlX3Bpb3MgdXNlIGlkZV9nZXRfYmVzdF9waW9fbW9kZQorICogZm9yIGF1dG9zZWxlY3QgbW9kZSAoeW91IGNhbiBjaGFuZ2UgaXQgdG8gUElPIDAsIGlmIHlvdSB3YW50KS4KKyAqIElmIHlvdSB0aGVuIHNldCB0aGUgc2Vjb25kIGRyaXZlIHRvIGFub3RoZXIgUElPLCB0aGUgb2xkIHZhbHVlCisgKiAoYXV0b21hdGljYWxseSBzZWxlY3RlZCkgd2lsbCBiZSBvdmVycmlkZWQgYnkgeW91cnMuCisgKiBUaGVyZSBpcyBhIDI1LzMzTUh6IHN3aXRjaCBpbiBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciwgYnV0IGRyaXZlciBpcyB3cml0dGVuIGZvciB1c2UgYXQgYW55IGZyZXF1ZW5jeSB3aGljaCBnZXQKKyAqICh1c2UgaWRlYnVzPXh4IHRvIHNlbGVjdCBQQ0kgYnVzIHNwZWVkKS4KKyAqIFVzZSBpZGUwPWF1dG90dW5lIGZvciBhdXRvbWF0aWNhbCB0dW5lIG9mIHRoZSBQSU8gbW9kZXMuCisgKiBJZiB5b3UgZ2V0IHN0cmFuZ2UgcmVzdWx0cywgZG8gbm90IHVzZSB0aGlzIGFuZCBzZXQgUElPIG1hbnVhbGx5CisgKiBieSBoZHBhcm0uCisgKgorICogVmVyc2lvbiAwLjEsIE5vdiA4LCAxOTk2CisgKiBieSBKYXJvbWlyIEtvdXRlaywgZm9yIDIuMS44LiAKKyAqIEluaXRpYWwgdmVyc2lvbiBvZiBkcml2ZXIuCisgKiAKKyAqIFZlcnNpb24gMC4yCisgKiBOdW1iZXIgMC4yIHNraXBwZWQuCisgKgorICogVmVyc2lvbiAwLjMsIE5vdiAyOSwgMTk5NworICogYnkgTWFyayBMb3JkIChwcm9iYWJseSksIGZvciAyLjEuNjgKKyAqIFVwZGF0ZXMgZm9yIHVzZSB3aXRoIG5ldyBJREUgYmxvY2sgZHJpdmVyLgorICoKKyAqIFZlcnNpb24gMC40LCBEZWMgMTQsIDE5OTcKKyAqIGJ5IEphbiBIYXJrZXMKKyAqIEZpeGVkIHNvbWUgZXJyb3JzIGFuZCBjbGVhbmVkIHRoZSBjb2RlLgorICoKKyAqIFZlcnNpb24gMC41LCBKYW4gMiwgMTk5OAorICogYnkgSmFyb21pciBLb3V0ZWsKKyAqIFVwZGF0ZXMgZm9yIHVzZSB3aXRoIChhZ2FpbikgbmV3IElERSBibG9jayBkcml2ZXIuCisgKiBVcGRhdGUgb2YgZG9jdW1lbnRhdGlvbi4KKyAqIAorICogVmVyc2lvbiAwLjYsIEphbiAyLCAxOTk5CisgKiBieSBKYXJvbWlyIEtvdXRlaworICogUmV2ZXJzZWQgdG8gdmVyc2lvbiAwLjMgb2YgdGhlIGRyaXZlciwgYmVjYXVzZQorICogMC41IGRvZXNuJ3Qgd29yay4KKyAqLworCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworI2RlZmluZSBPUFRJNjIxX0RFQlVHCQkvKiBkZWZpbmUgZm9yIGRlYnVnIG1lc3NhZ2VzICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBPUFRJNjIxX01BWF9QSU8gMworLyogSW4gZmFjdCwgSSBkbyBub3QgaGF2ZSBhbnkgUElPIDQgZHJpdmUKKyAqIChhZGRyZXNzOiAyNSBucywgZGF0YTogNzAgbnMsIHJlY292ZXJ5OiAzNSBucyksCisgKiBidXQgT1BUaSA4MkM2MjEgaXMgcHJvZ3JhbW1hYmxlIGFuZCBpdCBjYW4gZG8gKG1pbmltYWwgdmFsdWVzKToKKyAqIG9uIDQwTUh6IFBDSSBidXMgKHB1bHNlIDI1IG5zKToKKyAqICBhZGRyZXNzOiAyNSBucywgZGF0YTogMjUgbnMsIHJlY292ZXJ5OiA1MCBuczsKKyAqIG9uIDIwTUh6IFBDSSBidXMgKHB1bHNlIDUwIG5zKToKKyAqICBhZGRyZXNzOiA1MCBucywgZGF0YTogNTAgbnMsIHJlY292ZXJ5OiAxMDAgbnMuCisgKi8KKworLyogI2RlZmluZSBSRUFEX1BSRUZFVENIIDAgKi8KKy8qIFVuY29tbWVudCBmb3IgZGlzYWJsZSByZWFkIHByZWZldGNoLgorICogVGhlcmUgaXMgc29tZSByZWFkcHJlZmV0Y2ggY2FwYXRpYmlsaXR5IGluIGhkcGFybSwKKyAqIGJ1dCB3aGVuIEkgdHlwZSBoZHBhcm0gLVAgMSAvZGV2L2hkYSwgSSBnb3QgZXJyb3JzCisgKiBhbmQgdGlsbCByZXNldCBkcml2ZSBpcyBpbmFjY2Vzc2libGUuCisgKiBUaGlzIChodykgcmVhZCBwcmVmZXRjaCBpcyBzYWZlIG9uIG15IGRyaXZlLgorICovCisKKyNpZm5kZWYgUkVBRF9QUkVGRVRDSAorI2RlZmluZSBSRUFEX1BSRUZFVENIIDB4NDAgLyogcmVhZCBwcmVmZXRjaCBpcyBlbmFibGVkICovCisjZW5kaWYgLyogZWxzZSByZWFkIHByZWZldGNoIGlzIGRpc2FibGVkICovCisKKyNkZWZpbmUgUkVBRF9SRUcgMAkvKiBpbmRleCBvZiBSZWFkIGN5Y2xlIHRpbWluZyByZWdpc3RlciAqLworI2RlZmluZSBXUklURV9SRUcgMQkvKiBpbmRleCBvZiBXcml0ZSBjeWNsZSB0aW1pbmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ05UUkxfUkVHIDMJLyogaW5kZXggb2YgQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTVFJBUF9SRUcgNQkvKiBpbmRleCBvZiBTdHJhcCByZWdpc3RlciAqLworI2RlZmluZSBNSVNDX1JFRyA2CS8qIGluZGV4IG9mIE1pc2NlbGxhbmVvdXMgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCByZWdfYmFzZTsKKworI2RlZmluZSBQSU9fTk9UX0VYSVNUIDI1NAorI2RlZmluZSBQSU9fRE9OVF9LTk9XIDI1NQorCisvKiB0aGVyZSBhcmUgc3RvcmVkIHBpbyBudW1iZXJzIGZyb20gb3RoZXIgY2FsbHMgb2Ygb3B0aTYyMV90dW5lX2RyaXZlICovCitzdGF0aWMgdm9pZCBjb21wdXRlX3Bpb3MoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCisvKiBTdG9yZSB2YWx1ZXMgaW50byBkcml2ZS0+ZHJpdmVfZGF0YQorICoJc2Vjb25kX2NvbnRyIC0gMCBmb3IgcHJpbWFyeSBjb250cm9sbGVyLCAxIGZvciBzZWNvbmRhcnkKKyAqCXNsYXZlX2RyaXZlIC0gMCAtPiBwaW8gaXMgZm9yIG1hc3RlciwgMSAtPiBwaW8gaXMgZm9yIHNsYXZlCisgKglwaW8gLSBQSU8gbW9kZSBmb3Igc2VsZWN0ZWQgZHJpdmUgKGZvciBvdGhlciB3ZSBkb24ndCBrbm93KQorICovCit7CisJaW50IGQ7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCisJZHJpdmUtPmRyaXZlX2RhdGEgPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgT1BUSTYyMV9NQVhfUElPLCBOVUxMKTsKKwlmb3IgKGQgPSAwOyBkIDwgMjsgKytkKSB7CisJCWRyaXZlID0gJmh3aWYtPmRyaXZlc1tkXTsKKwkJaWYgKGRyaXZlLT5wcmVzZW50KSB7CisJCQlpZiAoZHJpdmUtPmRyaXZlX2RhdGEgPT0gUElPX0RPTlRfS05PVykKKwkJCQlkcml2ZS0+ZHJpdmVfZGF0YSA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCBPUFRJNjIxX01BWF9QSU8sIE5VTEwpOworI2lmZGVmIE9QVEk2MjFfREVCVUcKKwkJCXByaW50aygiJXM6IFNlbGVjdGVkIFBJTyBtb2RlICVkXG4iLAorCQkJCWRyaXZlLT5uYW1lLCBkcml2ZS0+ZHJpdmVfZGF0YSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWRyaXZlLT5kcml2ZV9kYXRhID0gUElPX05PVF9FWElTVDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjbXB0X2NsayhpbnQgdGltZSwgaW50IGJ1c19zcGVlZCkKKy8qIFJldHVybnMgKHJvdW5kZWQgdXApIHRpbWUgaW4gY2xvY2tzIGZvciB0aW1lIGluIG5zLAorICogd2l0aCBidXNfc3BlZWQgaW4gTUh6LgorICogRXhhbXBsZTogYnVzX3NwZWVkID0gNDAgTUh6LCB0aW1lID0gODAgbnMKKyAqIDEwMDAvNDAgPSAyNSBucyAoY2xrIHZhbHVlKSwKKyAqIDgwLzI1ID0gMy4yLCByb3VuZGVkIHVwIHRvIDQgKEkgaG9wZSA7LSkpLgorICogVXNlIGlkZWJ1cz14eCB0byBzZWxlY3QgcmlnaHQgZnJlcXVlbmN5LgorICovCit7CisJcmV0dXJuICgodGltZSpidXNfc3BlZWQrOTk5KS8xMDAwKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcmVnKGlkZV9od2lmX3QgKmh3aWYsIHU4IHZhbHVlLCBpbnQgcmVnKQorLyogV3JpdGUgdmFsdWUgdG8gcmVnaXN0ZXIgcmVnLCBiYXNlIG9mIHJlZ2lzdGVyCisgKiBpcyBhdCByZWdfYmFzZSAoMHgxZjAgcHJpbWFyeSwgMHgxNzAgc2Vjb25kYXJ5LAorICogaWYgbm90IGNoYW5nZWQgYnkgUENJIGNvbmZpZ3VyYXRpb24pLgorICogVGhpcyBpcyBmcm9tIHNldHVwdmljLmV4ZSBwcm9ncmFtLgorICovCit7CisJaHdpZi0+SU5XKHJlZ19iYXNlKzEpOworCWh3aWYtPklOVyhyZWdfYmFzZSsxKTsKKwlod2lmLT5PVVRCKDMsIHJlZ19iYXNlKzIpOworCWh3aWYtPk9VVEIodmFsdWUsIHJlZ19iYXNlK3JlZyk7CisJaHdpZi0+T1VUQigweDgzLCByZWdfYmFzZSsyKTsKK30KKworc3RhdGljIHU4IHJlYWRfcmVnKGlkZV9od2lmX3QgKmh3aWYsIGludCByZWcpCisvKiBSZWFkIHZhbHVlIGZyb20gcmVnaXN0ZXIgcmVnLCBiYXNlIG9mIHJlZ2lzdGVyCisgKiBpcyBhdCByZWdfYmFzZSAoMHgxZjAgcHJpbWFyeSwgMHgxNzAgc2Vjb25kYXJ5LAorICogaWYgbm90IGNoYW5nZWQgYnkgUENJIGNvbmZpZ3VyYXRpb24pLgorICogVGhpcyBpcyBmcm9tIHNldHVwdmljLmV4ZSBwcm9ncmFtLgorICovCit7CisJdTggcmV0ID0gMDsKKworCWh3aWYtPklOVyhyZWdfYmFzZSsxKTsKKwlod2lmLT5JTlcocmVnX2Jhc2UrMSk7CisJaHdpZi0+T1VUQigzLCByZWdfYmFzZSsyKTsKKwlyZXQgPSBod2lmLT5JTkIocmVnX2Jhc2UrcmVnKTsKKwlod2lmLT5PVVRCKDB4ODMsIHJlZ19iYXNlKzIpOworCXJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IHBpb19jbG9ja3NfcyB7CisJaW50CWFkZHJlc3NfdGltZTsJLyogQWRkcmVzcyBzZXR1cCAoY2xvY2tzKSAqLworCWludAlkYXRhX3RpbWU7CS8qIEFjdGl2ZS9kYXRhIHB1bHNlIChjbG9ja3MpICovCisJaW50CXJlY292ZXJ5X3RpbWU7CS8qIFJlY292ZXJ5IHRpbWUgKGNsb2NrcykgKi8KK30gcGlvX2Nsb2Nrc190OworCitzdGF0aWMgdm9pZCBjb21wdXRlX2Nsb2NrcyhpbnQgcGlvLCBwaW9fY2xvY2tzX3QgKmNsa3MpCit7CisgICAgICAgIGlmIChwaW8gIT0gUElPX05PVF9FWElTVCkgeworICAgICAgICAJaW50IGFkcl9zZXR1cCwgZGF0YV9wbHM7CisJCWludCBidXNfc3BlZWQgPSBzeXN0ZW1fYnVzX2Nsb2NrKCk7CisKKyAJICAgICAgIAlhZHJfc2V0dXAgPSBpZGVfcGlvX3RpbWluZ3NbcGlvXS5zZXR1cF90aW1lOworICAJICAgICAgCWRhdGFfcGxzID0gaWRlX3Bpb190aW1pbmdzW3Bpb10uYWN0aXZlX3RpbWU7CisJICAJY2xrcy0+YWRkcmVzc190aW1lID0gY21wdF9jbGsoYWRyX3NldHVwLCBidXNfc3BlZWQpOworCSAgICAgCWNsa3MtPmRhdGFfdGltZSA9IGNtcHRfY2xrKGRhdGFfcGxzLCBidXNfc3BlZWQpOworICAgICAJCWNsa3MtPnJlY292ZXJ5X3RpbWUgPSBjbXB0X2NsayhpZGVfcGlvX3RpbWluZ3NbcGlvXS5jeWNsZV90aW1lCisgICAgIAkJCS0gYWRyX3NldHVwLWRhdGFfcGxzLCBidXNfc3BlZWQpOworICAgICAJCWlmIChjbGtzLT5hZGRyZXNzX3RpbWU8MSkgY2xrcy0+YWRkcmVzc190aW1lID0gMTsKKyAgICAgCQlpZiAoY2xrcy0+YWRkcmVzc190aW1lPjQpIGNsa3MtPmFkZHJlc3NfdGltZSA9IDQ7CisgICAgIAkJaWYgKGNsa3MtPmRhdGFfdGltZTwxKSBjbGtzLT5kYXRhX3RpbWUgPSAxOworICAgICAJCWlmIChjbGtzLT5kYXRhX3RpbWU+MTYpIGNsa3MtPmRhdGFfdGltZSA9IDE2OworICAgICAJCWlmIChjbGtzLT5yZWNvdmVyeV90aW1lPDIpIGNsa3MtPnJlY292ZXJ5X3RpbWUgPSAyOworICAgICAJCWlmIChjbGtzLT5yZWNvdmVyeV90aW1lPjE3KSBjbGtzLT5yZWNvdmVyeV90aW1lID0gMTc7CisJfSBlbHNlIHsKKwkJY2xrcy0+YWRkcmVzc190aW1lID0gMTsKKwkJY2xrcy0+ZGF0YV90aW1lID0gMTsKKwkJY2xrcy0+cmVjb3ZlcnlfdGltZSA9IDI7CisJCS8qIG1pbmltYWwgdmFsdWVzICovCisJfQorIAorfQorCisvKiBNYWluIHR1bmUgcHJvY2VkdXJlLCBjYWxsZWQgZnJvbSB0dW5lcHJvYy4gKi8KK3N0YXRpYyB2b2lkIG9wdGk2MjFfdHVuZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJLyogcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGRyaXZlcyBzaGFyZSBzb21lIHJlZ2lzdGVycywKKwkgKiBzbyB3ZSBoYXZlIHRvIHByb2dyYW0gYm90aCBkcml2ZXMKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHBpbzEgPSAwLCBwaW8yID0gMDsKKwlwaW9fY2xvY2tzX3QgZmlyc3QsIHNlY29uZDsKKwlpbnQgYXgsIGRyZHk7CisJdTggY3ljbGUxLCBjeWNsZTIsIG1pc2M7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCisJLyogc2V0cyBkcml2ZS0+ZHJpdmVfZGF0YSBmb3IgYm90aCBkcml2ZXMgKi8KKwljb21wdXRlX3Bpb3MoZHJpdmUsIHBpbyk7CisgCXBpbzEgPSBod2lmLT5kcml2ZXNbMF0uZHJpdmVfZGF0YTsKKyAJcGlvMiA9IGh3aWYtPmRyaXZlc1sxXS5kcml2ZV9kYXRhOworCisJY29tcHV0ZV9jbG9ja3MocGlvMSwgJmZpcnN0KTsKKwljb21wdXRlX2Nsb2NrcyhwaW8yLCAmc2Vjb25kKTsKKworCS8qIGF4ID0gbWF4KGExLGEyKSAqLworCWF4ID0gKGZpcnN0LmFkZHJlc3NfdGltZSA8IHNlY29uZC5hZGRyZXNzX3RpbWUpID8gc2Vjb25kLmFkZHJlc3NfdGltZSA6IGZpcnN0LmFkZHJlc3NfdGltZTsKKworCWRyZHkgPSAyOyAvKiBEUkRZIGlzIGRlZmF1bHQgMiAoYnkgT1BUaSBEYXRhYm9vaykgKi8KKworCWN5Y2xlMSA9ICgoZmlyc3QuZGF0YV90aW1lLTEpPDw0KSAgfCAoZmlyc3QucmVjb3ZlcnlfdGltZS0yKTsKKwljeWNsZTIgPSAoKHNlY29uZC5kYXRhX3RpbWUtMSk8PDQpIHwgKHNlY29uZC5yZWNvdmVyeV90aW1lLTIpOworCW1pc2MgPSBSRUFEX1BSRUZFVENIIHwgKChheC0xKTw8NCkgfCAoKGRyZHktMik8PDEpOworCisjaWZkZWYgT1BUSTYyMV9ERUJVRworCXByaW50aygiJXM6IG1hc3RlcjogYWRkcmVzczogJWQsIGRhdGE6ICVkLCAiCisJCSJyZWNvdmVyeTogJWQsIGRyZHk6ICVkIFtjbGtdXG4iLAorCQlod2lmLT5uYW1lLCBheCwgZmlyc3QuZGF0YV90aW1lLAorCQlmaXJzdC5yZWNvdmVyeV90aW1lLCBkcmR5KTsKKwlwcmludGsoIiVzOiBzbGF2ZTogIGFkZHJlc3M6ICVkLCBkYXRhOiAlZCwgIgorCQkicmVjb3Zlcnk6ICVkLCBkcmR5OiAlZCBbY2xrXVxuIiwKKwkJaHdpZi0+bmFtZSwgYXgsIHNlY29uZC5kYXRhX3RpbWUsCisJCXNlY29uZC5yZWNvdmVyeV90aW1lLCBkcmR5KTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKyAgICAgCXJlZ19iYXNlID0gaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXTsKKworCS8qIGFsbG93IFJlZ2lzdGVyLUIgKi8KKwlod2lmLT5PVVRCKDB4YzAsIHJlZ19iYXNlK0NOVFJMX1JFRyk7CisJLyogaG1tLCBzZXR1cHZpYy5leGUgZG9lcyB0aGlzIDstKSAqLworCWh3aWYtPk9VVEIoMHhmZiwgcmVnX2Jhc2UrNSk7CisJLyogaWYgcmVhZHMgMHhmZiwgYWRhcHRlciBub3QgZXhpc3Q/ICovCisJKHZvaWQpIGh3aWYtPklOQihyZWdfYmFzZStDTlRSTF9SRUcpOworCS8qIGlmIHJlYWRzIDB4YzAsIG5vIGludGVyZmFjZSBleGlzdD8gKi8KKwlyZWFkX3JlZyhod2lmLCBDTlRSTF9SRUcpOworCS8qIHJlYWQgdmVyc2lvbiwgcHJvYmFibHkgMCAqLworCXJlYWRfcmVnKGh3aWYsIFNUUkFQX1JFRyk7CisKKwkvKiBwcm9ncmFtIHByaW1hcnkgZHJpdmUgKi8KKwkJLyogc2VsZWN0IEluZGV4LTAgZm9yIFJlZ2lzdGVyLUEgKi8KKwl3cml0ZV9yZWcoaHdpZiwgMCwgICAgICBNSVNDX1JFRyk7CisJCS8qIHNldCByZWFkIGN5Y2xlIHRpbWluZ3MgKi8KKwl3cml0ZV9yZWcoaHdpZiwgY3ljbGUxLCBSRUFEX1JFRyk7CisJCS8qIHNldCB3cml0ZSBjeWNsZSB0aW1pbmdzICovCisJd3JpdGVfcmVnKGh3aWYsIGN5Y2xlMSwgV1JJVEVfUkVHKTsKKworCS8qIHByb2dyYW0gc2Vjb25kYXJ5IGRyaXZlICovCisJCS8qIHNlbGVjdCBJbmRleC0xIGZvciBSZWdpc3Rlci1CICovCisJd3JpdGVfcmVnKGh3aWYsIDEsICAgICAgTUlTQ19SRUcpOworCQkvKiBzZXQgcmVhZCBjeWNsZSB0aW1pbmdzICovCisJd3JpdGVfcmVnKGh3aWYsIGN5Y2xlMiwgUkVBRF9SRUcpOworCQkvKiBzZXQgd3JpdGUgY3ljbGUgdGltaW5ncyAqLworCXdyaXRlX3JlZyhod2lmLCBjeWNsZTIsIFdSSVRFX1JFRyk7CisKKwkvKiB1c2UgUmVnaXN0ZXItQSBmb3IgZHJpdmUgMCAqLworCS8qIHVzZSBSZWdpc3Rlci1CIGZvciBkcml2ZSAxICovCisJd3JpdGVfcmVnKGh3aWYsIDB4ODUsIENOVFJMX1JFRyk7CisKKwkvKiBzZXQgYWRkcmVzcyBzZXR1cCwgRFJEWSB0aW1pbmdzLCAgICovCisJLyogIGFuZCByZWFkIHByZWZldGNoIGZvciBib3RoIGRyaXZlcyAqLworIAl3cml0ZV9yZWcoaHdpZiwgbWlzYywgTUlTQ19SRUcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGluaXRfaHdpZl9vcHRpNjIxKCkgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaHdpZiBmb3VuZCBhdCBib290LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX29wdGk2MjEgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YXV0b2RtYSA9IDA7CisJaHdpZi0+ZHJpdmVzWzBdLmRyaXZlX2RhdGEgPSBQSU9fRE9OVF9LTk9XOworCWh3aWYtPmRyaXZlc1sxXS5kcml2ZV9kYXRhID0gUElPX0RPTlRfS05PVzsKKwlod2lmLT50dW5lcHJvYyA9ICZvcHRpNjIxX3R1bmVfZHJpdmU7CisKKwlpZiAoIShod2lmLT5kbWFfYmFzZSkpCisJCXJldHVybjsKKworCWh3aWYtPmF0YXBpX2RtYSA9IDE7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7CisKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3Qgb3B0aTYyMV9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJewkvKiAwICovCisJCS5uYW1lCQk9ICJPUFRJNjIxIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9vcHRpNjIxLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5lbmFibGViaXRzCT0ge3sweDQ1LDB4ODAsMHgwMH0sIHsweDQwLDB4MDgsMHgwMH19LAorCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKKwl9LHsJLyogMSAqLworCQkubmFtZQkJPSAiT1BUSTYyMVgiLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX29wdGk2MjEsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NDUsMHg4MCwweDAwfSwgezB4NDAsMHgwOCwweDAwfX0sCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9wdGk2MjFfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZvcHRpNjIxX2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV0pOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb3B0aTYyMV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX09QVEksIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM2MjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9PUFRJLCBQQ0lfREVWSUNFX0lEX09QVElfODJDODI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG9wdGk2MjFfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIk9wdGk2MjFfSURFIiwKKwkuaWRfdGFibGUJPSBvcHRpNjIxX3BjaV90YmwsCisJLnByb2JlCQk9IG9wdGk2MjFfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IG9wdGk2MjFfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9wdGk2MjFfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJKYXJvbWlyIEtvdXRlaywgSmFuIEhhcmtlcywgTWFyayBMb3JkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBPcHRpNjIxIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTY0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfbmV3LmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiAgUHJvbWlzZSBUWDIvVFg0L1RYMjAwMC8xMzMgSURFIGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBTcGxpdCBmcm9tOgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BkYzIwMnh4LmMJVmVyc2lvbiAwLjM1CU1hci4gMzAsIDIwMDIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMgkJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTkgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCisgKiAgQXV0aG9yOiBGcmFuayBUaWVybmFuIChmcmFua3RAcHJvbWlzZS5jb20pCisgKiAgUmVsZWFzZWQgdW5kZXIgdGVybXMgb2YgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2VuZGlmCisKKyNkZWZpbmUgUERDMjAyX0RFQlVHX0NBQkxFCTAKKworY29uc3Qgc3RhdGljIGNoYXIgKnBkY19xdWlya19kcml2ZXNbXSA9IHsKKwkiUVVBTlRVTSBGSVJFQkFMTGxjdDA4IDA4IiwKKwkiUVVBTlRVTSBGSVJFQkFMTFAgS0E2LjQiLAorCSJRVUFOVFVNIEZJUkVCQUxMUCBLQTkuMSIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNCIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMTMuNiIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMjAuNSIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMjcuMyIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNSIsCisJTlVMTAorfTsKKworI2RlZmluZSBzZXRfMnJlZ3MoYSwgYikJCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlod2lmLT5PVVRCKChhICsgYWRqKSwgaW5kZXhyZWcpOwlcCisJCWh3aWYtPk9VVEIoYiwgZGF0YXJlZyk7CQkJXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBzZXRfdWx0cmEoYSwgYiwgYykJCQkJXAorCWRvIHsJCQkJCQlcCisJCXNldF8ycmVncygweDEwLChhKSk7CQkJXAorCQlzZXRfMnJlZ3MoMHgxMSwoYikpOwkJCVwKKwkJc2V0XzJyZWdzKDB4MTIsKGMpKTsJCQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHNldF9hdGEyKGEsIGIpCQkJCQlcCisJZG8gewkJCQkJCVwKKwkJc2V0XzJyZWdzKDB4MGUsKGEpKTsJCQlcCisJCXNldF8ycmVncygweDBmLChiKSk7CQkJXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBzZXRfcGlvKGEsIGIsIGMpCQkJCVwKKwlkbyB7IAkJCQkJCVwKKwkJc2V0XzJyZWdzKDB4MGMsKGEpKTsJCQlcCisJCXNldF8ycmVncygweDBkLChiKSk7CQkJXAorCQlzZXRfMnJlZ3MoMHgxMywoYykpOwkJCVwKKwl9IHdoaWxlKDApCisKK3N0YXRpYyB1OCBwZGNuZXdfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBtb2RlOworCisJc3dpdGNoKEhXSUYoZHJpdmUpLT5wY2lfZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzc6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjc2OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY5OgorCQkJbW9kZSA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY4OgorCQkJbW9kZSA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgaW50IGNoZWNrX2luX2RyaXZlX2xpc3RzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKipsaXN0KQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworCWlmIChwZGNfcXVpcmtfZHJpdmVzID09IGxpc3QpIHsKKwkJd2hpbGUgKCpsaXN0KSB7CisJCQlpZiAoc3Ryc3RyKGlkLT5tb2RlbCwgKmxpc3QrKykpIHsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgqbGlzdCkgeworCQkJaWYgKCFzdHJjbXAoKmxpc3QrKyxpZC0+bW9kZWwpKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGRjbmV3X25ld190dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIGluZGV4cmVnCT0gaHdpZi0+ZG1hX3ZlbmRvcjE7CisJdW5zaWduZWQgbG9uZyBkYXRhcmVnCT0gaHdpZi0+ZG1hX3ZlbmRvcjM7CisJdTggdGhvbGQJCT0gMHgxMDsKKwl1OCBhZGoJCQk9IChkcml2ZS0+ZG4lMikgPyAweDA4IDogMHgwMDsKKwl1OCBzcGVlZAkJPSBpZGVfcmF0ZV9maWx0ZXIocGRjbmV3X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKworCWlmIChzcGVlZCA9PSBYRkVSX1VETUFfMikgeworCQlod2lmLT5PVVRCKCh0aG9sZCArIGFkaiksIGluZGV4cmVnKTsKKwkJaHdpZi0+T1VUQigoaHdpZi0+SU5CKGRhdGFyZWcpICYgMHg3ZiksIGRhdGFyZWcpOworCX0KKworCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBYRkVSX1VETUFfNzoKKwkJCXNwZWVkID0gWEZFUl9VRE1BXzY7CisJCWNhc2UgWEZFUl9VRE1BXzY6CXNldF91bHRyYSgweDFhLCAweDAxLCAweGNiKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzU6CXNldF91bHRyYSgweDFhLCAweDAyLCAweGNiKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzQ6CXNldF91bHRyYSgweDFhLCAweDAzLCAweGNkKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzM6CXNldF91bHRyYSgweDFhLCAweDA1LCAweGNkKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzI6CXNldF91bHRyYSgweDJhLCAweDA3LCAweGNkKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzE6CXNldF91bHRyYSgweDNhLCAweDBhLCAweGQwKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXNldF91bHRyYSgweDRhLCAweDBmLCAweGQ1KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMjoJc2V0X2F0YTIoMHg2OSwgMHgyNSk7IGJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzE6CXNldF9hdGEyKDB4NmIsIDB4MjcpOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8wOglzZXRfYXRhMigweGRmLCAweDVmKTsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fNDoJc2V0X3BpbygweDIzLCAweDA5LCAweDI1KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMzoJc2V0X3BpbygweDI3LCAweDBkLCAweDM1KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMjoJc2V0X3BpbygweDIzLCAweDI2LCAweDY0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMToJc2V0X3BpbygweDQ2LCAweDI5LCAweGE0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMDoJc2V0X3BpbygweGZiLCAweDJiLCAweGFjKTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQk7CisJfQorCisJcmV0dXJuIChpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCkpOworfQorCisvKiAgIDAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICA3ICAgOAorICogOTYwLCA0ODAsIDM5MCwgMzAwLCAyNDAsIDE4MCwgMTIwLCA5MCwgNjAKKyAqICAgICAgICAgICAxODAsIDE1MCwgMTIwLCAgOTAsICA2MAorICogRE1BX1NwZWVkCisgKiAxODAsIDEyMCwgIDkwLCAgOTAsICA5MCwgIDYwLCAgMzAKKyAqICAxMSwgICA1LCAgIDQsICAgMywgICAyLCAgIDEsICAgMAorICovCitzdGF0aWMgdm9pZCBwZGNuZXdfdHVuZV9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwl1OCBzcGVlZDsKKworCWlmIChwaW8gPT0gNSkgcGlvID0gNDsKKwlzcGVlZCA9IFhGRVJfUElPXzAgKyBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDI1NSwgcGlvLCBOVUxMKTsKKworCSh2b2lkKXBkY25ld19uZXdfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7Cit9CisKK3N0YXRpYyB1OCBwZGNuZXdfbmV3X2NhYmxlX2RldGVjdCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlod2lmLT5PVVRCKDB4MGIsIGh3aWYtPmRtYV92ZW5kb3IxKTsKKwlyZXR1cm4gKCh1OCkoKGh3aWYtPklOQihod2lmLT5kbWFfdmVuZG9yMykgJiAweDA0KSkpOworfQorc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBzcGVlZAkJPSAtMTsKKwl1OCBjYWJsZTsKKworCXU4IHVsdHJhXzY2CQk9ICgoaWQtPmRtYV91bHRyYSAmIDB4MDAxMCkgfHwKKwkJCQkgICAoaWQtPmRtYV91bHRyYSAmIDB4MDAwOCkpID8gMSA6IDA7CisKKwljYWJsZSA9IHBkY25ld19uZXdfY2FibGVfZGV0ZWN0KGh3aWYpOworCisJaWYgKHVsdHJhXzY2ICYmIGNhYmxlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6ICVzIGNoYW5uZWwgcmVxdWlyZXMgYW4gODAtcGluIGNhYmxlIGZvciBvcGVyYXRpb24uXG4iLCBod2lmLT5jaGFubmVsID8gIlNlY29uZGFyeSI6IlByaW1hcnkiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgcmVkdWNlZCB0byBVbHRyYTMzIG1vZGUuXG4iLCBkcml2ZS0+bmFtZSk7CisJfQorCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJcmV0dXJuIDA7CisJaWYgKGlkLT5jYXBhYmlsaXR5ICYgNCkgewkvKiBJT1JEWV9FTiAmIFBSRUZFVENIX0VOICovCisJCWh3aWYtPk9VVEIoKDB4MTMgKyAoKGRyaXZlLT5kbiUyKSA/IDB4MDggOiAweDAwKSksIGh3aWYtPmRtYV92ZW5kb3IxKTsKKwkJaHdpZi0+T1VUQigoaHdpZi0+SU5CKGh3aWYtPmRtYV92ZW5kb3IzKXwweDAzKSwgaHdpZi0+ZG1hX3ZlbmRvcjMpOworCX0KKworCXNwZWVkID0gaWRlX2RtYV9zcGVlZChkcml2ZSwgcGRjbmV3X3JhdGVtYXNrKGRyaXZlKSk7CisKKwlpZiAoIShzcGVlZCkpIHsKKwkJaHdpZi0+dHVuZXByb2MoZHJpdmUsIDUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkodm9pZCkgaHdpZi0+c3BlZWRwcm9jKGRyaXZlLCBzcGVlZCk7CisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworc3RhdGljIGludCBwZGNuZXdfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisKKwlkcml2ZS0+aW5pdF9zcGVlZCA9IDA7CisKKwlpZiAoaWQgJiYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKKworCQlpZiAoaWRlX3VzZV9kbWEoZHJpdmUpKSB7CisJCQlpZiAoY29uZmlnX2NoaXBzZXRfZm9yX2RtYShkcml2ZSkpCisJCQkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCQl9CisKKwkJZ290byBmYXN0X2F0YV9waW87CisKKwl9IGVsc2UgaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDgpIHx8IChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgeworZmFzdF9hdGFfcGlvOgorCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgNSk7CisJCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwl9CisJLyogSU9SRFkgbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBkY25ld19xdWlya3Byb2MgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gKChpbnQpIGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBwZGNfcXVpcmtfZHJpdmVzKSk7Cit9CisKK3N0YXRpYyBpbnQgcGRjbmV3X2lkZV9kbWFfbG9zdGlycShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWYgKEhXSUYoZHJpdmUpLT5yZXNldHByb2MgIT0gTlVMTCkKKwkJSFdJRihkcml2ZSktPnJlc2V0cHJvYyhkcml2ZSk7CisJcmV0dXJuIF9faWRlX2RtYV9sb3N0aXJxKGRyaXZlKTsKK30KKworc3RhdGljIGludCBwZGNuZXdfaWRlX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAoSFdJRihkcml2ZSktPnJlc2V0cHJvYyAhPSBOVUxMKQorCQlIV0lGKGRyaXZlKS0+cmVzZXRwcm9jKGRyaXZlKTsKKwlyZXR1cm4gX19pZGVfZG1hX3RpbWVvdXQoZHJpdmUpOworfQorCitzdGF0aWMgdm9pZCBwZGNuZXdfbmV3X3Jlc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJLyoKKwkgKiBEZWxldGVkIHRoaXMgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZnJvbSB0aGUgY2FsbGVyLgorCSAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlBEQzIwMlhYOiAlcyBjaGFubmVsIHJlc2V0LlxuIiwKKwkJSFdJRihkcml2ZSktPmNoYW5uZWwgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5Iik7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhcHBsZV9raXdpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2xhc3NfcmV2ID0gMDsKKwl2b2lkIF9faW9tZW0gKm1taW87CisJdTggY29uZjsKKworCWlmIChucCA9PSBOVUxMIHx8ICFkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImtpd2ktcm9vdCIpKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKworCWlmIChjbGFzc19yZXYgPj0gMHgwMykgeworCQkvKiBTZXR1cCBjaGlwIG1hZ2ljIGNvbmZpZyBzdHVmZiAoZnJvbSBkYXJ3aW4pICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsICZjb25mKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsIGNvbmYgfCAweDAxKTsKKwl9CisJbW1pbyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAorCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkpOworCisJLyogU2V0dXAgc29tZSBQTEwgc3R1ZmZzICovCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3MDoKKwkJd3JpdGV3KDB4MGQyYiwgbW1pbyArIDB4MTIwMik7CisJCW1kZWxheSgzMCk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjcxOgorCQl3cml0ZXcoMHgwODI2LCBtbWlvICsgMHgxMjAyKTsKKwkJbWRlbGF5KDMwKTsKKwkJYnJlYWs7CisJfQorCisJaW91bm1hcChtbWlvKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3BkY25ldyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsCisJCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0IHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBST00gZW5hYmxlZCBhdCAweCUwOGx4XG4iLAorCQkJbmFtZSwgZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCk7CisJfQorCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJYXBwbGVfa2l3aV9pbml0KGRldik7CisjZW5kaWYKKworCXJldHVybiBkZXYtPmlycTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9wZGMyMDJuZXcoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlod2lmLT5hdXRvZG1hID0gMDsKKworCWh3aWYtPnR1bmVwcm9jICA9ICZwZGNuZXdfdHVuZV9kcml2ZTsKKwlod2lmLT5xdWlya3Byb2MgPSAmcGRjbmV3X3F1aXJrcHJvYzsKKwlod2lmLT5zcGVlZHByb2MgPSAmcGRjbmV3X25ld190dW5lX2NoaXBzZXQ7CisJaHdpZi0+cmVzZXRwcm9jID0gJnBkY25ld19uZXdfcmVzZXQ7CisKKwlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSBod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSAxOworCisJaHdpZi0+dWx0cmFfbWFzayA9IDB4N2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJnBkY25ld19jb25maWdfZHJpdmVfeGZlcl9yYXRlOworCWh3aWYtPmlkZV9kbWFfbG9zdGlycSA9ICZwZGNuZXdfaWRlX2RtYV9sb3N0aXJxOworCWh3aWYtPmlkZV9kbWFfdGltZW91dCA9ICZwZGNuZXdfaWRlX2RtYV90aW1lb3V0OworCWlmICghKGh3aWYtPnVkbWFfZm91cikpCisJCWh3aWYtPnVkbWFfZm91ciA9IChwZGNuZXdfbmV3X2NhYmxlX2RldGVjdChod2lmKSkgPyAwIDogMTsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisjaWYgUERDMjAyX0RFQlVHX0NBQkxFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcy1waW4gY2FibGVcbiIsCisJCWh3aWYtPm5hbWUsIGh3aWYtPnVkbWFfZm91ciA/ICI4MCIgOiAiNDAiKTsKKyNlbmRpZiAvKiBQREMyMDJfREVCVUdfQ0FCTEUgKi8KK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9wZGNuZXcoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9wZGMyMDI3MChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZmluZGV2ID0gTlVMTDsKKworCWlmICgoZGV2LT5idXMtPnNlbGYgJiYKKwkgICAgIGRldi0+YnVzLT5zZWxmLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUMpICYmCisJICAgIChkZXYtPmJ1cy0+c2VsZi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDXzIxMTUwKSkgeworCQlpZiAoUENJX1NMT1QoZGV2LT5kZXZmbikgJiAyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWQtPmV4dHJhID0gMDsKKwkJd2hpbGUgKChmaW5kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZmluZGV2KSkgIT0gTlVMTCkgeworCQkJaWYgKChmaW5kZXYtPnZlbmRvciA9PSBkZXYtPnZlbmRvcikgJiYKKwkJCSAgICAoZmluZGV2LT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpICYmCisJCQkgICAgKFBDSV9TTE9UKGZpbmRldi0+ZGV2Zm4pICYgMikpIHsKKwkJCQlpZiAoZmluZGV2LT5pcnEgIT0gZGV2LT5pcnEpIHsKKwkJCQkJZmluZGV2LT5pcnEgPSBkZXYtPmlycTsKKwkJCQl9CisJCQkJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlcyhkZXYsIGZpbmRldiwgZCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfc2V0dXBfcGRjMjAyNzYoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJIGlkZV9wY2lfZGV2aWNlX3QgKmQpCit7CisJaWYgKChkZXYtPmJ1cy0+c2VsZikgJiYKKwkgICAgKGRldi0+YnVzLT5zZWxmLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkgJiYKKwkgICAgKChkZXYtPmJ1cy0+c2VsZi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSTk2MCkgfHwKKwkgICAgIChkZXYtPmJ1cy0+c2VsZi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSTk2MFJNKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlOiBTa2lwcGluZyBQcm9taXNlIFBEQzIwMjc2ICIKKwkJCSJhdHRhY2hlZCB0byBJMk8gUkFJRCBjb250cm9sbGVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgcGRjbmV3X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIlBEQzIwMjY4IiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX3BkY25ldywKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGNuZXcsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAybmV3LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogMSAqLworCQkubmFtZQkJPSAiUERDMjAyNjkiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfcGRjbmV3LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3BkY25ldywKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9wZGMyMDJuZXcsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAorCX0sewkvKiAyICovCisJCS5uYW1lCQk9ICJQREMyMDI3MCIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9wZGMyMDI3MCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGNuZXcsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAybmV3LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisjaWZuZGVmIENPTkZJR19QREMyMDJYWF9GT1JDRQorCQkuZW5hYmxlYml0cwk9IHt7MHg1MCwweDAyLDB4MDJ9LCB7MHg1MCwweDA0LDB4MDR9fSwKKyNlbmRpZgorCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCisJfSx7CS8qIDMgKi8KKwkJLm5hbWUJCT0gIlBEQzIwMjcxIiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX3BkY25ldywKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGNuZXcsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAybmV3LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9LHsJLyogNCAqLworCQkubmFtZQkJPSAiUERDMjAyNzUiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfcGRjbmV3LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3BkY25ldywKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9wZGMyMDJuZXcsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAorCX0sewkvKiA1ICovCisJCS5uYW1lCQk9ICJQREMyMDI3NiIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9wZGMyMDI3NiwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGNuZXcsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAybmV3LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisjaWZuZGVmIENPTkZJR19QREMyMDJYWF9GT1JDRQorCQkuZW5hYmxlYml0cwk9IHt7MHg1MCwweDAyLDB4MDJ9LCB7MHg1MCwweDA0LDB4MDR9fSwKKyNlbmRpZgorCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCisJfSx7CS8qIDYgKi8KKwkJLm5hbWUJCT0gIlBEQzIwMjc3IiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX3BkY25ldywKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGNuZXcsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAybmV3LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwl9Cit9OworCisvKioKKyAqCXBkYzIwMm5ld19pbml0X29uZQktCWNhbGxlZCB3aGVuIGEgcGRjMjAyeHggaXMgZm91bmQKKyAqCUBkZXY6IHRoZSBwZGMyMDJuZXcgZGV2aWNlCisgKglAaWQ6IHRoZSBtYXRjaGluZyBwY2kgaWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgUENJIHJlZ2lzdHJhdGlvbiBsYXllciAob3IgdGhlIElERSBpbml0aWFsaXphdGlvbikKKyAqCWZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nIG91ciBJREUgZGV2aWNlIHRhYmxlcy4KKyAqLworIAorc3RhdGljIGludCBfX2RldmluaXQgcGRjMjAybmV3X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZGVfcGNpX2RldmljZV90ICpkID0gJnBkY25ld19jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdOworCisJcmV0dXJuIGQtPmluaXRfc2V0dXAoZGV2LCBkKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBkYzIwMm5ld19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgM30sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNn0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwZGMyMDJuZXdfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIlByb21pc2VfSURFIiwKKwkuaWRfdGFibGUJPSBwZGMyMDJuZXdfcGNpX3RibCwKKwkucHJvYmUJCT0gcGRjMjAybmV3X2luaXRfb25lLAorfTsKKworc3RhdGljIGludCBwZGMyMDJuZXdfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBkYzIwMm5ld19pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlIEhlZHJpY2ssIEZyYW5rIFRpZXJuYW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIFByb21pc2UgUERDMjAyNjggYW5kIGhpZ2hlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWQ5NTgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jCkBAIC0wLDAgKzEsODkyIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9vbGQuYwlWZXJzaW9uIDAuMzYJU2VwdCAxMSwgMjAwMgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMgkJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqCisgKiAgUHJvbWlzZSBVbHRyYTMzIGNhcmRzIHdpdGggQklPUyB2MS4yMCB0aHJvdWdoIDEuMjggd2lsbCBuZWVkIHRoaXMKKyAqICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjYXJkIGluc3RhbGxlZC4KKyAqICBOb3RlIHRoYXQgQklPUyB2MS4yOSBpcyByZXBvcnRlZCB0byBmaXggdGhlIHByb2JsZW0uICBTaW5jZSB0aGlzIGlzCisgKiAgc2FmZSBjaGlwc2V0IHR1bmluZywgaW5jbHVkaW5nIHRoaXMgc3VwcG9ydCBpcyBoYXJtbGVzcworICoKKyAqICBQcm9taXNlIFVsdHJhNjYgY2FyZHMgd2l0aCBCSU9TIHYxLjExIHRoaXMKKyAqICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjYXJkIGluc3RhbGxlZC4KKyAqCisgKiAgUHJvbWlzZSBVbHRyYTEwMCBjYXJkcy4KKyAqCisgKiAgVGhlIGxhdGVzdCBjaGlwc2V0IGNvZGUgd2lsbCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOjoKKyAqICBUaHJlZSBVbHRyYTMzIGNvbnRyb2xsZXJzIGFuZCAxMiBkcml2ZXMuCisgKiAgOCBhcmUgVURNQSBzdXBwb3J0ZWQgYW5kIDQgYXJlIGxpbWl0ZWQgdG8gRE1BIG1vZGUgMiBtdWx0aS13b3JkLgorICogIFRoZSA4LzQgcmF0aW8gaXMgYSBCSU9TIGNvZGUgbGltaXQgYnkgcHJvbWlzZS4KKyAqCisgKiAgVU5MRVNTIHlvdSBlbmFibGUgIkNPTkZJR19QREMyMDJYWF9CVVJTVCIKKyAqCisgKi8KKworLyoKKyAqICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTkgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCisgKiAgQXV0aG9yOiBGcmFuayBUaWVybmFuIChmcmFua3RAcHJvbWlzZS5jb20pCisgKiAgUmVsZWFzZWQgdW5kZXIgdGVybXMgb2YgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFBEQzIwMl9ERUJVR19DQUJMRQkJMAorI2RlZmluZSBQREMyMDJYWF9ERUJVR19EUklWRV9JTkZPCTAKKworc3RhdGljIGNvbnN0IGNoYXIgKnBkY19xdWlya19kcml2ZXNbXSA9IHsKKwkiUVVBTlRVTSBGSVJFQkFMTGxjdDA4IDA4IiwKKwkiUVVBTlRVTSBGSVJFQkFMTFAgS0E2LjQiLAorCSJRVUFOVFVNIEZJUkVCQUxMUCBLQTkuMSIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNCIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMTMuNiIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMjAuNSIsCisJIlFVQU5UVU0gRklSRUJBTExQIEtYMjcuMyIsCisJIlFVQU5UVU0gRklSRUJBTExQIExNMjAuNSIsCisJTlVMTAorfTsKKworLyogQSBSZWdpc3RlciAqLworI2RlZmluZQlTWU5DX0VSUkRZX0VOCTB4QzAKKworI2RlZmluZQlTWU5DX0lOCQkweDgwCS8qIGNvbnRyb2wgYml0LCBkaWZmZXJlbnQgZm9yIG1hc3RlciB2cy4gc2xhdmUgZHJpdmVzICovCisjZGVmaW5lCUVSUkRZX0VOCTB4NDAJLyogY29udHJvbCBiaXQsIGRpZmZlcmVudCBmb3IgbWFzdGVyIHZzLiBzbGF2ZSBkcml2ZXMgKi8KKyNkZWZpbmUJSU9SRFlfRU4JMHgyMAkvKiBQSU86IElPUkVBRFkgKi8KKyNkZWZpbmUJUFJFRkVUQ0hfRU4JMHgxMAkvKiBQSU86IFBSRUZFVENIICovCisKKyNkZWZpbmUJUEEzCQkweDA4CS8qIFBJTyJBIiB0aW1pbmcgKi8KKyNkZWZpbmUJUEEyCQkweDA0CS8qIFBJTyJBIiB0aW1pbmcgKi8KKyNkZWZpbmUJUEExCQkweDAyCS8qIFBJTyJBIiB0aW1pbmcgKi8KKyNkZWZpbmUJUEEwCQkweDAxCS8qIFBJTyJBIiB0aW1pbmcgKi8KKworLyogQiBSZWdpc3RlciAqLworCisjZGVmaW5lCU1CMgkJMHg4MAkvKiBETUEiQiIgdGltaW5nICovCisjZGVmaW5lCU1CMQkJMHg0MAkvKiBETUEiQiIgdGltaW5nICovCisjZGVmaW5lCU1CMAkJMHgyMAkvKiBETUEiQiIgdGltaW5nICovCisKKyNkZWZpbmUJUEI0CQkweDEwCS8qIFBJT19GT1JDRSAxOjAgKi8KKworI2RlZmluZQlQQjMJCTB4MDgJLyogUElPIkIiIHRpbWluZyAqLwkvKiBQSU8gZmxvdyBDb250cm9sIG1vZGUgKi8KKyNkZWZpbmUJUEIyCQkweDA0CS8qIFBJTyJCIiB0aW1pbmcgKi8JLyogUElPIDQgKi8KKyNkZWZpbmUJUEIxCQkweDAyCS8qIFBJTyJCIiB0aW1pbmcgKi8JLyogUElPIDMgaGFsZiAqLworI2RlZmluZQlQQjAJCTB4MDEJLyogUElPIkIiIHRpbWluZyAqLwkvKiBQSU8gMyBvdGhlciBoYWxmICovCisKKy8qIEMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSU9SRFlwX05PX1NQRUVECTB4NEYKKyNkZWZpbmUJU1BFRURfRElTCTB4MEYKKworI2RlZmluZQlETUFSUXAJCTB4ODAKKyNkZWZpbmUJSU9SRFlwCQkweDQwCisjZGVmaW5lCURNQVJfRU4JCTB4MjAKKyNkZWZpbmUJRE1BV19FTgkJMHgxMAorCisjZGVmaW5lCU1DMwkJMHgwOAkvKiBETUEiQyIgdGltaW5nICovCisjZGVmaW5lCU1DMgkJMHgwNAkvKiBETUEiQyIgdGltaW5nICovCisjZGVmaW5lCU1DMQkJMHgwMgkvKiBETUEiQyIgdGltaW5nICovCisjZGVmaW5lCU1DMAkJMHgwMQkvKiBETUEiQyIgdGltaW5nICovCisKKyNpZiAwCisJdW5zaWduZWQgbG9uZyBiaWJtYSAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKKwl1OCBoaSA9IDAsIGxvID0gMDsKKworCXU4IHNjMWMJPSBpbmJfcCgodTE2KWJpYm1hICsgMHgxYyk7IAorCXU4IHNjMWUJPSBpbmJfcCgodTE2KWJpYm1hICsgMHgxZSk7CisJdTggc2MxZgk9IGluYl9wKCh1MTYpYmlibWEgKyAweDFmKTsKKworCXAgKz0gc3ByaW50ZihwLCAiSG9zdCBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJCShzYzFmICYgMHgwOCkgPyAiVHJpLVN0YXRlZCIgOiAiTm9ybWFsIik7CisJcCArPSBzcHJpbnRmKHAsICJCdXMgQ2xvY2tpbmcgICAgICAgICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJKChzYzFmICYgMHhDMCkgPT0gMHhDMCkgPyAiMTAwIEV4dGVybmFsIiA6CisJCSgoc2MxZiAmIDB4ODApID09IDB4ODApID8gIjY2IEV4dGVybmFsIiA6CisJCSgoc2MxZiAmIDB4NDApID09IDB4NDApID8gIjMzIEV4dGVybmFsIiA6ICIzMyBQQ0kgSW50ZXJuYWwiKTsKKwlwICs9IHNwcmludGYocCwgIklPIHBhZCBzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICA6ICVzIG1BXG4iLAorCQkoKHNjMWMgJiAweDAzKSA9PSAweDAzKSA/ICIxMCIgOgorCQkoKHNjMWMgJiAweDAyKSA9PSAweDAyKSA/ICI4IiA6CisJCSgoc2MxYyAmIDB4MDEpID09IDB4MDEpID8gIjYiIDoKKwkJKChzYzFjICYgMHgwMCkgPT0gMHgwMCkgPyAiNCIgOiAiPz8iKTsKKwloaSA9IHNjMWUgPj4gNDsKKwlsbyA9IHNjMWUgJiAweGY7CisJcCArPSBzcHJpbnRmKHAsICJTdGF0dXMgUG9sbGluZyBQZXJpb2QgICAgICAgICAgICAgICAgOiAlZFxuIiwgaGkpOworCXAgKz0gc3ByaW50ZihwLCAiSW50ZXJydXB0IENoZWNrIFN0YXR1cyBQb2xsaW5nIERlbGF5IDogJWRcbiIsIGxvKTsKKyNlbmRpZgorCitzdGF0aWMgdTggcGRjMjAyeHhfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBtb2RlOworCisJc3dpdGNoKEhXSUYoZHJpdmUpLT5wY2lfZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjc6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY1OgorCQkJbW9kZSA9IDM7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjM6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjYyOgorCQkJbW9kZSA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNDY6CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgaW50IGNoZWNrX2luX2RyaXZlX2xpc3RzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKipsaXN0KQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKworCWlmIChwZGNfcXVpcmtfZHJpdmVzID09IGxpc3QpIHsKKwkJd2hpbGUgKCpsaXN0KSB7CisJCQlpZiAoc3Ryc3RyKGlkLT5tb2RlbCwgKmxpc3QrKykpIHsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgqbGlzdCkgeworCQkJaWYgKCFzdHJjbXAoKmxpc3QrKyxpZC0+bW9kZWwpKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGRjMjAyeHhfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJdTggZHJpdmVfcGNpCQk9IDB4NjAgKyAoZHJpdmUtPmRuIDw8IDIpOworCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKHBkYzIwMnh4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKworCXUzMgkJCWRyaXZlX2NvbmY7CisJdTgJCQlBUCwgQlAsIENQLCBEUDsKKwl1OAkJCVRBID0gMCwgVEIgPSAwLCBUQyA9IDA7CisKKwlpZiAoKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgJiYgKHNwZWVkIDwgWEZFUl9TV19ETUFfMCkpCisJCXJldHVybiAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgJmRyaXZlX2NvbmYpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksICZBUCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCAmQlApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMiwgJkNQKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDMsICZEUCk7CisKKwlpZiAoc3BlZWQgPCBYRkVSX1NXX0RNQV8wKSB7CisJCWlmICgoQVAgJiAweDBGKSB8fCAoQlAgJiAweDA3KSkgeworCQkJLyogY2xlYXIgUElPIG1vZGVzIG9mIGxvd2VyIDg0MjEgYml0cyBvZiBBIFJlZ2lzdGVyICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKSwgQVAgJn4weDBGKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksICZBUCk7CisKKwkJCS8qIGNsZWFyIFBJTyBtb2RlcyBvZiBsb3dlciA0MjEgYml0cyBvZiBCIFJlZ2lzdGVyICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCBCUCAmfjB4MDcpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCAmQlApOworCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpLCAmQVApOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCAmQlApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChCUCAmIDB4RjApICYmIChDUCAmIDB4MEYpKSB7CisJCQkvKiBjbGVhciBETUEgbW9kZXMgb2YgdXBwZXIgODQyIGJpdHMgb2YgQiBSZWdpc3RlciAqLworCQkJLyogY2xlYXIgUElPIGZvcmNlZCBtb2RlIHVwcGVyIDEgYml0IG9mIEIgUmVnaXN0ZXIgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsIEJQICZ+MHhGMCk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsICZCUCk7CisKKwkJCS8qIGNsZWFyIERNQSBtb2RlcyBvZiBsb3dlciA4NDIxIGJpdHMgb2YgQyBSZWdpc3RlciAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMiwgQ1AgJn4weDBGKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMiwgJkNQKTsKKwkJfQorCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksICZBUCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCAmQlApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMiwgJkNQKTsKKworCXN3aXRjaChzcGVlZCkgeworCQljYXNlIFhGRVJfVURNQV82OglzcGVlZCA9IFhGRVJfVURNQV81OworCQljYXNlIFhGRVJfVURNQV81OgorCQljYXNlIFhGRVJfVURNQV80OglUQiA9IDB4MjA7IFRDID0gMHgwMTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzI6CVRCID0gMHgyMDsgVEMgPSAweDAxOyBicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMToJVEIgPSAweDQwOyBUQyA9IDB4MDI7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV8wOgorCQljYXNlIFhGRVJfTVdfRE1BXzI6CVRCID0gMHg2MDsgVEMgPSAweDAzOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8xOglUQiA9IDB4NjA7IFRDID0gMHgwNDsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJY2FzZSBYRkVSX1NXX0RNQV8yOglUQiA9IDB4NjA7IFRDID0gMHgwNTsgYnJlYWs7CisJCWNhc2UgWEZFUl9TV19ETUFfMToJVEIgPSAweDgwOyBUQyA9IDB4MDY7IGJyZWFrOworCQljYXNlIFhGRVJfU1dfRE1BXzA6CVRCID0gMHhDMDsgVEMgPSAweDBCOyBicmVhazsKKwkJY2FzZSBYRkVSX1BJT180OglUQSA9IDB4MDE7IFRCID0gMHgwNDsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMzoJVEEgPSAweDAyOyBUQiA9IDB4MDY7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzI6CVRBID0gMHgwMzsgVEIgPSAweDA4OyBicmVhazsKKwkJY2FzZSBYRkVSX1BJT18xOglUQSA9IDB4MDU7IFRCID0gMHgwQzsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJZGVmYXVsdDoJCVRBID0gMHgwOTsgVEIgPSAweDEzOyBicmVhazsKKwl9CisKKwlpZiAoc3BlZWQgPCBYRkVSX1NXX0RNQV8wKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpLCBBUHxUQSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsIEJQfFRCKTsKKwl9IGVsc2UgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCBCUHxUQik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDIsIENQfFRDKTsKKwl9CisKKyNpZiBQREMyMDJYWF9ERUJVR19EUklWRV9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBkcml2ZSVkIDB4JTA4eCAiLAorCQlkcml2ZS0+bmFtZSwgaWRlX3hmZXJfdmVyYm9zZShzcGVlZCksCisJCWRyaXZlLT5kbiwgZHJpdmVfY29uZik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgJmRyaXZlX2NvbmYpOworCXByaW50aygiMHglMDh4XG4iLCBkcml2ZV9jb25mKTsKKyNlbmRpZiAvKiBQREMyMDJYWF9ERUJVR19EUklWRV9JTkZPICovCisKKwlyZXR1cm4gKGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKSk7Cit9CisKKworLyogICAwICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgNyAgIDgKKyAqIDk2MCwgNDgwLCAzOTAsIDMwMCwgMjQwLCAxODAsIDEyMCwgOTAsIDYwCisgKiAgICAgICAgICAgMTgwLCAxNTAsIDEyMCwgIDkwLCAgNjAKKyAqIERNQV9TcGVlZAorICogMTgwLCAxMjAsICA5MCwgIDkwLCAgOTAsICA2MCwgIDMwCisgKiAgMTEsICAgNSwgICA0LCAgIDMsICAgMiwgICAxLCAgIDAKKyAqLworc3RhdGljIHZvaWQgY29uZmlnX2NoaXBzZXRfZm9yX3BpbyAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJdTggc3BlZWQgPSAwOworCisJaWYgKHBpbyA9PSA1KSBwaW8gPSA0OworCXNwZWVkID0gWEZFUl9QSU9fMCArIGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCBwaW8sIE5VTEwpOworICAgICAgICAKKwlwZGMyMDJ4eF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKK30KKworc3RhdGljIHU4IHBkYzIwMnh4X29sZF9jYWJsZV9kZXRlY3QgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTE2IENJUyA9IDAsIG1hc2sgPSAoaHdpZi0+Y2hhbm5lbCkgPyAoMTw8MTEpIDogKDE8PDEwKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCAweDUwLCAmQ0lTKTsKKwlyZXR1cm4gKENJUyAmIG1hc2spID8gMSA6IDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgdG8gdXNlIHRoZSA2Nk1IeiBzeXN0ZW0KKyAqIGNsb2NrIGZvciBVRE1BIDMvNC81IG1vZGUgb3BlcmF0aW9uIHdoZW4gbmVjZXNzYXJ5LgorICoKKyAqIEl0IG1heSBhbHNvIGJlIHBvc3NpYmxlIHRvIGxlYXZlIHRoZSA2Nk1IeiBjbG9jayBvbgorICogYW5kIHJlYWRqdXN0IHRoZSB0aW1pbmcgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQgcGRjX29sZF9lbmFibGVfNjZNSHpfY2xvY2soaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1bnNpZ25lZCBsb25nIGNsb2NrX3JlZyA9IGh3aWYtPmRtYV9tYXN0ZXIgKyAweDExOworCXU4IGNsb2NrID0gaHdpZi0+SU5CKGNsb2NrX3JlZyk7CisKKwlod2lmLT5PVVRCKGNsb2NrIHwgKGh3aWYtPmNoYW5uZWwgPyAweDA4IDogMHgwMiksIGNsb2NrX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHBkY19vbGRfZGlzYWJsZV82Nk1Iel9jbG9jayhpZGVfaHdpZl90ICpod2lmKQoreworCXVuc2lnbmVkIGxvbmcgY2xvY2tfcmVnID0gaHdpZi0+ZG1hX21hc3RlciArIDB4MTE7CisJdTggY2xvY2sgPSBod2lmLT5JTkIoY2xvY2tfcmVnKTsKKworCWh3aWYtPk9VVEIoY2xvY2sgJiB+KGh3aWYtPmNoYW5uZWwgPyAweDA4IDogMHgwMiksIGNsb2NrX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2NoaXBzZXRfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBoZF9kcml2ZWlkICppZAk9IGRyaXZlLT5pZDsKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJdTMyIGRyaXZlX2NvbmYJCT0gMDsKKwl1OCBkcml2ZV9wY2kJCT0gMHg2MCArIChkcml2ZS0+ZG4gPDwgMik7CisJdTggdGVzdDEgPSAwLCB0ZXN0MiA9IDAsIHNwZWVkID0gLTE7CisJdTggQVAgPSAwLCBjYWJsZSA9IDA7CisKKwl1OCB1bHRyYV82NgkJPSAoKGlkLT5kbWFfdWx0cmEgJiAweDAwMTApIHx8CisJCQkJICAgKGlkLT5kbWFfdWx0cmEgJiAweDAwMDgpKSA/IDEgOiAwOworCisJaWYgKGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NikKKwkJY2FibGUgPSBwZGMyMDJ4eF9vbGRfY2FibGVfZGV0ZWN0KGh3aWYpOworCWVsc2UKKwkJdWx0cmFfNjYgPSAwOworCisJaWYgKHVsdHJhXzY2ICYmIGNhYmxlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6ICVzIGNoYW5uZWwgcmVxdWlyZXMgYW4gODAtcGluIGNhYmxlIGZvciBvcGVyYXRpb24uXG4iLCBod2lmLT5jaGFubmVsID8gIlNlY29uZGFyeSI6IlByaW1hcnkiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgcmVkdWNlZCB0byBVbHRyYTMzIG1vZGUuXG4iLCBkcml2ZS0+bmFtZSk7CisJfQorCisJaWYgKGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NikKKwkJcGRjX29sZF9kaXNhYmxlXzY2TUh6X2Nsb2NrKGRyaXZlLT5od2lmKTsKKworCWRyaXZlX3BjaSA9IDB4NjAgKyAoZHJpdmUtPmRuIDw8IDIpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgJmRyaXZlX2NvbmYpOworCWlmICgoZHJpdmVfY29uZiAhPSAweDAwNGZmMzA0KSAmJiAoZHJpdmVfY29uZiAhPSAweDAwNGZmM2M0KSkKKwkJZ290byBjaGlwc2V0X2lzX3NldDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpLCAmdGVzdDEpOworCWlmICghKHRlc3QxICYgU1lOQ19FUlJEWV9FTikpIHsKKwkJaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSkgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBkcml2ZV9wY2kgLSA0LCAmdGVzdDIpOworCQkJaWYgKCh0ZXN0MiAmIFNZTkNfRVJSRFlfRU4pICYmCisJCQkgICAgISh0ZXN0MSAmIFNZTkNfRVJSRFlfRU4pKSB7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpLAorCQkJCQl0ZXN0MXxTWU5DX0VSUkRZX0VOKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRyaXZlX3BjaSwKKwkJCQl0ZXN0MXxTWU5DX0VSUkRZX0VOKTsKKwkJfQorCX0KKworY2hpcHNldF9pc19zZXQ6CisKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksICZBUCk7CisJCWlmIChpZC0+Y2FwYWJpbGl0eSAmIDQpCS8qIElPUkRZX0VOICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKSwgQVB8SU9SRFlfRU4pOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpLCAmQVApOworCQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrKQkvKiBQUkVGRVRDSF9FTiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksIEFQfFBSRUZFVENIX0VOKTsKKwl9CisKKwlzcGVlZCA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIHBkYzIwMnh4X3JhdGVtYXNrKGRyaXZlKSk7CisKKwlpZiAoIShzcGVlZCkpIHsKKwkJLyogcmVzdG9yZSBvcmlnaW5hbCBwY2ktY29uZmlnIHNwYWNlICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkcml2ZV9wY2ksIGRyaXZlX2NvbmYpOworCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgNSk7CisJCXJldHVybiAwOworCX0KKworCSh2b2lkKSBod2lmLT5zcGVlZHByb2MoZHJpdmUsIHNwZWVkKTsKKwlyZXR1cm4gaWRlX2RtYV9lbmFibGUoZHJpdmUpOworfQorCitzdGF0aWMgaW50IHBkYzIwMnh4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJZHJpdmUtPmluaXRfc3BlZWQgPSAwOworCisJaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJaHdpZi0+dHVuZXByb2MoZHJpdmUsIDUpOworCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJfQorCS8qIElPUkRZIG5vdCBzdXBwb3J0ZWQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZGMyMDJ4eF9xdWlya3Byb2MgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gKChpbnQpIGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBwZGNfcXVpcmtfZHJpdmVzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBkYzIwMnh4X29sZF9pZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAoZHJpdmUtPmN1cnJlbnRfc3BlZWQgPiBYRkVSX1VETUFfMikKKwkJcGRjX29sZF9lbmFibGVfNjZNSHpfY2xvY2soZHJpdmUtPmh3aWYpOworCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpycQk9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworLy8JCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworLy8JCXVuc2duZWQgbG9uZyBoaWdoXzE2CT0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJCXVuc2lnbmVkIGxvbmcgaGlnaF8xNiAgID0gaHdpZi0+ZG1hX21hc3RlcjsKKwkJdW5zaWduZWQgbG9uZyBhdGFwaV9yZWcJPSBoaWdoXzE2ICsgKGh3aWYtPmNoYW5uZWwgPyAweDI0IDogMHgyMCk7CisJCXUzMiB3b3JkX2NvdW50CT0gMDsKKwkJdTggY2xvY2sgPSBod2lmLT5JTkIoaGlnaF8xNiArIDB4MTEpOworCisJCWh3aWYtPk9VVEIoY2xvY2t8KGh3aWYtPmNoYW5uZWwgPyAweDA4IDogMHgwMiksIGhpZ2hfMTYrMHgxMSk7CisJCXdvcmRfY291bnQgPSAocnEtPm5yX3NlY3RvcnMgPDwgOCk7CisJCXdvcmRfY291bnQgPSAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpID8KKwkJCQkJd29yZF9jb3VudCB8IDB4MDUwMDAwMDAgOgorCQkJCQl3b3JkX2NvdW50IHwgMHgwNjAwMDAwMDsKKwkJaHdpZi0+T1VUTCh3b3JkX2NvdW50LCBhdGFwaV9yZWcpOworCX0KKwlpZGVfZG1hX3N0YXJ0KGRyaXZlKTsKK30KKworc3RhdGljIGludCBwZGMyMDJ4eF9vbGRfaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKSB7CisJCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKy8vCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaHdpZi0+cGNpX2RldiwgNCk7CisJCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9tYXN0ZXI7CisJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOworCQl1OCBjbG9jawkJPSAwOworCisJCWh3aWYtPk9VVEwoMCwgYXRhcGlfcmVnKTsgLyogemVybyBvdXQgZXh0cmEgKi8KKwkJY2xvY2sgPSBod2lmLT5JTkIoaGlnaF8xNiArIDB4MTEpOworCQlod2lmLT5PVVRCKGNsb2NrICYgfihod2lmLT5jaGFubmVsID8gMHgwODoweDAyKSwgaGlnaF8xNisweDExKTsKKwl9CisJaWYgKGRyaXZlLT5jdXJyZW50X3NwZWVkID4gWEZFUl9VRE1BXzIpCisJCXBkY19vbGRfZGlzYWJsZV82Nk1Iel9jbG9jayhkcml2ZS0+aHdpZik7CisJcmV0dXJuIF9faWRlX2RtYV9lbmQoZHJpdmUpOworfQorCitzdGF0aWMgaW50IHBkYzIwMnh4X29sZF9pZGVfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisvLwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKy8vCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOworCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9tYXN0ZXI7CisJdTggZG1hX3N0YXQJCT0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCXU4IHNjMWQJCQk9IGh3aWYtPklOQigoaGlnaF8xNiArIDB4MDAxZCkpOworCisJaWYgKGh3aWYtPmNoYW5uZWwpIHsKKwkJLyogYml0NzogRXJyb3IsIGJpdDY6IEludGVycnVwdGluZywgYml0NTogRklGTyBGdWxsLCBiaXQ0OiBGSUZPIEVtcHR5ICovCisJCWlmICgoc2MxZCAmIDB4NTApID09IDB4NTApCisJCQlnb3RvIHNvbWVib2R5X2Vsc2U7CisJCWVsc2UgaWYgKChzYzFkICYgMHg0MCkgPT0gMHg0MCkKKwkJCXJldHVybiAoZG1hX3N0YXQgJiA0KSA9PSA0OworCX0gZWxzZSB7CisJCS8qIGJpdDM6IEVycm9yLCBiaXQyOiBJbnRlcnJ1cHRpbmcsIGJpdDE6IEZJRk8gRnVsbCwgYml0MDogRklGTyBFbXB0eSAqLworCQlpZiAoKHNjMWQgJiAweDA1KSA9PSAweDA1KQorCQkJZ290byBzb21lYm9keV9lbHNlOworCQllbHNlIGlmICgoc2MxZCAmIDB4MDQpID09IDB4MDQpCisJCQlyZXR1cm4gKGRtYV9zdGF0ICYgNCkgPT0gNDsKKwl9Citzb21lYm9keV9lbHNlOgorCXJldHVybiAoZG1hX3N0YXQgJiA0KSA9PSA0OwkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCit9CisKK3N0YXRpYyBpbnQgcGRjMjAyeHhfaWRlX2RtYV9sb3N0aXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZiAoSFdJRihkcml2ZSktPnJlc2V0cHJvYyAhPSBOVUxMKQorCQlIV0lGKGRyaXZlKS0+cmVzZXRwcm9jKGRyaXZlKTsKKwlyZXR1cm4gX19pZGVfZG1hX2xvc3RpcnEoZHJpdmUpOworfQorCitzdGF0aWMgaW50IHBkYzIwMnh4X2lkZV9kbWFfdGltZW91dChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWYgKEhXSUYoZHJpdmUpLT5yZXNldHByb2MgIT0gTlVMTCkKKwkJSFdJRihkcml2ZSktPnJlc2V0cHJvYyhkcml2ZSk7CisJcmV0dXJuIF9faWRlX2RtYV90aW1lb3V0KGRyaXZlKTsKK30KKworc3RhdGljIHZvaWQgcGRjMjAyeHhfcmVzZXRfaG9zdCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUEKKy8vCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9iYXNlIC0gKDgqKGh3aWYtPmNoYW5uZWwpKTsKKwl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOworI2Vsc2UgLyogIUNPTkZJR19CTEtfREVWX0lERURNQSAqLworCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IHBjaV9yZXNvdXJjZV9zdGFydChod2lmLT5wY2lfZGV2LCA0KTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KKwl1OCB1ZG1hX3NwZWVkX2ZsYWcJPSBod2lmLT5JTkIoaGlnaF8xNnwweDAwMWYpOworCisJaHdpZi0+T1VUQigodWRtYV9zcGVlZF9mbGFnIHwgMHgxMCksIChoaWdoXzE2fDB4MDAxZikpOworCW1kZWxheSgxMDApOworCWh3aWYtPk9VVEIoKHVkbWFfc3BlZWRfZmxhZyAmIH4weDEwKSwgKGhpZ2hfMTZ8MHgwMDFmKSk7CisJbWRlbGF5KDIwMDApOwkvKiAyIHNlY29uZHMgPyEgKi8KKworCXByaW50ayhLRVJOX1dBUk5JTkcgIlBEQzIwMlhYOiAlcyBjaGFubmVsIHJlc2V0LlxuIiwKKwkJaHdpZi0+Y2hhbm5lbCA/ICJTZWNvbmRhcnkiIDogIlByaW1hcnkiKTsKK30KKworc3RhdGljIHZvaWQgcGRjMjAyeHhfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqbWF0ZQk9IGh3aWYtPm1hdGU7CisJCisJcGRjMjAyeHhfcmVzZXRfaG9zdChod2lmKTsKKwlwZGMyMDJ4eF9yZXNldF9ob3N0KG1hdGUpOworI2lmIDAKKwkvKgorCSAqIEZJWE1FOiBIYXZlIHRvIGtpY2sgYWxsIHRoZSBkcml2ZXMgYWdhaW4gOi0vCisJICogV2hhdCBhIHBhaW4gaW4gdGhlIEFDRSEKKwkgKi8KKwlpZiAoaHdpZi0+cHJlc2VudCkgeworCQl1MTYgaHVuaXQgPSAwOworCQlmb3IgKGh1bml0ID0gMDsgaHVuaXQgPCBNQVhfRFJJVkVTOyArK2h1bml0KSB7CisJCQlpZGVfZHJpdmVfdCAqaGRyaXZlID0gJmh3aWYtPmRyaXZlc1todW5pdF07CisJCQlpZiAoaGRyaXZlLT5wcmVzZW50KSB7CisJCQkJaWYgKGh3aWYtPmlkZV9kbWFfY2hlY2spCisJCQkJCWh3aWYtPmlkZV9kbWFfY2hlY2soaGRyaXZlKTsKKwkJCQllbHNlCisJCQkJCWh3aWYtPnR1bmVwcm9jKGhkcml2ZSwgNSk7CisJCQl9CisJCX0KKwl9CisJaWYgKG1hdGUtPnByZXNlbnQpIHsKKwkJdTE2IG11bml0ID0gMDsKKwkJZm9yIChtdW5pdCA9IDA7IG11bml0IDwgTUFYX0RSSVZFUzsgKyttdW5pdCkgeworCQkJaWRlX2RyaXZlX3QgKm1kcml2ZSA9ICZtYXRlLT5kcml2ZXNbbXVuaXRdOworCQkJaWYgKG1kcml2ZS0+cHJlc2VudCkgeworCQkJCWlmIChtYXRlLT5pZGVfZG1hX2NoZWNrKSAKKwkJCQkJbWF0ZS0+aWRlX2RtYV9jaGVjayhtZHJpdmUpOworCQkJCWVsc2UKKwkJCQkJbWF0ZS0+dHVuZXByb2MobWRyaXZlLCA1KTsKKwkJCX0KKwkJfQorCX0KKyNlbHNlCisJaHdpZi0+dHVuZXByb2MoZHJpdmUsIDUpOworI2VuZGlmCit9CisKKy8qCisgKiBTaW5jZSBTVU4gQ29iYWx0IGlzIGF0dGVtcHRpbmcgdG8gZG8gdGhpcyBvcGVyYXRpb24sIEkgc2hvdWxkIGRpc2Nsb3NlCisgKiB0aGlzIGhhcyBiZWVuIGEgbG9uZyB0aW1lIGFnbyBUaHUgSnVsIDI3IDE2OjQwOjU3IDIwMDAgd2FzIHRoZSBwYXRjaCBkYXRlCisgKiBIT1RTV0FQIEFUQSBJbmZyYXN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBwZGMyMDJ4eF90cmlzdGF0ZSAoaWRlX2RyaXZlX3QgKiBkcml2ZSwgaW50IHN0YXRlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKy8vCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmRtYV9iYXNlIC0gKDgqKGh3aWYtPmNoYW5uZWwpKTsKKwl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5kbWFfbWFzdGVyOworCXU4IHNjMWYJCQk9IGh3aWYtPklOQihoaWdoXzE2fDB4MDAxZik7CisKKwlpZiAoIWh3aWYpCisJCXJldHVybiAtRUlOVkFMOworCisvLwlod2lmLT5idXNfc3RhdGUgPSBzdGF0ZTsKKworCWlmIChzdGF0ZSkgeworCQlod2lmLT5PVVRCKHNjMWYgfCAweDA4LCAoaGlnaF8xNnwweDAwMWYpKTsKKwl9IGVsc2UgeworCQlod2lmLT5PVVRCKHNjMWYgJiB+MHgwOCwgKGhpZ2hfMTZ8MHgwMDFmKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfcGRjMjAyeHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLAorCQkJZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUk9NIGVuYWJsZWQgYXQgMHglMDhseFxuIiwKKwkJCW5hbWUsIGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpOworCX0KKworCS8qCisJICogc29mdHdhcmUgcmVzZXQgLSAgdGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBiaW9zCisJICogd2lsbCBzZXQgVURNQSB0aW1pbmcgb24gaWYgdGhlIGhkZCBzdXBwb3J0cyBpdC4gVGhlCisJICogdXNlciBtYXkgd2FudCB0byB0dXJuIHVkbWEgb2ZmLiBBIGJ1ZyBpbiB0aGUgcGRjMjAyNjIKKwkgKiBpcyB0aGF0IGl0IGNhbm5vdCBoYW5kbGUgYSBkb3duZ3JhZGUgaW4gdGltaW5nIGZyb20KKwkgKiBVRE1BIHRvIERNQS4gRGlzayBhY2Nlc3NlcyBhZnRlciBpc3N1aW5nIGEgc2V0CisJICogZmVhdHVyZSBjb21tYW5kIHdpbGwgcmVzdWx0IGluIGVycm9ycy4gQSBzb2Z0d2FyZQorCSAqIHJlc2V0IGxlYXZlcyB0aGUgdGltaW5nIHJlZ2lzdGVycyBpbnRhY3QsCisJICogYnV0IHJlc2V0cyB0aGUgZHJpdmVzLgorCSAqLworI2lmIDAKKwlpZiAoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NykgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NSkgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2MykgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2MikpIHsKKwkJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJCWJ5dGUgdWRtYV9zcGVlZF9mbGFnCT0gaW5iKGhpZ2hfMTYgKyAweDAwMWYpOworCQlvdXRiKHVkbWFfc3BlZWRfZmxhZyB8IDB4MTAsIGhpZ2hfMTYgKyAweDAwMWYpOworCQltZGVsYXkoMTAwKTsKKwkJb3V0Yih1ZG1hX3NwZWVkX2ZsYWcgJiB+MHgxMCwgaGlnaF8xNiArIDB4MDAxZik7CisJCW1kZWxheSgyMDAwKTsJLyogMiBzZWNvbmRzID8hICovCisJfQorCisjZW5kaWYKKwlyZXR1cm4gZGV2LT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfcGRjMjAyeHgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKworCS8qIFBEQzIwMjY1IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIExCQTQ4IHJlcXVlc3RzICovCisJaWYgKChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjcpIHx8CisJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjUpKQorCQlod2lmLT5ycXNpemUgPSAyNTY7CisKKwlod2lmLT5hdXRvZG1hID0gMDsKKwlod2lmLT50dW5lcHJvYyAgPSAmY29uZmlnX2NoaXBzZXRfZm9yX3BpbzsKKwlod2lmLT5xdWlya3Byb2MgPSAmcGRjMjAyeHhfcXVpcmtwcm9jOworCisJaWYgKGh3aWYtPnBjaV9kZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNDYpIHsKKwkJaHdpZi0+YnVzcHJvYyAgID0gJnBkYzIwMnh4X3RyaXN0YXRlOworCQlod2lmLT5yZXNldHByb2MgPSAmcGRjMjAyeHhfcmVzZXQ7CisJfQorCisJaHdpZi0+c3BlZWRwcm9jID0gJnBkYzIwMnh4X3R1bmVfY2hpcHNldDsKKworCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IGh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisKKwlod2lmLT51bHRyYV9tYXNrID0gMHgzZjsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmcGRjMjAyeHhfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKKwlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmcGRjMjAyeHhfaWRlX2RtYV9sb3N0aXJxOworCWh3aWYtPmlkZV9kbWFfdGltZW91dCA9ICZwZGMyMDJ4eF9pZGVfZG1hX3RpbWVvdXQ7CisKKwlpZiAoaHdpZi0+cGNpX2Rldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NikgeworCQlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQkJaHdpZi0+dWRtYV9mb3VyID0gKHBkYzIwMnh4X29sZF9jYWJsZV9kZXRlY3QoaHdpZikpID8gMCA6IDE7CisJCWh3aWYtPmRtYV9zdGFydCA9ICZwZGMyMDJ4eF9vbGRfaWRlX2RtYV9zdGFydDsKKwkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmcGRjMjAyeHhfb2xkX2lkZV9kbWFfZW5kOworCX0gCisJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZwZGMyMDJ4eF9vbGRfaWRlX2RtYV90ZXN0X2lycTsKKworCWlmICghbm9hdXRvZG1hKQorCQlod2lmLT5hdXRvZG1hID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKyNpZiBQREMyMDJfREVCVUdfQ0FCTEUKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzLXBpbiBjYWJsZVxuIiwKKwkJaHdpZi0+bmFtZSwgaHdpZi0+dWRtYV9mb3VyID8gIjgwIiA6ICI0MCIpOworI2VuZGlmIC8qIFBEQzIwMl9ERUJVR19DQUJMRSAqLwkKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfZG1hX3BkYzIwMnh4KGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hYmFzZSkKK3sKKwl1OCB1ZG1hX3NwZWVkX2ZsYWcgPSAwLCBwcmltYXJ5X21vZGUgPSAwLCBzZWNvbmRhcnlfbW9kZSA9IDA7CisKKwlpZiAoaHdpZi0+Y2hhbm5lbCkgeworCQlpZGVfc2V0dXBfZG1hKGh3aWYsIGRtYWJhc2UsIDgpOworCQlyZXR1cm47CisJfQorCisJdWRtYV9zcGVlZF9mbGFnCT0gaHdpZi0+SU5CKChkbWFiYXNlfDB4MWYpKTsKKwlwcmltYXJ5X21vZGUJPSBod2lmLT5JTkIoKGRtYWJhc2V8MHgxYSkpOworCXNlY29uZGFyeV9tb2RlCT0gaHdpZi0+SU5CKChkbWFiYXNlfDB4MWIpKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogKFUpRE1BIEJ1cnN0IEJpdCAlc0FCTEVEICIgXAorCQkiUHJpbWFyeSAlcyBNb2RlICIgXAorCQkiU2Vjb25kYXJ5ICVzIE1vZGUuXG4iLCBod2lmLT5jZHMtPm5hbWUsCisJCSh1ZG1hX3NwZWVkX2ZsYWcgJiAxKSA/ICJFTiIgOiAiRElTIiwKKwkJKHByaW1hcnlfbW9kZSAmIDEpID8gIk1BU1RFUiIgOiAiUENJIiwKKwkJKHNlY29uZGFyeV9tb2RlICYgMSkgPyAiTUFTVEVSIiA6ICJQQ0kiICk7CisKKyNpZmRlZiBDT05GSUdfUERDMjAyWFhfQlVSU1QKKwlpZiAoISh1ZG1hX3NwZWVkX2ZsYWcgJiAxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRk9SQ0lORyBCVVJTVCBCSVQgMHglMDJ4LT4weCUwMnggIiwKKwkJCWh3aWYtPmNkcy0+bmFtZSwgdWRtYV9zcGVlZF9mbGFnLAorCQkJKHVkbWFfc3BlZWRfZmxhZ3wxKSk7CisJCWh3aWYtPk9VVEIodWRtYV9zcGVlZF9mbGFnfDEsKGRtYWJhc2V8MHgxZikpOworCQlwcmludGsoIiVzQUNUSVZFXG4iLAorCQkJKGh3aWYtPklOQihkbWFiYXNlfDB4MWYpJjEpID8gIiI6IklOIik7CisJfQorI2VuZGlmIC8qIENPTkZJR19QREMyMDJYWF9CVVJTVCAqLworI2lmZGVmIENPTkZJR19QREMyMDJYWF9NQVNURVIKKwlpZiAoIShwcmltYXJ5X21vZGUgJiAxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRk9SQ0lORyBQUklNQVJZIE1PREUgQklUICIKKwkJCSIweCUwMnggLT4gMHglMDJ4ICIsIGh3aWYtPmNkcy0+bmFtZSwKKwkJCXByaW1hcnlfbW9kZSwgKHByaW1hcnlfbW9kZXwxKSk7CisJCWh3aWYtPk9VVEIocHJpbWFyeV9tb2RlfDEsIChkbWFiYXNlfDB4MWEpKTsKKwkJcHJpbnRrKCIlc1xuIiwKKwkJCShod2lmLT5JTkIoKGRtYWJhc2V8MHgxYSkpICYgMSkgPyAiTUFTVEVSIiA6ICJQQ0kiKTsKKwl9CisKKwlpZiAoIShzZWNvbmRhcnlfbW9kZSAmIDEpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGT1JDSU5HIFNFQ09OREFSWSBNT0RFIEJJVCAiCisJCQkiMHglMDJ4IC0+IDB4JTAyeCAiLCBod2lmLT5jZHMtPm5hbWUsCisJCQlzZWNvbmRhcnlfbW9kZSwgKHNlY29uZGFyeV9tb2RlfDEpKTsKKwkJaHdpZi0+T1VUQihzZWNvbmRhcnlfbW9kZXwxLCAoZG1hYmFzZXwweDFiKSk7CisJCXByaW50aygiJXNcbiIsCisJCQkoaHdpZi0+SU5CKChkbWFiYXNlfDB4MWIpKSAmIDEpID8gIk1BU1RFUiIgOiAiUENJIik7CisJfQorI2VuZGlmIC8qIENPTkZJR19QREMyMDJYWF9NQVNURVIgKi8KKworCWlkZV9zZXR1cF9kbWEoaHdpZiwgZG1hYmFzZSwgOCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfc2V0dXBfcGRjMjAyYXRhNChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICBpZGVfcGNpX2RldmljZV90ICpkKQoreworCWlmICgoZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpIHsKKwkJdTggaXJxID0gMCwgaXJxMiA9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaXJxKTsKKwkJLyogMHhiYyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChQQ0lfSU5URVJSVVBUX0xJTkUpfDB4ODAsICZpcnEyKTsKKwkJaWYgKGlycSAhPSBpcnEyKSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LAorCQkJCShQQ0lfSU5URVJSVVBUX0xJTkUpfDB4ODAsIGlycSk7ICAgICAvKiAweGJjICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGNpLWNvbmZpZyBzcGFjZSBpbnRlcnJ1cHQgIgorCQkJCSJtaXJyb3IgZml4ZWQuXG4iLCBkLT5uYW1lKTsKKwkJfQorCX0KKworI2lmIDAKKyAgICAgICAgaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2MikKKyAgICAgICAgaWYgKGUtPnJlZyAmJiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBlLT5yZWcsICZ0bXApIHx8CisgICAgICAgICAgICAgKHRtcCAmIGUtPm1hc2spICE9IGUtPnZhbCkpCisKKyAgICAgICAgaWYgKGQtPmVuYWJsZWJpdHNbMF0ucmVnICE9IGQtPmVuYWJsZWJpdHNbMV0ucmVnKSB7CisgICAgICAgICAgICAgICAgZC0+ZW5hYmxlYml0c1swXS5yZWcgICAgPSBkLT5lbmFibGViaXRzWzFdLnJlZzsKKyAgICAgICAgICAgICAgICBkLT5lbmFibGViaXRzWzBdLm1hc2sgICA9IGQtPmVuYWJsZWJpdHNbMV0ubWFzazsKKyAgICAgICAgICAgICAgICBkLT5lbmFibGViaXRzWzBdLnZhbCAgICA9IGQtPmVuYWJsZWJpdHNbMV0udmFsOworICAgICAgICB9CisjZW5kaWYKKworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NldHVwX3BkYzIwMjY1KHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSBpZGVfcGNpX2RldmljZV90ICpkKQoreworCWlmICgoZGV2LT5idXMtPnNlbGYpICYmCisJICAgIChkZXYtPmJ1cy0+c2VsZi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwpICYmCisJICAgICgoZGV2LT5idXMtPnNlbGYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0k5NjApIHx8CisJICAgICAoZGV2LT5idXMtPnNlbGYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0k5NjBSTSkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlkZTogU2tpcHBpbmcgUHJvbWlzZSBQREMyMDI2NSAiCisJCQkiYXR0YWNoZWQgdG8gSTJPIFJBSUQgY29udHJvbGxlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZiAwCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OCBwcmkgPSAwLCBzZWMgPSAwOworCisgICAgICAgIGlmIChlLT5yZWcgJiYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgZS0+cmVnLCAmdG1wKSB8fAorICAgICAgICAgICAgICh0bXAgJiBlLT5tYXNrKSAhPSBlLT52YWwpKQorCisgICAgICAgIGlmIChkLT5lbmFibGViaXRzWzBdLnJlZyAhPSBkLT5lbmFibGViaXRzWzFdLnJlZykgeworICAgICAgICAgICAgICAgIGQtPmVuYWJsZWJpdHNbMF0ucmVnICAgID0gZC0+ZW5hYmxlYml0c1sxXS5yZWc7CisgICAgICAgICAgICAgICAgZC0+ZW5hYmxlYml0c1swXS5tYXNrICAgPSBkLT5lbmFibGViaXRzWzFdLm1hc2s7CisgICAgICAgICAgICAgICAgZC0+ZW5hYmxlYml0c1swXS52YWwgICAgPSBkLT5lbmFibGViaXRzWzFdLnZhbDsKKyAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NldHVwX3BkYzIwMnh4KHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSBpZGVfcGNpX2RldmljZV90ICpkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBwZGMyMDJ4eF9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJewkvKiAwICovCisJCS5uYW1lCQk9ICJQREMyMDI0NiIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9wZGMyMDJhdGE0LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3BkYzIwMnh4LAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3BkYzIwMnh4LAorCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9wZGMyMDJ4eCwKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBBVVRPRE1BLAorI2lmbmRlZiBDT05GSUdfUERDMjAyWFhfRk9SQ0UKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NTAsMHgwMiwweDAyfSwgezB4NTAsMHgwNCwweDA0fX0sCisjZW5kaWYKKwkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAorCQkuZXh0cmEJCT0gMTYsCisJfSx7CS8qIDEgKi8KKwkJLm5hbWUJCT0gIlBEQzIwMjYyIiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX3BkYzIwMmF0YTQsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfcGRjMjAyeHgsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGRjMjAyeHgsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX3BkYzIwMnh4LAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisjaWZuZGVmIENPTkZJR19QREMyMDJYWF9GT1JDRQorCQkuZW5hYmxlYml0cwk9IHt7MHg1MCwweDAyLDB4MDJ9LCB7MHg1MCwweDA0LDB4MDR9fSwKKyNlbmRpZgorCQkuYm9vdGFibGUJPSBPRkZfQk9BUkQsCisJCS5leHRyYQkJPSA0OCwKKwkJLmZsYWdzCQk9IElERVBDSV9GTEFHX0ZPUkNFX1BEQywKKwl9LHsJLyogMiAqLworCQkubmFtZQkJPSAiUERDMjAyNjMiLAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfcGRjMjAyYXRhNCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGMyMDJ4eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9wZGMyMDJ4eCwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfcGRjMjAyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKyNpZm5kZWYgQ09ORklHX1BEQzIwMlhYX0ZPUkNFCisJCS5lbmFibGViaXRzCT0ge3sweDUwLDB4MDIsMHgwMn0sIHsweDUwLDB4MDQsMHgwNH19LAorI2VuZGlmCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwkJLmV4dHJhCQk9IDQ4LAorCX0sewkvKiAzICovCisJCS5uYW1lCQk9ICJQREMyMDI2NSIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9wZGMyMDI2NSwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGMyMDJ4eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9wZGMyMDJ4eCwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfcGRjMjAyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKyNpZm5kZWYgQ09ORklHX1BEQzIwMlhYX0ZPUkNFCisJCS5lbmFibGViaXRzCT0ge3sweDUwLDB4MDIsMHgwMn0sIHsweDUwLDB4MDQsMHgwNH19LAorI2VuZGlmCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwkJLmV4dHJhCQk9IDQ4LAorCQkuZmxhZ3MJCT0gSURFUENJX0ZMQUdfRk9SQ0VfUERDLAorCX0sewkvKiA0ICovCisJCS5uYW1lCQk9ICJQREMyMDI2NyIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9wZGMyMDJ4eCwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9wZGMyMDJ4eCwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9wZGMyMDJ4eCwKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfcGRjMjAyeHgsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKyNpZm5kZWYgQ09ORklHX1BEQzIwMlhYX0ZPUkNFCisJCS5lbmFibGViaXRzCT0ge3sweDUwLDB4MDIsMHgwMn0sIHsweDUwLDB4MDQsMHgwNH19LAorI2VuZGlmCisJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKKwkJLmV4dHJhCQk9IDQ4LAorCX0KK307CisKKy8qKgorICoJcGRjMjAyeHhfaW5pdF9vbmUJLQljYWxsZWQgd2hlbiBhIFBEQzIwMnh4IGlzIGZvdW5kCisgKglAZGV2OiB0aGUgcGRjMjAyeHggZGV2aWNlCisgKglAaWQ6IHRoZSBtYXRjaGluZyBwY2kgaWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgUENJIHJlZ2lzdHJhdGlvbiBsYXllciAob3IgdGhlIElERSBpbml0aWFsaXphdGlvbikKKyAqCWZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nIG91ciBJREUgZGV2aWNlIHRhYmxlcy4KKyAqLworIAorc3RhdGljIGludCBfX2RldmluaXQgcGRjMjAyeHhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlkZV9wY2lfZGV2aWNlX3QgKmQgPSAmcGRjMjAyeHhfY2hpcHNldHNbaWQtPmRyaXZlcl9kYXRhXTsKKworCXJldHVybiBkLT5pbml0X3NldHVwKGRldiwgZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwZGMyMDJ4eF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgM30sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwZGMyMDJ4eF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkJPSAiUHJvbWlzZV9PbGRfSURFIiwKKwkuaWRfdGFibGUJPSBwZGMyMDJ4eF9wY2lfdGJsLAorCS5wcm9iZQkJPSBwZGMyMDJ4eF9pbml0X29uZSwKK307CisKK3N0YXRpYyBpbnQgcGRjMjAyeHhfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBkYzIwMnh4X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmUgSGVkcmljaywgRnJhbmsgVGllcm5hbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3Igb2xkZXIgUHJvbWlzZSBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9waWl4LmMgYi9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTIwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9waWl4LmMJVmVyc2lvbiAwLjQ0CU1hcmNoIDIwLCAyMDAzCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3osIEF1dGhvciBhbmQgTWFpbnRhaW5lcgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQgSW5jIDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoKKyAqICBQSU8gbW9kZSBzZXR0aW5nIGZ1bmN0aW9uIGZvciBJbnRlbCBjaGlwc2V0cy4gIAorICogIEZvciB1c2UgaW5zdGVhZCBvZiBCSU9TIHNldHRpbmdzLgorICoKKyAqIDQwLTQxCisgKiA0Mi00MworICogCisgKiAgICAgICAgICAgICAgICAgNDEKKyAqICAgICAgICAgICAgICAgICA0MworICoKKyAqIHwgUElPIDAgICAgICAgfCBjMCB8IDgwIHwgMCB8IAlwaWl4X3R1bmVfZHJpdmUoZHJpdmUsIDApOworICogfCBQSU8gMiB8IFNXMiB8IGQwIHwgOTAgfCA0IHwgCXBpaXhfdHVuZV9kcml2ZShkcml2ZSwgMik7CisgKiB8IFBJTyAzIHwgTVcxIHwgZTEgfCBhMSB8IDkgfCAJcGlpeF90dW5lX2RyaXZlKGRyaXZlLCAzKTsKKyAqIHwgUElPIDQgfCBNVzIgfCBlMyB8IGEzIHwgYiB8IAlwaWl4X3R1bmVfZHJpdmUoZHJpdmUsIDQpOworICogCisgKiBzaXRyZSA9IHdvcmQ0MCAmIDB4NDAwMDsgcHJpbWFyeQorICogc2l0cmUgPSB3b3JkNDIgJiAweDQwMDA7IHNlY29uZGFyeQorICoKKyAqIDQ0IDg0MjF8ODQyMSAgICBoZGR8aGRiCisgKiAKKyAqIDQ4IDg0MjEgICAgICAgICBoZGR8aGRjfGhkYnxoZGEgdWRtYSBlbmFibGVkCisgKgorICogICAgMDAwMSAgICAgICAgIGhkYQorICogICAgMDAxMCAgICAgICAgIGhkYgorICogICAgMDEwMCAgICAgICAgIGhkYworICogICAgMTAwMCAgICAgICAgIGhkZAorICoKKyAqIDRhIDg0fDIxICAgICAgICBoZGJ8aGRhCisgKiA0YiA4NHwyMSAgICAgICAgaGRkfGhkYworICoKKyAqICAgIGF0YS0zMy84MjM3MUFCCisgKiAgICBhdGEtMzMvODIzNzFFQgorICogICAgYXRhLTMzLzgyODAxQUIgICAgICAgICAgICBhdGEtNjYvODI4MDFBQQorICogICAgMDB8MDAgdWRtYSAwICAgICAgICAgICAgICAwMHwwMCByZXNlcnZlZAorICogICAgMDF8MDEgdWRtYSAxICAgICAgICAgICAgICAwMXwwMSB1ZG1hIDMKKyAqICAgIDEwfDEwIHVkbWEgMiAgICAgICAgICAgICAgMTB8MTAgdWRtYSA0CisgKiAgICAxMXwxMSByZXNlcnZlZCAgICAgICAgICAgIDExfDExIHJlc2VydmVkCisgKgorICogNTQgODQyMXw4NDIxICAgIGF0YTY2IGRyaXZlfGF0YTY2IGVuYWJsZQorICoKKyAqIHBjaV9yZWFkX2NvbmZpZ193b3JkKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCAweDQwLCAmcmVnNDApOworICogcGNpX3JlYWRfY29uZmlnX3dvcmQoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NDIsICZyZWc0Mik7CisgKiBwY2lfcmVhZF9jb25maWdfd29yZChIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg0NCwgJnJlZzQ0KTsKKyAqIHBjaV9yZWFkX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCAweDQ4LCAmcmVnNDgpOworICogcGNpX3JlYWRfY29uZmlnX3dvcmQoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NGEsICZyZWc0YSk7CisgKiBwY2lfcmVhZF9jb25maWdfYnl0ZShIV0lGKGRyaXZlKS0+cGNpX2RldiwgMHg1NCwgJnJlZzU0KTsKKyAqCisgKiBEb2N1bWVudGF0aW9uCisgKglQdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIEludGVsIHdlYiBzaXRlLiBFcnJhdGEgZG9jdW1lbnRhdGlvbgorICogaXMgYWxzbyBwdWJsaWNhbGx5IGF2YWlsYWJsZS4gQXMgYW4gYWlkZSB0byBhbnlvbmUgaGFja2luZyBvbiB0aGlzCisgKiBkcml2ZXIgdGhlIGxpc3Qgb2YgZXJyYXRhIHRoYXQgYXJlIHJlbGV2YW50IGlzIGJlbG93LmdvaW5nIGJhY2sgdG8KKyAqIFBJSVg0LiBPbGRlciBkZXZpY2UgZG9jdW1lbnRhdGlvbiBpcyBub3cgYSBiaXQgdHJpY2t5IHRvIGZpbmQuCisgKgorICogRXJyYXRhIG9mIG5vdGU6CisgKgorICogVW5maXhhYmxlCisgKglQSUlYNCAgICBlcnJhdGEgIzkJLSBPbmx5IG9uIHVsdHJhIG9ic2N1cmUgaHcKKyAqCUlDSDMJIGVycmF0YSAjMTMgICAgIC0gTm90IG9ic2VydmVkIHRvIGFmZmVjdCByZWFsIGh3CisgKgkJCQkgIGJ5IEludGVsCisgKgorICogVGhpbmdzIHdlIG11c3QgZGVhbCB3aXRoCisgKglQSUlYNAllcnJhdGEgIzEwCS0gQk0gSURFIGhhbmcgd2l0aCBub24gVURNQQorICoJCQkJICAobXVzdCBzdG9wL3N0YXJ0IGRtYSB0byByZWNvdmVyKQorICoJNDQwTVggICBlcnJhdGEgIzE1CS0gQXMgUElJWDQgZXJyYXRhICMxMAorICoJUElJWDQJZXJyYXRhICMxNQktIE11c3Qgbm90IHJlYWQgY29udHJvbCByZWdpc3RlcnMKKyAqIAkJCQkgIGR1cmluZyBhIFBJTyB0cmFuc2ZlcgorICoJNDQwTVggICBlcnJhdGEgIzEzCS0gQXMgUElJWDQgZXJyYXRhICMxNQorICoJSUNIMgllcnJhdGEgIzIxCS0gRE1BIG1vZGUgMCBkb2Vzbid0IHdvcmsgcmlnaHQKKyAqCUlDSDAvMSAgZXJyYXRhICM1NQktIEFzIElDSDIgZXJyYXRhICMyMQorICoJSUNIMglzcGVjIGMgIzkJLSBFeHRyYSBvcGVyYXRpb25zIG5lZWRlZCB0byBoYW5kbGUKKyAqCQkJCSAgZHJpdmUgaG90c3dhcCBbTk9UIFlFVCBTVVBQT1JURURdCisgKglJQ0gyICAgIHNwZWMgYyAjMjAJLSBJREUgUFJEIG11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5CisgKgkJCQkgIGFuZCBtdXN0IGJlIGR3b3JkIGFsaWduZWQKKyAqCUlDSDIgICAgc3BlYyBjICMyNAktIFVETUEgbW9kZSA0LDUgdDg1Lzg2IHNob3VsZCBiZSA2bnMgbm90IDMuMworICoKKyAqIFNob3VsZCBoYXZlIGJlZW4gQklPUyBmaXhlZDoKKyAqCTQ1ME5YOgllcnJhdGEgIzE5CS0gRE1BIGhhbmdzIG9uIG9sZCA0NTBOWAorICoJNDUwTlg6ICBlcnJhdGEgIzIwCS0gRE1BIGhhbmdzIG9uIG9sZCA0NTBOWAorICoJNDUwTlg6ICBlcnJhdGEgIzI1CS0gQ29ycnVwdGlvbiB3aXRoIERNQSBvbiBvbGQgNDUwTlgKKyAqCUlDSDMgICAgZXJyYXRhICMxNSAgICAgIC0gSURFIGRlYWRsb2NrIHVuZGVyIGhpZ2ggbG9hZAorICoJCQkJICAoQklPUyBtdXN0IHNldCBkZXYgMzEgZm4gMCBiaXQgMjMpCisgKglJQ0gzCWVycmF0YSAjMTgJLSBEb24ndCB1c2UgbmF0aXZlIG1vZGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgbm9fcGlpeF9kbWE7CisKKy8qKgorICoJcGlpeF9yYXRlbWFzawkJLQljb21wdXRlIHJhdGUgbWFzayBmb3IgUElJWCBJREUKKyAqCUBkcml2ZTogSURFIGRyaXZlIHRvIGNvbXB1dGUgZm9yCisgKgorICoJUmV0dXJucyB0aGUgYXZhaWxhYmxlIG1vZGVzIGZvciB0aGUgUElJWCBJREUgY29udHJvbGxlci4KKyAqLworIAorc3RhdGljIHU4IHBpaXhfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJdTggbW9kZTsKKworCXN3aXRjaChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8xOgorCQkJbW9kZSA9IDM7CisJCQlicmVhazsKKwkJLyogVURNQSAxMDAgY2FwYWJsZSAqLworCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV84OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV85OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVfMTE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEwOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMTE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfMjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTk6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzIxOgorCQkJbW9kZSA9IDM7CisJCQlicmVhazsKKwkJLyogVURNQSA2NiBjYXBhYmxlICovCisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MkZCXzE6CisJCQltb2RlID0gMjsKKwkJCWJyZWFrOworCQkvKiBVRE1BIDMzIGNhcGFibGUgKi8KKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8xOgorCQkJcmV0dXJuIDE7CisJCS8qIE5vbiBVRE1BIGNhcGFibGUgKE1XRE1BMikgKi8KKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxTVg6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9CisJCisJLyoKKwkgKglJZiB3ZSBhcmUgVURNQTY2IGNhcGFibGUgZmFsbCBiYWNrIHRvIFVETUEzMyAKKwkgKglpZiB0aGUgZHJpdmUgY2Fubm90IHNlZSBhbiA4MHBpbiBjYWJsZS4KKwkgKi8KKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCisvKioKKyAqCXBpaXhfZG1hXzJfcGlvCQktCXJldHVybiB0aGUgUElPIG1vZGUgbWF0Y2hpbmcgRE1BCisgKglAeGZlcl9yYXRlOiB0cmFuc2ZlciBzcGVlZAorICoKKyAqCVJldHVybnMgdGhlIG5lYXJlc3QgZXF1aXZhbGVudCBQSU8gdGltaW5nIGZvciB0aGUgUElPIG9yIERNQQorICoJbW9kZSByZXF1ZXN0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuCisgKi8KKyAKK3N0YXRpYyB1OCBwaWl4X2RtYV8yX3BpbyAodTggeGZlcl9yYXRlKSB7CisJc3dpdGNoKHhmZXJfcmF0ZSkgeworCQljYXNlIFhGRVJfVURNQV82OgorCQljYXNlIFhGRVJfVURNQV81OgorCQljYXNlIFhGRVJfVURNQV80OgorCQljYXNlIFhGRVJfVURNQV8zOgorCQljYXNlIFhGRVJfVURNQV8yOgorCQljYXNlIFhGRVJfVURNQV8xOgorCQljYXNlIFhGRVJfVURNQV8wOgorCQljYXNlIFhGRVJfTVdfRE1BXzI6CisJCWNhc2UgWEZFUl9QSU9fNDoKKwkJCXJldHVybiA0OworCQljYXNlIFhGRVJfTVdfRE1BXzE6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJCXJldHVybiAzOworCQljYXNlIFhGRVJfU1dfRE1BXzI6CisJCWNhc2UgWEZFUl9QSU9fMjoKKwkJCXJldHVybiAyOworCQljYXNlIFhGRVJfTVdfRE1BXzA6CisJCWNhc2UgWEZFUl9TV19ETUFfMToKKwkJY2FzZSBYRkVSX1NXX0RNQV8wOgorCQljYXNlIFhGRVJfUElPXzE6CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJY2FzZSBYRkVSX1BJT19TTE9XOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqCXBpaXhfdHVuZV9kcml2ZQkJLQl0dW5lIGEgZHJpdmUgYXR0YWNoZWQgdG8gYSBQSUlYCisgKglAZHJpdmU6IGRyaXZlIHRvIHR1bmUKKyAqCUBwaW86IGRlc2lyZWQgUElPIG1vZGUKKyAqCisgKglTZXQgdGhlIGludGVyZmFjZSBQSU8gbW9kZSBiYXNlZCB1cG9uICB0aGUgc2V0dGluZ3MgZG9uZSBieSBBTUkgQklPUworICoJKG1pZ2h0IGJlIHVzZWZ1bCBpZiBkcml2ZSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBDTU9TIGZvciBhbnkgcmVhc29uKS4KKyAqLworc3RhdGljIHZvaWQgcGlpeF90dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJaW50IGlzX3NsYXZlCQk9ICgmaHdpZi0+ZHJpdmVzWzFdID09IGRyaXZlKTsKKwlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOworCWludCBzbGF2ZV9wb3J0CQk9IDB4NDQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgbWFzdGVyX2RhdGE7CisJdTggc2xhdmVfZGF0YTsKKwkJCQkgLyogSVNQICBSVEMgKi8KKwl1OCB0aW1pbmdzW11bMl0JPSB7IHsgMCwgMCB9LAorCQkJICAgIHsgMCwgMCB9LAorCQkJICAgIHsgMSwgMCB9LAorCQkJICAgIHsgMiwgMSB9LAorCQkJICAgIHsgMiwgMyB9LCB9OworCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDUsIE5VTEwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKSB7CisJCW1hc3Rlcl9kYXRhID0gbWFzdGVyX2RhdGEgfCAweDQwMDA7CisJCWlmIChwaW8gPiAxKQorCQkJLyogZW5hYmxlIFBQRSwgSUUgYW5kIFRJTUUgKi8KKwkJCW1hc3Rlcl9kYXRhID0gbWFzdGVyX2RhdGEgfCAweDAwNzA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgc2xhdmVfcG9ydCwgJnNsYXZlX2RhdGEpOworCQlzbGF2ZV9kYXRhID0gc2xhdmVfZGF0YSAmIChod2lmLT5jaGFubmVsID8gMHgwZiA6IDB4ZjApOworCQlzbGF2ZV9kYXRhID0gc2xhdmVfZGF0YSB8ICgoKHRpbWluZ3NbcGlvXVswXSA8PCAyKSB8IHRpbWluZ3NbcGlvXVsxXSkgPDwgKGh3aWYtPmNoYW5uZWwgPyA0IDogMCkpOworCX0gZWxzZSB7CisJCW1hc3Rlcl9kYXRhID0gbWFzdGVyX2RhdGEgJiAweGNjZjg7CisJCWlmIChwaW8gPiAxKQorCQkJLyogZW5hYmxlIFBQRSwgSUUgYW5kIFRJTUUgKi8KKwkJCW1hc3Rlcl9kYXRhID0gbWFzdGVyX2RhdGEgfCAweDAwMDc7CisJCW1hc3Rlcl9kYXRhID0gbWFzdGVyX2RhdGEgfCAodGltaW5nc1twaW9dWzBdIDw8IDEyKSB8ICh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7CisJfQorCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCBzbGF2ZV9kYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCXBpaXhfdHVuZV9jaGlwc2V0CS0JdHVuZSBhIFBJSVggaW50ZXJmYWNlCisgKglAZHJpdmU6IElERSBkcml2ZSB0byB0dW5lCisgKglAeGZlcnNwZWVkOiBzcGVlZCB0byBjb25maWd1cmUKKyAqCisgKglTZXQgYSBQSUlYIGludGVyZmFjZSBjaGFubmVsIHRvIHRoZSBkZXNpcmVkIHNwZWVkcy4gVGhpcyBpbnZvbHZlcworICoJcmVxdWlyZXMgdGhlIHJpZ2h0IHRpbWluZyBkYXRhIGludG8gdGhlIFBJSVggY29uZmlndXJhdGlvbiBzcGFjZQorICoJdGhlbiBzZXR0aW5nIHRoZSBkcml2ZSBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkKKyAqLworIAorc3RhdGljIGludCBwaWl4X3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXU4IG1hc2xhdmUJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOworCXU4IHNwZWVkCQk9IGlkZV9yYXRlX2ZpbHRlcihwaWl4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKKwlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpbnQgdV9mbGFnCQk9IDEgPDwgZHJpdmUtPmRuOworCWludCB2X2ZsYWcJCT0gMHgwMSA8PCBkcml2ZS0+ZG47CisJaW50IHdfZmxhZwkJPSAweDEwIDw8IGRyaXZlLT5kbjsKKwlpbnQgdV9zcGVlZAkJPSAwOworCWludAkJCXNpdHJlOworCXUxNgkJCXJlZzQwNDIsIHJlZzRhOworCXU4CQkJcmVnNDgsIHJlZzU0LCByZWc1NTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzbGF2ZSwgJnJlZzQwNDIpOworCXNpdHJlID0gKHJlZzQwNDIgJiAweDQwMDApID8gMSA6IDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCAmcmVnNDgpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgJnJlZzRhKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTQsICZyZWc1NCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAmcmVnNTUpOworCisJc3dpdGNoKHNwZWVkKSB7CisJCWNhc2UgWEZFUl9VRE1BXzQ6CisJCWNhc2UgWEZFUl9VRE1BXzI6CXVfc3BlZWQgPSAyIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzU6CisJCWNhc2UgWEZFUl9VRE1BXzM6CisJCWNhc2UgWEZFUl9VRE1BXzE6CXVfc3BlZWQgPSAxIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXVfc3BlZWQgPSAwIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzI6CWJyZWFrOworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzA6CWJyZWFrOworCQlkZWZhdWx0OgkJcmV0dXJuIC0xOworCX0KKworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQlpZiAoIShyZWc0OCAmIHVfZmxhZykpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCByZWc0OCB8IHVfZmxhZyk7CisJCWlmIChzcGVlZCA9PSBYRkVSX1VETUFfNSkgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NSwgKHU4KSByZWc1NXx3X2ZsYWcpOworCQl9IGVsc2UgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NSwgKHU4KSByZWc1NSAmIH53X2ZsYWcpOworCQl9CisJCWlmICgocmVnNGEgJiBhX3NwZWVkKSAhPSB1X3NwZWVkKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgKHJlZzRhICYgfmFfc3BlZWQpIHwgdV9zcGVlZCk7CisJCWlmIChzcGVlZCA+IFhGRVJfVURNQV8yKSB7CisJCQlpZiAoIShyZWc1NCAmIHZfZmxhZykpCisJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgcmVnNTQgfCB2X2ZsYWcpOworCQl9IGVsc2UKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIHJlZzU0ICYgfnZfZmxhZyk7CisJfSBlbHNlIHsKKwkJaWYgKHJlZzQ4ICYgdV9mbGFnKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgcmVnNDggJiB+dV9mbGFnKTsKKwkJaWYgKHJlZzRhICYgYV9zcGVlZCkKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOworCQlpZiAocmVnNTQgJiB2X2ZsYWcpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCByZWc1NCAmIH52X2ZsYWcpOworCQlpZiAocmVnNTUgJiB3X2ZsYWcpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAodTgpIHJlZzU1ICYgfndfZmxhZyk7CisJfQorCisJcGlpeF90dW5lX2RyaXZlKGRyaXZlLCBwaWl4X2RtYV8yX3BpbyhzcGVlZCkpOworCXJldHVybiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKK30KKworLyoqCisgKglwaWl4X2ZhdWx0eV9kbWEwCQktCWNoZWNrIGZvciBETUEwIGVycmF0YQorICoJQGh3aWY6IElERSBpbnRlcmZhY2UgdG8gY2hlY2sKKyAqCisgKglJZiBhbiBJQ0gvSUNIMC9JQ0gyIGludGVyZmFjZSBpcyBpcyBvcGVyYXRpbmcgaW4gbXVsdGktd29yZAorICoJRE1BIG1vZGUgd2l0aCA2MDBuUyBjeWNsZSB0aW1lIHRoZSBJREUgUElPIHByZWZldGNoIGJ1ZmZlciB3aWxsCisgKglpbmFkdmVydGVudGx5IHByb3ZpZGUgYW4gZXh0cmEgcGllY2Ugb2Ygc2Vjb25kYXJ5IGRhdGEgdG8gdGhlIHByaW1hcnkKKyAqCWRldmljZSByZXN1bHRpbmcgaW4gZGF0YSBjb3JydXB0aW9uLgorICoKKyAqCVdpdGggc3VjaCBhIGRldmljZSB0aGlzIHRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlLiBUaGlzIGFsbG93cworICoJb3VyIHR1bmluZyBjb2RlIHRvIGZvbGxvdyBJbnRlbCByZWNvbW1lbmRhdGlvbnMgYW5kIHVzZSBQSU8gb24KKyAqCXN1Y2ggZGV2aWNlcy4KKyAqLworIAorc3RhdGljIGludCBwaWl4X2ZhdWx0eV9kbWEwKGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3dpdGNoKGh3aWYtPnBjaV9kZXYtPmRldmljZSkKKwl7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzE6CS8qIElDSCAqLworCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8xOgkvKiBJQ0gwICovCisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzg6CS8qIElDSDIgKi8KKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfOToJLyogSUNIMiAqLworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXBpaXhfY29uZmlnX2RyaXZlX2Zvcl9kbWEJLQljb25maWd1cmUgZHJpdmUgZm9yIERNQQorICoJQGRyaXZlOiBJREUgZHJpdmUgdG8gY29uZmlndXJlCisgKgorICoJU2V0IHVwIGEgUElJWCBpbnRlcmZhY2UgY2hhbm5lbCBmb3IgdGhlIGJlc3QgYXZhaWxhYmxlIHNwZWVkLgorICoJV2UgcHJlZmVyIFVETUEgaWYgaXQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuIE1XRE1BLiBJZiBETUEgaXMgCisgKglub3QgYXZhaWxhYmxlIHdlIHN3aXRjaCB0byBQSU8gYW5kIHJldHVybiAwLiAKKyAqLworIAorc3RhdGljIGludCBwaWl4X2NvbmZpZ19kcml2ZV9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBwaWl4X3JhdGVtYXNrKGRyaXZlKSk7CisJCisJLyogU29tZSBJQ0ggZGV2aWNlcyBjYW5ub3Qgc3VwcG9ydCBETUEgbW9kZSAwICovCisJaWYoc3BlZWQgPT0gWEZFUl9NV19ETUFfMCAmJiBwaWl4X2ZhdWx0eV9kbWEwKEhXSUYoZHJpdmUpKSkKKwkJc3BlZWQgPSAwOworCisJLyogSWYgbm8gRE1BIHNwZWVkIHdhcyBhdmFpbGFibGUgb3IgdGhlIGNoaXBzZXQgaGFzIERNQSBidWdzCisJICAgdGhlbiBkaXNhYmxlIERNQSBhbmQgdXNlIFBJTyAqLworCSAgIAorCWlmICghc3BlZWQgfHwgbm9fcGlpeF9kbWEpIHsKKwkJdTggdHNwZWVkID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCAyNTUsIDUsIE5VTEwpOworCQlzcGVlZCA9IHBpaXhfZG1hXzJfcGlvKFhGRVJfUElPXzAgKyB0c3BlZWQpOworCX0KKworCSh2b2lkKSBwaWl4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKKy8qKgorICoJcGlpeF9jb25maWdfZHJpdmVfeGZlcl9yYXRlCS0Jc2V0IHVwIGFuIElERSBkZXZpY2UKKyAqCUBkcml2ZTogSURFIGRyaXZlIHRvIGNvbmZpZ3VyZQorICoKKyAqCVNldCB1cCB0aGUgUElJWCBpbnRlcmZhY2UgZm9yIHRoZSBiZXN0IGF2YWlsYWJsZSBzcGVlZCBvbiB0aGlzCisgKglpbnRlcmZhY2UsIHByZWZlcnJpbmcgRE1BIHRvIFBJTy4KKyAqLworIAorc3RhdGljIGludCBwaWl4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJZHJpdmUtPmluaXRfc3BlZWQgPSAwOworCisJaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKHBpaXhfY29uZmlnX2RyaXZlX2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJLyogRmluZCBiZXN0IFBJTyBtb2RlLiAqLworCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgMjU1KTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaW5pdF9jaGlwc2V0X3BpaXgJLQlzZXQgdXAgdGhlIFBJSVggY2hpcHNldAorICoJQGRldjogUENJIGRldmljZSB0byBzZXQgdXAKKyAqCUBuYW1lOiBOYW1lIG9mIHRoZSBkZXZpY2UKKyAqCisgKglJbml0aWFsaXplIHRoZSBQQ0kgZGV2aWNlIGFzIHJlcXVpcmVkLiBGb3IgdGhlIFBJSVggdGhpcyB0dXJucworICoJb3V0IHRvIGJlIG5pY2UgYW5kIHNpbXBsZQorICovCisgCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfcGlpeCAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAgICAgc3dpdGNoKGRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzg6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzk6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMTA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzExOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8xMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRV8xMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl8yOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xOToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMjE6CisJCXsKKwkJCXVuc2lnbmVkIGludCBleHRyYSA9IDA7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDU0LCAmZXh0cmEpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NTQsIGV4dHJhfDB4NDAwKTsKKwkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaW5pdF9od2lmX3BpaXgJCS0JZmlsbCBpbiB0aGUgaHdpZiBmb3IgdGhlIFBJSVgKKyAqCUBod2lmOiBJREUgaW50ZXJmYWNlCisgKgorICoJU2V0IHVwIHRoZSBpZGVfaHdpZl90IGZvciB0aGUgUElJWCBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZQorICoJY2FwYWJpbGl0aWVzIG9mIHRoZSBoYXJkd2FyZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3BpaXgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1OCByZWc1NGggPSAwLCByZWc1NWggPSAwLCBhdGE2NiA9IDA7CisJdTggbWFzayA9IGh3aWYtPmNoYW5uZWwgPyAweGMwIDogMHgzMDsKKworI2lmbmRlZiBDT05GSUdfSUE2NAorCWlmICghaHdpZi0+aXJxKQorCQlod2lmLT5pcnEgPSBod2lmLT5jaGFubmVsID8gMTUgOiAxNDsKKyNlbmRpZiAvKiBDT05GSUdfSUE2NCAqLworCisJaWYgKGh3aWYtPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxTVgpIHsKKwkJLyogVGhpcyBpcyBhIHBhaW5mdWwgc3lzdGVtIGJlc3QgdG8gbGV0IGl0IHNlbGYgdHVuZSBmb3Igbm93ICovCisJCXJldHVybjsKKwl9CisKKwlod2lmLT5hdXRvZG1hID0gMDsKKwlod2lmLT50dW5lcHJvYyA9ICZwaWl4X3R1bmVfZHJpdmU7CisJaHdpZi0+c3BlZWRwcm9jID0gJnBpaXhfdHVuZV9jaGlwc2V0OworCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gMTsKKworCWlmICghaHdpZi0+ZG1hX2Jhc2UpCisJCXJldHVybjsKKworCWh3aWYtPmF0YXBpX2RtYSA9IDE7CisJaHdpZi0+dWx0cmFfbWFzayA9IDB4M2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDY7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDQ7CisKKwlzd2l0Y2goaHdpZi0+cGNpX2Rldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MU1YOgorCQkJaHdpZi0+bXdkbWFfbWFzayA9IDB4ODA7CisJCQlod2lmLT5zd2RtYV9tYXNrID0gMHg4MDsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMToKKwkJCWh3aWYtPnVsdHJhX21hc2sgPSAweDgwOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNNWF8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTFOWDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMToKKwkJCWh3aWYtPnVsdHJhX21hc2sgPSAweDA3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDU0LCAmcmVnNTRoKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTUsICZyZWc1NWgpOworCQkJYXRhNjYgPSAocmVnNTRoICYgbWFzaykgPyAxIDogMDsKKwkJCWJyZWFrOworCX0KKworCWlmICghKGh3aWYtPnVkbWFfZm91cikpCisJCWh3aWYtPnVkbWFfZm91ciA9IGF0YTY2OworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmcGlpeF9jb25maWdfZHJpdmVfeGZlcl9yYXRlOworCWlmICghbm9hdXRvZG1hKQorCQlod2lmLT5hdXRvZG1hID0gMTsKKworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9QSUlYX0RFVihuYW1lX3N0cikgXAorCXsJCQkJCQlcCisJCS5uYW1lCQk9IG5hbWVfc3RyLAkJXAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3BpaXgsCVwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9waWl4LAlcCisJCS5jaGFubmVscwk9IDIsCQkJXAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCQlcCisJCS5lbmFibGViaXRzCT0ge3sweDQxLDB4ODAsMHg4MH0sIHsweDQzLDB4ODAsMHg4MH19LCBcCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAkJXAorCX0KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgcGlpeF9wY2lfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogIDAgKi8gREVDTEFSRV9QSUlYX0RFVigiUElJWGEiKSwKKwkvKiAgMSAqLyBERUNMQVJFX1BJSVhfREVWKCJQSUlYYiIpLAorCisJewkvKiAyICovCisJCS5uYW1lCQk9ICJNUElJWCIsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcGlpeCwKKwkJLmNoYW5uZWxzCT0gMiwKKwkJLmF1dG9kbWEJPSBOT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NkQsMHg4MCwweDgwfSwgezB4NkYsMHg4MCwweDgwfX0sCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sCisKKwkvKiAgMyAqLyBERUNMQVJFX1BJSVhfREVWKCJQSUlYMyIpLAorCS8qICA0ICovIERFQ0xBUkVfUElJWF9ERVYoIlBJSVg0IiksCisJLyogIDUgKi8gREVDTEFSRV9QSUlYX0RFVigiSUNIMCIpLAorCS8qICA2ICovIERFQ0xBUkVfUElJWF9ERVYoIlBJSVg0IiksCisJLyogIDcgKi8gREVDTEFSRV9QSUlYX0RFVigiSUNIIiksCisJLyogIDggKi8gREVDTEFSRV9QSUlYX0RFVigiUElJWDQiKSwKKwkvKiAgOSAqLyBERUNMQVJFX1BJSVhfREVWKCJQSUlYNCIpLAorCS8qIDEwICovIERFQ0xBUkVfUElJWF9ERVYoIklDSDIiKSwKKwkvKiAxMSAqLyBERUNMQVJFX1BJSVhfREVWKCJJQ0gyTSIpLAorCS8qIDEyICovIERFQ0xBUkVfUElJWF9ERVYoIklDSDNNIiksCisJLyogMTMgKi8gREVDTEFSRV9QSUlYX0RFVigiSUNIMyIpLAorCS8qIDE0ICovIERFQ0xBUkVfUElJWF9ERVYoIklDSDQiKSwKKwkvKiAxNSAqLyBERUNMQVJFX1BJSVhfREVWKCJJQ0g1IiksCisJLyogMTYgKi8gREVDTEFSRV9QSUlYX0RFVigiQy1JQ0giKSwKKwkvKiAxNyAqLyBERUNMQVJFX1BJSVhfREVWKCJJQ0g0IiksCisJLyogMTggKi8gREVDTEFSRV9QSUlYX0RFVigiSUNINS1TQVRBIiksCisJLyogMTkgKi8gREVDTEFSRV9QSUlYX0RFVigiSUNINSIpLAorCS8qIDIwICovIERFQ0xBUkVfUElJWF9ERVYoIklDSDYiKSwKKwkvKiAyMSAqLyBERUNMQVJFX1BJSVhfREVWKCJJQ0g3IiksCisJLyogMjIgKi8gREVDTEFSRV9QSUlYX0RFVigiSUNINCIpLAorfTsKKworLyoqCisgKglwaWl4X2luaXRfb25lCS0JY2FsbGVkIHdoZW4gYSBQSUlYIGlzIGZvdW5kCisgKglAZGV2OiB0aGUgcGlpeCBkZXZpY2UKKyAqCUBpZDogdGhlIG1hdGNoaW5nIHBjaSBpZAorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBQQ0kgcmVnaXN0cmF0aW9uIGxheWVyIChvciB0aGUgSURFIGluaXRpYWxpemF0aW9uKQorICoJZmluZHMgYSBkZXZpY2UgbWF0Y2hpbmcgb3VyIElERSBkZXZpY2UgdGFibGVzLgorICovCisgCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwaWl4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZGVfcGNpX2RldmljZV90ICpkID0gJnBpaXhfcGNpX2luZm9baWQtPmRyaXZlcl9kYXRhXTsKKworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCisvKioKKyAqCXBpaXhfY2hlY2tfNDUwbngJLQlDaGVjayBmb3IgcHJvYmxlbSA0NTBOWCBzZXR1cAorICoJCisgKglDaGVjayBmb3IgdGhlIHByZXNlbnQgb2YgNDUwTlggZXJyYXRhICMxOSBhbmQgZXJyYXRhICMyNS4gSWYKKyAqCXRoZXkgYXJlIGZvdW5kLCBkaXNhYmxlIHVzZSBvZiBETUEgSURFCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBpaXhfY2hlY2tfNDUwbngodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdTE2IGNmZzsKKwl1OCByZXY7CisJd2hpbGUoKHBkZXY9cGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTROWCwgcGRldikpIT1OVUxMKQorCXsKKwkJLyogTG9vayBmb3IgNDUwTlggUFhCLiBDaGVjayBmb3IgcHJvYmxlbSBjb25maWd1cmF0aW9ucworCQkgICBBIFBDSSBxdWlyayBjaGVja3MgYml0IDYgYWxyZWFkeSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXYpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDQxLCAmY2ZnKTsKKwkJLyogT25seSBvbiB0aGUgb3JpZ2luYWwgcmV2aXNpb246IElERSBETUEgY2FuIGhhbmcgKi8KKwkJaWYocmV2ID09IDB4MDApCisJCQlub19waWl4X2RtYSA9IDE7CisJCS8qIE9uIGFsbCByZXZpc2lvbnMgYmVsb3cgNSBQWEIgYnVzIGxvY2sgbXVzdCBiZSBkaXNhYmxlZCBmb3IgSURFICovCisJCWVsc2UgaWYoY2ZnICYgKDE8PDE0KSAmJiByZXYgPCA1KQorCQkJbm9fcGlpeF9kbWEgPSAyOworCX0KKwlpZihub19waWl4X2RtYSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGlpeDogNDUwTlggZXJyYXRhIHByZXNlbnQsIGRpc2FibGluZyBJREUgRE1BLlxuIik7CisJaWYobm9fcGlpeF9kbWEgPT0gMikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGlpeDogQSBCSU9TIHVwZGF0ZSBtYXkgcmVzb2x2ZSB0aGlzLlxuIik7Cit9CQkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBpaXhfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUZCXzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUZCXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MU1YLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDN9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDV9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDZ9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDd9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MkZCXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDh9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDl9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV84LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMX0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTAsUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTJ9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzExLFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMSxQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMTEsUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTV9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVfMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE2fSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMCxQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxN30sCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1NBVEEKKyAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTh9LAorI2VuZGlmCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl8yLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxOX0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18yMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMjF9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIyfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBpaXhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIlBJSVhfSURFIiwKKwkuaWRfdGFibGUJPSBwaWl4X3BjaV90YmwsCisJLnByb2JlCQk9IHBpaXhfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwaWl4X2lkZV9pbml0KHZvaWQpCit7CisJcGlpeF9jaGVja180NTBueCgpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGlpeF9pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlIEhlZHJpY2ssIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3oiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIEludGVsIFBJSVggSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvcnoxMDAwLmMgYi9kcml2ZXJzL2lkZS9wY2kvcnoxMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4Y2Q3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9yejEwMDAuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9yejEwMDAuYwlWZXJzaW9uIDAuMDYJSmFudWFyeSAxMiwgMjAwMworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCAgTGludXMgVG9ydmFsZHMgJiBhdXRob3IgKHNlZSBiZWxvdykKKyAqLworCisvKgorICogIFByaW5jaXBhbCBBdXRob3I6ICBtbG9yZEBwb2JveC5jb20gKE1hcmsgTG9yZCkKKyAqCisgKiAgU2VlIGxpbnV4L01BSU5UQUlORVJTIGZvciBhZGRyZXNzIG9mIGN1cnJlbnQgbWFpbnRhaW5lci4KKyAqCisgKiAgVGhpcyBmaWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGRpc2FibGluZyB0aGUgYnVnZ3kgcmVhZC1haGVhZAorICogIG1vZGUgb2YgdGhlIFJaMTAwMCBJREUgY2hpcHNldCwgY29tbW9ubHkgdXNlZCBvbiBJbnRlbCBtb3RoZXJib2FyZHMuCisgKgorICogIER1bm5vIGlmIHRoaXMgZml4ZXMgYm90aCBwb3J0cywgb3Igb25seSB0aGUgcHJpbWFyeSBwb3J0ICg/KS4KKyAqLworCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JCS8qIG1vc3Qgc3lzdGVtcyBjYW4gc2FmZWx5IHVuZGVmIHRoaXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX0JMS19ERVZfSURFUENJICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3J6MTAwMCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1MTYgcmVnOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OworCisJaHdpZi0+Y2hpcHNldCA9IGlkZV9yejEwMDA7CisJaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZCAoZGV2LCAweDQwLCAmcmVnKSAmJgorCSAgICAhcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MCwgcmVnICYgMHhkZmZmKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZGlzYWJsZWQgY2hpcHNldCByZWFkLWFoZWFkICIKKwkJCSIoYnVnZ3kgUloxMDAwL1JaMTAwMSlcbiIsIGh3aWYtPm5hbWUpOworCX0gZWxzZSB7CisJCWh3aWYtPnNlcmlhbGl6ZWQgPSAxOworCQlod2lmLT5kcml2ZXNbMF0ubm9fdW5tYXNrID0gMTsKKwkJaHdpZi0+ZHJpdmVzWzFdLm5vX3VubWFzayA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXJpYWxpemVkLCBkaXNhYmxlZCB1bm1hc2tpbmcgIgorCQkJIihidWdneSBSWjEwMDAvUloxMDAxKVxuIiwgaHdpZi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCByejEwMDBfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJSWjEwMHgiLAorCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfcnoxMDAwLAorCS5jaGFubmVscwk9IDIsCisJLmF1dG9kbWEJPSBOT0RNQSwKKwkuYm9vdGFibGUJPSBPTl9CT0FSRCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ6MTAwMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJnJ6MTAwMF9jaGlwc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ6MTAwMF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1BDVEVDSCwgUENJX0RFVklDRV9JRF9QQ1RFQ0hfUloxMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnoxMDAwX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJSWjEwMDBfSURFIiwKKwkuaWRfdGFibGUJPSByejEwMDBfcGNpX3RibCwKKwkucHJvYmUJCT0gcnoxMDAwX2luaXRfb25lLAorfTsKKworc3RhdGljIGludCByejEwMDBfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ6MTAwMF9pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIFJaMTAwMCBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jIGIvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmRhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMJCVZlcnNpb24gMC45MQkyOC1KYW4tMjAwMworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAyCQlNYXJrIExvcmQgPG1sb3JkQHBvYm94LmNvbT4KKyAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY2hpcHNldCBkcml2ZXIgd2FzIGZ1bmRlZAorICogYnkgdGhlIG5pY2UgZm9sa3MgYXQgTmF0aW9uYWwgU2VtaWNvbmR1Y3Rvci4KKyAqCisgKiBEb2N1bWVudGF0aW9uOgorICoJQXZhaWxhYmxlIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFNDMTIwMF9SRVZfQQkweDAwCisjZGVmaW5lIFNDMTIwMF9SRVZfQjEJMHgwMQorI2RlZmluZSBTQzEyMDBfUkVWX0IzCTB4MDIKKyNkZWZpbmUgU0MxMjAwX1JFVl9DMQkweDAzCisjZGVmaW5lIFNDMTIwMF9SRVZfRDEJMHgwNAorCisjZGVmaW5lIFBDSV9DTEtfMzMJMHgwMAorI2RlZmluZSBQQ0lfQ0xLXzQ4CTB4MDEKKyNkZWZpbmUgUENJX0NMS182NgkweDAyCisjZGVmaW5lIFBDSV9DTEtfMzNBCTB4MDMKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNjMTIwMF9nZXRfcGNpX2Nsb2NrICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgY2hpcF9pZCwgc2lsaWNvbl9yZXZpc2lvbjsKKwl1bnNpZ25lZCBpbnQgcGNpX2Nsb2NrOworCS8qCisJICogQ2hlY2sgdGhlIHNpbGljb24gcmV2aXNpb24sIGFzIG5vdCBhbGwgdmVyc2lvbnMgb2YgdGhlIGNoaXAKKwkgKiBoYXZlIHRoZSByZWdpc3RlciB3aXRoIHRoZSBmYXN0IFBDSSBidXMgdGltaW5ncy4KKwkgKi8KKwljaGlwX2lkID0gaW5iICgweDkwM2MpOworCXNpbGljb25fcmV2aXNpb24gPSBpbmIgKDB4OTAzZCk7CisKKwkvLyBSZWFkIHRoZSBmYXN0IHBjaSBjbG9jayBmcmVxdWVuY3kKKwlpZiAoY2hpcF9pZCA9PSAweDA0ICYmIHNpbGljb25fcmV2aXNpb24gPCBTQzEyMDBfUkVWX0IxKSB7CisJCXBjaV9jbG9jayA9IFBDSV9DTEtfMzM7CisJfSBlbHNlIHsKKwkJLy8gY2hlY2sgY2xvY2sgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gKGNmY2MpCisJCS8vIHRoZSBjbG9jayBpcyBpbiBiaXRzIDggYW5kIDkgb2YgdGhpcyB3b3JkCisKKwkJcGNpX2Nsb2NrID0gaW53ICgweDkwMWUpOworCQlwY2lfY2xvY2sgPj49IDg7CisJCXBjaV9jbG9jayAmPSAweDAzOworCQlpZiAocGNpX2Nsb2NrID09IFBDSV9DTEtfMzNBKQorCQkJcGNpX2Nsb2NrID0gUENJX0NMS18zMzsKKwl9CisJcmV0dXJuIHBjaV9jbG9jazsKK30KKworZXh0ZXJuIGNoYXIgKmlkZV94ZmVyX3ZlcmJvc2UgKGJ5dGUgeGZlcl9yYXRlKTsKKworLyoKKyAqIFNldCBhIG5ldyB0cmFuc2ZlciBtb2RlIGF0IHRoZSBkcml2ZQorICovCitzdGF0aWMgaW50IHNjMTIwMF9zZXRfeGZlcl9tb2RlIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgbW9kZSkKK3sKKwlwcmludGsoIiVzOiBzYzEyMDBfc2V0X3hmZXJfbW9kZSglcylcbiIsIGRyaXZlLT5uYW1lLCBpZGVfeGZlcl92ZXJib3NlKG1vZGUpKTsKKwlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgbW9kZSk7Cit9CisKKy8qCisgKiBIZXJlIGFyZSB0aGUgc3RhbmRhcmQgUElPIG1vZGUgMC00IHRpbWluZ3MgZm9yIGVhY2ggImZvcm1hdCIuCisgKiBGb3JtYXQtMCB1c2VzIGZhc3QgZGF0YSByZWcgdGltaW5ncywgd2l0aCBzbG93ZXIgY29tbWFuZCByZWcgdGltaW5ncy4KKyAqIEZvcm1hdC0xIHVzZXMgZmFzdCB0aW1pbmdzIGZvciBhbGwgcmVnaXN0ZXJzLCBidXQgd29uJ3Qgd29yayB3aXRoIGFsbCBkcml2ZXMuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2MxMjAwX3Bpb190aW1pbmdzWzRdWzVdID0KKwl7ezB4MDAwMDkxNzIsIDB4MDAwMTIxNzEsIDB4MDAwMjAwODAsIDB4MDAwMzIwMTAsIDB4MDAwNDAwMTB9LAkvLyBmb3JtYXQwICAzM01oegorCSB7MHhkMTMyOTE3MiwgMHg3MTIxMjE3MSwgMHgzMDIwMDA4MCwgMHgyMDEwMjAxMCwgMHgwMDEwMDAxMH0sCS8vIGZvcm1hdDEsIDMzTWh6CisJIHsweGZhYTNmNGYzLCAweGMyMzIzMmIyLCAweDUxMzEwMWMxLCAweDMxMjEzMTIxLCAweDEwMjExMDIxfSwJLy8gZm9ybWF0MSwgNDhNaHoKKwkgezB4ZmZmNGZmZjQsIDB4ZjM1MzUzZDMsIDB4ODE0MTAyZjEsIDB4NDIzMTQyMzEsIDB4MTEzMTExMzF9fTsJLy8gZm9ybWF0MSwgNjZNaHoKKworLyoKKyAqIEFmdGVyIGNoaXAgcmVzZXQsIHRoZSBQSU8gdGltaW5ncyBhcmUgc2V0IHRvIDB4MDAwMDkxNzIsIHdoaWNoIGlzIG5vdCB2YWxpZC4KKyAqLworLy8jZGVmaW5lIFNDMTIwMF9CQURfUElPKHRpbWluZ3MpICgoKHRpbWluZ3MpJn4weDgwMDAwMDAwKT09MHgwMDAwOTE3MikKKworc3RhdGljIGludCBzYzEyMDBfYXV0b3NlbGVjdF9kbWFfbW9kZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludAkJCXVkbWFfb2sgPSAxLCBtb2RlID0gMDsKKwlpZGVfaHdpZl90CQkqaHdpZiA9IEhXSUYoZHJpdmUpOworCWludAkJCXVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlpZGVfZHJpdmVfdAkJKm1hdGUgPSAmaHdpZi0+ZHJpdmVzW3VuaXReMV07CisJc3RydWN0IGhkX2RyaXZlaWQJKmlkID0gZHJpdmUtPmlkOworCisJLyoKKwkgKiBUaGUgU0MxMjAwIHNwZWNpZmllcyB0aGF0IHR3byBkcml2ZXMgc2hhcmluZyBhIGNhYmxlIGNhbm5vdAorCSAqIG1peCBVRE1BL01ETUEuICBJdCBoYXMgdG8gYmUgb25lIG9yIHRoZSBvdGhlciwgZm9yIHRoZSBwYWlyLAorCSAqIHRob3VnaCBkaWZmZXJlbnQgdGltaW5ncyBjYW4gc3RpbGwgYmUgY2hvc2VuIGZvciBlYWNoIGRyaXZlLgorCSAqIFdlIGNvdWxkIHNldCB0aGUgYXBwcm9wcmlhdGUgdGltaW5nIGJpdHMgb24gdGhlIGZseSwKKwkgKiBidXQgdGhhdCBtaWdodCBiZSBhIGJpdCBjb25mdXNpbmcuICBTbywgZm9yIG5vdyB3ZSBzdGF0aWNhbGx5CisJICogaGFuZGxlIHRoaXMgcmVxdWlyZW1lbnQgYnkgbG9va2luZyBhdCBvdXIgbWF0ZSBkcml2ZSB0byBzZWUKKwkgKiB3aGF0IGl0IGlzIGNhcGFibGUgb2YsIGJlZm9yZSBjaG9vc2luZyBhIG1vZGUgZm9yIG91ciBvd24gZHJpdmUuCisJICovCisJaWYgKG1hdGUtPnByZXNlbnQpIHsKKwkJc3RydWN0IGhkX2RyaXZlaWQgKm1hdGVpZCA9IG1hdGUtPmlkOworCQlpZiAobWF0ZWlkICYmIChtYXRlaWQtPmNhcGFiaWxpdHkgJiAxKSAmJiAhX19pZGVfZG1hX2JhZF9kcml2ZShtYXRlKSkgeworCQkJaWYgKChtYXRlaWQtPmZpZWxkX3ZhbGlkICYgNCkgJiYgKG1hdGVpZC0+ZG1hX3VsdHJhICYgNykpCisJCQkJdWRtYV9vayA9IDE7CisJCQllbHNlIGlmICgobWF0ZWlkLT5maWVsZF92YWxpZCAmIDIpICYmIChtYXRlaWQtPmRtYV9td29yZCAmIDcpKQorCQkJCXVkbWFfb2sgPSAwOworCQkJZWxzZQorCQkJCXVkbWFfb2sgPSAxOworCQl9CisJfQorCS8qCisJICogTm93IHNlZSB3aGF0IHRoZSBjdXJyZW50IGRyaXZlIGlzIGNhcGFibGUgb2YsCisJICogc2VsZWN0aW5nIFVETUEgb25seSBpZiB0aGUgbWF0ZSBzYWlkIGl0IHdhcyBvay4KKwkgKi8KKwlpZiAoaWQgJiYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgaHdpZi0+YXV0b2RtYSAmJiAhX19pZGVfZG1hX2JhZF9kcml2ZShkcml2ZSkpIHsKKwkJaWYgKHVkbWFfb2sgJiYgKGlkLT5maWVsZF92YWxpZCAmIDQpICYmIChpZC0+ZG1hX3VsdHJhICYgNykpIHsKKwkJCWlmICAgICAgKGlkLT5kbWFfdWx0cmEgJiA0KQorCQkJCW1vZGUgPSBYRkVSX1VETUFfMjsKKwkJCWVsc2UgaWYgKGlkLT5kbWFfdWx0cmEgJiAyKQorCQkJCW1vZGUgPSBYRkVSX1VETUFfMTsKKwkJCWVsc2UgaWYgKGlkLT5kbWFfdWx0cmEgJiAxKQorCQkJCW1vZGUgPSBYRkVSX1VETUFfMDsKKwkJfQorCQlpZiAoIW1vZGUgJiYgKGlkLT5maWVsZF92YWxpZCAmIDIpICYmIChpZC0+ZG1hX213b3JkICYgNykpIHsKKwkJCWlmICAgICAgKGlkLT5kbWFfbXdvcmQgJiA0KQorCQkJCW1vZGUgPSBYRkVSX01XX0RNQV8yOworCQkJZWxzZSBpZiAoaWQtPmRtYV9td29yZCAmIDIpCisJCQkJbW9kZSA9IFhGRVJfTVdfRE1BXzE7CisJCQllbHNlIGlmIChpZC0+ZG1hX213b3JkICYgMSkKKwkJCQltb2RlID0gWEZFUl9NV19ETUFfMDsKKwkJfQorCX0KKwlyZXR1cm4gbW9kZTsKK30KKworLyoKKyAqIHNjMTIwMF9jb25maWdfZG1hMigpIGhhbmRsZXMgc2VsZWN0aW9uL3NldHRpbmcgb2YgRE1BL1VETUEgbW9kZXMKKyAqIGZvciBib3RoIHRoZSBjaGlwc2V0IGFuZCBkcml2ZS4KKyAqLworc3RhdGljIGludCBzYzEyMDBfY29uZmlnX2RtYTIgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1vZGUpCit7CisJaWRlX2h3aWZfdAkJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpbnQJCQl1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJdW5zaWduZWQgaW50CQlyZWcsIHRpbWluZ3M7CisJdW5zaWduZWQgc2hvcnQJCXBjaV9jbG9jazsKKwl1bnNpZ25lZCBpbnQJCWJhc2VyZWcgPSBod2lmLT5jaGFubmVsID8gMHg1MCA6IDB4NDA7CisKKwkvKgorCSAqIERlZmF1bHQgdG8gRE1BLW9mZiBpbiBjYXNlIHdlIHJ1biBpbnRvIHRyb3VibGUgaGVyZS4KKwkgKi8KKwlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsJCQkvKiB0dXJuIG9mZiBETUEgd2hpbGUgd2UgZmlkZGxlICovCisJb3V0YihpbmIoaHdpZi0+ZG1hX2Jhc2UrMikmfih1bml0PzB4NDA6MHgyMCksIGh3aWYtPmRtYV9iYXNlKzIpOyAvKiBjbGVhciBETUFfY2FwYWJsZSBiaXQgKi8KKworCS8qCisJICogVGVsbCB0aGUgZHJpdmUgdG8gc3dpdGNoIHRvIHRoZSBuZXcgbW9kZTsgYWJvcnQgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAoIW1vZGUgfHwgc2MxMjAwX3NldF94ZmVyX21vZGUoZHJpdmUsIG1vZGUpKSB7CisJCXByaW50aygiU0MxMjAwOiBzZXQgeGZlciBtb2RlIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gMTsJLyogZmFpbHVyZSAqLworCX0KKworCXBjaV9jbG9jayA9IHNjMTIwMF9nZXRfcGNpX2Nsb2NrKCk7CisKKwkvKgorCSAqIE5vdyB0dW5lIHRoZSBjaGlwc2V0IHRvIG1hdGNoIHRoZSBkcml2ZToKKwkgKgorCSAqIE5vdGUgdGhhdCBlYWNoIERNQSBtb2RlIGhhcyBzZXZlcmFsIHRpbWluZ3MgYXNzb2NpYXRlZCB3aXRoIGl0LgorCSAqIFRoZSBjb3JyZWN0IHRpbWluZyBkZXBlbmRzIG9uIHRoZSBmYXN0IFBDSSBjbG9jayBmcmVxLgorCSAqLworCXRpbWluZ3MgPSAwOworCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFhGRVJfVURNQV8wOgorCQkJc3dpdGNoIChwY2lfY2xvY2spIHsKKwkJCQljYXNlIFBDSV9DTEtfMzM6CXRpbWluZ3MgPSAweDAwOTIxMjUwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNDg6CXRpbWluZ3MgPSAweDAwOTMyNDcwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNjY6CXRpbWluZ3MgPSAweDAwOTQzNmExOwlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGRVJfVURNQV8xOgorCQkJc3dpdGNoIChwY2lfY2xvY2spIHsKKwkJCQljYXNlIFBDSV9DTEtfMzM6CXRpbWluZ3MgPSAweDAwOTExMTQwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNDg6CXRpbWluZ3MgPSAweDAwOTIyMjYwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNjY6CXRpbWluZ3MgPSAweDAwOTMzNDgxOwlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGRVJfVURNQV8yOgorCQkJc3dpdGNoIChwY2lfY2xvY2spIHsKKwkJCQljYXNlIFBDSV9DTEtfMzM6CXRpbWluZ3MgPSAweDAwOTExMDMwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNDg6CXRpbWluZ3MgPSAweDAwOTIyMTQwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNjY6CXRpbWluZ3MgPSAweDAwOTIzMjYxOwlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzA6CisJCQlzd2l0Y2ggKHBjaV9jbG9jaykgeworCQkJCWNhc2UgUENJX0NMS18zMzoJdGltaW5ncyA9IDB4MDAwNzc3NzE7CWJyZWFrOworCQkJCWNhc2UgUENJX0NMS180ODoJdGltaW5ncyA9IDB4MDAwYmJiYjI7CWJyZWFrOworCQkJCWNhc2UgUENJX0NMS182NjoJdGltaW5ncyA9IDB4MDAwZmZmZjM7CWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJCXN3aXRjaCAocGNpX2Nsb2NrKSB7CisJCQkJY2FzZSBQQ0lfQ0xLXzMzOgl0aW1pbmdzID0gMHgwMDAxMjEyMTsJYnJlYWs7CisJCQkJY2FzZSBQQ0lfQ0xLXzQ4Ogl0aW1pbmdzID0gMHgwMDAyNDI0MTsJYnJlYWs7CisJCQkJY2FzZSBQQ0lfQ0xLXzY2Ogl0aW1pbmdzID0gMHgwMDAzNTM1MjsJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQkJc3dpdGNoIChwY2lfY2xvY2spIHsKKwkJCQljYXNlIFBDSV9DTEtfMzM6CXRpbWluZ3MgPSAweDAwMDAyMDIwOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNDg6CXRpbWluZ3MgPSAweDAwMDEzMTMxOwlicmVhazsKKwkJCQljYXNlIFBDSV9DTEtfNjY6CXRpbWluZ3MgPSAweDAwMDE1MTUxOwlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmICh0aW1pbmdzID09IDApIHsKKwkJcHJpbnRrKCIlczogc2MxMjAwX2NvbmZpZ19kbWE6IGh1aD8gbW9kZT0lMDJ4IGNsaz0leCBcbiIsIGRyaXZlLT5uYW1lLCBtb2RlLCBwY2lfY2xvY2spOworCQlyZXR1cm4gMTsJLyogZmFpbHVyZSAqLworCX0KKworCWlmICh1bml0ID09IDApIHsJCQkvKiBhcmUgd2UgY29uZmlndXJpbmcgZHJpdmUwPyAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaHdpZi0+cGNpX2RldiwgYmFzZXJlZys0LCAmcmVnKTsKKwkJdGltaW5ncyB8PSByZWcgJiAweDgwMDAwMDAwOwkvKiBwcmVzZXJ2ZSBQSU8gZm9ybWF0IGJpdCAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGh3aWYtPnBjaV9kZXYsIGJhc2VyZWcrNCwgdGltaW5ncyk7CisJfSBlbHNlIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCBiYXNlcmVnKzEyLCB0aW1pbmdzKTsKKwl9CisKKwlvdXRiKGluYihod2lmLT5kbWFfYmFzZSsyKXwodW5pdD8weDQwOjB4MjApLCBod2lmLT5kbWFfYmFzZSsyKTsJLyogc2V0IERNQV9jYXBhYmxlIGJpdCAqLworCisJLyoKKwkgKiBGaW5hbGx5LCB0dXJuIERNQSBvbiBpbiBzb2Z0d2FyZSwgYW5kIGV4aXQuCisJICovCisJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOwkvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBzYzEyMDBfY29uZmlnX2RtYSgpIGhhbmRsZXMgc2VsZWN0aW9uL3NldHRpbmcgb2YgRE1BL1VETUEgbW9kZXMKKyAqIGZvciBib3RoIHRoZSBjaGlwc2V0IGFuZCBkcml2ZS4KKyAqLworc3RhdGljIGludCBzYzEyMDBfY29uZmlnX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiBzYzEyMDBfY29uZmlnX2RtYTIoZHJpdmUsIHNjMTIwMF9hdXRvc2VsZWN0X2RtYV9tb2RlKGRyaXZlKSk7Cit9CisKKworLyogIFJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgaWRlX2RtYV9lbmQgYWN0aW9uIGluCisgKiAgZG1hX3Byb2MuCisgKgorICogIHJldHVybnMgMSBvbiBlcnJvciwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzYzEyMDBfaWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOworCWJ5dGUgZG1hX3N0YXQ7CisKKwlkbWFfc3RhdCA9IGluYihkbWFfYmFzZSsyKTsJCS8qIGdldCBETUEgc3RhdHVzICovCisKKwlpZiAoIShkbWFfc3RhdCAmIDQpKQorCQlwcmludGsoIiBpZGVfZG1hX2VuZCBkbWFfc3RhdD0lMHggZXJyPSV4IG5ld2Vycj0leFxuIiwKKwkJICBkbWFfc3RhdCwgKChkbWFfc3RhdCY3KSE9NCksICgoZG1hX3N0YXQmMik9PTIpKTsKKworCW91dGIoZG1hX3N0YXR8MHgxYiwgZG1hX2Jhc2UrMik7CS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLworCW91dGIoaW5iKGRtYV9iYXNlKSZ+MSwgZG1hX2Jhc2UpOwkvKiAhISBETyBUSElTIEhFUkUgISEgc3RvcCBETUEgKi8KKworCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOworCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsJCS8qIHB1cmdlIERNQSBtYXBwaW5ncyAqLworCisJcmV0dXJuIChkbWFfc3RhdCAmIDcpICE9IDQ7CQkvKiB2ZXJpZnkgZ29vZCBETUEgc3RhdHVzICovCit9CisKKy8qCisgKiBzYzEyMDBfdHVuZXByb2MoKSBoYW5kbGVzIHNlbGVjdGlvbi9zZXR0aW5nIG9mIFBJTyBtb2RlcworICogZm9yIGJvdGggdGhlIGNoaXBzZXQgYW5kIGRyaXZlLgorICoKKyAqIEFsbCBleGlzdGluZyBCSU9TcyBmb3IgdGhpcyBjaGlwc2V0IGd1YXJhbnRlZSB0aGF0IGFsbCBkcml2ZXMKKyAqIHdpbGwgaGF2ZSB2YWxpZCBkZWZhdWx0IFBJTyB0aW1pbmdzIHNldCB1cCBiZWZvcmUgd2UgZ2V0IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNjMTIwMF90dW5lcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIHBpbykJLyogbW9kZT0yNTUgbWVhbnMgImF1dG90dW5lIiAqLworeworCWlkZV9od2lmX3QJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBpbnQJZm9ybWF0OworCXN0YXRpYyBieXRlCW1vZGVzWzVdID0ge1hGRVJfUElPXzAsIFhGRVJfUElPXzEsIFhGRVJfUElPXzIsIFhGRVJfUElPXzMsIFhGRVJfUElPXzR9OworCWludAkJbW9kZSA9IC0xOworCisJc3dpdGNoIChwaW8pIHsKKwkJY2FzZSAyMDA6IG1vZGUgPSBYRkVSX1VETUFfMDsJYnJlYWs7CisJCWNhc2UgMjAxOiBtb2RlID0gWEZFUl9VRE1BXzE7CWJyZWFrOworCQljYXNlIDIwMjogbW9kZSA9IFhGRVJfVURNQV8yOwlicmVhazsKKwkJY2FzZSAxMDA6IG1vZGUgPSBYRkVSX01XX0RNQV8wOwlicmVhazsKKwkJY2FzZSAxMDE6IG1vZGUgPSBYRkVSX01XX0RNQV8xOwlicmVhazsKKwkJY2FzZSAxMDI6IG1vZGUgPSBYRkVSX01XX0RNQV8yOwlicmVhazsKKwl9CisJaWYgKG1vZGUgIT0gLTEpIHsKKwkJcHJpbnRrKCJTQzEyMDA6ICVzOiBjaGFuZ2luZyAoVSlETUEgbW9kZVxuIiwgZHJpdmUtPm5hbWUpOworCQkodm9pZClzYzEyMDBfY29uZmlnX2RtYTIoZHJpdmUsIG1vZGUpOworCQlyZXR1cm47CisJfQorCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDQsIE5VTEwpOworCXByaW50aygiU0MxMjAwOiAlczogc2V0dGluZyBQSU8gbW9kZSVkXG4iLCBkcml2ZS0+bmFtZSwgcGlvKTsKKwlpZiAoIXNjMTIwMF9zZXRfeGZlcl9tb2RlKGRyaXZlLCBtb2Rlc1twaW9dKSkgeworCQl1bnNpZ25lZCBpbnQgYmFzZXJlZyA9IGh3aWYtPmNoYW5uZWwgPyAweDUwIDogMHg0MDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChod2lmLT5wY2lfZGV2LCBiYXNlcmVnKzQsICZmb3JtYXQpOworCQlmb3JtYXQgPSAoZm9ybWF0ID4+IDMxKSAmIDE7CisJCWlmIChmb3JtYXQpCisJCQlmb3JtYXQgKz0gc2MxMjAwX2dldF9wY2lfY2xvY2soKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCBiYXNlcmVnICsgKGRyaXZlLT5zZWxlY3QuYi51bml0IDw8IDMpLCBzYzEyMDBfcGlvX3RpbWluZ3NbZm9ybWF0XVtwaW9dKTsKKyAJfQorfQorCitzdGF0aWMgaWRlX2h3aWZfdCAqbG9va3VwX3BjaV9kZXYgKGlkZV9od2lmX3QgKnByZXYsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50CWg7CisKKwlmb3IgKGggPSAwOyBoIDwgTUFYX0hXSUZTOyBoKyspIHsKKwkJaWRlX2h3aWZfdCAqaHdpZiA9ICZpZGVfaHdpZnNbaF07CisJCWlmIChwcmV2KSB7CisJCQlpZiAoaHdpZiA9PSBwcmV2KQorCQkJCXByZXYgPSBOVUxMOwkvLyBmb3VuZCBwcmV2aW91cywgbm93IGxvb2sgZm9yIG5leHQgbWF0Y2gKKwkJfSBlbHNlIHsKKwkJCWlmIChod2lmICYmIGh3aWYtPnBjaV9kZXYgPT0gZGV2KQorCQkJCXJldHVybiBod2lmOwkvLyBmb3VuZCBuZXh0IG1hdGNoCisJCX0KKwl9CisJcmV0dXJuIE5VTEw7CS8vIG5vdCBmb3VuZAorfQorCit0eXBlZGVmIHN0cnVjdCBzYzEyMDBfc2F2ZWRfc3RhdGVfcyB7CisJX191MzIJCXJlZ3NbNF07Cit9IHNjMTIwMF9zYXZlZF9zdGF0ZV90OworCisKK3N0YXRpYyBpbnQgc2MxMjAwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlpZGVfaHdpZl90CQkqaHdpZiA9IE5VTEw7CisKKwlwcmludGsoIlNDMTIwMDogc3VzcGVuZCgldSlcbiIsIHN0YXRlKTsKKworCWlmIChzdGF0ZSA9PSAwKSB7CisJCS8vIHdlIG9ubHkgc2F2ZSBzdGF0ZSB3aGVuIGdvaW5nIGZyb20gZnVsbCBwb3dlciB0byBsZXNzCisKKwkJLy8KKwkJLy8gTG9vcCBvdmVyIGFsbCBpbnRlcmZhY2VzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBQQ0kgZGV2aWNlOgorCQkvLworCQl3aGlsZSAoKGh3aWYgPSBsb29rdXBfcGNpX2Rldihod2lmLCBkZXYpKSAhPSBOVUxMKSB7CisJCQlzYzEyMDBfc2F2ZWRfc3RhdGVfdAkqc3M7CisJCQl1bnNpZ25lZCBpbnQJCWJhc2VyZWcsIHI7CisJCQkvLworCQkJLy8gYWxsb2NhdGUgYSBwZXJtYW5lbnQgc2F2ZSBhcmVhLCBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQKKwkJCS8vCisJCQlzcyA9IChzYzEyMDBfc2F2ZWRfc3RhdGVfdCAqKWh3aWYtPmNvbmZpZ19kYXRhOworCQkJaWYgKHNzID09IE5VTEwpIHsKKwkJCQlzcyA9IGttYWxsb2Moc2l6ZW9mKHNjMTIwMF9zYXZlZF9zdGF0ZV90KSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKHNzID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCWh3aWYtPmNvbmZpZ19kYXRhID0gKHVuc2lnbmVkIGxvbmcpc3M7CisJCQl9CisJCQlzcyA9IChzYzEyMDBfc2F2ZWRfc3RhdGVfdCAqKWh3aWYtPmNvbmZpZ19kYXRhOworCQkJLy8KKwkJCS8vIFNhdmUgdGltaW5nIHJlZ2lzdGVyczogIHRoaXMgbWF5IGJlIHVubmVjZXNzYXJ5IGlmIAorCQkJLy8gQklPUyBhbHNvIGRvZXMgaXQKKwkJCS8vCisJCQliYXNlcmVnID0gaHdpZi0+Y2hhbm5lbCA/IDB4NTAgOiAweDQwOworCQkJZm9yIChyID0gMDsgciA8IDQ7ICsrcikgeworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoaHdpZi0+cGNpX2RldiwgYmFzZXJlZyArIChyPDwyKSwgJnNzLT5yZWdzW3JdKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFlvdSBkb24ndCBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBkaXNrcyAtLSBzeXNmcyBzaG91bGQgaGF2ZSBkb25lIHRoYXQgZm9yIHlvdSBhbHJlYWR5ICovIAorCisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsc3RhdGUpOworCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjMTIwMF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWRlX2h3aWZfdAkqaHdpZiA9IE5VTEw7CisKK3ByaW50aygiU0MxMjAwOiByZXN1bWVcbiIpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LDApOwkvLyBicmluZyBjaGlwIGJhY2sgZnJvbSBzbGVlcCBzdGF0ZQorCWRldi0+Y3VycmVudF9zdGF0ZSA9IDA7CisJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwkvLworCS8vIGxvb3Agb3ZlciBhbGwgaW50ZXJmYWNlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcGNpIGRldmljZToKKwkvLworCXdoaWxlICgoaHdpZiA9IGxvb2t1cF9wY2lfZGV2KGh3aWYsIGRldikpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50CQliYXNlcmVnLCByLCBkLCBmb3JtYXQ7CisJCXNjMTIwMF9zYXZlZF9zdGF0ZV90CSpzcyA9IChzYzEyMDBfc2F2ZWRfc3RhdGVfdCAqKWh3aWYtPmNvbmZpZ19kYXRhOworcHJpbnRrKCIlczogU0MxMjAwOiByZXN1bWVcbiIsIGh3aWYtPm5hbWUpOworCisJCS8vCisJCS8vIFJlc3RvcmUgdGltaW5nIHJlZ2lzdGVyczogIHRoaXMgbWF5IGJlIHVubmVjZXNzYXJ5IGlmIEJJT1MgYWxzbyBkb2VzIGl0CisJCS8vCisJCWJhc2VyZWcgPSBod2lmLT5jaGFubmVsID8gMHg1MCA6IDB4NDA7CisJCWlmIChzcyAhPSBOVUxMKSB7CisJCQlmb3IgKHIgPSAwOyByIDwgNDsgKytyKSB7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCBiYXNlcmVnICsgKHI8PDIpLCBzcy0+cmVnc1tyXSk7CisJCQl9CisJCX0KKwkJLy8KKwkJLy8gUmUtcHJvZ3JhbSBkcml2ZSBQSU8gbW9kZXMKKwkJLy8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGh3aWYtPnBjaV9kZXYsIGJhc2VyZWcrNCwgJmZvcm1hdCk7CisJCWZvcm1hdCA9IChmb3JtYXQgPj4gMzEpICYgMTsKKwkJaWYgKGZvcm1hdCkKKwkJCWZvcm1hdCArPSBzYzEyMDBfZ2V0X3BjaV9jbG9jaygpOworCQlmb3IgKGQgPSAwOyBkIDwgMjsgKytkKSB7CisJCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmKGh3aWYtPmRyaXZlc1tkXSk7CisJCQlpZiAoZHJpdmUtPnByZXNlbnQpIHsKKwkJCQl1bnNpZ25lZCBpbnQgcGlvLCB0aW1pbmdzOworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCBiYXNlcmVnKyhkcml2ZS0+c2VsZWN0LmIudW5pdCA8PCAzKSwgJnRpbWluZ3MpOworCQkJCWZvciAocGlvID0gMDsgcGlvIDw9IDQ7ICsrcGlvKSB7CisJCQkJCWlmIChzYzEyMDBfcGlvX3RpbWluZ3NbZm9ybWF0XVtwaW9dID09IHRpbWluZ3MpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHBpbyA+IDQpCisJCQkJCXBpbyA9IDI1NTsgLyogYXV0b3R1bmUgKi8KKwkJCQkodm9pZClzYzEyMDBfdHVuZXByb2MoZHJpdmUsIHBpbyk7CisJCQl9CisJCX0KKwkJLy8KKwkJLy8gUmUtcHJvZ3JhbSBkcml2ZSBETUEgbW9kZXMKKwkJLy8KKwkJZm9yIChkID0gMDsgZCA8IE1BWF9EUklWRVM7ICsrZCkgeworCQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJihod2lmLT5kcml2ZXNbZF0pOworCQkJaWYgKGRyaXZlLT5wcmVzZW50ICYmICFfX2lkZV9kbWFfYmFkX2RyaXZlKGRyaXZlKSkgeworCQkJCWludCB3YXNfdXNpbmdfZG1hID0gZHJpdmUtPnVzaW5nX2RtYTsKKwkJCQlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwkJCQlzYzEyMDBfY29uZmlnX2RtYShkcml2ZSk7CisJCQkJaWYgKCF3YXNfdXNpbmdfZG1hICYmIGRyaXZlLT51c2luZ19kbWEpIHsKKwkJCQkJaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBnZXRzIGludm9rZWQgYnkgdGhlIElERSBkcml2ZXIgb25jZSBmb3IgZWFjaCBjaGFubmVsLAorICogYW5kIHBlcmZvcm1zIGNoYW5uZWwtc3BlY2lmaWMgcHJlLWluaXRpYWxpemF0aW9uIGJlZm9yZSBkcml2ZSBwcm9iaW5nLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3NjMTIwMCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZiAoaHdpZi0+bWF0ZSkKKwkJaHdpZi0+c2VyaWFsaXplZCA9IGh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSAxOworCWh3aWYtPmF1dG9kbWEgPSAwOworCWlmIChod2lmLT5kbWFfYmFzZSkgeworCQlod2lmLT5pZGVfZG1hX2NoZWNrID0gJnNjMTIwMF9jb25maWdfZG1hOworCQlod2lmLT5pZGVfZG1hX2VuZCAgID0gJnNjMTIwMF9pZGVfZG1hX2VuZDsKKyAgICAgICAgCWlmICghbm9hdXRvZG1hKQorICAgICAgICAgICAgICAgIAlod2lmLT5hdXRvZG1hID0gMTsKKwkJaHdpZi0+dHVuZXByb2MgPSAmc2MxMjAwX3R1bmVwcm9jOworCX0KKyAgICAgICAgaHdpZi0+YXRhcGlfZG1hID0gMTsKKyAgICAgICAgaHdpZi0+dWx0cmFfbWFzayA9IDB4MDc7CisgICAgICAgIGh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworCisgICAgICAgIGh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKyAgICAgICAgaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBzYzEyMDBfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJTQzEyMDAiLAorCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfc2MxMjAwLAorCS5jaGFubmVscwk9IDIsCisJLmF1dG9kbWEJPSBBVVRPRE1BLAorCS5ib290YWJsZQk9IE9OX0JPQVJELAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2MxMjAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCAmc2MxMjAwX2NoaXBzZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2MxMjAwX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0N4MjAwX0lERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzYzEyMDBfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIlNDMTIwMF9JREUiLAorCS5pZF90YWJsZQk9IHNjMTIwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBzYzEyMDBfaW5pdF9vbmUsCisJLnN1c3BlbmQJPSBzYzEyMDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNjMTIwMF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IHNjMTIwMF9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2MxMjAwX2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBMb3JkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBOUyBTQzEyMDAgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYyBiL2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTExMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwpAQCAtMCwwICsxLDY3NSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jCQlWZXJzaW9uIDAuOAkgMjUgRWJyIDIwMDMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBNaWNoZWwgQXVicnkKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3oKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiBQb3J0aW9ucyBjb3B5cmlnaHQgKGMpIDIwMDEgU3VuIE1pY3Jvc3lzdGVtcworICoKKyAqCisgKiBSQ0MvU2VydmVyV29ya3MgSURFIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiAgIE9TQjQ6IGBPcGVuIFNvdXRoIEJyaWRnZScgSURFIEludGVyZmFjZSAoZm4gMSkKKyAqICAgICAgICAgc3VwcG9ydHMgVURNQSBtb2RlIDIgKDMzIE1CL3MpCisgKgorICogICBDU0I1OiBgQ2hhbXBpb24gU291dGggQnJpZGdlJyBJREUgSW50ZXJmYWNlIChmbiAxKQorICogICAgICAgICBhbGwgcmV2aXNpb25zIHN1cHBvcnQgVURNQSBtb2RlIDQgKDY2IE1CL3MpCisgKiAgICAgICAgIHJldmlzaW9uIEEyLjAgYW5kIHVwIHN1cHBvcnQgVURNQSBtb2RlIDUgKDEwMCBNQi9zKQorICoKKyAqICAgICAgICAgKioqIFRoZSBDU0I1IGRvZXMgbm90IHByb3ZpZGUgQU5ZIHJlZ2lzdGVyICoqKgorICogICAgICAgICAqKiogdG8gZGV0ZWN0IDgwLWNvbmR1Y3RvciBjYWJsZSBwcmVzZW5jZS4gKioqCisgKgorICogICBDU0I2OiBgQ2hhbXBpb24gU291dGggQnJpZGdlJyBJREUgSW50ZXJmYWNlIChvcHRpb25hbDogdGhpcmQgY2hhbm5lbCkKKyAqCisgKiBEb2N1bWVudGF0aW9uOgorICoJQXZhaWxhYmxlIHVuZGVyIE5EQSBvbmx5LiBFcnJhdGEgaW5mbyB2ZXJ5IGhhcmQgdG8gZ2V0LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgU1ZXS1NfQ1NCNV9SRVZJU0lPTl9ORVcJMHg5MiAvKiBtaW4gUENJX1JFVklTSU9OX0lEIGZvciBVRE1BNSAoQTIuMCkgKi8KKyNkZWZpbmUgU1ZXS1NfQ1NCNl9SRVZJU0lPTgkweGEwIC8qIG1pbiBQQ0lfUkVWSVNJT05fSUQgZm9yIFVETUE0IChBMS4wKSAqLworCisvKiBTZWFnYXRlIEJhcnJhY3VkYSBBVEEgSVYgRmFtaWx5IGRyaXZlcyBpbiBVRE1BIG1vZGUgNQorICogY2FuIG92ZXJydW4gdGhlaXIgRklGT3Mgd2hlbiB1c2VkIHdpdGggdGhlIENTQjUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdndrc19iYWRfYXRhMTAwW10gPSB7CisJIlNUMzIwMDExQSIsCisJIlNUMzQwMDE2QSIsCisJIlNUMzYwMDIxQSIsCisJIlNUMzgwMDIxQSIsCisJTlVMTAorfTsKKworc3RhdGljIHU4IHN2d2tzX3JldmlzaW9uID0gMDsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqaXNhX2RldjsKKworc3RhdGljIGludCBjaGVja19pbl9kcml2ZV9saXN0cyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICoqbGlzdCkKK3sKKwl3aGlsZSAoKmxpc3QpCisJCWlmICghc3RyY21wKCpsaXN0KyssIGRyaXZlLT5pZC0+bW9kZWwpKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzdndrc19yYXRlbWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgICAgID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJdTggbW9kZTsKKworCWlmICghc3Z3a3NfcmV2aXNpb24pCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1JFVklTSU9OX0lELCAmc3Z3a3NfcmV2aXNpb24pOworCisJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSkgeworCQl1MzIgcmVnID0gMDsKKwkJaWYgKGlzYV9kZXYpCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaXNhX2RldiwgMHg2NCwgJnJlZyk7CisJCQkKKwkJLyoKKwkJICoJRG9uJ3QgZW5hYmxlIFVETUEgb24gZGlzayBkZXZpY2VzIGZvciB0aGUgbW9tZW50CisJCSAqLworCQlpZihkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCQlyZXR1cm4gMDsKKwkJLyogQ2hlY2sgdGhlIE9TQjQgRE1BMzMgZW5hYmxlIGJpdCAqLworCQlyZXR1cm4gKChyZWcgJiAweDAwMDA0MDAwKSA9PSAweDAwMDA0MDAwKSA/IDEgOiAwOworCX0gZWxzZSBpZiAoc3Z3a3NfcmV2aXNpb24gPCBTVldLU19DU0I1X1JFVklTSU9OX05FVykgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHN2d2tzX3JldmlzaW9uID49IFNWV0tTX0NTQjVfUkVWSVNJT05fTkVXKSB7CisJCXU4IGJ0ciA9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1QSwgJmJ0cik7CisJCW1vZGUgPSBidHIgJiAweDM7CisJCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCQkvKiBJZiBzb21lb25lIGRlY2lkZXMgdG8gZG8gVURNQTEzMyBvbiBDU0I1IHRoZSBzYW1lCisJCSAgIGlzc3VlIHdpbGwgYml0ZSBzbyBiZSBpbmNsdXNpdmUgKi8KKwkJaWYgKG1vZGUgPiAyICYmIGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBzdndrc19iYWRfYXRhMTAwKSkKKwkJCW1vZGUgPSAyOworCX0KKwlpZiAoKChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUpIHx8CisJICAgICAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMikpICYmCisJICAgICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpKQorCQltb2RlID0gMjsKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHU4IHN2d2tzX2NzYl9jaGVjayAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyOgorCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHN2d2tzX3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJdTggdWRtYV9tb2Rlc1tdCQk9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSB9OworCXU4IGRtYV9tb2Rlc1tdCQk9IHsgMHg3NywgMHgyMSwgMHgyMCB9OworCXU4IHBpb19tb2Rlc1tdCQk9IHsgMHg1ZCwgMHg0NywgMHgzNCwgMHgyMiwgMHgyMCB9OworCXU4IGRyaXZlX3BjaVtdCQk9IHsgMHg0MSwgMHg0MCwgMHg0MywgMHg0MiB9OworCXU4IGRyaXZlX3BjaTJbXQkJPSB7IDB4NDUsIDB4NDQsIDB4NDcsIDB4NDYgfTsKKworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1OCBzcGVlZDsKKwl1OCBwaW8JCQk9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCA1LCBOVUxMKTsKKwl1OCB1bml0CQkJPSAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxKTsKKwl1OCBjc2I1CQkJPSBzdndrc19jc2JfY2hlY2soZGV2KTsKKwl1OCB1bHRyYV9lbmFibGUJCT0gMCwgdWx0cmFfdGltaW5nID0gMDsKKwl1OCBkbWFfdGltaW5nCQk9IDAsIHBpb190aW1pbmcgPSAwOworCXUxNiBjc2I1X3BpbwkJPSAwOworCisJaWYgKHhmZXJzcGVlZCA9PSAyNTUpCS8qIFBJTyBhdXRvLXR1bmluZyAqLworCQlzcGVlZCA9IFhGRVJfUElPXzAgKyBwaW87CisJZWxzZQorCQlzcGVlZCA9IGlkZV9yYXRlX2ZpbHRlcihzdndrc19yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisKKwkvKiBJZiB3ZSBhcmUgYWJvdXQgdG8gcHV0IGEgZGlzayBpbnRvIFVETUEgbW9kZSB3ZSBzY3Jld2VkIHVwLgorCSAgIE91ciBjb2RlIGFzc3VtZXMgd2UgbmV2ZXIgX2V2ZXJfIGRvIHRoaXMgb24gYW4gT1NCNCAqLworCSAgIAorCWlmKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNCAmJgorCQlkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2sgJiYgc3BlZWQgPj0gWEZFUl9VRE1BXzApCisJCQlCVUcoKTsKKwkJCQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpW2RyaXZlLT5kbl0sICZwaW9fdGltaW5nKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGRyaXZlX3BjaTJbZHJpdmUtPmRuXSwgJmRtYV90aW1pbmcpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKDB4NTZ8aHdpZi0+Y2hhbm5lbCksICZ1bHRyYV90aW1pbmcpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0QSwgJmNzYjVfcGlvKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTQsICZ1bHRyYV9lbmFibGUpOworCisJLyogUGVyIFNwZWNpZmllZCBEZXNpZ24gYnkgT0VNLCBhbmQgQVNJQyBBcmNoaXRlY3QgKi8KKwlpZiAoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSkgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIpKSB7CisJCWlmICghZHJpdmUtPmluaXRfc3BlZWQpIHsKKwkJCXU4IGRtYV9zdGF0ID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpOworCitkbWFfcGlvOgorCQkJaWYgKCgodWx0cmFfZW5hYmxlIDw8ICg3LWRyaXZlLT5kbikgJiAweDgwKSA9PSAweDgwKSAmJgorCQkJICAgICgoZG1hX3N0YXQgJiAoMTw8KDUrdW5pdCkpKSA9PSAoMTw8KDUrdW5pdCkpKSkgeworCQkJCWRyaXZlLT5jdXJyZW50X3NwZWVkID0gZHJpdmUtPmluaXRfc3BlZWQgPSBYRkVSX1VETUFfMCArIHVkbWFfbW9kZXNbKHVsdHJhX3RpbWluZyA+PiAoNCp1bml0KSkgJiB+KDB4RjApXTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSBpZiAoKGRtYV90aW1pbmcpICYmCisJCQkJICAgKChkbWFfc3RhdCYoMTw8KDUrdW5pdCkpKT09KDE8PCg1K3VuaXQpKSkpIHsKKwkJCQl1OCBkbWFzcGVlZCA9IGRtYV90aW1pbmc7CisKKwkJCQlkbWFfdGltaW5nICY9IH4weEZGOworCQkJCWlmICgoZG1hc3BlZWQgJiAweDIwKSA9PSAweDIwKQorCQkJCQlkbWFzcGVlZCA9IFhGRVJfTVdfRE1BXzI7CisJCQkJZWxzZSBpZiAoKGRtYXNwZWVkICYgMHgyMSkgPT0gMHgyMSkKKwkJCQkJZG1hc3BlZWQgPSBYRkVSX01XX0RNQV8xOworCQkJCWVsc2UgaWYgKChkbWFzcGVlZCAmIDB4NzcpID09IDB4NzcpCisJCQkJCWRtYXNwZWVkID0gWEZFUl9NV19ETUFfMDsKKwkJCQllbHNlCisJCQkJCWdvdG8gZG1hX3BpbzsKKwkJCQlkcml2ZS0+Y3VycmVudF9zcGVlZCA9IGRyaXZlLT5pbml0X3NwZWVkID0gZG1hc3BlZWQ7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKHBpb190aW1pbmcpIHsKKwkJCQl1OCBwaW9zcGVlZCA9IHBpb190aW1pbmc7CisKKwkJCQlwaW9fdGltaW5nICY9IH4weEZGOworCQkJCWlmICgocGlvc3BlZWQgJiAweDIwKSA9PSAweDIwKQorCQkJCQlwaW9zcGVlZCA9IFhGRVJfUElPXzQ7CisJCQkJZWxzZSBpZiAoKHBpb3NwZWVkICYgMHgyMikgPT0gMHgyMikKKwkJCQkJcGlvc3BlZWQgPSBYRkVSX1BJT18zOworCQkJCWVsc2UgaWYgKChwaW9zcGVlZCAmIDB4MzQpID09IDB4MzQpCisJCQkJCXBpb3NwZWVkID0gWEZFUl9QSU9fMjsKKwkJCQllbHNlIGlmICgocGlvc3BlZWQgJiAweDQ3KSA9PSAweDQ3KQorCQkJCQlwaW9zcGVlZCA9IFhGRVJfUElPXzE7CisJCQkJZWxzZSBpZiAoKHBpb3NwZWVkICYgMHg1ZCkgPT0gMHg1ZCkKKwkJCQkJcGlvc3BlZWQgPSBYRkVSX1BJT18wOworCQkJCWVsc2UKKwkJCQkJZ290byBvZW1fc2V0dXBfZmFpbGVkOworCQkJCWRyaXZlLT5jdXJyZW50X3NwZWVkID0gZHJpdmUtPmluaXRfc3BlZWQgPSBwaW9zcGVlZDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworb2VtX3NldHVwX2ZhaWxlZDoKKworCXBpb190aW1pbmcJJj0gfjB4RkY7CisJZG1hX3RpbWluZwkmPSB+MHhGRjsKKwl1bHRyYV90aW1pbmcJJj0gfigweDBGIDw8ICg0KnVuaXQpKTsKKwl1bHRyYV9lbmFibGUJJj0gfigweDAxIDw8IGRyaXZlLT5kbik7CisJY3NiNV9waW8JJj0gfigweDBGIDw8ICg0KmRyaXZlLT5kbikpOworCisJc3dpdGNoKHNwZWVkKSB7CisJCWNhc2UgWEZFUl9QSU9fNDoKKwkJY2FzZSBYRkVSX1BJT18zOgorCQljYXNlIFhGRVJfUElPXzI6CisJCWNhc2UgWEZFUl9QSU9fMToKKwkJY2FzZSBYRkVSX1BJT18wOgorCQkJcGlvX3RpbWluZyB8PSBwaW9fbW9kZXNbc3BlZWQgLSBYRkVSX1BJT18wXTsKKwkJCWNzYjVfcGlvICAgfD0gKChzcGVlZCAtIFhGRVJfUElPXzApIDw8ICg0KmRyaXZlLT5kbikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQljYXNlIFhGRVJfTVdfRE1BXzE6CisJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJCXBpb190aW1pbmcgfD0gcGlvX21vZGVzW3Bpb107CisJCQljc2I1X3BpbyAgIHw9IChwaW8gPDwgKDQqZHJpdmUtPmRuKSk7CisJCQlkbWFfdGltaW5nIHw9IGRtYV9tb2Rlc1tzcGVlZCAtIFhGRVJfTVdfRE1BXzBdOworCQkJYnJlYWs7CisKKwkJY2FzZSBYRkVSX1VETUFfNToKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMjoKKwkJY2FzZSBYRkVSX1VETUFfMToKKwkJY2FzZSBYRkVSX1VETUFfMDoKKwkJCXBpb190aW1pbmcgICB8PSBwaW9fbW9kZXNbcGlvXTsKKwkJCWNzYjVfcGlvICAgICB8PSAocGlvIDw8ICg0KmRyaXZlLT5kbikpOworCQkJZG1hX3RpbWluZyAgIHw9IGRtYV9tb2Rlc1syXTsKKwkJCXVsdHJhX3RpbWluZyB8PSAoKHVkbWFfbW9kZXNbc3BlZWQgLSBYRkVSX1VETUFfMF0pIDw8ICg0KnVuaXQpKTsKKwkJCXVsdHJhX2VuYWJsZSB8PSAoMHgwMSA8PCBkcml2ZS0+ZG4pOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpW2RyaXZlLT5kbl0sIHBpb190aW1pbmcpOworCWlmIChjc2I1KQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDRBLCBjc2I1X3Bpbyk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBkcml2ZV9wY2kyW2RyaXZlLT5kbl0sIGRtYV90aW1pbmcpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsICgweDU2fGh3aWYtPmNoYW5uZWwpLCB1bHRyYV90aW1pbmcpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIHVsdHJhX2VuYWJsZSk7CisKKwlyZXR1cm4gKGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19jaGlwc2V0X2Zvcl9waW8gKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1MTYgZWlkZV9waW9fdGltaW5nWzZdID0gezk2MCwgNDgwLCAyNDAsIDE4MCwgMTIwLCA5MH07CisJdTE2IHhmZXJfcGlvID0gZHJpdmUtPmlkLT5laWRlX3Bpb19tb2RlczsKKwl1OCB0aW1pbmcsIHNwZWVkLCBwaW87CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDI1NSwgNSwgTlVMTCk7CisKKwlpZiAoeGZlcl9waW8gPiA0KQorCQl4ZmVyX3BpbyA9IDA7CisKKwlpZiAoZHJpdmUtPmlkLT5laWRlX3Bpb19pb3JkeSA+IDApCisJCWZvciAoeGZlcl9waW8gPSA1OworCQkJeGZlcl9waW8+MCAmJgorCQkJZHJpdmUtPmlkLT5laWRlX3Bpb19pb3JkeT5laWRlX3Bpb190aW1pbmdbeGZlcl9waW9dOworCQkJeGZlcl9waW8tLSk7CisJZWxzZQorCQl4ZmVyX3BpbyA9IChkcml2ZS0+aWQtPmVpZGVfcGlvX21vZGVzICYgNCkgPyAweDA1IDoKKwkJCSAgIChkcml2ZS0+aWQtPmVpZGVfcGlvX21vZGVzICYgMikgPyAweDA0IDoKKwkJCSAgIChkcml2ZS0+aWQtPmVpZGVfcGlvX21vZGVzICYgMSkgPyAweDAzIDoKKwkJCSAgIChkcml2ZS0+aWQtPnRQSU8gJiAyKSA/IDB4MDIgOgorCQkJICAgKGRyaXZlLT5pZC0+dFBJTyAmIDEpID8gMHgwMSA6IHhmZXJfcGlvOworCisJdGltaW5nID0gKHhmZXJfcGlvID49IHBpbykgPyB4ZmVyX3BpbyA6IHBpbzsKKworCXN3aXRjaCh0aW1pbmcpIHsKKwkJY2FzZSA0OiBzcGVlZCA9IFhGRVJfUElPXzQ7YnJlYWs7CisJCWNhc2UgMzogc3BlZWQgPSBYRkVSX1BJT18zO2JyZWFrOworCQljYXNlIDI6IHNwZWVkID0gWEZFUl9QSU9fMjticmVhazsKKwkJY2FzZSAxOiBzcGVlZCA9IFhGRVJfUElPXzE7YnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcGVlZCA9ICghZHJpdmUtPmlkLT50UElPKSA/IFhGRVJfUElPXzAgOiBYRkVSX1BJT19TTE9XOworCQkJYnJlYWs7CisJfQorCSh2b2lkKSBzdndrc190dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKwlkcml2ZS0+Y3VycmVudF9zcGVlZCA9IHNwZWVkOworfQorCitzdGF0aWMgdm9pZCBzdndrc190dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZihwaW8gPT0gMjU1KQorCQkodm9pZCkgc3Z3a3NfdHVuZV9jaGlwc2V0KGRyaXZlLCAyNTUpOworCWVsc2UKKwkJKHZvaWQpIHN2d2tzX3R1bmVfY2hpcHNldChkcml2ZSwgKFhGRVJfUElPXzAgKyBwaW8pKTsKK30KKworc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBzdndrc19yYXRlbWFzayhkcml2ZSkpOworCisJaWYgKCEoc3BlZWQpKQorCQlzcGVlZCA9IFhGRVJfUElPXzAgKyBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDI1NSwgNSwgTlVMTCk7CisKKwkodm9pZCkgc3Z3a3NfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworc3RhdGljIGludCBzdndrc19jb25maWdfZHJpdmVfeGZlcl9yYXRlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBoZF9kcml2ZWlkICppZAk9IGRyaXZlLT5pZDsKKworCWRyaXZlLT5pbml0X3NwZWVkID0gMDsKKworCWlmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAmJiBkcml2ZS0+YXV0b2RtYSkgeworCisJCWlmIChpZGVfdXNlX2RtYShkcml2ZSkpIHsKKwkJCWlmIChjb25maWdfY2hpcHNldF9mb3JfZG1hKGRyaXZlKSkKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJCX0KKworCQlnb3RvIGZhc3RfYXRhX3BpbzsKKworCX0gZWxzZSBpZiAoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSB7CitmYXN0X2F0YV9waW86CisJCWNvbmZpZ19jaGlwc2V0X2Zvcl9waW8oZHJpdmUpOworCQkvLwlod2lmLT50dW5lcHJvYyhkcml2ZSwgNSk7CisJCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwl9CisJLyogSU9SRFkgbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAwOworfQorCisvKiBUaGlzIGNhbiBnbyBzb29uICovCisKK3N0YXRpYyBpbnQgc3Z3a3NfaWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gX19pZGVfZG1hX2VuZChkcml2ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9zdndrcyAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCXU4IGJ0cjsKKworCS8qIHNhdmUgcmV2aXNpb24gaWQgdG8gZGV0ZXJtaW5lIERNQSBjYXBhYmlsaXR5ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZzdndrc19yZXZpc2lvbik7CisKKwkvKiBmb3JjZSBNYXN0ZXIgTGF0ZW5jeSBUaW1lciB2YWx1ZSB0byA2NCBQQ0lDTEtzICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NDApOworCisJLyogT1NCNCA6IFNvdXRoIEJyaWRnZSBhbmQgSURFICovCisJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSkgeworCQlpc2FfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsCisJCQkgIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNCwgTlVMTCk7CisJCWlmIChpc2FfZGV2KSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaXNhX2RldiwgMHg2NCwgJnJlZyk7CisJCQlyZWcgJj0gfjB4MDAwMDIwMDA7IC8qIGRpc2FibGUgNjAwbnMgaW50ZXJydXB0IG1hc2sgKi8KKwkJCWlmKCEocmVnICYgMHgwMDAwNDAwMCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVRE1BIG5vdCBCSU9TIGVuYWJsZWQuXG4iLCBuYW1lKTsKKwkJCXJlZyB8PSAgMHgwMDAwNDAwMDsgLyogZW5hYmxlIFVETUEvMzMgc3VwcG9ydCAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpc2FfZGV2LCAweDY0LCByZWcpOworCQl9CisJfQorCisJLyogc2V0dXAgQ1NCNS9DU0I2IDogU291dGggQnJpZGdlIGFuZCBJREUgb3B0aW9uIFJBSUQgKi8KKwllbHNlIGlmICgoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFKSB8fAorCQkgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSkgfHwKKwkJIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyKSkgeworCisJCS8qIFRoaXJkIENoYW5uZWwgVGVzdCAqLworCQlpZiAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqIGZpbmRldiA9IE5VTEw7CisJCQl1MzIgcmVnNGMgPSAwOworCQkJZmluZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsCisJCQkJUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1LCBOVUxMKTsKKwkJCWlmIChmaW5kZXYpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZmluZGV2LCAweDRDLCAmcmVnNGMpOworCQkJCXJlZzRjICY9IH4weDAwMDAwN0ZGOworCQkJCXJlZzRjIHw9ICAweDAwMDAwMDQwOworCQkJCXJlZzRjIHw9ICAweDAwMDAwMDIwOworCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZmluZGV2LCAweDRDLCByZWc0Yyk7CisJCQl9CisJCQlvdXRiX3AoMHgwNiwgMHgwYzAwKTsKKwkJCWRldi0+aXJxID0gaW5iX3AoMHgwYzAxKTsKKyNpZiAwCisJCQlwcmludGsoIiVzOiBkZXZpY2UgY2xhc3MgKDB4JTA0eClcbiIsCisJCQkJbmFtZSwgZGV2LT5jbGFzcyk7CisJCQlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CisJCQkJZGV2LT5jbGFzcyAmPSB+MHgwMDBGMEYwMDsKKwkJLy8JCWRldi0+Y2xhc3MgfD0gfjB4MDAwMDA0MDA7CisJCQkJZGV2LT5jbGFzcyB8PSB+MHgwMDAxMDEwMDsKKwkJCQkvKiovCisJCQl9CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBwY2lfZGV2ICogZmluZGV2ID0gTlVMTDsKKwkJCXU4IHJlZzQxID0gMDsKKworCQkJZmluZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsCisJCQkJCVBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNiwgTlVMTCk7CisJCQlpZiAoZmluZGV2KSB7CisJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZmluZGV2LCAweDQxLCAmcmVnNDEpOworCQkJCXJlZzQxICY9IH4weDQwOworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShmaW5kZXYsIDB4NDEsIHJlZzQxKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgZGV2aWNlIHBpbiBpc3N1ZSBvbiBDU0I2LgorCQkJICogU2luY2UgdGhlcmUgd2lsbCBiZSBhIGZ1dHVyZSByYWlkIG1vZGUsCisJCQkgKiBlYXJseSB2ZXJzaW9ucyBvZiB0aGUgY2hpcHNldCByZXF1aXJlIHRoZQorCQkJICogaW50ZXJydXB0IHBpbiB0byBiZSBzZXQsIGFuZCBpdCBpcyBhIGNvbXBhdGliaWxpdHkKKwkJCSAqIG1vZGUgaXNzdWUuCisJCQkgKi8KKwkJCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCQkJZGV2LT5pcnEgPSAwOworCQl9CisvLwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnBpb3JlZykKKy8vCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgMHg5OTk5OTk5OSk7CisvLwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgJmRtYXJlZyk7CisvLwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDQsIDB4RkZGRkZGRkYpOworCQkvKiBzZXR1cCB0aGUgVURNQSBDb250cm9sIHJlZ2lzdGVyCisJCSAqCisJCSAqIDEuIGNsZWFyIGJpdCA2IHRvIGVuYWJsZSBETUEKKwkJICogMi4gZW5hYmxlIERNQSBtb2RlcyB3aXRoIGJpdHMgMC0xCisJCSAqIAkwMCA6IGxlZ2FjeQorCQkgKiAJMDEgOiB1ZG1hMgorCQkgKiAJMTAgOiB1ZG1hMi91ZG1hNAorCQkgKiAJMTEgOiB1ZG1hMi91ZG1hNC91ZG1hNQorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDVBLCAmYnRyKTsKKwkJYnRyICY9IH4weDQwOworCQlpZiAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKQorCQkJYnRyIHw9IDB4MjsKKwkJZWxzZQorCQkJYnRyIHw9IChzdndrc19yZXZpc2lvbiA+PSBTVldLU19DU0I1X1JFVklTSU9OX05FVykgPyAweDMgOiAweDI7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NUEsIGJ0cik7CisJfQorCisJcmV0dXJuIChkZXYtPmlycSkgPyBkZXYtPmlycSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGF0YTY2X3N2d2tzX3N2d2tzIChpZGVfaHdpZl90ICpod2lmKQoreworCXJldHVybiAxOworfQorCisvKiBPbiBEZWxsIFBvd2VyRWRnZSBzZXJ2ZXJzIHdpdGggYSBDU0I1L0NTQjYsIHRoZSB0b3AgdHdvIGJpdHMKKyAqIG9mIHRoZSBzdWJzeXN0ZW0gZGV2aWNlIElEIGluZGljYXRlIHByZXNlbmNlIG9mIGFuIDgwLXBpbiBjYWJsZS4KKyAqIEJpdCAxNSBjbGVhciA9IHNlY29uZGFyeSBJREUgY2hhbm5lbCBkb2VzIG5vdCBoYXZlIDgwLXBpbiBjYWJsZS4KKyAqIEJpdCAxNSBzZXQgICA9IHNlY29uZGFyeSBJREUgY2hhbm5lbCBoYXMgODAtcGluIGNhYmxlLgorICogQml0IDE0IGNsZWFyID0gcHJpbWFyeSBJREUgY2hhbm5lbCBkb2VzIG5vdCBoYXZlIDgwLXBpbiBjYWJsZS4KKyAqIEJpdCAxNCBzZXQgICA9IHByaW1hcnkgSURFIGNoYW5uZWwgaGFzIDgwLXBpbiBjYWJsZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc3Z3a3NfZGVsbCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwlpZiAoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVMTCAmJgorCSAgICBkZXYtPnZlbmRvcgk9PSBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTICYmCisJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUgfHwKKwkgICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSkpCisJCXJldHVybiAoKDEgPDwgKGh3aWYtPmNoYW5uZWwgKyAxNCkpICYKKwkJCWRldi0+c3Vic3lzdGVtX2RldmljZSkgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworLyogU3VuIENvYmFsdCBBbHBpbmUgaGFyZHdhcmUgYXZvaWRzIHRoZSA4MC1waW4gY2FibGUKKyAqIGRldGVjdCBpc3N1ZSBieSBhdHRhY2hpbmcgdGhlIGRyaXZlcyBkaXJlY3RseSB0byB0aGUgYm9hcmQuCisgKiBUaGlzIGNoZWNrIGZvbGxvd3MgdGhlIERlbGwgcHJlY2VkZW50IChob3cgc2NhcnkgaXMgdGhhdD8hKQorICoKKyAqIFdBUk5JTkc6IHRoaXMgb25seSB3b3JrcyBvbiBBbHBpbmUgaGFyZHdhcmUhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGF0YTY2X3N2d2tzX2NvYmFsdCAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwlpZiAoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJICAgIGRldi0+dmVuZG9yCT09IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MgJiYKKwkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFKQorCQlyZXR1cm4gKCgxIDw8IChod2lmLT5jaGFubmVsICsgMTQpKSAmCisJCQlkZXYtPnN1YnN5c3RlbV9kZXZpY2UpID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGF0YTY2X3N2d2tzIChpZGVfaHdpZl90ICpod2lmKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OworCisJLyogUGVyIFNwZWNpZmllZCBEZXNpZ24gYnkgT0VNLCBhbmQgQVNJQyBBcmNoaXRlY3QgKi8KKwlpZiAoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSkgfHwKKwkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIpKQorCQlyZXR1cm4gMTsKKworCS8qIFNlcnZlciBXb3JrcyAqLworCWlmIChkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUykKKwkJcmV0dXJuIGF0YTY2X3N2d2tzX3N2d2tzIChod2lmKTsKKwkKKwkvKiBEZWxsIFBvd2VyRWRnZSAqLworCWlmIChkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMKQorCQlyZXR1cm4gYXRhNjZfc3Z3a3NfZGVsbCAoaHdpZik7CisKKwkvKiBDb2JhbHQgQWxwaW5lICovCisJaWYgKGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTikKKwkJcmV0dXJuIGF0YTY2X3N2d2tzX2NvYmFsdCAoaHdpZik7CisKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmIENBTl9TV19ETUEKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfc3Z3a3MgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTggZG1hX3N0YXQgPSAwOworCisJaWYgKCFod2lmLT5pcnEpCisJCWh3aWYtPmlycSA9IGh3aWYtPmNoYW5uZWwgPyAxNSA6IDE0OworCisJaHdpZi0+dHVuZXByb2MgPSAmc3Z3a3NfdHVuZV9kcml2ZTsKKwlod2lmLT5zcGVlZHByb2MgPSAmc3Z3a3NfdHVuZV9jaGlwc2V0OworCisJaHdpZi0+YXRhcGlfZG1hID0gMTsKKworCWlmIChod2lmLT5wY2lfZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFKQorCQlod2lmLT51bHRyYV9tYXNrID0gMHgzZjsKKworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworI2lmZGVmIENBTl9TV19ETUEKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKyNlbmRpZiAvKiBDQU5fU1dfRE1BICovCisKKwlod2lmLT5hdXRvZG1hID0gMDsKKworCWlmICghaHdpZi0+ZG1hX2Jhc2UpIHsKKwkJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gMTsKKwkJaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gMTsKKwkJcmV0dXJuOworCX0KKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmc3Z3a3NfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKKwlpZiAoaHdpZi0+cGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSkKKwkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmc3Z3a3NfaWRlX2RtYV9lbmQ7CisJZWxzZSBpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9zdndrcyhod2lmKTsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisKKwlkbWFfc3RhdCA9IGh3aWYtPklOQihod2lmLT5kbWFfc3RhdHVzKTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IChkbWFfc3RhdCAmIDB4MjApOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gKGRtYV9zdGF0ICYgMHg0MCk7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gKCEoZG1hX3N0YXQgJiAweDIwKSk7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG90dW5lID0gKCEoZG1hX3N0YXQgJiAweDQwKSk7CisvLwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisvLwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKKy8qCisgKiBXZSBhbGxvdyB0aGUgQk0tRE1BIGRyaXZlciB0byBvbmx5IHdvcmsgb24gZW5hYmxlZCBpbnRlcmZhY2VzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9kbWFfc3Z3a3MgKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hYmFzZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKworCWlmICgoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSkgfHwKKwkgICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyKSkgJiYKKwkgICAgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkgJiYgKGh3aWYtPmNoYW5uZWwpKQorCQlyZXR1cm47CisKKwlpZGVfc2V0dXBfZG1hKGh3aWYsIGRtYWJhc2UsIDgpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NldHVwX3N2d2tzIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsIGQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NldHVwX2NzYjYgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQpCit7CisJaWYgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkgeworCQlkLT5ib290YWJsZSA9IE5FVkVSX0JPQVJEOworCQlpZiAoZGV2LT5yZXNvdXJjZVswXS5zdGFydCA9PSAweDAxZjEpCisJCQlkLT5ib290YWJsZSA9IE9OX0JPQVJEOworCX0KKyNpZiAwCisJaWYgKChJREVfUENJX0RFVklEX0VRKGQtPmRldmlkLCBERVZJRF9DU0I2KSAmJgorICAgICAgICAgICAgICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpKQorCQlkLT5hdXRvZG1hID0gQVVUT0RNQTsKKyNlbmRpZgorCisJZC0+Y2hhbm5lbHMgPSAoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSB8fAorCQkJZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMikgJiYKKwkJICAgICAgICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpKSA/IDEgOiAyOworCisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCk7Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IHNlcnZlcndvcmtzX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CS8qIDAgKi8KKwkJLm5hbWUJCT0gIlN2cldrcyBPU0I0IiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX3N2d2tzLAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3N2d2tzLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3N2d2tzLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAxICovCisJCS5uYW1lCQk9ICJTdnJXa3MgQ1NCNSIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9zdndrcywKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9zdndrcywKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9zdndrcywKKwkJLmluaXRfZG1hCT0gaW5pdF9kbWFfc3Z3a3MsCisJCS5jaGFubmVscwk9IDIsCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCisJfSx7CS8qIDIgKi8KKwkJLm5hbWUJCT0gIlN2cldrcyBDU0I2IiwKKwkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2NzYjYsCisJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfc3Z3a3MsCisJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfc3Z3a3MsCisJCS5pbml0X2RtYQk9IGluaXRfZG1hX3N2d2tzLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAzICovCisJCS5uYW1lCQk9ICJTdnJXa3MgQ1NCNiIsCisJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9jc2I2LAorCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3N2d2tzLAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3N2d2tzLAorCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9zdndrcywKKwkJLmNoYW5uZWxzCT0gMSwJLyogMiAqLworCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0KK307CisKKy8qKgorICoJc3Z3a3NfaW5pdF9vbmUJLQljYWxsZWQgd2hlbiBhIE9TQi9DU0IgaXMgZm91bmQKKyAqCUBkZXY6IHRoZSBzdndrcyBkZXZpY2UKKyAqCUBpZDogdGhlIG1hdGNoaW5nIHBjaSBpZAorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBQQ0kgcmVnaXN0cmF0aW9uIGxheWVyIChvciB0aGUgSURFIGluaXRpYWxpemF0aW9uKQorICoJZmluZHMgYSBkZXZpY2UgbWF0Y2hpbmcgb3VyIElERSBkZXZpY2UgdGFibGVzLgorICovCisgCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdndrc19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWRlX3BjaV9kZXZpY2VfdCAqZCA9ICZzZXJ2ZXJ3b3Jrc19jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdOworCisJcmV0dXJuIGQtPmluaXRfc2V0dXAoZGV2LCBkKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN2d2tzX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAorCXsgUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKKwl7IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDN9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc3Z3a3NfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIlNlcnZlcndvcmtzX0lERSIsCisJLmlkX3RhYmxlCT0gc3Z3a3NfcGNpX3RibCwKKwkucHJvYmUJCT0gc3Z3a3NfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHN2d2tzX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzdndrc19pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgQXVicnkuIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3osIEFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIFNlcnZlcndvcmtzIE9TQjQvQ1NCNS9DU0I2IElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYyBiL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1MWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKQEAgLTAsMCArMSw3MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogIFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL05vdGljZUV4cGxhbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvYzRfY29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKworLyogSU9DNCBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2RlZmluZSBJT0M0X0NNRF9PRkZTRVQJCTB4MTAwCisjZGVmaW5lIElPQzRfQ1RSTF9PRkZTRVQJMHgxMjAKKyNkZWZpbmUgSU9DNF9ETUFfT0ZGU0VUCQkweDE0MAorI2RlZmluZSBJT0M0X0lOVFJfT0ZGU0VUCTB4MAorCisjZGVmaW5lIElPQzRfVElNSU5HCQkweDAwCisjZGVmaW5lIElPQzRfRE1BX1BUUl9MCQkweDAxCisjZGVmaW5lIElPQzRfRE1BX1BUUl9ICQkweDAyCisjZGVmaW5lIElPQzRfRE1BX0FERFJfTAkJMHgwMworI2RlZmluZSBJT0M0X0RNQV9BRERSX0gJCTB4MDQKKyNkZWZpbmUgSU9DNF9CQ19ERVYJCTB4MDUKKyNkZWZpbmUgSU9DNF9CQ19NRU0JCTB4MDYKKyNkZWZpbmUJSU9DNF9ETUFfQ1RSTAkJMHgwNworI2RlZmluZQlJT0M0X0RNQV9FTkRfQUREUgkweDA4CisKKy8qIEJpdHMgaW4gdGhlIElPQzQgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSU9DNF9TX0RNQV9TVEFSVAkweDAxCisjZGVmaW5lCUlPQzRfU19ETUFfU1RPUAkJMHgwMgorI2RlZmluZQlJT0M0X1NfRE1BX0RJUgkJMHgwNAorI2RlZmluZQlJT0M0X1NfRE1BX0FDVElWRQkweDA4CisjZGVmaW5lCUlPQzRfU19ETUFfRVJST1IJMHgxMAorI2RlZmluZQlJT0M0X0FUQV9NRU1FUlIJCTB4MDIKKworLyogUmVhZC9Xcml0ZSBEaXJlY3Rpb25zICovCisjZGVmaW5lCUlPQzRfRE1BX1dSSVRFCQkweDA0CisjZGVmaW5lCUlPQzRfRE1BX1JFQUQJCTB4MDAKKworLyogSW50ZXJydXB0IFJlZ2lzdGVyIE9mZnNldHMgKi8KKyNkZWZpbmUgSU9DNF9JTlRSX1JFRwkJMHgwMworI2RlZmluZQlJT0M0X0lOVFJfU0VUCQkweDA1CisjZGVmaW5lCUlPQzRfSU5UUl9DTEVBUgkJMHgwNworCisjZGVmaW5lIElPQzRfSURFX0NBQ0hFTElORV9TSVpFCTEyOAorI2RlZmluZSBJT0M0X0NNRF9DVExfQkxLX1NJWkUJMHgyMAorI2RlZmluZSBJT0M0X1NVUFBPUlRFRF9GSVJNV0FSRV9SRVYgNDYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiB0aW1pbmdfcmVnMDsKKwl1MzIgdGltaW5nX3JlZzE7CisJdTMyIGxvd19tZW1fcHRyOworCXUzMiBoaWdoX21lbV9wdHI7CisJdTMyIGxvd19tZW1fYWRkcjsKKwl1MzIgaGlnaF9tZW1fYWRkcjsKKwl1MzIgZGV2X2J5dGVfY291bnQ7CisJdTMyIG1lbV9ieXRlX2NvdW50OworCXUzMiBzdGF0dXM7Cit9IGlvYzRfZG1hX3JlZ3NfdDsKKworLyogRWFjaCBQaHlzaWNhbCBSZWdpb24gRGVzY3JpcHRvciBFbnRyeSBzaXplIGlzIDE2IGJ5dGVzICgyICogNjQgYml0cykgKi8KKy8qIElPQzQgaGFzIG9ubHkgMSBJREUgY2hhbm5lbCAqLworI2RlZmluZSBJT0M0X1BSRF9CWVRFUyAgICAgICAxNgorI2RlZmluZSBJT0M0X1BSRF9FTlRSSUVTICAgICAoUEFHRV9TSVpFIC8oNCpJT0M0X1BSRF9CWVRFUykpCisKKworc3RhdGljIHZvaWQKK3NnaWlvYzRfaW5pdF9od2lmX3BvcnRzKGh3X3JlZ3NfdCAqIGh3LCB1bnNpZ25lZCBsb25nIGRhdGFfcG9ydCwKKwkJCXVuc2lnbmVkIGxvbmcgY3RybF9wb3J0LCB1bnNpZ25lZCBsb25nIGlycV9wb3J0KQoreworCXVuc2lnbmVkIGxvbmcgcmVnID0gZGF0YV9wb3J0OworCWludCBpOworCisJLyogUmVnaXN0ZXJzIGFyZSB3b3JkICgzMiBiaXQpIGFsaWduZWQgKi8KKwlmb3IgKGkgPSBJREVfREFUQV9PRkZTRVQ7IGkgPD0gSURFX1NUQVRVU19PRkZTRVQ7IGkrKykKKwkJaHctPmlvX3BvcnRzW2ldID0gcmVnICsgaSAqIDQ7CisKKwlpZiAoY3RybF9wb3J0KQorCQlody0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSA9IGN0cmxfcG9ydDsKKworCWlmIChpcnFfcG9ydCkKKwkJaHctPmlvX3BvcnRzW0lERV9JUlFfT0ZGU0VUXSA9IGlycV9wb3J0OworfQorCitzdGF0aWMgdm9pZAorc2dpaW9jNF9tYXNrcHJvYyhpZGVfZHJpdmVfdCAqIGRyaXZlLCBpbnQgbWFzaykKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaHdpZi0+T1VUQihtYXNrID8gKGRyaXZlLT5jdGwgfCAyKSA6IChkcml2ZS0+Y3RsICYgfjIpLAorCQkgICBJREVfQ09OVFJPTF9SRUcpOworfQorCisKK3N0YXRpYyBpbnQKK3NnaWlvYzRfY2hlY2tpcnEoaWRlX2h3aWZfdCAqIGh3aWYpCit7CisJdTggaW50cl9yZWcgPQorCSAgICBod2lmLT5JTkwoaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdICsgSU9DNF9JTlRSX1JFRyAqIDQpOworCisJaWYgKGludHJfcmVnICYgMHgwMykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitzZ2lpb2M0X2NsZWFyaXJxKGlkZV9kcml2ZV90ICogZHJpdmUpCit7CisJdTMyIGludHJfcmVnOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIG90aGVyX2lyID0KKwkgICAgaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdICsgKElPQzRfSU5UUl9SRUcgPDwgMik7CisKKwkvKiBDb2RlIHRvIGNoZWNrIGZvciBQQ0kgZXJyb3IgY29uZGl0aW9ucyAqLworCWludHJfcmVnID0gaHdpZi0+SU5MKG90aGVyX2lyKTsKKwlpZiAoaW50cl9yZWcgJiAweDAzKSB7IC8qIFZhbGlkIElPQzQtSURFIGludGVycnVwdCAqLworCQkvKgorCQkgKiBVc2luZyBod2lmLT5JTkIgdG8gcmVhZCB0aGUgSURFX1NUQVRVU19SRUcgaGFzIGEgc2lkZSBlZmZlY3QKKwkJICogb2YgY2xlYXJpbmcgdGhlIGludGVycnVwdC4gIFRoZSBmaXJzdCByZWFkIHNob3VsZCBjbGVhciBpdAorCQkgKiBpZiBpdCBpcyBzZXQuICBUaGUgc2Vjb25kIHJlYWQgc2hvdWxkIHJldHVybiBhICJjbGVhciIgc3RhdHVzCisJCSAqIGlmIGl0IGdvdCBjbGVhcmVkLiAgSWYgbm90LCB0aGVuIHNwaW4gZm9yIGEgYml0IHRyeWluZyB0bworCQkgKiBjbGVhciBpdC4KKwkJICovCisJCXU4IHN0YXQgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCQlpbnQgY291bnQgPSAwOworCQlzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKwkJd2hpbGUgKChzdGF0ICYgMHg4MCkgJiYgKGNvdW50KysgPCAxMDApKSB7CisJCQl1ZGVsYXkoMSk7CisJCQlzdGF0ID0gaHdpZi0+SU5CKElERV9TVEFUVVNfUkVHKTsKKwkJfQorCisJCWlmIChpbnRyX3JlZyAmIDB4MDIpIHsKKwkJCS8qIEVycm9yIHdoZW4gdHJhbnNmZXJyaW5nIERNQSBkYXRhIG9uIFBDSSBidXMgKi8KKwkJCXUzMiBwY2lfZXJyX2FkZHJfbG93LCBwY2lfZXJyX2FkZHJfaGlnaCwKKwkJCSAgICBwY2lfc3RhdF9jbWRfcmVnOworCisJCQlwY2lfZXJyX2FkZHJfbG93ID0KKwkJCQlod2lmLT5JTkwoaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdKTsKKwkJCXBjaV9lcnJfYWRkcl9oaWdoID0KKwkJCQlod2lmLT5JTkwoaHdpZi0+aW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdICsgNCk7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaHdpZi0+cGNpX2RldiwgUENJX0NPTU1BTkQsCisJCQkJCSAgICAgICZwY2lfc3RhdF9jbWRfcmVnKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlcyglcykgOiBQQ0kgQnVzIEVycm9yIHdoZW4gZG9pbmcgRE1BOiIKKwkJCQkgICAiIHN0YXR1cy1jbWQgcmVnIGlzIDB4JXhcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkcml2ZS0+bmFtZSwgcGNpX3N0YXRfY21kX3JlZyk7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXMoJXMpIDogUENJIEVycm9yIEFkZHJlc3MgaXMgMHgleCV4XG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZHJpdmUtPm5hbWUsCisJCQkgICAgICAgcGNpX2Vycl9hZGRyX2hpZ2gsIHBjaV9lcnJfYWRkcl9sb3cpOworCQkJLyogQ2xlYXIgdGhlIFBDSSBFcnJvciBpbmRpY2F0b3IgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaHdpZi0+cGNpX2RldiwgUENJX0NPTU1BTkQsCisJCQkJCSAgICAgICAweDAwMDAwMTQ2KTsKKwkJfQorCisJCS8qIENsZWFyIHRoZSBJbnRlcnJ1cHQsIEVycm9yIGJpdHMgb24gdGhlIElPQzQgKi8KKwkJaHdpZi0+T1VUTCgweDAzLCBvdGhlcl9pcik7CisKKwkJaW50cl9yZWcgPSBod2lmLT5JTkwob3RoZXJfaXIpOworCX0KKworCXJldHVybiBpbnRyX3JlZyAmIDM7Cit9CisKK3N0YXRpYyB2b2lkIHNnaWlvYzRfaWRlX2RtYV9zdGFydChpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gaHdpZi0+SU5MKGh3aWYtPmRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQpOworCXVuc2lnbmVkIGludCB0ZW1wX3JlZyA9IHJlZyB8IElPQzRfU19ETUFfU1RBUlQ7CisKKwlod2lmLT5PVVRMKHRlbXBfcmVnLCBod2lmLT5kbWFfYmFzZSArIElPQzRfRE1BX0NUUkwgKiA0KTsKK30KKworc3RhdGljIHUzMgorc2dpaW9jNF9pZGVfZG1hX3N0b3AoaWRlX2h3aWZfdCAqaHdpZiwgdTY0IGRtYV9iYXNlKQoreworCXUzMglpb2M0X2RtYTsKKwlpbnQJY291bnQ7CisKKwljb3VudCA9IDA7CisJaW9jNF9kbWEgPSBod2lmLT5JTkwoZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNCk7CisJd2hpbGUgKChpb2M0X2RtYSAmIElPQzRfU19ETUFfU1RPUCkgJiYgKGNvdW50KysgPCAyMDApKSB7CisJCXVkZWxheSgxKTsKKwkJaW9jNF9kbWEgPSBod2lmLT5JTkwoZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNCk7CisJfQorCXJldHVybiBpb2M0X2RtYTsKK30KKworLyogU3RvcHMgdGhlIElPQzQgRE1BIEVuZ2luZSAqLworc3RhdGljIGludAorc2dpaW9jNF9pZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCXUzMiBpb2M0X2RtYSwgYmNfZGV2LCBiY19tZW0sIG51bSwgdmFsaWQgPSAwLCBjbnQgPSAwOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1NjQgZG1hX2Jhc2UgPSBod2lmLT5kbWFfYmFzZTsKKwlpbnQgZG1hX3N0YXQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmVuZGluZ19kbWEgPSAodW5zaWduZWQgbG9uZyAqKSBod2lmLT5kbWFfYmFzZTI7CisKKwlod2lmLT5PVVRMKElPQzRfU19ETUFfU1RPUCwgZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNCk7CisKKwlpb2M0X2RtYSA9IHNnaWlvYzRfaWRlX2RtYV9zdG9wKGh3aWYsIGRtYV9iYXNlKTsKKworCWlmIChpb2M0X2RtYSAmIElPQzRfU19ETUFfU1RPUCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlcyglcyk6IElPQzQgRE1BIFNUT1AgYml0IGlzIHN0aWxsIDEgOiIKKwkJICAgICAgICJpb2M0X2RtYV9yZWcgMHgleFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZHJpdmUtPm5hbWUsIGlvYzRfZG1hKTsKKwkJZG1hX3N0YXQgPSAxOworCX0KKworCS8qCisJICogVGhlIElPQzQgd2lsbCBETUEgMSdzIHRvIHRoZSBlbmRpbmcgZG1hIGFyZWEgdG8gaW5kaWNhdGUgdGhhdAorCSAqIHByZXZpb3VzIGRhdGEgRE1BIGlzIGNvbXBsZXRlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiByZWxheGVkCisJICogb3JkZXJpbmcgYmV0d2VlbiByZWdpc3RlciByZWFkcyBhbmQgRE1BIHdyaXRlcyBvbiB0aGUgQWx0aXguCisJICovCisJd2hpbGUgKChjbnQrKyA8IDIwMCkgJiYgKCF2YWxpZCkpIHsKKwkJZm9yIChudW0gPSAwOyBudW0gPCAxNjsgbnVtKyspIHsKKwkJCWlmIChlbmRpbmdfZG1hW251bV0pIHsKKwkJCQl2YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlpZiAoIXZhbGlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMoJXMpIDogRE1BIGluY29tcGxldGVcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGRyaXZlLT5uYW1lKTsKKwkJZG1hX3N0YXQgPSAxOworCX0KKworCWJjX2RldiA9IGh3aWYtPklOTChkbWFfYmFzZSArIElPQzRfQkNfREVWICogNCk7CisJYmNfbWVtID0gaHdpZi0+SU5MKGRtYV9iYXNlICsgSU9DNF9CQ19NRU0gKiA0KTsKKworCWlmICgoYmNfZGV2ICYgMHgwMUZGKSB8fCAoYmNfbWVtICYgMHgxRkYpKSB7CisJCWlmIChiY19kZXYgPiBiY19tZW0gKyA4KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXMoJXMpOiBXQVJOSU5HISEgYnl0ZV9jb3VudF9kZXYgJWQgIgorCQkJICAgICAgICIhPSBieXRlX2NvdW50X21lbSAlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRyaXZlLT5uYW1lLCBiY19kZXYsIGJjX21lbSk7CisJCX0KKwl9CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKKwlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisKKwlyZXR1cm4gZG1hX3N0YXQ7Cit9CisKK3N0YXRpYyBpbnQKK3NnaWlvYzRfaWRlX2RtYV9jaGVjayhpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCWlmIChpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBYRkVSX01XX0RNQV8yKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJDb3VsZG5vdCBzZXQgJXMgaW4gTXVsdGltb2RlLTIgRE1BIG1vZGUgfCAiCisJCQkgICAiRHJpdmUgJXMgdXNpbmcgUElPIGluc3RlYWRcbiIsCisJCSAgICAgICBkcml2ZS0+bmFtZSwgZHJpdmUtPm5hbWUpOworCQlkcml2ZS0+dXNpbmdfZG1hID0gMDsKKwl9IGVsc2UKKwkJZHJpdmUtPnVzaW5nX2RtYSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2dpaW9jNF9pZGVfZG1hX29uKGlkZV9kcml2ZV90ICogZHJpdmUpCit7CisJZHJpdmUtPnVzaW5nX2RtYSA9IDE7CisKKwlyZXR1cm4gSFdJRihkcml2ZSktPmlkZV9kbWFfaG9zdF9vbihkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaWlvYzRfaWRlX2RtYV9vZmZfcXVpZXRseShpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCWRyaXZlLT51c2luZ19kbWEgPSAwOworCisJcmV0dXJuIEhXSUYoZHJpdmUpLT5pZGVfZG1hX2hvc3Rfb2ZmKGRyaXZlKTsKK30KKworLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludAorc2dpaW9jNF9pZGVfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICogZHJpdmUpCit7CisJcmV0dXJuIHNnaWlvYzRfY2hlY2tpcnEoSFdJRihkcml2ZSkpOworfQorCitzdGF0aWMgaW50CitzZ2lpb2M0X2lkZV9kbWFfaG9zdF9vbihpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCWlmIChkcml2ZS0+dXNpbmdfZG1hKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitzZ2lpb2M0X2lkZV9kbWFfaG9zdF9vZmYoaWRlX2RyaXZlX3QgKiBkcml2ZSkKK3sKKwlzZ2lpb2M0X2NsZWFyaXJxKGRyaXZlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZ2lpb2M0X2lkZV9kbWFfbG9zdGlycShpZGVfZHJpdmVfdCAqIGRyaXZlKQoreworCUhXSUYoZHJpdmUpLT5yZXNldHByb2MoZHJpdmUpOworCisJcmV0dXJuIF9faWRlX2RtYV9sb3N0aXJxKGRyaXZlKTsKK30KKworc3RhdGljIHZvaWQKK3NnaWlvYzRfcmVzZXRwcm9jKGlkZV9kcml2ZV90ICogZHJpdmUpCit7CisJc2dpaW9jNF9pZGVfZG1hX2VuZChkcml2ZSk7CisJc2dpaW9jNF9jbGVhcmlycShkcml2ZSk7Cit9CisKK3N0YXRpYyB1OAorc2dpaW9jNF9JTkIodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXU4IHJlZyA9ICh1OCkgaW5iKHBvcnQpOworCisJaWYgKChwb3J0ICYgMHhGRkYpID09IDB4MTFDKSB7CS8qIFN0YXR1cyByZWdpc3RlciBvZiBJT0M0ICovCisJCWlmIChyZWcgJiAweDUxKSB7CS8qIE5vdCBidXN5Li4uY2hlY2sgZm9yIGludGVycnVwdCAqLworCQkJdW5zaWduZWQgbG9uZyBvdGhlcl9pciA9IHBvcnQgLSAweDExMDsKKwkJCXVuc2lnbmVkIGludCBpbnRyX3JlZyA9ICh1MzIpIGlubChvdGhlcl9pcik7CisKKwkJCS8qIENsZWFyIHRoZSBJbnRlcnJ1cHQsIEVycm9yIGJpdHMgb24gdGhlIElPQzQgKi8KKwkJCWlmIChpbnRyX3JlZyAmIDB4MDMpIHsKKwkJCQlvdXRsKDB4MDMsIG90aGVyX2lyKTsKKwkJCQlpbnRyX3JlZyA9ICh1MzIpIGlubChvdGhlcl9pcik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmVnOworfQorCisvKiBDcmVhdGVzIGEgZG1hIG1hcCBmb3IgdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgZW50cmllcyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0CitpZGVfZG1hX3NnaWlvYzQoaWRlX2h3aWZfdCAqIGh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UpCit7CisJaW50IG51bV9wb3J0cyA9IHNpemVvZiAoaW9jNF9kbWFfcmVnc190KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBCTS1ETUEgYXQgMHglMDRseC0weCUwNGx4XG4iLCBod2lmLT5uYW1lLAorCSAgICAgICBkbWFfYmFzZSwgZG1hX2Jhc2UgKyBudW1fcG9ydHMgLSAxKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZG1hX2Jhc2UsIG51bV9wb3J0cywgaHdpZi0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXMoJXMpIC0tIEVSUk9SLCBBZGRyZXNzZXMgMHglcCB0byAweCVwICIKKwkJICAgICAgICJBTFJFQURZIGluIHVzZVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgaHdpZi0+bmFtZSwgKHZvaWQgKikgZG1hX2Jhc2UsCisJCSAgICAgICAodm9pZCAqKSBkbWFfYmFzZSArIG51bV9wb3J0cyAtIDEpOworCQlnb3RvIGRtYV9hbGxvY19mYWlsdXJlOworCX0KKworCWh3aWYtPmRtYV9iYXNlID0gZG1hX2Jhc2U7CisJaHdpZi0+ZG1hdGFibGVfY3B1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaHdpZi0+cGNpX2RldiwKKwkJCQkJICBJT0M0X1BSRF9FTlRSSUVTICogSU9DNF9QUkRfQllURVMsCisJCQkJCSAgJmh3aWYtPmRtYXRhYmxlX2RtYSk7CisKKwlpZiAoIWh3aWYtPmRtYXRhYmxlX2NwdSkKKwkJZ290byBkbWFfYWxsb2NfZmFpbHVyZTsKKworCWh3aWYtPnNnX21heF9uZW50cyA9IElPQzRfUFJEX0VOVFJJRVM7CisKKwlod2lmLT5kbWFfYmFzZTIgPSAodW5zaWduZWQgbG9uZykKKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaHdpZi0+cGNpX2RldiwKKwkJCQkgICAgIElPQzRfSURFX0NBQ0hFTElORV9TSVpFLAorCQkJCSAgICAgKGRtYV9hZGRyX3QgKikgJihod2lmLT5kbWFfc3RhdHVzKSk7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlMikKKwkJZ290byBkbWFfYmFzZTJhbGxvY19mYWlsdXJlOworCisJcmV0dXJuOworCitkbWFfYmFzZTJhbGxvY19mYWlsdXJlOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoaHdpZi0+cGNpX2RldiwKKwkJCSAgICBJT0M0X1BSRF9FTlRSSUVTICogSU9DNF9QUkRfQllURVMsCisJCQkgICAgaHdpZi0+ZG1hdGFibGVfY3B1LCBod2lmLT5kbWF0YWJsZV9kbWEpOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIiVzKCkgLS0gRXJyb3IhIFVuYWJsZSB0byBhbGxvY2F0ZSBETUEgTWFwcyBmb3IgZHJpdmUgJXNcbiIsCisJICAgICAgIF9fRlVOQ1RJT05fXywgaHdpZi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiQ2hhbmdpbmcgZnJvbSBETUEgdG8gUElPIG1vZGUgZm9yIERyaXZlICVzXG4iLCBod2lmLT5uYW1lKTsKKworZG1hX2FsbG9jX2ZhaWx1cmU6CisJLyogRGlzYWJsZSBETUEgYmVjYXVzZSB3ZSBjb3VsZG5vdCBhbGxvY2F0ZSBhbnkgRE1BIG1hcHMgKi8KKwlod2lmLT5hdXRvZG1hID0gMDsKKwlod2lmLT5hdGFwaV9kbWEgPSAwOworfQorCisvKiBJbml0aWFsaXplcyB0aGUgSU9DNCBETUEgRW5naW5lICovCitzdGF0aWMgdm9pZAorc2dpaW9jNF9jb25maWd1cmVfZm9yX2RtYShpbnQgZG1hX2RpcmVjdGlvbiwgaWRlX2RyaXZlX3QgKiBkcml2ZSkKK3sKKwl1MzIgaW9jNF9kbWE7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXU2NCBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOworCXUzMiBkbWFfYWRkciwgZW5kaW5nX2RtYV9hZGRyOworCisJaW9jNF9kbWEgPSBod2lmLT5JTkwoZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNCk7CisKKwlpZiAoaW9jNF9kbWEgJiBJT0M0X1NfRE1BX0FDVElWRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXMoJXMpOldhcm5pbmchISBETUEgZnJvbSBwcmV2aW91cyB0cmFuc2ZlciB3YXMgc3RpbGwgYWN0aXZlXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBkcml2ZS0+bmFtZSk7CisJCWh3aWYtPk9VVEwoSU9DNF9TX0RNQV9TVE9QLCBkbWFfYmFzZSArIElPQzRfRE1BX0NUUkwgKiA0KTsKKwkJaW9jNF9kbWEgPSBzZ2lpb2M0X2lkZV9kbWFfc3RvcChod2lmLCBkbWFfYmFzZSk7CisKKwkJaWYgKGlvYzRfZG1hICYgSU9DNF9TX0RNQV9TVE9QKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzKCVzKSA6IElPQzQgRG1hIFNUT1AgYml0IGlzIHN0aWxsIDFcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkcml2ZS0+bmFtZSk7CisJfQorCisJaW9jNF9kbWEgPSBod2lmLT5JTkwoZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNCk7CisJaWYgKGlvYzRfZG1hICYgSU9DNF9TX0RNQV9FUlJPUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXMoJXMpIDogV2FybmluZyEhIC0gRE1BIEVycm9yIGR1cmluZyBQcmV2aW91cyIKKwkJICAgICAgICIgdHJhbnNmZXIgfCBzdGF0dXMgMHgleFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZHJpdmUtPm5hbWUsIGlvYzRfZG1hKTsKKwkJaHdpZi0+T1VUTChJT0M0X1NfRE1BX1NUT1AsIGRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQpOworCQlpb2M0X2RtYSA9IHNnaWlvYzRfaWRlX2RtYV9zdG9wKGh3aWYsIGRtYV9iYXNlKTsKKworCQlpZiAoaW9jNF9kbWEgJiBJT0M0X1NfRE1BX1NUT1ApCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXMoJXMpIDogSU9DNCBETUEgU1RPUCBiaXQgaXMgc3RpbGwgMVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRyaXZlLT5uYW1lKTsKKwl9CisKKwkvKiBBZGRyZXNzIG9mIHRoZSBTY2F0dGVyIEdhdGhlciBMaXN0ICovCisJZG1hX2FkZHIgPSBjcHVfdG9fbGUzMihod2lmLT5kbWF0YWJsZV9kbWEpOworCWh3aWYtPk9VVEwoZG1hX2FkZHIsIGRtYV9iYXNlICsgSU9DNF9ETUFfUFRSX0wgKiA0KTsKKworCS8qIEFkZHJlc3Mgb2YgdGhlIEVuZGluZyBETUEgKi8KKwltZW1zZXQoKHVuc2lnbmVkIGludCAqKSBod2lmLT5kbWFfYmFzZTIsIDAsIElPQzRfSURFX0NBQ0hFTElORV9TSVpFKTsKKwllbmRpbmdfZG1hX2FkZHIgPSBjcHVfdG9fbGUzMihod2lmLT5kbWFfc3RhdHVzKTsKKwlod2lmLT5PVVRMKGVuZGluZ19kbWFfYWRkciwgZG1hX2Jhc2UgKyBJT0M0X0RNQV9FTkRfQUREUiAqIDQpOworCisJaHdpZi0+T1VUTChkbWFfZGlyZWN0aW9uLCBkbWFfYmFzZSArIElPQzRfRE1BX0NUUkwgKiA0KTsKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKK30KKworLyogSU9DNCBTY2F0dGVyIEdhdGhlciBsaXN0IEZvcm1hdCAJCQkJCSAqLworLyogMTI4IEJpdCBlbnRyaWVzIHRvIHN1cHBvcnQgNjQgYml0IGFkZHJlc3NlcyBpbiB0aGUgZnV0dXJlCQkgKi8KKy8qIFRoZSBTY2F0dGVyIEdhdGhlciBsaXN0IEVudHJ5IHNob3VsZCBiZSBpbiB0aGUgQklHLUVORElBTiBGb3JtYXQJICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgVXBwZXIgMzIgYml0cyAtIFplcm8gICAgICAgICAgIHwJIAlMb3dlciAzMiBiaXRzLSBhZGRyZXNzIHwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogfCBVcHBlciAzMiBiaXRzIC0gWmVybwkgICAgfEVPTHwgMTUgdW51c2VkICAgICB8IDE2IEJpdCBMZW5ndGh8ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIENyZWF0ZXMgdGhlIHNjYXR0ZXIgZ2F0aGVyIGxpc3QsIERNQSBUYWJsZSAqLworc3RhdGljIHVuc2lnbmVkIGludAorc2dpaW9jNF9idWlsZF9kbWFfdGFibGUoaWRlX2RyaXZlX3QgKiBkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZGRpcikKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJdW5zaWduZWQgaW50ICp0YWJsZSA9IGh3aWYtPmRtYXRhYmxlX2NwdTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwLCBpID0gMTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJaHdpZi0+c2dfbmVudHMgPSBpID0gaWRlX2J1aWxkX3NnbGlzdChkcml2ZSwgcnEpOworCisJaWYgKCFpKQorCQlyZXR1cm4gMDsJLyogc2dsaXN0IG9mIGxlbmd0aCBaZXJvICovCisKKwlzZyA9IGh3aWYtPnNnX3RhYmxlOworCXdoaWxlIChpICYmIHNnX2RtYV9sZW4oc2cpKSB7CisJCWRtYV9hZGRyX3QgY3VyX2FkZHI7CisJCWludCBjdXJfbGVuOworCQljdXJfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJY3VyX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCXdoaWxlIChjdXJfbGVuKSB7CisJCQlpZiAoY291bnQrKyA+PSBJT0M0X1BSRF9FTlRSSUVTKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiJXM6IERNQSB0YWJsZSB0b28gc21hbGxcbiIsCisJCQkJICAgICAgIGRyaXZlLT5uYW1lKTsKKwkJCQlnb3RvIHVzZV9waW9faW5zdGVhZDsKKwkJCX0gZWxzZSB7CisJCQkJdTMyIHhjb3VudCwgYmNvdW50ID0KKwkJCQkgICAgMHgxMDAwMCAtIChjdXJfYWRkciAmIDB4ZmZmZik7CisKKwkJCQlpZiAoYmNvdW50ID4gY3VyX2xlbikKKwkJCQkJYmNvdW50ID0gY3VyX2xlbjsKKworCQkJCS8qIHB1dCB0aGUgYWRkciwgbGVuZ3RoIGluCisJCQkJICogdGhlIElPQzQgZG1hLXRhYmxlIGZvcm1hdCAqLworCQkJCSp0YWJsZSA9IDB4MDsKKwkJCQl0YWJsZSsrOworCQkJCSp0YWJsZSA9IGNwdV90b19iZTMyKGN1cl9hZGRyKTsKKwkJCQl0YWJsZSsrOworCQkJCSp0YWJsZSA9IDB4MDsKKwkJCQl0YWJsZSsrOworCisJCQkJeGNvdW50ID0gYmNvdW50ICYgMHhmZmZmOworCQkJCSp0YWJsZSA9IGNwdV90b19iZTMyKHhjb3VudCk7CisJCQkJdGFibGUrKzsKKworCQkJCWN1cl9hZGRyICs9IGJjb3VudDsKKwkJCQljdXJfbGVuIC09IGJjb3VudDsKKwkJCX0KKwkJfQorCisJCXNnKys7CisJCWktLTsKKwl9CisKKwlpZiAoY291bnQpIHsKKwkJdGFibGUtLTsKKwkJKnRhYmxlIHw9IGNwdV90b19iZTMyKDB4ODAwMDAwMDApOworCQlyZXR1cm4gY291bnQ7CisJfQorCit1c2VfcGlvX2luc3RlYWQ6CisJcGNpX3VubWFwX3NnKGh3aWYtPnBjaV9kZXYsIGh3aWYtPnNnX3RhYmxlLCBod2lmLT5zZ19uZW50cywKKwkJICAgICBod2lmLT5zZ19kbWFfZGlyZWN0aW9uKTsKKworCXJldHVybiAwOwkJLyogcmV2ZXJ0IHRvIFBJTyBmb3IgdGhpcyByZXF1ZXN0ICovCit9CisKK3N0YXRpYyBpbnQgc2dpaW9jNF9pZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlpbnQgZGRpcjsKKworCWlmIChycV9kYXRhX2RpcihycSkpCisJCWRkaXIgPSBQQ0lfRE1BX1RPREVWSUNFOworCWVsc2UKKwkJZGRpciA9IFBDSV9ETUFfRlJPTURFVklDRTsKKworCWlmICghKGNvdW50ID0gc2dpaW9jNF9idWlsZF9kbWFfdGFibGUoZHJpdmUsIHJxLCBkZGlyKSkpIHsKKwkJLyogdHJ5IFBJTyBpbnN0ZWFkIG9mIERNQSAqLworCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChycV9kYXRhX2RpcihycSkpCisJCS8qIFdyaXRlcyBUTyB0aGUgSU9DNCBGUk9NIE1haW4gTWVtb3J5ICovCisJCWRkaXIgPSBJT0M0X0RNQV9SRUFEOworCWVsc2UKKwkJLyogV3JpdGVzIEZST00gdGhlIElPQzQgVE8gTWFpbiBNZW1vcnkgKi8KKwkJZGRpciA9IElPQzRfRE1BX1dSSVRFOworCisJc2dpaW9jNF9jb25maWd1cmVfZm9yX2RtYShkZGlyLCBkcml2ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitpZGVfaW5pdF9zZ2lpb2M0KGlkZV9od2lmX3QgKiBod2lmKQoreworCWh3aWYtPm1taW8gPSAyOworCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmF0YXBpX2RtYSA9IDE7CisJaHdpZi0+dWx0cmFfbWFzayA9IDB4MDsJLyogRGlzYWJsZSBVbHRyYSBETUEgKi8KKwlod2lmLT5td2RtYV9tYXNrID0gMHgyOwkvKiBNdWx0aW1vZGUtMiBETUEgICovCisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MjsKKwlod2lmLT50dW5lcHJvYyA9IE5VTEw7CS8qIFNldHMgdGltaW5nIGZvciBQSU8gbW9kZSAqLworCWh3aWYtPnNwZWVkcHJvYyA9IE5VTEw7CS8qIFNldHMgdGltaW5nIGZvciBETUEgJi9vciBQSU8gbW9kZXMgKi8KKwlod2lmLT5zZWxlY3Rwcm9jID0gTlVMTDsvKiBVc2UgdGhlIGRlZmF1bHQgcm91dGluZSB0byBzZWxlY3QgZHJpdmUgKi8KKwlod2lmLT5yZXNldF9wb2xsID0gTlVMTDsvKiBObyBIQkEgc3BlY2lmaWMgcmVzZXRfcG9sbCBuZWVkZWQgKi8KKwlod2lmLT5wcmVfcmVzZXQgPSBOVUxMOwkvKiBObyBIQkEgc3BlY2lmaWMgcHJlX3NldCBuZWVkZWQgKi8KKwlod2lmLT5yZXNldHByb2MgPSAmc2dpaW9jNF9yZXNldHByb2M7LyogUmVzZXQgRE1BIGVuZ2luZSwKKwkJCQkJCWNsZWFyIGludGVycnVwdHMgKi8KKwlod2lmLT5pbnRycHJvYyA9IE5VTEw7CS8qIEVuYWJsZSBvciBEaXNhYmxlIGludGVycnVwdCBmcm9tIGRyaXZlICovCisJaHdpZi0+bWFza3Byb2MgPSAmc2dpaW9jNF9tYXNrcHJvYzsJLyogTWFzayBvbi9vZmYgTklFTiByZWdpc3RlciAqLworCWh3aWYtPnF1aXJrcHJvYyA9IE5VTEw7CisJaHdpZi0+YnVzcHJvYyA9IE5VTEw7CisKKwlod2lmLT5kbWFfc2V0dXAgPSAmc2dpaW9jNF9pZGVfZG1hX3NldHVwOworCWh3aWYtPmRtYV9zdGFydCA9ICZzZ2lpb2M0X2lkZV9kbWFfc3RhcnQ7CisJaHdpZi0+aWRlX2RtYV9lbmQgPSAmc2dpaW9jNF9pZGVfZG1hX2VuZDsKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJnNnaWlvYzRfaWRlX2RtYV9jaGVjazsKKwlod2lmLT5pZGVfZG1hX29uID0gJnNnaWlvYzRfaWRlX2RtYV9vbjsKKwlod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5ID0gJnNnaWlvYzRfaWRlX2RtYV9vZmZfcXVpZXRseTsKKwlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJnNnaWlvYzRfaWRlX2RtYV90ZXN0X2lycTsKKwlod2lmLT5pZGVfZG1hX2hvc3Rfb24gPSAmc2dpaW9jNF9pZGVfZG1hX2hvc3Rfb247CisJaHdpZi0+aWRlX2RtYV9ob3N0X29mZiA9ICZzZ2lpb2M0X2lkZV9kbWFfaG9zdF9vZmY7CisJaHdpZi0+aWRlX2RtYV9sb3N0aXJxID0gJnNnaWlvYzRfaWRlX2RtYV9sb3N0aXJxOworCWh3aWYtPmlkZV9kbWFfdGltZW91dCA9ICZfX2lkZV9kbWFfdGltZW91dDsKKwlod2lmLT5JTkIgPSAmc2dpaW9jNF9JTkI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzZ2lpb2M0X2lkZV9zZXR1cF9wY2lfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKiBkKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSwgY3RsLCBkbWFfYmFzZSwgaXJxcG9ydDsKKwlpZGVfaHdpZl90ICpod2lmOworCWludCBoOworCisJZm9yIChoID0gMDsgaCA8IE1BWF9IV0lGUzsgKytoKSB7CisJCWh3aWYgPSAmaWRlX2h3aWZzW2hdOworCQkvKiBGaW5kIGFuIGVtcHR5IEhXSUYgKi8KKwkJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3Vua25vd24pCisJCQlicmVhazsKKwl9CisKKwkvKiAgR2V0IHRoZSBDbWRCbGsgYW5kIEN0cmxCbGsgQmFzZSBSZWdpc3RlcnMgKi8KKwliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkgKyBJT0M0X0NNRF9PRkZTRVQ7CisJY3RsID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkgKyBJT0M0X0NUUkxfT0ZGU0VUOworCWlycXBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSArIElPQzRfSU5UUl9PRkZTRVQ7CisJZG1hX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSArIElPQzRfRE1BX09GRlNFVDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgSU9DNF9DTURfQ1RMX0JMS19TSVpFLCBod2lmLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlcyA6ICVzIC0tIEVSUk9SLCBQb3J0IEFkZHJlc3NlcyAiCisJCQkiMHglcCB0byAweCVwIEFMUkVBRFkgaW4gdXNlXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBod2lmLT5uYW1lLCAodm9pZCAqKSBiYXNlLAorCQkgICAgICAgKHZvaWQgKikgYmFzZSArIElPQzRfQ01EX0NUTF9CTEtfU0laRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdICE9IGJhc2UpIHsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgSU8gcmVnaXN0ZXJzICovCisJCXNnaWlvYzRfaW5pdF9od2lmX3BvcnRzKCZod2lmLT5odywgYmFzZSwgY3RsLCBpcnFwb3J0KTsKKwkJbWVtY3B5KGh3aWYtPmlvX3BvcnRzLCBod2lmLT5ody5pb19wb3J0cywKKwkJICAgICAgIHNpemVvZiAoaHdpZi0+aW9fcG9ydHMpKTsKKwkJaHdpZi0+bm9wcm9iZSA9ICFod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdOworCX0KKworCWh3aWYtPmlycSA9IGRldi0+aXJxOworCWh3aWYtPmNoaXBzZXQgPSBpZGVfcGNpOworCWh3aWYtPnBjaV9kZXYgPSBkZXY7CisJaHdpZi0+Y2hhbm5lbCA9IDA7CS8qIFNpbmdsZSBDaGFubmVsIGNoaXAgKi8KKwlod2lmLT5jZHMgPSAoc3RydWN0IGlkZV9wY2lfZGV2aWNlX3MgKikgZDsKKwlod2lmLT5nZW5kZXYucGFyZW50ID0gJmRldi0+ZGV2Oy8qIHNldHVwIHByb3BlciBhbmNlc3RyYWwgaW5mb3JtYXRpb24gKi8KKworCS8qIEluaXRpYWxpemluZyBjaGlwc2V0IElSUSBSZWdpc3RlcnMgKi8KKwlod2lmLT5PVVRMKDB4MDMsIGlycXBvcnQgKyBJT0M0X0lOVFJfU0VUICogNCk7CisKKwlpZGVfaW5pdF9zZ2lpb2M0KGh3aWYpOworCisJaWYgKGRtYV9iYXNlKQorCQlpZGVfZG1hX3NnaWlvYzQoaHdpZiwgZG1hX2Jhc2UpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIEJ1cy1NYXN0ZXIgRE1BIGRpc2FibGVkXG4iLAorCQkgICAgICAgaHdpZi0+bmFtZSwgZC0+bmFtZSk7CisKKwlpZiAocHJvYmVfaHdpZl9pbml0KGh3aWYpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIENyZWF0ZSAvcHJvYy9pZGUgZW50cmllcyAqLworCWNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKCk7IAorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0CitwY2lfaW5pdF9zZ2lpb2M0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKiBkKQoreworCXVuc2lnbmVkIGludCBjbGFzc19yZXY7CisJaW50IHJldDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CisJY2xhc3NfcmV2ICY9IDB4ZmY7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElERSBjb250cm9sbGVyIGF0IFBDSSBzbG90ICVzLCByZXZpc2lvbiAlZFxuIiwKKwkJCWQtPm5hbWUsIHBjaV9uYW1lKGRldiksIGNsYXNzX3Jldik7CisJaWYgKGNsYXNzX3JldiA8IElPQzRfU1VQUE9SVEVEX0ZJUk1XQVJFX1JFVikgeworCQlwcmludGsoS0VSTl9FUlIgIlNraXBwaW5nICVzIElERSBjb250cm9sbGVyIGluIHNsb3QgJXM6ICIKKwkJCSJmaXJtd2FyZSBpcyBvYnNvbGV0ZSAtIHBsZWFzZSB1cGdyYWRlIHRvIHJldmlzaW9uIgorCQkJIjQ2IG9yIGhpZ2hlclxuIiwgZC0+bmFtZSwgcGNpX25hbWUoZGV2KSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSBzZ2lpb2M0X2lkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3Qgc2dpaW9jNF9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCSAvKiBDaGFubmVsIDAgKi8KKwkgLm5hbWUgPSAiU0dJSU9DNCIsCisJIC5pbml0X2h3aWYgPSBpZGVfaW5pdF9zZ2lpb2M0LAorCSAuaW5pdF9kbWEgPSBpZGVfZG1hX3NnaWlvYzQsCisJIC5jaGFubmVscyA9IDEsCisJIC5hdXRvZG1hID0gQVVUT0RNQSwKKwkgLyogU0dJIElPQzQgZG9lc24ndCBoYXZlIGVuYWJsZWJpdHMuICovCisJIC5ib290YWJsZSA9IE9OX0JPQVJELAorCX0KK307CisKK2ludAoraW9jNF9pZGVfYXR0YWNoX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHBjaV9pbml0X3NnaWlvYzQoZGV2LCAmc2dpaW9jNF9jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJBbmlrZXQgTWFsYXRwdXJlIC0gU2lsaWNvbiBHcmFwaGljcyBJbmMuIChTR0kpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklERSBQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgU0dJIElPQzQgQmFzZS1JTyBDYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0woaW9jNF9pZGVfYXR0YWNoX29uZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2lpbWFnZS5jIGIvZHJpdmVycy9pZGUvcGNpL3NpaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjk5NjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NpaW1hZ2UuYwpAQCAtMCwwICsxLDExMzMgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvc2lpbWFnZS5jCQlWZXJzaW9uIDEuMDcJTm92IDMwLCAyMDAzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMwkJUmVkIEhhdCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKiAgRG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgdW5kZXIgTkRBIG9ubHkKKyAqCisgKgorICogIEZBUSBJdGVtczoKKyAqCUlmIHlvdSBhcmUgdXNpbmcgTWFydmVsbCBTQVRBLUlERSBhZGFwdGVycyB3aXRoIE1heHRvciBkcml2ZXMKKyAqCWVuc3VyZSB0aGUgc3lzdGVtIGlzIHNldCB1cCBmb3IgQVRBMTAwL1VETUE1IG5vdCBVRE1BNi4KKyAqCisgKglJZiB5b3UgYXJlIHVzaW5nIFdEIGRyaXZlcyB3aXRoIFNBVEEgYnJpZGdlcyB5b3UgbXVzdCBzZXQgdGhlCisgKglkcml2ZSB0byAiU2luZ2xlIi4gIk1hc3RlciIgd2lsbCBoYW5nCisgKgorICoJSWYgeW91IGhhdmUgc3RyYW5nZSBwcm9ibGVtcyB3aXRoIG5WaWRpYSBjaGlwc2V0IHN5c3RlbXMgcGxlYXNlCisgKglzZWUgdGhlIFNJIHN1cHBvcnQgZG9jdW1lbnRhdGlvbiBhbmQgdXBkYXRlIHlvdXIgc3lzdGVtIEJJT1MKKyAqCWlmIG5lY2Nlc3NhcnkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyN1bmRlZiBTSUlNQUdFX1ZJUlRVQUxfRE1BUElPCisjdW5kZWYgU0lJTUFHRV9MQVJHRV9ETUEKKworLyoqCisgKglwZGV2X2lzX3NhdGEJCS0JY2hlY2sgaWYgZGV2aWNlIGlzIFNBVEEKKyAqCUBwZGV2OglQQ0kgZGV2aWNlIHRvIGNoZWNrCisgKgkKKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgU0FUQSBjb250cm9sbGVyCisgKi8KKyAKK3N0YXRpYyBpbnQgcGRldl9pc19zYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN3aXRjaChwZGV2LT5kZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfU0lJXzMxMTI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9TSUlfMTIxMFNBOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgUENJX0RFVklDRV9JRF9TSUlfNjgwOgorCQkJcmV0dXJuIDA7CisJfQorCUJVRygpOworCXJldHVybiAwOworfQorIAorLyoqCisgKglpc19zYXRhCQkJLQljaGVjayBpZiBod2lmIGlzIFNBVEEKKyAqCUBod2lmOglpbnRlcmZhY2UgdG8gY2hlY2sKKyAqCQorICoJUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBTQVRBIGNvbnRyb2xsZXIKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNfc2F0YShpZGVfaHdpZl90ICpod2lmKQoreworCXJldHVybiBwZGV2X2lzX3NhdGEoaHdpZi0+cGNpX2Rldik7Cit9CisKKy8qKgorICoJc2lpbWFnZV9zZWxyZWcJCS0JcmV0dXJuIHJlZ2lzdGVyIGJhc2UKKyAqCUBod2lmOiBpbnRlcmZhY2UKKyAqCUByOiBjb25maWcgb2Zmc2V0CisgKgorICoJVHVybiBhIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgaW50byB0aGUgcmlnaHQgYWRkcmVzcyBpbiBlaXRoZXIKKyAqCVBDSSBzcGFjZSBvciBNTUlPIHNwYWNlIHRvIGFjY2VzcyB0aGUgY29udHJvbCByZWdpc3RlciBpbiBxdWVzdGlvbgorICoJVGhhbmtmdWxseSB0aGlzIGlzIGEgY29uZmlndXJhdGlvbiBvcGVyYXRpb24gc28gaXNudCBwZXJmb3JtYW5jZQorICoJY3JpdGljaWFsLiAKKyAqLworIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lpbWFnZV9zZWxyZWcoaWRlX2h3aWZfdCAqaHdpZiwgaW50IHIpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKHVuc2lnbmVkIGxvbmcpaHdpZi0+aHdpZl9kYXRhOworCWJhc2UgKz0gMHhBMCArIHI7CisJaWYoaHdpZi0+bW1pbykKKwkJYmFzZSArPSAoaHdpZi0+Y2hhbm5lbCA8PCA2KTsKKwllbHNlCisJCWJhc2UgKz0gKGh3aWYtPmNoYW5uZWwgPDwgNCk7CisJcmV0dXJuIGJhc2U7Cit9CisJCisvKioKKyAqCXNpaW1hZ2Vfc2VsZGV2CQktCXJldHVybiByZWdpc3RlciBiYXNlCisgKglAaHdpZjogaW50ZXJmYWNlCisgKglAcjogY29uZmlnIG9mZnNldAorICoKKyAqCVR1cm4gYSBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0IGludG8gdGhlIHJpZ2h0IGFkZHJlc3MgaW4gZWl0aGVyCisgKglQQ0kgc3BhY2Ugb3IgTU1JTyBzcGFjZSB0byBhY2Nlc3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW4gcXVlc3Rpb24KKyAqCWluY2x1ZGluZyBhY2NvdW50aW5nIGZvciB0aGUgdW5pdCBzaGlmdC4KKyAqLworIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNpaW1hZ2Vfc2VsZGV2KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHIpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKKwliYXNlICs9IDB4QTAgKyByOworCWlmKGh3aWYtPm1taW8pCisJCWJhc2UgKz0gKGh3aWYtPmNoYW5uZWwgPDwgNik7CisJZWxzZQorCQliYXNlICs9IChod2lmLT5jaGFubmVsIDw8IDQpOworCWJhc2UgfD0gZHJpdmUtPnNlbGVjdC5iLnVuaXQgPDwgZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJcmV0dXJuIGJhc2U7Cit9CisKKy8qKgorICoJc2lpbWFnZV9yYXRlbWFzawktCUNvbXB1dGUgYXZhaWxhYmxlIG1vZGVzCisgKglAZHJpdmU6IElERSBkcml2ZQorICoKKyAqCUNvbXB1dGUgdGhlIGF2YWlsYWJsZSBzcGVlZHMgZm9yIHRoZSBkZXZpY2VzIG9uIHRoZSBpbnRlcmZhY2UuCisgKglGb3IgdGhlIENNRDY4MCB0aGlzIGRlcGVuZHMgb24gdGhlIGNsb2NraW5nIG1vZGUgKHNjc2MpLCBmb3IgdGhlCisgKglTSTMzMTIgU0FUQSBjb250cm9sbGVyIGxpZmUgaXMgYSBiaXQgc2ltcGxlci4gRW5mb3JjZSBVRE1BMzMKKyAqCWFzIGEgbGltaXQgaWYgdGhlcmUgaXMgbm8gODBwaW4gY2FibGUgcHJlc2VudC4KKyAqLworIAorc3RhdGljIGJ5dGUgc2lpbWFnZV9yYXRlbWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBtb2RlCT0gMCwgc2NzYyA9IDA7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKHVuc2lnbmVkIGxvbmcpIGh3aWYtPmh3aWZfZGF0YTsKKworCWlmIChod2lmLT5tbWlvKQorCQlzY3NjID0gaHdpZi0+SU5CKGJhc2UgKyAweDRBKTsKKwllbHNlCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4OEEsICZzY3NjKTsKKworCWlmKGlzX3NhdGEoaHdpZikpCisJeworCQlpZihzdHJzdHIoZHJpdmUtPmlkLT5tb2RlbCwgIk1heHRvciIpKQorCQkJcmV0dXJuIDM7CisJCXJldHVybiA0OworCX0KKwkKKwlpZiAoKHNjc2MgJiAweDMwKSA9PSAweDEwKQkvKiAxMzMgKi8KKwkJbW9kZSA9IDQ7CisJZWxzZSBpZiAoKHNjc2MgJiAweDMwKSA9PSAweDIwKQkvKiAyeFBDSSAqLworCQltb2RlID0gNDsKKwllbHNlIGlmICgoc2NzYyAmIDB4MzApID09IDB4MDApCS8qIDEwMCAqLworCQltb2RlID0gMzsKKwllbHNlIAkvKiBEaXNhYmxlZCA/ICovCisJCUJVRygpOworCisJaWYgKCFlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpKQorCQltb2RlID0gbWluKG1vZGUsICh1OCkxKTsKKwlyZXR1cm4gbW9kZTsKK30KKworLyoqCisgKglzaWltYWdlX3Rhc2tmaWxlX3RpbWluZwktCXR1cm4gdGltaW5nIGRhdGEgdG8gYSBtb2RlCisgKglAaHdpZjogaW50ZXJmYWNlIHRvIHF1ZXJ5CisgKgorICoJUmVhZCB0aGUgdGltaW5nIGRhdGEgZm9yIHRoZSBpbnRlcmZhY2UgYW5kIHJldHVybiB0aGUgCisgKgltb2RlIHRoYXQgaXMgYmVpbmcgdXNlZC4KKyAqLworIAorc3RhdGljIGJ5dGUgc2lpbWFnZV90YXNrZmlsZV90aW1pbmcgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTE2IHRpbWluZwk9IDB4MzI4YTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBzaWltYWdlX3NlbHJlZyhod2lmLCAyKTsKKworCWlmIChod2lmLT5tbWlvKQorCQl0aW1pbmcgPSBod2lmLT5JTlcoYWRkcik7CisJZWxzZQorCQlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCBhZGRyLCAmdGltaW5nKTsKKworCXN3aXRjaCAodGltaW5nKSB7CisJCWNhc2UgMHgxMGMxOglyZXR1cm4gNDsKKwkJY2FzZSAweDEwYzM6CXJldHVybiAzOworCQljYXNlIDB4MTEwNDoKKwkJY2FzZSAweDEyODE6CXJldHVybiAyOworCQljYXNlIDB4MjI4MzoJcmV0dXJuIDE7CisJCWNhc2UgMHgzMjhhOgorCQlkZWZhdWx0OglyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICoJc2ltbWFnZV90dW5lcHJvYwktCXR1bmUgYSBkcml2ZQorICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKglAbW9kZV93YW50ZWQ6IHRoZSB0YXJnZXQgb3BlcmF0aW5nIG1vZGUKKyAqCisgKglMb2FkIHRoZSB0aW1pbmcgc2V0dGluZ3MgZm9yIHRoaXMgZGV2aWNlIG1vZGUgaW50byB0aGUKKyAqCWNvbnRyb2xsZXIuIElmIHdlIGFyZSBpbiBQSU8gbW9kZSAzIG9yIDQgdHVybiBvbiBJT1JEWQorICoJbW9uaXRvcmluZyAoYml0IDkpLiBUaGUgVEYgdGltaW5nIGlzIGJpdHMgMzE6MTYKKyAqLworIAorc3RhdGljIHZvaWQgc2lpbWFnZV90dW5lcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1MzIgc3BlZWR0CQk9IDA7CisJdTE2IHNwZWVkcAkJPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VsZGV2KGRyaXZlLCAweDA0KTsKKwl1bnNpZ25lZCBsb25nIHRmYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDB4MDIpOworCQorCS8qIGNoZWF0IGZvciBub3cgYW5kIHVzZSB0aGUgZG9jcyAqLworCXN3aXRjaChtb2RlX3dhbnRlZCkgeworCQljYXNlIDQ6CQorCQkJc3BlZWRwID0gMHgxMGMxOyAKKwkJCXNwZWVkdCA9IDB4MTBjMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CQorCQkJc3BlZWRwID0gMHgxMEMzOyAKKwkJCXNwZWVkdCA9IDB4MTBDMzsKKwkJCWJyZWFrOworCQljYXNlIDI6CQorCQkJc3BlZWRwID0gMHgxMTA0OyAKKwkJCXNwZWVkdCA9IDB4MTI4MTsKKwkJCWJyZWFrOworCQljYXNlIDE6CQkKKwkJCXNwZWVkcCA9IDB4MjI4MzsgCisJCQlzcGVlZHQgPSAweDEyODE7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OgorCQkJc3BlZWRwID0gMHgzMjhBOyAKKwkJCXNwZWVkdCA9IDB4MzI4QTsKKwkJCWJyZWFrOworCX0KKwlpZiAoaHdpZi0+bW1pbykKKwl7CisJCWh3aWYtPk9VVFcoc3BlZWR0LCBhZGRyKTsKKwkJaHdpZi0+T1VUVyhzcGVlZHAsIHRmYWRkcik7CisJCS8qIE5vdyBzZXQgdXAgSU9SRFkgKi8KKwkJaWYobW9kZV93YW50ZWQgPT0gMyB8fCBtb2RlX3dhbnRlZCA9PSA0KQorCQkJaHdpZi0+T1VUVyhod2lmLT5JTlcodGZhZGRyLTIpfDB4MjAwLCB0ZmFkZHItMik7CisJCWVsc2UKKwkJCWh3aWYtPk9VVFcoaHdpZi0+SU5XKHRmYWRkci0yKSZ+MHgyMDAsIHRmYWRkci0yKTsKKwl9CisJZWxzZQorCXsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3aWYtPnBjaV9kZXYsIGFkZHIsIHNwZWVkcCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCB0ZmFkZHIsIHNwZWVkdCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGh3aWYtPnBjaV9kZXYsIHRmYWRkci0yLCAmc3BlZWRwKTsKKwkJc3BlZWRwICY9IH4weDIwMDsKKwkJLyogU2V0IElPUkRZIGZvciBtb2RlIDMgb3IgNCAqLworCQlpZihtb2RlX3dhbnRlZCA9PSAzIHx8IG1vZGVfd2FudGVkID09IDQpCisJCQlzcGVlZHAgfD0gMHgyMDA7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCB0ZmFkZHItMiwgc3BlZWRwKTsKKwl9Cit9CisKKy8qKgorICoJY29uZmlnX3NpaW1hZ2VfY2hpcHNldF9mb3JfcGlvCS0Jc2V0IGRyaXZlIHRpbWluZ3MKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoJQHNwZWVkIHdlIHdhbnQKKyAqCisgKglDb21wdXRlIHRoZSBiZXN0IHBpbyBtb2RlIHdlIGNhbiBmb3IgYSBnaXZlbiBkZXZpY2UuIEFsc28gaG9ub3VyCisgKgl0aGUgdGltaW5ncyBmb3IgdGhlIGRyaXZlciB3aGVuIGRlYWxpbmcgd2l0aCBtaXhlZCBkZXZpY2VzLiBTb21lCisgKglvZiB0aGlzIGlzIHVnbHkgYnV0IGl0cyBhbGwgd3JhcHBlZCB1cCBoZXJlCisgKgorICoJVGhlIFNJNjgwIGNhbiBhbHNvIGRvIFZETUEgLSB3ZSBuZWVkIHRvIHN0YXJ0IHVzaW5nIHRoYXQKKyAqCisgKglGSVhNRTogd2UgdXNlIHRoZSBCSU9TIGNoYW5uZWwgdGltaW5ncyB0byBhdm9pZCBkcml2aW5nIHRoZSB0YXNrCisgKglmaWxlcyB0b28gZmFzdCBhdCB0aGUgZGlzay4gV2UgbmVlZCB0byBjb21wdXRlIHRoZSBtYXN0ZXIvc2xhdmUKKyAqCWRyaXZlIFBJTyBtb2RlIHByb3Blcmx5IHNvIHRoYXQgd2UgY2FuIHVwIHRoZSBzcGVlZCBvbiBhIGhvdHBsdWcKKyAqCXN5c3RlbS4KKyAqLworIAorc3RhdGljIHZvaWQgY29uZmlnX3NpaW1hZ2VfY2hpcHNldF9mb3JfcGlvIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgc2V0X3NwZWVkKQoreworCXU4IGNoYW5uZWxfdGltaW5ncwk9IHNpaW1hZ2VfdGFza2ZpbGVfdGltaW5nKEhXSUYoZHJpdmUpKTsKKwl1OCBzcGVlZCA9IDAsIHNldF9waW8JPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIDQsIDUsIE5VTEwpOworCisJLyogV0FSTklORyBQSU8gdGltaW5nIG1lc3MgaXMgZ29pbmcgdG8gaGFwcGVuIGIvdyBkZXZpY2VzLCBhcmdoICovCisJaWYgKChjaGFubmVsX3RpbWluZ3MgIT0gc2V0X3BpbykgJiYgKHNldF9waW8gPiBjaGFubmVsX3RpbWluZ3MpKQorCQlzZXRfcGlvID0gY2hhbm5lbF90aW1pbmdzOworCisJc2lpbWFnZV90dW5lcHJvYyhkcml2ZSwgc2V0X3Bpbyk7CisJc3BlZWQgPSBYRkVSX1BJT18wICsgc2V0X3BpbzsKKwlpZiAoc2V0X3NwZWVkKQorCQkodm9pZCkgaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfY2hpcHNldF9mb3JfcGlvIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgc2V0X3NwZWVkKQoreworCWNvbmZpZ19zaWltYWdlX2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgc2V0X3NwZWVkKTsKK30KKworLyoqCisgKglzaWltYWdlX3R1bmVfY2hpcHNldAktCXNldCBjb250cm9sbGVyIHRpbWluZ3MKKyAqCUBkcml2ZTogRHJpdmUgdG8gc2V0IHVwCisgKglAeGZlcnNwZWVkOiBzcGVlZCB3ZSB3YW50IHRvIGFjaGlldmUKKyAqCisgKglUdW5lIHRoZSBTSUkgY2hpcHNldCBmb3IgdGhlIGRlc2lyZWQgbW9kZS4gSWYgd2UgY2FuJ3QgYWNoaWV2ZQorICoJdGhlIGRlc2lyZWQgbW9kZSB0aGVuIHR1bmUgZm9yIGEgbG93ZXIgb25lLCBidXQgdWx0aW1hdGVseQorICoJbWFrZSB0aGUgdGhpbmcgd29yay4KKyAqLworIAorc3RhdGljIGludCBzaWltYWdlX3R1bmVfY2hpcHNldCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIHhmZXJzcGVlZCkKK3sKKwl1OCB1bHRyYTZbXQkJPSB7IDB4MEYsIDB4MEIsIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDEgfTsKKwl1OCB1bHRyYTVbXQkJPSB7IDB4MEMsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDIsIDB4MDEgfTsKKwl1MTYgZG1hW10JCT0geyAweDIyMDgsIDB4MTBDMiwgMHgxMEMxIH07CisKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJdTE2IHVsdHJhID0gMCwgbXVsdGkJPSAwOworCXU4IG1vZGUgPSAwLCB1bml0CT0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJdTggc3BlZWQJCT0gaWRlX3JhdGVfZmlsdGVyKHNpaW1hZ2VfcmF0ZW1hc2soZHJpdmUpLCB4ZmVyc3BlZWQpOworCXVuc2lnbmVkIGxvbmcgYmFzZQk9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKKwl1OCBzY3NjID0gMCwgYWRkcl9tYXNrCT0gKChod2lmLT5jaGFubmVsKSA/CisJCQkJICAgICgoaHdpZi0+bW1pbykgPyAweEY0IDogMHg4NCkgOgorCQkJCSAgICAoKGh3aWYtPm1taW8pID8gMHhCNCA6IDB4ODApKTsKKwkJCQkgICAgCisJdW5zaWduZWQgbG9uZyBtYQk9IHNpaW1hZ2Vfc2VsZGV2KGRyaXZlLCAweDA4KTsKKwl1bnNpZ25lZCBsb25nIHVhCT0gc2lpbWFnZV9zZWxkZXYoZHJpdmUsIDB4MEMpOworCisJaWYgKGh3aWYtPm1taW8pIHsKKwkJc2NzYyA9IGh3aWYtPklOQihiYXNlICsgMHg0QSk7CisJCW1vZGUgPSBod2lmLT5JTkIoYmFzZSArIGFkZHJfbWFzayk7CisJCW11bHRpID0gaHdpZi0+SU5XKG1hKTsKKwkJdWx0cmEgPSBod2lmLT5JTlcodWEpOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4OEEsICZzY3NjKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgYWRkcl9tYXNrLCAmbW9kZSk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGh3aWYtPnBjaV9kZXYsIG1hLCAmbXVsdGkpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCB1YSwgJnVsdHJhKTsKKwl9CisKKwltb2RlICY9IH4oKHVuaXQpID8gMHgzMCA6IDB4MDMpOworCXVsdHJhICY9IH4weDNGOworCXNjc2MgPSAoKHNjc2MgJiAweDMwKSA9PSAweDAwKSA/IDAgOiAxOworCisJc2NzYyA9IGlzX3NhdGEoaHdpZikgPyAxIDogc2NzYzsKKworCXN3aXRjaChzcGVlZCkgeworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzE6CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJCXNpaW1hZ2VfdHVuZXByb2MoZHJpdmUsIChzcGVlZCAtIFhGRVJfUElPXzApKTsKKwkJCW1vZGUgfD0gKCh1bml0KSA/IDB4MTAgOiAweDAxKTsKKwkJCWJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzI6CisJCWNhc2UgWEZFUl9NV19ETUFfMToKKwkJY2FzZSBYRkVSX01XX0RNQV8wOgorCQkJbXVsdGkgPSBkbWFbc3BlZWQgLSBYRkVSX01XX0RNQV8wXTsKKwkJCW1vZGUgfD0gKCh1bml0KSA/IDB4MjAgOiAweDAyKTsKKwkJCWNvbmZpZ19zaWltYWdlX2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX1VETUFfNjoKKwkJY2FzZSBYRkVSX1VETUFfNToKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMjoKKwkJY2FzZSBYRkVSX1VETUFfMToKKwkJY2FzZSBYRkVSX1VETUFfMDoKKwkJCW11bHRpID0gZG1hWzJdOworCQkJdWx0cmEgfD0gKChzY3NjKSA/ICh1bHRyYTZbc3BlZWQgLSBYRkVSX1VETUFfMF0pIDoKKwkJCQkJICAgKHVsdHJhNVtzcGVlZCAtIFhGRVJfVURNQV8wXSkpOworCQkJbW9kZSB8PSAoKHVuaXQpID8gMHgzMCA6IDB4MDMpOworCQkJY29uZmlnX3NpaW1hZ2VfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKGh3aWYtPm1taW8pIHsKKwkJaHdpZi0+T1VUQihtb2RlLCBiYXNlICsgYWRkcl9tYXNrKTsKKwkJaHdpZi0+T1VUVyhtdWx0aSwgbWEpOworCQlod2lmLT5PVVRXKHVsdHJhLCB1YSk7CisJfSBlbHNlIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIGFkZHJfbWFzaywgbW9kZSk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCBtYSwgbXVsdGkpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaHdpZi0+cGNpX2RldiwgdWEsIHVsdHJhKTsKKwl9CisJcmV0dXJuIChpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCkpOworfQorCisvKioKKyAqCWNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEJLQljb25maWd1cmUgZm9yIERNQQorICoJQGRyaXZlOiBkcml2ZSB0byBjb25maWd1cmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIElERSBsYXllciB3aGVuIGl0IHdhbnRzIHRoZSB0aW1pbmdzIHNldCB1cC4KKyAqCUZvciB0aGUgQ01ENjgwIHdlIGFsc28gbmVlZCB0byBzZXQgdXAgdGhlIFBJTyB0aW1pbmdzIGFuZAorICoJZW5hYmxlIERNQS4KKyAqLworIAorc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQJPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBzaWltYWdlX3JhdGVtYXNrKGRyaXZlKSk7CisKKwljb25maWdfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCAhc3BlZWQpOworCisJaWYgKCFzcGVlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWRlX3NldF94ZmVyX3JhdGUoZHJpdmUsIHNwZWVkKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRyaXZlLT5pbml0X3NwZWVkKQorCQlkcml2ZS0+aW5pdF9zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworLyoqCisgKglzaWltYWdlX2NvbmZpZ3VyZV9kcml2ZV9mb3JfZG1hCS0Jc2V0IHVwIGZvciBETUEgdHJhbnNmZXJzCisgKglAZHJpdmU6IGRyaXZlIHdlIGFyZSBnb2luZyB0byBzZXQgdXAKKyAqCisgKglTZXQgdXAgdGhlIGRyaXZlIGZvciBETUEsIHR1bmUgdGhlIGNvbnRyb2xsZXIgYW5kIGRyaXZlIGFzIAorICoJcmVxdWlyZWQuIElmIHRoZSBkcml2ZSBpc24ndCBzdWl0YWJsZSBmb3IgRE1BIG9yIHdlIGhpdAorICoJb3RoZXIgcHJvYmxlbXMgdGhlbiB3ZSB3aWxsIGRyb3AgZG93biB0byBQSU8gYW5kIHNldCB1cAorICoJUElPIGFwcHJvcHJpYXRlbHkKKyAqLworIAorc3RhdGljIGludCBzaWltYWdlX2NvbmZpZ19kcml2ZV9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBoZF9kcml2ZWlkICppZAk9IGRyaXZlLT5pZDsKKworCWlmICgoaWQtPmNhcGFiaWxpdHkgJiAxKSAhPSAwICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJY29uZmlnX2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgMSk7CisJCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKKwl9CisJLyogSU9SRFkgbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAwOworfQorCisvKiByZXR1cm5zIDEgaWYgZG1hIGlycSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IHNpaW1hZ2VfaW9faWRlX2RtYV90ZXN0X2lycSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCBkbWFfYWx0c3RhdAkJPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDEpOworCisJLyogcmV0dXJuIDEgaWYgSU5UUiBhc3NlcnRlZCAqLworCWlmICgoaHdpZi0+SU5CKGh3aWYtPmRtYV9zdGF0dXMpICYgNCkgPT0gNCkKKwkJcmV0dXJuIDE7CisKKwkvKiByZXR1cm4gMSBpZiBEZXZpY2UgSU5UUiBhc3NlcnRlZCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIGFkZHIsICZkbWFfYWx0c3RhdCk7CisJaWYgKGRtYV9hbHRzdGF0ICYgOCkKKwkJcmV0dXJuIDA7CS8vcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvKioKKyAqCXNpaW1hZ2VfbW1pb19pZGVfZG1hX2NvdW50CS0JRE1BIGJ5dGVzIGRvbmUKKyAqCUBkcml2ZQorICoKKyAqCUlmIHdlIGFyZSBkb2luZyBWRE1BIHRoZSBDTUQ2ODAgcmVxdWlyZXMgYSBsaXR0bGUgYml0CisgKglvZiBtb3JlIGNhcmVmdWwgaGFuZGxpbmcgYW5kIHdlIGhhdmUgdG8gcmVhZCB0aGUgY291bnRzCisgKglvZmYgb3Vyc2VsdmVzLiBGb3Igbm9uIFZETUEgbGlmZSBpcyBub3JtYWwuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2lpbWFnZV9tbWlvX2lkZV9kbWFfY291bnQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKyNpZmRlZiBTSUlNQUdFX1ZJUlRVQUxfRE1BUElPCisJc3RydWN0IHJlcXVlc3QgKnJxCT0gSFdHUk9VUChkcml2ZSktPnJxOworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1MzIgY291bnQJCT0gKHJxLT5ucl9zZWN0b3JzICogU0VDVE9SX1NJWkUpOworCXUzMiByY291bnQJCT0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIJPSBzaWltYWdlX3NlbHJlZyhod2lmLCAweDFDKTsKKworCWh3aWYtPk9VVEwoY291bnQsIGFkZHIpOworCXJjb3VudCA9IGh3aWYtPklOTChhZGRyKTsKKworCXByaW50aygiXG4lczogY291bnQgPSAlZCwgcmNvdW50ID0gJWQsIG5yX3NlY3RvcnMgPSAlbHVcbiIsCisJCWRyaXZlLT5uYW1lLCBjb3VudCwgcmNvdW50LCBycS0+bnJfc2VjdG9ycyk7CisKKyNlbmRpZiAvKiBTSUlNQUdFX1ZJUlRVQUxfRE1BUElPICovCisJcmV0dXJuIF9faWRlX2RtYV9jb3VudChkcml2ZSk7Cit9CisjZW5kaWYKKworLyoqCisgKglzaWltYWdlX21taW9faWRlX2RtYV90ZXN0X2lycQktCWNoZWNrIHdlIGNhdXNlZCBhbiBJUlEKKyAqCUBkcml2ZTogZHJpdmUgd2UgYXJlIHRlc3RpbmcKKyAqCisgKglDaGVjayBpZiB3ZSBjYXVzZWQgYW4gSURFIERNQSBpbnRlcnJ1cHQuIFdlIG1heSBhbHNvIGhhdmUgY2F1c2VkCisgKglTQVRBIHN0YXR1cyBpbnRlcnJ1cHRzLCBpZiBzbyB3ZSBjbGVhbiB0aGVtIHVwIGFuZCBjb250aW51ZS4KKyAqLworIAorc3RhdGljIGludCBzaWltYWdlX21taW9faWRlX2RtYV90ZXN0X2lycSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1bnNpZ25lZCBsb25nIGJhc2UJPSAodW5zaWduZWQgbG9uZylod2lmLT5od2lmX2RhdGE7CisJdW5zaWduZWQgbG9uZyBhZGRyCT0gc2lpbWFnZV9zZWxyZWcoaHdpZiwgMHgxKTsKKworCWlmIChTQVRBX0VSUk9SX1JFRykgeworCQl1MzIgZXh0X3N0YXQgPSBod2lmLT5JTkwoYmFzZSArIDB4MTApOworCQl1OCB3YXRjaGRvZyA9IDA7CisJCWlmIChleHRfc3RhdCAmICgoaHdpZi0+Y2hhbm5lbCkgPyAweDQwIDogMHgxMCkpIHsKKwkJCXUzMiBzYXRhX2Vycm9yID0gaHdpZi0+SU5MKFNBVEFfRVJST1JfUkVHKTsKKwkJCWh3aWYtPk9VVEwoc2F0YV9lcnJvciwgU0FUQV9FUlJPUl9SRUcpOworCQkJd2F0Y2hkb2cgPSAoc2F0YV9lcnJvciAmIDB4MDA2ODAwMDApID8gMSA6IDA7CisjaWYgMQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNhdGFfZXJyb3IgPSAweCUwOHgsICIKKwkJCQkid2F0Y2hkb2cgPSAlZCwgJXNcbiIsCisJCQkJZHJpdmUtPm5hbWUsIHNhdGFfZXJyb3IsIHdhdGNoZG9nLAorCQkJCV9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKworCQl9IGVsc2UgeworCQkJd2F0Y2hkb2cgPSAoZXh0X3N0YXQgJiAweDgwMDApID8gMSA6IDA7CisJCX0KKwkJZXh0X3N0YXQgPj49IDE2OworCisJCWlmICghKGV4dF9zdGF0ICYgMHgwNDA0KSAmJiAhd2F0Y2hkb2cpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCisJaWYgKChod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cykgJiAweDA0KSA9PSAweDA0KQorCQlyZXR1cm4gMTsKKworCS8qIHJldHVybiAxIGlmIERldmljZSBJTlRSIGFzc2VydGVkICovCisJaWYgKChod2lmLT5JTkIoYWRkcikgJiA4KSA9PSA4KQorCQlyZXR1cm4gMDsJLy9yZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpaW1hZ2VfYnVzcHJvYwkJLQlidXMgaXNvbGF0aW9uIGlvY3RsCisgKglAZHJpdmU6IGRyaXZlIHRvIGlzb2xhdGUvcmVzdG9yZQorICoJQHN0YXRlOiBidXMgc3RhdGUgdG8gc2V0CisgKgorICoJVXNlZCBieSB0aGUgU0lJMzExMiB0byBoYW5kbGUgYnVzIGlzb2xhdGlvbi4gQXMgdGhpcyBpcyBhIAorICoJU0FUQSBjb250cm9sbGVyIHRoZSB3b3JrIHJlcXVpcmVkIGlzIHF1aXRlIGxpbWl0ZWQsIHdlIAorICoJanVzdCBoYXZlIHRvIGNsZWFuIHVwIHRoZSBzdGF0aXN0aWNzCisgKi8KKyAKK3N0YXRpYyBpbnQgc2lpbWFnZV9idXNwcm9jIChpZGVfZHJpdmVfdCAqIGRyaXZlLCBpbnQgc3RhdGUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXUzMiBzdGF0X2NvbmZpZwkJPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDApOworCisJaWYgKGh3aWYtPm1taW8pIHsKKwkJc3RhdF9jb25maWcgPSBod2lmLT5JTkwoYWRkcik7CisJfSBlbHNlCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCBhZGRyLCAmc3RhdF9jb25maWcpOworCisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEJVU1NUQVRFX09OOgorCQkJaHdpZi0+ZHJpdmVzWzBdLmZhaWx1cmVzID0gMDsKKwkJCWh3aWYtPmRyaXZlc1sxXS5mYWlsdXJlcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBCVVNTVEFURV9PRkY6CisJCQlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMF0ubWF4X2ZhaWx1cmVzICsgMTsKKwkJCWh3aWYtPmRyaXZlc1sxXS5mYWlsdXJlcyA9IGh3aWYtPmRyaXZlc1sxXS5tYXhfZmFpbHVyZXMgKyAxOworCQkJYnJlYWs7CisJCWNhc2UgQlVTU1RBVEVfVFJJU1RBVEU6CisJCQlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMF0ubWF4X2ZhaWx1cmVzICsgMTsKKwkJCWh3aWYtPmRyaXZlc1sxXS5mYWlsdXJlcyA9IGh3aWYtPmRyaXZlc1sxXS5tYXhfZmFpbHVyZXMgKyAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaHdpZi0+YnVzX3N0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lpbWFnZV9yZXNldF9wb2xsCS0Jd2FpdCBmb3Igc2F0YSByZXNldAorICoJQGRyaXZlOiBkcml2ZSB3ZSBhcmUgcmVzZXR0aW5nCisgKgorICoJUG9sbCB0aGUgU0FUQSBwaHkgYW5kIHNlZSB3aGV0aGVyIGl0IGhhcyBjb21lIGJhY2sgZnJvbSB0aGUgZGVhZAorICoJeWV0LgorICovCisgCitzdGF0aWMgaW50IHNpaW1hZ2VfcmVzZXRfcG9sbCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlmIChTQVRBX1NUQVRVU19SRUcpIHsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCisJCWlmICgoaHdpZi0+SU5MKFNBVEFfU1RBVFVTX1JFRykgJiAweDAzKSAhPSAweDAzKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXQgcGh5IGRlYWQsIHN0YXR1cz0weCUwOHhcbiIsCisJCQkJaHdpZi0+bmFtZSwgaHdpZi0+SU5MKFNBVEFfU1RBVFVTX1JFRykpOworCQkJSFdHUk9VUChkcml2ZSktPnBvbGxpbmcgPSAwOworCQkJcmV0dXJuIGlkZV9zdGFydGVkOworCQl9CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKglzaWltYWdlX3ByZV9yZXNldAktCXJlc2V0IGhvb2sKKyAqCUBkcml2ZTogSURFIGRldmljZSBiZWluZyByZXNldAorICoKKyAqCUZvciB0aGUgU0FUQSBkZXZpY2VzIHdlIG5lZWQgdG8gaGFuZGxlIHJlY2FsaWJyYXRpb24vZ2VvbWV0cnkKKyAqCWRpZmZlcmVudGx5CisgKi8KKyAKK3N0YXRpYyB2b2lkIHNpaW1hZ2VfcHJlX3Jlc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJcmV0dXJuOworCisJaWYgKGlzX3NhdGEoSFdJRihkcml2ZSkpKQorCXsKKwkJZHJpdmUtPnNwZWNpYWwuYi5zZXRfZ2VvbWV0cnkgPSAwOworCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlID0gMDsKKwl9Cit9CisKKy8qKgorICoJc2lpbWFnZV9yZXNldAktCXJlc2V0IGEgZGV2aWNlIG9uIGFuIHNpaW1hZ2UgY29udHJvbGxlcgorICoJQGRyaXZlOiBkcml2ZSB0byByZXNldAorICoKKyAqCVBlcmZvcm0gYSBjb250cm9sbGVyIGxldmVsIHJlc2V0IGZvIHRoZSBkZXZpY2UuIEZvcgorICoJU0FUQSB3ZSBtdXN0IGFsc28gY2hlY2sgdGhlIFBIWS4KKyAqLworIAorc3RhdGljIHZvaWQgc2lpbWFnZV9yZXNldCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwl1OCByZXNldAkJPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDApOworCisJaWYgKGh3aWYtPm1taW8pIHsKKwkJcmVzZXQgPSBod2lmLT5JTkIoYWRkcik7CisJCWh3aWYtPk9VVEIoKHJlc2V0fDB4MDMpLCBhZGRyKTsKKwkJLyogRklYTUU6cG9zdGluZyAqLworCQl1ZGVsYXkoMjUpOworCQlod2lmLT5PVVRCKHJlc2V0LCBhZGRyKTsKKwkJKHZvaWQpIGh3aWYtPklOQihhZGRyKTsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCBhZGRyLCAmcmVzZXQpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgYWRkciwgcmVzZXR8MHgwMyk7CisJCXVkZWxheSgyNSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCBhZGRyLCByZXNldCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIGFkZHIsICZyZXNldCk7CisJfQorCisJaWYgKFNBVEFfU1RBVFVTX1JFRykgeworCQl1MzIgc2F0YV9zdGF0ID0gaHdpZi0+SU5MKFNBVEFfU1RBVFVTX1JFRyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXNldCBwaHksIHN0YXR1cz0weCUwOHgsICVzXG4iLAorCQkJaHdpZi0+bmFtZSwgc2F0YV9zdGF0LCBfX0ZVTkNUSU9OX18pOworCQlpZiAoIShzYXRhX3N0YXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXQgcGh5IGRlYWQsIHN0YXR1cz0weCUwOHhcbiIsCisJCQkJaHdpZi0+bmFtZSwgc2F0YV9zdGF0KTsKKwkJCWRyaXZlLT5mYWlsdXJlcysrOworCQl9CisJfQorCit9CisKKy8qKgorICoJcHJvY19yZXBvcnRzX3NpaW1hZ2UJCS0JYWRkIHNpaW1hZ2UgY29udHJvbGxlciB0byBwcm9jCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAY2xvY2tpbmc6IFNDU0MgdmFsdWUKKyAqCUBuYW1lOiBjb250cm9sbGVyIG5hbWUKKyAqCisgKglSZXBvcnQgdGhlIGNsb2NraW5nIG1vZGUgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGFkZCBpdCB0bworICoJdGhlIC9wcm9jIGludGVyZmFjZSBsYXllcgorICovCisgCitzdGF0aWMgdm9pZCBwcm9jX3JlcG9ydHNfc2lpbWFnZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggY2xvY2tpbmcsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFwZGV2X2lzX3NhdGEoZGV2KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQkFTRSBDTE9DSyAiLCBuYW1lKTsKKwkJY2xvY2tpbmcgJj0gMHgwMzsKKwkJc3dpdGNoIChjbG9ja2luZykgeworCQkJY2FzZSAweDAzOiBwcmludGsoIkRJU0FCTEVEIVxuIik7IGJyZWFrOworCQkJY2FzZSAweDAyOiBwcmludGsoIj09IDJYIFBDSVxuIik7IGJyZWFrOworCQkJY2FzZSAweDAxOiBwcmludGsoIj09IDEzM1xuIik7IGJyZWFrOworCQkJY2FzZSAweDAwOiBwcmludGsoIj09IDEwMFxuIik7IGJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqCXNldHVwX21taW9fc2lpbWFnZQktCXN3aXRjaCBhbiBTSSBjb250cm9sbGVyIGludG8gTU1JTworICoJQGRldjogUENJIGRldmljZSB3ZSBhcmUgY29uZmlndXJpbmcKKyAqCUBuYW1lOiBkZXZpY2UgbmFtZQorICoKKyAqCUF0dGVtcHQgdG8gcHV0IHRoZSBkZXZpY2UgaW50byBtbWlvIG1vZGUuIFRoZXJlIGFyZSBzb21lIHNsaWdodAorICoJY29tcGxpY2F0aW9ucyBoZXJlIHdpdGggY2VydGFpbiBzeXN0ZW1zIHdoZXJlIHRoZSBtbWlvIGJhciBpc250CisgKgltYXBwZWQgc28gd2UgaGF2ZSB0byBiZSBzdXJlIHdlIGNhbiBmYWxsIGJhY2sgdG8gSS9PLgorICovCisgCitzdGF0aWMgdW5zaWduZWQgaW50IHNldHVwX21taW9fc2lpbWFnZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJhcjUJPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA1KTsKKwl1bnNpZ25lZCBsb25nIGJhcnNpemUJPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgNSk7CisJdTggdG1wYnl0ZQk9IDA7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisKKwkvKgorCSAqCURyb3AgYmFjayB0byBQSU8gaWYgd2UgY2FuJ3QgbWFwIHRoZSBtbWlvLiBTb21lCisJICoJc3lzdGVtcyBzZWVtIHRvIGdldCB0ZXJtaW5hbGx5IGNvbmZ1c2VkIGluIHRoZSBQQ0kKKwkgKglzcGFjZXMuCisJICovCisJIAorCWlmKCFyZXF1ZXN0X21lbV9yZWdpb24oYmFyNSwgYmFyc2l6ZSwgbmFtZSkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaWltYWdlOiBJREUgY29udHJvbGxlciBNTUlPIHBvcnRzIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCQkKKwlpb2FkZHIgPSBpb3JlbWFwKGJhcjUsIGJhcnNpemUpOworCisJaWYgKGlvYWRkciA9PSBOVUxMKQorCXsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJhcjUsIGJhcnNpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGlvYWRkcik7CisKKwlpZiAocGRldl9pc19zYXRhKGRldikpIHsKKwkJd3JpdGVsKDAsIGlvYWRkciArIDB4MTQ4KTsKKwkJd3JpdGVsKDAsIGlvYWRkciArIDB4MUM4KTsKKwl9CisKKwl3cml0ZWIoMCwgaW9hZGRyICsgMHhCNCk7CisJd3JpdGViKDAsIGlvYWRkciArIDB4RjQpOworCXRtcGJ5dGUgPSByZWFkYihpb2FkZHIgKyAweDRBKTsKKworCXN3aXRjaCh0bXBieXRlICYgMHgzMCkgeworCQljYXNlIDB4MDA6CisJCQkvKiBJbiAxMDAgTUh6IGNsb2NraW5nLCB0cnkgYW5kIHN3aXRjaCB0byAxMzMgKi8KKwkJCXdyaXRlYih0bXBieXRlfDB4MTAsIGlvYWRkciArIDB4NEEpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMDoKKwkJCS8qIE9uIDEzM01oeiBjbG9ja2luZyAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDoKKwkJCS8qIE9uIFBDSXgyIGNsb2NraW5nICovCisJCQlicmVhazsKKwkJY2FzZSAweDMwOgorCQkJLyogQ2xvY2tpbmcgaXMgZGlzYWJsZWQgKi8KKwkJCS8qIDEzMyBjbG9jayBhdHRlbXB0IHRvIGZvcmNlIGl0IG9uICovCisJCQl3cml0ZWIodG1wYnl0ZSAmIH4weDIwLCBpb2FkZHIgKyAweDRBKTsKKwkJCWJyZWFrOworCX0KKwkKKwl3cml0ZWIoICAgICAgMHg3MiwgaW9hZGRyICsgMHhBMSk7CisJd3JpdGV3KCAgICAweDMyOEEsIGlvYWRkciArIDB4QTIpOworCXdyaXRlbCgweDYyREQ2MkRELCBpb2FkZHIgKyAweEE0KTsKKwl3cml0ZWwoMHg0MzkyNDM5MiwgaW9hZGRyICsgMHhBOCk7CisJd3JpdGVsKDB4NDAwOTQwMDksIGlvYWRkciArIDB4QUMpOworCXdyaXRlYiggICAgICAweDcyLCBpb2FkZHIgKyAweEUxKTsKKwl3cml0ZXcoICAgIDB4MzI4QSwgaW9hZGRyICsgMHhFMik7CisJd3JpdGVsKDB4NjJERDYyREQsIGlvYWRkciArIDB4RTQpOworCXdyaXRlbCgweDQzOTI0MzkyLCBpb2FkZHIgKyAweEU4KTsKKwl3cml0ZWwoMHg0MDA5NDAwOSwgaW9hZGRyICsgMHhFQyk7CisKKwlpZiAocGRldl9pc19zYXRhKGRldikpIHsKKwkJd3JpdGVsKDB4RkZGRjAwMDAsIGlvYWRkciArIDB4MTA4KTsKKwkJd3JpdGVsKDB4RkZGRjAwMDAsIGlvYWRkciArIDB4MTg4KTsKKwkJd3JpdGVsKDB4MDA2ODAwMDAsIGlvYWRkciArIDB4MTQ4KTsKKwkJd3JpdGVsKDB4MDA2ODAwMDAsIGlvYWRkciArIDB4MUM4KTsKKwl9CisKKwl0bXBieXRlID0gcmVhZGIoaW9hZGRyICsgMHg0QSk7CisKKwlwcm9jX3JlcG9ydHNfc2lpbWFnZShkZXYsICh0bXBieXRlPj40KSwgbmFtZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJaW5pdF9jaGlwc2V0X3NpaW1hZ2UJLQlzZXQgdXAgYW4gU0kgZGV2aWNlCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAbmFtZTogZGV2aWNlIG5hbWUKKyAqCisgKglQZXJmb3JtIHRoZSBpbml0aWFsIFBDSSBzZXQgdXAgZm9yIHRoaXMgZGV2aWNlLiBBdHRlbXB0IHRvIHN3aXRjaAorICoJdG8gMTMzTUh6IGNsb2NraW5nIGlmIHRoZSBzeXN0ZW0gaXNuJ3QgYWxyZWFkeSBzZXQgdXAgdG8gZG8gaXQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3NpaW1hZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgY2xhc3NfcmV2CT0gMDsKKwl1OCB0bXBieXRlCT0gMDsKKwl1OCBCQTVfRU4JPSAwOworCisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CisgICAgICAgIGNsYXNzX3JldiAmPSAweGZmOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChjbGFzc19yZXYpID8gMSA6IDI1NSk7CQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDhBLCAmQkE1X0VOKTsKKwlpZiAoKEJBNV9FTiAmIDB4MDEpIHx8IChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA1KSkpIHsKKwkJaWYgKHNldHVwX21taW9fc2lpbWFnZShkZXYsIG5hbWUpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODAsIDB4MDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODQsIDB4MDApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg4QSwgJnRtcGJ5dGUpOworCXN3aXRjaCh0bXBieXRlICYgMHgzMCkgeworCQljYXNlIDB4MDA6CisJCQkvKiAxMzMgY2xvY2sgYXR0ZW1wdCB0byBmb3JjZSBpdCBvbiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4QSwgdG1wYnl0ZXwweDEwKTsKKwkJY2FzZSAweDMwOgorCQkJLyogaWYgY2xvY2tpbmcgaXMgZGlzYWJsZWQgKi8KKwkJCS8qIDEzMyBjbG9jayBhdHRlbXB0IHRvIGZvcmNlIGl0IG9uICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDhBLCB0bXBieXRlICYgfjB4MjApOworCQljYXNlIDB4MTA6CisJCQkvKiAxMzMgYWxyZWFkeSAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDoKKwkJCS8qIEJJT1Mgc2V0IFBDSSB4MiBjbG9ja2luZyAqLworCQkJYnJlYWs7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAgIDB4OEEsICZ0bXBieXRlKTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsICAweEExLCAweDcyKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAgMHhBMiwgMHgzMjhBKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHhBNCwgMHg2MkRENjJERCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4QTgsIDB4NDM5MjQzOTIpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweEFDLCAweDQwMDk0MDA5KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAgMHhCMSwgMHg3Mik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgIDB4QjIsIDB4MzI4QSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4QjQsIDB4NjJERDYyREQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweEI4LCAweDQzOTI0MzkyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHhCQywgMHg0MDA5NDAwOSk7CisKKwlwcm9jX3JlcG9ydHNfc2lpbWFnZShkZXYsICh0bXBieXRlPj40KSwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaW5pdF9tbWlvX2lvcHNfc2lpbWFnZQktCXNldCB1cCB0aGUgaW9wcyBmb3IgTU1JTworICoJQGh3aWY6IGludGVyZmFjZSB0byBzZXQgdXAKKyAqCisgKglUaGUgYmFzaWMgc2V0dXAgaGVyZSBpcyBmYWlybHkgc2ltcGxlLCB3ZSBjYW4gdXNlIHN0YW5kYXJkIE1NSU8KKyAqCW9wZXJhdGlvbnMuIEhvd2V2ZXIgd2UgZG8gaGF2ZSB0byBzZXQgdGhlIHRhc2tmaWxlIHJlZ2lzdGVyIG9mZnNldHMKKyAqCWJ5IGhhbmQgYXMgdGhlcmUgaXNudCBhIHN0YW5kYXJkIGRlZmluZWQgbGF5b3V0IGZvciB0aGVtIHRoaXMKKyAqCXRpbWUuCisgKgorICoJVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGJ1ZmZlcmVkIHRhc2tmaWxlcyBhbmQgYWxzbyBzb21lIHJhdGhlciBuaWNlCisgKglleHRlbmRlZCBQUkQgdGFibGVzLiBVbmZvcnR1bmF0ZWx5IHJpZ2h0IG5vdyB3ZSBkb24ndC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9tbWlvX2lvcHNfc2lpbWFnZShpZGVfaHdpZl90ICpod2lmKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXZvaWQgKmFkZHIJCT0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJdTggY2gJCQk9IGh3aWYtPmNoYW5uZWw7CisJaHdfcmVnc190CQlodzsKKwl1bnNpZ25lZCBsb25nCQliYXNlOworCisJLyoKKwkgKglGaWxsIGluIHRoZSBiYXNpYyBIV0lGIGJpdHMKKwkgKi8KKworCWRlZmF1bHRfaHdpZl9tbWlvcHMoaHdpZik7CisJaHdpZi0+aHdpZl9kYXRhCQkJPSBhZGRyOworCisJLyoKKwkgKglOb3cgc2V0IHVwIHRoZSBody4gV2UgaGF2ZSB0byBkbyB0aGlzIG91cnNlbHZlcyBhcworCSAqCXRoZSBNTUlPIGxheW91dCBpc250IHRoZSBzYW1lIGFzIHRoZSB0aGUgc3RhbmRhcmQgcG9ydAorCSAqCWJhc2VkIEkvTworCSAqLworCisJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3X3JlZ3NfdCkpOworCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJaWYgKGNoKQorCQliYXNlICs9IDB4QzA7CisJZWxzZQorCQliYXNlICs9IDB4ODA7CisKKwkvKgorCSAqCVRoZSBidWZmZXJlZCB0YXNrIGZpbGUgZG9lc24ndCBoYXZlIHN0YXR1cy9jb250cm9sCisJICoJc28gd2UgY2FuJ3QgY3VycmVudGx5IHVzZSBpdCBzYW5lbHkgc2luY2Ugd2Ugd2FudCB0bworCSAqCXVzZSBMQkE0OCBtb2RlLgorCSAqLwkKKy8vCWJhc2UgKz0gMHgxMDsKKy8vCWh3aWYtPm5vX2xiYTQ4ID0gMTsKKworCWh3LmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF0JPSBiYXNlOworCWh3LmlvX3BvcnRzW0lERV9FUlJPUl9PRkZTRVRdCT0gYmFzZSArIDE7CisJaHcuaW9fcG9ydHNbSURFX05TRUNUT1JfT0ZGU0VUXQk9IGJhc2UgKyAyOworCWh3LmlvX3BvcnRzW0lERV9TRUNUT1JfT0ZGU0VUXQk9IGJhc2UgKyAzOworCWh3LmlvX3BvcnRzW0lERV9MQ1lMX09GRlNFVF0JPSBiYXNlICsgNDsKKwlody5pb19wb3J0c1tJREVfSENZTF9PRkZTRVRdCT0gYmFzZSArIDU7CisJaHcuaW9fcG9ydHNbSURFX1NFTEVDVF9PRkZTRVRdCT0gYmFzZSArIDY7CisJaHcuaW9fcG9ydHNbSURFX1NUQVRVU19PRkZTRVRdCT0gYmFzZSArIDc7CisJaHcuaW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXQk9IGJhc2UgKyAxMDsKKworCWh3LmlvX3BvcnRzW0lERV9JUlFfT0ZGU0VUXQk9IDA7CisKKwlpZiAocGRldl9pc19zYXRhKGRldikpIHsKKwkJYmFzZSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJCWlmIChjaCkKKwkJCWJhc2UgKz0gMHg4MDsKKwkJaHdpZi0+c2F0YV9zY3JbU0FUQV9TVEFUVVNfT0ZGU0VUXQk9IGJhc2UgKyAweDEwNDsKKwkJaHdpZi0+c2F0YV9zY3JbU0FUQV9FUlJPUl9PRkZTRVRdCT0gYmFzZSArIDB4MTA4OworCQlod2lmLT5zYXRhX3NjcltTQVRBX0NPTlRST0xfT0ZGU0VUXQk9IGJhc2UgKyAweDEwMDsKKwkJaHdpZi0+c2F0YV9taXNjW1NBVEFfTUlTQ19PRkZTRVRdCT0gYmFzZSArIDB4MTQwOworCQlod2lmLT5zYXRhX21pc2NbU0FUQV9QSFlfT0ZGU0VUXQk9IGJhc2UgKyAweDE0NDsKKwkJaHdpZi0+c2F0YV9taXNjW1NBVEFfSUVOX09GRlNFVF0JPSBiYXNlICsgMHgxNDg7CisJfQorCisJaHcuaXJxCQkJCT0gaHdpZi0+cGNpX2Rldi0+aXJxOworCisJbWVtY3B5KCZod2lmLT5odywgJmh3LCBzaXplb2YoaHcpKTsKKwltZW1jcHkoaHdpZi0+aW9fcG9ydHMsIGh3aWYtPmh3LmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aHcuaW9fcG9ydHMpKTsKKworCWh3aWYtPmlycQkJCT0gaHcuaXJxOworCisgICAgICAgCWJhc2UgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKKworI2lmZGVmIFNJSU1BR0VfTEFSR0VfRE1BCisvKiBXYXRjaCB0aGUgYnJhY2tldHMgLSBldmVuIEtlbiBhbmQgRGVubmlzIGdldCBzb21lIGxhbmd1YWdlIGRlc2lnbiB3cm9uZyAqLworCWh3aWYtPmRtYV9iYXNlCQkJPSBiYXNlICsgKGNoID8gMHgxOCA6IDB4MTApOworCWh3aWYtPmRtYV9iYXNlMgkJCT0gYmFzZSArIChjaCA/IDB4MDggOiAweDAwKTsKKwlod2lmLT5kbWFfcHJkdGFibGUJCT0gaHdpZi0+ZG1hX2Jhc2UyICsgNDsKKyNlbHNlIC8qICEgU0lJTUFHRV9MQVJHRV9ETUEgKi8KKwlod2lmLT5kbWFfYmFzZQkJCT0gYmFzZSArIChjaCA/IDB4MDggOiAweDAwKTsKKwlod2lmLT5kbWFfYmFzZTIJCQk9IGJhc2UgKyAoY2ggPyAweDE4IDogMHgxMCk7CisjZW5kaWYgLyogU0lJTUFHRV9MQVJHRV9ETUEgKi8KKwlod2lmLT5tbWlvCQkJPSAyOworfQorCitzdGF0aWMgaW50IGlzX2Rldl9zZWFnYXRlX3NhdGEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWNvbnN0IGNoYXIgKnMgPSAmZHJpdmUtPmlkLT5tb2RlbFswXTsKKwl1bnNpZ25lZCBsZW47CisKKwlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN0cm5sZW4ocywgc2l6ZW9mKGRyaXZlLT5pZC0+bW9kZWwpKTsKKworCWlmICgobGVuID4gNCkgJiYgKCFtZW1jbXAocywgIlNUIiwgMikpKSB7CisJCWlmICgoIW1lbWNtcChzICsgbGVuIC0gMiwgIkFTIiwgMikpIHx8CisJCSAgICAoIW1lbWNtcChzICsgbGVuIC0gMywgIkFTTCIsIDMpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFwcGx5aW5nIHBlc3NpbWlzdGljIFNlYWdhdGUgIgorCQkJCQkgImVycmF0YSBmaXhcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXNpaW1hZ2VfZml4dXAJCS0JcG9zdCBwcm9iZSBmaXh1cHMKKyAqCUBod2lmOiBpbnRlcmZhY2UgdG8gZml4IHVwCisgKgorICoJQ2FsbGVkIGFmdGVyIGRyaXZlIHByb2JlIHdlIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZQorICoJU2VhZ2F0ZSBmaXh1cCBtdXN0IGJlIGFwcGxpZWQuIFRoaXMgdXNlZCB0byBiZSBpbiBpbml0X2lvcHMgYnV0CisgKgl0aGF0IGNhbiBvY2N1ciBiZWZvcmUgd2Uga25vdyB3aGF0IGRyaXZlcyBhcmUgcHJlc2VudC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2lpbWFnZV9maXh1cChpZGVfaHdpZl90ICpod2lmKQoreworCS8qIFRyeSBhbmQgcmFpc2UgdGhlIHJxc2l6ZSAqLworCWlmICghaXNfc2F0YShod2lmKSB8fCAhaXNfZGV2X3NlYWdhdGVfc2F0YSgmaHdpZi0+ZHJpdmVzWzBdKSkKKwkJaHdpZi0+cnFzaXplID0gMTI4OworfQorCisvKioKKyAqCWluaXRfaW9wc19zaWltYWdlCS0Jc2V0IHVwIGlvcHMKKyAqCUBod2lmOiBpbnRlcmZhY2UgdG8gc2V0IHVwCisgKgorICoJRG8gdGhlIGJhc2ljIHNldHVwIGZvciB0aGUgU0lJTUFHRSBoYXJkd2FyZSBpbnRlcmZhY2UKKyAqCWFuZCB0aGVuIGRvIHRoZSBNTUlPIHNldHVwIGlmIHdlIGNhbi4gVGhpcyBpcyB0aGUgZmlyc3QKKyAqCWxvb2sgaW4gd2UgZ2V0IGZvciBzZXR0aW5nIHVwIHRoZSBod2lmIHNvIHRoYXQgd2UKKyAqCWNhbiBnZXQgdGhlIGlvcHMgcmlnaHQgYmVmb3JlIHVzaW5nIHRoZW0uCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaW9wc19zaWltYWdlKGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJdTMyIGNsYXNzX3JldgkJPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKKwljbGFzc19yZXYgJj0gMHhmZjsKKwkKKwlod2lmLT5od2lmX2RhdGEgPSBOVUxMOworCisJLyogUGVzc2ltYWwgdW50aWwgd2UgZmluaXNoIHByb2JpbmcgKi8KKwlod2lmLT5ycXNpemUgPSAxNTsKKworCWlmIChwY2lfZ2V0X2RydmRhdGEoZGV2KSA9PSBOVUxMKQorCQlyZXR1cm47CisJaW5pdF9tbWlvX2lvcHNfc2lpbWFnZShod2lmKTsKK30KKworLyoqCisgKglhdGE2Nl9zaWltYWdlCS0JY2hlY2sgZm9yIDgwIHBpbiBjYWJsZQorICoJQGh3aWY6IGludGVyZmFjZSB0byBjaGVjaworICoKKyAqCUNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW4gQVRBNjYgY2FwYWJsZSBjYWJsZSBvbiB0aGUKKyAqCWludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBhdGE2Nl9zaWltYWdlKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gc2lpbWFnZV9zZWxyZWcoaHdpZiwgMCk7CisJaWYgKHBjaV9nZXRfZHJ2ZGF0YShod2lmLT5wY2lfZGV2KSA9PSBOVUxMKSB7CisJCXU4IGF0YTY2ID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgYWRkciwgJmF0YTY2KTsKKwkJcmV0dXJuIChhdGE2NiAmIDB4MDEpID8gMSA6IDA7CisJfQorCisJcmV0dXJuIChod2lmLT5JTkIoYWRkcikgJiAweDAxKSA/IDEgOiAwOworfQorCisvKioKKyAqCWluaXRfaHdpZl9zaWltYWdlCS0Jc2V0IHVwIGh3aWYgc3RydWN0cworICoJQGh3aWY6IGludGVyZmFjZSB0byBzZXQgdXAKKyAqCisgKglXZSBkbyB0aGUgYmFzaWMgc2V0IHVwIG9mIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlLiBUaGUgU0lJTUFHRQorICoJcmVxdWlyZXMgc2V2ZXJhbCBjdXN0b20gaGFuZGxlcnMgc28gd2Ugb3ZlcnJpZGUgdGhlIGRlZmF1bHQKKyAqCWlkZSBETUEgaGFuZGxlcnMgYXBwcm9wcmlhdGVseQorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfc2lpbWFnZShpZGVfaHdpZl90ICpod2lmKQoreworCWh3aWYtPmF1dG9kbWEgPSAwOworCQorCWh3aWYtPnJlc2V0cHJvYyA9ICZzaWltYWdlX3Jlc2V0OworCWh3aWYtPnNwZWVkcHJvYyA9ICZzaWltYWdlX3R1bmVfY2hpcHNldDsKKwlod2lmLT50dW5lcHJvYwk9ICZzaWltYWdlX3R1bmVwcm9jOworCWh3aWYtPnJlc2V0X3BvbGwgPSAmc2lpbWFnZV9yZXNldF9wb2xsOworCWh3aWYtPnByZV9yZXNldCA9ICZzaWltYWdlX3ByZV9yZXNldDsKKworCWlmKGlzX3NhdGEoaHdpZikpCisJCWh3aWYtPmJ1c3Byb2MgICA9ICZzaWltYWdlX2J1c3Byb2M7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT51bHRyYV9tYXNrID0gMHg3ZjsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworCWlmICghaXNfc2F0YShod2lmKSkKKwkJaHdpZi0+YXRhcGlfZG1hID0gMTsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmc2lpbWFnZV9jb25maWdfZHJpdmVfZm9yX2RtYTsKKwlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9zaWltYWdlKGh3aWYpOworCisJaWYgKGh3aWYtPm1taW8pIHsKKwkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZzaWltYWdlX21taW9faWRlX2RtYV90ZXN0X2lycTsKKwl9IGVsc2UgeworCQlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJiBzaWltYWdlX2lvX2lkZV9kbWFfdGVzdF9pcnE7CisJfQorCQorCS8qCisJICoJVGhlIEJJT1Mgb2Z0ZW4gZG9lc24ndCBzZXQgdXAgRE1BIG9uIHRoaXMgY29udHJvbGxlcgorCSAqCXNvIHdlIGFsd2F5cyBkbyBpdC4KKwkgKi8KKworCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9TSUlfREVWKG5hbWVfc3RyKQkJCVwKKwl7CQkJCQkJXAorCQkubmFtZQkJPSBuYW1lX3N0ciwJCVwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9zaWltYWdlLAlcCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfc2lpbWFnZSwJXAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3NpaW1hZ2UsCVwKKwkJLmZpeHVwCQk9IHNpaW1hZ2VfZml4dXAsCVwKKwkJLmNoYW5uZWxzCT0gMiwJCQlcCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwJCVwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCQlcCisJfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCBzaWltYWdlX2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwkvKiAwICovIERFQ0xBUkVfU0lJX0RFVigiU2lJNjgwIiksCisJLyogMSAqLyBERUNMQVJFX1NJSV9ERVYoIlNpSTMxMTIgU2VyaWFsIEFUQSIpLAorCS8qIDIgKi8gREVDTEFSRV9TSUlfREVWKCJBZGFwdGVjIEFBUi0xMjEwU0EiKQorfTsKKworLyoqCisgKglzaWltYWdlX2luaXRfb25lCS0JcGNpIGxheWVyIGRpc2NvdmVyeSBlbnRyeQorICoJQGRldjogUENJIGRldmljZQorICoJQGlkOiBpZGVudCB0YWJsZSBlbnRyeQorICoKKyAqCUNhbGxlZCBieSB0aGUgUENJIGNvZGUgd2hlbiBpdCBmaW5kcyBhbiBTSTY4MCBvciBTSTMxMTIgY29udHJvbGxlci4KKyAqCVdlIHRoZW4gdXNlIHRoZSBJREUgUENJIGdlbmVyaWMgaGVscGVyIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuCisgKi8KKyAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpaW1hZ2VfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZzaWltYWdlX2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV0pOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lpbWFnZV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NNRCwgUENJX0RFVklDRV9JRF9TSUlfNjgwLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1NBVEEKKwl7IFBDSV9WRU5ET1JfSURfQ01ELCBQQ0lfREVWSUNFX0lEX1NJSV8zMTEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKwl7IFBDSV9WRU5ET1JfSURfQ01ELCBQQ0lfREVWSUNFX0lEX1NJSV8xMjEwU0EsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorI2VuZGlmCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaWltYWdlX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJTaUlfSURFIiwKKwkuaWRfdGFibGUJPSBzaWltYWdlX3BjaV90YmwsCisJLnByb2JlCQk9IHNpaW1hZ2VfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHNpaW1hZ2VfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNpaW1hZ2VfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRyZSBIZWRyaWNrLCBBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgU2lJIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NpczU1MTMuYyBiL2RyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MGJhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmMKQEAgLTAsMCArMSw5ODQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvc2lzNTUxMy5jCVZlcnNpb24gMC4xNmFjK3ZwCUp1biAxOCwgMjAwMworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIJCUxpb25lbCBCb3V0b24gPExpb25lbC5Cb3V0b25AaW5ldDYuZnI+LCBNYWludGFpbmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMJCVZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKgorICogVGhhbmtzIDoKKyAqCisgKiBTaVMgVGFpd2FuCQk6IGZvciBkaXJlY3Qgc3VwcG9ydCBhbmQgaGFyZHdhcmUuCisgKiBEYW5pZWxhIEVuZ2VydAk6IGZvciBpbml0aWFsIEFUQTEwMCBhZHZpY2VzIGFuZCBudW1lcm91cyBvdGhlcnMuCisgKiBKb2huIEZyZW1saW4sIE1hbmZyZWQgU3ByYXVsLCBEYXZlIE1vcmdhbiwgUGV0ZXIgS2plbGxlcnN0ZWR0CToKKyAqCQkJICBmb3IgY2hlY2tpbmcgY29kZSBjb3JyZWN0bmVzcywgcHJvdmlkaW5nIHBhdGNoZXMuCisgKgorICoKKyAqIE9yaWdpbmFsIHRlc3RzIGFuZCBkZXNpZ24gb24gdGhlIFNpUzYyMCBjaGlwc2V0LgorICogQVRBMTAwIHRlc3RzIGFuZCBkZXNpZ24gb24gdGhlIFNpUzczNSBjaGlwc2V0LgorICogQVRBMTYvMzMgc3VwcG9ydCBmcm9tIHNwZWNzCisgKiBBVEExMzMgc3VwcG9ydCBmb3IgU2lTOTYxLzk2MiBieSBMLkMuIENoYW5nIDxsY2NoYW5nQHNpcy5jb20udHc+CisgKiBBVEExMzMgOTYxLzk2Mi85NjMgZml4ZXMgYnkgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqCisgKiBEb2N1bWVudGF0aW9uOgorICoJU2lTIGNoaXBzZXQgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgdW5kZXIgTkRBIHRvIGNvbXBhbmllcyBvbmx5CisgKiAgICAgIChub3QgdG8gaW5kaXZpZHVhbHMpLgorICovCisKKy8qCisgKiBUaGUgb3JpZ2luYWwgU2lTNTUxMyBjb21lcyBmcm9tIGEgU2lTNTUxMS81NTExMi81NTEzIGNoaXBzZXQuIFRoZSBvcmlnaW5hbAorICogU2lTNTUxMyB3YXMgYWxzbyB1c2VkIGluIHRoZSBTaVM1NTk2LzU1MTMgY2hpcHNldC4gVGh1cyBpZiB3ZSBzZWUgYSBTaVM1NTExCisgKiBvciBTaVM1NTk2LCB3ZSBjYW4gYXNzdW1lIHdlIHNlZSB0aGUgZmlyc3QgTVdETUEtMTYgY2FwYWJsZSBTaVM1NTEzIGNoaXAuCisgKgorICogTGF0ZXIgU2lTIGNoaXBzZXRzIGludGVncmF0ZWQgdGhlIDU1MTMgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBOb3J0aEJyaWRnZSwKKyAqIHN0YXJ0aW5nIHdpdGggU2lTNTU3MSBhbmQgdXAgdG8gU2lTNzQ1LiBUaGUgUENJIElEIGRpZG4ndCBjaGFuZ2UsIHRob3VnaC4gV2UKKyAqIGNhbiBmaWd1cmUgb3V0IHRoYXQgd2UgaGF2ZSBhIG1vcmUgbW9kZXJuIGFuZCBtb3JlIGNhcGFibGUgNTUxMyBieSBsb29raW5nCisgKiBmb3IgdGhlIHJlc3BlY3RpdmUgTm9ydGhCcmlkZ2UgSURzLgorICoKKyAqIEV2ZW4gbGF0ZXIgKDk2eCBmYW1pbHkpIFNpUyBjaGlwc2V0cyB1c2UgdGhlIE11VElPTCBsaW5rIGFuZCBwbGFjZSB0aGUgNTUxMworICogaW50byB0aGUgU291dGhCcmlnZS4gSGVyZSB3ZSBjYW5ub3QgcmVseSBvbiBsb29raW5nIHVwIHRoZSBOb3J0aEJyaWRnZSBQQ0kKKyAqIElELCB3aGlsZSB0aGUgbm93IEFUQS0xMzMgY2FwYWJsZSA1NTEzIHN0aWxsIGhhcyB0aGUgc2FtZSBQQ0kgSUQuCisgKiBGb3J0dW5hdGVseSB0aGUgNTUxMyBjYW4gYmUgJ3VubWFza2VkJyBieSBmaWRkbGluZyB3aXRoIHNvbWUgY29uZmlnIHNwYWNlCisgKiBiaXRzLCBjaGFuZ2luZyBpdHMgZGV2aWNlIGlkIHRvIHRoZSB0cnVlIG9uZSAtIDU1MTcgZm9yIDk2MSBhbmQgNTUxOCBmb3IKKyAqIDk2Mi85NjMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImlkZS10aW1pbmcuaCIKKworI2RlZmluZSBESVNQTEFZX1NJU19USU1JTkdTCisKKy8qIHJlZ2lzdGVycyBsYXlvdXQgYW5kIGluaXQgdmFsdWVzIGFyZSBjaGlwc2V0IGZhbWlseSBkZXBlbmRhbnQgKi8KKworI2RlZmluZSBBVEFfMTYJCTB4MDEKKyNkZWZpbmUgQVRBXzMzCQkweDAyCisjZGVmaW5lIEFUQV82NgkJMHgwMworI2RlZmluZSBBVEFfMTAwYQkweDA0IC8vIFNpUzczMC9TaVM1NTAgaXMgQVRBMTAwIHdpdGggQVRBNjYgbGF5b3V0CisjZGVmaW5lIEFUQV8xMDAJCTB4MDUKKyNkZWZpbmUgQVRBXzEzM2EJMHgwNiAvLyBTaVM5NjFiIHdpdGggMTMzIHN1cHBvcnQKKyNkZWZpbmUgQVRBXzEzMwkJMHgwNyAvLyBTaVM5NjIvOTYzCisKK3N0YXRpYyB1OCBjaGlwc2V0X2ZhbWlseTsKKworLyoKKyAqIERldmljZXMgc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTE2IGhvc3RfaWQ7CisJdTggY2hpcHNldF9mYW1pbHk7CisJdTggZmxhZ3M7Cit9IFNpU0hvc3RDaGlwSW5mb1tdID0geworCXsgIlNpUzc0NSIsCVBDSV9ERVZJQ0VfSURfU0lfNzQ1LAlBVEFfMTAwICB9LAorCXsgIlNpUzczNSIsCVBDSV9ERVZJQ0VfSURfU0lfNzM1LAlBVEFfMTAwICB9LAorCXsgIlNpUzczMyIsCVBDSV9ERVZJQ0VfSURfU0lfNzMzLAlBVEFfMTAwICB9LAorCXsgIlNpUzYzNSIsCVBDSV9ERVZJQ0VfSURfU0lfNjM1LAlBVEFfMTAwICB9LAorCXsgIlNpUzYzMyIsCVBDSV9ERVZJQ0VfSURfU0lfNjMzLAlBVEFfMTAwICB9LAorCisJeyAiU2lTNzMwIiwJUENJX0RFVklDRV9JRF9TSV83MzAsCUFUQV8xMDBhIH0sCisJeyAiU2lTNTUwIiwJUENJX0RFVklDRV9JRF9TSV81NTAsCUFUQV8xMDBhIH0sCisKKwl7ICJTaVM2NDAiLAlQQ0lfREVWSUNFX0lEX1NJXzY0MCwJQVRBXzY2ICAgfSwKKwl7ICJTaVM2MzAiLAlQQ0lfREVWSUNFX0lEX1NJXzYzMCwJQVRBXzY2ICAgfSwKKwl7ICJTaVM2MjAiLAlQQ0lfREVWSUNFX0lEX1NJXzYyMCwJQVRBXzY2ICAgfSwKKwl7ICJTaVM1NDAiLAlQQ0lfREVWSUNFX0lEX1NJXzU0MCwJQVRBXzY2ICAgfSwKKwl7ICJTaVM1MzAiLAlQQ0lfREVWSUNFX0lEX1NJXzUzMCwJQVRBXzY2ICAgfSwKKworCXsgIlNpUzU2MDAiLAlQQ0lfREVWSUNFX0lEX1NJXzU2MDAsCUFUQV8zMyAgIH0sCisJeyAiU2lTNTU5OCIsCVBDSV9ERVZJQ0VfSURfU0lfNTU5OCwJQVRBXzMzICAgfSwKKwl7ICJTaVM1NTk3IiwJUENJX0RFVklDRV9JRF9TSV81NTk3LAlBVEFfMzMgICB9LAorCXsgIlNpUzU1OTEvMiIsCVBDSV9ERVZJQ0VfSURfU0lfNTU5MSwJQVRBXzMzICAgfSwKKwl7ICJTaVM1NTgyIiwJUENJX0RFVklDRV9JRF9TSV81NTgyLAlBVEFfMzMgICB9LAorCXsgIlNpUzU1ODEiLAlQQ0lfREVWSUNFX0lEX1NJXzU1ODEsCUFUQV8zMyAgIH0sCisKKwl7ICJTaVM1NTk2IiwJUENJX0RFVklDRV9JRF9TSV81NTk2LAlBVEFfMTYgICB9LAorCXsgIlNpUzU1NzEiLAlQQ0lfREVWSUNFX0lEX1NJXzU1NzEsCUFUQV8xNiAgIH0sCisJeyAiU2lTNTUxeCIsCVBDSV9ERVZJQ0VfSURfU0lfNTUxMSwJQVRBXzE2ICAgfSwKK307CisKKy8qIEN5Y2xlIHRpbWUgYml0cyBhbmQgdmFsdWVzIHZhcnkgYWNyb3NzIGNoaXAgZG1hIGNhcGFiaWxpdGllcworICAgVGhlc2UgdGhyZWUgYXJyYXlzIGhvbGQgdGhlIHJlZ2lzdGVyIGxheW91dCBhbmQgdGhlIHZhbHVlcyB0byBzZXQuCisgICBJbmRleGVkIGJ5IGNoaXBzZXRfZmFtaWx5IGFuZCAoZG1hX21vZGUgLSBYRkVSX1VETUFfMCkgKi8KKworLyogezAsIEFUQV8xNiwgQVRBXzMzLCBBVEFfNjYsIEFUQV8xMDBhLCBBVEFfMTAwLCBBVEFfMTMzfSAqLworc3RhdGljIHU4IGN5Y2xlX3RpbWVfb2Zmc2V0W10gPSB7MCwwLDUsNCw0LDAsMH07CitzdGF0aWMgdTggY3ljbGVfdGltZV9yYW5nZVtdID0gezAsMCwyLDMsMyw0LDR9Oworc3RhdGljIHU4IGN5Y2xlX3RpbWVfdmFsdWVbXVtYRkVSX1VETUFfNiAtIFhGRVJfVURNQV8wICsgMV0gPSB7CisJezAsMCwwLDAsMCwwLDB9LCAvKiBubyB1ZG1hICovCisJezAsMCwwLDAsMCwwLDB9LCAvKiBubyB1ZG1hICovCisJezMsMiwxLDAsMCwwLDB9LCAvKiBBVEFfMzMgKi8KKwl7Nyw1LDMsMiwxLDAsMH0sIC8qIEFUQV82NiAqLworCXs3LDUsMywyLDEsMCwwfSwgLyogQVRBXzEwMGEgKDczMCBzcGVjaWZpYyksIGRpZmZlcmVuY2VzIGFyZSBvbiBjeWNsZV90aW1lIHJhbmdlIGFuZCBvZmZzZXQgKi8KKwl7MTEsNyw1LDQsMiwxLDB9LCAvKiBBVEFfMTAwICovCisJezE1LDEwLDcsNSwzLDIsMX0sIC8qIEFUQV8xMzNhIChlYXJsaWVzdCA2OTEgc291dGhicmlkZ2VzKSAqLworCXsxNSwxMCw3LDUsMywyLDF9LCAvKiBBVEFfMTMzICovCit9OworLyogQ1JDIFZhbGlkIFNldHVwIFRpbWUgdmFyeSBhY3Jvc3MgSURFIGNsb2NrIHNldHRpbmcgMzMvNjYvMTAwLzEzMworICAgU2VlIFNpUzk2MiBkYXRhIHNoZWV0IGZvciBtb3JlIGRldGFpbCAqLworc3RhdGljIHU4IGN2c190aW1lX3ZhbHVlW11bWEZFUl9VRE1BXzYgLSBYRkVSX1VETUFfMCArIDFdID0geworCXswLDAsMCwwLDAsMCwwfSwgLyogbm8gdWRtYSAqLworCXswLDAsMCwwLDAsMCwwfSwgLyogbm8gdWRtYSAqLworCXsyLDEsMSwwLDAsMCwwfSwKKwl7NCwzLDIsMSwwLDAsMH0sCisJezQsMywyLDEsMCwwLDB9LAorCXs2LDQsMywxLDEsMSwwfSwKKwl7OSw2LDQsMiwyLDIsMn0sCisJezksNiw0LDIsMiwyLDJ9LAorfTsKKy8qIEluaXRpYWxpemUgdGltZSwgQWN0aXZlIHRpbWUsIFJlY292ZXJ5IHRpbWUgdmFyeSBhY3Jvc3MKKyAgIElERSBjbG9jayBzZXR0aW5ncy4gVGhlc2UgMyBhcnJheXMgaG9sZCB0aGUgcmVnaXN0ZXIgdmFsdWUKKyAgIGZvciBQSU8wLzEvMi8zLzQgYW5kIERNQTAvMS8yIG1vZGUgaW4gb3JkZXIgKi8KK3N0YXRpYyB1OCBpbmlfdGltZV92YWx1ZVtdWzhdID0geworCXswLDAsMCwwLDAsMCwwLDB9LAorCXswLDAsMCwwLDAsMCwwLDB9LAorCXsyLDEsMCwwLDAsMSwwLDB9LAorCXs0LDMsMSwxLDEsMywxLDF9LAorCXs0LDMsMSwxLDEsMywxLDF9LAorCXs2LDQsMiwyLDIsNCwyLDJ9LAorCXs5LDYsMywzLDMsNiwzLDN9LAorCXs5LDYsMywzLDMsNiwzLDN9LAorfTsKK3N0YXRpYyB1OCBhY3RfdGltZV92YWx1ZVtdWzhdID0geworCXswLDAsMCwwLDAsMCwwLDB9LAorCXswLDAsMCwwLDAsMCwwLDB9LAorCXs5LDksOSwyLDIsNywyLDJ9LAorCXsxOSwxOSwxOSw1LDQsMTQsNSw0fSwKKwl7MTksMTksMTksNSw0LDE0LDUsNH0sCisJezI4LDI4LDI4LDcsNiwyMSw3LDZ9LAorCXszOCwzOCwzOCwxMCw5LDI4LDEwLDl9LAorCXszOCwzOCwzOCwxMCw5LDI4LDEwLDl9LAorfTsKK3N0YXRpYyB1OCByY29fdGltZV92YWx1ZVtdWzhdID0geworCXswLDAsMCwwLDAsMCwwLDB9LAorCXswLDAsMCwwLDAsMCwwLDB9LAorCXs5LDIsMCwyLDAsNywxLDF9LAorCXsxOSw1LDEsNSwyLDE2LDMsMn0sCisJezE5LDUsMSw1LDIsMTYsMywyfSwKKwl7MzAsOSwzLDksNCwyNSw2LDR9LAorCXs0MCwxMiw0LDEyLDUsMzQsMTIsNX0sCisJezQwLDEyLDQsMTIsNSwzNCwxMiw1fSwKK307CisKKy8qCisgKiBQcmludGluZyBjb25maWd1cmF0aW9uCisgKi8KKy8qIFVzZWQgZm9yIGNoaXBzZXQgdHlwZSBwcmludGluZyBhdCBib290IHRpbWUgKi8KK3N0YXRpYyBjaGFyKiBjaGlwc2V0X2NhcGFiaWxpdHlbXSA9IHsKKwkiQVRBIiwgIkFUQSAxNiIsCisJIkFUQSAzMyIsICJBVEEgNjYiLAorCSJBVEEgMTAwICgxc3QgZ2VuKSIsICJBVEEgMTAwICgybmQgZ2VuKSIsCisJIkFUQSAxMzMgKDFzdCBnZW4pIiwgIkFUQSAxMzMgKDJuZCBnZW4pIgorfTsKKworI2lmIGRlZmluZWQoRElTUExBWV9TSVNfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCitzdGF0aWMgdTggc2lzX3Byb2MgPSAwOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmJtaWRlX2RldjsKKworc3RhdGljIGNoYXIqIGNhYmxlX3R5cGVbXSA9IHsKKwkiODAgcGlucyIsCisJIjQwIHBpbnMiCit9OworCitzdGF0aWMgY2hhciogcmVjb3ZlcnlfdGltZVtdID17CisJIjEyIFBDSUNMSyIsICIxIFBDSUNMSyIsCisJIjIgUENJQ0xLIiwgIjMgUENJQ0xLIiwKKwkiNCBQQ0lDTEsiLCAiNSBQQ0lDTENLIiwKKwkiNiBQQ0lDTEsiLCAiNyBQQ0lDTENLIiwKKwkiOCBQQ0lDTEsiLCAiOSBQQ0lDTENLIiwKKwkiMTAgUENJQ0xLIiwgIjExIFBDSUNMSyIsCisJIjEzIFBDSUNMSyIsICIxNCBQQ0lDTEsiLAorCSIxNSBQQ0lDTEsiLCAiMTUgUENJQ0xLIgorfTsKKworc3RhdGljIGNoYXIqIGFjdGl2ZV90aW1lW10gPSB7CisJIjggUENJQ0xLIiwgIjEgUENJQ0xDSyIsCisJIjIgUENJQ0xLIiwgIjMgUENJQ0xLIiwKKwkiNCBQQ0lDTEsiLCAiNSBQQ0lDTEsiLAorCSI2IFBDSUNMSyIsICIxMiBQQ0lDTEsiCit9OworCitzdGF0aWMgY2hhciogY3ljbGVfdGltZVtdID0geworCSJSZXNlcnZlZCIsICIyIENMSyIsCisJIjMgQ0xLIiwgIjQgQ0xLIiwKKwkiNSBDTEsiLCAiNiBDTEsiLAorCSI3IENMSyIsICI4IENMSyIsCisJIjkgQ0xLIiwgIjEwIENMSyIsCisJIjExIENMSyIsICIxMiBDTEsiLAorCSIxMyBDTEsiLCAiMTQgQ0xLIiwKKwkiMTUgQ0xLIiwgIjE2IENMSyIKK307CisKKy8qIEdlbmVyaWMgYWRkIG1hc3RlciBvciBzbGF2ZSBpbmZvIGZ1bmN0aW9uICovCitzdGF0aWMgY2hhciogZ2V0X2RyaXZlc19pbmZvIChjaGFyICpidWZmZXIsIHU4IHBvcykKK3sKKwl1OCByZWcwMCwgcmVnMDEsIHJlZzEwLCByZWcxMTsgLyogdGltaW5nIHJlZ2lzdGVycyAqLworCXUzMiByZWdkdzAsIHJlZ2R3MTsKKwljaGFyKiBwID0gYnVmZmVyOworCisvKiBQb3N0d3JpdGUvUHJlZmV0Y2ggKi8KKwlpZiAoY2hpcHNldF9mYW1pbHkgPCBBVEFfMTMzKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg0YiwgJnJlZzAwKTsKKwkJcCArPSBzcHJpbnRmKHAsICJEcml2ZSAlZDogICAgICAgIFBvc3R3cml0ZSAlcyBcdCBcdCBQb3N0d3JpdGUgJXNcbiIsCisJCQkgICAgIHBvcywgKHJlZzAwICYgKDB4MTAgPDwgcG9zKSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAorCQkJICAgICAocmVnMDAgJiAoMHg0MCA8PCBwb3MpKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCQlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgICBQcmVmZXRjaCAgJXMgXHQgXHQgUHJlZmV0Y2ggICVzXG4iLAorCQkJICAgICAocmVnMDAgJiAoMHgwMSA8PCBwb3MpKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCQkgICAgIChyZWcwMCAmICgweDA0IDw8IHBvcykpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg0MCsyKnBvcywgJnJlZzAwKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDQxKzIqcG9zLCAmcmVnMDEpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShibWlkZV9kZXYsIDB4NDQrMipwb3MsICZyZWcxMCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg0NSsyKnBvcywgJnJlZzExKTsKKwl9IGVsc2UgeworCQl1MzIgcmVnNTRoOworCQl1OCBkcml2ZV9wY2kgPSAweDQwOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYm1pZGVfZGV2LCAweDU0LCAmcmVnNTRoKTsKKwkJaWYgKHJlZzU0aCAmIDB4NDAwMDAwMDApIHsKKwkJCS8vIENvbmZpZ3VyYXRpb24gc3BhY2UgcmVtYXBwZWQgdG8gMHg3MAorCQkJZHJpdmVfcGNpID0gMHg3MDsKKwkJfQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYm1pZGVfZGV2LCAodW5zaWduZWQgbG9uZylkcml2ZV9wY2krNCpwb3MsICZyZWdkdzApOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYm1pZGVfZGV2LCAodW5zaWduZWQgbG9uZylkcml2ZV9wY2krNCpwb3MrOCwgJnJlZ2R3MSk7CisKKwkJcCArPSBzcHJpbnRmKHAsICJEcml2ZSAlZDpcbiIsIHBvcyk7CisJfQorCisKKy8qIFVETUEgKi8KKwlpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzEzMykgeworCQlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgICBVRE1BICVzIFx0IFx0IFx0IFVETUEgJXNcbiIsCisJCQkgICAgIChyZWdkdzAgJiAweDA0KSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCQkgICAgIChyZWdkdzEgJiAweDA0KSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCQlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgICBVRE1BIEN5Y2xlIFRpbWUgICAgJXMgXHQgVURNQSBDeWNsZSBUaW1lICAgICVzXG4iLAorCQkJICAgICBjeWNsZV90aW1lWyhyZWdkdzAgJiAweEYwKSA+PiA0XSwKKwkJCSAgICAgY3ljbGVfdGltZVsocmVnZHcxICYgMHhGMCkgPj4gNF0pOworCX0gZWxzZSBpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzMzKSB7CisJCXAgKz0gc3ByaW50ZihwLCAiICAgICAgICAgICAgICAgIFVETUEgJXMgXHQgXHQgXHQgVURNQSAlc1xuIiwKKwkJCSAgICAgKHJlZzAxICYgMHg4MCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAorCQkJICAgICAocmVnMTEgJiAweDgwKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCisJCXAgKz0gc3ByaW50ZihwLCAiICAgICAgICAgICAgICAgIFVETUEgQ3ljbGUgVGltZSAgICAiKTsKKwkJc3dpdGNoKGNoaXBzZXRfZmFtaWx5KSB7CisJCQljYXNlIEFUQV8zMzoJcCArPSBzcHJpbnRmKHAsIGN5Y2xlX3RpbWVbKHJlZzAxICYgMHg2MCkgPj4gNV0pOyBicmVhazsKKwkJCWNhc2UgQVRBXzY2OgorCQkJY2FzZSBBVEFfMTAwYToJcCArPSBzcHJpbnRmKHAsIGN5Y2xlX3RpbWVbKHJlZzAxICYgMHg3MCkgPj4gNF0pOyBicmVhazsKKwkJCWNhc2UgQVRBXzEwMDoKKwkJCWNhc2UgQVRBXzEzM2E6CXAgKz0gc3ByaW50ZihwLCBjeWNsZV90aW1lW3JlZzAxICYgMHgwRl0pOyBicmVhazsKKwkJCWRlZmF1bHQ6CXAgKz0gc3ByaW50ZihwLCAiPyIpOyBicmVhazsKKwkJfQorCQlwICs9IHNwcmludGYocCwgIiBcdCBVRE1BIEN5Y2xlIFRpbWUgICAgIik7CisJCXN3aXRjaChjaGlwc2V0X2ZhbWlseSkgeworCQkJY2FzZSBBVEFfMzM6CXAgKz0gc3ByaW50ZihwLCBjeWNsZV90aW1lWyhyZWcxMSAmIDB4NjApID4+IDVdKTsgYnJlYWs7CisJCQljYXNlIEFUQV82NjoKKwkJCWNhc2UgQVRBXzEwMGE6CXAgKz0gc3ByaW50ZihwLCBjeWNsZV90aW1lWyhyZWcxMSAmIDB4NzApID4+IDRdKTsgYnJlYWs7CisJCQljYXNlIEFUQV8xMDA6CisJCQljYXNlIEFUQV8xMzNhOiAgcCArPSBzcHJpbnRmKHAsIGN5Y2xlX3RpbWVbcmVnMTEgJiAweDBGXSk7IGJyZWFrOworCQkJZGVmYXVsdDoJcCArPSBzcHJpbnRmKHAsICI/Iik7IGJyZWFrOworCQl9CisJCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKwl9CisKKworCWlmIChjaGlwc2V0X2ZhbWlseSA8IEFUQV8xMzMpIHsJLyogZWxzZSBjYXNlIFRPRE8gKi8KKworLyogRGF0YSBBY3RpdmUgKi8KKwkJcCArPSBzcHJpbnRmKHAsICIgICAgICAgICAgICAgICAgRGF0YSBBY3RpdmUgVGltZSAgICIpOworCQlzd2l0Y2goY2hpcHNldF9mYW1pbHkpIHsKKwkJCWNhc2UgQVRBXzE2OiAvKiBjb25maXJtZWQgKi8KKwkJCWNhc2UgQVRBXzMzOgorCQkJY2FzZSBBVEFfNjY6CisJCQljYXNlIEFUQV8xMDBhOiBwICs9IHNwcmludGYocCwgYWN0aXZlX3RpbWVbcmVnMDEgJiAweDA3XSk7IGJyZWFrOworCQkJY2FzZSBBVEFfMTAwOgorCQkJY2FzZSBBVEFfMTMzYTogcCArPSBzcHJpbnRmKHAsIGFjdGl2ZV90aW1lWyhyZWcwMCAmIDB4NzApID4+IDRdKTsgYnJlYWs7CisJCQlkZWZhdWx0OiBwICs9IHNwcmludGYocCwgIj8iKTsgYnJlYWs7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICIgXHQgRGF0YSBBY3RpdmUgVGltZSAgICIpOworCQlzd2l0Y2goY2hpcHNldF9mYW1pbHkpIHsKKwkJCWNhc2UgQVRBXzE2OgorCQkJY2FzZSBBVEFfMzM6CisJCQljYXNlIEFUQV82NjoKKwkJCWNhc2UgQVRBXzEwMGE6IHAgKz0gc3ByaW50ZihwLCBhY3RpdmVfdGltZVtyZWcxMSAmIDB4MDddKTsgYnJlYWs7CisJCQljYXNlIEFUQV8xMDA6CisJCQljYXNlIEFUQV8xMzNhOiBwICs9IHNwcmludGYocCwgYWN0aXZlX3RpbWVbKHJlZzEwICYgMHg3MCkgPj4gNF0pOyBicmVhazsKKwkJCWRlZmF1bHQ6IHAgKz0gc3ByaW50ZihwLCAiPyIpOyBicmVhazsKKwkJfQorCQlwICs9IHNwcmludGYocCwgIlxuIik7CisKKy8qIERhdGEgUmVjb3ZlcnkgKi8KKwkvKiB3YXJuaW5nOiBtYXkgbmVlZCAocmVnJjB4MDcpIGZvciBwcmUgQVRBNjYgY2hpcHMgKi8KKwkJcCArPSBzcHJpbnRmKHAsICIgICAgICAgICAgICAgICAgRGF0YSBSZWNvdmVyeSBUaW1lICVzIFx0IERhdGEgUmVjb3ZlcnkgVGltZSAlc1xuIiwKKwkJCSAgICAgcmVjb3ZlcnlfdGltZVtyZWcwMCAmIDB4MGZdLCByZWNvdmVyeV90aW1lW3JlZzEwICYgMHgwZl0pOworCX0KKworCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciogZ2V0X21hc3RlcnNfaW5mbyhjaGFyKiBidWZmZXIpCit7CisJcmV0dXJuIGdldF9kcml2ZXNfaW5mbyhidWZmZXIsIDApOworfQorCitzdGF0aWMgY2hhciogZ2V0X3NsYXZlc19pbmZvKGNoYXIqIGJ1ZmZlcikKK3sKKwlyZXR1cm4gZ2V0X2RyaXZlc19pbmZvKGJ1ZmZlciwgMSk7Cit9CisKKy8qIE1haW4gZ2V0X2luZm8sIGNhbGxlZCBvbiAvcHJvYy9pZGUvc2lzIHJlYWRzICovCitzdGF0aWMgaW50IHNpc19nZXRfaW5mbyAoY2hhciAqYnVmZmVyLCBjaGFyICoqYWRkciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQpCit7CisJY2hhciAqcCA9IGJ1ZmZlcjsKKwlpbnQgbGVuOworCXU4IHJlZzsKKwl1MTYgcmVnMiwgcmVnMzsKKworCXAgKz0gc3ByaW50ZihwLCAiXG5TaVMgNTUxMyAiKTsKKwlzd2l0Y2goY2hpcHNldF9mYW1pbHkpIHsKKwkJY2FzZSBBVEFfMTY6IHAgKz0gc3ByaW50ZihwLCAiRE1BIDE2Iik7IGJyZWFrOworCQljYXNlIEFUQV8zMzogcCArPSBzcHJpbnRmKHAsICJVbHRyYSAzMyIpOyBicmVhazsKKwkJY2FzZSBBVEFfNjY6IHAgKz0gc3ByaW50ZihwLCAiVWx0cmEgNjYiKTsgYnJlYWs7CisJCWNhc2UgQVRBXzEwMGE6CisJCWNhc2UgQVRBXzEwMDogcCArPSBzcHJpbnRmKHAsICJVbHRyYSAxMDAiKTsgYnJlYWs7CisJCWNhc2UgQVRBXzEzM2E6CisJCWNhc2UgQVRBXzEzMzogcCArPSBzcHJpbnRmKHAsICJVbHRyYSAxMzMiKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHArPSBzcHJpbnRmKHAsICJVbmtub3duPz8/Iik7IGJyZWFrOworCX0KKwlwICs9IHNwcmludGYocCwgIiBjaGlwc2V0XG4iKTsKKwlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLSBQcmltYXJ5IENoYW5uZWwgIgorCQkgICAgICItLS0tLS0tLS0tLS0tLS0tIFNlY29uZGFyeSBDaGFubmVsICIKKwkJICAgICAiLS0tLS0tLS0tLS0tLVxuIik7CisKKy8qIFN0YXR1cyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHg0YSwgJnJlZyk7CisJaWYgKGNoaXBzZXRfZmFtaWx5ID09IEFUQV8xMzMpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYm1pZGVfZGV2LCAweDUwLCAmcmVnMik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJtaWRlX2RldiwgMHg1MiwgJnJlZzMpOworCX0KKwlwICs9IHNwcmludGYocCwgIkNoYW5uZWwgU3RhdHVzOiAiKTsKKwlpZiAoY2hpcHNldF9mYW1pbHkgPCBBVEFfNjYpIHsKKwkJcCArPSBzcHJpbnRmKHAsICIlcyBcdCBcdCBcdCBcdCAlc1xuIiwKKwkJCSAgICAgKHJlZyAmIDB4MDQpID8gIk9uIiA6ICJPZmYiLAorCQkJICAgICAocmVnICYgMHgwMikgPyAiT24iIDogIk9mZiIpOworCX0gZWxzZSBpZiAoY2hpcHNldF9mYW1pbHkgPCBBVEFfMTMzKSB7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMgXHQgXHQgXHQgXHQgJXMgXG4iLAorCQkJICAgICAocmVnICYgMHgwMikgPyAiT24iIDogIk9mZiIsCisJCQkgICAgIChyZWcgJiAweDA0KSA/ICJPbiIgOiAiT2ZmIik7CisJfSBlbHNlIHsgLyogQVRBXzEzMyAqLworCQlwICs9IHNwcmludGYocCwgIiVzIFx0IFx0IFx0IFx0ICVzIFxuIiwKKwkJCSAgICAgKHJlZzIgJiAweDAyKSA/ICJPbiIgOiAiT2ZmIiwKKwkJCSAgICAgKHJlZzMgJiAweDAyKSA/ICJPbiIgOiAiT2ZmIik7CisJfQorCisvKiBPcGVyYXRpb24gTW9kZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJtaWRlX2RldiwgMHgwOSwgJnJlZyk7CisJcCArPSBzcHJpbnRmKHAsICJPcGVyYXRpb24gTW9kZTogJXMgXHQgXHQgXHQgJXMgXG4iLAorCQkgICAgIChyZWcgJiAweDAxKSA/ICJOYXRpdmUiIDogIkNvbXBhdGlibGUiLAorCQkgICAgIChyZWcgJiAweDA0KSA/ICJOYXRpdmUiIDogIkNvbXBhdGlibGUiKTsKKworLyogODAtcGluIGNhYmxlID8gKi8KKwlpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzEzMykgeworCQlwICs9IHNwcmludGYocCwgIkNhYmxlIFR5cGU6ICAgICAlcyBcdCBcdCBcdCAlc1xuIiwKKwkJCSAgICAgKHJlZzIgJiAweDAxKSA/IGNhYmxlX3R5cGVbMV0gOiBjYWJsZV90eXBlWzBdLAorCQkJICAgICAocmVnMyAmIDB4MDEpID8gY2FibGVfdHlwZVsxXSA6IGNhYmxlX3R5cGVbMF0pOworCX0gZWxzZSBpZiAoY2hpcHNldF9mYW1pbHkgPiBBVEFfMzMpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYm1pZGVfZGV2LCAweDQ4LCAmcmVnKTsKKwkJcCArPSBzcHJpbnRmKHAsICJDYWJsZSBUeXBlOiAgICAgJXMgXHQgXHQgXHQgJXNcbiIsCisJCQkgICAgIChyZWcgJiAweDEwKSA/IGNhYmxlX3R5cGVbMV0gOiBjYWJsZV90eXBlWzBdLAorCQkJICAgICAocmVnICYgMHgyMCkgPyBjYWJsZV90eXBlWzFdIDogY2FibGVfdHlwZVswXSk7CisJfQorCisvKiBQcmVmZXRjaCBDb3VudCAqLworCWlmIChjaGlwc2V0X2ZhbWlseSA8IEFUQV8xMzMpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYm1pZGVfZGV2LCAweDRjLCAmcmVnMik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJtaWRlX2RldiwgMHg0ZSwgJnJlZzMpOworCQlwICs9IHNwcmludGYocCwgIlByZWZldGNoIENvdW50OiAlZCBcdCBcdCBcdCBcdCAlZFxuIiwKKwkJCSAgICAgcmVnMiwgcmVnMyk7CisJfQorCisJcCA9IGdldF9tYXN0ZXJzX2luZm8ocCk7CisJcCA9IGdldF9zbGF2ZXNfaW5mbyhwKTsKKworCWxlbiA9IChwIC0gYnVmZmVyKSAtIG9mZnNldDsKKwkqYWRkciA9IGJ1ZmZlciArIG9mZnNldDsKKworCXJldHVybiBsZW4gPiBjb3VudCA/IGNvdW50IDogbGVuOworfQorI2VuZGlmIC8qIGRlZmluZWQoRElTUExBWV9TSVNfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgKi8KKworc3RhdGljIHU4IHNpczU1MTNfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCByYXRlc1tdID0geyAwLCAwLCAxLCAyLCAzLCAzLCA0LCA0IH07CisJdTggbW9kZSA9IHJhdGVzW2NoaXBzZXRfZmFtaWx5XTsKKworCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisJcmV0dXJuIG1vZGU7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICovCisvKiBFbmFibGVzIHBlci1kcml2ZSBwcmVmZXRjaCBhbmQgcG9zdHdyaXRlICovCitzdGF0aWMgdm9pZCBjb25maWdfZHJpdmVfYXJ0X3J3cCAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKworCXU4IHJlZzRiaAkJPSAwOworCXU4IHJ3X3ByZWZldGNoCQk9ICgweDExIDw8IGRyaXZlLT5kbik7CisKKwlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQorCQlyZXR1cm47CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmcmVnNGJoKTsKKworCWlmICgocmVnNGJoICYgcndfcHJlZmV0Y2gpICE9IHJ3X3ByZWZldGNoKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDRiLCByZWc0Ymh8cndfcHJlZmV0Y2gpOworfQorCisKKy8qIFNldCBwZXItZHJpdmUgYWN0aXZlIGFuZCByZWNvdmVyeSB0aW1lICovCitzdGF0aWMgdm9pZCBjb25maWdfYXJ0X3J3cF9waW8gKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKworCXU4CQkJdGltaW5nLCBkcml2ZV9wY2ksIHRlc3QxLCB0ZXN0MjsKKworCXUxNiBlaWRlX3Bpb190aW1pbmdbNl0gPSB7NjAwLCAzOTAsIDI0MCwgMTgwLCAxMjAsIDkwfTsKKwl1MTYgeGZlcl9waW8gPSBkcml2ZS0+aWQtPmVpZGVfcGlvX21vZGVzOworCisJY29uZmlnX2RyaXZlX2FydF9yd3AoZHJpdmUpOworCXBpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCBwaW8sIE5VTEwpOworCisJaWYgKHhmZXJfcGlvPiA0KQorCQl4ZmVyX3BpbyA9IDA7CisKKwlpZiAoZHJpdmUtPmlkLT5laWRlX3Bpb19pb3JkeSA+IDApIHsKKwkJZm9yICh4ZmVyX3BpbyA9IDU7CisJCQkoeGZlcl9waW8gPiAwKSAmJgorCQkJKGRyaXZlLT5pZC0+ZWlkZV9waW9faW9yZHkgPiBlaWRlX3Bpb190aW1pbmdbeGZlcl9waW9dKTsKKwkJCXhmZXJfcGlvLS0pOworCX0gZWxzZSB7CisJCXhmZXJfcGlvID0gKGRyaXZlLT5pZC0+ZWlkZV9waW9fbW9kZXMgJiA0KSA/IDB4MDUgOgorCQkJICAgKGRyaXZlLT5pZC0+ZWlkZV9waW9fbW9kZXMgJiAyKSA/IDB4MDQgOgorCQkJICAgKGRyaXZlLT5pZC0+ZWlkZV9waW9fbW9kZXMgJiAxKSA/IDB4MDMgOiB4ZmVyX3BpbzsKKwl9CisKKwl0aW1pbmcgPSAoeGZlcl9waW8gPj0gcGlvKSA/IHhmZXJfcGlvIDogcGlvOworCisJLyogSW4gcHJlIEFUQV8xMzMgY2FzZSwgZHJpdmVzIHNpdCBhdCAweDQwICsgNCpkcml2ZS0+ZG4gKi8KKwlkcml2ZV9wY2kgPSAweDQwOworCS8qIEluIFNpUzk2MiBjYXNlIGRyaXZlcyBzaXQgYXQgKDB4NDAgb3IgMHg3MCkgKyA4KmRyaXZlLT5kbikgKi8KKwlpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzEzMykgeworCQl1MzIgcmVnNTRoOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDU0LCAmcmVnNTRoKTsKKwkJaWYgKHJlZzU0aCAmIDB4NDAwMDAwMDApIGRyaXZlX3BjaSA9IDB4NzA7CisJCWRyaXZlX3BjaSArPSAoKGRyaXZlLT5kbikqMHg0KTsKKwl9IGVsc2UgeworCQlkcml2ZV9wY2kgKz0gKChkcml2ZS0+ZG4pKjB4Mik7CisJfQorCisJLyogcmVnaXN0ZXIgbGF5b3V0IGNoYW5nZWQgd2l0aCBuZXdlciBBVEExMDAgY2hpcHMgKi8KKwlpZiAoY2hpcHNldF9mYW1pbHkgPCBBVEFfMTAwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpLCAmdGVzdDEpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGRyaXZlX3BjaSsxLCAmdGVzdDIpOworCisJCS8qIENsZWFyIGFjdGl2ZSBhbmQgcmVjb3ZlcnkgdGltaW5ncyAqLworCQl0ZXN0MSAmPSB+MHgwRjsKKwkJdGVzdDIgJj0gfjB4MDc7CisKKwkJc3dpdGNoKHRpbWluZykgeworCQkJY2FzZSA0OgkJdGVzdDEgfD0gMHgwMTsgdGVzdDIgfD0gMHgwMzsgYnJlYWs7CisJCQljYXNlIDM6CQl0ZXN0MSB8PSAweDAzOyB0ZXN0MiB8PSAweDAzOyBicmVhazsKKwkJCWNhc2UgMjoJCXRlc3QxIHw9IDB4MDQ7IHRlc3QyIHw9IDB4MDQ7IGJyZWFrOworCQkJY2FzZSAxOgkJdGVzdDEgfD0gMHgwNzsgdGVzdDIgfD0gMHgwNjsgYnJlYWs7CisJCQlkZWZhdWx0OglicmVhazsKKwkJfQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBkcml2ZV9wY2ksIHRlc3QxKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpKzEsIHRlc3QyKTsKKwl9IGVsc2UgaWYgKGNoaXBzZXRfZmFtaWx5IDwgQVRBXzEzMykgeworCQlzd2l0Y2godGltaW5nKSB7IC8qCQlhY3RpdmUgIHJlY292ZXJ5CisJCQkJCQkgIHYgICAgIHYgKi8KKwkJCWNhc2UgNDoJCXRlc3QxID0gMHgzMHwweDAxOyBicmVhazsKKwkJCWNhc2UgMzoJCXRlc3QxID0gMHgzMHwweDAzOyBicmVhazsKKwkJCWNhc2UgMjoJCXRlc3QxID0gMHg0MHwweDA0OyBicmVhazsKKwkJCWNhc2UgMToJCXRlc3QxID0gMHg2MHwweDA3OyBicmVhazsKKwkJCWRlZmF1bHQ6CWJyZWFrOworCQl9CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRyaXZlX3BjaSwgdGVzdDEpOworCX0gZWxzZSB7IC8qIEFUQV8xMzMgKi8KKwkJdTMyIHRlc3QzOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBkcml2ZV9wY2ksICZ0ZXN0Myk7CisJCXRlc3QzICY9IDB4YzBjMDBmZmY7CisJCWlmICh0ZXN0MyAmIDB4MDgpIHsKKwkJCXRlc3QzIHw9ICh1bnNpZ25lZCBsb25nKWluaV90aW1lX3ZhbHVlW0FUQV8xMzNdW3RpbWluZ10gPDwgMTI7CisJCQl0ZXN0MyB8PSAodW5zaWduZWQgbG9uZylhY3RfdGltZV92YWx1ZVtBVEFfMTMzXVt0aW1pbmddIDw8IDE2OworCQkJdGVzdDMgfD0gKHVuc2lnbmVkIGxvbmcpcmNvX3RpbWVfdmFsdWVbQVRBXzEzM11bdGltaW5nXSA8PCAyNDsKKwkJfSBlbHNlIHsKKwkJCXRlc3QzIHw9ICh1bnNpZ25lZCBsb25nKWluaV90aW1lX3ZhbHVlW0FUQV8xMDBdW3RpbWluZ10gPDwgMTI7CisJCQl0ZXN0MyB8PSAodW5zaWduZWQgbG9uZylhY3RfdGltZV92YWx1ZVtBVEFfMTAwXVt0aW1pbmddIDw8IDE2OworCQkJdGVzdDMgfD0gKHVuc2lnbmVkIGxvbmcpcmNvX3RpbWVfdmFsdWVbQVRBXzEwMF1bdGltaW5nXSA8PCAyNDsKKwkJfQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCB0ZXN0Myk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19jaGlwc2V0X2Zvcl9waW8gKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQoreworCWlmIChwaW8gPT0gMjU1KQorCQlwaW8gPSBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsIFhGRVJfUElPIHwgWEZFUl9FUElPKSAtIFhGRVJfUElPXzA7CisJY29uZmlnX2FydF9yd3BfcGlvKGRyaXZlLCBwaW8pOworCXJldHVybiBpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBYRkVSX1BJT18wICsgbWluX3QodTgsIHBpbywgNCkpOworfQorCitzdGF0aWMgaW50IHNpczU1MTNfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisKKwl1OCBkcml2ZV9wY2ksIHJlZywgc3BlZWQ7CisJdTMyIHJlZ2R3OworCisJc3BlZWQgPSBpZGVfcmF0ZV9maWx0ZXIoc2lzNTUxM19yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisKKwkvKiBTZWUgY29uZmlnX2FydF9yd3BfcGlvIGZvciBkcml2ZSBwY2kgY29uZmlnIHJlZ2lzdGVycyAqLworCWRyaXZlX3BjaSA9IDB4NDA7CisJaWYgKGNoaXBzZXRfZmFtaWx5ID49IEFUQV8xMzMpIHsKKwkJdTMyIHJlZzU0aDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1NCwgJnJlZzU0aCk7CisJCWlmIChyZWc1NGggJiAweDQwMDAwMDAwKSBkcml2ZV9wY2kgPSAweDcwOworCQlkcml2ZV9wY2kgKz0gKChkcml2ZS0+ZG4pKjB4NCk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsICh1bnNpZ25lZCBsb25nKWRyaXZlX3BjaSwgJnJlZ2R3KTsKKwkJLyogRGlzYWJsZSBVRE1BIGJpdCBmb3Igbm9uIFVETUEgbW9kZXMgb24gVURNQSBjaGlwcyAqLworCQlpZiAoc3BlZWQgPCBYRkVSX1VETUFfMCkgeworCQkJcmVnZHcgJj0gMHhmZmZmZmZmYjsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAodW5zaWduZWQgbG9uZylkcml2ZV9wY2ksIHJlZ2R3KTsKKwkJfQorCQorCX0gZWxzZSB7CisJCWRyaXZlX3BjaSArPSAoKGRyaXZlLT5kbikqMHgyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBkcml2ZV9wY2krMSwgJnJlZyk7CisJCS8qIERpc2FibGUgVURNQSBiaXQgZm9yIG5vbiBVRE1BIG1vZGVzIG9uIFVETUEgY2hpcHMgKi8KKwkJaWYgKChzcGVlZCA8IFhGRVJfVURNQV8wKSAmJiAoY2hpcHNldF9mYW1pbHkgPiBBVEFfMTYpKSB7CisJCQlyZWcgJj0gMHg3RjsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRyaXZlX3BjaSsxLCByZWcpOworCQl9CisJfQorCisJLyogQ29uZmlnIGNoaXAgZm9yIG1vZGUgKi8KKwlzd2l0Y2goc3BlZWQpIHsKKwkJY2FzZSBYRkVSX1VETUFfNjoKKwkJY2FzZSBYRkVSX1VETUFfNToKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMjoKKwkJY2FzZSBYRkVSX1VETUFfMToKKwkJY2FzZSBYRkVSX1VETUFfMDoKKwkJCWlmIChjaGlwc2V0X2ZhbWlseSA+PSBBVEFfMTMzKSB7CisJCQkJcmVnZHcgfD0gMHgwNDsKKwkJCQlyZWdkdyAmPSAweGZmZmZmMDBmOworCQkJCS8qIGNoZWNrIGlmIEFUQTEzMyBlbmFibGUgKi8KKwkJCQlpZiAocmVnZHcgJiAweDA4KSB7CisJCQkJCXJlZ2R3IHw9ICh1bnNpZ25lZCBsb25nKWN5Y2xlX3RpbWVfdmFsdWVbQVRBXzEzM11bc3BlZWQtWEZFUl9VRE1BXzBdIDw8IDQ7CisJCQkJCXJlZ2R3IHw9ICh1bnNpZ25lZCBsb25nKWN2c190aW1lX3ZhbHVlW0FUQV8xMzNdW3NwZWVkLVhGRVJfVURNQV8wXSA8PCA4OworCQkJCX0gZWxzZSB7CisJCQkJLyogaWYgQVRBMTMzIGRpc2FibGUsIHdlIHNob3VsZCBub3Qgc2V0IHNwZWVkIGFib3ZlIFVETUE1ICovCisJCQkJCWlmIChzcGVlZCA+IFhGRVJfVURNQV81KQorCQkJCQkJc3BlZWQgPSBYRkVSX1VETUFfNTsKKwkJCQkJcmVnZHcgfD0gKHVuc2lnbmVkIGxvbmcpY3ljbGVfdGltZV92YWx1ZVtBVEFfMTAwXVtzcGVlZC1YRkVSX1VETUFfMF0gPDwgNDsKKwkJCQkJcmVnZHcgfD0gKHVuc2lnbmVkIGxvbmcpY3ZzX3RpbWVfdmFsdWVbQVRBXzEwMF1bc3BlZWQtWEZFUl9VRE1BXzBdIDw8IDg7CisJCQkJfQorCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAodW5zaWduZWQgbG9uZylkcml2ZV9wY2ksIHJlZ2R3KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRm9yY2UgdGhlIFVETUEgYml0IG9uIGlmIHdlIHdhbnQgdG8gdXNlIFVETUEgKi8KKwkJCQlyZWcgfD0gMHg4MDsKKwkJCQkvKiBjbGVhbiByZWcgY3ljbGUgdGltZSBiaXRzICovCisJCQkJcmVnICY9IH4oKDB4RkYgPj4gKDggLSBjeWNsZV90aW1lX3JhbmdlW2NoaXBzZXRfZmFtaWx5XSkpCisJCQkJCSA8PCBjeWNsZV90aW1lX29mZnNldFtjaGlwc2V0X2ZhbWlseV0pOworCQkJCS8qIHNldCByZWcgY3ljbGUgdGltZSBiaXRzICovCisJCQkJcmVnIHw9IGN5Y2xlX3RpbWVfdmFsdWVbY2hpcHNldF9mYW1pbHldW3NwZWVkLVhGRVJfVURNQV8wXQorCQkJCQk8PCBjeWNsZV90aW1lX29mZnNldFtjaGlwc2V0X2ZhbWlseV07CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpKzEsIHJlZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQljYXNlIFhGRVJfTVdfRE1BXzE6CisJCWNhc2UgWEZFUl9NV19ETUFfMDoKKwkJY2FzZSBYRkVSX1NXX0RNQV8yOgorCQljYXNlIFhGRVJfU1dfRE1BXzE6CisJCWNhc2UgWEZFUl9TV19ETUFfMDoKKwkJCWJyZWFrOworCQljYXNlIFhGRVJfUElPXzQ6IHJldHVybigoaW50KSBjb25maWdfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCA0KSk7CisJCWNhc2UgWEZFUl9QSU9fMzogcmV0dXJuKChpbnQpIGNvbmZpZ19jaGlwc2V0X2Zvcl9waW8oZHJpdmUsIDMpKTsKKwkJY2FzZSBYRkVSX1BJT18yOiByZXR1cm4oKGludCkgY29uZmlnX2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgMikpOworCQljYXNlIFhGRVJfUElPXzE6IHJldHVybigoaW50KSBjb25maWdfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCAxKSk7CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJZGVmYXVsdDoJIHJldHVybigoaW50KSBjb25maWdfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCAwKSk7CQorCX0KKworCXJldHVybiAoKGludCkgaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKK30KKworc3RhdGljIHZvaWQgc2lzNTUxM190dW5lX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwkodm9pZCkgY29uZmlnX2NoaXBzZXRfZm9yX3Bpbyhkcml2ZSwgcGlvKTsKK30KKworLyoKKyAqICgoaWQtPmh3X2NvbmZpZyAmIDB4NDAwMHwweDIwMDApICYmIChIV0lGKGRyaXZlKS0+dWRtYV9mb3VyKSkKKyAqLworc3RhdGljIGludCBjb25maWdfY2hpcHNldF9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQJPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBzaXM1NTEzX3JhdGVtYXNrKGRyaXZlKSk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiU0lTNTUxMzogY29uZmlnX2NoaXBzZXRfZm9yX2RtYSwgZHJpdmUgJWQsIHVsdHJhICV4XG4iLAorCSAgICAgICBkcml2ZS0+ZG4sIGRyaXZlLT5pZC0+ZG1hX3VsdHJhKTsKKyNlbmRpZgorCisJaWYgKCEoc3BlZWQpKQorCQlyZXR1cm4gMDsKKworCXNpczU1MTNfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CisJcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworc3RhdGljIGludCBzaXM1NTEzX2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkCT0gZHJpdmUtPmlkOworCisJZHJpdmUtPmluaXRfc3BlZWQgPSAwOworCisJaWYgKGlkICYmIChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIGRyaXZlLT5hdXRvZG1hKSB7CisKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJc2lzNTUxM190dW5lX2RyaXZlKGRyaXZlLCA1KTsKKwkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCX0KKwkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qIGluaXRpYXRlcy9hYm9ydHMgKFUpRE1BIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBvbiBhIGRyaXZlLiAqLworc3RhdGljIGludCBzaXM1NTEzX2NvbmZpZ194ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwljb25maWdfZHJpdmVfYXJ0X3J3cChkcml2ZSk7CisJY29uZmlnX2FydF9yd3BfcGlvKGRyaXZlLCA1KTsKKwlyZXR1cm4gc2lzNTUxM19jb25maWdfZHJpdmVfeGZlcl9yYXRlKGRyaXZlKTsKK30KKworLyoKKyAgRnV0dXJlIHNpbXBsZXIgY29uZmlnX3hmZXJfcmF0ZSA6CisgICBXaGVuIGlkZV9maW5kX2Jlc3RfbW9kZSBpcyBtYWRlIGJhZC1kcml2ZSBhd2FyZQorICAgLSByZW1vdmUgY29uZmlnX2RyaXZlX3hmZXJfcmF0ZSBhbmQgY29uZmlnX2NoaXBzZXRfZm9yX2RtYSwKKyAgIC0gcmVwbGFjZSBjb25maWdfeGZlcl9yYXRlIHdpdGggdGhlIGZvbGxvd2luZworCitzdGF0aWMgaW50IHNpczU1MTNfY29uZmlnX3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXUxNiB3ODAgPSBIV0lGKGRyaXZlKS0+dWRtYV9mb3VyOworCXUxNiBzcGVlZDsKKworCWNvbmZpZ19kcml2ZV9hcnRfcndwKGRyaXZlKTsKKwljb25maWdfYXJ0X3J3cF9waW8oZHJpdmUsIDUpOworCisJc3BlZWQgPSBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsCisJCVhGRVJfUElPIHwgWEZFUl9FUElPIHwgWEZFUl9TV0RNQSB8IFhGRVJfTVdETUEgfAorCQkoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzMzID8gWEZFUl9VRE1BIDogMCkgfAorCQkodzgwICYmIGNoaXBzZXRfZmFtaWx5ID49IEFUQV82NiA/IFhGRVJfVURNQV82NiA6IDApIHwKKwkJKHc4MCAmJiBjaGlwc2V0X2ZhbWlseSA+PSBBVEFfMTAwYSA/IFhGRVJfVURNQV8xMDAgOiAwKSB8CisJCSh3ODAgJiYgY2hpcHNldF9mYW1pbHkgPj0gQVRBXzEzM2EgPyBYRkVSX1VETUFfMTMzIDogMCkpOworCisJc2lzNTUxM190dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKworCWlmIChkcml2ZS0+YXV0b2RtYSAmJiAoc3BlZWQgJiBYRkVSX01PREUpICE9IFhGRVJfUElPKQorCQlyZXR1cm4gSFdJRihkcml2ZSktPmlkZV9kbWFfb24oZHJpdmUpOworCXJldHVybiBIV0lGKGRyaXZlKS0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7Cit9CisqLworCisvKiBDaGlwIGRldGVjdGlvbiBhbmQgZ2VuZXJhbCBjb25maWcgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9zaXM1NTEzIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwY2lfZGV2ICpob3N0OworCWludCBpID0gMDsKKworCWNoaXBzZXRfZmFtaWx5ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNpU0hvc3RDaGlwSW5mbykgJiYgIWNoaXBzZXRfZmFtaWx5OyBpKyspIHsKKworCQlob3N0ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIFNpU0hvc3RDaGlwSW5mb1tpXS5ob3N0X2lkLCBOVUxMKTsKKworCQlpZiAoIWhvc3QpCisJCQljb250aW51ZTsKKworCQljaGlwc2V0X2ZhbWlseSA9IFNpU0hvc3RDaGlwSW5mb1tpXS5jaGlwc2V0X2ZhbWlseTsKKworCQkvKiBTcGVjaWFsIGNhc2UgZm9yIFNpUzYzMCA6IDYzMFMvRVQgaXMgQVRBXzEwMGEgKi8KKwkJaWYgKFNpU0hvc3RDaGlwSW5mb1tpXS5ob3N0X2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNjMwKSB7CisJCQl1OCBob3N0cmV2OworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaG9zdCwgUENJX1JFVklTSU9OX0lELCAmaG9zdHJldik7CisJCQlpZiAoaG9zdHJldiA+PSAweDMwKQorCQkJCWNoaXBzZXRfZmFtaWx5ID0gQVRBXzEwMGE7CisJCX0KKwkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0lTNTUxMzogJXMgJXMgY29udHJvbGxlclxuIiwKKwkJCSBTaVNIb3N0Q2hpcEluZm9baV0ubmFtZSwgY2hpcHNldF9jYXBhYmlsaXR5W2NoaXBzZXRfZmFtaWx5XSk7CisJfQorCisJaWYgKCFjaGlwc2V0X2ZhbWlseSkgeyAvKiBCZWxvbmdzIHRvIHBjaS1xdWlya3MgKi8KKworCQkJdTMyIGlkZW1pc2M7CisJCQl1MTYgdHJ1ZWlkOworCisJCQkvKiBEaXNhYmxlIElEIG1hc2tpbmcgYW5kIHJlZ2lzdGVyIHJlbWFwcGluZyAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1NCwgJmlkZW1pc2MpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NTQsIChpZGVtaXNjICYgMHg3ZmZmZmZmZikpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfREVWSUNFX0lELCAmdHJ1ZWlkKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDU0LCBpZGVtaXNjKTsKKworCQkJaWYgKHRydWVpZCA9PSAweDU1MTgpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJTSVM1NTEzOiBTaVMgOTYyLzk2MyBNdVRJT0wgSURFIFVETUExMzMgY29udHJvbGxlclxuIik7CisJCQkJY2hpcHNldF9mYW1pbHkgPSBBVEFfMTMzOworCisJCQkJLyogQ2hlY2sgZm9yIDU1MTMgY29tcGFiaWxpdHkgbWFwcGluZworCQkJCSAqIFdlIG11c3QgdXNlIHRoaXMsIGVsc2UgdGhlIHBvcnQgZW5hYmxlZCBjb2RlIHdpbGwgZmFpbCwKKwkJCQkgKiBhcyBpdCBleHBlY3RzIHRoZSBlbmFibGViaXRzIGF0IDB4NGEuCisJCQkJICovCisJCQkJaWYgKChpZGVtaXNjICYgMHg0MDAwMDAwMCkgPT0gMCkgeworCQkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1NCwgaWRlbWlzYyB8IDB4NDAwMDAwMDApOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJTSVM1NTEzOiBTd2l0Y2hpbmcgdG8gNTUxMyByZWdpc3RlciBtYXBwaW5nXG4iKTsKKwkJCQl9CisJCQl9CisJfQorCisJaWYgKCFjaGlwc2V0X2ZhbWlseSkgeyAvKiBCZWxvbmdzIHRvIHBjaS1xdWlya3MgKi8KKworCQkJc3RydWN0IHBjaV9kZXYgKmxwY19icmlkZ2U7CisJCQl1MTYgdHJ1ZWlkOworCQkJdTggcHJlZmN0bDsKKwkJCXU4IGlkZWNmZzsKKwkJCXU4IHNicmV2OworCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NGEsICZpZGVjZmcpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgaWRlY2ZnIHwgMHgxMCk7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9ERVZJQ0VfSUQsICZ0cnVlaWQpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgaWRlY2ZnKTsKKworCQkJaWYgKHRydWVpZCA9PSAweDU1MTcpIHsgLyogU2lTIDk2MS85NjFCICovCisKKwkJCQlscGNfYnJpZGdlID0gcGNpX2ZpbmRfc2xvdCgweDAwLCAweDEwKTsgLyogQnVzIDAsIERldiAyLCBGbiAwICovCisJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUobHBjX2JyaWRnZSwgUENJX1JFVklTSU9OX0lELCAmc2JyZXYpOworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0OSwgJnByZWZjdGwpOworCisJCQkJaWYgKHNicmV2ID09IDB4MTAgJiYgKHByZWZjdGwgJiAweDgwKSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJTSVM1NTEzOiBTaVMgOTYxQiBNdVRJT0wgSURFIFVETUExMzMgY29udHJvbGxlclxuIik7CisJCQkJCWNoaXBzZXRfZmFtaWx5ID0gQVRBXzEzM2E7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiU0lTNTUxMzogU2lTIDk2MSBNdVRJT0wgSURFIFVETUExMDAgY29udHJvbGxlclxuIik7CisJCQkJCWNoaXBzZXRfZmFtaWx5ID0gQVRBXzEwMDsKKwkJCQl9CisJCQl9CisJfQorCisJaWYgKCFjaGlwc2V0X2ZhbWlseSkKKwkJcmV0dXJuIC0xOworCisJLyogTWFrZSBnZW5lcmFsIGNvbmZpZyBvcHMgaGVyZQorCSAgIDEvIHRlbGwgSURFIGNoYW5uZWxzIHRvIG9wZXJhdGUgaW4gQ29tcGF0aWJpbGl0eSBtb2RlIG9ubHkKKwkgICAyLyB0ZWxsIG9sZCBjaGlwcyB0byBhbGxvdyBwZXIgZHJpdmUgSURFIHRpbWluZ3MgKi8KKworCXsKKwkJdTggcmVnOworCQl1MTYgcmVndzsKKworCQlzd2l0Y2goY2hpcHNldF9mYW1pbHkpIHsKKwkJCWNhc2UgQVRBXzEzMzoKKwkJCQkvKiBTaVM5NjIgb3BlcmF0aW9uIG1vZGUgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NTAsICZyZWd3KTsKKwkJCQlpZiAocmVndyAmIDB4MDgpCisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTAsIHJlZ3cmMHhmZmY3KTsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NTIsICZyZWd3KTsKKwkJCQlpZiAocmVndyAmIDB4MDgpCisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTIsIHJlZ3cmMHhmZmY3KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVRBXzEzM2E6CisJCQljYXNlIEFUQV8xMDA6CisJCQkJLyogRml4dXAgbGF0ZW5jeSAqLworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKwkJCQkvKiBTZXQgY29tcGF0aWJpbGl0eSBiaXQgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDksICZyZWcpOworCQkJCWlmICghKHJlZyAmIDB4MDEpKSB7CisJCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDksIHJlZ3wweDAxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFUQV8xMDBhOgorCQkJY2FzZSBBVEFfNjY6CisJCQkJLyogRml4dXAgbGF0ZW5jeSAqLworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDEwKTsKKworCQkJCS8qIE9uIEFUQV82NiBjaGlwcyB0aGUgYml0IHdhcyBlbHNld2hlcmUgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTIsICZyZWcpOworCQkJCWlmICghKHJlZyAmIDB4MDQpKSB7CisJCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTIsIHJlZ3wweDA0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFUQV8zMzoKKwkJCQkvKiBPbiBBVEFfMzMgd2UgZGlkbid0IGhhdmUgYSBzaW5nbGUgYml0IHRvIHNldCAqLworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHgwOSwgJnJlZyk7CisJCQkJaWYgKChyZWcgJiAweDBmKSAhPSAweDAwKSB7CisJCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4MDksIHJlZyYweGYwKTsKKwkJCQl9CisJCQljYXNlIEFUQV8xNjoKKwkJCQkvKiBmb3JjZSBwZXIgZHJpdmUgcmVjb3ZlcnkgYW5kIGFjdGl2ZSB0aW1pbmdzCisJCQkJICAgbmVlZGVkIG9uIEFUQV8zMyBhbmQgYmVsb3cgY2hpcHMgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTIsICZyZWcpOworCQkJCWlmICghKHJlZyAmIDB4MDgpKSB7CisJCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTIsIHJlZ3wweDA4KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKworI2lmIGRlZmluZWQoRElTUExBWV9TSVNfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKwkJaWYgKCFzaXNfcHJvYykgeworCQkJc2lzX3Byb2MgPSAxOworCQkJYm1pZGVfZGV2ID0gZGV2OworCQkJaWRlX3BjaV9jcmVhdGVfaG9zdF9wcm9jKCJzaXMiLCBzaXNfZ2V0X2luZm8pOworCQl9CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc2lzNTUxMyAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1OCBhdGE2NiA9IDA7CisKKwlpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzEzMykgeworCQl1MTYgcmVndyA9IDA7CisJCXUxNiByZWdfYWRkciA9IGh3aWYtPmNoYW5uZWwgPyAweDUyOiAweDUwOworCQlwY2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCByZWdfYWRkciwgJnJlZ3cpOworCQlhdGE2NiA9IChyZWd3ICYgMHg4MDAwKSA/IDAgOiAxOworCX0gZWxzZSBpZiAoY2hpcHNldF9mYW1pbHkgPj0gQVRBXzY2KSB7CisJCXU4IHJlZzQ4aCA9IDA7CisJCXU4IG1hc2sgPSBod2lmLT5jaGFubmVsID8gMHgyMCA6IDB4MTA7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NDgsICZyZWc0OGgpOworCQlhdGE2NiA9IChyZWc0OGggJiBtYXNrKSA/IDAgOiAxOworCX0KKyAgICAgICAgcmV0dXJuIGF0YTY2OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3NpczU1MTMgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YXV0b2RtYSA9IDA7CisKKwlpZiAoIWh3aWYtPmlycSkKKwkJaHdpZi0+aXJxID0gaHdpZi0+Y2hhbm5lbCA/IDE1IDogMTQ7CisKKwlod2lmLT50dW5lcHJvYyA9ICZzaXM1NTEzX3R1bmVfZHJpdmU7CisJaHdpZi0+c3BlZWRwcm9jID0gJnNpczU1MTNfdHVuZV9jaGlwc2V0OworCisJaWYgKCEoaHdpZi0+ZG1hX2Jhc2UpKSB7CisJCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCWh3aWYtPnVsdHJhX21hc2sgPSAweDdmOworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA3OworCisJaWYgKCFjaGlwc2V0X2ZhbWlseSkKKwkJcmV0dXJuOworCisJaWYgKCEoaHdpZi0+dWRtYV9mb3VyKSkKKwkJaHdpZi0+dWRtYV9mb3VyID0gYXRhNjZfc2lzNTUxMyhod2lmKTsKKworCWlmIChjaGlwc2V0X2ZhbWlseSA+IEFUQV8xNikgeworCQlod2lmLT5pZGVfZG1hX2NoZWNrID0gJnNpczU1MTNfY29uZmlnX3hmZXJfcmF0ZTsKKwkJaWYgKCFub2F1dG9kbWEpCisJCQlod2lmLT5hdXRvZG1hID0gMTsKKwl9CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IHNpczU1MTNfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJTSVM1NTEzIiwKKwkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X3NpczU1MTMsCisJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9zaXM1NTEzLAorCS5jaGFubmVscwk9IDIsCisJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCisJLmVuYWJsZWJpdHMJPSB7ezB4NGEsMHgwMiwweDAyfSwgezB4NGEsMHgwNCwweDA0fX0sCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM1NTEzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCAmc2lzNTUxM19jaGlwc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczU1MTNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81NTEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTUxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaXM1NTEzX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJTSVNfSURFIiwKKwkuaWRfdGFibGUJPSBzaXM1NTEzX3BjaV90YmwsCisJLnByb2JlCQk9IHNpczU1MTNfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHNpczU1MTNfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNpczU1MTNfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJMaW9uZWwgQm91dG9uLCBMIEMgQ2hhbmcsIEFuZHJlIEhlZHJpY2ssIFZvanRlY2ggUGF2bGlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBTSVMgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBUT0RPOgorICoJLSBDTEVBTlVQCisgKgktIFVzZSBkcml2ZXJzL2lkZS9pZGUtdGltaW5nLmggIQorICoJLSBNb3JlIGNoZWNrcyBpbiB0aGUgY29uZmlnIHJlZ2lzdGVycyAoZm9yY2UgdmFsdWVzIGluc3RlYWQgb2YKKyAqCSAgcmVseWluZyBvbiB0aGUgQklPUyBzZXR0aW5nIHRoZW0gY29ycmVjdGx5KS4KKyAqCS0gRnVydGhlciBvcHRpbWlzYXRpb25zID8KKyAqCSAgLiBmb3IgZXhhbXBsZSBBVEE2NisgcmVncyAweDQ4ICYgMHg0QQorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYyBiL2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTcwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jCisgKgorICogU0w4MkMxMDUvV2luYm9uZCA1NTMgSURFIGRyaXZlcgorICoKKyAqIE1haW50YWluZXIgdW5rbm93bi4KKyAqCisgKiBEcml2ZSB0dW5pbmcgYWRkZWQgZnJvbSBSZWJlbC5jb20ncyBrZXJuZWwgc291cmNlcworICogIC0tIFJ1c3NlbGwgS2luZyAoMTUvMTEvOTgpIGxpbnV4QGFybS5saW51eC5vcmcudWsKKyAqIAorICogTWVyZ2UgaW4gUnVzc2VsbCdzIEhXIHdvcmthcm91bmRzLCBmaXggdmFyaW91cyBwcm9ibGVtcworICogd2l0aCB0aGUgdGltaW5nIHJlZ2lzdGVycyBzZXR1cC4KKyAqICAtLSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0ICgwMS8xMS8wMykgYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGFyZykgcHJpbnRrIGFyZworI2Vsc2UKKyNkZWZpbmUgREJHKGZtdCwuLi4pCisjZW5kaWYKKy8qCisgKiBTTDgyQzEwNSBQQ0kgY29uZmlnIHJlZ2lzdGVyIDB4NDAgYml0cy4KKyAqLworI2RlZmluZSBDVFJMX0lERV9JUlFCICAgKDEgPDwgMzApCisjZGVmaW5lIENUUkxfSURFX0lSUUEgICAoMSA8PCAyOCkKKyNkZWZpbmUgQ1RSTF9MRUdJUlEgICAgICgxIDw8IDExKQorI2RlZmluZSBDVFJMX1AxRjE2ICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQ1RSTF9QMUVOICAgICAgICgxIDw8IDQpCisjZGVmaW5lIENUUkxfUDBGMTYgICAgICAoMSA8PCAxKQorI2RlZmluZSBDVFJMX1AwRU4gICAgICAgKDEgPDwgMCkKKworLyoKKyAqIENvbnZlcnQgYSBQSU8gbW9kZSBhbmQgY3ljbGUgdGltZSB0byB0aGUgcmVxdWlyZWQgb24vb2ZmCisgKiB0aW1lcyBmb3IgdGhlIGludGVyZmFjZS4gIFRoaXMgaGFzIHByb3RlY3Rpb24gYWdhaW5zdCBydW4tYXdheQorICogdGltaW5ncy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfdGltaW5nX3NsODJjMTA1KGlkZV9waW9fZGF0YV90ICpwKQoreworCXVuc2lnbmVkIGludCBjbWRfb247CisJdW5zaWduZWQgaW50IGNtZF9vZmY7CisKKwljbWRfb24gPSAoaWRlX3Bpb190aW1pbmdzW3AtPnBpb19tb2RlXS5hY3RpdmVfdGltZSArIDI5KSAvIDMwOworCWNtZF9vZmYgPSAocC0+Y3ljbGVfdGltZSAtIDMwICogY21kX29uICsgMjkpIC8gMzA7CisKKwlpZiAoY21kX29uID4gMzIpCisJCWNtZF9vbiA9IDMyOworCWlmIChjbWRfb24gPT0gMCkKKwkJY21kX29uID0gMTsKKworCWlmIChjbWRfb2ZmID4gMzIpCisJCWNtZF9vZmYgPSAzMjsKKwlpZiAoY21kX29mZiA9PSAwKQorCQljbWRfb2ZmID0gMTsKKworCXJldHVybiAoY21kX29uIC0gMSkgPDwgOCB8IChjbWRfb2ZmIC0gMSkgfCAocC0+dXNlX2lvcmR5ID8gMHg0MCA6IDB4MDApOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBkcml2ZSBhbmQgY2hpcHNldCBmb3IgUElPCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ19mb3JfcGlvKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHBpbywgaW50IHJlcG9ydCwgaW50IGNoaXBzZXRfb25seSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisJaWRlX3Bpb19kYXRhX3QgcDsKKwl1MTYgZHJ2X2N0cmwgPSAweDkwOTsKKwl1bnNpZ25lZCBpbnQgeGZlcl9tb2RlLCByZWc7CisKKwlEQkcoKCJjb25maWdfZm9yX3Bpbyhkcml2ZTolcywgcGlvOiVkLCByZXBvcnQ6JWQsIGNoaXBzZXRfb25seTolZClcbiIsCisJCWRyaXZlLT5uYW1lLCBwaW8sIHJlcG9ydCwgY2hpcHNldF9vbmx5KSk7CisJCQorCXJlZyA9IChod2lmLT5jaGFubmVsID8gMHg0YyA6IDB4NDQpICsgKGRyaXZlLT5zZWxlY3QuYi51bml0ID8gNCA6IDApOworCisJcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCBwaW8sIDUsICZwKTsKKworCXhmZXJfbW9kZSA9IFhGRVJfUElPXzAgKyBwaW87CisKKwlpZiAoY2hpcHNldF9vbmx5IHx8IGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHhmZXJfbW9kZSkgPT0gMCkgeworCQlkcnZfY3RybCA9IGdldF90aW1pbmdfc2w4MmMxMDUoJnApOworCQlkcml2ZS0+cGlvX3NwZWVkID0geGZlcl9tb2RlOworCX0gZWxzZQorCQlkcml2ZS0+cGlvX3NwZWVkID0gWEZFUl9QSU9fMDsKKworCWlmIChkcml2ZS0+dXNpbmdfZG1hID09IDApIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIGFjdHVhbGx5IHVzaW5nIE1XIERNQSwgdGhlbiB3ZSBjYW4gbm90CisJCSAqIHJlcHJvZ3JhbSB0aGUgaW50ZXJmYWNlIGRyaXZlIGNvbnRyb2wgcmVnaXN0ZXIuCisJCSAqLworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCByZWcsIGRydl9jdHJsKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCByZWcsICZkcnZfY3RybCk7CisKKwkJaWYgKHJlcG9ydCkgeworCQkJcHJpbnRrKCIlczogc2VsZWN0ZWQgJXMgKCVkbnMpICglMDRYKVxuIiwgZHJpdmUtPm5hbWUsCisJCQkgICAgICAgaWRlX3hmZXJfdmVyYm9zZSh4ZmVyX21vZGUpLCBwLmN5Y2xlX3RpbWUsIGRydl9jdHJsKTsKKwkJfQorCX0KK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgZHJpdmUgYW5kIHRoZSBjaGlwc2V0IGZvciBETUEKKyAqLworc3RhdGljIGludCBjb25maWdfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJREJHKCgiY29uZmlnX2Zvcl9kbWEoZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOworCisJcmVnID0gKGh3aWYtPmNoYW5uZWwgPyAweDRjIDogMHg0NCkgKyAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgPyA0IDogMCk7CisKKwlpZiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgWEZFUl9NV19ETUFfMikgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCByZWcsIDB4MDI0MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZHJpdmUgYW5kCisgKiBjaGlwc2V0IGlzIGNhcGFibGUgb2YgRE1BIG1vZGUKKyAqLworCitzdGF0aWMgaW50IHNsODJjMTA1X2NoZWNrX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCisJREJHKCgic2w4MmMxMDVfY2hlY2tfZHJpdmUoZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOworCisJZG8geworCQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisKKwkJaWYgKCFkcml2ZS0+YXV0b2RtYSkKKwkJCWJyZWFrOworCisJCWlmICghaWQgfHwgIShpZC0+Y2FwYWJpbGl0eSAmIDEpKQorCQkJYnJlYWs7CisKKwkJLyogQ29uc3VsdCB0aGUgbGlzdCBvZiBrbm93biAiYmFkIiBkcml2ZXMgKi8KKwkJaWYgKF9faWRlX2RtYV9iYWRfZHJpdmUoZHJpdmUpKQorCQkJYnJlYWs7CisKKwkJaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpIHsKKwkJCWlmICgoaWQtPmRtYV9td29yZCAmIGh3aWYtPm13ZG1hX21hc2spIHx8CisJCQkgICAgKGlkLT5kbWFfMXdvcmQgJiBod2lmLT5zd2RtYV9tYXNrKSkKKwkJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJCX0KKworCQlpZiAoX19pZGVfZG1hX2dvb2RfZHJpdmUoZHJpdmUpKQorCQkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworfQorCisvKgorICogVGhlIFNMODJDMTA1IGhvbGRzIG9mZiBhbGwgSURFIGludGVycnVwdHMgd2hpbGUgaW4gRE1BIG1vZGUgdW50aWwKKyAqIGFsbCBETUEgYWN0aXZpdHkgaXMgY29tcGxldGVkLiAgU29tZXRpbWVzIHRoaXMgY2F1c2VzIHByb2JsZW1zIChlZywKKyAqIHdoZW4gdGhlIGRyaXZlIHdhbnRzIHRvIHJlcG9ydCBhbiBlcnJvciBjb25kaXRpb24pLgorICoKKyAqIDB4N2UgaXMgYSAiY2hpcCB0ZXN0aW5nIiByZWdpc3Rlci4gIEJpdCAyIHJlc2V0cyB0aGUgRE1BIGNvbnRyb2xsZXIKKyAqIHN0YXRlIG1hY2hpbmUuICBXZSBuZWVkIHRvIGtpY2sgdGhpcyB0byB3b3JrIGFyb3VuZCB2YXJpb3VzIGJ1Z3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbDgyYzEwNV9yZXNldF9ob3N0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IHZhbDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg3ZSwgJnZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg3ZSwgdmFsIHwgKDEgPDwgMikpOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4N2UsIHZhbCAmIH4oMSA8PCAyKSk7Cit9CisKKy8qCisgKiBJZiB3ZSBnZXQgYW4gSVJRIHRpbWVvdXQsIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIERNQSBzdGF0ZSBtYWNoaW5lCisgKiBnb3QgY29uZnVzZWQuICBGaXggZnJvbSBUb2RkIEluZ2xldHQuICBEZXRhaWxzIGZyb20gV2luYm9uZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBJREUgdGltZXIgZXhwaXJlcywgdGhlIGRyaXZlCisgKiBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBSRUFEWSwgYW5kIHdlIHdlcmUgd2FpdGluZyBmb3IgRE1BIHRvIGNvbXBsZXRlLgorICovCitzdGF0aWMgaW50IHNsODJjMTA1X2lkZV9kbWFfbG9zdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1MzIgdmFsLCBtYXNrID0gaHdpZi0+Y2hhbm5lbCA/IENUUkxfSURFX0lSUUIgOiBDVFJMX0lERV9JUlFBOworCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBod2lmLT5kbWFfYmFzZTsKKworCXByaW50aygic2w4MmMxMDU6IGxvc3QgSVJROiByZXNldHRpbmcgaG9zdFxuIik7CisKKwkvKgorCSAqIENoZWNrIHRoZSByYXcgaW50ZXJydXB0IGZyb20gdGhlIGRyaXZlLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDAsICZ2YWwpOworCWlmICh2YWwgJiBtYXNrKQorCQlwcmludGsoInNsODJjMTA1OiBkcml2ZSB3YXMgcmVxdWVzdGluZyBJUlEsIGJ1dCBob3N0IGxvc3QgaXRcbiIpOworCisJLyoKKwkgKiBXYXMgRE1BIGVuYWJsZWQ/ICBJZiBzbywgZGlzYWJsZSBpdCAtIHdlJ3JlIHJlc2V0dGluZyB0aGUKKwkgKiBob3N0LiAgVGhlIElERSBsYXllciB3aWxsIGJlIGhhbmRsaW5nIHRoZSBkcml2ZSBmb3IgdXMuCisJICovCisJdmFsID0gaHdpZi0+SU5CKGRtYV9iYXNlKTsKKwlpZiAodmFsICYgMSkgeworCQlvdXRiKHZhbCAmIH4xLCBkbWFfYmFzZSk7CisJCXByaW50aygic2w4MmMxMDU6IERNQSB3YXMgZW5hYmxlZFxuIik7CisJfQorCisJc2w4MmMxMDVfcmVzZXRfaG9zdChkZXYpOworCisJLyogaWRlX2RtYXByb2Mgd291bGQgcmV0dXJuIDEsIHNvIHdlIGRvIGFzIHdlbGwgKi8KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEFUQVBJIGRldmljZXMgY2FuIGNhdXNlIHRoZSBTTDgyQzEwNSBETUEgc3RhdGUgbWFjaGluZSB0byBnbyBnYWdhLgorICogV2luYm9uZCByZWNvbW1lbmQgdGhhdCB0aGUgRE1BIHN0YXRlIG1hY2hpbmUgaXMgcmVzZXQgcHJpb3IgdG8KKyAqIHNldHRpbmcgdGhlIGJ1cyBtYXN0ZXIgRE1BIGVuYWJsZSBiaXQuCisgKgorICogVGhlIGdlbmVyaWMgSURFIGNvcmUgd2lsbCBoYXZlIGRpc2FibGVkIHRoZSBCTUVOIGJpdCBiZWZvcmUgdGhpcworICogZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBzbDgyYzEwNV9pZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisKKwlzbDgyYzEwNV9yZXNldF9ob3N0KGRldik7CisJaWRlX2RtYV9zdGFydChkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2w4MmMxMDVfaWRlX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisKKwlEQkcoKCJzbDgyYzEwNV9pZGVfZG1hX3RpbWVvdXQoZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOworCisJc2w4MmMxMDVfcmVzZXRfaG9zdChkZXYpOworCXJldHVybiBfX2lkZV9kbWFfdGltZW91dChkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2w4MmMxMDVfaWRlX2RtYV9vbiAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCURCRygoInNsODJjMTA1X2lkZV9kbWFfb24oZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOworCisJaWYgKGNvbmZpZ19mb3JfZG1hKGRyaXZlKSkgeworCQljb25maWdfZm9yX3Bpbyhkcml2ZSwgNCwgMCwgMCk7CisJCXJldHVybiBIV0lGKGRyaXZlKS0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBETUEgZW5hYmxlZFxuIiwgZHJpdmUtPm5hbWUpOworCXJldHVybiBfX2lkZV9kbWFfb24oZHJpdmUpOworfQorCitzdGF0aWMgaW50IHNsODJjMTA1X2lkZV9kbWFfb2ZmX3F1aWV0bHkgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBzcGVlZCA9IFhGRVJfUElPXzA7CisJaW50IHJjOworCQorCURCRygoInNsODJjMTA1X2lkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOworCisJcmMgPSBfX2lkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworCWlmIChkcml2ZS0+cGlvX3NwZWVkKQorCQlzcGVlZCA9IGRyaXZlLT5waW9fc3BlZWQgLSBYRkVSX1BJT18wOworCWNvbmZpZ19mb3JfcGlvKGRyaXZlLCBzcGVlZCwgMCwgMSk7CisJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBkcml2ZS0+cGlvX3NwZWVkOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogT2ssIHRoYXQgaXMgbmFzdHksIGJ1dCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGUgRE1BIHRpbWluZ3MKKyAqIHdvbid0IGJlIHVzZWQgZm9yIGEgUElPIGFjY2Vzcy4gVGhlIHNvbHV0aW9uIGhlcmUgaXMKKyAqIHRvIG1ha2Ugc3VyZSB0aGUgMTYgYml0cyBtb2RlIGlzIGRpYWJsZWQgb24gdGhlIGNoYW5uZWwKKyAqIHdoZW4gRE1BIGlzIGVuYWJsZWQsIHRodXMgY2F1c2luZyB0aGUgY2hpcCB0byB1c2UgUElPMAorICogdGltaW5ncyBmb3IgdGhvc2Ugb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgc2w4MmMxMDVfc2VsZWN0cHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OworCXUzMiB2YWwsIG9sZCwgbWFzazsKKworCS8vREJHKCgic2w4MmMxMDVfc2VsZWN0cHJvYyhkcml2ZTolcylcbiIsIGRyaXZlLT5uYW1lKSk7CisKKwltYXNrID0gaHdpZi0+Y2hhbm5lbCA/IENUUkxfUDFGMTYgOiBDVFJMX1AwRjE2OworCW9sZCA9IHZhbCA9ICooKHUzMiAqKSZod2lmLT5od2lmX2RhdGEpOworCWlmIChkcml2ZS0+dXNpbmdfZG1hKQorCQl2YWwgJj0gfm1hc2s7CisJZWxzZQorCQl2YWwgfD0gbWFzazsKKwlpZiAob2xkICE9IHZhbCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgdmFsKTsJCisJCSooKHUzMiAqKSZod2lmLT5od2lmX2RhdGEpID0gdmFsOworCX0KK30KKworLyoKKyAqIEFUQSByZXNldCB3aWxsIGNsZWFyIHRoZSAxNiBiaXRzIG1vZGUgaW4gdGhlIGNvbnRyb2wKKyAqIHJlZ2lzdGVyLCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgY2FjaGUKKyAqLworc3RhdGljIHZvaWQgc2w4MmMxMDVfcmVzZXRwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisJdTMyIHZhbDsKKworCURCRygoInNsODJjMTA1X3Jlc2V0cHJvYyhkcml2ZTolcylcbiIsIGRyaXZlLT5uYW1lKSk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmdmFsKTsKKwkqKCh1MzIgKikmaHdpZi0+aHdpZl9kYXRhKSA9IHZhbDsKK30KKwkKKy8qCisgKiBXZSBvbmx5IGRlYWwgd2l0aCBQSU8gbW9kZSBoZXJlIC0gRE1BIG1vZGUgJ3VzaW5nX2RtYScgaXMgbm90CisgKiBpbml0aWFsaXNlZCBhdCB0aGUgcG9pbnQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgdHVuZV9zbDgyYzEwNShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlEQkcoKCJ0dW5lX3NsODJjMTA1KGRyaXZlOiVzKVxuIiwgZHJpdmUtPm5hbWUpKTsKKworCWNvbmZpZ19mb3JfcGlvKGRyaXZlLCBwaW8sIDEsIDApOworCisJLyoKKwkgKiBXZSBzdXBwb3J0IDMyLWJpdCBJL08gb24gdGhpcyBpbnRlcmZhY2UsIGFuZCBpdAorCSAqIGRvZXNuJ3QgaGF2ZSBwcm9ibGVtcyB3aXRoIGludGVycnVwdHMuCisJICovCisJZHJpdmUtPmlvXzMyYml0ID0gMTsKKwlkcml2ZS0+dW5tYXNrID0gMTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcmV2aXNpb24gb2YgdGhlIFdpbmJvbmQgYnJpZGdlCisgKiB3aGljaCB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2w4MmMxMDVfYnJpZGdlX3JldmlzaW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKKwl1OCByZXY7CisKKwkvKgorCSAqIFRoZSBicmlkZ2Ugc2hvdWxkIGJlIHBhcnQgb2YgdGhlIHNhbWUgZGV2aWNlLCBidXQgZnVuY3Rpb24gMC4KKwkgKi8KKwlicmlkZ2UgPSBwY2lfZmluZF9zbG90KGRldi0+YnVzLT5udW1iZXIsCisJCQkgICAgICAgUENJX0RFVkZOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCAwKSk7CisJaWYgKCFicmlkZ2UpCisJCXJldHVybiAtMTsKKworCS8qCisJICogTWFrZSBzdXJlIGl0IGlzIGEgV2luYm9uZCA1NTMgYW5kIGlzIGFuIElTQSBicmlkZ2UuCisJICovCisJaWYgKGJyaWRnZS0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfV0lOQk9ORCB8fAorCSAgICBicmlkZ2UtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1dJTkJPTkRfODNDNTUzIHx8CisJICAgIGJyaWRnZS0+Y2xhc3MgPj4gOCAhPSBQQ0lfQ0xBU1NfQlJJREdFX0lTQSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGZpbmQgZnVuY3Rpb24gMCdzIHJldmlzaW9uLCBub3QgZnVuY3Rpb24gMQorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKKworCXJldHVybiByZXY7Cit9CisKKy8qCisgKiBFbmFibGUgdGhlIFBDSSBkZXZpY2UKKyAqIAorICogLS1CZW5IOiBJdCdzIGFyY2ggZml4dXAgY29kZSB0aGF0IHNob3VsZCBlbmFibGUgY2hhbm5lbHMgdGhhdAorICogaGF2ZSBub3QgYmVlbiBlbmFibGVkIGJ5IGZpcm13YXJlLiBJIGRlY2lkZWQgd2UgY2FuIHN0aWxsIGVuYWJsZQorICogY2hhbm5lbCAwIGhlcmUgYXQgbGVhc3QsIGJ1dCBjaGFubmVsIDEgaGFzIHRvIGJlIGVuYWJsZWQgYnkKKyAqIGZpcm13YXJlIG9yIGFyY2ggY29kZS4gV2Ugc3RpbGwgc2V0IGJvdGggdG8gMTYgYml0cyBtb2RlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfc2w4MmMxMDUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbXNnKQoreworCXUzMiB2YWw7CisKKwlEQkcoKCJpbml0X2NoaXBzZXRfc2w4MmMxMDUoKVxuIikpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnZhbCk7CisJdmFsIHw9IENUUkxfUDBFTiB8IENUUkxfUDBGMTYgfCBDVFJMX1AxRjE2OworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCB2YWwpOworCisJcmV0dXJuIGRldi0+aXJxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9kbWFfc2w4MmMxMDUoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFfYmFzZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV2OworCXU4IGRtYV9zdGF0ZTsKKworCURCRygoImluaXRfZG1hX3NsODJjMTA1KGh3aWY6IGlkZSVkLCBkbWFfYmFzZTogMHglMDh4KVxuIiwgaHdpZi0+aW5kZXgsIGRtYV9iYXNlKSk7CisKKwlod2lmLT5hdXRvZG1hID0gMDsKKworCWlmICghZG1hX2Jhc2UpCisJCXJldHVybjsKKworCWRtYV9zdGF0ZSA9IGh3aWYtPklOQihkbWFfYmFzZSArIDIpOworCXJldiA9IHNsODJjMTA1X2JyaWRnZV9yZXZpc2lvbihod2lmLT5wY2lfZGV2KTsKKwlpZiAocmV2IDw9IDUpIHsKKwkJcHJpbnRrKCIgICAgJXM6IFdpbmJvbmQgNTUzIGJyaWRnZSByZXZpc2lvbiAlZCwgQk0tRE1BIGRpc2FibGVkXG4iLAorCQkgICAgICAgaHdpZi0+bmFtZSwgcmV2KTsKKwkJZG1hX3N0YXRlICY9IH4weDYwOworCX0gZWxzZSB7CisJCWRtYV9zdGF0ZSB8PSAweDYwOworCQlpZiAoIW5vYXV0b2RtYSkKKwkJCWh3aWYtPmF1dG9kbWEgPSAxOworCX0KKwlod2lmLT5PVVRCKGRtYV9zdGF0ZSwgZG1hX2Jhc2UgKyAyKTsKKworCWlkZV9zZXR1cF9kbWEoaHdpZiwgZG1hX2Jhc2UsIDgpOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgY2hpcAorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfc2w4MmMxMDUoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwl1MzIgdmFsOworCQorCURCRygoImluaXRfaHdpZl9zbDgyYzEwNShod2lmOiBpZGUlZClcbiIsIGh3aWYtPmluZGV4KSk7CisKKwlod2lmLT50dW5lcHJvYyA9IHR1bmVfc2w4MmMxMDU7CisJaHdpZi0+c2VsZWN0cHJvYyA9IHNsODJjMTA1X3NlbGVjdHByb2M7CisJaHdpZi0+cmVzZXRwcm9jID0gc2w4MmMxMDVfcmVzZXRwcm9jOworCQorCS8qIERlZmF1bHQgdG8gUElPIDAgZm9yIGZhbGxiYWNrIHVubGVzcyB0dW5lZCBvdGhlcndpc2UsCisJICogd2UgYWx3YXlzIGF1dG90dW5lIFBJTywgdGhpcyBpcyBkb25lIGJlZm9yZSBETUEgaXMKKwkgKiBjaGVja2VkLCBzbyB0aGVyZSBpcyBubyByaXNrIG9mIGFjY2lkZW50YWxseSBkaXNhYmxpbmcKKwkgKiBETUEKKwkgICovCisJaHdpZi0+ZHJpdmVzWzBdLnBpb19zcGVlZCA9IFhGRVJfUElPXzA7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gMTsKKwlod2lmLT5kcml2ZXNbMV0ucGlvX3NwZWVkID0gWEZFUl9QSU9fMTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSAxOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnZhbCk7CisJKigodTMyICopJmh3aWYtPmh3aWZfZGF0YSkgPSB2YWw7CisJCisJaWYgKCFod2lmLT5kbWFfYmFzZSkKKwkJcmV0dXJuOworCisJaHdpZi0+YXRhcGlfZG1hID0gMTsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQQorCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmc2w4MmMxMDVfY2hlY2tfZHJpdmU7CisJaHdpZi0+aWRlX2RtYV9vbiA9ICZzbDgyYzEwNV9pZGVfZG1hX29uOworCWh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkgPSAmc2w4MmMxMDVfaWRlX2RtYV9vZmZfcXVpZXRseTsKKwlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmc2w4MmMxMDVfaWRlX2RtYV9sb3N0X2lycTsKKwlod2lmLT5kbWFfc3RhcnQgPSAmc2w4MmMxMDVfaWRlX2RtYV9zdGFydDsKKwlod2lmLT5pZGVfZG1hX3RpbWVvdXQgPSAmc2w4MmMxMDVfaWRlX2RtYV90aW1lb3V0OworCisJaWYgKCFub2F1dG9kbWEpCisJCWh3aWYtPmF1dG9kbWEgPSAxOworCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKwlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BICovCit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IHNsODJjMTA1X2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKKwkubmFtZQkJPSAiVzgyQzEwNSIsCisJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9zbDgyYzEwNSwKKwkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3NsODJjMTA1LAorCS5pbml0X2RtYQk9IGluaXRfZG1hX3NsODJjMTA1LAorCS5jaGFubmVscwk9IDIsCisJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCisJLmVuYWJsZWJpdHMJPSB7ezB4NDAsMHgwMSwweDAxfSwgezB4NDAsMHgxMCwweDEwfX0sCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbDgyYzEwNV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJnNsODJjMTA1X2NoaXBzZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2w4MmMxMDVfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9XSU5CT05ELCBQQ0lfREVWSUNFX0lEX1dJTkJPTkRfODJDMTA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNsODJjMTA1X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJXODJDMTA1X0lERSIsCisJLmlkX3RhYmxlCT0gc2w4MmMxMDVfcGNpX3RibCwKKwkucHJvYmUJCT0gc2w4MmMxMDVfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHNsODJjMTA1X2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzbDgyYzEwNV9pZGVfaW5pdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIFc4MkMxMDUgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYyBiL2RyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmYzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYwlWZXJzaW9uIDAuMTEJU2VwdGVtYmVyIDExLCAyMDAyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKgorICogVGhpcyBhIGxvb2stYS1saWtlIHZhcmlhdGlvbiBvZiB0aGUgSUNIMCBQSUlYNCBVbHRyYS02NiwKKyAqIGJ1dCB0aGlzIGtlZXBzIHRoZSBJU0EtQnJpZGdlIGFuZCBzbG90cyBhbGl2ZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgdTggc2xjOTBlNjZfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBtb2RlCT0gMjsKKworCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKKwkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB1OCBzbGM5MGU2Nl9kbWFfMl9waW8gKHU4IHhmZXJfcmF0ZSkgeworCXN3aXRjaCh4ZmVyX3JhdGUpIHsKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMzoKKwkJY2FzZSBYRkVSX1VETUFfMjoKKwkJY2FzZSBYRkVSX1VETUFfMToKKwkJY2FzZSBYRkVSX1VETUFfMDoKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQljYXNlIFhGRVJfUElPXzQ6CisJCQlyZXR1cm4gNDsKKwkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQljYXNlIFhGRVJfUElPXzM6CisJCQlyZXR1cm4gMzsKKwkJY2FzZSBYRkVSX1NXX0RNQV8yOgorCQljYXNlIFhGRVJfUElPXzI6CisJCQlyZXR1cm4gMjsKKwkJY2FzZSBYRkVSX01XX0RNQV8wOgorCQljYXNlIFhGRVJfU1dfRE1BXzE6CisJCWNhc2UgWEZFUl9TV19ETUFfMDoKKwkJY2FzZSBYRkVSX1BJT18xOgorCQljYXNlIFhGRVJfUElPXzA6CisJCWNhc2UgWEZFUl9QSU9fU0xPVzoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICBCYXNlZCBvbiBzZXR0aW5ncyBkb25lIGJ5IEFNSSBCSU9TCisgKiAgKG1pZ2h0IGJlIHVzZWZ1bCBpZiBkcml2ZSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBDTU9TIGZvciBhbnkgcmVhc29uKS4KKyAqLworc3RhdGljIHZvaWQgc2xjOTBlNjZfdHVuZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCWludCBpc19zbGF2ZQkJPSAoJmh3aWYtPmRyaXZlc1sxXSA9PSBkcml2ZSk7CisJaW50IG1hc3Rlcl9wb3J0CQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKKwlpbnQgc2xhdmVfcG9ydAkJPSAweDQ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IG1hc3Rlcl9kYXRhOworCXU4IHNsYXZlX2RhdGE7CisJCQkJIC8qIElTUCAgUlRDICovCisJdTggdGltaW5nc1tdWzJdCT0geyB7IDAsIDAgfSwKKwkJCQkgICAgeyAwLCAwIH0sCisJCQkJICAgIHsgMSwgMCB9LAorCQkJCSAgICB7IDIsIDEgfSwKKwkJCQkgICAgeyAyLCAzIH0sIH07CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNSwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtYXN0ZXJfcG9ydCwgJm1hc3Rlcl9kYXRhKTsKKwlpZiAoaXNfc2xhdmUpIHsKKwkJbWFzdGVyX2RhdGEgPSBtYXN0ZXJfZGF0YSB8IDB4NDAwMDsKKwkJaWYgKHBpbyA+IDEpCisJCQkvKiBlbmFibGUgUFBFLCBJRSBhbmQgVElNRSAqLworCQkJbWFzdGVyX2RhdGEgPSBtYXN0ZXJfZGF0YSB8IDB4MDA3MDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCAmc2xhdmVfZGF0YSk7CisJCXNsYXZlX2RhdGEgPSBzbGF2ZV9kYXRhICYgKGh3aWYtPmNoYW5uZWwgPyAweDBmIDogMHhmMCk7CisJCXNsYXZlX2RhdGEgPSBzbGF2ZV9kYXRhIHwgKCgodGltaW5nc1twaW9dWzBdIDw8IDIpIHwgdGltaW5nc1twaW9dWzFdKSA8PCAoaHdpZi0+Y2hhbm5lbCA/IDQgOiAwKSk7CisJfSBlbHNlIHsKKwkJbWFzdGVyX2RhdGEgPSBtYXN0ZXJfZGF0YSAmIDB4Y2NmODsKKwkJaWYgKHBpbyA+IDEpCisJCQkvKiBlbmFibGUgUFBFLCBJRSBhbmQgVElNRSAqLworCQkJbWFzdGVyX2RhdGEgPSBtYXN0ZXJfZGF0YSB8IDB4MDAwNzsKKwkJbWFzdGVyX2RhdGEgPSBtYXN0ZXJfZGF0YSB8ICh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwgKHRpbWluZ3NbcGlvXVsxXSA8PCA4KTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsIG1hc3Rlcl9kYXRhKTsKKwlpZiAoaXNfc2xhdmUpCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsIHNsYXZlX2RhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2xjOTBlNjZfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CisJdTggbWFzbGF2ZQkJPSBod2lmLT5jaGFubmVsID8gMHg0MiA6IDB4NDA7CisJdTggc3BlZWQJPSBpZGVfcmF0ZV9maWx0ZXIoc2xjOTBlNjZfcmF0ZW1hc2soZHJpdmUpLCB4ZmVyc3BlZWQpOworCWludCBzaXRyZSA9IDAsIGFfc3BlZWQJPSA3IDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpbnQgdV9zcGVlZCA9IDAsIHVfZmxhZyA9IDEgPDwgZHJpdmUtPmRuOworCXUxNgkJCXJlZzQwNDIsIHJlZzQ0LCByZWc0OCwgcmVnNGE7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1hc2xhdmUsICZyZWc0MDQyKTsKKwlzaXRyZSA9IChyZWc0MDQyICYgMHg0MDAwKSA/IDEgOiAwOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0NCwgJnJlZzQ0KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDgsICZyZWc0OCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmcmVnNGEpOworCisJc3dpdGNoKHNwZWVkKSB7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCisJCWNhc2UgWEZFUl9VRE1BXzQ6CXVfc3BlZWQgPSA0IDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzM6CXVfc3BlZWQgPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzI6CXVfc3BlZWQgPSAyIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzE6CXVfc3BlZWQgPSAxIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXVfc3BlZWQgPSAwIDw8IChkcml2ZS0+ZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzI6CWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQSAqLworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzA6ICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3BlZWQgPj0gWEZFUl9VRE1BXzApIHsKKwkJaWYgKCEocmVnNDggJiB1X2ZsYWcpKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0OCwgcmVnNDh8dV9mbGFnKTsKKwkJLyogRklYTUU6IChyZWc0YSAmIGFfc3BlZWQpID8gKi8KKwkJaWYgKChyZWc0YSAmIHVfc3BlZWQpICE9IHVfc3BlZWQpIHsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmcmVnNGEpOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgcmVnNGF8dV9zcGVlZCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVnNDggJiB1X2ZsYWcpCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQ4LCByZWc0OCAmIH51X2ZsYWcpOworCQlpZiAocmVnNGEgJiBhX3NwZWVkKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgcmVnNGEgJiB+YV9zcGVlZCk7CisJfQorCisJc2xjOTBlNjZfdHVuZV9kcml2ZShkcml2ZSwgc2xjOTBlNjZfZG1hXzJfcGlvKHNwZWVkKSk7CisJcmV0dXJuIChpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCkpOworfQorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCitzdGF0aWMgaW50IHNsYzkwZTY2X2NvbmZpZ19kcml2ZV9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTggc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBzbGM5MGU2Nl9yYXRlbWFzayhkcml2ZSkpOworCisJaWYgKCEoc3BlZWQpKSB7CisJCXU4IHRzcGVlZCA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCA1LCBOVUxMKTsKKwkJc3BlZWQgPSBzbGM5MGU2Nl9kbWFfMl9waW8oWEZFUl9QSU9fMCArIHRzcGVlZCk7CisJfQorCisJKHZvaWQpIHNsYzkwZTY2X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2xjOTBlNjZfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisKKwlkcml2ZS0+aW5pdF9zcGVlZCA9IDA7CisKKwlpZiAoaWQgJiYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKKworCQlpZiAoaWRlX3VzZV9kbWEoZHJpdmUpKSB7CisJCQlpZiAoc2xjOTBlNjZfY29uZmlnX2RyaXZlX2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCisJCWdvdG8gZmFzdF9hdGFfcGlvOworCisJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKK2Zhc3RfYXRhX3BpbzoKKwkJaHdpZi0+dHVuZXByb2MoZHJpdmUsIDUpOworCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CisJfQorCS8qIElPUkRZIG5vdCBzdXBwb3J0ZWQgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9zbGM5MGU2NiAoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1OCByZWc0NyA9IDA7CisJdTggbWFzayA9IGh3aWYtPmNoYW5uZWwgPyAweDAxIDogMHgwMjsgIC8qIGJpdDA6UHJpbWFyeSAqLworCisJaHdpZi0+YXV0b2RtYSA9IDA7CisKKwlpZiAoIWh3aWYtPmlycSkKKwkJaHdpZi0+aXJxID0gaHdpZi0+Y2hhbm5lbCA/IDE1IDogMTQ7CisKKwlod2lmLT5zcGVlZHByb2MgPSAmc2xjOTBlNjZfdHVuZV9jaGlwc2V0OworCWh3aWYtPnR1bmVwcm9jID0gJnNsYzkwZTY2X3R1bmVfZHJpdmU7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDQ3LCAmcmVnNDcpOworCisJaWYgKCFod2lmLT5kbWFfYmFzZSkgeworCQlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCQlod2lmLT5kcml2ZXNbMV0uYXV0b3R1bmUgPSAxOworCQlyZXR1cm47CisJfQorCisJaHdpZi0+YXRhcGlfZG1hID0gMTsKKwlod2lmLT51bHRyYV9tYXNrID0gMHgxZjsKKwlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwlod2lmLT5zd2RtYV9tYXNrID0gMHgwNzsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQSAKKwlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQkvKiBiaXRbMCgxKV06IDA6ODAsIDE6NDAgKi8KKwkJaHdpZi0+dWRtYV9mb3VyID0gKHJlZzQ3ICYgbWFzaykgPyAwIDogMTsKKworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmc2xjOTBlNjZfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKKwlpZiAoIW5vYXV0b2RtYSkKKwkJaHdpZi0+YXV0b2RtYSA9IDE7CisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKyNlbmRpZiAvKiAhQ09ORklHX0JMS19ERVZfSURFRE1BICovCit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IHNsYzkwZTY2X2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKKwkubmFtZQkJPSAiU0xDOTBFNjYiLAorCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfc2xjOTBlNjYsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IEFVVE9ETUEsCisJLmVuYWJsZWJpdHMJPSB7ezB4NDEsMHg4MCwweDgwfSwgezB4NDMsMHg4MCwweDgwfX0sCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbGM5MGU2Nl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJnNsYzkwZTY2X2NoaXBzZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2xjOTBlNjZfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9FRkFSLCBQQ0lfREVWSUNFX0lEX0VGQVJfU0xDOTBFNjZfMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbGM5MGU2Nl9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkJPSAiU0xDOTBlNjZfSURFIiwKKwkuaWRfdGFibGUJPSBzbGM5MGU2Nl9wY2lfdGJsLAorCS5wcm9iZQkJPSBzbGM5MGU2Nl9pbml0X29uZSwKK307CisKK3N0YXRpYyBpbnQgc2xjOTBlNjZfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNsYzkwZTY2X2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmUgSGVkcmljayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgU0xDOTBFNjYgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdHJpZmxleC5jIGIvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmMmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIHRyaWZsZXguYworICogCisgKiBJREUgQ2hpcHNldCBkcml2ZXIgZm9yIHRoZSBDb21wYXEgVHJpRmxleCBJREUgY29udHJvbGxlci4KKyAqIAorICogS25vd24gdG8gd29yayB3aXRoIHRoZSBDb21wYXEgV29ya3N0YXRpb24gNXgwMCBzZXJpZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBHcm91cCwgTC5QLgorICogQXV0aG9yOiBUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGhwLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKiAKKyAqIExvb3NlbHkgYmFzZWQgb24gdGhlIHBpaXggJiBzdndrcyBkcml2ZXJzLgorICoKKyAqIERvY3VtZW50YXRpb246CisgKglOb3QgcHVibGljYWxseSBhdmFpbGFibGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3N0YXRpYyBpbnQgdHJpZmxleF90dW5lX2NoaXBzZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB4ZmVyc3BlZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OworCXU4IGNoYW5uZWxfb2Zmc2V0ID0gaHdpZi0+Y2hhbm5lbCA/IDB4NzQgOiAweDcwOworCXUxNiB0aW1pbmcgPSAwOworCXUzMiB0cmlmbGV4X3RpbWluZ3MgPSAwOworCXU4IHVuaXQgPSAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxKTsKKwl1OCBzcGVlZCA9IGlkZV9yYXRlX2ZpbHRlcigwLCB4ZmVyc3BlZWQpOworCQorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGNoYW5uZWxfb2Zmc2V0LCAmdHJpZmxleF90aW1pbmdzKTsKKwkKKwlzd2l0Y2goc3BlZWQpIHsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQkJdGltaW5nID0gMHgwMTAzOyAKKwkJCWJyZWFrOworCQljYXNlIFhGRVJfTVdfRE1BXzE6CisJCQl0aW1pbmcgPSAweDAyMDM7CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8wOgorCQkJdGltaW5nID0gMHgwODA4OworCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9TV19ETUFfMjoKKwkJY2FzZSBYRkVSX1NXX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzA6CisJCQl0aW1pbmcgPSAweDBmMGY7CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX1BJT180OgorCQkJdGltaW5nID0gMHgwMjAyOworCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJCXRpbWluZyA9IDB4MDIwNDsKKwkJCWJyZWFrOworCQljYXNlIFhGRVJfUElPXzI6CisJCQl0aW1pbmcgPSAweDA0MDQ7CisJCQlicmVhazsKKwkJY2FzZSBYRkVSX1BJT18xOgorCQkJdGltaW5nID0gMHgwNTA4OworCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJCXRpbWluZyA9IDB4MDgwODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KKworCXRyaWZsZXhfdGltaW5ncyAmPSB+KDB4RkZGRiA8PCAoMTYgKiB1bml0KSk7CisJdHJpZmxleF90aW1pbmdzIHw9ICh0aW1pbmcgPDwgKDE2ICogdW5pdCkpOworCQorCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBjaGFubmVsX29mZnNldCwgdHJpZmxleF90aW1pbmdzKTsKKwkKKwlyZXR1cm4gKGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyaWZsZXhfdHVuZV9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpbnQgdXNlX3BpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgcGlvLCA0LCBOVUxMKTsKKwkodm9pZCkgdHJpZmxleF90dW5lX2NoaXBzZXQoZHJpdmUsIChYRkVSX1BJT18wICsgdXNlX3BpbykpOworfQorCitzdGF0aWMgaW50IHRyaWZsZXhfY29uZmlnX2RyaXZlX2Zvcl9kbWEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWludCBzcGVlZCA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIDApOyAvKiBObyB1bHRyYSBzcGVlZHMgKi8KKworCWlmICghc3BlZWQpIHsgCisJCXU4IHBzcGVlZCA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCA0LCBOVUxMKTsKKwkJc3BlZWQgPSBYRkVSX1BJT18wICsgcHNwZWVkOworCX0KKwkKKwkodm9pZCkgdHJpZmxleF90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKwkgcmV0dXJuIGlkZV9kbWFfZW5hYmxlKGRyaXZlKTsKK30KKworc3RhdGljIGludCB0cmlmbGV4X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisKKwlpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKKwkJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQkJaWYgKHRyaWZsZXhfY29uZmlnX2RyaXZlX2Zvcl9kbWEoZHJpdmUpKQorCQkJCXJldHVybiBod2lmLT5pZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCX0KKworCWh3aWYtPnR1bmVwcm9jKGRyaXZlLCAyNTUpOworCXJldHVybiBod2lmLT5pZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl90cmlmbGV4KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+dHVuZXByb2MgPSAmdHJpZmxleF90dW5lX2RyaXZlOworCWh3aWYtPnNwZWVkcHJvYyA9ICZ0cmlmbGV4X3R1bmVfY2hpcHNldDsKKworCWh3aWYtPmF0YXBpX2RtYSAgPSAxOworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA3OworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmdHJpZmxleF9jb25maWdfZHJpdmVfeGZlcl9yYXRlOworCQorCWlmICghbm9hdXRvZG1hKQorCQlod2lmLT5hdXRvZG1hID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCB0cmlmbGV4X2RldmljZSBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJUUklGTEVYIiwKKwkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3RyaWZsZXgsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IEFVVE9ETUEsCisJLmVuYWJsZWJpdHMJPSB7ezB4ODAsIDB4MDEsIDB4MDF9LCB7MHg4MCwgMHgwMiwgMHgwMn19LAorCS5ib290YWJsZQk9IE9OX0JPQVJELAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdHJpZmxleF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCAKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZ0cmlmbGV4X2RldmljZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cmlmbGV4X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9UUklGTEVYX0lERSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAsIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRyaWZsZXhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIlRSSUZMRVhfSURFIiwKKwkuaWRfdGFibGUJPSB0cmlmbGV4X3BjaV90YmwsCisJLnByb2JlCQk9IHRyaWZsZXhfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHRyaWZsZXhfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRyaWZsZXhfaWRlX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJUb3JiZW4gTWF0aGlhc2VuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBkcml2ZXIgbW9kdWxlIGZvciBDb21wYXEgVHJpZmxleCBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMgYi9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1ZWVhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL3BjaS90cm0yOTAuYwpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMJCVZlcnNpb24gMS4wMglNYXIuIDE4LCAyMDAwCisgKgorICogIENvcHlyaWdodCAoYykgMTk5Ny0xOTk4ICBNYXJrIExvcmQKKyAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKiAgSnVuZSAyMiwgMjAwNCAtIGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCisgKiAgICAgICAgICAgICAgICAgIEplc3BlciBKdWhsIDxqdWhsLWxrbWxAZGlmLmRrPgorICoKKyAqLworCisvKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGJ1cy1tYXN0ZXIgSURFIERNQSBmdW5jdGlvbgorICogb2YgdGhlIFRla3JhbSBUUk0yOTAgY2hpcCwgdXNlZCBvbiBhIHZhcmlldHkgb2YgUENJIElERSBhZGQtb24gYm9hcmRzLAorICogaW5jbHVkaW5nIGEgIlByZWNpc2lvbiBJbnN0cnVtZW50cyIgYm9hcmQuICBUaGUgVFJNMjkwIHByZS1kYXRlcworICogdGhlIHNmZi04MDM4IHN0YW5kYXJkIChpZGUtZG1hLmMpIGJ5IGEgZmV3IG1vbnRocywgYW5kIGRpZmZlcnMKKyAqIHNpZ25pZmljYW50bHkgZW5vdWdoIHRvIHdhcnJhbnQgc2VwYXJhdGUgcm91dGluZXMgZm9yIHNvbWUgZnVuY3Rpb25zLAorICogd2hpbGUgcmUtdXNpbmcgb3RoZXJzIGZyb20gaWRlLWRtYS5jLgorICoKKyAqIEVYUEVSSU1FTlRBTCEgIEl0IHdvcmtzIGZvciBtZSAoYSBzYW1wbGUgb2Ygb25lKS4KKyAqCisgKiBXb3JrcyByZWxpYWJseSBmb3IgbWUgaW4gRE1BIG1vZGUgKFJFQURzIG9ubHkpLAorICogRE1BIFdSSVRFcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAoc2VlICNkZWZpbmUgYmVsb3cpOworICoKKyAqIERNQSBpcyBub3QgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGZvciB0aGlzIGNoaXBzZXQsCisgKiBidXQgY2FuIGJlIHR1cm5lZCBvbiBtYW51YWxseSAod2l0aCAiaGRwYXJtIC1kMSIpIGF0IHJ1biB0aW1lLgorICoKKyAqIEkgbmVlZCB2b2x1bnRlZXJzIHdpdGggInNwYXJlIiBkcml2ZXMgZm9yIGZ1cnRoZXIgdGVzdGluZworICogYW5kIGRldmVsb3BtZW50LCBhbmQgbWF5YmUgdG8gaGVscCBmaWd1cmUgb3V0IHRoZSBwZWN1bGlhcml0aWVzLgorICogRXZlbiBrbm93aW5nIHRoZSByZWdpc3RlcnMgKGJlbG93KSwgc29tZSB0aGluZ3MgYmVoYXZlIHN0cmFuZ2VseS4KKyAqLworCisjZGVmaW5lIFRSTTI5MF9OT19ETUFfV1JJVEVTCS8qIERNQSB3cml0ZXMgc2VlbSB1bnJlbGlhYmxlIHNvbWV0aW1lcyAqLworCisvKgorICogVFJNLTI5MCBQQ0ktSURFMiBCdXMgTWFzdGVyIENoaXAKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgYXJlIGFkZHJlc3NlZCBpbiBub3JtYWwgSS9PIHBvcnQgc3BhY2UKKyAqIGFuZCBhcmUgdXNlZCBhcyBmb2xsb3dzOgorICoKKyAqIHRybTI5MF9iYXNlIGRlcGVuZHMgb24ganVtcGVyIHNldHRpbmdzLCBhbmQgaXMgcHJvYmVkIGZvciBieSBpZGUtZG1hLmMKKyAqCisgKiB0cm0yOTBfYmFzZSsyIHdoZW4gV1JJVFRFTjogY2hpcHRlc3QgcmVnaXN0ZXIgKGJ5dGUsIHdyaXRlLW9ubHkpCisgKgliaXQ3IG11c3QgYWx3YXlzIGJlIHdyaXR0ZW4gYXMgIjEiCisgKgliaXRzNi0yIHVuZGVmaW5lZAorICoJYml0MSAxPWxlZ2FjeV9jb21wYXRpYmxlX21vZGUsIDA9bmF0aXZlX3BjaV9tb2RlCisgKgliaXQwIDE9dGVzdF9tb2RlLCAwPW5vcm1hbChkZWZhdWx0KQorICoKKyAqIHRybTI5MF9iYXNlKzIgd2hlbiBSRUFEOiBzdGF0dXMgcmVnaXN0ZXIgKGJ5dGUsIHJlYWQtb25seSkKKyAqCWJpdHM3LTIgdW5kZWZpbmVkCisgKgliaXQxIGNoYW5uZWwwIGJ1c21hc3RlciBpbnRlcnJ1cHQgc3RhdHVzIDA9bm9uZSwgMT1hc3NlcnRlZAorICoJYml0MCBjaGFubmVsMCBpbnRlcnJ1cHQgc3RhdHVzIDA9bm9uZSwgMT1hc3NlcnRlZAorICoKKyAqIHRybTI5MF9iYXNlKzMgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyAqCWJpdHM3LTUgdW5kZWZpbmVkCisgKgliaXQ0IGxlZ2FjeV9oZWFkZXI6IDE9cHJlc2VudCwgMD1hYnNlbnQKKyAqCWJpdDMgY2hhbm5lbDEgYnVzbWFzdGVyIGludGVycnVwdCBzdGF0dXMgMD1ub25lLCAxPWFzc2VydGVkIChyZWFkIG9ubHkpCisgKgliaXQyIGNoYW5uZWwxIGludGVycnVwdCBzdGF0dXMgMD1ub25lLCAxPWFzc2VydGVkIChyZWFkIG9ubHkpCisgKgliaXQxIGNoYW5uZWwxIGludGVycnVwdCBtYXNrOiAxPW1hc2tlZCwgMD11bm1hc2tlZChkZWZhdWx0KQorICoJYml0MCBjaGFubmVsMCBpbnRlcnJ1cHQgbWFzazogMT1tYXNrZWQsIDA9dW5tYXNrZWQoZGVmYXVsdCkKKyAqCisgKiB0cm0yOTBfYmFzZSsxICJDUFIiIENvbmZpZyBQb2ludGVyIFJlZ2lzdGVyIChieXRlKQorICoJYml0NyAxPWF1dG9pbmNyZW1lbnQgQ1BSIGJpdHMgMi0wIGFmdGVyIGVhY2ggYWNjZXNzIG9mIENEUgorICoJYml0NiAxPW1pbi4gMSB3YWl0LXN0YXRlIHBvc3RlZCB3cml0ZSBjeWNsZSAoZGVmYXVsdCksIDA9MCB3YWl0LXN0YXRlCisgKgliaXQ1IDA9ZW5hYmxlZCBtYXN0ZXIgYnVyc3QgYWNjZXNzIChkZWZhdWx0KSwgMT1kaXNhYmxlICAod3JpdGUgb25seSkKKyAqCWJpdDQgUENJIERFVlNFTCMgdGltaW5nIHNlbGVjdDogMT1tZWRpdW0oZGVmYXVsdCksIDA9ZmFzdAorICoJYml0MyAwPXByaW1hcnkgSURFIGNoYW5uZWwsIDE9c2Vjb25kYXJ5IElERSBjaGFubmVsCisgKgliaXRzMi0wIHJlZ2lzdGVyIGluZGV4IGZvciBhY2Nlc3NlcyB0aHJvdWdoIENEUiBwb3J0CisgKgorICogdHJtMjkwX2Jhc2UrMCAiQ0RSIiBDb25maWcgRGF0YSBSZWdpc3RlciAod29yZCkKKyAqCXR3byBzZXRzIG9mIHNldmVuIGNvbmZpZyByZWdpc3RlcnMsCisgKglzZWxlY3RlZCBieSBDUFIgYml0IDMgKGNoYW5uZWwpIGFuZCBDUFIgYml0cyAyLTAgKGluZGV4IDAgdG8gNiksCisgKgllYWNoIGluZGV4IGRlZmluZWQgYmVsb3c6CisgKgorICogSW5kZXgtMCBCYXNlIGFkZHJlc3MgcmVnaXN0ZXIgZm9yIGNvbW1hbmQgYmxvY2sgKHdvcmQpCisgKglkZWZhdWx0czogMHgxZjAgZm9yIHByaW1hcnksIDB4MTcwIGZvciBzZWNvbmRhcnkKKyAqCisgKiBJbmRleC0xIGdlbmVyYWwgY29uZmlnIHJlZ2lzdGVyIChieXRlKQorICoJYml0NyAxPURNQSBlbmFibGUsIDA9RE1BIGRpc2FibGUKKyAqCWJpdDYgMT1hY3RpdmF0ZSBJREVfUkVTRVQsIDA9bm8gYWN0aW9uIChkZWZhdWx0KQorICoJYml0NSAxPWVuYWJsZSBJT1JEWSwgMD1kaXNhYmxlIElPUkRZIChkZWZhdWx0KQorICoJYml0NCAwPTE2LWJpdCBkYXRhIHBvcnQoZGVmYXVsdCksIDE9OC1iaXQgKFhUKSBkYXRhIHBvcnQKKyAqCWJpdDMgaW50ZXJydXB0IHBvbGFyaXR5OiAxPWFjdGl2ZV9sb3csIDA9YWN0aXZlX2hpZ2goZGVmYXVsdCkKKyAqCWJpdDIgcG93ZXItc2F2aW5nLW1vZGUoPyk6IDE9ZW5hYmxlLCAwPWRpc2FibGUoZGVmYXVsdCkgKHdyaXRlIG9ubHkpCisgKgliaXQxIGJ1c19tYXN0ZXJfbW9kZSg/KTogMT1lbmFibGUsIDA9ZGlzYWJsZShkZWZhdWx0KQorICoJYml0MCBlbmFibGVfaW9fcG9ydHM6IDE9ZW5hYmxlKGRlZmF1bHQpLCAwPWRpc2FibGUKKyAqCisgKiBJbmRleC0yIHJlYWQtYWhlYWQgY291bnRlciBwcmVsb2FkIGJpdHMgMC03IChieXRlLCB3cml0ZSBvbmx5KQorICoJYml0czctMCBiaXRzNy0wIG9mIHJlYWRhaGVhZCBjb3VudAorICoKKyAqIEluZGV4LTMgcmVhZC1haGVhZCBjb25maWcgcmVnaXN0ZXIgKGJ5dGUsIHdyaXRlIG9ubHkpCisgKgliaXQ3IDE9ZW5hYmxlX3JlYWRhaGVhZCwgMD1kaXNhYmxlX3JlYWRhaGVhZChkZWZhdWx0KQorICoJYml0NiAxPWNsZWFyX0ZJRk8sIDA9bm9fYWN0aW9uCisgKgliaXQ1IHVuZGVmaW5lZAorICoJYml0NCBtb2RlNCB0aW1pbmcgY29udHJvbDogMT1lbmFibGUsIDA9ZGlzYWJsZShkZWZhdWx0KQorICoJYml0MyB1bmRlZmluZWQKKyAqCWJpdDIgdW5kZWZpbmVkCisgKgliaXRzMS0wIGJpdHM5LTggb2YgcmVhZC1haGVhZCBjb3VudAorICoKKyAqIEluZGV4LTQgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGZvciBjb250cm9sIGJsb2NrICh3b3JkKQorICoJZGVmYXVsdHM6IDB4M2Y2IGZvciBwcmltYXJ5LCAweDM3NiBmb3Igc2Vjb25kYXJ5CisgKgorICogSW5kZXgtNSBkYXRhIHBvcnQgdGltaW5ncyAoc2hhcmVkIGJ5IGJvdGggZHJpdmVzKSAoYnl0ZSkKKyAqCXN0YW5kYXJkIFBDSSAiY2xrIiAoY2xvY2spIGNvdW50cywgZGVmYXVsdCB2YWx1ZSA9IDB4ZjUKKyAqCisgKgliaXRzNy02IHNldHVwIHRpbWU6ICAwMD0xY2xrLCAwMT0yY2xrLCAxMD0zY2xrLCAxMT00Y2xrCisgKgliaXRzNS0zIGhvbGQgdGltZToJMDAwPTFjbGssIDAwMT0yY2xrLCAwMTA9M2NsaywKKyAqCQkJCTAxMT00Y2xrLCAxMDA9NWNsaywgMTAxPTZjbGssCisgKgkJCQkxMTA9OGNsaywgMTExPTEyY2xrCisgKgliaXRzMi0wIGFjdGl2ZSB0aW1lOgkwMDA9MmNsaywgMDAxPTNjbGssIDAxMD00Y2xrLAorICoJCQkJMDExPTVjbGssIDEwMD02Y2xrLCAxMDE9OGNsaywKKyAqCQkJCTExMD0xMmNsaywgMTExPTE2Y2xrCisgKgorICogSW5kZXgtNiBjb21tYW5kL2NvbnRyb2wgcG9ydCB0aW1pbmdzIChzaGFyZWQgYnkgYm90aCBkcml2ZXMpIChieXRlKQorICoJc2FtZSBsYXlvdXQgYXMgSW5kZXgtNSwgZGVmYXVsdCB2YWx1ZSA9IDB4ZGUKKyAqCisgKiBTdWdnZXN0ZWQgQ0RSIHByb2dyYW1taW5nIGZvciBQSU8gbW9kZTAgKDYwMG5zKToKKyAqCTB4MDFmMCwweDIxLDB4ZmYsMHg4MCwweDAzZjYsMHhmNSwweGRlCTsgcHJpbWFyeQorICoJMHgwMTcwLDB4MjEsMHhmZiwweDgwLDB4MDM3NiwweGY1LDB4ZGUJOyBzZWNvbmRhcnkKKyAqCisgKiBTdWdnZXN0ZWQgQ0RSIHByb2dyYW1taW5nIGZvciBQSU8gbW9kZTMgKDE4MG5zKToKKyAqCTB4MDFmMCwweDIxLDB4ZmYsMHg4MCwweDAzZjYsMHgwOSwweGRlCTsgcHJpbWFyeQorICoJMHgwMTcwLDB4MjEsMHhmZiwweDgwLDB4MDM3NiwweDA5LDB4ZGUJOyBzZWNvbmRhcnkKKyAqCisgKiBTdWdnZXN0ZWQgQ0RSIHByb2dyYW1taW5nIGZvciBQSU8gbW9kZTQgKDEyMG5zKToKKyAqCTB4MDFmMCwweDIxLDB4ZmYsMHg4MCwweDAzZjYsMHgwMCwweGRlCTsgcHJpbWFyeQorICoJMHgwMTcwLDB4MjEsMHhmZiwweDgwLDB4MDM3NiwweDAwLDB4ZGUJOyBzZWNvbmRhcnkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyB2b2lkIHRybTI5MF9wcmVwYXJlX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCB1c2VfZG1hKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwl1MTYgcmVnID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc2VsZWN0IFBJTyBvciBETUEgKi8KKwlyZWcgPSB1c2VfZG1hID8gKDB4MjEgfCAweDgyKSA6ICgweDIxICYgfjB4ODIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKHJlZyAhPSBod2lmLT5zZWxlY3RfZGF0YSkgeworCQlod2lmLT5zZWxlY3RfZGF0YSA9IHJlZzsKKwkJLyogc2V0IFBJTy9ETUEgKi8KKwkJaHdpZi0+T1VUQigweDUxfChod2lmLT5jaGFubmVsPDwzKSwgaHdpZi0+Y29uZmlnX2RhdGErMSk7CisJCWh3aWYtPk9VVFcocmVnICYgMHhmZiwgaHdpZi0+Y29uZmlnX2RhdGEpOworCX0KKworCS8qIGVuYWJsZSBJUlEgaWYgbm90IHByb2JpbmcgKi8KKwlpZiAoZHJpdmUtPnByZXNlbnQpIHsKKwkJcmVnID0gaHdpZi0+SU5XKGh3aWYtPmNvbmZpZ19kYXRhICsgMyk7CisJCXJlZyAmPSAweDEzOworCQlyZWcgJj0gfigxIDw8IGh3aWYtPmNoYW5uZWwpOworCQlod2lmLT5PVVRXKHJlZywgaHdpZi0+Y29uZmlnX2RhdGErMyk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0cm0yOTBfc2VsZWN0cHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXRybTI5MF9wcmVwYXJlX2RyaXZlKGRyaXZlLCBkcml2ZS0+dXNpbmdfZG1hKTsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQQorc3RhdGljIHZvaWQgdHJtMjkwX2lkZV9kbWFfZXhlY19jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjb21tYW5kKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKworCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQkvKiBwYXJhbm9pYSBjaGVjayAqLworCQlCVUcoKTsKKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVfZG1hX2ludHIsIFdBSVRfQ01ELCBOVUxMKTsKKwkvKiBpc3N1ZSBjbWQgdG8gZHJpdmUgKi8KKwlod2lmLT5PVVRCKGNvbW1hbmQsIElERV9DT01NQU5EX1JFRyk7Cit9CisKK3N0YXRpYyBpbnQgdHJtMjkwX2lkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwl1bnNpZ25lZCBpbnQgY291bnQsIHJ3OworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSkgeworI2lmZGVmIFRSTTI5MF9OT19ETUFfV1JJVEVTCisJCS8qIGFsd2F5cyB1c2UgUElPIGZvciB3cml0ZXMgKi8KKwkJdHJtMjkwX3ByZXBhcmVfZHJpdmUoZHJpdmUsIDApOwkvKiBzZWxlY3QgUElPIHhmZXIgKi8KKwkJcmV0dXJuIDE7CisjZW5kaWYKKwkJcncgPSAxOworCX0gZWxzZQorCQlydyA9IDI7CisKKwlpZiAoIShjb3VudCA9IGlkZV9idWlsZF9kbWF0YWJsZShkcml2ZSwgcnEpKSkgeworCQkvKiB0cnkgUElPIGluc3RlYWQgb2YgRE1BICovCisJCXRybTI5MF9wcmVwYXJlX2RyaXZlKGRyaXZlLCAwKTsgLyogc2VsZWN0IFBJTyB4ZmVyICovCisJCXJldHVybiAxOworCX0KKwkvKiBzZWxlY3QgRE1BIHhmZXIgKi8KKwl0cm0yOTBfcHJlcGFyZV9kcml2ZShkcml2ZSwgMSk7CisJaHdpZi0+T1VUTChod2lmLT5kbWF0YWJsZV9kbWF8cncsIGh3aWYtPmRtYV9jb21tYW5kKTsKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKKwkvKiBzdGFydCBETUEgKi8KKwlod2lmLT5PVVRXKChjb3VudCAqIDIpIC0gMSwgaHdpZi0+ZG1hX3N0YXR1cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRybTI5MF9pZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKK30KKworc3RhdGljIGludCB0cm0yOTBfaWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJdTE2IHN0YXR1cyA9IDA7CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKKwkvKiBwdXJnZSBETUEgbWFwcGluZ3MgKi8KKwlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisJc3RhdHVzID0gaHdpZi0+SU5XKGh3aWYtPmRtYV9zdGF0dXMpOworCXJldHVybiAoc3RhdHVzICE9IDB4MDBmZik7Cit9CisKK3N0YXRpYyBpbnQgdHJtMjkwX2lkZV9kbWFfdGVzdF9pcnEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJdTE2IHN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBod2lmLT5JTlcoaHdpZi0+ZG1hX3N0YXR1cyk7CisJcmV0dXJuIChzdGF0dXMgPT0gMHgwMGZmKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KKworLyoKKyAqIEludm9rZWQgZnJvbSBpZGUtZG1hLmMgYXQgYm9vdCB0aW1lLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3RybTI5MChpZGVfaHdpZl90ICpod2lmKQoreworCXVuc2lnbmVkIGludCBjZmdiYXNlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHJlZyA9IDA7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CisKKwlod2lmLT5ub19sYmE0OCA9IDE7CisJaHdpZi0+Y2hpcHNldCA9IGlkZV90cm0yOTA7CisJY2ZnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOworCWlmICgoZGV2LT5jbGFzcyAmIDUpICYmIGNmZ2Jhc2UpIHsKKwkJaHdpZi0+Y29uZmlnX2RhdGEgPSBjZmdiYXNlOworCQlwcmludGsoS0VSTl9JTkZPICJUUk0yOTA6IGNoaXAgY29uZmlnIGJhc2UgYXQgMHglMDRseFxuIiwKKwkJCWh3aWYtPmNvbmZpZ19kYXRhKTsKKwl9IGVsc2UgeworCQlod2lmLT5jb25maWdfZGF0YSA9IDB4M2RmMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVFJNMjkwOiB1c2luZyBkZWZhdWx0IGNvbmZpZyBiYXNlIGF0IDB4JTA0bHhcbiIsCisJCQlod2lmLT5jb25maWdfZGF0YSk7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIHB1dCBjb25maWcgcmVnIGludG8gZmlyc3QgYnl0ZSBvZiBod2lmLT5zZWxlY3RfZGF0YSAqLworCWh3aWYtPk9VVEIoMHg1MXwoaHdpZi0+Y2hhbm5lbDw8MyksIGh3aWYtPmNvbmZpZ19kYXRhKzEpOworCS8qIHNlbGVjdCBQSU8gYXMgZGVmYXVsdCAqLworCWh3aWYtPnNlbGVjdF9kYXRhID0gMHgyMTsKKwlod2lmLT5PVVRCKGh3aWYtPnNlbGVjdF9kYXRhLCBod2lmLT5jb25maWdfZGF0YSk7CisJLyogZ2V0IElSUSBpbmZvICovCisJcmVnID0gaHdpZi0+SU5CKGh3aWYtPmNvbmZpZ19kYXRhKzMpOworCS8qIG1hc2sgSVJRcyBmb3IgYm90aCBwb3J0cyAqLworCXJlZyA9IChyZWcgJiAweDEwKSB8IDB4MDM7CisJaHdpZi0+T1VUQihyZWcsIGh3aWYtPmNvbmZpZ19kYXRhKzMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWlmICgocmVnICYgMHgxMCkpCisJCS8qIGxlZ2FjeSBtb2RlICovCisJCWh3aWYtPmlycSA9IGh3aWYtPmNoYW5uZWwgPyAxNSA6IDE0OworCWVsc2UgaWYgKCFod2lmLT5pcnEgJiYgaHdpZi0+bWF0ZSAmJiBod2lmLT5tYXRlLT5pcnEpCisJCS8qIHNoYXJpbmcgSVJRIHdpdGggbWF0ZSAqLworCQlod2lmLT5pcnEgPSBod2lmLT5tYXRlLT5pcnE7CisKKwlpZGVfc2V0dXBfZG1hKGh3aWYsIChod2lmLT5jb25maWdfZGF0YSArIDQpIF4gKGh3aWYtPmNoYW5uZWwgPyAweDAwODAgOiAweDAwMDApLCAzKTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQQorCWh3aWYtPmRtYV9zZXR1cCA9ICZ0cm0yOTBfaWRlX2RtYV9zZXR1cDsKKwlod2lmLT5kbWFfZXhlY19jbWQgPSAmdHJtMjkwX2lkZV9kbWFfZXhlY19jbWQ7CisJaHdpZi0+ZG1hX3N0YXJ0ID0gJnRybTI5MF9pZGVfZG1hX3N0YXJ0OworCWh3aWYtPmlkZV9kbWFfZW5kID0gJnRybTI5MF9pZGVfZG1hX2VuZDsKKwlod2lmLT5pZGVfZG1hX3Rlc3RfaXJxID0gJnRybTI5MF9pZGVfZG1hX3Rlc3RfaXJxOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQSAqLworCisJaHdpZi0+c2VsZWN0cHJvYyA9ICZ0cm0yOTBfc2VsZWN0cHJvYzsKKwlod2lmLT5hdXRvZG1hID0gMDsJCS8qIHBsYXkgaXQgc2FmZSBmb3Igbm93ICovCisJaHdpZi0+ZHJpdmVzWzBdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvZG1hID0gaHdpZi0+YXV0b2RtYTsKKyNpZiAxCisJeworCS8qCisJICogTXkgdHJtMjkwLWJhc2VkIGNhcmQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aCBhbGwgcG9zc2libGUgdmFsdWVzCisJICogZm9yIHRoZSBjb250cm9sIGJhc2VyZWcsIHNvIHRoaXMga2x1ZGdlIGVuc3VyZXMgdGhhdCB3ZSB1c2Ugb25seQorCSAqIHZhbHVlcyB0aGF0IGFyZSBrbm93biB0byB3b3JrLiAgVWdoLgkJLW1sCisJICovCisJCXUxNiBuZXcsIG9sZCwgY29tcGF0ID0gaHdpZi0+Y2hhbm5lbCA/IDB4Mzc0IDogMHgzZjQ7CisJCXN0YXRpYyB1MTYgbmV4dF9vZmZzZXQgPSAwOworCQl1OCBvbGRfbWFzazsKKworCQlod2lmLT5PVVRCKDB4NTR8KGh3aWYtPmNoYW5uZWw8PDMpLCBod2lmLT5jb25maWdfZGF0YSsxKTsKKwkJb2xkID0gaHdpZi0+SU5XKGh3aWYtPmNvbmZpZ19kYXRhKTsKKwkJb2xkICY9IH4xOworCQlvbGRfbWFzayA9IGh3aWYtPklOQihvbGQrMik7CisJCWlmIChvbGQgIT0gY29tcGF0ICYmIG9sZF9tYXNrID09IDB4ZmYpIHsKKwkJCS8qIGxlYXZlIGxvd2VyIDEwIGJpdHMgdW50b3VjaGVkICovCisJCQljb21wYXQgKz0gKG5leHRfb2Zmc2V0ICs9IDB4NDAwKTsKKwkJCWh3aWYtPmlvX3BvcnRzW0lERV9DT05UUk9MX09GRlNFVF0gPSBjb21wYXQgKyAyOworCQkJaHdpZi0+T1VUVyhjb21wYXR8MSwgaHdpZi0+Y29uZmlnX2RhdGEpOworCQkJbmV3ID0gaHdpZi0+SU5XKGh3aWYtPmNvbmZpZ19kYXRhKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb250cm9sIGJhc2VyZWcgd29ya2Fyb3VuZDogIgorCQkJCSJvbGQ9MHglMDR4LCBuZXc9MHglMDR4XG4iLAorCQkJCWh3aWYtPm5hbWUsIG9sZCwgbmV3ICYgfjEpOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpZGVfcGNpX2RldmljZV90IHRybTI5MF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUJCT0gIlRSTTI5MCIsCisJLmluaXRfaHdpZgk9IGluaXRfaHdpZl90cm0yOTAsCisJLmNoYW5uZWxzCT0gMiwKKwkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKKwkuYm9vdGFibGUJPSBPTl9CT0FSRCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRybTI5MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJnRybTI5MF9jaGlwc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRybTI5MF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1RFS1JBTSwgUENJX0RFVklDRV9JRF9URUtSQU1fREMyOTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJtMjkwX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJUUk0yOTBfSURFIiwKKwkuaWRfdGFibGUJPSB0cm0yOTBfcGNpX3RibCwKKwkucHJvYmUJCT0gdHJtMjkwX2luaXRfb25lLAorfTsKKworc3RhdGljIGludCB0cm0yOTBfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRybTI5MF9pZGVfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgTG9yZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgVGVrcmFtIFRSTTI5MCBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlkYmZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCkBAIC0wLDAgKzEsNjU2IEBACisvKgorICoKKyAqIFZlcnNpb24gMy4zOAorICoKKyAqIFZJQSBJREUgZHJpdmVyIGZvciBMaW51eC4gU3VwcG9ydGVkIHNvdXRoYnJpZGdlczoKKyAqCisgKiAgIHZ0ODJjNTc2LCB2dDgyYzU4NiwgdnQ4MmM1ODZhLCB2dDgyYzU4NmIsIHZ0ODJjNTk2YSwgdnQ4MmM1OTZiLAorICogICB2dDgyYzY4NiwgdnQ4MmM2ODZhLCB2dDgyYzY4NmIsIHZ0ODIzMSwgdnQ4MjMzLCB2dDgyMzNjLCB2dDgyMzNhLAorICogICB2dDgyMzUsIHZ0ODIzNworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogQmFzZWQgb24gdGhlIHdvcmsgb2Y6CisgKglNaWNoZWwgQXVicnkKKyAqCUplZmYgR2FyemlrCisgKglBbmRyZSBIZWRyaWNrCisgKgorICogRG9jdW1lbnRhdGlvbjoKKyAqCU9ic29sZXRlIGRldmljZSBkb2N1bWVudGF0aW9uIHB1YmxpY2FsbHkgYXZhaWxhYmxlIGZyb20gdmlhLmNvbS50dworICoJQ3VycmVudCBkZXZpY2UgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgdW5kZXIgTkRBIG9ubHkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpZGUtdGltaW5nLmgiCisKKyNkZWZpbmUgRElTUExBWV9WSUFfVElNSU5HUworCisjZGVmaW5lIFZJQV9JREVfRU5BQkxFCQkweDQwCisjZGVmaW5lIFZJQV9JREVfQ09ORklHCQkweDQxCisjZGVmaW5lIFZJQV9GSUZPX0NPTkZJRwkJMHg0MworI2RlZmluZSBWSUFfTUlTQ18xCQkweDQ0CisjZGVmaW5lIFZJQV9NSVNDXzIJCTB4NDUKKyNkZWZpbmUgVklBX01JU0NfMwkJMHg0NgorI2RlZmluZSBWSUFfRFJJVkVfVElNSU5HCTB4NDgKKyNkZWZpbmUgVklBXzhCSVRfVElNSU5HCQkweDRlCisjZGVmaW5lIFZJQV9BRERSRVNTX1NFVFVQCTB4NGMKKyNkZWZpbmUgVklBX1VETUFfVElNSU5HCQkweDUwCisKKyNkZWZpbmUgVklBX1VETUEJCTB4MDA3CisjZGVmaW5lIFZJQV9VRE1BX05PTkUJCTB4MDAwCisjZGVmaW5lIFZJQV9VRE1BXzMzCQkweDAwMQorI2RlZmluZSBWSUFfVURNQV82NgkJMHgwMDIKKyNkZWZpbmUgVklBX1VETUFfMTAwCQkweDAwMworI2RlZmluZSBWSUFfVURNQV8xMzMJCTB4MDA0CisjZGVmaW5lIFZJQV9CQURfUFJFUQkJMHgwMTAJLyogQ3Jhc2hlcyBpZiBQUkVRIyB0aWxsIEREQUNLIyBzZXQgKi8KKyNkZWZpbmUgVklBX0JBRF9DTEs2NgkJMHgwMjAJLyogNjYgTUh6IGNsb2NrIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgKi8KKyNkZWZpbmUgVklBX1NFVF9GSUZPCQkweDA0MAkvKiBOZWVkcyB0byBoYXZlIEZJRk8gc3BsaXQgc2V0ICovCisjZGVmaW5lIFZJQV9OT19VTk1BU0sJCTB4MDgwCS8qIERvZXNuJ3Qgd29yayB3aXRoIElSUSB1bm1hc2tpbmcgb24gKi8KKyNkZWZpbmUgVklBX0JBRF9JRAkJMHgxMDAJLyogSGFzIHdyb25nIHZlbmRvciBJRCAoMHgxMTA3KSAqLworI2RlZmluZSBWSUFfQkFEX0FTVAkJMHgyMDAJLyogRG9uJ3QgdG91Y2ggQWRkcmVzcyBTZXR1cCBUaW1pbmcgKi8KKworLyoKKyAqIFZJQSBTb3V0aEJyaWRnZSBjaGlwcy4KKyAqLworCitzdGF0aWMgc3RydWN0IHZpYV9pc2FfYnJpZGdlIHsKKwljaGFyICpuYW1lOworCXUxNiBpZDsKKwl1OCByZXZfbWluOworCXU4IHJldl9tYXg7CisJdTE2IGZsYWdzOworfSB2aWFfaXNhX2JyaWRnZXNbXSA9IHsKKwl7ICJ2dDgyMzciLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM3LCAgICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTMzIHwgVklBX0JBRF9BU1QgfSwKKwl7ICJ2dDgyMzUiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM1LCAgICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTMzIHwgVklBX0JBRF9BU1QgfSwKKwl7ICJ2dDgyMzNhIiwJUENJX0RFVklDRV9JRF9WSUFfODIzM0EsICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEzMyB8IFZJQV9CQURfQVNUIH0sCisJeyAidnQ4MjMzYyIsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzNDXzAsICAweDAwLCAweDJmLCBWSUFfVURNQV8xMDAgfSwKKwl7ICJ2dDgyMzMiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjMzXzAsICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTAwIH0sCisJeyAidnQ4MjMxIiwJUENJX0RFVklDRV9JRF9WSUFfODIzMSwgICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEwMCB9LAorCXsgInZ0ODJjNjg2YiIsCVBDSV9ERVZJQ0VfSURfVklBXzgyQzY4NiwgICAweDQwLCAweDRmLCBWSUFfVURNQV8xMDAgfSwKKwl7ICJ2dDgyYzY4NmEiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODYsICAgMHgxMCwgMHgyZiwgVklBX1VETUFfNjYgfSwKKwl7ICJ2dDgyYzY4NiIsCVBDSV9ERVZJQ0VfSURfVklBXzgyQzY4NiwgICAweDAwLCAweDBmLCBWSUFfVURNQV8zMyB8IFZJQV9CQURfQ0xLNjYgfSwKKwl7ICJ2dDgyYzU5NmIiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTYsICAgMHgxMCwgMHgyZiwgVklBX1VETUFfNjYgfSwKKwl7ICJ2dDgyYzU5NmEiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTYsICAgMHgwMCwgMHgwZiwgVklBX1VETUFfMzMgfCBWSUFfQkFEX0NMSzY2IH0sCisJeyAidnQ4MmM1ODZiIiwJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIDB4NDcsIDB4NGYsIFZJQV9VRE1BXzMzIHwgVklBX1NFVF9GSUZPIH0sCisJeyAidnQ4MmM1ODZiIiwJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIDB4NDAsIDB4NDYsIFZJQV9VRE1BXzMzIHwgVklBX1NFVF9GSUZPIHwgVklBX0JBRF9QUkVRIH0sCisJeyAidnQ4MmM1ODZiIiwJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIDB4MzAsIDB4M2YsIFZJQV9VRE1BXzMzIHwgVklBX1NFVF9GSUZPIH0sCisJeyAidnQ4MmM1ODZhIiwJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIDB4MjAsIDB4MmYsIFZJQV9VRE1BXzMzIHwgVklBX1NFVF9GSUZPIH0sCisJeyAidnQ4MmM1ODYiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMCwgMHgwMCwgMHgwZiwgVklBX1VETUFfTk9ORSB8IFZJQV9TRVRfRklGTyB9LAorCXsgInZ0ODJjNTc2IiwJUENJX0RFVklDRV9JRF9WSUFfODJDNTc2LCAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BX05PTkUgfCBWSUFfU0VUX0ZJRk8gfCBWSUFfTk9fVU5NQVNLIH0sCisJeyAidnQ4MmM1NzYiLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NzYsICAgMHgwMCwgMHgyZiwgVklBX1VETUFfTk9ORSB8IFZJQV9TRVRfRklGTyB8IFZJQV9OT19VTk1BU0sgfCBWSUFfQkFEX0lEIH0sCisJeyBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlhX2lzYV9icmlkZ2UgKnZpYV9jb25maWc7CitzdGF0aWMgdW5zaWduZWQgaW50IHZpYV84MHc7CitzdGF0aWMgdW5zaWduZWQgaW50IHZpYV9jbG9jazsKK3N0YXRpYyBjaGFyICp2aWFfZG1hW10gPSB7ICJNV0RNQTE2IiwgIlVETUEzMyIsICJVRE1BNjYiLCAiVURNQTEwMCIsICJVRE1BMTMzIiB9OworCisvKgorICogVklBIC9wcm9jIGVudHJ5LgorICovCisKKyNpZiBkZWZpbmVkKERJU1BMQVlfVklBX1RJTUlOR1MpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCitzdGF0aWMgdTggdmlhX3Byb2MgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmlhX2Jhc2U7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmJtaWRlX2RldiwgKmlzYV9kZXY7CisKK3N0YXRpYyBjaGFyICp2aWFfY29udHJvbDNbXSA9IHsgIk5vIGxpbWl0IiwgIjY0IiwgIjEyOCIsICIxOTIiIH07CisKKyNkZWZpbmUgdmlhX3ByaW50KGZvcm1hdCwgYXJnLi4uKSBwICs9IHNwcmludGYocCwgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIHZpYV9wcmludF9kcml2ZShuYW1lLCBmb3JtYXQsIGFyZy4uLilcCisJcCArPSBzcHJpbnRmKHAsIG5hbWUpOyBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBwICs9IHNwcmludGYocCwgZm9ybWF0LCAjIyBhcmcpOyBwICs9IHNwcmludGYocCwgIlxuIik7CisKKworLyoqCisgKgl2aWFfZ2V0X2luZm8JCS0JZ2VuZXJhdGUgdmlhIC9wcm9jIGZpbGUgCisgKglAYnVmZmVyOiBidWZmZXIgZm9yIGRhdGEKKyAqCUBhZGRyOiBzZXQgdG8gc3RhcnQgb2YgZGF0YSB0byB1c2UKKyAqCUBvZmZzZXQ6IGN1cnJlbnQgZmlsZSBvZmZzZXQKKyAqCUBjb3VudDogc2l6ZSBvZiByZWFkCisgKgorICoJRmlsbHMgaW4gYnVmZmVyIHdpdGggdGhlIGRlYnVnZ2luZy9jb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvcgorICoJdGhlIFZJQSBjaGlwc2V0IHR1bmluZyBhbmQgYXR0YWNoZWQgZHJpdmVzCisgKi8KKyAKK3N0YXRpYyBpbnQgdmlhX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKmFkZHIsIG9mZl90IG9mZnNldCwgaW50IGNvdW50KQoreworCWludCBzcGVlZFs0XSwgY3ljbGVbNF0sIHNldHVwWzRdLCBhY3RpdmVbNF0sIHJlY292ZXJbNF0sIGRlbls0XSwKKwkJIHVlbls0XSwgdWRtYVs0XSwgdW11bFs0XSwgYWN0aXZlOGJbNF0sIHJlY292ZXI4Yls0XTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYm1pZGVfZGV2OworCXVuc2lnbmVkIGludCB2LCB1LCBpOworCWludCBsZW47CisJdTE2IGMsIHc7CisJdTggdCwgeDsKKwljaGFyICpwID0gYnVmZmVyOworCisJdmlhX3ByaW50KCItLS0tLS0tLS0tVklBIEJ1c01hc3RlcmluZyBJREUgQ29uZmlndXJhdGlvbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0iKTsKKworCXZpYV9wcmludCgiRHJpdmVyIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgMy4zOCIpOworCXZpYV9wcmludCgiU291dGggQnJpZGdlOiAgICAgICAgICAgICAgICAgICAgICAgVklBICVzIiwKKwkJdmlhX2NvbmZpZy0+bmFtZSk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZ0KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJngpOworCXZpYV9wcmludCgiUmV2aXNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBICUjeCBJREUgJSN4IiwgdCwgeCk7CisJdmlhX3ByaW50KCJIaWdoZXN0IERNQSByYXRlOiAgICAgICAgICAgICAgICAgICAlcyIsCisJCXZpYV9kbWFbdmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQV0pOworCisJdmlhX3ByaW50KCJCTS1ETUEgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAlI2x4IiwgdmlhX2Jhc2UpOworCXZpYV9wcmludCgiUENJIGNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgJWQuJWRNSHoiLAorCQl2aWFfY2xvY2sgLyAxMDAwLCB2aWFfY2xvY2sgLyAxMDAgJSAxMCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFZJQV9NSVNDXzEsICZ0KTsKKwl2aWFfcHJpbnQoIk1hc3RlciBSZWFkICBDeWNsZSBJUkRZOiAgICAgICAgICAgICVkd3MiLAorCQkodCAmIDY0KSA+PiA2KTsKKwl2aWFfcHJpbnQoIk1hc3RlciBXcml0ZSBDeWNsZSBJUkRZOiAgICAgICAgICAgICVkd3MiLAorCQkodCAmIDMyKSA+PiA1KTsKKwl2aWFfcHJpbnQoIkJNIElERSBTdGF0dXMgUmVnaXN0ZXIgUmVhZCBSZXRyeTogICVzIiwKKwkJKHQgJiA4KSA/ICJ5ZXMiIDogIm5vIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFZJQV9NSVNDXzMsICZ0KTsKKwl2aWFfcHJpbnQoIk1heCBEUkRZIFB1bHNlIFdpZHRoOiAgICAgICAgICAgICAgICVzJXMiLAorCQl2aWFfY29udHJvbDNbKHQgJiAweDAzKV0sICh0ICYgMHgwMykgPyAiIFBDSSBjbG9ja3MiIDogIiIpOworCisJdmlhX3ByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVByaW1hcnkgSURFIgorCQkiLS0tLS0tLVNlY29uZGFyeSBJREUtLS0tLS0iKTsKKwl2aWFfcHJpbnQoIlJlYWQgRE1BIEZJRk8gZmx1c2g6ICAgJTEwcyUyMHMiLAorCQkodCAmIDB4ODApID8gInllcyIgOiAibm8iLCAodCAmIDB4NDApID8gInllcyIgOiAibm8iKTsKKwl2aWFfcHJpbnQoIkVuZCBTZWN0b3IgRklGTyBmbHVzaDogJTEwcyUyMHMiLAorCQkodCAmIDB4MjApID8gInllcyIgOiAibm8iLCAodCAmIDB4MTApID8gInllcyIgOiAibm8iKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgVklBX0lERV9DT05GSUcsICZ0KTsKKwl2aWFfcHJpbnQoIlByZWZldGNoIEJ1ZmZlcjogICAgICAgJTEwcyUyMHMiLAorCQkodCAmIDB4ODApID8gInllcyIgOiAibm8iLCAodCAmIDB4MjApID8gInllcyIgOiAibm8iKTsKKwl2aWFfcHJpbnQoIlBvc3QgV3JpdGUgQnVmZmVyOiAgICAgJTEwcyUyMHMiLAorCQkodCAmIDB4NDApID8gInllcyIgOiAibm8iLCAodCAmIDB4MTApID8gInllcyIgOiAibm8iKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgVklBX0lERV9FTkFCTEUsICZ0KTsKKwl2aWFfcHJpbnQoIkVuYWJsZWQ6ICAgICAgICAgICAgICAgJTEwcyUyMHMiLAorCQkodCAmIDB4MDIpID8gInllcyIgOiAibm8iLCAodCAmIDB4MDEpID8gInllcyIgOiAibm8iKTsKKworCWMgPSBpbmIodmlhX2Jhc2UgKyAweDAyKSB8IChpbmIodmlhX2Jhc2UgKyAweDBhKSA8PCA4KTsKKwl2aWFfcHJpbnQoIlNpbXBsZXggb25seTogICAgICAgICAgJTEwcyUyMHMiLAorCQkoYyAmIDB4ODApID8gInllcyIgOiAibm8iLCAoYyAmIDB4ODAwMCkgPyAieWVzIiA6ICJubyIpOworCisJdmlhX3ByaW50KCJDYWJsZSBUeXBlOiAgICAgICAgICAgICUxMHMlMjBzIiwKKwkJKHZpYV84MHcgJiAxKSA/ICI4MHciIDogIjQwdyIsICh2aWFfODB3ICYgMikgPyAiODB3IiA6ICI0MHciKTsKKworCXZpYV9wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLWRyaXZlMC0tLS1kcml2ZTEiCisJCSItLS0tZHJpdmUyLS0tLWRyaXZlMy0tLS0tIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFZJQV9BRERSRVNTX1NFVFVQLCAmdCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgVklBX0RSSVZFX1RJTUlORywgJnYpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBXzhCSVRfVElNSU5HLCAmdyk7CisKKwlpZiAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSkKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgVklBX1VETUFfVElNSU5HLCAmdSk7CisJZWxzZSB1ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKworCQlzZXR1cFtpXSAgICAgPSAoKHQgPj4gKCgzIC0gaSkgPDwgMSkpICYgMHgzKSArIDE7CisJCXJlY292ZXI4YltpXSA9ICgodyA+PiAoKDEgLSAoaSA+PiAxKSkgPDwgMykpICYgMHhmKSArIDE7CisJCWFjdGl2ZThiW2ldICA9ICgodyA+PiAoKCgxIC0gKGkgPj4gMSkpIDw8IDMpICsgNCkpICYgMHhmKSArIDE7CisJCWFjdGl2ZVtpXSAgICA9ICgodiA+PiAoKCgzIC0gaSkgPDwgMykgKyA0KSkgJiAweGYpICsgMTsKKwkJcmVjb3ZlcltpXSAgID0gKCh2ID4+ICgoMyAtIGkpIDw8IDMpKSAmIDB4ZikgKyAxOworCQl1ZG1hW2ldICAgICAgPSAoKHUgPj4gKCgzIC0gaSkgPDwgMykpICYgMHg3KSArIDI7CisJCXVtdWxbaV0gICAgICA9ICgodSA+PiAoKCgzIC0gaSkgJiAyKSA8PCAzKSkgJiAweDgpID8gMSA6IDI7CisJCXVlbltpXSAgICAgICA9ICgodSA+PiAoKDMgLSBpKSA8PCAzKSkgJiAweDIwKTsKKwkJZGVuW2ldICAgICAgID0gKGMgJiAoKGkgJiAxKSA/IDB4NDAgOiAweDIwKSA8PCAoKGkgJiAyKSA8PCAyKSk7CisKKwkJc3BlZWRbaV0gPSAyICogdmlhX2Nsb2NrIC8gKGFjdGl2ZVtpXSArIHJlY292ZXJbaV0pOworCQljeWNsZVtpXSA9IDEwMDAwMDAgKiAoYWN0aXZlW2ldICsgcmVjb3ZlcltpXSkgLyB2aWFfY2xvY2s7CisKKwkJaWYgKCF1ZW5baV0gfHwgIWRlbltpXSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSkgeworCisJCQljYXNlIFZJQV9VRE1BXzMzOgorCQkJCXNwZWVkW2ldID0gMiAqIHZpYV9jbG9jayAvIHVkbWFbaV07CisJCQkJY3ljbGVbaV0gPSAxMDAwMDAwICogdWRtYVtpXSAvIHZpYV9jbG9jazsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWSUFfVURNQV82NjoKKwkJCQlzcGVlZFtpXSA9IDQgKiB2aWFfY2xvY2sgLyAodWRtYVtpXSAqIHVtdWxbaV0pOworCQkJCWN5Y2xlW2ldID0gNTAwMDAwICogKHVkbWFbaV0gKiB1bXVsW2ldKSAvIHZpYV9jbG9jazsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWSUFfVURNQV8xMDA6CisJCQkJc3BlZWRbaV0gPSA2ICogdmlhX2Nsb2NrIC8gdWRtYVtpXTsKKwkJCQljeWNsZVtpXSA9IDMzMzMzMyAqIHVkbWFbaV0gLyB2aWFfY2xvY2s7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVklBX1VETUFfMTMzOgorCQkJCXNwZWVkW2ldID0gOCAqIHZpYV9jbG9jayAvIHVkbWFbaV07CisJCQkJY3ljbGVbaV0gPSAyNTAwMDAgKiB1ZG1hW2ldIC8gdmlhX2Nsb2NrOworCQkJCWJyZWFrOworCQl9CisJfQorCisJdmlhX3ByaW50X2RyaXZlKCJUcmFuc2ZlciBNb2RlOiAiLCAiJTEwcyIsCisJCWRlbltpXSA/ICh1ZW5baV0gPyAiVURNQSIgOiAiRE1BIikgOiAiUElPIik7CisKKwl2aWFfcHJpbnRfZHJpdmUoIkFkZHJlc3MgU2V0dXA6ICIsICIlOGRucyIsCisJCTEwMDAwMDAgKiBzZXR1cFtpXSAvIHZpYV9jbG9jayk7CisJdmlhX3ByaW50X2RyaXZlKCJDbWQgQWN0aXZlOiAgICAiLCAiJThkbnMiLAorCQkxMDAwMDAwICogYWN0aXZlOGJbaV0gLyB2aWFfY2xvY2spOworCXZpYV9wcmludF9kcml2ZSgiQ21kIFJlY292ZXJ5OiAgIiwgIiU4ZG5zIiwKKwkJMTAwMDAwMCAqIHJlY292ZXI4YltpXSAvIHZpYV9jbG9jayk7CisJdmlhX3ByaW50X2RyaXZlKCJEYXRhIEFjdGl2ZTogICAiLCAiJThkbnMiLAorCQkxMDAwMDAwICogYWN0aXZlW2ldIC8gdmlhX2Nsb2NrKTsKKwl2aWFfcHJpbnRfZHJpdmUoIkRhdGEgUmVjb3Zlcnk6ICIsICIlOGRucyIsCisJCTEwMDAwMDAgKiByZWNvdmVyW2ldIC8gdmlhX2Nsb2NrKTsKKwl2aWFfcHJpbnRfZHJpdmUoIkN5Y2xlIFRpbWU6ICAgICIsICIlOGRucyIsCisJCWN5Y2xlW2ldKTsKKwl2aWFfcHJpbnRfZHJpdmUoIlRyYW5zZmVyIFJhdGU6ICIsICIlNGQuJWRNQi9zIiwKKwkJc3BlZWRbaV0gLyAxMDAwLCBzcGVlZFtpXSAvIDEwMCAlIDEwKTsKKworCS8qIGhvcGluZyBpdCBpcyBsZXNzIHRoYW4gNEsuLi4gKi8KKwlsZW4gPSAocCAtIGJ1ZmZlcikgLSBvZmZzZXQ7CisJKmFkZHIgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlyZXR1cm4gbGVuID4gY291bnQgPyBjb3VudCA6IGxlbjsKK30KKworI2VuZGlmIC8qIERJU1BMQVlfVklBX1RJTUlOR1MgJiYgQ09ORklHX1BST0NfRlMgKi8KKworLyoqCisgKgl2aWFfc2V0X3NwZWVkCQkJLQl3cml0ZSB0aW1pbmcgcmVnaXN0ZXJzCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAZG46IGRldmljZQorICoJQHRpbWluZzogSURFIHRpbWluZyBkYXRhIHRvIHVzZQorICoKKyAqCXZpYV9zZXRfc3BlZWQgd3JpdGVzIHRpbWluZyB2YWx1ZXMgdG8gdGhlIGNoaXBzZXQgcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIHZvaWQgdmlhX3NldF9zcGVlZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBkbiwgc3RydWN0IGlkZV90aW1pbmcgKnRpbWluZykKK3sKKwl1OCB0OworCisJaWYgKH52aWFfY29uZmlnLT5mbGFncyAmIFZJQV9CQURfQVNUKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgVklBX0FERFJFU1NfU0VUVVAsICZ0KTsKKwkJdCA9ICh0ICYgfigzIDw8ICgoMyAtIGRuKSA8PCAxKSkpIHwgKChGSVQodGltaW5nLT5zZXR1cCwgMSwgNCkgLSAxKSA8PCAoKDMgLSBkbikgPDwgMSkpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBWSUFfQUREUkVTU19TRVRVUCwgdCk7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgVklBXzhCSVRfVElNSU5HICsgKDEgLSAoZG4gPj4gMSkpLAorCQkoKEZJVCh0aW1pbmctPmFjdDhiLCAxLCAxNikgLSAxKSA8PCA0KSB8IChGSVQodGltaW5nLT5yZWM4YiwgMSwgMTYpIC0gMSkpOworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgVklBX0RSSVZFX1RJTUlORyArICgzIC0gZG4pLAorCQkoKEZJVCh0aW1pbmctPmFjdGl2ZSwgMSwgMTYpIC0gMSkgPDwgNCkgfCAoRklUKHRpbWluZy0+cmVjb3ZlciwgMSwgMTYpIC0gMSkpOworCisJc3dpdGNoICh2aWFfY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSB7CisJCWNhc2UgVklBX1VETUFfMzM6ICB0ID0gdGltaW5nLT51ZG1hID8gKDB4ZTAgfCAoRklUKHRpbWluZy0+dWRtYSwgMiwgNSkgLSAyKSkgOiAweDAzOyBicmVhazsKKwkJY2FzZSBWSUFfVURNQV82NjogIHQgPSB0aW1pbmctPnVkbWEgPyAoMHhlOCB8IChGSVQodGltaW5nLT51ZG1hLCAyLCA5KSAtIDIpKSA6IDB4MGY7IGJyZWFrOworCQljYXNlIFZJQV9VRE1BXzEwMDogdCA9IHRpbWluZy0+dWRtYSA/ICgweGUwIHwgKEZJVCh0aW1pbmctPnVkbWEsIDIsIDkpIC0gMikpIDogMHgwNzsgYnJlYWs7CisJCWNhc2UgVklBX1VETUFfMTMzOiB0ID0gdGltaW5nLT51ZG1hID8gKDB4ZTAgfCAoRklUKHRpbWluZy0+dWRtYSwgMiwgOSkgLSAyKSkgOiAweDA3OyBicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuOworCX0KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFZJQV9VRE1BX1RJTUlORyArICgzIC0gZG4pLCB0KTsKK30KKworLyoqCisgKgl2aWFfc2V0X2RyaXZlCQktCWNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlCisgKglAZHJpdmU6IERyaXZlIHRvIHNldCB1cAorICoJQHNwZWVkOiBkZXNpcmVkIHNwZWVkCisgKgorICoJdmlhX3NldF9kcml2ZSgpIGNvbXB1dGVzIHRpbWluZyB2YWx1ZXMgY29uZmlndXJlcyB0aGUgZHJpdmUgYW5kCisgKgl0aGUgY2hpcHNldCB0byBhIGRlc2lyZWQgdHJhbnNmZXIgbW9kZS4gSXQgYWxzbyBjYW4gYmUgY2FsbGVkCisgKglieSB1cHBlciBsYXllcnMuCisgKi8KKworc3RhdGljIGludCB2aWFfc2V0X2RyaXZlKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpCit7CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBIV0lGKGRyaXZlKS0+ZHJpdmVzICsgKH5kcml2ZS0+ZG4gJiAxKTsKKwlzdHJ1Y3QgaWRlX3RpbWluZyB0LCBwOworCXVuc2lnbmVkIGludCBULCBVVDsKKworCWlmIChzcGVlZCAhPSBYRkVSX1BJT19TTE9XKQorCQlpZGVfY29uZmlnX2RyaXZlX3NwZWVkKGRyaXZlLCBzcGVlZCk7CisKKwlUID0gMTAwMDAwMDAwMCAvIHZpYV9jbG9jazsKKworCXN3aXRjaCAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSkgeworCQljYXNlIFZJQV9VRE1BXzMzOiAgIFVUID0gVDsgICBicmVhazsKKwkJY2FzZSBWSUFfVURNQV82NjogICBVVCA9IFQvMjsgYnJlYWs7CisJCWNhc2UgVklBX1VETUFfMTAwOiAgVVQgPSBULzM7IGJyZWFrOworCQljYXNlIFZJQV9VRE1BXzEzMzogIFVUID0gVC80OyBicmVhazsKKwkJZGVmYXVsdDogVVQgPSBUOworCX0KKworCWlkZV90aW1pbmdfY29tcHV0ZShkcml2ZSwgc3BlZWQsICZ0LCBULCBVVCk7CisKKwlpZiAocGVlci0+cHJlc2VudCkgeworCQlpZGVfdGltaW5nX2NvbXB1dGUocGVlciwgcGVlci0+Y3VycmVudF9zcGVlZCwgJnAsIFQsIFVUKTsKKwkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOworCX0KKworCXZpYV9zZXRfc3BlZWQoSFdJRihkcml2ZSktPnBjaV9kZXYsIGRyaXZlLT5kbiwgJnQpOworCisJaWYgKCFkcml2ZS0+aW5pdF9zcGVlZCkKKwkJZHJpdmUtPmluaXRfc3BlZWQgPSBzcGVlZDsKKwlkcml2ZS0+Y3VycmVudF9zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmlhODJjeHh4X3R1bmVfZHJpdmUJLQlQSU8gc2V0dXAKKyAqCUBkcml2ZTogZHJpdmUgdG8gc2V0IHVwCisgKglAcGlvOiBtb2RlIHRvIHVzZSAoMjU1IGZvciAnYmVzdCBwb3NzaWJsZScpCisgKgorICoJQSBjYWxsYmFjayBmcm9tIHRoZSB1cHBlciBsYXllcnMgZm9yIFBJTy1vbmx5IHR1bmluZy4KKyAqLworCitzdGF0aWMgdm9pZCB2aWE4MmN4eHhfdHVuZV9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZiAocGlvID09IDI1NSkgeworCQl2aWFfc2V0X2RyaXZlKGRyaXZlLAorCQkJaWRlX2ZpbmRfYmVzdF9tb2RlKGRyaXZlLCBYRkVSX1BJTyB8IFhGRVJfRVBJTykpOworCQlyZXR1cm47CisJfQorCisJdmlhX3NldF9kcml2ZShkcml2ZSwgWEZFUl9QSU9fMCArIG1pbl90KHU4LCBwaW8sIDUpKTsKK30KKworLyoqCisgKgl2aWE4MmN4eHhfaWRlX2RtYV9jaGVjawkJLQlzZXQgdXAgZm9yIERNQSBpZiBwb3NzaWJsZQorICoJQGRyaXZlOiBJREUgZHJpdmUgdG8gc2V0IHVwCisgKgorICoJU2V0IHVwIHRoZSBkcml2ZSBmb3IgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIHNwZWVkIGNvbnNpZGVyaW5nIHRoZQorICoJZHJpdmVyLCBjb250cm9sbGVyIGFuZCBjYWJsZQorICovCisgCitzdGF0aWMgaW50IHZpYTgyY3h4eF9pZGVfZG1hX2NoZWNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJdTE2IHc4MCA9IEhXSUYoZHJpdmUpLT51ZG1hX2ZvdXI7CisKKwl1MTYgc3BlZWQgPSBpZGVfZmluZF9iZXN0X21vZGUoZHJpdmUsCisJCVhGRVJfUElPIHwgWEZFUl9FUElPIHwgWEZFUl9TV0RNQSB8IFhGRVJfTVdETUEgfAorCQkodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSA/IFhGRVJfVURNQSA6IDApIHwKKwkJKHc4MCAmJiAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSkgPj0gVklBX1VETUFfNjYgPyBYRkVSX1VETUFfNjYgOiAwKSB8CisJCSh3ODAgJiYgKHZpYV9jb25maWctPmZsYWdzICYgVklBX1VETUEpID49IFZJQV9VRE1BXzEwMCA/IFhGRVJfVURNQV8xMDAgOiAwKSB8CisJCSh3ODAgJiYgKHZpYV9jb25maWctPmZsYWdzICYgVklBX1VETUEpID49IFZJQV9VRE1BXzEzMyA/IFhGRVJfVURNQV8xMzMgOiAwKSk7CisKKwl2aWFfc2V0X2RyaXZlKGRyaXZlLCBzcGVlZCk7CisKKwlpZiAoZHJpdmUtPmF1dG9kbWEgJiYgKHNwZWVkICYgWEZFUl9NT0RFKSAhPSBYRkVSX1BJTykKKwkJcmV0dXJuIEhXSUYoZHJpdmUpLT5pZGVfZG1hX29uKGRyaXZlKTsKKwlyZXR1cm4gSFdJRihkcml2ZSktPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworfQorCisvKioKKyAqCWluaXRfY2hpcHNldF92aWE4MmN4eHgJLQlpbml0aWFsaXphdGlvbiBoYW5kbGVyCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAbmFtZTogTmFtZSBvZiBpbnRlcmZhY2UKKyAqCisgKglUaGUgaW5pdGlhbGl6YXRpb24gY2FsbGJhY2suIEhlcmUgd2UgZGV0ZXJtaW5lIHRoZSBJREUgY2hpcCB0eXBlCisgKglhbmQgaW5pdGlhbGl6ZSBpdHMgZHJpdmUgaW5kZXBlbmRlbnQgcmVnaXN0ZXJzLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF92aWE4MmN4eHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaXNhID0gTlVMTDsKKwl1OCB0LCB2OworCXVuc2lnbmVkIGludCB1OworCWludCBpOworCisJLyoKKwkgKiBGaW5kIHRoZSBJU0EgYnJpZGdlIHRvIHNlZSBob3cgZ29vZCB0aGUgSURFIGlzLgorCSAqLworCisJZm9yICh2aWFfY29uZmlnID0gdmlhX2lzYV9icmlkZ2VzOyB2aWFfY29uZmlnLT5pZDsgdmlhX2NvbmZpZysrKQorCQlpZiAoKGlzYSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSArCisJCQkhISh2aWFfY29uZmlnLT5mbGFncyAmIFZJQV9CQURfSUQpLAorCQkJdmlhX2NvbmZpZy0+aWQsIE5VTEwpKSkgeworCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2EsIFBDSV9SRVZJU0lPTl9JRCwgJnQpOworCQkJaWYgKHQgPj0gdmlhX2NvbmZpZy0+cmV2X21pbiAmJgorCQkJICAgIHQgPD0gdmlhX2NvbmZpZy0+cmV2X21heCkKKwkJCQlicmVhazsKKwkJfQorCisJaWYgKCF2aWFfY29uZmlnLT5pZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWUF9JREU6IFVua25vd24gVklBIFNvdXRoQnJpZGdlLCBkaXNhYmxpbmcgRE1BLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogQ2hlY2sgODAtd2lyZSBjYWJsZSBwcmVzZW5jZSBhbmQgc2V0dXAgQ2xrNjYuCisJICovCisKKwlzd2l0Y2ggKHZpYV9jb25maWctPmZsYWdzICYgVklBX1VETUEpIHsKKworCQljYXNlIFZJQV9VRE1BXzY2OgorCQkJLyogRW5hYmxlIENsazY2ICovCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBWSUFfVURNQV9USU1JTkcsICZ1KTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBWSUFfVURNQV9USU1JTkcsIHV8MHg4MDAwOCk7CisJCQlmb3IgKGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpCisJCQkJaWYgKCgodSA+PiAoaSAmIDE2KSkgJiA4KSAmJgorCQkJCSAgICAoKHUgPj4gaSkgJiAweDIwKSAmJgorCQkJCSAgICAgKCgodSA+PiBpKSAmIDcpIDwgMikpIHsKKwkJCQkJLyoKKwkJCQkJICogMnggUENJIGNsb2NrIGFuZAorCQkJCQkgKiBVRE1BIHcvIDwgM1QvY3ljbGUKKwkJCQkJICovCisJCQkJCXZpYV84MHcgfD0gKDEgPDwgKDEgLSAoaSA+PiA0KSkpOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVklBX1VETUFfMTAwOgorCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgVklBX1VETUFfVElNSU5HLCAmdSk7CisJCQlmb3IgKGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpCisJCQkJaWYgKCgodSA+PiBpKSAmIDB4MTApIHx8CisJCQkJICAgICgoKHUgPj4gaSkgJiAweDIwKSAmJgorCQkJCSAgICAgKCgodSA+PiBpKSAmIDcpIDwgNCkpKSB7CisJCQkJCS8qIEJJT1MgODAtd2lyZSBiaXQgb3IKKwkJCQkJICogVURNQSB3LyA8IDYwbnMvY3ljbGUKKwkJCQkJICovCisJCQkJCXZpYV84MHcgfD0gKDEgPDwgKDEgLSAoaSA+PiA0KSkpOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVklBX1VETUFfMTMzOgorCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgVklBX1VETUFfVElNSU5HLCAmdSk7CisJCQlmb3IgKGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpCisJCQkJaWYgKCgodSA+PiBpKSAmIDB4MTApIHx8CisJCQkJICAgICgoKHUgPj4gaSkgJiAweDIwKSAmJgorCQkJCSAgICAgKCgodSA+PiBpKSAmIDcpIDwgNikpKSB7CisJCQkJCS8qIEJJT1MgODAtd2lyZSBiaXQgb3IKKwkJCQkJICogVURNQSB3LyA8IDYwbnMvY3ljbGUKKwkJCQkJICovCisJCQkJCXZpYV84MHcgfD0gKDEgPDwgKDEgLSAoaSA+PiA0KSkpOworCQkJCX0KKwkJCWJyZWFrOworCisJfQorCisJLyogRGlzYWJsZSBDbGs2NiAqLworCWlmICh2aWFfY29uZmlnLT5mbGFncyAmIFZJQV9CQURfQ0xLNjYpIHsKKwkJLyogV291bGQgY2F1c2UgdHJvdWJsZSBvbiA1OTZhIGFuZCA2ODYgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgVklBX1VETUFfVElNSU5HLCAmdSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBWSUFfVURNQV9USU1JTkcsIHUgJiB+MHg4MDAwOCk7CisJfQorCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIGludGVyZmFjZXMgYXJlIGVuYWJsZWQuCisJICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFZJQV9JREVfRU5BQkxFLCAmdik7CisKKwkvKgorCSAqIFNldCB1cCBGSUZPIHNpemVzIGFuZCB0aHJlc2hvbGRzLgorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBWSUFfRklGT19DT05GSUcsICZ0KTsKKworCS8qIERpc2FibGUgUFJFUSMgdGlsbCBEREFDSyMgKi8KKwlpZiAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfQkFEX1BSRVEpIHsKKwkJLyogV291bGQgY3Jhc2ggb24gNTg2YiByZXYgNDEgKi8KKwkJdCAmPSAweDdmOworCX0KKworCS8qIEZpeCBGSUZPIHNwbGl0IGJldHdlZW4gY2hhbm5lbHMgKi8KKwlpZiAodmlhX2NvbmZpZy0+ZmxhZ3MgJiBWSUFfU0VUX0ZJRk8pIHsKKwkJdCAmPSAodCAmIDB4OWYpOworCQlzd2l0Y2ggKHYgJiAzKSB7CisJCQljYXNlIDI6IHQgfD0gMHgwMDsgYnJlYWs7CS8qIDE2IG9uIHByaW1hcnkgKi8KKwkJCWNhc2UgMTogdCB8PSAweDYwOyBicmVhazsJLyogMTYgb24gc2Vjb25kYXJ5ICovCisJCQljYXNlIDM6IHQgfD0gMHgyMDsgYnJlYWs7CS8qIDggcHJpIDggc2VjICovCisJCX0KKwl9CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBWSUFfRklGT19DT05GSUcsIHQpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgc3lzdGVtIGJ1cyBjbG9jay4KKwkgKi8KKworCXZpYV9jbG9jayA9IHN5c3RlbV9idXNfY2xvY2soKSAqIDEwMDA7CisKKwlzd2l0Y2ggKHZpYV9jbG9jaykgeworCQljYXNlIDMzMDAwOiB2aWFfY2xvY2sgPSAzMzMzMzsgYnJlYWs7CisJCWNhc2UgMzcwMDA6IHZpYV9jbG9jayA9IDM3NTAwOyBicmVhazsKKwkJY2FzZSA0MTAwMDogdmlhX2Nsb2NrID0gNDE2NjY7IGJyZWFrOworCX0KKworCWlmICh2aWFfY2xvY2sgPCAyMDAwMCB8fCB2aWFfY2xvY2sgPiA1MDAwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWUF9JREU6IFVzZXIgZ2l2ZW4gUENJIGNsb2NrIHNwZWVkICIKKwkJCSJpbXBvc3NpYmxlICglZCksIHVzaW5nIDMzIE1IeiBpbnN0ZWFkLlxuIiwgdmlhX2Nsb2NrKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBfSURFOiBVc2UgaWRlMD1hdGE2NiBpZiB5b3Ugd2FudCAiCisJCQkidG8gYXNzdW1lIDgwLXdpcmUgY2FibGUuXG4iKTsKKwkJdmlhX2Nsb2NrID0gMzMzMzM7CisJfQorCisJLyoKKwkgKiBQcmludCB0aGUgYm9vdCBtZXNzYWdlLgorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhLCBQQ0lfUkVWSVNJT05fSUQsICZ0KTsKKwlwcmludGsoS0VSTl9JTkZPICJWUF9JREU6IFZJQSAlcyAocmV2ICUwMngpIElERSAlcyAiCisJCSJjb250cm9sbGVyIG9uIHBjaSVzXG4iLAorCQl2aWFfY29uZmlnLT5uYW1lLCB0LAorCQl2aWFfZG1hW3ZpYV9jb25maWctPmZsYWdzICYgVklBX1VETUFdLAorCQlwY2lfbmFtZShkZXYpKTsKKworCS8qCisJICogU2V0dXAgL3Byb2MvaWRlL3ZpYSBlbnRyeS4KKwkgKi8KKworI2lmIGRlZmluZWQoRElTUExBWV9WSUFfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKwlpZiAoIXZpYV9wcm9jKSB7CisJCXZpYV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJCWJtaWRlX2RldiA9IGRldjsKKwkJaXNhX2RldiA9IGlzYTsKKwkJaWRlX3BjaV9jcmVhdGVfaG9zdF9wcm9jKCJ2aWEiLCB2aWFfZ2V0X2luZm8pOworCQl2aWFfcHJvYyA9IDE7CisJfQorI2VuZGlmIC8qIERJU1BMQVlfVklBX1RJTUlOR1MgJiYgQ09ORklHX1BST0NfRlMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl92aWE4MmN4eHgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpbnQgaTsKKworCWh3aWYtPmF1dG9kbWEgPSAwOworCisJaHdpZi0+dHVuZXByb2MgPSAmdmlhODJjeHh4X3R1bmVfZHJpdmU7CisJaHdpZi0+c3BlZWRwcm9jID0gJnZpYV9zZXRfZHJpdmU7CisKKworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKKwlpZihfbWFjaGluZSA9PSBfTUFDSF9jaHJwICYmIF9jaHJwX3R5cGUgPT0gX0NIUlBfUGVnYXNvcykgeworCQlod2lmLT5pcnEgPSBod2lmLT5jaGFubmVsID8gMTUgOiAxNDsKKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaHdpZi0+ZHJpdmVzW2ldLmlvXzMyYml0ID0gMTsKKwkJaHdpZi0+ZHJpdmVzW2ldLnVubWFzayA9ICh2aWFfY29uZmlnLT5mbGFncyAmIFZJQV9OT19VTk1BU0spID8gMCA6IDE7CisJCWh3aWYtPmRyaXZlc1tpXS5hdXRvdHVuZSA9IDE7CisJCWh3aWYtPmRyaXZlc1tpXS5kbiA9IGh3aWYtPmNoYW5uZWwgKiAyICsgaTsKKwl9CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKQorCQlyZXR1cm47CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCWh3aWYtPnVsdHJhX21hc2sgPSAweDdmOworCWh3aWYtPm13ZG1hX21hc2sgPSAweDA3OworCWh3aWYtPnN3ZG1hX21hc2sgPSAweDA3OworCisJaWYgKCFod2lmLT51ZG1hX2ZvdXIpCisJCWh3aWYtPnVkbWFfZm91ciA9ICh2aWFfODB3ID4+IGh3aWYtPmNoYW5uZWwpICYgMTsKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJnZpYTgyY3h4eF9pZGVfZG1hX2NoZWNrOworCWlmICghbm9hdXRvZG1hKQorCQlod2lmLT5hdXRvZG1hID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworfQorCitzdGF0aWMgaWRlX3BjaV9kZXZpY2VfdCB2aWE4MmN4eHhfY2hpcHNldCBfX2RldmluaXRkYXRhID0geworCS5uYW1lCQk9ICJWUF9JREUiLAorCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfdmlhODJjeHh4LAorCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfdmlhODJjeHh4LAorCS5jaGFubmVscwk9IDIsCisJLmF1dG9kbWEJPSBOT0FVVE9ETUEsCisJLmVuYWJsZWJpdHMJPSB7ezB4NDAsMHgwMiwweDAyfSwgezB4NDAsMHgwMSwweDAxfX0sCisJLmJvb3RhYmxlCT0gT05fQk9BUkQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZGVfc2V0dXBfcGNpX2RldmljZShkZXYsICZ2aWE4MmN4eHhfY2hpcHNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU3Nl8xLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWFfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgCQk9ICJWSUFfSURFIiwKKwkuaWRfdGFibGUgCT0gdmlhX3BjaV90YmwsCisJLnByb2JlIAkJPSB2aWFfaW5pdF9vbmUsCit9OworCitzdGF0aWMgaW50IHZpYV9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmlhX2lkZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiVm9qdGVjaCBQYXZsaWssIE1pY2hlbCBBdWJyeSwgSmVmZiBHYXJ6aWssIEFuZHJlIEhlZHJpY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIFZJQSBJREUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BwYy9tcGM4eHguYyBiL2RyaXZlcnMvaWRlL3BwYy9tcGM4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODBjNjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcHBjL21wYzh4eC5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BwYy9pZGUtbTh4eC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBXb2xmZ2FuZyBEZW5rLCB3ZEBkZW54LmRlCisgKiAgTW9kaWZpZWQgZm9yIGRpcmVjdCBJREUgaW50ZXJmYWNlCisgKglieSBUaG9tYXMgTGFuZ2UsIHRob21hc0Bjb3JlbGF0dXMuY29tCisgKiAgTW9kaWZpZWQgZm9yIGRpcmVjdCBJREUgaW50ZXJmYWNlIG9uIDh4eCB3aXRob3V0IHVzaW5nIHRoZSBQQ01DSUEKKyAqICBjb250cm9sbGVyCisgKglieSBTdGV2ZW4uU2Nob2x6QGltYy1iZXJsaW4uZGUKKyAqICBNb3ZlZCBvdXQgb2YgYXJjaC9wcGMva2VybmVsL204eHhfc2V0dXAuYywgb3RoZXIgbWlub3IgY2xlYW51cHMKKyAqCWJ5IE1hdGhldyBMb2NrZSA8bWF0dGxAbXZpc3RhLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9yZXNpZHVhbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lkZS5oPgorI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworc3RhdGljIGludCBpZGVudGlmeSAgKHZvbGF0aWxlIHU4ICpwKTsKK3N0YXRpYyB2b2lkIHByaW50X2ZpeGVkICh2b2xhdGlsZSB1OCAqcCk7CitzdGF0aWMgdm9pZCBwcmludF9mdW5jaWQgKGludCBmdW5jKTsKK3N0YXRpYyBpbnQgY2hlY2tfaWRlX2RldmljZSAodW5zaWduZWQgbG9uZyBiYXNlKTsKKworc3RhdGljIHZvaWQgaWRlX2ludGVycnVwdF9hY2sgKHZvaWQgKmRldik7CitzdGF0aWMgdm9pZCBtOHh4X2lkZV90dW5lcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbyk7CisKK3R5cGVkZWYJc3RydWN0IGlkZV9pb3BvcnRfZGVzYyB7CisJdW5zaWduZWQgbG9uZwliYXNlX29mZjsJCS8qIE9mZnNldCB0byBQQ01DSUEgbWVtb3J5CSovCisJdW5zaWduZWQgbG9uZwlyZWdfb2ZmW0lERV9OUl9QT1JUU107CS8qIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cwkqLworCWludAkJaXJxOwkJCS8qIElSUQkJCQkqLworfSBpZGVfaW9wb3J0X2Rlc2NfdDsKKworaWRlX2lvcG9ydF9kZXNjX3QgaW9wb3J0X2RzY1tNQVhfSFdJRlNdID0geworI2lmZGVmIElERTBfQkFTRV9PRkZTRVQKKwl7IElERTBfQkFTRV9PRkZTRVQsCisJICAgIHsKKwkJSURFMF9EQVRBX1JFR19PRkZTRVQsCisJCUlERTBfRVJST1JfUkVHX09GRlNFVCwKKwkJSURFMF9OU0VDVE9SX1JFR19PRkZTRVQsCisJCUlERTBfU0VDVE9SX1JFR19PRkZTRVQsCisJCUlERTBfTENZTF9SRUdfT0ZGU0VULAorCQlJREUwX0hDWUxfUkVHX09GRlNFVCwKKwkJSURFMF9TRUxFQ1RfUkVHX09GRlNFVCwKKwkJSURFMF9TVEFUVVNfUkVHX09GRlNFVCwKKwkJSURFMF9DT05UUk9MX1JFR19PRkZTRVQsCisJCUlERTBfSVJRX1JFR19PRkZTRVQsCisJICAgIH0sCisJICAgIElERTBfSU5URVJSVVBULAorCX0sCisjaWZkZWYgSURFMV9CQVNFX09GRlNFVAorCXsgSURFMV9CQVNFX09GRlNFVCwKKwkgICAgeworCQlJREUxX0RBVEFfUkVHX09GRlNFVCwKKwkJSURFMV9FUlJPUl9SRUdfT0ZGU0VULAorCQlJREUxX05TRUNUT1JfUkVHX09GRlNFVCwKKwkJSURFMV9TRUNUT1JfUkVHX09GRlNFVCwKKwkJSURFMV9MQ1lMX1JFR19PRkZTRVQsCisJCUlERTFfSENZTF9SRUdfT0ZGU0VULAorCQlJREUxX1NFTEVDVF9SRUdfT0ZGU0VULAorCQlJREUxX1NUQVRVU19SRUdfT0ZGU0VULAorCQlJREUxX0NPTlRST0xfUkVHX09GRlNFVCwKKwkJSURFMV9JUlFfUkVHX09GRlNFVCwKKwkgICAgfSwKKwkgICAgSURFMV9JTlRFUlJVUFQsCisJfSwKKyNlbmRpZiAvKiBJREUxX0JBU0VfT0ZGU0VUICovCisjZW5kaWYJLyogSURFMF9CQVNFX09GRlNFVCAqLworfTsKKworaWRlX3Bpb190aW1pbmdzX3QgaWRlX3Bpb19jbG9ja3NbNl07CitpbnQgaG9sZF90aW1lWzZdID0gIHszMCwgMjAsIDE1LCAxMCwgMTAsIDEwIH07ICAgLyogUElPIE1vZGUgNSB3aXRoIElPUkRZIChub25zdGFuZGFyZCkgKi8KKworLyoKKyAqIFdhcm5pbmc6IG9ubHkgMSAoT05FKSBQQ01DSUEgc2xvdCBzdXBwb3J0ZWQgaGVyZSwKKyAqIHdoaWNoIG11c3QgYmUgY29ycmVjdGx5IGluaXRpYWxpemVkIGJ5IHRoZSBmaXJtd2FyZSAoUFBDQm9vdCkuCisgKi8KK3N0YXRpYyBpbnQgX3Nsb3RfID0gLTE7CQkJLyogd2lsbCBiZSByZWFkIGZyb20gUENNQ0lBIHJlZ2lzdGVycyAgICovCisKKy8qIE1ha2UgY2xvY2sgY3ljbGVzIGFuZCBhbHdheXMgcm91bmQgdXAgKi8KKyNkZWZpbmUgUENNQ0lBX01LX0NMS1MoIHQsIFQgKSAoKCAodCkgKiAoKFQpLzEwMDAwMDApICsgOTk5VSApIC8gMTAwMFUgKQorCisKKworLyoKKyAqIElERSBzdHVmZi4KKyAqLworc3RhdGljIGludAorbTh4eF9pZGVfZGVmYXVsdF9pcnEodW5zaWduZWQgbG9uZyBiYXNlKQoreworI2lmZGVmIENPTkZJR19CTEtfREVWX01QQzh4eF9JREUKKwlpZiAoYmFzZSA+PSBNQVhfSFdJRlMpCisJCXJldHVybiAwOworCisJcHJpbnRrKCJbJWRdIG04eHhfaWRlX2RlZmF1bHRfaXJxICVkXG4iLF9fTElORV9fLGlvcG9ydF9kc2NbYmFzZV0uaXJxKTsKKwkKKwlyZXR1cm4gKGlvcG9ydF9kc2NbYmFzZV0uaXJxKTsKKyNlbHNlCisgICAgICAgIHJldHVybiA5OworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCittOHh4X2lkZV9kZWZhdWx0X2lvX2Jhc2UoaW50IGluZGV4KQoreworICAgICAgICByZXR1cm4gaW5kZXg7Cit9CisKKyNkZWZpbmUgTThYWF9QQ01DSUFfQ0QyKHNsb3QpICAgICAgKDB4MTAwMDAwMDAgPj4gKHNsb3QgPDwgNCkpCisjZGVmaW5lIE04WFhfUENNQ0lBX0NEMShzbG90KSAgICAgICgweDA4MDAwMDAwID4+IChzbG90IDw8IDQpKQorCisvKgorICogVGhlIFRRTTg1MEwgaGFyZHdhcmUgaGFzIHR3byBwaW5zIHN3YXBwZWQhIEdycnJyZ2ghCisgKi8KKyNpZmRlZglDT05GSUdfVFFNODUwTAorI2RlZmluZSBfX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQJUENNQ0lBX0dDUlhfQ1hPRQorI2RlZmluZSBfX01ZX1BDTUNJQV9HQ1JYX0NYT0UJCVBDTUNJQV9HQ1JYX0NYUkVTRVQKKyNlbHNlCisjZGVmaW5lIF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVAlQQ01DSUFfR0NSWF9DWFJFU0VUCisjZGVmaW5lIF9fTVlfUENNQ0lBX0dDUlhfQ1hPRQkJUENNQ0lBX0dDUlhfQ1hPRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX01QQzh4eF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2RlZmluZSBQQ01DSUFfU0NITFZMIElERTBfSU5URVJSVVBUCS8qIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0IExldmVsCSovCitzdGF0aWMgaW50IHBjbWNpYV9zY2hsdmwgPSBQQ01DSUFfU0NITFZMOworI2VuZGlmCisKKy8qCisgKiBTZWUgaW5jbHVkZS9saW51eC9pZGUuaCBmb3IgZGVmaW5pdGlvbiBvZiBod19yZWdzX3QgKHAsIGJhc2UpCisgKi8KKworLyoKKyAqIG04eHhfaWRlX2luaXRfaHdpZl9wb3J0cyBmb3IgYSBkaXJlY3QgSURFIGludGVyZmFjZSBfdXNpbmdfCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkgfHwgZGVmaW5lZChDT05GSUdfSURFXzh4eF9ESVJFQ1QpCitzdGF0aWMgdm9pZAorbTh4eF9pZGVfaW5pdF9od2lmX3BvcnRzKGh3X3JlZ3NfdCAqaHcsIHVuc2lnbmVkIGxvbmcgZGF0YV9wb3J0LCAKKwkJdW5zaWduZWQgbG9uZyBjdHJsX3BvcnQsIGludCAqaXJxKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBody0+aW9fcG9ydHM7CisJaW50IGk7CisKKwl0eXBlZGVmIHN0cnVjdCB7CisJCXVsb25nIGJyOworCQl1bG9uZyBvcjsKKwl9IHBjbWNpYV93aW5fdDsKKwl2b2xhdGlsZSBwY21jaWFfd2luX3QgKndpbjsKKwl2b2xhdGlsZSBwY21jb25mOHh4X3QgKnBjbXA7CisKKwl1aW50ICpwZ2NyeDsKKwl1MzIgcGNtY2lhX3BoeV9iYXNlOworCXUzMiBwY21jaWFfcGh5X2VuZDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBwY21jaWFfYmFzZSA9IDA7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCisJKnAgPSAwOworCWlmIChpcnEpCisJCSppcnEgPSAwOworCisJcGNtcCA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEpKTsKKworCWlmICghcGNtY2lhX2Jhc2UpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlYWQgb3V0IFBDTUNJQSByZWdpc3RlcnMuIFNpbmNlIHRoZSByZXNldCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgKiBhcmUgdW5kZWZpbmVkLCB3ZSBzdXJlIGhvcGUgdGhhdCB0aGV5IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAqIHNldCB1cCBieSBmaXJtd2FyZQorCQkgKi8KKworCQkvKiBTY2FuIGFsbCByZWdpc3RlcnMgZm9yIHZhbGlkIHNldHRpbmdzICovCisJCXBjbWNpYV9waHlfYmFzZSA9IDB4RkZGRkZGRkY7CisJCXBjbWNpYV9waHlfZW5kID0gMDsKKwkJLyogYnIwIGlzIHN0YXJ0IG9mIGJyWCBhbmQgb3JYIHJlZ3MgKi8KKwkJd2luID0gKHBjbWNpYV93aW5fdCAqKSBcCisJCQkoJigoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwKSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmICh3aW4tPm9yICYgMSkgewkvKiBUaGlzIGJhbmsgaXMgbWFya2VkIGFzIHZhbGlkICovCisJCQkJaWYgKHdpbi0+YnIgPCBwY21jaWFfcGh5X2Jhc2UpIHsKKwkJCQkJcGNtY2lhX3BoeV9iYXNlID0gd2luLT5icjsKKwkJCQl9CisJCQkJaWYgKCh3aW4tPmJyICsgUENNQ0lBX01FTV9TSVpFKSA+IHBjbWNpYV9waHlfZW5kKSB7CisJCQkJCXBjbWNpYV9waHlfZW5kICA9IHdpbi0+YnIgKyBQQ01DSUFfTUVNX1NJWkU7CisJCQkJfQorCQkJCS8qIENoZWNrIHdoaWNoIHNsb3QgdGhhdCBoYXMgYmVlbiBkZWZpbmVkICovCisJCQkJX3Nsb3RfID0gKHdpbi0+b3IgPj4gMikgJiAxOworCisJCQl9CQkJCQkvKiBWYWxpZCBiYW5rICovCisJCQl3aW4rKzsKKwkJfQkJCQkJCS8qIGZvciAqLworCisJCXByaW50ayAoIlBDTUNJQSBzbG90ICVjOiBwaHlzIG1lbSAlMDh4Li4uJTA4eCAoc2l6ZSAlMDh4KVxuIiwKKwkJCSdBJyArIF9zbG90XywKKwkJCXBjbWNpYV9waHlfYmFzZSwgcGNtY2lhX3BoeV9lbmQsCisJCQlwY21jaWFfcGh5X2VuZCAtIHBjbWNpYV9waHlfYmFzZSk7CisKKwkJcGNtY2lhX2Jhc2U9KHVuc2lnbmVkIGxvbmcpaW9yZW1hcChwY21jaWFfcGh5X2Jhc2UsCisJCQkJCQkgICBwY21jaWFfcGh5X2VuZC1wY21jaWFfcGh5X2Jhc2UpOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrICgiUENNQ0lBIHZpcnQgYmFzZTogJTA4bHhcbiIsIHBjbWNpYV9iYXNlKTsKKyNlbmRpZgorCQkvKiBDb21wdXRlIGNsb2NrIGN5Y2xlcyBmb3IgUElPIHRpbWluZ3MgKi8KKwkJZm9yIChpPTA7IGk8NjsgKytpKSB7CisJCQliZF90CSpiaW5mbyA9IChiZF90ICopX19yZXM7CisKKwkJCWhvbGRfdGltZVtpXSAgID0KKwkJCQlQQ01DSUFfTUtfQ0xLUyAoaG9sZF90aW1lW2ldLAorCQkJCQkJYmluZm8tPmJpX2J1c2ZyZXEpOworCQkJaWRlX3Bpb19jbG9ja3NbaV0uc2V0dXBfdGltZSAgPQorCQkJCVBDTUNJQV9NS19DTEtTIChpZGVfcGlvX3RpbWluZ3NbaV0uc2V0dXBfdGltZSwKKwkJCQkJCWJpbmZvLT5iaV9idXNmcmVxKTsKKwkJCWlkZV9waW9fY2xvY2tzW2ldLmFjdGl2ZV90aW1lID0KKwkJCQlQQ01DSUFfTUtfQ0xLUyAoaWRlX3Bpb190aW1pbmdzW2ldLmFjdGl2ZV90aW1lLAorCQkJCQkJYmluZm8tPmJpX2J1c2ZyZXEpOworCQkJaWRlX3Bpb19jbG9ja3NbaV0uY3ljbGVfdGltZSAgPQorCQkJCVBDTUNJQV9NS19DTEtTIChpZGVfcGlvX3RpbWluZ3NbaV0uY3ljbGVfdGltZSwKKwkJCQkJCWJpbmZvLT5iaV9idXNmcmVxKTsKKyNpZiAwCisJCQlwcmludGsgKCJQSU8gbW9kZSAlZCB0aW1pbmdzOiAlZC8lZC8lZCA9PiAlZC8lZC8lZFxuIiwKKwkJCQlpLAorCQkJCWlkZV9waW9fY2xvY2tzW2ldLnNldHVwX3RpbWUsCisJCQkJaWRlX3Bpb19jbG9ja3NbaV0uYWN0aXZlX3RpbWUsCisJCQkJaWRlX3Bpb19jbG9ja3NbaV0uaG9sZF90aW1lLAorCQkJCWlkZV9waW9fY2xvY2tzW2ldLmN5Y2xlX3RpbWUsCisJCQkJaWRlX3Bpb190aW1pbmdzW2ldLnNldHVwX3RpbWUsCisJCQkJaWRlX3Bpb190aW1pbmdzW2ldLmFjdGl2ZV90aW1lLAorCQkJCWlkZV9waW9fdGltaW5nc1tpXS5ob2xkX3RpbWUsCisJCQkJaWRlX3Bpb190aW1pbmdzW2ldLmN5Y2xlX3RpbWUpOworI2VuZGlmCisJCX0KKwl9CisKKwlpZiAoZGF0YV9wb3J0ID49IE1BWF9IV0lGUykKKwkJcmV0dXJuOworCisJaWYgKF9zbG90XyA9PSAtMSkgeworCQlwcmludGsgKCJQQ01DSUEgc2xvdCBoYXMgbm90IGJlZW4gZGVmaW5lZCEgVXNpbmcgQSBhcyBkZWZhdWx0XG4iKTsKKwkJX3Nsb3RfID0gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKKworI2lmZGVmIERFQlVHCisJcHJpbnRrICgiUElQUiA9IDB4JTA4WCAgc2xvdCAlYyA9PT4gbWFzayA9IDB4JVhcbiIsCisJCXBjbXAtPnBjbWNfcGlwciwKKwkJJ0EnICsgX3Nsb3RfLAorCQlNOFhYX1BDTUNJQV9DRDEoX3Nsb3RfKSB8IE04WFhfUENNQ0lBX0NEMihfc2xvdF8pICk7CisjZW5kaWYgLyogREVCVUcgKi8KKworCWlmIChwY21wLT5wY21jX3BpcHIgJiAoTThYWF9QQ01DSUFfQ0QxKF9zbG90Xyl8TThYWF9QQ01DSUFfQ0QyKF9zbG90XykpKSB7CisJCXByaW50ayAoIk5vIGNhcmQgaW4gc2xvdCAlYzogUElQUj0lMDh4XG4iLAorCQkJJ0EnICsgX3Nsb3RfLCAodTMyKSBwY21wLT5wY21jX3BpcHIpOworCQlyZXR1cm47CQkvKiBObyBjYXJkIGluIHNsb3QgKi8KKwl9CisKKwljaGVja19pZGVfZGV2aWNlIChwY21jaWFfYmFzZSk7CisKKyNlbmRpZgkvKiBDT05GSUdfSURFXzh4eF9QQ0NBUkQgKi8KKworCWJhc2UgPSBwY21jaWFfYmFzZSArIGlvcG9ydF9kc2NbZGF0YV9wb3J0XS5iYXNlX29mZjsKKyNpZmRlZiBERUJVRworCXByaW50ayAoImJhc2U6ICUwOHggKyAlMDh4ID0gJTA4eFxuIiwKKwkJCXBjbWNpYV9iYXNlLCBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uYmFzZV9vZmYsIGJhc2UpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgSURFX05SX1BPUlRTOyArK2kpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsgKCJwb3J0WyVkXTogJTA4eCArICUwOHggPSAlMDh4XG4iLAorCQkJaSwKKwkJCWJhc2UsCisJCQlpb3BvcnRfZHNjW2RhdGFfcG9ydF0ucmVnX29mZltpXSwKKwkJCWksIGJhc2UgKyBpb3BvcnRfZHNjW2RhdGFfcG9ydF0ucmVnX29mZltpXSk7CisjZW5kaWYKKwkgCSpwKysgPSBiYXNlICsgaW9wb3J0X2RzY1tkYXRhX3BvcnRdLnJlZ19vZmZbaV07CisJfQorCisJaWYgKGlycSkgeworI2lmZGVmIENPTkZJR19JREVfOHh4X1BDQ0FSRAorCQl1bnNpZ25lZCBpbnQgcmVnOworCisJCSppcnEgPSBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uaXJxOworCQlpZiAoX3Nsb3RfKQorCQkJcGdjcnggPSAmKChpbW1hcF90ICopIElNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BnY3JiOworCQllbHNlCisJCQlwZ2NyeCA9ICYoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGdjcmE7CisKKwkJcmVnID0gKnBnY3J4OworCQlyZWcgfD0gbWtfaW50X2ludF9tYXNrIChwY21jaWFfc2NobHZsKSA8PCAyNDsKKwkJcmVnIHw9IG1rX2ludF9pbnRfbWFzayAocGNtY2lhX3NjaGx2bCkgPDwgMTY7CisJCSpwZ2NyeCA9IHJlZzsKKyNlbHNlCS8qIGRpcmVjdCBjb25uZWN0ZWQgSURFIGRyaXZlLCBpLmUuIGV4dGVybmFsIElSUSwgbm90IHRoZSBQQ01DSUEgaXJxICovCisJCSppcnEgPSBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uaXJxOworI2VuZGlmCS8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworCX0KKworCS8qIHJlZ2lzdGVyIHJvdXRpbmUgdG8gdHVuZSBQSU8gbW9kZSAqLworCWlkZV9od2lmc1tkYXRhX3BvcnRdLnR1bmVwcm9jID0gbTh4eF9pZGVfdHVuZXByb2M7CisKKwlody0+YWNrX2ludHIgPSAoaWRlX2Fja19pbnRyX3QgKikgaWRlX2ludGVycnVwdF9hY2s7CisJLyogRW5hYmxlIEhhcmRkaXNrIEludGVycnVwdCwKKwkgKiBhbmQgbWFrZSBpdCBlZGdlIHNlbnNpdGl2ZQorCSAqLworCS8qICgxMS0xOCkgU2V0IGVkZ2UgZGV0ZWN0IGZvciBpcnEsIG5vIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlICovCisJKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fc2l1X2NvbmYuc2Nfc2llbCB8PQorCQkJCQkoMHg4MDAwMDAwMCA+PiBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uaXJxKTsKKworI2lmZGVmIENPTkZJR19JREVfOHh4X1BDQ0FSRAorCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgZ2FyYmFnZSBpcnEgKi8KKwkoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcHNjciA9IDB4RkZGRjsKKworCS8qIEVuYWJsZSBmYWxsaW5nIGVkZ2UgaXJxICovCisJcGNtcC0+cGNtY19wZXIgPSAweDEwMDAwMCA+PiAoMTYgKiBfc2xvdF8pOworI2VuZGlmCS8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworfQkvKiBtOHh4X2lkZV9pbml0X2h3aWZfcG9ydHMoKSB1c2luZyA4eHggaW50ZXJuYWwgUENNQ0lBIGludGVyZmFjZSAqLworI2VuZGlmIC8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCB8fCBDT05GSUdfSURFXzh4eF9ESVJFQ1QgKi8KKworLyoKKyAqIG04eHhfaWRlX2luaXRfaHdpZl9wb3J0cyBmb3IgYSBkaXJlY3QgSURFIGludGVyZmFjZSBfbm90XyB1c2luZworICogTVBDOHh4J3MgaW50ZXJuYWwgUENNQ0lBIGludGVyZmFjZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfSURFX0VYVF9ESVJFQ1QpCit2b2lkIG04eHhfaWRlX2luaXRfaHdpZl9wb3J0cyAoaHdfcmVnc190ICpodywKKwl1bnNpZ25lZCBsb25nIGRhdGFfcG9ydCwgdW5zaWduZWQgbG9uZyBjdHJsX3BvcnQsIGludCAqaXJxKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBody0+aW9fcG9ydHM7CisJaW50IGk7CisKKwl1MzIgaWRlX3BoeV9iYXNlOworCXUzMiBpZGVfcGh5X2VuZDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBpZGVfYmFzZSA9IDA7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCisJKnAgPSAwOworCWlmIChpcnEpCisJCSppcnEgPSAwOworCisJaWYgKCFpZGVfYmFzZSkgeworCisJCS8qIFRPRE86CisJCSAqIC0gYWRkIGNvZGUgdG8gcmVhZCBPUngsIEJSeAorCQkgKi8KKwkJaWRlX3BoeV9iYXNlID0gQ0ZHX0FUQV9CQVNFX0FERFI7CisJCWlkZV9waHlfZW5kICA9IENGR19BVEFfQkFTRV9BRERSICsgMHgyMDA7CisKKwkJcHJpbnRrICgiSURFIHBoeXMgbWVtIDogJTA4eC4uLiUwOHggKHNpemUgJTA4eClcbiIsCisJCQlpZGVfcGh5X2Jhc2UsIGlkZV9waHlfZW5kLAorCQkJaWRlX3BoeV9lbmQgLSBpZGVfcGh5X2Jhc2UpOworCQkKKwkJaWRlX2Jhc2U9KHVuc2lnbmVkIGxvbmcpaW9yZW1hcChpZGVfcGh5X2Jhc2UsCisJCQkJCQlpZGVfcGh5X2VuZC1pZGVfcGh5X2Jhc2UpOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrICgiSURFIHZpcnQgYmFzZTogJTA4bHhcbiIsIGlkZV9iYXNlKTsKKyNlbmRpZgorCX0KKworCWlmIChkYXRhX3BvcnQgPj0gTUFYX0hXSUZTKQorCQlyZXR1cm47CisKKwliYXNlID0gaWRlX2Jhc2UgKyBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uYmFzZV9vZmY7CisjaWZkZWYgREVCVUcKKwlwcmludGsgKCJiYXNlOiAlMDh4ICsgJTA4eCA9ICUwOHhcbiIsCisJCWlkZV9iYXNlLCBpb3BvcnRfZHNjW2RhdGFfcG9ydF0uYmFzZV9vZmYsIGJhc2UpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgSURFX05SX1BPUlRTOyArK2kpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsgKCJwb3J0WyVkXTogJTA4eCArICUwOHggPSAlMDh4XG4iLAorCQkJaSwKKwkJCWJhc2UsCisJCQlpb3BvcnRfZHNjW2RhdGFfcG9ydF0ucmVnX29mZltpXSwKKwkJCWksIGJhc2UgKyBpb3BvcnRfZHNjW2RhdGFfcG9ydF0ucmVnX29mZltpXSk7CisjZW5kaWYKKwkgCSpwKysgPSBiYXNlICsgaW9wb3J0X2RzY1tkYXRhX3BvcnRdLnJlZ19vZmZbaV07CisJfQorCisJaWYgKGlycSkgeworCQkvKiBkaXJlY3QgY29ubmVjdGVkIElERSBkcml2ZSwgaS5lLiBleHRlcm5hbCBJUlEgKi8KKwkJKmlycSA9IGlvcG9ydF9kc2NbZGF0YV9wb3J0XS5pcnE7CisJfQorCisJLyogcmVnaXN0ZXIgcm91dGluZSB0byB0dW5lIFBJTyBtb2RlICovCisJaWRlX2h3aWZzW2RhdGFfcG9ydF0udHVuZXByb2MgPSBtOHh4X2lkZV90dW5lcHJvYzsKKworCWh3LT5hY2tfaW50ciA9IChpZGVfYWNrX2ludHJfdCAqKSBpZGVfaW50ZXJydXB0X2FjazsKKwkvKiBFbmFibGUgSGFyZGRpc2sgSW50ZXJydXB0LAorCSAqIGFuZCBtYWtlIGl0IGVkZ2Ugc2Vuc2l0aXZlCisJICovCisJLyogKDExLTE4KSBTZXQgZWRnZSBkZXRlY3QgZm9yIGlycSwgbm8gd2FrZXVwIGZyb20gbG93IHBvd2VyIG1vZGUgKi8KKwkoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fc2l1X2NvbmYuc2Nfc2llbCB8PQorCQkJKDB4ODAwMDAwMDAgPj4gaW9wb3J0X2RzY1tkYXRhX3BvcnRdLmlycSk7Cit9CS8qIG04eHhfaWRlX2luaXRfaHdpZl9wb3J0cygpIGZvciBDT05GSUdfSURFXzh4eF9ESVJFQ1QgKi8gCisKKyNlbmRpZgkvKiBDT05GSUdfSURFXzh4eF9ESVJFQ1QgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIFBDTUNJQSBUaW1pbmcgKi8KKyNpZm5kZWYJUENNQ0lBX1NIVAorI2RlZmluZSBQQ01DSUFfU0hUKHQpCSgodCAmIDB4MEYpPDwxNikJLyogU3Ryb2JlIEhvbGQgIFRpbWUgCSovCisjZGVmaW5lIFBDTUNJQV9TU1QodCkJKCh0ICYgMHgwRik8PDEyKQkvKiBTdHJvYmUgU2V0dXAgVGltZQkqLworI2RlZmluZSBQQ01DSUFfU0wodCkgKCh0PT0zMikgPyAwIDogKCh0ICYgMHgxRik8PDcpKSAvKiBTdHJvYmUgTGVuZ3RoCSovCisjZW5kaWYKKworCisvKiBDYWxjdWxhdGUgUElPIHRpbWluZ3MgKi8KK3N0YXRpYyB2b2lkCittOHh4X2lkZV90dW5lcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKK3sKKwlpZGVfcGlvX2RhdGFfdCBkOworI2lmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSB8fCBkZWZpbmVkKENPTkZJR19JREVfOHh4X0RJUkVDVCkKKwl2b2xhdGlsZSBwY21jb25mOHh4X3QJKnBjbXA7CisJdWxvbmcgdGltaW5nLCBtYXNrLCByZWc7CisjZW5kaWYKKworCXBpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgcGlvLCA0LCAmZCk7CisKKyNpZiAxCisJcHJpbnRrKCIlc1slZF0gJXM6IGJlc3QgUElPIG1vZGU6ICVkXG4iLAorCQlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sIHBpbyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSB8fCBkZWZpbmVkKENPTkZJR19JREVfOHh4X0RJUkVDVCkKKwlwY21wID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYSkpOworCisJbWFzayA9IH4oUENNQ0lBX1NIVCgweEZGKSB8IFBDTUNJQV9TU1QoMHhGRikgfCBQQ01DSUFfU0woMHhGRikpOworCisJdGltaW5nICA9IFBDTUNJQV9TSFQoaG9sZF90aW1lW3Bpb10gICkKKwkJfCBQQ01DSUFfU1NUKGlkZV9waW9fY2xvY2tzW3Bpb10uc2V0dXBfdGltZSApCisJCXwgUENNQ0lBX1NMIChpZGVfcGlvX2Nsb2Nrc1twaW9dLmFjdGl2ZV90aW1lKQorCQk7CisKKyNpZiAxCisJcHJpbnRrICgiU2V0dGluZyB0aW1pbmcgYml0cyAweCUwOGx4IGluIFBDTUNJQSBjb250cm9sbGVyXG4iLCB0aW1pbmcpOworI2VuZGlmCisJaWYgKChyZWcgPSBwY21wLT5wY21jX3BvcjAgJiBtYXNrKSAhPSAwKQorCQlwY21wLT5wY21jX3BvcjAgPSByZWcgfCB0aW1pbmc7CisKKwlpZiAoKHJlZyA9IHBjbXAtPnBjbWNfcG9yMSAmIG1hc2spICE9IDApCisJCXBjbXAtPnBjbWNfcG9yMSA9IHJlZyB8IHRpbWluZzsKKworCWlmICgocmVnID0gcGNtcC0+cGNtY19wb3IyICYgbWFzaykgIT0gMCkKKwkJcGNtcC0+cGNtY19wb3IyID0gcmVnIHwgdGltaW5nOworCisJaWYgKChyZWcgPSBwY21wLT5wY21jX3BvcjMgJiBtYXNrKSAhPSAwKQorCQlwY21wLT5wY21jX3BvcjMgPSByZWcgfCB0aW1pbmc7CisKKwlpZiAoKHJlZyA9IHBjbXAtPnBjbWNfcG9yNCAmIG1hc2spICE9IDApCisJCXBjbXAtPnBjbWNfcG9yNCA9IHJlZyB8IHRpbWluZzsKKworCWlmICgocmVnID0gcGNtcC0+cGNtY19wb3I1ICYgbWFzaykgIT0gMCkKKwkJcGNtcC0+cGNtY19wb3I1ID0gcmVnIHwgdGltaW5nOworCisJaWYgKChyZWcgPSBwY21wLT5wY21jX3BvcjYgJiBtYXNrKSAhPSAwKQorCQlwY21wLT5wY21jX3BvcjYgPSByZWcgfCB0aW1pbmc7CisKKwlpZiAoKHJlZyA9IHBjbXAtPnBjbWNfcG9yNyAmIG1hc2spICE9IDApCisJCXBjbXAtPnBjbWNfcG9yNyA9IHJlZyB8IHRpbWluZzsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfSURFX0VYVF9ESVJFQ1QpCisKKwlwcmludGsoIiVzWyVkXSAlczogbm90IGltcGxlbWVudGVkIHlldCFcbiIsCisJCV9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpIHx8IGRlZmluZWQoQ09ORklHX0lERV84eHhfUENNQ0lBICovCit9CisKK3N0YXRpYyB2b2lkCitpZGVfaW50ZXJydXB0X2FjayAodm9pZCAqZGV2KQoreworI2lmZGVmIENPTkZJR19JREVfOHh4X1BDQ0FSRAorCXVfaW50IHBzY3IsIHBpcHI7CisKKyNpZiAoUENNQ0lBX1NPQ0tFVFNfTk8gPT0gMikKKwl1X2ludCBfc2xvdF87CisjZW5kaWYKKworCS8qIGdldCBpbnRlcnJ1cHQgc291cmNlcyAqLworCisJcHNjciA9ICgodm9sYXRpbGUgaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3I7CisJcGlwciA9ICgodm9sYXRpbGUgaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BpcHI7CisKKwkvKgorCSAqIHJlcG9ydCBvbmx5IGlmIGJvdGggY2FyZCBkZXRlY3Qgc2lnbmFscyBhcmUgdGhlIHNhbWUKKwkgKiBub3QgdG9vIG5pY2UgZG9uZSwKKwkgKiB3ZSBkZXBlbmQgb24gdGhhdCBDRDIgaXMgdGhlIGJpdCB0byB0aGUgbGVmdCBvZiBDRDEuLi4KKwkgKi8KKworCWlmKF9zbG90Xz09LTEpeworCSAgcHJpbnRrKCJQQ01DSUEgc2xvdCBoYXMgbm90IGJlZW4gZGVmaW5lZCEgVXNpbmcgQSBhcyBkZWZhdWx0XG4iKTsKKwkgIF9zbG90Xz0wOworCX0KKworCWlmKCgocGlwciAmIE04WFhfUENNQ0lBX0NEMihfc2xvdF8pKSA+PiAxKSBeCisJICAgKHBpcHIgJiBNOFhYX1BDTUNJQV9DRDEoX3Nsb3RfKSkgICAgICAgICApIHsKKwkgIHByaW50ayAoImNhcmQgZGV0ZWN0IGludGVycnVwdFxuIik7CisJfQorCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLworCSgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IgPSBwc2NyOworCisjZWxzZSAvKiAhIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworCS8qCisJICogT25seSBDT05GSUdfSURFXzh4eF9QQ0NBUkQgaXMgdXNpbmcgdGhlIGludGVycnVwdCBvZiB0aGUKKwkgKiBNUEM4eHgncyBQQ01DSUEgY29udHJvbGxlciwgc28gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGhlcmUKKwkgKiBmb3IgQ09ORklHX0lERV84eHhfRElSRUNUIGFuZCBDT05GSUdfSURFX0VYVF9ESVJFQ1QuCisJICogVGhlIGludGVycnVwdCBpcyBoYW5kbGVkIHNvbWV3aGVyZSBlbHNlLgktLSBTdGV2ZW4KKwkgKi8KKyNlbmRpZiAvKiBDT05GSUdfSURFXzh4eF9QQ0NBUkQgKi8KK30KKworCisKKy8qCisgKiBDSVMgVHVwZWwgY29kZXMKKyAqLworI2RlZmluZSBDSVNUUExfTlVMTAkJMHgwMAorI2RlZmluZSBDSVNUUExfREVWSUNFCQkweDAxCisjZGVmaW5lIENJU1RQTF9MT05HTElOS19DQgkweDAyCisjZGVmaW5lIENJU1RQTF9JTkRJUkVDVAkJMHgwMworI2RlZmluZSBDSVNUUExfQ09ORklHX0NCCTB4MDQKKyNkZWZpbmUgQ0lTVFBMX0NGVEFCTEVfRU5UUllfQ0IgMHgwNQorI2RlZmluZSBDSVNUUExfTE9OR0xJTktfTUZDCTB4MDYKKyNkZWZpbmUgQ0lTVFBMX0JBUgkJMHgwNworI2RlZmluZSBDSVNUUExfUFdSX01HTU5UCTB4MDgKKyNkZWZpbmUgQ0lTVFBMX0VYVERFVklDRQkweDA5CisjZGVmaW5lIENJU1RQTF9DSEVDS1NVTQkJMHgxMAorI2RlZmluZSBDSVNUUExfTE9OR0xJTktfQQkweDExCisjZGVmaW5lIENJU1RQTF9MT05HTElOS19DCTB4MTIKKyNkZWZpbmUgQ0lTVFBMX0xJTktUQVJHRVQJMHgxMworI2RlZmluZSBDSVNUUExfTk9fTElOSwkJMHgxNAorI2RlZmluZSBDSVNUUExfVkVSU18xCQkweDE1CisjZGVmaW5lIENJU1RQTF9BTFRTVFIJCTB4MTYKKyNkZWZpbmUgQ0lTVFBMX0RFVklDRV9BCQkweDE3CisjZGVmaW5lIENJU1RQTF9KRURFQ19DCQkweDE4CisjZGVmaW5lIENJU1RQTF9KRURFQ19BCQkweDE5CisjZGVmaW5lIENJU1RQTF9DT05GSUcJCTB4MWEKKyNkZWZpbmUgQ0lTVFBMX0NGVEFCTEVfRU5UUlkJMHgxYgorI2RlZmluZSBDSVNUUExfREVWSUNFX09DCTB4MWMKKyNkZWZpbmUgQ0lTVFBMX0RFVklDRV9PQQkweDFkCisjZGVmaW5lIENJU1RQTF9ERVZJQ0VfR0VPCTB4MWUKKyNkZWZpbmUgQ0lTVFBMX0RFVklDRV9HRU9fQQkweDFmCisjZGVmaW5lIENJU1RQTF9NQU5GSUQJCTB4MjAKKyNkZWZpbmUgQ0lTVFBMX0ZVTkNJRAkJMHgyMQorI2RlZmluZSBDSVNUUExfRlVOQ0UJCTB4MjIKKyNkZWZpbmUgQ0lTVFBMX1NXSUwJCTB4MjMKKyNkZWZpbmUgQ0lTVFBMX0VORAkJMHhmZgorCisvKgorICogQ0lTIEZ1bmN0aW9uIElEIGNvZGVzCisgKi8KKyNkZWZpbmUgQ0lTVFBMX0ZVTkNJRF9NVUxUSQkweDAwCisjZGVmaW5lIENJU1RQTF9GVU5DSURfTUVNT1JZCTB4MDEKKyNkZWZpbmUgQ0lTVFBMX0ZVTkNJRF9TRVJJQUwJMHgwMgorI2RlZmluZSBDSVNUUExfRlVOQ0lEX1BBUkFMTEVMCTB4MDMKKyNkZWZpbmUgQ0lTVFBMX0ZVTkNJRF9GSVhFRAkweDA0CisjZGVmaW5lIENJU1RQTF9GVU5DSURfVklERU8JMHgwNQorI2RlZmluZSBDSVNUUExfRlVOQ0lEX05FVFdPUksJMHgwNgorI2RlZmluZSBDSVNUUExfRlVOQ0lEX0FJTVMJMHgwNworI2RlZmluZSBDSVNUUExfRlVOQ0lEX1NDU0kJMHgwOAorCisvKgorICogRml4ZWQgRGlzayBGVU5DRSBjb2RlcworICovCisjZGVmaW5lIENJU1RQTF9JREVfSU5URVJGQUNFCTB4MDEKKworI2RlZmluZSBDSVNUUExfRlVOQ0VfSURFX0lGQUNFCTB4MDEKKyNkZWZpbmUgQ0lTVFBMX0ZVTkNFX0lERV9NQVNURVIJMHgwMgorI2RlZmluZSBDSVNUUExfRlVOQ0VfSURFX1NMQVZFCTB4MDMKKworLyogRmlyc3QgZmVhdHVyZSBieXRlICovCisjZGVmaW5lIENJU1RQTF9JREVfU0lMSUNPTgkweDA0CisjZGVmaW5lIENJU1RQTF9JREVfVU5JUVVFCTB4MDgKKyNkZWZpbmUgQ0lTVFBMX0lERV9EVUFMCQkweDEwCisKKy8qIFNlY29uZCBmZWF0dXJlIGJ5dGUgKi8KKyNkZWZpbmUgQ0lTVFBMX0lERV9IQVNfU0xFRVAJMHgwMQorI2RlZmluZSBDSVNUUExfSURFX0hBU19TVEFOREJZCTB4MDIKKyNkZWZpbmUgQ0lTVFBMX0lERV9IQVNfSURMRQkweDA0CisjZGVmaW5lIENJU1RQTF9JREVfTE9XX1BPV0VSCTB4MDgKKyNkZWZpbmUgQ0lTVFBMX0lERV9SRUdfSU5ISUJJVAkweDEwCisjZGVmaW5lIENJU1RQTF9JREVfSEFTX0lOREVYCTB4MjAKKyNkZWZpbmUgQ0lTVFBMX0lERV9JT0lTMTYJMHg0MAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2RlZmluZQlNQVhfVFVQRUxfU1oJNTEyCisjZGVmaW5lIE1BWF9GRUFUVVJFUwk0CisKK3N0YXRpYyBpbnQgY2hlY2tfaWRlX2RldmljZSAodW5zaWduZWQgbG9uZyBiYXNlKQoreworCXZvbGF0aWxlIHU4ICppZGVudCA9IE5VTEw7CisJdm9sYXRpbGUgdTggKmZlYXR1cmVfcFtNQVhfRkVBVFVSRVNdOworCXZvbGF0aWxlIHU4ICpwLCAqc3RhcnQ7CisJaW50IG5fZmVhdHVyZXMgPSAwOworCXU4IGZ1bmNfaWQgPSB+MDsKKwl1OCBjb2RlLCBsZW47CisJdW5zaWduZWQgc2hvcnQgY29uZmlnX2Jhc2UgPSAwOworCWludCBmb3VuZCA9IDA7CisJaW50IGk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayAoIlBDTUNJQSBNRU06ICUwOGxYXG4iLCBiYXNlKTsKKyNlbmRpZgorCXN0YXJ0ID0gcCA9ICh2b2xhdGlsZSB1OCAqKSBiYXNlOworCisJd2hpbGUgKChwIC0gc3RhcnQpIDwgTUFYX1RVUEVMX1NaKSB7CisKKwkJY29kZSA9ICpwOyBwICs9IDI7CisKKwkJaWYgKGNvZGUgPT0gMHhGRikgeyAvKiBFbmQgb2YgY2hhaW4gKi8KKwkJCWJyZWFrOworCQl9CisKKwkJbGVuID0gKnA7IHAgKz0gMjsKKyNpZmRlZglERUJVR19QQ01DSUEKKwkJeyB2b2xhdGlsZSB1OCAqcSA9IHA7CisJCQlwcmludGsgKCJcblR1cGxlIGNvZGUgJTAyeCAgbGVuZ3RoICVkXG5cdERhdGE6IiwKKwkJCQljb2RlLCBsZW4pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJCQlwcmludGsgKCIgJTAyeCIsICpxKTsKKwkJCQlxKz0gMjsKKwkJCX0KKwkJfQorI2VuZGlmCS8qIERFQlVHX1BDTUNJQSAqLworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBDSVNUUExfVkVSU18xOgorCQkJaWRlbnQgPSBwICsgNDsKKwkJCWJyZWFrOworCQljYXNlIENJU1RQTF9GVU5DSUQ6CisJCQlmdW5jX2lkID0gKnA7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfRlVOQ0U6CisJCQlpZiAobl9mZWF0dXJlcyA8IE1BWF9GRUFUVVJFUykKKwkJCQlmZWF0dXJlX3Bbbl9mZWF0dXJlcysrXSA9IHA7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfQ09ORklHOgorCQkJY29uZmlnX2Jhc2UgPSAoKihwKzYpIDw8IDgpICsgKCoocCs0KSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlwICs9IDIgKiBsZW47CisJfQorCisJZm91bmQgPSBpZGVudGlmeSAoaWRlbnQpOworCisJaWYgKGZ1bmNfaWQgIT0gKCh1OCl+MCkpIHsKKwkJcHJpbnRfZnVuY2lkIChmdW5jX2lkKTsKKworCQlpZiAoZnVuY19pZCA9PSBDSVNUUExfRlVOQ0lEX0ZJWEVEKQorCQkJZm91bmQgPSAxOworCQllbHNlCisJCQlyZXR1cm4gKDEpOwkvKiBubyBkaXNrIGRyaXZlICovCisJfQorCisJZm9yIChpPTA7IGk8bl9mZWF0dXJlczsgKytpKSB7CisJCXByaW50X2ZpeGVkIChmZWF0dXJlX3BbaV0pOworCX0KKworCWlmICghZm91bmQpIHsKKwkJcHJpbnRrICgidW5rbm93biBjYXJkIHR5cGVcbiIpOworCQlyZXR1cm4gKDEpOworCX0KKworCS8qIHNldCBsZXZlbCBtb2RlIGlycSBhbmQgSS9PIG1hcHBlZCBkZXZpY2UgaW4gY29uZmlnIHJlZyovCisJKigodTggKikoYmFzZSArIGNvbmZpZ19iYXNlKSkgPSAweDQxOworCisJcmV0dXJuICgwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwcmludF9mdW5jaWQgKGludCBmdW5jKQoreworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9NVUxUSToKKwkJcHJpbnRrICgiIE11bHRpLUZ1bmN0aW9uIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9NRU1PUlk6CisJCXByaW50ayAoIiBNZW1vcnkiKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX1NFUklBTDoKKwkJcHJpbnRrICgiIFNlcmlhbCBQb3J0Iik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9QQVJBTExFTDoKKwkJcHJpbnRrICgiIFBhcmFsbGVsIFBvcnQiKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX0ZJWEVEOgorCQlwcmludGsgKCIgRml4ZWQgRGlzayIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfVklERU86CisJCXByaW50ayAoIiBWaWRlbyBBZGFwdGVyIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9ORVRXT1JLOgorCQlwcmludGsgKCIgTmV0d29yayBBZGFwdGVyIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9BSU1TOgorCQlwcmludGsgKCIgQUlNUyBDYXJkIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9TQ1NJOgorCQlwcmludGsgKCIgU0NTSSBBZGFwdGVyIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayAoIiBVbmtub3duIik7CisJCWJyZWFrOworCX0KKwlwcmludGsgKCIgQ2FyZFxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcHJpbnRfZml4ZWQgKHZvbGF0aWxlIHU4ICpwKQoreworCWlmIChwID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoKnApIHsKKwljYXNlIENJU1RQTF9GVU5DRV9JREVfSUZBQ0U6CisJICAgIHsgICB1OCBpZmFjZSA9ICoocCsyKTsKKworCQlwcmludGsgKChpZmFjZSA9PSBDSVNUUExfSURFX0lOVEVSRkFDRSkgPyAiIElERSIgOiAiIHVua25vd24iKTsKKwkJcHJpbnRrICgiIGludGVyZmFjZSAiKTsKKwkJYnJlYWs7CisJICAgIH0KKwljYXNlIENJU1RQTF9GVU5DRV9JREVfTUFTVEVSOgorCWNhc2UgQ0lTVFBMX0ZVTkNFX0lERV9TTEFWRToKKwkgICAgeyAgIHU4IGYxID0gKihwKzIpOworCQl1OCBmMiA9ICoocCs0KTsKKworCQlwcmludGsgKChmMSAmIENJU1RQTF9JREVfU0lMSUNPTikgPyAiIFtzaWxpY29uXSIgOiAiIFtyb3RhdGluZ10iKTsKKworCQlpZiAoZjEgJiBDSVNUUExfSURFX1VOSVFVRSkKKwkJCXByaW50ayAoIiBbdW5pcXVlXSIpOworCisJCXByaW50ayAoKGYxICYgQ0lTVFBMX0lERV9EVUFMKSA/ICIgW2R1YWxdIiA6ICIgW3NpbmdsZV0iKTsKKworCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19TTEVFUCkKKwkJCXByaW50ayAoIiBbc2xlZXBdIik7CisKKwkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfU1RBTkRCWSkKKwkJCXByaW50ayAoIiBbc3RhbmRieV0iKTsKKworCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19JRExFKQorCQkJcHJpbnRrICgiIFtpZGxlXSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfTE9XX1BPV0VSKQorCQkJcHJpbnRrICgiIFtsb3cgcG93ZXJdIik7CisKKwkJaWYgKGYyICYgQ0lTVFBMX0lERV9SRUdfSU5ISUJJVCkKKwkJCXByaW50ayAoIiBbcmVnIGluaGliaXRdIik7CisKKwkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfSU5ERVgpCisJCQlwcmludGsgKCIgW2luZGV4XSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfSU9JUzE2KQorCQkJcHJpbnRrICgiIFtJT2lzMTZdIik7CisKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJcHJpbnRrICgiXG4iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyNkZWZpbmUgTUFYX0lERU5UX0NIQVJTCQk2NAorI2RlZmluZQlNQVhfSURFTlRfRklFTERTCTQKKworc3RhdGljIHU4ICprbm93bl9jYXJkc1tdID0geworCSJBUkdPU1kgUG5QSURFIEQ1IiwKKwlOVUxMCit9OworCitzdGF0aWMgaW50IGlkZW50aWZ5ICAodm9sYXRpbGUgdTggKnApCit7CisJdTggaWRfc3RyW01BWF9JREVOVF9DSEFSU107CisJdTggZGF0YTsKKwl1OCAqdDsKKwl1OCAqKmNhcmQ7CisJaW50IGksIGRvbmU7CisKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOwkvKiBEb24ndCBrbm93ICovCisKKwl0ID0gaWRfc3RyOworCWRvbmUgPTA7CisKKwlmb3IgKGk9MDsgaTw9NCAmJiAhZG9uZTsgKytpLCBwKz0yKSB7CisJCXdoaWxlICgoZGF0YSA9ICpwKSAhPSAnXDAnKSB7CisJCQlpZiAoZGF0YSA9PSAweEZGKSB7CisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqdCsrID0gZGF0YTsKKwkJCWlmICh0ID09ICZpZF9zdHJbTUFYX0lERU5UX0NIQVJTLTFdKSB7CisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwICs9IDI7CisJCX0KKwkJaWYgKCFkb25lKQorCQkJKnQrKyA9ICcgJzsKKwl9CisJKnQgPSAnXDAnOworCXdoaWxlICgtLXQgPiBpZF9zdHIpIHsKKwkJaWYgKCp0ID09ICcgJykKKwkJCSp0ID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXByaW50ayAoIkNhcmQgSUQ6ICVzXG4iLCBpZF9zdHIpOworCisJZm9yIChjYXJkPWtub3duX2NhcmRzOyAqY2FyZDsgKytjYXJkKSB7CisJCWlmIChzdHJjbXAoKmNhcmQsIGlkX3N0cikgPT0gMCkgewkvKiBmb3VuZCEgKi8KKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDApOwkvKiBkb24ndCBrbm93ICovCit9CisKK3ZvaWQgbTh4eF9pZGVfaW5pdCh2b2lkKQoreworCXBwY19pZGVfbWQuZGVmYXVsdF9pcnEgICAgICAgICAgPSBtOHh4X2lkZV9kZWZhdWx0X2lycTsKKwlwcGNfaWRlX21kLmRlZmF1bHRfaW9fYmFzZSAgICAgID0gbTh4eF9pZGVfZGVmYXVsdF9pb19iYXNlOworCXBwY19pZGVfbWQuaWRlX2luaXRfaHdpZiAgICAgICAgPSBtOHh4X2lkZV9pbml0X2h3aWZfcG9ydHM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGMyNzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwpAQCAtMCwwICsxLDIyMDggQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9pZGUtcG1hYy5jCisgKgorICogU3VwcG9ydCBmb3IgSURFIGludGVyZmFjZXMgb24gUG93ZXJNYWNzLgorICogVGhlc2UgSURFIGludGVyZmFjZXMgYXJlIG1lbW9yeS1tYXBwZWQgYW5kIGhhdmUgYSBEQkRNQSBjaGFubmVsCisgKiBmb3IgZG9pbmcgRE1BLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBQYXVsIE1hY2tlcnJhcyAmIEJlbi4gSGVycmVuc2NobWlkdAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFNvbWUgY29kZSB0YWtlbiBmcm9tIGRyaXZlcnMvaWRlL2lkZS1kbWEuYzoKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTggIE1hcmsgTG9yZAorICoKKyAqIFRPRE86IC0gVXNlIHByZS1jYWxjdWxhdGVkIChrYXVhaSkgdGltaW5nIHRhYmxlcyBhbGwgdGhlIHRpbWUgYW5kCisgKiBnZXQgcmlkIG9mIHRoZSAicm91bmRlZCIgdGFibGVzIHVzZWQgcHJldmlvdXNseSwgc28gd2UgaGF2ZSB0aGUKKyAqIHNhbWUgdGFibGUgZm9ybWF0IGZvciBhbGwgY29udHJvbGxlcnMgYW5kIGNhbiB0aGVuIGp1c3QgaGF2ZSBvbmUKKyAqIGJpZyB0YWJsZQorICogCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vaWRlLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZm5kZWYgQ09ORklHX1BQQzY0CisjaW5jbHVkZSA8YXNtL21lZGlhYmF5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImlkZS10aW1pbmcuaCIKKworI3VuZGVmIElERV9QTUFDX0RFQlVHCisKKyNkZWZpbmUgRE1BX1dBSVRfVElNRU9VVAk1MAorCit0eXBlZGVmIHN0cnVjdCBwbWFjX2lkZV9od2lmIHsKKwl1bnNpZ25lZCBsb25nCQkJcmVnYmFzZTsKKwlpbnQJCQkJaXJxOworCWludAkJCQlraW5kOworCWludAkJCQlhYXBsX2J1c19pZDsKKwl1bnNpZ25lZAkJCWNhYmxlXzgwIDogMTsKKwl1bnNpZ25lZAkJCW1lZGlhYmF5IDogMTsKKwl1bnNpZ25lZAkJCWJyb2tlbl9kbWEgOiAxOworCXVuc2lnbmVkCQkJYnJva2VuX2RtYV93YXJuIDogMTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUqCQlub2RlOworCXN0cnVjdCBtYWNpb19kZXYJCSptZGV2OworCXUzMgkJCQl0aW1pbmdzWzRdOworCXZvbGF0aWxlIHUzMiBfX2lvbWVtICoJCSprYXVhaV9mY3I7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1BNQUMKKwkvKiBUaG9zZSBmaWVsZHMgYXJlIGR1cGxpY2F0aW5nIHdoYXQgaXMgaW4gaHdpZi4gV2UgY3VycmVudGx5CisJICogY2FuJ3QgdXNlIHRoZSBod2lmIG9uZXMgYmVjYXVzZSBvZiBzb21lIGFzc3VtcHRpb25zIHRoYXQgYXJlCisJICogYmVlaW5nIGRvbmUgYnkgdGhlIGdlbmVyaWMgY29kZSBhYm91dCB0aGUga2luZCBvZiBkbWEgY29udHJvbGxlcgorCSAqIGFuZCBmb3JtYXQgb2YgdGhlIGRtYSB0YWJsZS4gVGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQgdGhvdWdoLgorCSAqLworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKglkbWFfcmVnczsKKwlzdHJ1Y3QgZGJkbWFfY21kKgkJZG1hX3RhYmxlX2NwdTsKKyNlbmRpZgorCQorfSBwbWFjX2lkZV9od2lmX3Q7CisKK3N0YXRpYyBwbWFjX2lkZV9od2lmX3QgcG1hY19pZGVbTUFYX0hXSUZTXSBfX3BtYWNkYXRhOworc3RhdGljIGludCBwbWFjX2lkZV9jb3VudDsKKworZW51bSB7CisJY29udHJvbGxlcl9vaGFyZSwJLyogT0hhcmUgYmFzZWQgKi8KKwljb250cm9sbGVyX2hlYXRocm93LAkvKiBIZWF0aHJvdy9QYWRkaW5ndG9uICovCisJY29udHJvbGxlcl9rbF9hdGEzLAkvKiBLZXlMYXJnbyBBVEEtMyAqLworCWNvbnRyb2xsZXJfa2xfYXRhNCwJLyogS2V5TGFyZ28gQVRBLTQgKi8KKwljb250cm9sbGVyX3VuX2F0YTYsCS8qIFVuaU5vcnRoMiBBVEEtNiAqLworCWNvbnRyb2xsZXJfazJfYXRhNiwJLyogSzIgQVRBLTYgKi8KKwljb250cm9sbGVyX3NoX2F0YTYsCS8qIFNoYXN0YSBBVEEtNiAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIG1vZGVsX25hbWVbXSA9IHsKKwkiT0hhcmUgQVRBIiwJCS8qIE9IYXJlIGJhc2VkICovCisJIkhlYXRocm93IEFUQSIsCQkvKiBIZWF0aHJvdy9QYWRkaW5ndG9uICovCisJIktleUxhcmdvIEFUQS0zIiwJLyogS2V5TGFyZ28gQVRBLTMgKE1ETUEgb25seSkgKi8KKwkiS2V5TGFyZ28gQVRBLTQiLAkvKiBLZXlMYXJnbyBBVEEtNCAoVURNQS82NikgKi8KKwkiVW5pTm9ydGggQVRBLTYiLAkvKiBVbmlOb3J0aDIgQVRBLTYgKFVETUEvMTAwKSAqLworCSJLMiBBVEEtNiIsCQkvKiBLMiBBVEEtNiAoVURNQS8xMDApICovCisJIlNoYXN0YSBBVEEtNiIsCQkvKiBTaGFzdGEgQVRBLTYgKFVETUEvMTMzKSAqLworfTsKKworLyoKKyAqIEV4dHJhIHJlZ2lzdGVycywgYm90aCAzMi1iaXQgbGl0dGxlLWVuZGlhbgorICovCisjZGVmaW5lIElERV9USU1JTkdfQ09ORklHCTB4MjAwCisjZGVmaW5lIElERV9JTlRFUlJVUFQJCTB4MzAwCisKKy8qIEthdWFpIChVMikgQVRBIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXIgc2V0dXAgKi8KKyNkZWZpbmUgSURFX0tBVUFJX1BJT19DT05GSUcJMHgyMDAKKyNkZWZpbmUgSURFX0tBVUFJX1VMVFJBX0NPTkZJRwkweDIxMAorI2RlZmluZSBJREVfS0FVQUlfUE9MTF9DT05GSUcJMHgyMjAKKworLyoKKyAqIFRpbWluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKworLyogTnVtYmVyIG9mIElERV9TWVNDTEtfTlMgdGlja3MsIGFyZ3VtZW50IGlzIGluIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIFNZU0NMS19USUNLUyh0KQkJKCgodCkgKyBJREVfU1lTQ0xLX05TIC0gMSkgLyBJREVfU1lTQ0xLX05TKQorI2RlZmluZSBTWVNDTEtfVElDS1NfNjYodCkJKCgodCkgKyBJREVfU1lTQ0xLXzY2X05TIC0gMSkgLyBJREVfU1lTQ0xLXzY2X05TKQorI2RlZmluZSBJREVfU1lTQ0xLX05TCQkzMAkvKiAzM01oeiBjZWxsICovCisjZGVmaW5lIElERV9TWVNDTEtfNjZfTlMJMTUJLyogNjZNaHogY2VsbCAqLworCisvKiAxMzNNaHogY2VsbCwgZm91bmQgaW4gc2hhc3RhLgorICogU2VlIGNvbW1lbnRzIGFib3V0IDEwMCBNaHogVW5pbm9ydGggMi4uLgorICogTm90ZSB0aGF0IFBJT19NQVNLIGFuZCBNRE1BX01BU0sgc2VlbSB0byBvdmVybGFwCisgKi8KKyNkZWZpbmUgVFJfMTMzX1BJT1JFR19QSU9fTUFTSwkJMHhmZjAwMGZmZgorI2RlZmluZSBUUl8xMzNfUElPUkVHX01ETUFfTUFTSwkJMHgwMGZmZjgwMAorI2RlZmluZSBUUl8xMzNfVURNQVJFR19VRE1BX01BU0sJMHgwMDAzZmZmZgorI2RlZmluZSBUUl8xMzNfVURNQVJFR19VRE1BX0VOCQkweDAwMDAwMDAxCisKKy8qIDEwME1oeiBjZWxsLCBmb3VuZCBpbiBVbmlub3J0aCAyLiBJIGRvbid0IGhhdmUgbXVjaCBpbmZvcyBhYm91dAorICogdGhpcyBvbmUgeWV0LCBpdCBhcHBlYXJzIGFzIGEgcGNpIGRldmljZSAoMTA2Yi8wMDMzKSBvbiB1bmlub3J0aAorICogaW50ZXJuYWwgUENJIGJ1cyBhbmQgaXQncyBjbG9jayBpcyBjb250cm9sbGVkIGxpa2UgZ2VtIG9yIGZ3LiBJdAorICogYXBwZWFycyB0byBiZSBhbiBldm9sdXRpb24gb2Yga2V5bGFyZ28gQVRBNCB3aXRoIGEgdGltaW5nIHJlZ2lzdGVyCisgKiBleHRlbmRlZCB0byAyIDMyYml0cyByZWdpc3RlcnMgYW5kIGEgc2ltaWxhciBEQkRNQSBjaGFubmVsLiBPdGhlcgorICogcmVnaXN0ZXJzIHNlZW0gdG8gZXhpc3QgYnV0IEkgY2FuJ3QgdGVsbCBtdWNoIGFib3V0IHRoZW0uCisgKiAKKyAqIFNvIGZhciwgSSdtIHVzaW5nIHByZS1jYWxjdWxhdGVkIHRhYmxlcyBmb3IgdGhpcyBleHRyYWN0ZWQgZnJvbQorICogdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZSBNYWNPUyBYIGRyaXZlci4KKyAqIAorICogVGhlICJQSU8iIHJlZ2lzdGVyIGNvbnRyb2xzIFBJTyBhbmQgTURNQSB0aW1pbmdzLCB0aGUgIlVMVFJBIgorICogcmVnaXN0ZXIgY29udHJvbHMgdGhlIFVETUEgdGltaW5ncy4gQXQgbGVhc3QsIGl0IHNlZW1zIGJpdCAwCisgKiBvZiB0aGlzIG9uZSBlbmFibGVzIFVETUEgdnMuIE1ETUEsIGFuZCBiaXRzIDQuLjcgYXJlIHRoZQorICogY3ljbGUgdGltZSBpbiB1bml0cyBvZiAxMG5zLiBCaXRzIDguLjE1IGFyZSB1c2VkIGJ5IEkgZG9uJ3QKKyAqIGtub3cgdGhlaXIgbWVhbmluZyB5ZXQKKyAqLworI2RlZmluZSBUUl8xMDBfUElPUkVHX1BJT19NQVNLCQkweGZmMDAwZmZmCisjZGVmaW5lIFRSXzEwMF9QSU9SRUdfTURNQV9NQVNLCQkweDAwZmZmMDAwCisjZGVmaW5lIFRSXzEwMF9VRE1BUkVHX1VETUFfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFRSXzEwMF9VRE1BUkVHX1VETUFfRU4JCTB4MDAwMDAwMDEKKworCisvKiA2Nk1oeiBjZWxsLCBmb3VuZCBpbiBLZXlMYXJnby4gQ2FuIGRvIHVsdHJhIG1vZGUgMCB0byAyIG9uCisgKiA0MCBjb25uZWN0b3IgY2FibGUgYW5kIHRvIDQgb24gODAgY29ubmVjdG9yIG9uZS4KKyAqIENsb2NrIHVuaXQgaXMgMTVucyAoNjZNaHopCisgKiAKKyAqIDMgVmFsdWVzIGNhbiBiZSBwcm9ncmFtbWVkOgorICogIC0gV3JpdGUgZGF0YSBzZXR1cCwgd2hpY2ggYXBwZWFycyB0byBtYXRjaCB0aGUgY3ljbGUgdGltZS4gVGhleQorICogICAgYWxzbyBjYWxsIGl0IERJT1cgc2V0dXAuCisgKiAgLSBSZWFkeSB0byBwYXVzZSB0aW1lIChmcm9tIHNwZWMpCisgKiAgLSBBZGRyZXNzIHNldHVwLiBUaGF0IG9uZSBpcyB3ZWlyZC4gSSBkb24ndCBzZWUgd2hlcmUgZXhhY3RseQorICogICAgaXQgZml0cyBpbiBVRE1BIGN5Y2xlcywgSSBnb3QgaXQncyBuYW1lIGZyb20gYW4gb2JzY3VyZSBwaWVjZQorICogICAgb2YgY29tbWVudGVkIG91dCBjb2RlIGluIERhcndpbi4gVGhleSBsZWF2ZSBpdCB0byAwLCB3ZSBkbyBhcworICogICAgd2VsbCwgZGVzcGl0ZSBhIGNvbW1lbnQgdGhhdCB3b3VsZCBsZWFkIHRvIHRoaW5rIGl0IGhhcyBhCisgKiAgICBtaW4gdmFsdWUgb2YgNDVucy4KKyAqIEFwcGxlIGFsc28gYWRkIDYwbnMgdG8gdGhlIHdyaXRlIGRhdGEgc2V0dXAgKG9yIGN5Y2xlIHRpbWUgPykgb24KKyAqIHJlYWRzLgorICovCisjZGVmaW5lIFRSXzY2X1VETUFfTUFTSwkJCTB4ZmZmMDAwMDAKKyNkZWZpbmUgVFJfNjZfVURNQV9FTgkJCTB4MDAxMDAwMDAgLyogRW5hYmxlIFVsdHJhIG1vZGUgZm9yIERNQSAqLworI2RlZmluZSBUUl82Nl9VRE1BX0FERFJTRVRVUF9NQVNLCTB4ZTAwMDAwMDAgLyogQWRkcmVzcyBzZXR1cCAqLworI2RlZmluZSBUUl82Nl9VRE1BX0FERFJTRVRVUF9TSElGVAkyOQorI2RlZmluZSBUUl82Nl9VRE1BX1JEWTJQQVVTX01BU0sJMHgxZTAwMDAwMCAvKiBSZWFkeSAyIHBhdXNlIHRpbWUgKi8KKyNkZWZpbmUgVFJfNjZfVURNQV9SRFkyUEFVU19TSElGVAkyNQorI2RlZmluZSBUUl82Nl9VRE1BX1dSREFUQVNFVFVQX01BU0sJMHgwMWUwMDAwMCAvKiBXcml0ZSBkYXRhIHNldHVwIHRpbWUgKi8KKyNkZWZpbmUgVFJfNjZfVURNQV9XUkRBVEFTRVRVUF9TSElGVAkyMQorI2RlZmluZSBUUl82Nl9NRE1BX01BU0sJCQkweDAwMGZmYzAwCisjZGVmaW5lIFRSXzY2X01ETUFfUkVDT1ZFUllfTUFTSwkweDAwMGY4MDAwCisjZGVmaW5lIFRSXzY2X01ETUFfUkVDT1ZFUllfU0hJRlQJMTUKKyNkZWZpbmUgVFJfNjZfTURNQV9BQ0NFU1NfTUFTSwkJMHgwMDAwN2MwMAorI2RlZmluZSBUUl82Nl9NRE1BX0FDQ0VTU19TSElGVAkJMTAKKyNkZWZpbmUgVFJfNjZfUElPX01BU0sJCQkweDAwMDAwM2ZmCisjZGVmaW5lIFRSXzY2X1BJT19SRUNPVkVSWV9NQVNLCQkweDAwMDAwM2UwCisjZGVmaW5lIFRSXzY2X1BJT19SRUNPVkVSWV9TSElGVAk1CisjZGVmaW5lIFRSXzY2X1BJT19BQ0NFU1NfTUFTSwkJMHgwMDAwMDAxZgorI2RlZmluZSBUUl82Nl9QSU9fQUNDRVNTX1NISUZUCQkwCisKKy8qIDMzTWh6IGNlbGwsIGZvdW5kIGluIE9IYXJlLCBIZWF0aHJvdyAoJiBQYWRkaW5ndG9uKSBhbmQgS2V5TGFyZ28KKyAqIENhbiBkbyBwaW8gJiBtZG1hIG1vZGVzLCBjbG9jayB1bml0IGlzIDMwbnMgKDMzTWh6KQorICogCisgKiBUaGUgYWNjZXNzIHRpbWUgYW5kIHJlY292ZXJ5IHRpbWUgY2FuIGJlIHByb2dyYW1tZWQuIFNvbWUgb2xkZXIKKyAqIERhcndpbiBjb2RlIGJhc2UgbGltaXQgT0hhcmUgdG8gMTUwbnMgY3ljbGUgdGltZS4gSSBkZWNpZGVkIHRvIGRvCisgKiB0aGUgc2FtZSBoZXJlIGZvcmUgc2FmZXR5IGFnYWluc3QgYnJva2VuIG9sZCBoYXJkd2FyZSA7KQorICogVGhlIEhhbGZUaWNrIGJpdCwgd2hlbiBzZXQsIGFkZHMgaGFsZiBhIGNsb2NrICgxNW5zKSB0byB0aGUgYWNjZXNzCisgKiB0aW1lIGFuZCByZW1vdmVzIG9uZSBmcm9tIHJlY292ZXJ5LiBJdCdzIG5vdCBzdXBwb3J0ZWQgb24gS2V5TGFyZ28KKyAqIGltcGxlbWVudGF0aW9uIGFmYWlrLiBUaGUgRSBiaXQgYXBwZWFycyB0byBiZSBzZXQgZm9yIFBJTyBtb2RlIDAgYW5kCisgKiBpcyB1c2VkIHRvIHJlYWNoIGxvbmcgdGltaW5ncyB1c2VkIGluIHRoaXMgbW9kZS4KKyAqLworI2RlZmluZSBUUl8zM19NRE1BX01BU0sJCQkweDAwM2ZmODAwCisjZGVmaW5lIFRSXzMzX01ETUFfUkVDT1ZFUllfTUFTSwkweDAwMWYwMDAwCisjZGVmaW5lIFRSXzMzX01ETUFfUkVDT1ZFUllfU0hJRlQJMTYKKyNkZWZpbmUgVFJfMzNfTURNQV9BQ0NFU1NfTUFTSwkJMHgwMDAwZjgwMAorI2RlZmluZSBUUl8zM19NRE1BX0FDQ0VTU19TSElGVAkJMTEKKyNkZWZpbmUgVFJfMzNfTURNQV9IQUxGVElDSwkJMHgwMDIwMDAwMAorI2RlZmluZSBUUl8zM19QSU9fTUFTSwkJCTB4MDAwMDA3ZmYKKyNkZWZpbmUgVFJfMzNfUElPX0UJCQkweDAwMDAwNDAwCisjZGVmaW5lIFRSXzMzX1BJT19SRUNPVkVSWV9NQVNLCQkweDAwMDAwM2UwCisjZGVmaW5lIFRSXzMzX1BJT19SRUNPVkVSWV9TSElGVAk1CisjZGVmaW5lIFRSXzMzX1BJT19BQ0NFU1NfTUFTSwkJMHgwMDAwMDAxZgorI2RlZmluZSBUUl8zM19QSU9fQUNDRVNTX1NISUZUCQkwCisKKy8qCisgKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBJREVfSU5UUl9ETUEJCQkweDgwMDAwMDAwCisjZGVmaW5lIElERV9JTlRSX0RFVklDRQkJCTB4NDAwMDAwMDAKKworLyoKKyAqIEZDUiBSZWdpc3RlciBvbiBLYXVhaS4gTm90IHN1cmUgd2hhdCBiaXQgMHg0IGlzICAuLi4KKyAqLworI2RlZmluZSBLQVVBSV9GQ1JfVUFUQV9NQUdJQwkJMHgwMDAwMDAwNAorI2RlZmluZSBLQVVBSV9GQ1JfVUFUQV9SRVNFVF9OCQkweDAwMDAwMDAyCisjZGVmaW5lIEtBVUFJX0ZDUl9VQVRBX0VOQUJMRQkJMHgwMDAwMDAwMQorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1BNQUMKKworLyogUm91bmRlZCBNdWx0aXdvcmQgRE1BIHRpbWluZ3MKKyAqIAorICogSSBnYXZlIHVwIGZpbmRpbmcgYSBnZW5lcmljIGZvcm11bGEgZm9yIGFsbCBjb250cm9sbGVyCisgKiB0eXBlcyBhbmQgaW5zdGVhZCwgYnVpbHQgdGFibGVzIGJhc2VkIG9uIHRpbWluZyB2YWx1ZXMKKyAqIHVzZWQgYnkgQXBwbGUgaW4gRGFyd2luJ3MgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0cnVjdCBtZG1hX3RpbWluZ3NfdCB7CisJaW50CWFjY2Vzc1RpbWU7CisJaW50CXJlY292ZXJ5VGltZTsKKwlpbnQJY3ljbGVUaW1lOworfTsKKworc3RydWN0IG1kbWFfdGltaW5nc190IG1kbWFfdGltaW5nc18zM1tdIF9fcG1hY2RhdGEgPQoreworICAgIHsgMjQwLCAyNDAsIDQ4MCB9LAorICAgIHsgMTgwLCAxODAsIDM2MCB9LAorICAgIHsgMTM1LCAxMzUsIDI3MCB9LAorICAgIHsgMTIwLCAxMjAsIDI0MCB9LAorICAgIHsgMTA1LCAxMDUsIDIxMCB9LAorICAgIHsgIDkwLCAgOTAsIDE4MCB9LAorICAgIHsgIDc1LCAgNzUsIDE1MCB9LAorICAgIHsgIDc1LCAgNDUsIDEyMCB9LAorICAgIHsgICAwLCAgIDAsICAgMCB9Cit9OworCitzdHJ1Y3QgbWRtYV90aW1pbmdzX3QgbWRtYV90aW1pbmdzXzMza1tdIF9fcG1hY2RhdGEgPQoreworICAgIHsgMjQwLCAyNDAsIDQ4MCB9LAorICAgIHsgMTgwLCAxODAsIDM2MCB9LAorICAgIHsgMTUwLCAxNTAsIDMwMCB9LAorICAgIHsgMTIwLCAxMjAsIDI0MCB9LAorICAgIHsgIDkwLCAxMjAsIDIxMCB9LAorICAgIHsgIDkwLCAgOTAsIDE4MCB9LAorICAgIHsgIDkwLCAgNjAsIDE1MCB9LAorICAgIHsgIDkwLCAgMzAsIDEyMCB9LAorICAgIHsgICAwLCAgIDAsICAgMCB9Cit9OworCitzdHJ1Y3QgbWRtYV90aW1pbmdzX3QgbWRtYV90aW1pbmdzXzY2W10gX19wbWFjZGF0YSA9Cit7CisgICAgeyAyNDAsIDI0MCwgNDgwIH0sCisgICAgeyAxODAsIDE4MCwgMzYwIH0sCisgICAgeyAxMzUsIDEzNSwgMjcwIH0sCisgICAgeyAxMjAsIDEyMCwgMjQwIH0sCisgICAgeyAxMDUsIDEwNSwgMjEwIH0sCisgICAgeyAgOTAsICA5MCwgMTgwIH0sCisgICAgeyAgOTAsICA3NSwgMTY1IH0sCisgICAgeyAgNzUsICA0NSwgMTIwIH0sCisgICAgeyAgIDAsICAgMCwgICAwIH0KK307CisKKy8qIEtleUxhcmdvIEFUQS00IFVsdHJhIERNQSB0aW1pbmdzIChyb3VuZGVkKSAqLworc3RydWN0IHsKKwlpbnQJYWRkclNldHVwOyAvKiA/Pz8gKi8KKwlpbnQJcmR5MnBhdXNlOworCWludAl3ckRhdGFTZXR1cDsKK30ga2w2Nl91ZG1hX3RpbWluZ3NbXSBfX3BtYWNkYXRhID0KK3sKKyAgICB7ICAgMCwgMTgwLCAgMTIwIH0sCS8qIE1vZGUgMCAqLworICAgIHsgICAwLCAxNTAsICA5MCB9LAkvKiAgICAgIDEgKi8KKyAgICB7ICAgMCwgMTIwLCAgNjAgfSwJLyogICAgICAyICovCisgICAgeyAgIDAsIDkwLCAgIDQ1IH0sCS8qICAgICAgMyAqLworICAgIHsgICAwLCA5MCwgICAzMCB9CS8qICAgICAgNCAqLworfTsKKworLyogVW5pTm9ydGggMiBBVEEvMTAwIHRpbWluZ3MgKi8KK3N0cnVjdCBrYXVhaV90aW1pbmcgeworCWludAljeWNsZV90aW1lOworCXUzMgl0aW1pbmdfcmVnOworfTsKKworc3RhdGljIHN0cnVjdCBrYXVhaV90aW1pbmcJa2F1YWlfcGlvX3RpbWluZ3NbXSBfX3BtYWNkYXRhID0KK3sKKwl7IDkzMAksIDB4MDgwMDBmZmYgfSwKKwl7IDYwMAksIDB4MDgwMDBhOTIgfSwKKwl7IDM4MwksIDB4MDgwMDA2MGYgfSwKKwl7IDM2MAksIDB4MDgwMDA0OTIgfSwKKwl7IDMzMAksIDB4MDgwMDA0OGYgfSwKKwl7IDMwMAksIDB4MDgwMDAzY2YgfSwKKwl7IDI3MAksIDB4MDgwMDAzY2MgfSwKKwl7IDI0MAksIDB4MDgwMDAzOGIgfSwKKwl7IDIzOQksIDB4MDgwMDAzMGMgfSwKKwl7IDE4MAksIDB4MDUwMDAyNDkgfSwKKwl7IDEyMAksIDB4MDQwMDAxNDggfQorfTsKKworc3RhdGljIHN0cnVjdCBrYXVhaV90aW1pbmcJa2F1YWlfbWRtYV90aW1pbmdzW10gX19wbWFjZGF0YSA9Cit7CisJeyAxMjYwCSwgMHgwMGZmZjAwMCB9LAorCXsgNDgwCSwgMHgwMDYxODAwMCB9LAorCXsgMzYwCSwgMHgwMDQ5MjAwMCB9LAorCXsgMjcwCSwgMHgwMDM4ZTAwMCB9LAorCXsgMjQwCSwgMHgwMDMwYzAwMCB9LAorCXsgMjEwCSwgMHgwMDJjYjAwMCB9LAorCXsgMTgwCSwgMHgwMDI0OTAwMCB9LAorCXsgMTUwCSwgMHgwMDIwOTAwMCB9LAorCXsgMTIwCSwgMHgwMDE0ODAwMCB9LAorCXsgMAksIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2F1YWlfdGltaW5nCWthdWFpX3VkbWFfdGltaW5nc1tdIF9fcG1hY2RhdGEgPQoreworCXsgMTIwCSwgMHgwMDAwNzBjMCB9LAorCXsgOTAJLCAweDAwMDA1ZDgwIH0sCisJeyA2MAksIDB4MDAwMDRhNjAgfSwKKwl7IDQ1CSwgMHgwMDAwM2E1MCB9LAorCXsgMzAJLCAweDAwMDAyYTMwIH0sCisJeyAyMAksIDB4MDAwMDI5MjEgfSwKKwl7IDAJLCAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGthdWFpX3RpbWluZwlzaGFzdGFfcGlvX3RpbWluZ3NbXSBfX3BtYWNkYXRhID0KK3sKKwl7IDkzMAksIDB4MDgwMDBmZmYgfSwKKwl7IDYwMAksIDB4MEEwMDBjOTcgfSwKKwl7IDM4MwksIDB4MDcwMDA3MTIgfSwKKwl7IDM2MAksIDB4MDQwMDAzY2QgfSwKKwl7IDMzMAksIDB4MDQwMDAzY2QgfSwKKwl7IDMwMAksIDB4MDQwMDAzY2QgfSwKKwl7IDI3MAksIDB4MDQwMDAzY2QgfSwKKwl7IDI0MAksIDB4MDQwMDAzY2QgfSwKKwl7IDIzOQksIDB4MDQwMDAzY2QgfSwKKwl7IDE4MAksIDB4MDQwMDAyOGIgfSwKKwl7IDEyMAksIDB4MDQwMDAxMGEgfQorfTsKKworc3RhdGljIHN0cnVjdCBrYXVhaV90aW1pbmcJc2hhc3RhX21kbWFfdGltaW5nc1tdIF9fcG1hY2RhdGEgPQoreworCXsgMTI2MAksIDB4MDBmZmYwMDAgfSwKKwl7IDQ4MAksIDB4MDA4MjA4MDAgfSwKKwl7IDM2MAksIDB4MDA4MjA4MDAgfSwKKwl7IDI3MAksIDB4MDA4MjA4MDAgfSwKKwl7IDI0MAksIDB4MDA4MjA4MDAgfSwKKwl7IDIxMAksIDB4MDA4MjA4MDAgfSwKKwl7IDE4MAksIDB4MDA4MjA4MDAgfSwKKwl7IDE1MAksIDB4MDAyOGIwMDAgfSwKKwl7IDEyMAksIDB4MDAxY2EwMDAgfSwKKwl7IDAJLCAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGthdWFpX3RpbWluZwlzaGFzdGFfdWRtYTEzM190aW1pbmdzW10gX19wbWFjZGF0YSA9Cit7CisJeyAxMjAgICAsIDB4MDAwMzU5MDEsIH0sCisJeyA5MCAgICAsIDB4MDAwMzQ4YjEsIH0sCisJeyA2MCAgICAsIDB4MDAwMzM4ODEsIH0sCisJeyA0NSAgICAsIDB4MDAwMzM4NjEsIH0sCisJeyAzMCAgICAsIDB4MDAwMzM4NDEsIH0sCisJeyAyMCAgICAsIDB4MDAwMzMwMzEsIH0sCisJeyAxNSAgICAsIDB4MDAwMzMwMjEsIH0sCisJeyAwCSwgMCB9LAorfTsKKworCitzdGF0aWMgaW5saW5lIHUzMgora2F1YWlfbG9va3VwX3RpbWluZyhzdHJ1Y3Qga2F1YWlfdGltaW5nKiB0YWJsZSwgaW50IGN5Y2xlX3RpbWUpCit7CisJaW50IGk7CisJCisJZm9yIChpPTA7IHRhYmxlW2ldLmN5Y2xlX3RpbWU7IGkrKykKKwkJaWYgKGN5Y2xlX3RpbWUgPiB0YWJsZVtpKzFdLmN5Y2xlX3RpbWUpCisJCQlyZXR1cm4gdGFibGVbaV0udGltaW5nX3JlZzsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb3cgdXAgdG8gMjU2IERCRE1BIGNvbW1hbmRzIHBlciB4ZmVyICovCisjZGVmaW5lIE1BWF9EQ01EUwkJMjU2CisKKy8qIAorICogV2FpdCAxcyBmb3IgZGlzayB0byBhbnN3ZXIgb24gSURFIGJ1cyBhZnRlciBhIGhhcmQgcmVzZXQKKyAqIG9mIHRoZSBkZXZpY2UgKHZpYSBHUElPL0ZDUikuCisgKiAKKyAqIFNvbWUgZGV2aWNlcyBzZWVtIHRvICJwb2xsdXRlIiB0aGUgYnVzIGV2ZW4gYWZ0ZXIgZHJvcHBpbmcKKyAqIHRoZSBCU1kgYml0ICh0eXBpY2FsbHkgc29tZSBjb21ibyBkcml2ZXMgc2xhdmUgb24gdGhlIFVETUEKKyAqIGJ1cykgYWZ0ZXIgYSBoYXJkIHJlc2V0LiBTaW5jZSB3ZSBoYXJkIHJlc2V0IGFsbCBkcml2ZXMgb24KKyAqIEtleUxhcmdvIEFUQTY2LCB3ZSBoYXZlIHRvIGtlZXAgdGhhdCBkZWxheSBhcm91bmQuIEkgbWF5IGVuZAorICogdXAgbm90IGhhcmQgcmVzZXR0aW5nIGFueW1vcmUgb24gdGhlc2UgYW5kIGtlZXAgdGhlIGRlbGF5IG9ubHkKKyAqIGZvciBvbGRlciBpbnRlcmZhY2VzIGluc3RlYWQgKHdlIGhhdmUgdG8gcmVzZXQgd2hlbiBjb21pbmcKKyAqIGZyb20gTWFjT1MuLi4pIC0tQmVuSC4gCisgKi8KKyNkZWZpbmUgSURFX1dBS0VVUF9ERUxBWQkoMSpIWikKKworc3RhdGljIHZvaWQgcG1hY19pZGVfc2V0dXBfZG1hKHBtYWNfaWRlX2h3aWZfdCAqcG1pZiwgaWRlX2h3aWZfdCAqaHdpZik7CitzdGF0aWMgaW50IHBtYWNfaWRlX2J1aWxkX2RtYXRhYmxlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK3N0YXRpYyBpbnQgcG1hY19pZGVfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpOworc3RhdGljIHZvaWQgcG1hY19pZGVfdHVuZXByb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pOworc3RhdGljIHZvaWQgcG1hY19pZGVfc2VsZWN0cHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUpOworc3RhdGljIHZvaWQgcG1hY19pZGVfa2F1YWlfc2VsZWN0cHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUpOworCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BX1BNQUMgKi8KKworLyoKKyAqIEJlbG93IGlzIHRoZSBjb2RlIGZvciBibGlua2luZyB0aGUgbGFwdG9wIExFRCBhbG9uZyB3aXRoIGhhcmQKKyAqIGRpc2sgYWN0aXZpdHkuCisgKi8KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDX0JMSU5LCisKKy8qIFNldCB0byA1MG1zIG1pbmltdW0gbGVkLW9uIHRpbWUgKGFsc28gdXNlZCB0byBsaW1pdCBmcmVxdWVuY3kKKyAqIG9mIHJlcXVlc3RzIHNlbnQgdG8gdGhlIFBNVQorICovCisjZGVmaW5lIFBNVV9IRF9CTElOS19USU1FCShIWi81MCkKKworc3RhdGljIHN0cnVjdCBhZGJfcmVxdWVzdCBwbXVfYmxpbmtfb24sIHBtdV9ibGlua19vZmY7CitzdGF0aWMgc3BpbmxvY2tfdCBwbXVfYmxpbmtfbG9jazsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBtdV9ibGlua19zdG9wdGltZTsKK3N0YXRpYyBpbnQgcG11X2JsaW5rX2xlZHN0YXRlOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBtdV9ibGlua190aW1lcjsKK3N0YXRpYyBpbnQgcG11X2lkZV9ibGlua19lbmFibGVkOworCisKK3N0YXRpYyB2b2lkCitwbXVfaGRfYmxpbmtfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG11X2JsaW5rX2xvY2ssIGZsYWdzKTsKKworCS8qIFdlIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGFnYWluIGluIGEgcmFjeSB3YXksIGNoZWNrCisJICogdGhhdCB3ZSByZWFsbHkgd2FudCB0byBzd2l0Y2ggaXQgb2ZmCisJICovCisJaWYgKHRpbWVfYWZ0ZXIocG11X2JsaW5rX3N0b3B0aW1lLCBqaWZmaWVzKSkKKwkJZ290byBkb25lOworCisJLyogUHJldmlvdXMgcmVxLiBub3QgY29tcGxldGUsIHRyeSAxMDBtcyBtb3JlICovCisJaWYgKHBtdV9ibGlua19vZmYuY29tcGxldGUgPT0gMCkKKwkJbW9kX3RpbWVyKCZwbXVfYmxpbmtfdGltZXIsIGppZmZpZXMgKyBQTVVfSERfQkxJTktfVElNRSk7CisJZWxzZSBpZiAocG11X2JsaW5rX2xlZHN0YXRlKSB7CisJCXBtdV9yZXF1ZXN0KCZwbXVfYmxpbmtfb2ZmLCBOVUxMLCA0LCAweGVlLCA0LCAwLCAwKTsKKwkJcG11X2JsaW5rX2xlZHN0YXRlID0gMDsKKwl9Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9ibGlua19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbXVfaGRfa2lja19ibGluayh2b2lkICpkYXRhLCBpbnQgcncpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlwbXVfYmxpbmtfc3RvcHRpbWUgPSBqaWZmaWVzICsgUE1VX0hEX0JMSU5LX1RJTUU7CisJd21iKCk7CisJbW9kX3RpbWVyKCZwbXVfYmxpbmtfdGltZXIsIHBtdV9ibGlua19zdG9wdGltZSk7CisJLyogRmFzdCBwYXRoIHdoZW4gTEVEIGlzIGFscmVhZHkgT04gKi8KKwlpZiAocG11X2JsaW5rX2xlZHN0YXRlID09IDEpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG11X2JsaW5rX2xvY2ssIGZsYWdzKTsKKwlpZiAocG11X2JsaW5rX29uLmNvbXBsZXRlICYmICFwbXVfYmxpbmtfbGVkc3RhdGUpIHsKKwkJcG11X3JlcXVlc3QoJnBtdV9ibGlua19vbiwgTlVMTCwgNCwgMHhlZSwgNCwgMCwgMSk7CisJCXBtdV9ibGlua19sZWRzdGF0ZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9ibGlua19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3BtdV9oZF9ibGlua19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkdDsKKwljb25zdCBjaGFyICptb2RlbDsKKworCS8qIEN1cnJlbnRseSwgSSBvbmx5IGVuYWJsZSB0aGlzIGZlYXR1cmUgb24gS2V5TGFyZ28gYmFzZWQgbGFwdG9wcywKKwkgKiBvbGRlciBsYXB0b3BzIG1heSBzdXBwb3J0IGl0IChhdCBsZWFzdCBoZWF0aHJvdy9wYWRkaW5ndG9uKSBidXQKKwkgKiBJIGRvbid0IGZlZWwgbGlrZSBsb2FkaW5nIHRob3NlIHZlbmVyYWJsZSBvbGQgbWFjaGluZXMgd2l0aCBzbworCSAqIG11Y2ggYWRkaXRpb25hbCBpbnRlcnJ1cHQgJiBQTVUgYWN0aXZpdHkuLi4KKwkgKi8KKwlpZiAocG11X2dldF9tb2RlbCgpICE9IFBNVV9LRVlMQVJHT19CQVNFRCkKKwkJcmV0dXJuIDA7CisJCisJZHQgPSBmaW5kX2RldmljZXMoImRldmljZS10cmVlIik7CisJaWYgKGR0ID09IE5VTEwpCisJCXJldHVybiAwOworCW1vZGVsID0gKGNvbnN0IGNoYXIgKilnZXRfcHJvcGVydHkoZHQsICJtb2RlbCIsIE5VTEwpOworCWlmIChtb2RlbCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RybmNtcChtb2RlbCwgIlBvd2VyQm9vayIsIHN0cmxlbigiUG93ZXJCb29rIikpICE9IDAgJiYKKwkgICAgc3RybmNtcChtb2RlbCwgImlCb29rIiwgc3RybGVuKCJpQm9vayIpKSAhPSAwKQorCSAgICAJcmV0dXJuIDA7CisJCisJcG11X2JsaW5rX29uLmNvbXBsZXRlID0gMTsKKwlwbXVfYmxpbmtfb2ZmLmNvbXBsZXRlID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmcG11X2JsaW5rX2xvY2spOworCWluaXRfdGltZXIoJnBtdV9ibGlua190aW1lcik7CisJcG11X2JsaW5rX3RpbWVyLmZ1bmN0aW9uID0gcG11X2hkX2JsaW5rX3RpbWVvdXQ7CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERV9QTUFDX0JMSU5LICovCisKKy8qCisgKiBOLkIuIHRoaXMgY2FuJ3QgYmUgYW4gaW5pdGZ1bmMsIGJlY2F1c2UgdGhlIG1lZGlhLWJheSB0YXNrIGNhbgorICogY2FsbCBpZGVfW3VuXXJlZ2lzdGVyIGF0IGFueSB0aW1lLgorICovCit2b2lkIF9fcG1hYworcG1hY19pZGVfaW5pdF9od2lmX3BvcnRzKGh3X3JlZ3NfdCAqaHcsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGRhdGFfcG9ydCwgdW5zaWduZWQgbG9uZyBjdHJsX3BvcnQsCisJCQkgICAgICBpbnQgKmlycSkKK3sKKwlpbnQgaSwgaXg7CisKKwlpZiAoZGF0YV9wb3J0ID09IDApCisJCXJldHVybjsKKworCWZvciAoaXggPSAwOyBpeCA8IE1BWF9IV0lGUzsgKytpeCkKKwkJaWYgKGRhdGFfcG9ydCA9PSBwbWFjX2lkZVtpeF0ucmVnYmFzZSkKKwkJCWJyZWFrOworCisJaWYgKGl4ID49IE1BWF9IV0lGUykgeworCQkvKiBQcm9iYWJseSBhIFBDSSBpbnRlcmZhY2UuLi4gKi8KKwkJZm9yIChpID0gSURFX0RBVEFfT0ZGU0VUOyBpIDw9IElERV9TVEFUVVNfT0ZGU0VUOyArK2kpCisJCQlody0+aW9fcG9ydHNbaV0gPSBkYXRhX3BvcnQgKyBpIC0gSURFX0RBVEFfT0ZGU0VUOworCQlody0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSA9IGN0cmxfcG9ydDsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJCWh3LT5pb19wb3J0c1tpXSA9IGRhdGFfcG9ydCArIGkgKiAweDEwOworCWh3LT5pb19wb3J0c1s4XSA9IGRhdGFfcG9ydCArIDB4MTYwOworCisJaWYgKGlycSAhPSBOVUxMKQorCQkqaXJxID0gcG1hY19pZGVbaXhdLmlycTsKK30KKworI2RlZmluZSBQTUFDX0lERV9SRUcoeCkgKCh2b2lkIF9faW9tZW0gKikoSURFX0RBVEFfUkVHKyh4KSkpCisKKy8qCisgKiBBcHBseSB0aGUgdGltaW5ncyBvZiB0aGUgcHJvcGVyIHVuaXQgKG1hc3Rlci9zbGF2ZSkgdG8gdGhlIHNoYXJlZAorICogdGltaW5nIHJlZ2lzdGVyIHdoZW4gc2VsZWN0aW5nIHRoYXQgdW5pdC4gVGhpcyB2ZXJzaW9uIGlzIGZvcgorICogQVNJQ3Mgd2l0aCBhIHNpbmdsZSB0aW1pbmcgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgX19wbWFjCitwbWFjX2lkZV9zZWxlY3Rwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopSFdJRihkcml2ZSktPmh3aWZfZGF0YTsKKworCWlmIChwbWlmID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpCisJCXdyaXRlbChwbWlmLT50aW1pbmdzWzFdLCBQTUFDX0lERV9SRUcoSURFX1RJTUlOR19DT05GSUcpKTsKKwllbHNlCisJCXdyaXRlbChwbWlmLT50aW1pbmdzWzBdLCBQTUFDX0lERV9SRUcoSURFX1RJTUlOR19DT05GSUcpKTsKKwkodm9pZClyZWFkbChQTUFDX0lERV9SRUcoSURFX1RJTUlOR19DT05GSUcpKTsKK30KKworLyoKKyAqIEFwcGx5IHRoZSB0aW1pbmdzIG9mIHRoZSBwcm9wZXIgdW5pdCAobWFzdGVyL3NsYXZlKSB0byB0aGUgc2hhcmVkCisgKiB0aW1pbmcgcmVnaXN0ZXIgd2hlbiBzZWxlY3RpbmcgdGhhdCB1bml0LiBUaGlzIHZlcnNpb24gaXMgZm9yCisgKiBBU0lDcyB3aXRoIGEgZHVhbCB0aW1pbmcgcmVnaXN0ZXIgKEthdWFpKQorICovCitzdGF0aWMgdm9pZCBfX3BtYWMKK3BtYWNfaWRlX2thdWFpX3NlbGVjdHByb2MoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXBtYWNfaWRlX2h3aWZfdCogcG1pZiA9IChwbWFjX2lkZV9od2lmX3QgKilIV0lGKGRyaXZlKS0+aHdpZl9kYXRhOworCisJaWYgKHBtaWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSkgeworCQl3cml0ZWwocG1pZi0+dGltaW5nc1sxXSwgUE1BQ19JREVfUkVHKElERV9LQVVBSV9QSU9fQ09ORklHKSk7CisJCXdyaXRlbChwbWlmLT50aW1pbmdzWzNdLCBQTUFDX0lERV9SRUcoSURFX0tBVUFJX1VMVFJBX0NPTkZJRykpOworCX0gZWxzZSB7CisJCXdyaXRlbChwbWlmLT50aW1pbmdzWzBdLCBQTUFDX0lERV9SRUcoSURFX0tBVUFJX1BJT19DT05GSUcpKTsKKwkJd3JpdGVsKHBtaWYtPnRpbWluZ3NbMl0sIFBNQUNfSURFX1JFRyhJREVfS0FVQUlfVUxUUkFfQ09ORklHKSk7CisJfQorCSh2b2lkKXJlYWRsKFBNQUNfSURFX1JFRyhJREVfS0FVQUlfUElPX0NPTkZJRykpOworfQorCisvKgorICogRm9yY2UgYW4gdXBkYXRlIG9mIGNvbnRyb2xsZXIgdGltaW5nIHZhbHVlcyBmb3IgYSBnaXZlbiBkcml2ZQorICovCitzdGF0aWMgdm9pZCBfX3BtYWMKK3BtYWNfaWRlX2RvX3VwZGF0ZV90aW1pbmdzKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopSFdJRihkcml2ZSktPmh3aWZfZGF0YTsKKworCWlmIChwbWlmID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfc2hfYXRhNiB8fAorCSAgICBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfdW5fYXRhNiB8fAorCSAgICBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNikKKwkJcG1hY19pZGVfa2F1YWlfc2VsZWN0cHJvYyhkcml2ZSk7CisJZWxzZQorCQlwbWFjX2lkZV9zZWxlY3Rwcm9jKGRyaXZlKTsKK30KKworc3RhdGljIHZvaWQKK3BtYWNfb3V0YnN5bmMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXUzMiB0bXA7CisJCisJd3JpdGViKHZhbHVlLCAodm9pZCBfX2lvbWVtICopIHBvcnQpOworCXRtcCA9IHJlYWRsKFBNQUNfSURFX1JFRyhJREVfVElNSU5HX0NPTkZJRykpOworfQorCisvKgorICogU2VuZCB0aGUgU0VUX0ZFQVRVUkUgSURFIGNvbW1hbmQgdG8gdGhlIGRyaXZlIGFuZCB1cGRhdGUgZHJpdmUtPmlkIHdpdGgKKyAqIHRoZSBuZXcgc3RhdGUuIFdlIGN1cnJlbnRseSBkb24ndCB1c2UgdGhlIGdlbmVyaWMgcm91dGluZSBhcyBpdCB1c2VkIHRvCisgKiBjYXVzZSB2YXJpb3VzIHRyb3VibGUsIGVzcGVjaWFsbHkgd2l0aCBvbGRlciBtZWRpYWJheXMuCisgKiBUaGlzIGNvZGUgaXMgc29tZXRpbWVzIHRyaWdnZXJpbmcgYSBzcHVycmlvdXMgaW50ZXJydXB0IHRob3VnaCwgSSBuZWVkCisgKiB0byBzb3J0IHRoYXQgb3V0IHNvb25lciBvciBsYXRlciBhbmQgc2VlIGlmIEkgY2FuIGZpbmFsbHkgZ2V0IHRoZQorICogY29tbW9uIHZlcnNpb24gdG8gd29yayBwcm9wZXJseSBpbiBhbGwgY2FzZXMKKyAqLworc3RhdGljIGludCBfX3BtYWMKK3BtYWNfaWRlX2RvX3NldGZlYXR1cmUoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjb21tYW5kKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpbnQgcmVzdWx0ID0gMTsKKwkKKwlkaXNhYmxlX2lycV9ub3N5bmMoaHdpZi0+aXJxKTsKKwl1ZGVsYXkoMSk7CisJU0VMRUNUX0RSSVZFKGRyaXZlKTsKKwlTRUxFQ1RfTUFTSyhkcml2ZSwgMCk7CisJdWRlbGF5KDEpOworCS8qIEdldCByaWQgb2YgcGVuZGluZyBlcnJvciBzdGF0ZSAqLworCSh2b2lkKSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpOworCS8qIFRpbWVvdXQgYnVtcGVkIGZvciBzb21lIHBvd2VyYm9va3MgKi8KKwlpZiAod2FpdF9mb3JfcmVhZHkoZHJpdmUsIDIwMDApKSB7CisJCS8qIFRpbWVvdXQgYnVtcGVkIGZvciBzb21lIHBvd2VyYm9va3MgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcG1hY19pZGVfZG9fc2V0ZmVhdHVyZSBkaXNrIG5vdCByZWFkeSAiCisJCQkiYmVmb3JlIFNFVF9GRUFUVVJFIVxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJdWRlbGF5KDEwKTsKKwlod2lmLT5PVVRCKGRyaXZlLT5jdGwgfCAyLCBJREVfQ09OVFJPTF9SRUcpOworCWh3aWYtPk9VVEIoY29tbWFuZCwgSURFX05TRUNUT1JfUkVHKTsKKwlod2lmLT5PVVRCKFNFVEZFQVRVUkVTX1hGRVIsIElERV9GRUFUVVJFX1JFRyk7CisJaHdpZi0+T1VUQlNZTkMoZHJpdmUsIFdJTl9TRVRGRUFUVVJFUywgSURFX0NPTU1BTkRfUkVHKTsKKwl1ZGVsYXkoMSk7CisJLyogVGltZW91dCBidW1wZWQgZm9yIHNvbWUgcG93ZXJib29rcyAqLworCXJlc3VsdCA9IHdhaXRfZm9yX3JlYWR5KGRyaXZlLCAyMDAwKTsKKwlod2lmLT5PVVRCKGRyaXZlLT5jdGwsIElERV9DT05UUk9MX1JFRyk7CisJaWYgKHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcG1hY19pZGVfZG9fc2V0ZmVhdHVyZSBkaXNrIG5vdCByZWFkeSAiCisJCQkiYWZ0ZXIgU0VUX0ZFQVRVUkUgIVxuIiwgZHJpdmUtPm5hbWUpOworb3V0OgorCVNFTEVDVF9NQVNLKGRyaXZlLCAwKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgJj0gfjB4RkYwMDsKKwkJZHJpdmUtPmlkLT5kbWFfbXdvcmQgJj0gfjB4MEYwMDsKKwkJZHJpdmUtPmlkLT5kbWFfMXdvcmQgJj0gfjB4MEYwMDsKKwkJc3dpdGNoKGNvbW1hbmQpIHsKKwkJCWNhc2UgWEZFUl9VRE1BXzc6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHg4MDgwOyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzY6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHg0MDQwOyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzU6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgyMDIwOyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzQ6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgxMDEwOyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzM6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwODA4OyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzI6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwNDA0OyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzE6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwMjAyOyBicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzA6CisJCQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwMTAxOyBicmVhazsKKwkJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJCQlkcml2ZS0+aWQtPmRtYV9td29yZCB8PSAweDA0MDQ7IGJyZWFrOworCQkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQkJCWRyaXZlLT5pZC0+ZG1hX213b3JkIHw9IDB4MDIwMjsgYnJlYWs7CisJCQljYXNlIFhGRVJfTVdfRE1BXzA6CisJCQkJZHJpdmUtPmlkLT5kbWFfbXdvcmQgfD0gMHgwMTAxOyBicmVhazsKKwkJCWNhc2UgWEZFUl9TV19ETUFfMjoKKwkJCQlkcml2ZS0+aWQtPmRtYV8xd29yZCB8PSAweDA0MDQ7IGJyZWFrOworCQkJY2FzZSBYRkVSX1NXX0RNQV8xOgorCQkJCWRyaXZlLT5pZC0+ZG1hXzF3b3JkIHw9IDB4MDIwMjsgYnJlYWs7CisJCQljYXNlIFhGRVJfU1dfRE1BXzA6CisJCQkJZHJpdmUtPmlkLT5kbWFfMXdvcmQgfD0gMHgwMTAxOyBicmVhazsKKwkJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisJfQorCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogT2xkIHR1bmluZyBmdW5jdGlvbnMgKGNhbGxlZCBvbiBoZHBhcm0gLXApLCBzZXRzIHVwIGRyaXZlIFBJTyB0aW1pbmdzCisgKi8KK3N0YXRpYyB2b2lkIF9fcG1hYworcG1hY19pZGVfdHVuZXByb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBwaW8pCit7CisJaWRlX3Bpb19kYXRhX3QgZDsKKwl1MzIgKnRpbWluZ3M7CisJdW5zaWduZWQgYWNjZXNzVGlja3MsIHJlY1RpY2tzOworCXVuc2lnbmVkIGFjY2Vzc1RpbWUsIHJlY1RpbWU7CisJcG1hY19pZGVfaHdpZl90KiBwbWlmID0gKHBtYWNfaWRlX2h3aWZfdCAqKUhXSUYoZHJpdmUpLT5od2lmX2RhdGE7CisJCisJaWYgKHBtaWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCQkKKwkvKiB3aGljaCBkcml2ZSBpcyBpdCA/ICovCisJdGltaW5ncyA9ICZwbWlmLT50aW1pbmdzW2RyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMV07CisKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNCwgJmQpOworCisJc3dpdGNoIChwbWlmLT5raW5kKSB7CisJY2FzZSBjb250cm9sbGVyX3NoX2F0YTY6IHsKKwkJLyogMTMzTWh6IGNlbGwgKi8KKwkJdTMyIHRyID0ga2F1YWlfbG9va3VwX3RpbWluZyhzaGFzdGFfcGlvX3RpbWluZ3MsIGQuY3ljbGVfdGltZSk7CisJCWlmICh0ciA9PSAwKQorCQkJcmV0dXJuOworCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgflRSXzEzM19QSU9SRUdfUElPX01BU0spIHwgdHI7CisJCWJyZWFrOworCQl9CisJY2FzZSBjb250cm9sbGVyX3VuX2F0YTY6CisJY2FzZSBjb250cm9sbGVyX2syX2F0YTY6IHsKKwkJLyogMTAwTWh6IGNlbGwgKi8KKwkJdTMyIHRyID0ga2F1YWlfbG9va3VwX3RpbWluZyhrYXVhaV9waW9fdGltaW5ncywgZC5jeWNsZV90aW1lKTsKKwkJaWYgKHRyID09IDApCisJCQlyZXR1cm47CisJCSp0aW1pbmdzID0gKCgqdGltaW5ncykgJiB+VFJfMTAwX1BJT1JFR19QSU9fTUFTSykgfCB0cjsKKwkJYnJlYWs7CisJCX0KKwljYXNlIGNvbnRyb2xsZXJfa2xfYXRhNDoKKwkJLyogNjZNaHogY2VsbCAqLworCQlyZWNUaW1lID0gZC5jeWNsZV90aW1lIC0gaWRlX3Bpb190aW1pbmdzW3Bpb10uYWN0aXZlX3RpbWUKKwkJCQktIGlkZV9waW9fdGltaW5nc1twaW9dLnNldHVwX3RpbWU7CisJCXJlY1RpbWUgPSBtYXgocmVjVGltZSwgMTUwVSk7CisJCWFjY2Vzc1RpbWUgPSBpZGVfcGlvX3RpbWluZ3NbcGlvXS5hY3RpdmVfdGltZTsKKwkJYWNjZXNzVGltZSA9IG1heChhY2Nlc3NUaW1lLCAxNTBVKTsKKwkJYWNjZXNzVGlja3MgPSBTWVNDTEtfVElDS1NfNjYoYWNjZXNzVGltZSk7CisJCWFjY2Vzc1RpY2tzID0gbWluKGFjY2Vzc1RpY2tzLCAweDFmVSk7CisJCXJlY1RpY2tzID0gU1lTQ0xLX1RJQ0tTXzY2KHJlY1RpbWUpOworCQlyZWNUaWNrcyA9IG1pbihyZWNUaWNrcywgMHgxZlUpOworCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgflRSXzY2X1BJT19NQVNLKSB8CisJCQkJKGFjY2Vzc1RpY2tzIDw8IFRSXzY2X1BJT19BQ0NFU1NfU0hJRlQpIHwKKwkJCQkocmVjVGlja3MgPDwgVFJfNjZfUElPX1JFQ09WRVJZX1NISUZUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogeworCQkvKiAzM01oeiBjZWxsICovCisJCWludCBlYml0ID0gMDsKKwkJcmVjVGltZSA9IGQuY3ljbGVfdGltZSAtIGlkZV9waW9fdGltaW5nc1twaW9dLmFjdGl2ZV90aW1lCisJCQkJLSBpZGVfcGlvX3RpbWluZ3NbcGlvXS5zZXR1cF90aW1lOworCQlyZWNUaW1lID0gbWF4KHJlY1RpbWUsIDE1MFUpOworCQlhY2Nlc3NUaW1lID0gaWRlX3Bpb190aW1pbmdzW3Bpb10uYWN0aXZlX3RpbWU7CisJCWFjY2Vzc1RpbWUgPSBtYXgoYWNjZXNzVGltZSwgMTUwVSk7CisJCWFjY2Vzc1RpY2tzID0gU1lTQ0xLX1RJQ0tTKGFjY2Vzc1RpbWUpOworCQlhY2Nlc3NUaWNrcyA9IG1pbihhY2Nlc3NUaWNrcywgMHgxZlUpOworCQlhY2Nlc3NUaWNrcyA9IG1heChhY2Nlc3NUaWNrcywgNFUpOworCQlyZWNUaWNrcyA9IFNZU0NMS19USUNLUyhyZWNUaW1lKTsKKwkJcmVjVGlja3MgPSBtaW4ocmVjVGlja3MsIDB4MWZVKTsKKwkJcmVjVGlja3MgPSBtYXgocmVjVGlja3MsIDVVKSAtIDQ7CisJCWlmIChyZWNUaWNrcyA+IDkpIHsKKwkJCXJlY1RpY2tzLS07IC8qIGd1ZXNzLCBidXQgaXQncyBvbmx5IGZvciBQSU8wLCBzby4uLiAqLworCQkJZWJpdCA9IDE7CisJCX0KKwkJKnRpbWluZ3MgPSAoKCp0aW1pbmdzKSAmIH5UUl8zM19QSU9fTUFTSykgfAorCQkJCShhY2Nlc3NUaWNrcyA8PCBUUl8zM19QSU9fQUNDRVNTX1NISUZUKSB8CisJCQkJKHJlY1RpY2tzIDw8IFRSXzMzX1BJT19SRUNPVkVSWV9TSElGVCk7CisJCWlmIChlYml0KQorCQkJKnRpbWluZ3MgfD0gVFJfMzNfUElPX0U7CisJCWJyZWFrOworCQl9CisJfQorCisjaWZkZWYgSURFX1BNQUNfREVCVUcKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBTZXQgUElPIHRpbWluZyBmb3IgbW9kZSAlZCwgcmVnOiAweCUwOHhcbiIsCisJCWRyaXZlLT5uYW1lLCBwaW8sICAqdGltaW5ncyk7CisjZW5kaWYJCisKKwlpZiAoZHJpdmUtPnNlbGVjdC5hbGwgPT0gSFdJRihkcml2ZSktPklOQihJREVfU0VMRUNUX1JFRykpCisJCXBtYWNfaWRlX2RvX3VwZGF0ZV90aW1pbmdzKGRyaXZlKTsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDCisKKy8qCisgKiBDYWxjdWxhdGUgS2V5TGFyZ28gQVRBLzY2IFVETUEgdGltaW5ncworICovCitzdGF0aWMgaW50IF9fcG1hYworc2V0X3RpbWluZ3NfdWRtYV9hdGE0KHUzMiAqdGltaW5ncywgdTggc3BlZWQpCit7CisJdW5zaWduZWQgcmR5VG9QYXVzZVRpY2tzLCB3ckRhdGFTZXR1cFRpY2tzLCBhZGRyVGlja3M7CisKKwlpZiAoc3BlZWQgPiBYRkVSX1VETUFfNCkKKwkJcmV0dXJuIDE7CisKKwlyZHlUb1BhdXNlVGlja3MgPSBTWVNDTEtfVElDS1NfNjYoa2w2Nl91ZG1hX3RpbWluZ3Nbc3BlZWQgJiAweGZdLnJkeTJwYXVzZSk7CisJd3JEYXRhU2V0dXBUaWNrcyA9IFNZU0NMS19USUNLU182NihrbDY2X3VkbWFfdGltaW5nc1tzcGVlZCAmIDB4Zl0ud3JEYXRhU2V0dXApOworCWFkZHJUaWNrcyA9IFNZU0NMS19USUNLU182NihrbDY2X3VkbWFfdGltaW5nc1tzcGVlZCAmIDB4Zl0uYWRkclNldHVwKTsKKworCSp0aW1pbmdzID0gKCgqdGltaW5ncykgJiB+KFRSXzY2X1VETUFfTUFTSyB8IFRSXzY2X01ETUFfTUFTSykpIHwKKwkJCSh3ckRhdGFTZXR1cFRpY2tzIDw8IFRSXzY2X1VETUFfV1JEQVRBU0VUVVBfU0hJRlQpIHwgCisJCQkocmR5VG9QYXVzZVRpY2tzIDw8IFRSXzY2X1VETUFfUkRZMlBBVVNfU0hJRlQpIHwKKwkJCShhZGRyVGlja3MgPDxUUl82Nl9VRE1BX0FERFJTRVRVUF9TSElGVCkgfAorCQkJVFJfNjZfVURNQV9FTjsKKyNpZmRlZiBJREVfUE1BQ19ERUJVRworCXByaW50ayhLRVJOX0VSUiAiaWRlX3BtYWM6IFNldCBVRE1BIHRpbWluZyBmb3IgbW9kZSAlZCwgcmVnOiAweCUwOHhcbiIsCisJCXNwZWVkICYgMHhmLCAgKnRpbWluZ3MpOworI2VuZGlmCQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgS2F1YWkgQVRBLzEwMCBVRE1BIHRpbWluZ3MKKyAqLworc3RhdGljIGludCBfX3BtYWMKK3NldF90aW1pbmdzX3VkbWFfYXRhNih1MzIgKnBpb190aW1pbmdzLCB1MzIgKnVsdHJhX3RpbWluZ3MsIHU4IHNwZWVkKQoreworCXN0cnVjdCBpZGVfdGltaW5nICp0ID0gaWRlX3RpbWluZ19maW5kX21vZGUoc3BlZWQpOworCXUzMiB0cjsKKworCWlmIChzcGVlZCA+IFhGRVJfVURNQV81IHx8IHQgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJdHIgPSBrYXVhaV9sb29rdXBfdGltaW5nKGthdWFpX3VkbWFfdGltaW5ncywgKGludCl0LT51ZG1hKTsKKwlpZiAodHIgPT0gMCkKKwkJcmV0dXJuIDE7CisJKnVsdHJhX3RpbWluZ3MgPSAoKCp1bHRyYV90aW1pbmdzKSAmIH5UUl8xMDBfVURNQVJFR19VRE1BX01BU0spIHwgdHI7CisJKnVsdHJhX3RpbWluZ3MgPSAoKnVsdHJhX3RpbWluZ3MpIHwgVFJfMTAwX1VETUFSRUdfVURNQV9FTjsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIFNoYXN0YSBBVEEvMTMzIFVETUEgdGltaW5ncworICovCitzdGF0aWMgaW50IF9fcG1hYworc2V0X3RpbWluZ3NfdWRtYV9zaGFzdGEodTMyICpwaW9fdGltaW5ncywgdTMyICp1bHRyYV90aW1pbmdzLCB1OCBzcGVlZCkKK3sKKwlzdHJ1Y3QgaWRlX3RpbWluZyAqdCA9IGlkZV90aW1pbmdfZmluZF9tb2RlKHNwZWVkKTsKKwl1MzIgdHI7CisKKwlpZiAoc3BlZWQgPiBYRkVSX1VETUFfNiB8fCB0ID09IE5VTEwpCisJCXJldHVybiAxOworCXRyID0ga2F1YWlfbG9va3VwX3RpbWluZyhzaGFzdGFfdWRtYTEzM190aW1pbmdzLCAoaW50KXQtPnVkbWEpOworCWlmICh0ciA9PSAwKQorCQlyZXR1cm4gMTsKKwkqdWx0cmFfdGltaW5ncyA9ICgoKnVsdHJhX3RpbWluZ3MpICYgflRSXzEzM19VRE1BUkVHX1VETUFfTUFTSykgfCB0cjsKKwkqdWx0cmFfdGltaW5ncyA9ICgqdWx0cmFfdGltaW5ncykgfCBUUl8xMzNfVURNQVJFR19VRE1BX0VOOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgTURNQSB0aW1pbmdzIGZvciBhbGwgY2VsbHMKKyAqLworc3RhdGljIGludCBfX3BtYWMKK3NldF90aW1pbmdzX21kbWEoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgaW50Zl90eXBlLCB1MzIgKnRpbWluZ3MsIHUzMiAqdGltaW5nczIsCisJCQl1OCBzcGVlZCwgaW50IGRyaXZlX2N5Y2xlX3RpbWUpCit7CisJaW50IGN5Y2xlVGltZSwgYWNjZXNzVGltZSA9IDAsIHJlY1RpbWUgPSAwOworCXVuc2lnbmVkIGFjY2Vzc1RpY2tzLCByZWNUaWNrczsKKwlzdHJ1Y3QgbWRtYV90aW1pbmdzX3QqIHRtID0gTlVMTDsKKwlpbnQgaTsKKworCS8qIEdldCBkZWZhdWx0IGN5Y2xlIHRpbWUgZm9yIG1vZGUgKi8KKwlzd2l0Y2goc3BlZWQgJiAweGYpIHsKKwkJY2FzZSAwOiBjeWNsZVRpbWUgPSA0ODA7IGJyZWFrOworCQljYXNlIDE6IGN5Y2xlVGltZSA9IDE1MDsgYnJlYWs7CisJCWNhc2UgMjogY3ljbGVUaW1lID0gMTIwOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KKwkvKiBBZGp1c3QgZm9yIGRyaXZlICovCisJaWYgKGRyaXZlX2N5Y2xlX3RpbWUgJiYgZHJpdmVfY3ljbGVfdGltZSA+IGN5Y2xlVGltZSkKKwkJY3ljbGVUaW1lID0gZHJpdmVfY3ljbGVfdGltZTsKKwkvKiBPSGFyZSBsaW1pdHMgYWNjb3JkaW5nIHRvIHNvbWUgb2xkIEFwcGxlIHNvdXJjZXMgKi8JCisJaWYgKChpbnRmX3R5cGUgPT0gY29udHJvbGxlcl9vaGFyZSkgJiYgKGN5Y2xlVGltZSA8IDE1MCkpCisJCWN5Y2xlVGltZSA9IDE1MDsKKwkvKiBHZXQgdGhlIHByb3BlciB0aW1pbmcgYXJyYXkgZm9yIHRoaXMgY29udHJvbGxlciAqLworCXN3aXRjaChpbnRmX3R5cGUpIHsKKwkgICAgICAgIGNhc2UgY29udHJvbGxlcl9zaF9hdGE2OgorCQljYXNlIGNvbnRyb2xsZXJfdW5fYXRhNjoKKwkJY2FzZSBjb250cm9sbGVyX2syX2F0YTY6CisJCQlicmVhazsKKwkJY2FzZSBjb250cm9sbGVyX2tsX2F0YTQ6CisJCQl0bSA9IG1kbWFfdGltaW5nc182NjsKKwkJCWJyZWFrOworCQljYXNlIGNvbnRyb2xsZXJfa2xfYXRhMzoKKwkJCXRtID0gbWRtYV90aW1pbmdzXzMzazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG0gPSBtZG1hX3RpbWluZ3NfMzM7CisJCQlicmVhazsKKwl9CisJaWYgKHRtICE9IE5VTEwpIHsKKwkJLyogTG9va3VwIG1hdGNoaW5nIGFjY2VzcyAmIHJlY292ZXJ5IHRpbWVzICovCisJCWkgPSAtMTsKKwkJZm9yICg7OykgeworCQkJaWYgKHRtW2krMV0uY3ljbGVUaW1lIDwgY3ljbGVUaW1lKQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmIChpIDwgMCkKKwkJCXJldHVybiAxOworCQljeWNsZVRpbWUgPSB0bVtpXS5jeWNsZVRpbWU7CisJCWFjY2Vzc1RpbWUgPSB0bVtpXS5hY2Nlc3NUaW1lOworCQlyZWNUaW1lID0gdG1baV0ucmVjb3ZlcnlUaW1lOworCisjaWZkZWYgSURFX1BNQUNfREVCVUcKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTURNQSwgY3ljbGVUaW1lOiAlZCwgYWNjZXNzVGltZTogJWQsIHJlY1RpbWU6ICVkXG4iLAorCQkJZHJpdmUtPm5hbWUsIGN5Y2xlVGltZSwgYWNjZXNzVGltZSwgcmVjVGltZSk7CisjZW5kaWYKKwl9CisJc3dpdGNoKGludGZfdHlwZSkgeworCWNhc2UgY29udHJvbGxlcl9zaF9hdGE2OiB7CisJCS8qIDEzM01oeiBjZWxsICovCisJCXUzMiB0ciA9IGthdWFpX2xvb2t1cF90aW1pbmcoc2hhc3RhX21kbWFfdGltaW5ncywgY3ljbGVUaW1lKTsKKwkJaWYgKHRyID09IDApCisJCQlyZXR1cm4gMTsKKwkJKnRpbWluZ3MgPSAoKCp0aW1pbmdzKSAmIH5UUl8xMzNfUElPUkVHX01ETUFfTUFTSykgfCB0cjsKKwkJKnRpbWluZ3MyID0gKCp0aW1pbmdzMikgJiB+VFJfMTMzX1VETUFSRUdfVURNQV9FTjsKKwkJfQorCWNhc2UgY29udHJvbGxlcl91bl9hdGE2OgorCWNhc2UgY29udHJvbGxlcl9rMl9hdGE2OiB7CisJCS8qIDEwME1oeiBjZWxsICovCisJCXUzMiB0ciA9IGthdWFpX2xvb2t1cF90aW1pbmcoa2F1YWlfbWRtYV90aW1pbmdzLCBjeWNsZVRpbWUpOworCQlpZiAodHIgPT0gMCkKKwkJCXJldHVybiAxOworCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgflRSXzEwMF9QSU9SRUdfTURNQV9NQVNLKSB8IHRyOworCQkqdGltaW5nczIgPSAoKnRpbWluZ3MyKSAmIH5UUl8xMDBfVURNQVJFR19VRE1BX0VOOworCQl9CisJCWJyZWFrOworCWNhc2UgY29udHJvbGxlcl9rbF9hdGE0OgorCQkvKiA2Nk1oeiBjZWxsICovCisJCWFjY2Vzc1RpY2tzID0gU1lTQ0xLX1RJQ0tTXzY2KGFjY2Vzc1RpbWUpOworCQlhY2Nlc3NUaWNrcyA9IG1pbihhY2Nlc3NUaWNrcywgMHgxZlUpOworCQlhY2Nlc3NUaWNrcyA9IG1heChhY2Nlc3NUaWNrcywgMHgxVSk7CisJCXJlY1RpY2tzID0gU1lTQ0xLX1RJQ0tTXzY2KHJlY1RpbWUpOworCQlyZWNUaWNrcyA9IG1pbihyZWNUaWNrcywgMHgxZlUpOworCQlyZWNUaWNrcyA9IG1heChyZWNUaWNrcywgMHgzVSk7CisJCS8qIENsZWFyIG91dCBtZG1hIGJpdHMgYW5kIGRpc2FibGUgdWRtYSAqLworCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgfihUUl82Nl9NRE1BX01BU0sgfCBUUl82Nl9VRE1BX01BU0spKSB8CisJCQkoYWNjZXNzVGlja3MgPDwgVFJfNjZfTURNQV9BQ0NFU1NfU0hJRlQpIHwKKwkJCShyZWNUaWNrcyA8PCBUUl82Nl9NRE1BX1JFQ09WRVJZX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBjb250cm9sbGVyX2tsX2F0YTM6CisJCS8qIDMzTWh6IGNlbGwgb24gS2V5TGFyZ28gKi8KKwkJYWNjZXNzVGlja3MgPSBTWVNDTEtfVElDS1MoYWNjZXNzVGltZSk7CisJCWFjY2Vzc1RpY2tzID0gbWF4KGFjY2Vzc1RpY2tzLCAxVSk7CisJCWFjY2Vzc1RpY2tzID0gbWluKGFjY2Vzc1RpY2tzLCAweDFmVSk7CisJCWFjY2Vzc1RpbWUgPSBhY2Nlc3NUaWNrcyAqIElERV9TWVNDTEtfTlM7CisJCXJlY1RpY2tzID0gU1lTQ0xLX1RJQ0tTKHJlY1RpbWUpOworCQlyZWNUaWNrcyA9IG1heChyZWNUaWNrcywgMVUpOworCQlyZWNUaWNrcyA9IG1pbihyZWNUaWNrcywgMHgxZlUpOworCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgflRSXzMzX01ETUFfTUFTSykgfAorCQkJCShhY2Nlc3NUaWNrcyA8PCBUUl8zM19NRE1BX0FDQ0VTU19TSElGVCkgfAorCQkJCShyZWNUaWNrcyA8PCBUUl8zM19NRE1BX1JFQ09WRVJZX1NISUZUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogeworCQkvKiAzM01oeiBjZWxsIG9uIG90aGVycyAqLworCQlpbnQgaGFsZlRpY2sgPSAwOworCQlpbnQgb3JpZ0FjY2Vzc1RpbWUgPSBhY2Nlc3NUaW1lOworCQlpbnQgb3JpZ1JlY1RpbWUgPSByZWNUaW1lOworCQkKKwkJYWNjZXNzVGlja3MgPSBTWVNDTEtfVElDS1MoYWNjZXNzVGltZSk7CisJCWFjY2Vzc1RpY2tzID0gbWF4KGFjY2Vzc1RpY2tzLCAxVSk7CisJCWFjY2Vzc1RpY2tzID0gbWluKGFjY2Vzc1RpY2tzLCAweDFmVSk7CisJCWFjY2Vzc1RpbWUgPSBhY2Nlc3NUaWNrcyAqIElERV9TWVNDTEtfTlM7CisJCXJlY1RpY2tzID0gU1lTQ0xLX1RJQ0tTKHJlY1RpbWUpOworCQlyZWNUaWNrcyA9IG1heChyZWNUaWNrcywgMlUpIC0gMTsKKwkJcmVjVGlja3MgPSBtaW4ocmVjVGlja3MsIDB4MWZVKTsKKwkJcmVjVGltZSA9IChyZWNUaWNrcyArIDEpICogSURFX1NZU0NMS19OUzsKKwkJaWYgKChhY2Nlc3NUaWNrcyA+IDEpICYmCisJCSAgICAoKGFjY2Vzc1RpbWUgLSBJREVfU1lTQ0xLX05TLzIpID49IG9yaWdBY2Nlc3NUaW1lKSAmJgorCQkgICAgKChyZWNUaW1lIC0gSURFX1NZU0NMS19OUy8yKSA+PSBvcmlnUmVjVGltZSkpIHsKKyAgICAgICAgICAgIAkJaGFsZlRpY2sgPSAxOworCQkJYWNjZXNzVGlja3MtLTsKKwkJfQorCQkqdGltaW5ncyA9ICgoKnRpbWluZ3MpICYgflRSXzMzX01ETUFfTUFTSykgfAorCQkJCShhY2Nlc3NUaWNrcyA8PCBUUl8zM19NRE1BX0FDQ0VTU19TSElGVCkgfAorCQkJCShyZWNUaWNrcyA8PCBUUl8zM19NRE1BX1JFQ09WRVJZX1NISUZUKTsKKwkJaWYgKGhhbGZUaWNrKQorCQkJKnRpbWluZ3MgfD0gVFJfMzNfTURNQV9IQUxGVElDSzsKKwkJfQorCX0KKyNpZmRlZiBJREVfUE1BQ19ERUJVRworCXByaW50ayhLRVJOX0VSUiAiJXM6IFNldCBNRE1BIHRpbWluZyBmb3IgbW9kZSAlZCwgcmVnOiAweCUwOHhcbiIsCisJCWRyaXZlLT5uYW1lLCBzcGVlZCAmIDB4ZiwgICp0aW1pbmdzKTsKKyNlbmRpZgkKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1BNQUMgKi8KKworLyogCisgKiBTcGVlZHByb2MuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBjb3JlIHRvIHNldCBhbnkgb2YgdGhlIHN0YW5kYXJkCisgKiB0aW1pbmcgKFBJTywgTURNQSBvciBVRE1BKSB0byBib3RoIHRoZSBkcml2ZSBhbmQgdGhlIGNvbnRyb2xsZXIuCisgKiBZb3UgbWF5IG5vdGljZSB3ZSBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBvbiBub3JtYWwgImRtYSBjaGVjayIgb3BlcmF0aW9uLAorICogb3VyIGRlZGljYXRlZCBmdW5jdGlvbiBpcyBtb3JlIHByZWNpc2UgYXMgaXQgdXNlcyB0aGUgZHJpdmUgcHJvdmlkZWQKKyAqIGN5Y2xlIHRpbWUgdmFsdWUuIFdlIHNob3VsZCBwcm9iYWJseSBmaXggdGhpcyBvbmUgdG8gZGVhbCB3aXRoIHRoYXQgdG9vLi4uCisgKi8KK3N0YXRpYyBpbnQgX19wbWFjCitwbWFjX2lkZV90dW5lX2NoaXBzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBzcGVlZCkKK3sKKwlpbnQgdW5pdCA9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOworCWludCByZXQgPSAwOworCXBtYWNfaWRlX2h3aWZfdCogcG1pZiA9IChwbWFjX2lkZV9od2lmX3QgKilIV0lGKGRyaXZlKS0+aHdpZl9kYXRhOworCXUzMiAqdGltaW5ncywgKnRpbWluZ3MyOworCisJaWYgKHBtaWYgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJCQorCXRpbWluZ3MgPSAmcG1pZi0+dGltaW5nc1t1bml0XTsKKwl0aW1pbmdzMiA9ICZwbWlmLT50aW1pbmdzW3VuaXQrMl07CisJCisJc3dpdGNoKHNwZWVkKSB7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1BNQUMKKwkJY2FzZSBYRkVSX1VETUFfNjoKKwkJICAgICAgICBpZiAocG1pZi0+a2luZCAhPSBjb250cm9sbGVyX3NoX2F0YTYpCisJCQkJcmV0dXJuIDE7CisJCWNhc2UgWEZFUl9VRE1BXzU6CisJCQlpZiAocG1pZi0+a2luZCAhPSBjb250cm9sbGVyX3VuX2F0YTYgJiYKKwkJCSAgICBwbWlmLT5raW5kICE9IGNvbnRyb2xsZXJfazJfYXRhNiAmJgorCQkJICAgIHBtaWYtPmtpbmQgIT0gY29udHJvbGxlcl9zaF9hdGE2KQorCQkJCXJldHVybiAxOworCQljYXNlIFhGRVJfVURNQV80OgorCQljYXNlIFhGRVJfVURNQV8zOgorCQkJaWYgKEhXSUYoZHJpdmUpLT51ZG1hX2ZvdXIgPT0gMCkKKwkJCQlyZXR1cm4gMTsJCQorCQljYXNlIFhGRVJfVURNQV8yOgorCQljYXNlIFhGRVJfVURNQV8xOgorCQljYXNlIFhGRVJfVURNQV8wOgorCQkJaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0KQorCQkJCXJldCA9IHNldF90aW1pbmdzX3VkbWFfYXRhNCh0aW1pbmdzLCBzcGVlZCk7CisJCQllbHNlIGlmIChwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfdW5fYXRhNgorCQkJCSB8fCBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNikKKwkJCQlyZXQgPSBzZXRfdGltaW5nc191ZG1hX2F0YTYodGltaW5ncywgdGltaW5nczIsIHNwZWVkKTsKKwkJCWVsc2UgaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9zaF9hdGE2KQorCQkJCXJldCA9IHNldF90aW1pbmdzX3VkbWFfc2hhc3RhKHRpbWluZ3MsIHRpbWluZ3MyLCBzcGVlZCk7CisJCQllbHNlCisJCQkJcmV0ID0gMTsJCQorCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9NV19ETUFfMjoKKwkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQljYXNlIFhGRVJfTVdfRE1BXzA6CisJCQlyZXQgPSBzZXRfdGltaW5nc19tZG1hKGRyaXZlLCBwbWlmLT5raW5kLCB0aW1pbmdzLCB0aW1pbmdzMiwgc3BlZWQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgWEZFUl9TV19ETUFfMjoKKwkJY2FzZSBYRkVSX1NXX0RNQV8xOgorCQljYXNlIFhGRVJfU1dfRE1BXzA6CisJCQlyZXR1cm4gMTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfUE1BQyAqLworCQljYXNlIFhGRVJfUElPXzQ6CisJCWNhc2UgWEZFUl9QSU9fMzoKKwkJY2FzZSBYRkVSX1BJT18yOgorCQljYXNlIFhGRVJfUElPXzE6CisJCWNhc2UgWEZFUl9QSU9fMDoKKwkJCXBtYWNfaWRlX3R1bmVwcm9jKGRyaXZlLCBzcGVlZCAmIDB4MDcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAxOworCX0KKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcG1hY19pZGVfZG9fc2V0ZmVhdHVyZShkcml2ZSwgc3BlZWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJCQorCXBtYWNfaWRlX2RvX3VwZGF0ZV90aW1pbmdzKGRyaXZlKTsJCisJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBzcGVlZDsKKworCXJldHVybiAwOworfQorCisvKgorICogQmxhc3Qgc29tZSB3ZWxsIGtub3duICJzYWZlIiB2YWx1ZXMgdG8gdGhlIHRpbWluZyByZWdpc3RlcnMgYXQgaW5pdCBvcgorICogd2FrZXVwIGZyb20gc2xlZXAgdGltZSwgYmVmb3JlIHdlIGRvIHJlYWwgY2FsY3VsYXRpb24KKyAqLworc3RhdGljIHZvaWQgX19wbWFjCitzYW5pdGl6ZV90aW1pbmdzKHBtYWNfaWRlX2h3aWZfdCAqcG1pZikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWUsIHZhbHVlMiA9IDA7CisJCisJc3dpdGNoKHBtaWYtPmtpbmQpIHsKKwkJY2FzZSBjb250cm9sbGVyX3NoX2F0YTY6CisJCQl2YWx1ZSA9IDB4MGE4MjBjOTc7CisJCQl2YWx1ZTIgPSAweDAwMDMzMDMxOworCQkJYnJlYWs7CisJCWNhc2UgY29udHJvbGxlcl91bl9hdGE2OgorCQljYXNlIGNvbnRyb2xsZXJfazJfYXRhNjoKKwkJCXZhbHVlID0gMHgwODYxOGE5MjsKKwkJCXZhbHVlMiA9IDB4MDAwMDI5MjE7CisJCQlicmVhazsKKwkJY2FzZSBjb250cm9sbGVyX2tsX2F0YTQ6CisJCQl2YWx1ZSA9IDB4MDAwODQzOGM7CisJCQlicmVhazsKKwkJY2FzZSBjb250cm9sbGVyX2tsX2F0YTM6CisJCQl2YWx1ZSA9IDB4MDAwODQ1MjY7CisJCQlicmVhazsKKwkJY2FzZSBjb250cm9sbGVyX2hlYXRocm93OgorCQljYXNlIGNvbnRyb2xsZXJfb2hhcmU6CisJCWRlZmF1bHQ6CisJCQl2YWx1ZSA9IDB4MDAwNzQ1MjY7CisJCQlicmVhazsKKwl9CisJcG1pZi0+dGltaW5nc1swXSA9IHBtaWYtPnRpbWluZ3NbMV0gPSB2YWx1ZTsKKwlwbWlmLT50aW1pbmdzWzJdID0gcG1pZi0+dGltaW5nc1szXSA9IHZhbHVlMjsKK30KKwordW5zaWduZWQgbG9uZyBfX3BtYWMKK3BtYWNfaWRlX2dldF9iYXNlKGludCBpbmRleCkKK3sKKwlyZXR1cm4gcG1hY19pZGVbaW5kZXhdLnJlZ2Jhc2U7Cit9CisKK2ludCBfX3BtYWMKK3BtYWNfaWRlX2NoZWNrX2Jhc2UodW5zaWduZWQgbG9uZyBiYXNlKQoreworCWludCBpeDsKKwkKKyAJZm9yIChpeCA9IDA7IGl4IDwgTUFYX0hXSUZTOyArK2l4KQorCQlpZiAoYmFzZSA9PSBwbWFjX2lkZVtpeF0ucmVnYmFzZSkKKwkJCXJldHVybiBpeDsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBfX3BtYWMKK3BtYWNfaWRlX2dldF9pcnEodW5zaWduZWQgbG9uZyBiYXNlKQoreworCWludCBpeDsKKworCWZvciAoaXggPSAwOyBpeCA8IE1BWF9IV0lGUzsgKytpeCkKKwkJaWYgKGJhc2UgPT0gcG1hY19pZGVbaXhdLnJlZ2Jhc2UpCisJCQlyZXR1cm4gcG1hY19pZGVbaXhdLmlycTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVfbWFqb3JzW10gIF9fcG1hY2RhdGEgPSB7IDMsIDIyLCAzMywgMzQsIDU2LCA1NyB9OworCitkZXZfdCBfX2luaXQKK3BtYWNfZmluZF9pZGVfYm9vdChjaGFyICpib290ZGV2aWNlLCBpbnQgbikKK3sKKwlpbnQgaTsKKwkKKwkvKgorCSAqIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiBJREUgaW50ZXJmYWNlcyBmb3IgdGhpcyBvbmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IHBtYWNfaWRlX2NvdW50OyArK2kpIHsKKwkJY2hhciAqbmFtZTsKKwkJaWYgKCFwbWFjX2lkZVtpXS5ub2RlIHx8ICFwbWFjX2lkZVtpXS5ub2RlLT5mdWxsX25hbWUpCisJCQljb250aW51ZTsKKwkJbmFtZSA9IHBtYWNfaWRlW2ldLm5vZGUtPmZ1bGxfbmFtZTsKKwkJaWYgKG1lbWNtcChuYW1lLCBib290ZGV2aWNlLCBuKSA9PSAwICYmIG5hbWVbbl0gPT0gMCkgeworCQkJLyogWFhYIHNob3VsZCBjb3BlIHdpdGggdGhlIDJuZCBkcml2ZSBhcyB3ZWxsLi4uICovCisJCQlyZXR1cm4gTUtERVYoaWRlX21ham9yc1tpXSwgMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3VzcGVuZCBjYWxsIGJhY2ssIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGRldmljZXMKKyAqIGhhdmUgYWN0dWFsbHkgYmVlbiBzdXNwZW5kZWQKKyAqLworc3RhdGljIGludAorcG1hY19pZGVfZG9fc3VzcGVuZChpZGVfaHdpZl90ICpod2lmKQoreworCXBtYWNfaWRlX2h3aWZfdCAqcG1pZiA9IChwbWFjX2lkZV9od2lmX3QgKilod2lmLT5od2lmX2RhdGE7CisJCisJLyogV2UgY2xlYXIgdGhlIHRpbWluZ3MgKi8KKwlwbWlmLT50aW1pbmdzWzBdID0gMDsKKwlwbWlmLT50aW1pbmdzWzFdID0gMDsKKwkKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQ19CTElOSworCS8qIE5vdGU6IFRoaXMgY29kZSB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgaHdpZiwgdGh1cyB3ZSdsbAorCSAqIHRyeSBzZXZlcmFsIHRpbWUgdG8gc3RvcCB0aGUgTEVEIGJsaW5rZXIgdGltZXIsICBidXQgdGhhdAorCSAqIHNob3VsZCBiZSBoYXJtbGVzcworCSAqLworCWlmIChwbXVfaWRlX2JsaW5rX2VuYWJsZWQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgaGl0IHRoZSBQTVUgYmxpbmsgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9ibGlua19sb2NrLCBmbGFncyk7CisJCWlmIChwbXVfYmxpbmtfbGVkc3RhdGUpCisJCQlkZWxfdGltZXIoJnBtdV9ibGlua190aW1lcik7CisJCXBtdV9ibGlua19sZWRzdGF0ZSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9ibGlua19sb2NrLCBmbGFncyk7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERV9QTUFDX0JMSU5LICovCisKKwkvKiBUaGUgbWVkaWEgYmF5IHdpbGwgaGFuZGxlIGl0c2VsZiBqdXN0IGZpbmUgKi8KKwlpZiAocG1pZi0+bWVkaWFiYXkpCisJCXJldHVybiAwOworCQorCS8qIEthdWFpIGhhcyBidXMgY29udHJvbCBGQ1JzIGRpcmVjdGx5IGhlcmUgKi8KKwlpZiAocG1pZi0+a2F1YWlfZmNyKSB7CisJCXUzMiBmY3IgPSByZWFkbChwbWlmLT5rYXVhaV9mY3IpOworCQlmY3IgJj0gfihLQVVBSV9GQ1JfVUFUQV9SRVNFVF9OIHwgS0FVQUlfRkNSX1VBVEFfRU5BQkxFKTsKKwkJd3JpdGVsKGZjciwgcG1pZi0+a2F1YWlfZmNyKTsKKwl9CisKKwkvKiBEaXNhYmxlIHRoZSBidXMgb24gb2xkZXIgbWFjaGluZXMgYW5kIHRoZSBjZWxsIG9uIGthdWFpICovCisJcHBjX21kLmZlYXR1cmVfY2FsbChQTUFDX0ZUUl9JREVfRU5BQkxFLCBwbWlmLT5ub2RlLCBwbWlmLT5hYXBsX2J1c19pZCwKKwkJCSAgICAwKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXN1bWUgY2FsbCBiYWNrLCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2hpbGQgZGV2aWNlcworICogYXJlIHJlc3VtZWQKKyAqLworc3RhdGljIGludAorcG1hY19pZGVfZG9fcmVzdW1lKGlkZV9od2lmX3QgKmh3aWYpCit7CisJcG1hY19pZGVfaHdpZl90ICpwbWlmID0gKHBtYWNfaWRlX2h3aWZfdCAqKWh3aWYtPmh3aWZfZGF0YTsKKwkKKwkvKiBIYXJkIHJlc2V0ICYgcmUtZW5hYmxlIGNvbnRyb2xsZXIgKGRvIHdlIHJlYWxseSBuZWVkIHRvIHJlc2V0ID8gLUJlbkgpICovCisJaWYgKCFwbWlmLT5tZWRpYWJheSkgeworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9SRVNFVCwgcG1pZi0+bm9kZSwgcG1pZi0+YWFwbF9idXNfaWQsIDEpOworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsIHBtaWYtPm5vZGUsIHBtaWYtPmFhcGxfYnVzX2lkLCAxKTsKKwkJbXNsZWVwKDEwKTsKKwkJcHBjX21kLmZlYXR1cmVfY2FsbChQTUFDX0ZUUl9JREVfUkVTRVQsIHBtaWYtPm5vZGUsIHBtaWYtPmFhcGxfYnVzX2lkLCAwKTsKKwkJbXNsZWVwKGppZmZpZXNfdG9fbXNlY3MoSURFX1dBS0VVUF9ERUxBWSkpOworCisJCS8qIEthdWFpIGhhcyBpdCBkaWZmZXJlbnQgKi8KKwkJaWYgKHBtaWYtPmthdWFpX2ZjcikgeworCQkJdTMyIGZjciA9IHJlYWRsKHBtaWYtPmthdWFpX2Zjcik7CisJCQlmY3IgfD0gS0FVQUlfRkNSX1VBVEFfUkVTRVRfTiB8IEtBVUFJX0ZDUl9VQVRBX0VOQUJMRTsKKwkJCXdyaXRlbChmY3IsIHBtaWYtPmthdWFpX2Zjcik7CisJCX0KKwl9CisKKwkvKiBTYW5pdGl6ZSBkcml2ZSB0aW1pbmdzICovCisJc2FuaXRpemVfdGltaW5ncyhwbWlmKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0dXAsIHJlZ2lzdGVyICYgcHJvYmUgYW4gSURFIGNoYW5uZWwgZHJpdmVuIGJ5IHRoaXMgZHJpdmVyLCB0aGlzIGlzCisgKiBjYWxsZWQgYnkgb25lIG9mIHRoZSAyIHByb2JlIGZ1bmN0aW9ucyAobWFjaW8gb3IgUENJKS4gTm90ZSB0aGF0IGEgY2hhbm5lbAorICogdGhhdCBlbmRzIHVwIGJlZWluZyBmcmVlIG9mIGFueSBkZXZpY2UgaXMgbm90IGtlcHQgYXJvdW5kIGJ5IHRoaXMgZHJpdmVyCisgKiAoaXQgaXMga2VwdCBpbiAyLjQpLiBUaGlzIGludHJvZHVjZSBhbiBpbnRlcmZhY2UgbnVtYmVyaW5nIGNoYW5nZSBvbiBzb21lCisgKiByYXJlIG1hY2hpbmVzIHVuZm9ydHVuYXRlbHksIGJ1dCBpdCdzIGJldHRlciB0aGlzIHdheS4KKyAqLworc3RhdGljIGludAorcG1hY19pZGVfc2V0dXBfZGV2aWNlKHBtYWNfaWRlX2h3aWZfdCAqcG1pZiwgaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcG1pZi0+bm9kZTsKKwlpbnQgKmJpZHAsIGk7CisKKwlwbWlmLT5jYWJsZV84MCA9IDA7CisJcG1pZi0+YnJva2VuX2RtYSA9IHBtaWYtPmJyb2tlbl9kbWFfd2FybiA9IDA7CisJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAic2hhc3RhLWF0YSIpKQorCQlwbWlmLT5raW5kID0gY29udHJvbGxlcl9zaF9hdGE2OworCWVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAia2F1YWktYXRhIikpCisJCXBtaWYtPmtpbmQgPSBjb250cm9sbGVyX3VuX2F0YTY7CisJZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJLMi1VQVRBIikpCisJCXBtaWYtPmtpbmQgPSBjb250cm9sbGVyX2syX2F0YTY7CisJZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJrZXlsYXJnby1hdGEiKSkgeworCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiYXRhLTQiKSA9PSAwKQorCQkJcG1pZi0+a2luZCA9IGNvbnRyb2xsZXJfa2xfYXRhNDsKKwkJZWxzZQorCQkJcG1pZi0+a2luZCA9IGNvbnRyb2xsZXJfa2xfYXRhMzsKKwl9IGVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAiaGVhdGhyb3ctYXRhIikpCisJCXBtaWYtPmtpbmQgPSBjb250cm9sbGVyX2hlYXRocm93OworCWVsc2UgeworCQlwbWlmLT5raW5kID0gY29udHJvbGxlcl9vaGFyZTsKKwkJcG1pZi0+YnJva2VuX2RtYSA9IDE7CisJfQorCisJYmlkcCA9IChpbnQgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGJ1cy1pZCIsIE5VTEwpOworCXBtaWYtPmFhcGxfYnVzX2lkID0gIGJpZHAgPyAqYmlkcCA6IDA7CisKKwkvKiBHZXQgY2FibGUgdHlwZSBmcm9tIGRldmljZS10cmVlICovCisJaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0IHx8IHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl91bl9hdGE2CisJICAgIHx8IHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rMl9hdGE2CisJICAgIHx8IHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9zaF9hdGE2KSB7CisJCWNoYXIqIGNhYmxlID0gZ2V0X3Byb3BlcnR5KG5wLCAiY2FibGUtdHlwZSIsIE5VTEwpOworCQlpZiAoY2FibGUgJiYgIXN0cm5jbXAoY2FibGUsICI4MC0iLCAzKSkKKwkJCXBtaWYtPmNhYmxlXzgwID0gMTsKKwl9CisJLyogRzUncyBzZWVtIHRvIGhhdmUgaW5jb3JyZWN0IGNhYmxlIHR5cGUgaW4gZGV2aWNlLXRyZWUuIExldCdzIGFzc3VtZQorCSAqIHRoZXkgaGF2ZSBhIDgwIGNvbmR1Y3RvciBjYWJsZSwgdGhpcyBzZWVtIHRvIGJlIGFsd2F5cyB0aGUgY2FzZSB1bmxlc3MKKwkgKiB0aGUgdXNlciBtdWNrZWQgYXJvdW5kCisJICovCisJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAiSzItVUFUQSIpIHx8CisJICAgIGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAic2hhc3RhLWF0YSIpKQorCQlwbWlmLT5jYWJsZV84MCA9IDE7CisKKwkvKiBPbiBLYXVhaS10eXBlIGNvbnRyb2xsZXJzLCB3ZSBtYWtlIHN1cmUgdGhlIEZDUiBpcyBjb3JyZWN0ICovCisJaWYgKHBtaWYtPmthdWFpX2ZjcikKKwkJd3JpdGVsKEtBVUFJX0ZDUl9VQVRBX01BR0lDIHwKKwkJICAgICAgIEtBVUFJX0ZDUl9VQVRBX1JFU0VUX04gfAorCQkgICAgICAgS0FVQUlfRkNSX1VBVEFfRU5BQkxFLCBwbWlmLT5rYXVhaV9mY3IpOworCisJcG1pZi0+bWVkaWFiYXkgPSAwOworCQorCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNhbmUgdGltaW5ncyAqLworCXNhbml0aXplX3RpbWluZ3MocG1pZik7CisKKyNpZm5kZWYgQ09ORklHX1BQQzY0CisJLyogWFhYIEZJWE1FOiBNZWRpYSBiYXkgc3R1ZmYgbmVlZCByZS1vcmdhbml6aW5nICovCisJaWYgKG5wLT5wYXJlbnQgJiYgbnAtPnBhcmVudC0+bmFtZQorCSAgICAmJiBzdHJjYXNlY21wKG5wLT5wYXJlbnQtPm5hbWUsICJtZWRpYS1iYXkiKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKwkJbWVkaWFfYmF5X3NldF9pZGVfaW5mb3MobnAtPnBhcmVudCwgcG1pZi0+cmVnYmFzZSwgcG1pZi0+aXJxLCBod2lmLT5pbmRleCk7CisjZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKwkJcG1pZi0+bWVkaWFiYXkgPSAxOworCQlpZiAoIWJpZHApCisJCQlwbWlmLT5hYXBsX2J1c19pZCA9IDE7CisJfSBlbHNlIGlmIChwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfb2hhcmUpIHsKKwkJLyogVGhlIGNvZGUgYmVsb3cgaXMgaGF2aW5nIHRyb3VibGUgb24gc29tZSBvaGFyZSBtYWNoaW5lcworCQkgKiAodGltaW5nIHJlbGF0ZWQgPykuIFVudGlsIEkgY2FuIHB1dCBteSBoYW5kIG9uIG9uZSBvZiB0aGVzZQorCQkgKiB1bml0cywgSSBrZWVwIHRoZSBvbGQgd2F5CisJCSAqLworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsIG5wLCAwLCAxKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKyAJCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBJREUgd2hlbiBuZXQtYm9vdGluZyAqLworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9SRVNFVCwgbnAsIHBtaWYtPmFhcGxfYnVzX2lkLCAxKTsKKwkJcHBjX21kLmZlYXR1cmVfY2FsbChQTUFDX0ZUUl9JREVfRU5BQkxFLCBucCwgcG1pZi0+YWFwbF9idXNfaWQsIDEpOworCQltc2xlZXAoMTApOworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9SRVNFVCwgbnAsIHBtaWYtPmFhcGxfYnVzX2lkLCAwKTsKKwkJbXNsZWVwKGppZmZpZXNfdG9fbXNlY3MoSURFX1dBS0VVUF9ERUxBWSkpOworCX0KKworCS8qIFNldHVwIE1NSU8gb3BzICovCisJZGVmYXVsdF9od2lmX21taW9wcyhod2lmKTsKKyAgICAgICAJaHdpZi0+T1VUQlNZTkMgPSBwbWFjX291dGJzeW5jOworCisJLyogVGVsbCBjb21tb24gY29kZSBfbm90XyB0byBtZXNzIHdpdGggcmVzb3VyY2VzICovCisJaHdpZi0+bW1pbyA9IDI7CisJaHdpZi0+aHdpZl9kYXRhID0gcG1pZjsKKwlwbWFjX2lkZV9pbml0X2h3aWZfcG9ydHMoJmh3aWYtPmh3LCBwbWlmLT5yZWdiYXNlLCAwLCAmaHdpZi0+aXJxKTsKKwltZW1jcHkoaHdpZi0+aW9fcG9ydHMsIGh3aWYtPmh3LmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKKwlod2lmLT5jaGlwc2V0ID0gaWRlX3BtYWM7CisJaHdpZi0+bm9wcm9iZSA9ICFod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdIHx8IHBtaWYtPm1lZGlhYmF5OworCWh3aWYtPmhvbGQgPSBwbWlmLT5tZWRpYWJheTsKKwlod2lmLT51ZG1hX2ZvdXIgPSBwbWlmLT5jYWJsZV84MDsKKwlod2lmLT5kcml2ZXNbMF0udW5tYXNrID0gMTsKKwlod2lmLT5kcml2ZXNbMV0udW5tYXNrID0gMTsKKwlod2lmLT50dW5lcHJvYyA9IHBtYWNfaWRlX3R1bmVwcm9jOworCWlmIChwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfdW5fYXRhNgorCSAgICB8fCBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNgorCSAgICB8fCBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfc2hfYXRhNikKKwkJaHdpZi0+c2VsZWN0cHJvYyA9IHBtYWNfaWRlX2thdWFpX3NlbGVjdHByb2M7CisJZWxzZQorCQlod2lmLT5zZWxlY3Rwcm9jID0gcG1hY19pZGVfc2VsZWN0cHJvYzsKKwlod2lmLT5zcGVlZHByb2MgPSBwbWFjX2lkZV90dW5lX2NoaXBzZXQ7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQ19CTElOSworCXBtdV9pZGVfYmxpbmtfZW5hYmxlZCA9IHBtdV9oZF9ibGlua19pbml0KCk7CisKKwlpZiAocG11X2lkZV9ibGlua19lbmFibGVkKQorCQlod2lmLT5sZWRfYWN0ID0gcG11X2hkX2tpY2tfYmxpbms7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gImlkZSVkOiBGb3VuZCBBcHBsZSAlcyBjb250cm9sbGVyLCBidXMgSUQgJWQlcywgaXJxICVkXG4iLAorCSAgICAgICBod2lmLT5pbmRleCwgbW9kZWxfbmFtZVtwbWlmLT5raW5kXSwgcG1pZi0+YWFwbF9idXNfaWQsCisJICAgICAgIHBtaWYtPm1lZGlhYmF5ID8gIiAobWVkaWFiYXkpIiA6ICIiLCBod2lmLT5pcnEpOworCQkJCisjaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKwlpZiAocG1pZi0+bWVkaWFiYXkgJiYgY2hlY2tfbWVkaWFfYmF5X2J5X2Jhc2UocG1pZi0+cmVnYmFzZSwgTUJfQ0QpID09IDApCisJCWh3aWYtPm5vcHJvYmUgPSAwOworI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisKKwlod2lmLT5zZ19tYXhfbmVudHMgPSBNQVhfRENNRFM7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfUE1BQworCS8qIGhhcyBhIERCRE1BIGNvbnRyb2xsZXIgY2hhbm5lbCAqLworCWlmIChwbWlmLT5kbWFfcmVncykKKwkJcG1hY19pZGVfc2V0dXBfZG1hKHBtaWYsIGh3aWYpOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDICovCisKKwkvKiBXZSBwcm9iZSB0aGUgaHdpZiBub3cgKi8KKwlwcm9iZV9od2lmX2luaXQoaHdpZik7CisKKwkvKiBUaGUgY29kZSBJREUgY29kZSB3aWxsIGhhdmUgc2V0IGh3aWYtPnByZXNlbnQgaWYgd2UgaGF2ZSBkZXZpY2VzIGF0dGFjaGVkLAorCSAqIGlmIHdlIGRvbid0LCB0aGUgZGlzY2FyZCB0aGUgaW50ZXJmYWNlIGV4Y2VwdCBpZiB3ZSBhcmUgb24gYSBtZWRpYSBiYXkgc2xvdAorCSAqLworCWlmICghaHdpZi0+cHJlc2VudCAmJiAhcG1pZi0+bWVkaWFiYXkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlJWQ6IEJ1cyBlbXB0eSwgaW50ZXJmYWNlIHJlbGVhc2VkLlxuIiwKKwkJCWh3aWYtPmluZGV4KTsKKwkJZGVmYXVsdF9od2lmX2lvcHMoaHdpZik7CisJCWZvciAoaSA9IElERV9EQVRBX09GRlNFVDsgaSA8PSBJREVfQ09OVFJPTF9PRkZTRVQ7ICsraSkKKwkJCWh3aWYtPmlvX3BvcnRzW2ldID0gMDsKKwkJaHdpZi0+Y2hpcHNldCA9IGlkZV91bmtub3duOworCQlod2lmLT5ub3Byb2JlID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBdHRhY2ggdG8gYSBtYWNpbyBwcm9iZWQgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitwbWFjX2lkZV9tYWNpb19hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgbG9uZyByZWdiYXNlOworCWludCBpcnE7CisJaWRlX2h3aWZfdCAqaHdpZjsKKwlwbWFjX2lkZV9od2lmX3QgKnBtaWY7CisJaW50IGksIHJjOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCBNQVhfSFdJRlMgJiYgKGlkZV9od2lmc1tpXS5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdICE9IDAKKwkgICAgfHwgcG1hY19pZGVbaV0ubm9kZSAhPSBOVUxMKSkKKwkJKytpOworCWlmIChpID49IE1BWF9IV0lGUykgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1wbWFjOiBNYWNJTyBpbnRlcmZhY2UgYXR0YWNoIHdpdGggbm8gc2xvdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICVzXG4iLCBtZGV2LT5vZmRldi5ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwbWlmID0gJnBtYWNfaWRlW2ldOworCWh3aWYgPSAmaWRlX2h3aWZzW2ldOworCisJaWYgKG1kZXYtPm9mZGV2Lm5vZGUtPm5fYWRkcnMgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUlZDogbm8gYWRkcmVzcyBmb3IgJXNcbiIsCisJCSAgICAgICBpLCBtZGV2LT5vZmRldi5ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFJlcXVlc3QgbWVtb3J5IHJlc291cmNlIGZvciBJTyBwb3J0cyAqLworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlKG1kZXYsIDAsICJpZGUtcG1hYyAocG9ydHMpIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUlZDogY2FuJ3QgcmVxdWVzdCBtbWlvIHJlc291cmNlICFcbiIsIGkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkJCQorCS8qIFhYWCBUaGlzIGlzIGJvZ3VzLiBTaG91bGQgYmUgZml4ZWQgaW4gdGhlIHJlZ2lzdHJ5IGJ5IGNoZWNraW5nCisJICogdGhlIGtpbmQgb2YgaG9zdCBpbnRlcnJ1cHQgY29udHJvbGxlciwgYSBiaXQgbGlrZSBnYXR3aWNrCisJICogZml4ZXMgaW4gaXJxLmMuIFRoYXQgd29ya3Mgd2VsbCBlbm91Z2ggZm9yIHRoZSBzaW5nbGUgY2FzZQorCSAqIHdoZXJlIHRoYXQgaGFwcGVucyB0aG91Z2guLi4KKwkgKi8KKwlpZiAobWFjaW9faXJxX2NvdW50KG1kZXYpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlJWQ6IG5vIGludHJzIGZvciBkZXZpY2UgJXMsIHVzaW5nIDEzXG4iLAorCQkJaSwgbWRldi0+b2ZkZXYubm9kZS0+ZnVsbF9uYW1lKTsKKwkJaXJxID0gMTM7CisJfSBlbHNlCisJCWlycSA9IG1hY2lvX2lycShtZGV2LCAwKTsKKworCWJhc2UgPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApLCAweDQwMCk7CisJcmVnYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBiYXNlOworCisJaHdpZi0+cGNpX2RldiA9IG1kZXYtPmJ1cy0+cGRldjsKKwlod2lmLT5nZW5kZXYucGFyZW50ID0gJm1kZXYtPm9mZGV2LmRldjsKKworCXBtaWYtPm1kZXYgPSBtZGV2OworCXBtaWYtPm5vZGUgPSBtZGV2LT5vZmRldi5ub2RlOworCXBtaWYtPnJlZ2Jhc2UgPSByZWdiYXNlOworCXBtaWYtPmlycSA9IGlycTsKKwlwbWlmLT5rYXVhaV9mY3IgPSBOVUxMOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDCisJaWYgKG1hY2lvX3Jlc291cmNlX2NvdW50KG1kZXYpID49IDIpIHsKKwkJaWYgKG1hY2lvX3JlcXVlc3RfcmVzb3VyY2UobWRldiwgMSwgImlkZS1wbWFjIChkbWEpIikpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUlZDogY2FuJ3QgcmVxdWVzdCBETUEgcmVzb3VyY2UgIVxuIiwgaSk7CisJCWVsc2UKKwkJCXBtaWYtPmRtYV9yZWdzID0gaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgMHgxMDAwKTsKKwl9IGVsc2UKKwkJcG1pZi0+ZG1hX3JlZ3MgPSBOVUxMOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDICovCisJZGV2X3NldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYsIGh3aWYpOworCisJcmMgPSBwbWFjX2lkZV9zZXR1cF9kZXZpY2UocG1pZiwgaHdpZik7CisJaWYgKHJjICE9IDApIHsKKwkJLyogVGhlIGludGVmYWNlIGlzIHJlbGVhc2VkIHRvIHRoZSBjb21tb24gSURFIGxheWVyICovCisJCWRldl9zZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2LCBOVUxMKTsKKwkJaW91bm1hcChiYXNlKTsKKwkJaWYgKHBtaWYtPmRtYV9yZWdzKQorCQkJaW91bm1hcChwbWlmLT5kbWFfcmVncyk7CisJCW1lbXNldChwbWlmLCAwLCBzaXplb2YoKnBtaWYpKTsKKwkJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShtZGV2LCAwKTsKKwkJaWYgKHBtaWYtPmRtYV9yZWdzKQorCQkJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShtZGV2LCAxKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3BtYWNfaWRlX21hY2lvX3N1c3BlbmQoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgdTMyIHN0YXRlKQoreworCWlkZV9od2lmX3QJKmh3aWYgPSAoaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKwlpbnQJCXJjID0gMDsKKworCWlmIChzdGF0ZSAhPSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgJiYgc3RhdGUgPj0gMikgeworCQlyYyA9IHBtYWNfaWRlX2RvX3N1c3BlbmQoaHdpZik7CisJCWlmIChyYyA9PSAwKQorCQkJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitwbWFjX2lkZV9tYWNpb19yZXN1bWUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJaW50CQlyYyA9IDA7CisJCisJaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSAhPSAwKSB7CisJCXJjID0gcG1hY19pZGVfZG9fcmVzdW1lKGh3aWYpOworCQlpZiAocmMgPT0gMCkKKwkJCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKgorICogQXR0YWNoIHRvIGEgUENJIHByb2JlZCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK3BtYWNfaWRlX3BjaV9hdHRhY2goc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJcG1hY19pZGVfaHdpZl90ICpwbWlmOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIHJiYXNlLCBybGVuOworCWludCBpLCByYzsKKworCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCWlmIChucCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXBtYWM6IGNhbm5vdCBmaW5kIE1hY0lPIG5vZGUgZm9yIEthdWFpIEFUQSBpbnRlcmZhY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaSA9IDA7CisJd2hpbGUgKGkgPCBNQVhfSFdJRlMgJiYgKGlkZV9od2lmc1tpXS5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdICE9IDAKKwkgICAgfHwgcG1hY19pZGVbaV0ubm9kZSAhPSBOVUxMKSkKKwkJKytpOworCWlmIChpID49IE1BWF9IV0lGUykgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1wbWFjOiBQQ0kgaW50ZXJmYWNlIGF0dGFjaCB3aXRoIG5vIHNsb3RcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBtaWYgPSAmcG1hY19pZGVbaV07CisJaHdpZiA9ICZpZGVfaHdpZnNbaV07CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlJWk6IENhbid0IGVuYWJsZSBQQ0kgZGV2aWNlIGZvciAlc1xuIiwKKwkJCWksIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJCQorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJLYXVhaSBBVEEiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZSVkOiBDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMgZm9yICVzXG4iLAorCQkJaSwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaHdpZi0+cGNpX2RldiA9IHBkZXY7CisJaHdpZi0+Z2VuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJcG1pZi0+bWRldiA9IE5VTEw7CisJcG1pZi0+bm9kZSA9IG5wOworCisJcmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJcmxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwliYXNlID0gaW9yZW1hcChyYmFzZSwgcmxlbik7CisJcG1pZi0+cmVnYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBiYXNlICsgMHgyMDAwOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDCisJcG1pZi0+ZG1hX3JlZ3MgPSBiYXNlICsgMHgxMDAwOworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDICovCisJcG1pZi0+a2F1YWlfZmNyID0gYmFzZTsKKwlwbWlmLT5pcnEgPSBwZGV2LT5pcnE7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaHdpZik7CisKKwlyYyA9IHBtYWNfaWRlX3NldHVwX2RldmljZShwbWlmLCBod2lmKTsKKwlpZiAocmMgIT0gMCkgeworCQkvKiBUaGUgaW50ZWZhY2UgaXMgcmVsZWFzZWQgdG8gdGhlIGNvbW1vbiBJREUgbGF5ZXIgKi8KKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCQlpb3VubWFwKGJhc2UpOworCQltZW1zZXQocG1pZiwgMCwgc2l6ZW9mKCpwbWlmKSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitwbWFjX2lkZV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCWlkZV9od2lmX3QJKmh3aWYgPSAoaWRlX2h3aWZfdCAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQJCXJjID0gMDsKKwkKKwlpZiAoc3RhdGUgIT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlICYmIHN0YXRlID49IDIpIHsKKwkJcmMgPSBwbWFjX2lkZV9kb19zdXNwZW5kKGh3aWYpOworCQlpZiAocmMgPT0gMCkKKwkJCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorcG1hY19pZGVfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50CQlyYyA9IDA7CisJCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSAhPSAwKSB7CisJCXJjID0gcG1hY19pZGVfZG9fcmVzdW1lKGh3aWYpOworCQlpZiAocmMgPT0gMCkKKwkJCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IG9mX21hdGNoIHBtYWNfaWRlX21hY2lvX21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJJREUiLAorCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKKwkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAorCX0sCisJeworCS5uYW1lIAkJPSAiQVRBIiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKKwl9LAorCXsKKwkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAorCS50eXBlCQk9ICJpZGUiLAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICisJfSwKKwl7CisJLm5hbWUgCQk9IE9GX0FOWV9NQVRDSCwKKwkudHlwZQkJPSAiYXRhIiwKKwkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBwbWFjX2lkZV9tYWNpb19kcml2ZXIgPSAKK3sKKwkubmFtZSAJCT0gImlkZS1wbWFjIiwKKwkubWF0Y2hfdGFibGUJPSBwbWFjX2lkZV9tYWNpb19tYXRjaCwKKwkucHJvYmUJCT0gcG1hY19pZGVfbWFjaW9fYXR0YWNoLAorCS5zdXNwZW5kCT0gcG1hY19pZGVfbWFjaW9fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBtYWNfaWRlX21hY2lvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwbWFjX2lkZV9wY2lfbWF0Y2hbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJRUNfSURfQVBQTEVfVU5JX05fQVRBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfSVBJRF9BVEExMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9LMl9BVEExMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9TSF9BVEEsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwbWFjX2lkZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJpZGUtcG1hYyIsCisJLmlkX3RhYmxlCT0gcG1hY19pZGVfcGNpX21hdGNoLAorCS5wcm9iZQkJPSBwbWFjX2lkZV9wY2lfYXR0YWNoLAorCS5zdXNwZW5kCT0gcG1hY19pZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwbWFjX2lkZV9wY2lfcmVzdW1lLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbWFjX2lkZV9wY2lfbWF0Y2gpOworCit2b2lkIF9faW5pdAorcG1hY19pZGVfcHJvYmUodm9pZCkKK3sKKwlpZiAoX21hY2hpbmUgIT0gX01BQ0hfUG1hYykKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1BNQUNfQVRBMTAwRklSU1QKKwlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwbWFjX2lkZV9wY2lfZHJpdmVyKTsKKwltYWNpb19yZWdpc3Rlcl9kcml2ZXIoJnBtYWNfaWRlX21hY2lvX2RyaXZlcik7CisjZWxzZQorCW1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmcG1hY19pZGVfbWFjaW9fZHJpdmVyKTsKKwlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwbWFjX2lkZV9wY2lfZHJpdmVyKTsKKyNlbmRpZgkKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDCisKKy8qCisgKiBwbWFjX2lkZV9idWlsZF9kbWF0YWJsZSBidWlsZHMgdGhlIERCRE1BIGNvbW1hbmQgbGlzdAorICogZm9yIGEgdHJhbnNmZXIgYW5kIHNldHMgdGhlIERCRE1BIGNoYW5uZWwgdG8gcG9pbnQgdG8gaXQuCisgKi8KK3N0YXRpYyBpbnQgX19wbWFjCitwbWFjX2lkZV9idWlsZF9kbWF0YWJsZShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgZGJkbWFfY21kICp0YWJsZTsKKwlpbnQgaSwgY291bnQgPSAwOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopaHdpZi0+aHdpZl9kYXRhOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYSA9IHBtaWYtPmRtYV9yZWdzOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IHdyID0gKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSk7CisKKwkvKiBETUEgdGFibGUgaXMgYWxyZWFkeSBhbGlnbmVkICovCisJdGFibGUgPSAoc3RydWN0IGRiZG1hX2NtZCAqKSBwbWlmLT5kbWFfdGFibGVfY3B1OworCisJLyogTWFrZSBzdXJlIERNQSBjb250cm9sbGVyIGlzIHN0b3BwZWQgKG5lY2Vzc2FyeSA/KSAqLworCXdyaXRlbCgoUlVOfFBBVVNFfEZMVVNIfFdBS0V8REVBRCkgPDwgMTYsICZkbWEtPmNvbnRyb2wpOworCXdoaWxlIChyZWFkbCgmZG1hLT5zdGF0dXMpICYgUlVOKQorCQl1ZGVsYXkoMSk7CisKKwlod2lmLT5zZ19uZW50cyA9IGkgPSBpZGVfYnVpbGRfc2dsaXN0KGRyaXZlLCBycSk7CisKKwlpZiAoIWkpCisJCXJldHVybiAwOworCisJLyogQnVpbGQgREJETUEgY29tbWFuZHMgbGlzdCAqLworCXNnID0gaHdpZi0+c2dfdGFibGU7CisJd2hpbGUgKGkgJiYgc2dfZG1hX2xlbihzZykpIHsKKwkJdTMyIGN1cl9hZGRyOworCQl1MzIgY3VyX2xlbjsKKworCQljdXJfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJY3VyX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCWlmIChwbWlmLT5icm9rZW5fZG1hICYmIGN1cl9hZGRyICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpIHsKKwkJCWlmIChwbWlmLT5icm9rZW5fZG1hX3dhcm4gPT0gMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgb24gbm9uIGFsaWduZWQgYWRkcmVzcywiCisJCQkJICAgICAgICJzd2l0Y2hpbmcgdG8gUElPIG9uIE9oYXJlIGNoaXBzZXRcbiIsIGRyaXZlLT5uYW1lKTsKKwkJCQlwbWlmLT5icm9rZW5fZG1hX3dhcm4gPSAxOworCQkJfQorCQkJZ290byB1c2VfcGlvX2luc3RlYWQ7CisJCX0KKwkJd2hpbGUgKGN1cl9sZW4pIHsKKwkJCXVuc2lnbmVkIGludCB0YyA9IChjdXJfbGVuIDwgMHhmZTAwKT8gY3VyX2xlbjogMHhmZTAwOworCisJCQlpZiAoY291bnQrKyA+PSBNQVhfRENNRFMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRE1BIHRhYmxlIHRvbyBzbWFsbFxuIiwKKwkJCQkgICAgICAgZHJpdmUtPm5hbWUpOworCQkJCWdvdG8gdXNlX3Bpb19pbnN0ZWFkOworCQkJfQorCQkJc3RfbGUxNigmdGFibGUtPmNvbW1hbmQsIHdyPyBPVVRQVVRfTU9SRTogSU5QVVRfTU9SRSk7CisJCQlzdF9sZTE2KCZ0YWJsZS0+cmVxX2NvdW50LCB0Yyk7CisJCQlzdF9sZTMyKCZ0YWJsZS0+cGh5X2FkZHIsIGN1cl9hZGRyKTsKKwkJCXRhYmxlLT5jbWRfZGVwID0gMDsKKwkJCXRhYmxlLT54ZmVyX3N0YXR1cyA9IDA7CisJCQl0YWJsZS0+cmVzX2NvdW50ID0gMDsKKwkJCWN1cl9hZGRyICs9IHRjOworCQkJY3VyX2xlbiAtPSB0YzsKKwkJCSsrdGFibGU7CisJCX0KKwkJc2crKzsKKwkJaS0tOworCX0KKworCS8qIGNvbnZlcnQgdGhlIGxhc3QgY29tbWFuZCB0byBhbiBpbnB1dC9vdXRwdXQgbGFzdCBjb21tYW5kICovCisJaWYgKGNvdW50KSB7CisJCXN0X2xlMTYoJnRhYmxlWy0xXS5jb21tYW5kLCB3cj8gT1VUUFVUX0xBU1Q6IElOUFVUX0xBU1QpOworCQkvKiBhZGQgdGhlIHN0b3AgY29tbWFuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJCW1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwkJc3RfbGUxNigmdGFibGUtPmNvbW1hbmQsIERCRE1BX1NUT1ApOworCQltYigpOworCQl3cml0ZWwoaHdpZi0+ZG1hdGFibGVfZG1hLCAmZG1hLT5jbWRwdHIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVtcHR5IERNQSB0YWJsZT9cbiIsIGRyaXZlLT5uYW1lKTsKKyB1c2VfcGlvX2luc3RlYWQ6CisJcGNpX3VubWFwX3NnKGh3aWYtPnBjaV9kZXYsCisJCSAgICAgaHdpZi0+c2dfdGFibGUsCisJCSAgICAgaHdpZi0+c2dfbmVudHMsCisJCSAgICAgaHdpZi0+c2dfZG1hX2RpcmVjdGlvbik7CisJcmV0dXJuIDA7IC8qIHJldmVydCB0byBQSU8gZm9yIHRoaXMgcmVxdWVzdCAqLworfQorCisvKiBUZWFyZG93biBtYXBwaW5ncyBhZnRlciBETUEgaGFzIGNvbXBsZXRlZC4gICovCitzdGF0aWMgdm9pZCBfX3BtYWMKK3BtYWNfaWRlX2Rlc3Ryb3lfZG1hdGFibGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBod2lmLT5zZ190YWJsZTsKKwlpbnQgbmVudHMgPSBod2lmLT5zZ19uZW50czsKKworCWlmIChuZW50cykgeworCQlwY2lfdW5tYXBfc2coZGV2LCBzZywgbmVudHMsIGh3aWYtPnNnX2RtYV9kaXJlY3Rpb24pOworCQlod2lmLT5zZ19uZW50cyA9IDA7CisJfQorfQorCisvKgorICogUGljayB1cCBiZXN0IE1ETUEgdGltaW5nIGZvciB0aGUgZHJpdmUgYW5kIGFwcGx5IGl0CisgKi8KK3N0YXRpYyBpbnQgX19wbWFjCitwbWFjX2lkZV9tZG1hX2VuYWJsZShpZGVfZHJpdmVfdCAqZHJpdmUsIHUxNiBtb2RlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopaHdpZi0+aHdpZl9kYXRhOworCWludCBkcml2ZV9jeWNsZV90aW1lOworCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwl1MzIgKnRpbWluZ3MsICp0aW1pbmdzMjsKKwl1MzIgdGltaW5nX2xvY2FsWzJdOworCWludCByZXQ7CisKKwkvKiB3aGljaCBkcml2ZSBpcyBpdCA/ICovCisJdGltaW5ncyA9ICZwbWlmLT50aW1pbmdzW2RyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMV07CisJdGltaW5nczIgPSAmcG1pZi0+dGltaW5nc1soZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxKSArIDJdOworCisJLyogQ2hlY2sgaWYgZHJpdmUgcHJvdmlkZSBleHBsaWNpdCBjeWNsZSB0aW1lICovCisJaWYgKChpZC0+ZmllbGRfdmFsaWQgJiAyKSAmJiAoaWQtPmVpZGVfZG1hX3RpbWUpKQorCQlkcml2ZV9jeWNsZV90aW1lID0gaWQtPmVpZGVfZG1hX3RpbWU7CisJZWxzZQorCQlkcml2ZV9jeWNsZV90aW1lID0gMDsKKworCS8qIENvcHkgdGltaW5ncyB0byBsb2NhbCBpbWFnZSAqLworCXRpbWluZ19sb2NhbFswXSA9ICp0aW1pbmdzOworCXRpbWluZ19sb2NhbFsxXSA9ICp0aW1pbmdzMjsKKworCS8qIENhbGN1bGF0ZSBjb250cm9sbGVyIHRpbWluZ3MgKi8KKwlyZXQgPSBzZXRfdGltaW5nc19tZG1hKAlkcml2ZSwgcG1pZi0+a2luZCwKKwkJCQkmdGltaW5nX2xvY2FsWzBdLAorCQkJCSZ0aW1pbmdfbG9jYWxbMV0sCisJCQkJbW9kZSwKKwkJCQlkcml2ZV9jeWNsZV90aW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCS8qIFNldCBmZWF0dXJlIG9uIGRyaXZlICovCisgICAgCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBNdWx0aVdvcmQgRE1BICVkXG4iLCBkcml2ZS0+bmFtZSwgbW9kZSAmIDB4Zik7CisJcmV0ID0gcG1hY19pZGVfZG9fc2V0ZmVhdHVyZShkcml2ZSwgbW9kZSk7CisJaWYgKHJldCkgeworCSAgICAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhaWxlZCAhXG4iLCBkcml2ZS0+bmFtZSk7CisJICAgIAlyZXR1cm4gMDsKKwl9CisKKwkvKiBBcHBseSB0aW1pbmdzIHRvIGNvbnRyb2xsZXIgKi8KKwkqdGltaW5ncyA9IHRpbWluZ19sb2NhbFswXTsKKwkqdGltaW5nczIgPSB0aW1pbmdfbG9jYWxbMV07CisJCisJLyogU2V0IHNwZWVkIGluZm8gaW4gZHJpdmUgKi8KKwlkcml2ZS0+Y3VycmVudF9zcGVlZCA9IG1vZGU7CQorCWlmICghZHJpdmUtPmluaXRfc3BlZWQpCisJCWRyaXZlLT5pbml0X3NwZWVkID0gbW9kZTsKKworCXJldHVybiAxOworfQorCisvKgorICogUGljayB1cCBiZXN0IFVETUEgdGltaW5nIGZvciB0aGUgZHJpdmUgYW5kIGFwcGx5IGl0CisgKi8KK3N0YXRpYyBpbnQgX19wbWFjCitwbWFjX2lkZV91ZG1hX2VuYWJsZShpZGVfZHJpdmVfdCAqZHJpdmUsIHUxNiBtb2RlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopaHdpZi0+aHdpZl9kYXRhOworCXUzMiAqdGltaW5ncywgKnRpbWluZ3MyOworCXUzMiB0aW1pbmdfbG9jYWxbMl07CisJaW50IHJldDsKKwkJCisJLyogd2hpY2ggZHJpdmUgaXMgaXQgPyAqLworCXRpbWluZ3MgPSAmcG1pZi0+dGltaW5nc1tkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDFdOworCXRpbWluZ3MyID0gJnBtaWYtPnRpbWluZ3NbKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSkgKyAyXTsKKworCS8qIENvcHkgdGltaW5ncyB0byBsb2NhbCBpbWFnZSAqLworCXRpbWluZ19sb2NhbFswXSA9ICp0aW1pbmdzOworCXRpbWluZ19sb2NhbFsxXSA9ICp0aW1pbmdzMjsKKwkKKwkvKiBDYWxjdWxhdGUgdGltaW5ncyBmb3IgaW50ZXJmYWNlICovCisJaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl91bl9hdGE2CisJICAgIHx8IHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rMl9hdGE2KQorCQlyZXQgPSBzZXRfdGltaW5nc191ZG1hX2F0YTYoCSZ0aW1pbmdfbG9jYWxbMF0sCisJCQkJCQkmdGltaW5nX2xvY2FsWzFdLAorCQkJCQkJbW9kZSk7CisJZWxzZSBpZiAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX3NoX2F0YTYpCisJCXJldCA9IHNldF90aW1pbmdzX3VkbWFfc2hhc3RhKAkmdGltaW5nX2xvY2FsWzBdLAorCQkJCQkJJnRpbWluZ19sb2NhbFsxXSwKKwkJCQkJCW1vZGUpOworCWVsc2UKKwkJcmV0ID0gc2V0X3RpbWluZ3NfdWRtYV9hdGE0KCZ0aW1pbmdfbG9jYWxbMF0sIG1vZGUpOworCWlmIChyZXQpCisJCXJldHVybiAwOworCQkKKwkvKiBTZXQgZmVhdHVyZSBvbiBkcml2ZSAqLworICAgIAlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgVWx0cmEgRE1BICVkXG4iLCBkcml2ZS0+bmFtZSwgbW9kZSAmIDB4MGYpOworCXJldCA9IHBtYWNfaWRlX2RvX3NldGZlYXR1cmUoZHJpdmUsIG1vZGUpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhaWxlZCAhXG4iLCBkcml2ZS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEFwcGx5IHRpbWluZ3MgdG8gY29udHJvbGxlciAqLworCSp0aW1pbmdzID0gdGltaW5nX2xvY2FsWzBdOworCSp0aW1pbmdzMiA9IHRpbWluZ19sb2NhbFsxXTsKKworCS8qIFNldCBzcGVlZCBpbmZvIGluIGRyaXZlICovCisJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBtb2RlOwkKKwlpZiAoIWRyaXZlLT5pbml0X3NwZWVkKQorCQlkcml2ZS0+aW5pdF9zcGVlZCA9IG1vZGU7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrIHdoYXQgaXMgdGhlIGJlc3QgRE1BIHRpbWluZyBzZXR0aW5nIGZvciB0aGUgZHJpdmUgYW5kCisgKiBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucyB0byBhcHBseSBpdC4KKyAqLworc3RhdGljIGludCBfX3BtYWMKK3BtYWNfaWRlX2RtYV9jaGVjayhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopaHdpZi0+aHdpZl9kYXRhOworCWludCBlbmFibGUgPSAxOworCWludCBtYXA7CisJZHJpdmUtPnVzaW5nX2RtYSA9IDA7CisJCisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5KQorCQllbmFibGUgPSAwOworCWlmICgoKGlkLT5jYXBhYmlsaXR5ICYgMSkgPT0gMCkgJiYgIV9faWRlX2RtYV9nb29kX2RyaXZlKGRyaXZlKSkKKwkJZW5hYmxlID0gMDsKKwlpZiAoX19pZGVfZG1hX2JhZF9kcml2ZShkcml2ZSkpCisJCWVuYWJsZSA9IDA7CisKKwlpZiAoZW5hYmxlKSB7CisJCXNob3J0IG1vZGU7CisJCQorCQltYXAgPSBYRkVSX01XRE1BOworCQlpZiAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQKKwkJICAgIHx8IHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl91bl9hdGE2CisJCSAgICB8fCBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNgorCQkgICAgfHwgcG1pZi0+a2luZCA9PSBjb250cm9sbGVyX3NoX2F0YTYpIHsKKwkJCW1hcCB8PSBYRkVSX1VETUE7CisJCQlpZiAocG1pZi0+Y2FibGVfODApIHsKKwkJCQltYXAgfD0gWEZFUl9VRE1BXzY2OworCQkJCWlmIChwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfdW5fYXRhNiB8fAorCQkJCSAgICBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNiB8fAorCQkJCSAgICBwbWlmLT5raW5kID09IGNvbnRyb2xsZXJfc2hfYXRhNikKKwkJCQkJbWFwIHw9IFhGRVJfVURNQV8xMDA7CisJCQkJaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9zaF9hdGE2KQorCQkJCQltYXAgfD0gWEZFUl9VRE1BXzEzMzsKKwkJCX0KKwkJfQorCQltb2RlID0gaWRlX2ZpbmRfYmVzdF9tb2RlKGRyaXZlLCBtYXApOworCQlpZiAobW9kZSAmIFhGRVJfVURNQSkKKwkJCWRyaXZlLT51c2luZ19kbWEgPSBwbWFjX2lkZV91ZG1hX2VuYWJsZShkcml2ZSwgbW9kZSk7CisJCWVsc2UgaWYgKG1vZGUgJiBYRkVSX01XRE1BKQorCQkJZHJpdmUtPnVzaW5nX2RtYSA9IHBtYWNfaWRlX21kbWFfZW5hYmxlKGRyaXZlLCBtb2RlKTsKKwkJaHdpZi0+T1VUQigwLCBJREVfQ09OVFJPTF9SRUcpOworCQkvKiBBcHBseSBzZXR0aW5ncyB0byBjb250cm9sbGVyICovCisJCXBtYWNfaWRlX2RvX3VwZGF0ZV90aW1pbmdzKGRyaXZlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcmVwYXJlIGEgRE1BIHRyYW5zZmVyLiBXZSBidWlsZCB0aGUgRE1BIHRhYmxlLCBhZGp1c3QgdGhlIHRpbWluZ3MgZm9yCisgKiBhIHJlYWQgb24gS2V5TGFyZ28gQVRBLzY2IGFuZCBtYXJrIHVzIGFzIHdhaXRpbmcgZm9yIERNQSBjb21wbGV0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19wbWFjCitwbWFjX2lkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopaHdpZi0+aHdpZl9kYXRhOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl1OCB1bml0ID0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggYXRhNDsKKworCWlmIChwbWlmID09IE5VTEwpCisJCXJldHVybiAxOworCWF0YTQgPSAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQpOwkKKworCWlmICghcG1hY19pZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUsIHJxKSkgeworCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisJCXJldHVybiAxOworCX0KKworCS8qIEFwcGxlIGFkZHMgNjBucyB0byB3ckRhdGFTZXR1cCBvbiByZWFkcyAqLworCWlmIChhdGE0ICYmIChwbWlmLT50aW1pbmdzW3VuaXRdICYgVFJfNjZfVURNQV9FTikpIHsKKwkJd3JpdGVsKHBtaWYtPnRpbWluZ3NbdW5pdF0gKyAoIXJxX2RhdGFfZGlyKHJxKSA/IDB4MDA4MDAwMDBVTCA6IDApLAorCQkJUE1BQ19JREVfUkVHKElERV9USU1JTkdfQ09ORklHKSk7CisJCSh2b2lkKXJlYWRsKFBNQUNfSURFX1JFRyhJREVfVElNSU5HX0NPTkZJRykpOworCX0KKworCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fcG1hYworcG1hY19pZGVfZG1hX2V4ZWNfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY29tbWFuZCkKK3sKKwkvKiBpc3N1ZSBjbWQgdG8gZHJpdmUgKi8KKwlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBjb21tYW5kLCAmaWRlX2RtYV9pbnRyLCAyKldBSVRfQ01ELCBOVUxMKTsKK30KKworLyoKKyAqIEtpY2sgdGhlIERNQSBjb250cm9sbGVyIGludG8gbGlmZSBhZnRlciB0aGUgRE1BIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkCisgKiB0byB0aGUgZHJpdmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fcG1hYworcG1hY19pZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopSFdJRihkcml2ZSktPmh3aWZfZGF0YTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWE7CisKKwlkbWEgPSBwbWlmLT5kbWFfcmVnczsKKworCXdyaXRlbCgoUlVOIDw8IDE2KSB8IFJVTiwgJmRtYS0+Y29udHJvbCk7CisJLyogTWFrZSBzdXJlIGl0IGdldHMgdG8gdGhlIGNvbnRyb2xsZXIgcmlnaHQgbm93ICovCisJKHZvaWQpcmVhZGwoJmRtYS0+Y29udHJvbCk7Cit9CisKKy8qCisgKiBBZnRlciBhIERNQSB0cmFuc2ZlciwgbWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzIHN0b3BwZWQKKyAqLworc3RhdGljIGludCBfX3BtYWMKK3BtYWNfaWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlwbWFjX2lkZV9od2lmX3QqIHBtaWYgPSAocG1hY19pZGVfaHdpZl90ICopSFdJRihkcml2ZSktPmh3aWZfZGF0YTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWE7CisJdTMyIGRzdGF0OworCQorCWlmIChwbWlmID09IE5VTEwpCisJCXJldHVybiAwOworCWRtYSA9IHBtaWYtPmRtYV9yZWdzOworCisJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CisJZHN0YXQgPSByZWFkbCgmZG1hLT5zdGF0dXMpOworCXdyaXRlbCgoKFJVTnxXQUtFfERFQUQpIDw8IDE2KSwgJmRtYS0+Y29udHJvbCk7CisJcG1hY19pZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisJLyogdmVyaWZ5IGdvb2QgZG1hIHN0YXR1cy4gd2UgZG9uJ3QgY2hlY2sgZm9yIEFDVElWRSBiZWVpbmcgMC4gV2Ugc2hvdWxkLi4uCisJICogaW4gdGhlb3J5LCBidXQgd2l0aCBBVEFQSSBkZWNpY2VzIGRvaW5nIGJ1ZmZlciB1bmRlcnJ1bnMsIHRoYXQgd291bGQKKwkgKiBjYXVzZSB1cyB0byBkaXNhYmxlIERNQSwgd2hpY2ggaXNuJ3Qgd2hhdCB3ZSB3YW50CisJICovCisJcmV0dXJuIChkc3RhdCAmIChSVU58REVBRCkpICE9IFJVTjsKK30KKworLyoKKyAqIENoZWNrIG91dCB0aGF0IHRoZSBpbnRlcnJ1cHQgd2UgZ290IHdhcyBmb3IgdXMuIFdlIGNhbid0IGFsd2F5cyBrbm93IHRoaXMKKyAqIGZvciBzdXJlIHdpdGggdGhvc2UgQXBwbGUgaW50ZXJmYWNlcyAod2VsbCwgd2UgY291bGQgb24gdGhlIHJlY2VudCBvbmVzIGJ1dAorICogdGhhdCdzIG5vdCBpbXBsZW1lbnRlZCB5ZXQpLCBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3QgaGF2ZSBzaGFyZWQgaW50ZXJydXB0cworICogc28gaXQncyBub3QgcmVhbGx5IGEgcHJvYmxlbQorICovCitzdGF0aWMgaW50IF9fcG1hYworcG1hY19pZGVfZG1hX3Rlc3RfaXJxIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcG1hY19pZGVfaHdpZl90KiBwbWlmID0gKHBtYWNfaWRlX2h3aWZfdCAqKUhXSUYoZHJpdmUpLT5od2lmX2RhdGE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzLCB0aW1lb3V0OworCisJaWYgKHBtaWYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZG1hID0gcG1pZi0+ZG1hX3JlZ3M7CisKKwkvKiBXZSBoYXZlIHRvIHRoaW5ncyB0byBkZWFsIHdpdGggaGVyZToKKwkgKiAKKwkgKiAtIFRoZSBkYmRtYSB3b24ndCBzdG9wIGlmIHRoZSBjb21tYW5kIHdhcyBzdGFydGVkCisJICogYnV0IGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIHdpdGhvdXQgdHJhbnNmZXJyaW5nIGFsbAorCSAqIGRhdGFzLiBUaGlzIGhhcHBlbnMgd2hlbiBiYWQgYmxvY2tzIGFyZSBtZXQgZHVyaW5nCisJICogYSBtdWx0aS1ibG9jayB0cmFuc2Zlci4KKwkgKiAKKwkgKiAtIFRoZSBkYmRtYSBmaWZvIGhhc24ndCB5ZXQgZmluaXNoZWQgZmx1c2hpbmcgdG8KKwkgKiB0byBzeXN0ZW0gbWVtb3J5IHdoZW4gdGhlIGRpc2sgaW50ZXJydXB0IG9jY3Vycy4KKwkgKiAKKwkgKi8KKworCS8qIElmIEFDVElWRSBpcyBjbGVhcmVkLCB0aGUgU1RPUCBjb21tYW5kIGhhdmUgcGFzc2VkIGFuZAorCSAqIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorCSAqLworCXN0YXR1cyA9IHJlYWRsKCZkbWEtPnN0YXR1cyk7CisJaWYgKCEoc3RhdHVzICYgQUNUSVZFKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUlZCwgaWRlX2RtYV90ZXN0X2lycSBcCisJCQljYWxsZWQgd2hpbGUgbm90IHdhaXRpbmdcbiIsIEhXSUYoZHJpdmUpLT5pbmRleCk7CisKKwkvKiBJZiBkYmRtYSBkaWRuJ3QgZXhlY3V0ZSB0aGUgU1RPUCBjb21tYW5kIHlldCwgdGhlCisJICogYWN0aXZlIGJpdCBpcyBzdGlsbCBzZXQuIFdlIGNvbnNpZGVyIHRoYXQgd2UgYXJlbid0CisJICogc2hhcmluZyBpbnRlcnJ1cHRzICh3aGljaCBpcyBob3BlZnVsbHkgdGhlIGNhc2Ugd2l0aAorCSAqIHRob3NlIGNvbnRyb2xsZXJzKSBhbmQgc28gd2UganVzdCB0cnkgdG8gZmx1c2ggdGhlCisJICogY2hhbm5lbCBmb3IgcGVuZGluZyBkYXRhIGluIHRoZSBmaWZvCisJICovCisJdWRlbGF5KDEpOworCXdyaXRlbCgoRkxVU0ggPDwgMTYpIHwgRkxVU0gsICZkbWEtPmNvbnRyb2wpOworCXRpbWVvdXQgPSAwOworCWZvciAoOzspIHsKKwkJdWRlbGF5KDEpOworCQlzdGF0dXMgPSByZWFkbCgmZG1hLT5zdGF0dXMpOworCQlpZiAoKHN0YXR1cyAmIEZMVVNIKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICgrK3RpbWVvdXQgPiAxMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZSVkLCBpZGVfZG1hX3Rlc3RfaXJxIFwKKwkJCXRpbWVvdXQgZmx1c2hpbmcgY2hhbm5lbFxuIiwgSFdJRihkcml2ZSktPmluZGV4KTsKKwkJCWJyZWFrOworCQl9CisJfQkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX3BtYWMKK3BtYWNfaWRlX2RtYV9ob3N0X29mZiAoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fcG1hYworcG1hY19pZGVfZG1hX2hvc3Rfb24gKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3BtYWMKK3BtYWNfaWRlX2RtYV9sb3N0aXJxIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJcG1hY19pZGVfaHdpZl90KiBwbWlmID0gKHBtYWNfaWRlX2h3aWZfdCAqKUhXSUYoZHJpdmUpLT5od2lmX2RhdGE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJaWYgKHBtaWYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZG1hID0gcG1pZi0+ZG1hX3JlZ3M7CisKKwlzdGF0dXMgPSByZWFkbCgmZG1hLT5zdGF0dXMpOworCXByaW50ayhLRVJOX0VSUiAiaWRlLXBtYWMgbG9zdCBpbnRlcnJ1cHQsIGRtYSBzdGF0dXM6ICVseFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZGVkIGZvciB1c2luZyBETUEgd2l0aCBhbiBpbnRlcmZhY2UKKyAqIGFuZCBmaWxsIHRoZSBwcm9wZXIgbGlzdCBvZiBmdW5jdGlvbnMgcG9pbnRlcnMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IAorcG1hY19pZGVfc2V0dXBfZG1hKHBtYWNfaWRlX2h3aWZfdCAqcG1pZiwgaWRlX2h3aWZfdCAqaHdpZikKK3sKKwkvKiBXZSB3b24ndCBuZWVkIHBjaV9kZXYgaWYgd2Ugc3dpdGNoIHRvIGdlbmVyaWMgY29uc2lzdGVudAorCSAqIERNQSByb3V0aW5lcyAuLi4KKwkgKi8KKwlpZiAoaHdpZi0+cGNpX2RldiA9PSBOVUxMKQorCQlyZXR1cm47CisJLyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIERCRE1BIGNvbW1hbmRzLgorCSAqIFRoZSArMiBpcyArMSBmb3IgdGhlIHN0b3AgY29tbWFuZCBhbmQgKzEgdG8gYWxsb3cgZm9yCisJICogYWxpZ25pbmcgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gYSBtdWx0aXBsZSBvZiAxNiBieXRlcy4KKwkgKi8KKwlwbWlmLT5kbWFfdGFibGVfY3B1ID0gKHN0cnVjdCBkYmRtYV9jbWQqKXBjaV9hbGxvY19jb25zaXN0ZW50KAorCQlod2lmLT5wY2lfZGV2LAorCQkoTUFYX0RDTURTICsgMikgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCksCisJCSZod2lmLT5kbWF0YWJsZV9kbWEpOworCWlmIChwbWlmLT5kbWFfdGFibGVfY3B1ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBjb21tYW5kIGxpc3RcbiIsCisJCSAgICAgICBod2lmLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkgPSAmX19pZGVfZG1hX29mZl9xdWlldGx5OworCWh3aWYtPmlkZV9kbWFfb24gPSAmX19pZGVfZG1hX29uOworCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmcG1hY19pZGVfZG1hX2NoZWNrOworCWh3aWYtPmRtYV9zZXR1cCA9ICZwbWFjX2lkZV9kbWFfc2V0dXA7CisJaHdpZi0+ZG1hX2V4ZWNfY21kID0gJnBtYWNfaWRlX2RtYV9leGVjX2NtZDsKKwlod2lmLT5kbWFfc3RhcnQgPSAmcG1hY19pZGVfZG1hX3N0YXJ0OworCWh3aWYtPmlkZV9kbWFfZW5kID0gJnBtYWNfaWRlX2RtYV9lbmQ7CisJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZwbWFjX2lkZV9kbWFfdGVzdF9pcnE7CisJaHdpZi0+aWRlX2RtYV9ob3N0X29mZiA9ICZwbWFjX2lkZV9kbWFfaG9zdF9vZmY7CisJaHdpZi0+aWRlX2RtYV9ob3N0X29uID0gJnBtYWNfaWRlX2RtYV9ob3N0X29uOworCWh3aWYtPmlkZV9kbWFfdGltZW91dCA9ICZfX2lkZV9kbWFfdGltZW91dDsKKwlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmcG1hY19pZGVfZG1hX2xvc3RpcnE7CisKKwlod2lmLT5hdGFwaV9kbWEgPSAxOworCXN3aXRjaChwbWlmLT5raW5kKSB7CisJCWNhc2UgY29udHJvbGxlcl9zaF9hdGE2OgorCQkJaHdpZi0+dWx0cmFfbWFzayA9IHBtaWYtPmNhYmxlXzgwID8gMHg3ZiA6IDB4MDc7CisJCQlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwkJCWh3aWYtPnN3ZG1hX21hc2sgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgY29udHJvbGxlcl91bl9hdGE2OgorCQljYXNlIGNvbnRyb2xsZXJfazJfYXRhNjoKKwkJCWh3aWYtPnVsdHJhX21hc2sgPSBwbWlmLT5jYWJsZV84MCA/IDB4M2YgOiAweDA3OworCQkJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJCQlod2lmLT5zd2RtYV9tYXNrID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIGNvbnRyb2xsZXJfa2xfYXRhNDoKKwkJCWh3aWYtPnVsdHJhX21hc2sgPSBwbWlmLT5jYWJsZV84MCA/IDB4MWYgOiAweDA3OworCQkJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJCQlod2lmLT5zd2RtYV9tYXNrID0gMHgwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaHdpZi0+dWx0cmFfbWFzayA9IDB4MDA7CisJCQlod2lmLT5td2RtYV9tYXNrID0gMHgwNzsKKwkJCWh3aWYtPnN3ZG1hX21hc2sgPSAweDAwOworCQkJYnJlYWs7CisJfQkKK30KKworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDE2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwpAQCAtMCwwICsxLDkwMSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwkJVmVyc2lvbiAxLjEwCTIwMDIvMDgvMTkKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgIEFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKgorICogIENvcHlyaWdodCAoYykgMTk5NS0xOTk4ICBNYXJrIExvcmQKKyAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCisgKiAgUmVjZW50IENoYW5nZXMKKyAqCVNwbGl0IHRoZSBzZXQgdXAgZnVuY3Rpb24gaW50byBtdWx0aXBsZSBmdW5jdGlvbnMKKyAqCVVzZSBwY2lfc2V0X21hc3RlcgorICoJRml4IG1pc3JlcG9ydGluZyBvZiBJL08gdiBNTUlPIHByb2JsZW1zCisgKglJbml0aWFsIGZpeHVwcyBmb3Igc2ltcGxleCBkZXZpY2VzCisgKi8KKworLyoKKyAqICBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciBhdXRvbWF0aWMgZGV0ZWN0aW9uIGFuZAorICogIGNvbmZpZ3VyYXRpb24gb2YgYWxsIFBDSSBJREUgaW50ZXJmYWNlcyBwcmVzZW50IGluIGEgc3lzdGVtLiAgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisKKy8qKgorICoJaWRlX21hdGNoX2h3aWYJLQltYXRjaCBhIFBDSSBJREUgYWdhaW5zdCBhbiBpZGVfaHdpZgorICoJQGlvX2Jhc2U6IEkvTyBiYXNlIG9mIGRldmljZQorICoJQGJvb3RhYmxlOiBzZXQgaWYgaXRzIGJvb3RhYmxlCisgKglAbmFtZTogbmFtZSBvZiBkZXZpY2UKKyAqCisgKglNYXRjaCBhIFBDSSBJREUgcG9ydCBhZ2FpbnN0IGFuIGVudHJ5IGluIGlkZV9od2lmc1tdLAorICoJYmFzZWQgb24gaW9fYmFzZSBwb3J0IGlmIHBvc3NpYmxlLiBSZXR1cm4gdGhlIG1hdGNoaW5nIGh3aWYsCisgKglvciBhIG5ldyBod2lmLiBJZiB3ZSBmaW5kIGFuIGVycm9yIChjbGFzaGluZywgb3V0IG9mIGRldmljZXMsIGV0YykKKyAqCXJldHVybiBOVUxMCisgKgorICoJRklYTUU6IHdlIG5lZWQgdG8gaGFuZGxlIG1taW8gbWF0Y2hlcyBoZXJlIHRvbworICovCisKK3N0YXRpYyBpZGVfaHdpZl90ICppZGVfbWF0Y2hfaHdpZih1bnNpZ25lZCBsb25nIGlvX2Jhc2UsIHU4IGJvb3RhYmxlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBoOworCWlkZV9od2lmX3QgKmh3aWY7CisKKwkvKgorCSAqIExvb2sgZm9yIGEgaHdpZiB3aXRoIG1hdGNoaW5nIGlvX2Jhc2Ugc3BlY2lmaWVkIHVzaW5nCisJICogcGFyYW1ldGVycyB0byBpZGVfc2V0dXAoKS4KKwkgKi8KKwlmb3IgKGggPSAwOyBoIDwgTUFYX0hXSUZTOyArK2gpIHsKKwkJaHdpZiA9ICZpZGVfaHdpZnNbaF07CisJCWlmIChod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdID09IGlvX2Jhc2UpIHsKKwkJCWlmIChod2lmLT5jaGlwc2V0ID09IGlkZV9mb3JjZWQpCisJCQkJcmV0dXJuIGh3aWY7IC8qIGEgcGVyZmVjdCBtYXRjaCAqLworCQl9CisJfQorCS8qCisJICogTG9vayBmb3IgYSBod2lmIHdpdGggbWF0Y2hpbmcgaW9fYmFzZSBkZWZhdWx0IHZhbHVlLgorCSAqIElmIGNoaXBzZXQgaXMgImlkZV91bmtub3duIiwgdGhlbiBjbGFpbSB0aGF0IGh3aWYgc2xvdC4KKwkgKiBPdGhlcndpc2UsIHNvbWUgb3RoZXIgY2hpcHNldCBoYXMgYWxyZWFkeSBjbGFpbWVkIGl0Li4gIDooCisJICovCisJZm9yIChoID0gMDsgaCA8IE1BWF9IV0lGUzsgKytoKSB7CisJCWh3aWYgPSAmaWRlX2h3aWZzW2hdOworCQlpZiAoaHdpZi0+aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSA9PSBpb19iYXNlKSB7CisJCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfdW5rbm93bikKKwkJCQlyZXR1cm4gaHdpZjsgLyogbWF0Y2ggKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBvcnQgMHglMDRseCBhbHJlYWR5IGNsYWltZWQgYnkgJXNcbiIsCisJCQkJbmFtZSwgaW9fYmFzZSwgaHdpZi0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsJLyogYWxyZWFkeSBjbGFpbWVkICovCisJCX0KKwl9CisJLyoKKwkgKiBPa2F5LCB0aGVyZSBpcyBubyBod2lmIG1hdGNoaW5nIG91ciBpb19iYXNlLAorCSAqIHNvIHdlJ2xsIGp1c3QgY2xhaW0gYW4gdW5hc3NpZ25lZCBzbG90LgorCSAqIEdpdmUgcHJlZmVyZW5jZSB0byBjbGFpbWluZyBvdGhlciBzbG90cyBiZWZvcmUgY2xhaW1pbmcgaWRlMC9pZGUxLAorCSAqIGp1c3QgaW4gY2FzZSB0aGVyZSdzIGFub3RoZXIgaW50ZXJmYWNlIHlldC10by1iZS1zY2FubmVkCisJICogd2hpY2ggdXNlcyBwb3J0cyAxZjAvMTcwICh0aGUgaWRlMC9pZGUxIGRlZmF1bHRzKS4KKwkgKgorCSAqIFVubGVzcyB0aGVyZSBpcyBhIGJvb3RhYmxlIGNhcmQgdGhhdCBkb2VzIG5vdCB1c2UgdGhlIHN0YW5kYXJkCisJICogcG9ydHMgMWYwLzE3MCAodGhlIGlkZTAvaWRlMSBkZWZhdWx0cykuIFRoZSAoYm9vdGFibGUpIGZsYWcuCisJICovCisJaWYgKGJvb3RhYmxlKSB7CisJCWZvciAoaCA9IDA7IGggPCBNQVhfSFdJRlM7ICsraCkgeworCQkJaHdpZiA9ICZpZGVfaHdpZnNbaF07CisJCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfdW5rbm93bikKKwkJCQlyZXR1cm4gaHdpZjsJLyogcGljayBhbiB1bnVzZWQgZW50cnkgKi8KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaCA9IDI7IGggPCBNQVhfSFdJRlM7ICsraCkgeworCQkJaHdpZiA9IGlkZV9od2lmcyArIGg7CisJCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfdW5rbm93bikKKwkJCQlyZXR1cm4gaHdpZjsJLyogcGljayBhbiB1bnVzZWQgZW50cnkgKi8KKwkJfQorCX0KKwlmb3IgKGggPSAwOyBoIDwgMjsgKytoKSB7CisJCWh3aWYgPSBpZGVfaHdpZnMgKyBoOworCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfdW5rbm93bikKKwkJCXJldHVybiBod2lmOwkvKiBwaWNrIGFuIHVudXNlZCBlbnRyeSAqLworCX0KKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0b28gbWFueSBJREUgaW50ZXJmYWNlcywgbm8gcm9vbSBpbiB0YWJsZVxuIiwgbmFtZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJaWRlX3NldHVwX3BjaV9iYXNlcmVncwktCXBsYWNlIGEgUENJIElERSBjb250cm9sbGVyIG5hdGl2ZQorICoJQGRldjogUENJIGRldmljZSBvZiBpbnRlcmZhY2UgdG8gc3dpdGNoIG5hdGl2ZQorICoJQG5hbWU6IE5hbWUgb2YgaW50ZXJmYWNlCisgKgorICoJV2UgYXR0ZW1wdCB0byBwbGFjZSB0aGUgUENJIGludGVyZmFjZSBpbnRvIFBDSSBuYXRpdmUgbW9kZS4gSWYKKyAqCXdlIHN1Y2NlZWQgdGhlIEJBUnMgYXJlIG9rIGFuZCB0aGUgY29udHJvbGxlciBpcyBpbiBQQ0kgbW9kZS4KKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFuIGVycm5vIGNvZGUuIAorICoKKyAqCUZJWE1FOiBpZiB3ZSBwcm9ncmFtIHRoZSBpbnRlcmZhY2UgYW5kIHRoZW4gZmFpbCB0byBzZXQgdGhlIEJBUlMKKyAqCXdlIGRvbid0IHN3aXRjaCBpdCBiYWNrIHRvIGxlZ2FjeSBtb2RlLiBEbyB3ZSBhY3R1YWxseSBjYXJlID8/CisgKi8KKyAKK3N0YXRpYyBpbnQgaWRlX3NldHVwX3BjaV9iYXNlcmVncyAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1OCBwcm9naWYgPSAwOworCisJLyoKKwkgKiBQbGFjZSBib3RoIElERSBpbnRlcmZhY2VzIGludG8gUENJICJuYXRpdmUiIG1vZGU6CisJICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1BST0csICZwcm9naWYpIHx8CisJCQkgKHByb2dpZiAmIDUpICE9IDUpIHsKKwkJaWYgKChwcm9naWYgJiAweGEpICE9IDB4YSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRldmljZSBub3QgY2FwYWJsZSBvZiBmdWxsICIKKwkJCQkibmF0aXZlIFBDSSBtb2RlXG4iLCBuYW1lKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQlwcmludGsoIiVzOiBwbGFjaW5nIGJvdGggcG9ydHMgaW50byBuYXRpdmUgUENJIG1vZGVcbiIsIG5hbWUpOworCQkodm9pZCkgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1BST0csIHByb2dpZnw1KTsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1BST0csICZwcm9naWYpIHx8CisJCSAgICAocHJvZ2lmICYgNSkgIT0gNSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmV3cml0ZSBvZiBQUk9HSUYgZmFpbGVkLCB3YW50ZWQgIgorCQkJCSIweCUwNHgsIGdvdCAweCUwNHhcbiIsCisJCQkJbmFtZSwgcHJvZ2lmfDUsIHByb2dpZik7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJCisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VECisvKgorICogTG9uZyBsb3N0IGRhdGEgZnJvbSAyLjAuMzQgdGhhdCBpcyBub3cgaW4gMi4wLjM5CisgKgorICogVGhpcyB3YXMgdXNlZCBpbiAuL2RyaXZlcnMvYmxvY2svdHJpdG9uLmMgdG8gZG8gRE1BIEJhc2UgYWRkcmVzcyBzZXR1cAorICogd2hlbiBQblAgZmFpbGVkLiAgT2ggdGhlIHRoaW5ncyB3ZSBmb3JnZXQuICBJIGJlbGlldmUgdGhpcyB3YXMgcGFydAorICogb2YgU0ZGLTgwMzhpIHRoYXQgaGFzIGJlZW4gd2l0aGRyYXduIGZyb20gcHVibGljIGFjY2Vzcy4uLiA6LSgoCisgKi8KKyNkZWZpbmUgREVGQVVMVF9CTUlCQQkweGU4MDAJLyogaW4gY2FzZSBCSU9TIGRpZCBub3QgaW5pdCBpdCAqLworI2RlZmluZSBERUZBVUxUX0JNQ1JCQQkweGNjMDAJLyogVklBJ3MgZGVmYXVsdCB2YWx1ZSAqLworI2RlZmluZSBERUZBVUxUX0JNQUxJQkEJMHhkNDAwCS8qIEFMSSdzIGRlZmF1bHQgdmFsdWUgKi8KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEICovCisKKy8qKgorICoJaWRlX2dldF9vcl9zZXRfZG1hX2Jhc2UJCS0Jc2V0dXAgQk1JQkEKKyAqCUBod2lmOiBJbnRlcmZhY2UKKyAqCisgKglGZXRjaCB0aGUgRE1BIEJ1cy1NYXN0ZXItSS9PLUJhc2UtQWRkcmVzcyAoQk1JQkEpIGZyb20gUENJIHNwYWNlOgorICoJSWYgbmVlZCBiZSB3ZSBzZXQgdXAgdGhlIERNQSBiYXNlLiBXaGVyZSBhIGRldmljZSBoYXMgYSBwYXJ0bmVyIHRoYXQKKyAqCWlzIGFscmVhZHkgaW4gRE1BIG1vZGUgd2UgY2hlY2sgYW5kIGVuZm9yY2UgSURFIHNpbXBsZXggcnVsZXMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaWRlX2dldF9vcl9zZXRfZG1hX2Jhc2UgKGlkZV9od2lmX3QgKmh3aWYpCit7CisJdW5zaWduZWQgbG9uZwlkbWFfYmFzZSA9IDA7CisJc3RydWN0IHBjaV9kZXYJKmRldiA9IGh3aWYtPnBjaV9kZXY7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VECisJaW50IHNlY29uZF9jaGFuY2UgPSAwOworCitzZWNvbmRfY2hhbmNlX3RvX2RtYToKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEICovCisKKwlpZiAoaHdpZi0+bW1pbykKKwkJcmV0dXJuIGh3aWYtPmRtYV9iYXNlOworCisJaWYgKGh3aWYtPm1hdGUgJiYgaHdpZi0+bWF0ZS0+ZG1hX2Jhc2UpIHsKKwkJZG1hX2Jhc2UgPSBod2lmLT5tYXRlLT5kbWFfYmFzZSAtIChod2lmLT5jaGFubmVsID8gMCA6IDgpOworCX0gZWxzZSB7CisJCWRtYV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJCWlmICghZG1hX2Jhc2UpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRtYV9iYXNlIGlzIGludmFsaWRcbiIsCisJCQkJCWh3aWYtPmNkcy0+bmFtZSk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VECisJLyogRklYTUUgLSBzaG91bGQgdXNlIHBjaV9hc3NpZ25fcmVzb3VyY2Ugc3VyZWx5ICovCisJaWYgKCghZG1hX2Jhc2UpICYmICghc2Vjb25kX2NoYW5jZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBzZXRfYm1pYmEgPSAwOworCQlzZWNvbmRfY2hhbmNlKys7CisJCXN3aXRjaChkZXYtPnZlbmRvcikgeworCQkJY2FzZSBQQ0lfVkVORE9SX0lEX0FMOgorCQkJCXNldF9ibWliYSA9IERFRkFVTFRfQk1BTElCQTsgYnJlYWs7CisJCQljYXNlIFBDSV9WRU5ET1JfSURfVklBOgorCQkJCXNldF9ibWliYSA9IERFRkFVTFRfQk1DUkJBOyBicmVhazsKKwkJCWNhc2UgUENJX1ZFTkRPUl9JRF9JTlRFTDoKKwkJCQlzZXRfYm1pYmEgPSBERUZBVUxUX0JNSUJBOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGRtYV9iYXNlOworCQl9CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDIwLCBzZXRfYm1pYmF8MSk7CisJCWdvdG8gc2Vjb25kX2NoYW5jZV90b19kbWE7CisJfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgKi8KKworCWlmIChkbWFfYmFzZSkgeworCQl1OCBzaW1wbGV4X3N0YXQgPSAwOworCQlkbWFfYmFzZSArPSBod2lmLT5jaGFubmVsID8gOCA6IDA7CisKKwkJc3dpdGNoKGRldi0+ZGV2aWNlKSB7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfQUxfTTUyMTk6CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfQUxfTTUyMjk6CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfQU1EX1ZJUEVSXzc0MDk6CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfQ01EXzY0MzoKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFOgorCQkJCXNpbXBsZXhfc3RhdCA9IGh3aWYtPklOQihkbWFfYmFzZSArIDIpOworCQkJCWh3aWYtPk9VVEIoKHNpbXBsZXhfc3RhdCYweDYwKSwoZG1hX2Jhc2UgKyAyKSk7CisJCQkJc2ltcGxleF9zdGF0ID0gaHdpZi0+SU5CKGRtYV9iYXNlICsgMik7CisJCQkJaWYgKHNpbXBsZXhfc3RhdCAmIDB4ODApIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNpbXBsZXggZGV2aWNlOiAiCisJCQkJCQkiRE1BIGZvcmNlZFxuIiwKKwkJCQkJCWh3aWYtPmNkcy0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBkZXZpY2UgY2xhaW1zICJzaW1wbGV4IiBETUEsCisJCQkJICogdGhpcyBtZWFucyBvbmx5IG9uZSBvZiB0aGUgdHdvIGludGVyZmFjZXMKKwkJCQkgKiBjYW4gYmUgdHJ1c3RlZCB3aXRoIERNQSBhdCBhbnkgcG9pbnQgaW4gdGltZS4KKwkJCQkgKiBTbyB3ZSBzaG91bGQgZW5hYmxlIERNQSBvbmx5IG9uIG9uZSBvZiB0aGUKKwkJCQkgKiB0d28gaW50ZXJmYWNlcy4KKwkJCQkgKi8KKwkJCQlzaW1wbGV4X3N0YXQgPSBod2lmLT5JTkIoZG1hX2Jhc2UgKyAyKTsKKwkJCQlpZiAoc2ltcGxleF9zdGF0ICYgMHg4MCkgeworCQkJCQkvKiBzaW1wbGV4IGRldmljZT8gKi8KKy8qCisgKglBdCB0aGlzIHBvaW50IHdlIGhhdmVuJ3QgcHJvYmVkIHRoZSBkcml2ZXMgc28gd2UgY2FuJ3QgbWFrZSB0aGUKKyAqCWFwcHJvcHJpYXRlIGRlY2lzaW9uLiBSZWFsbHkgd2Ugc2hvdWxkIGRlZmVyIHRoaXMgcHJvYmxlbQorICoJdW50aWwgd2UgdHVuZSB0aGUgZHJpdmUgdGhlbiB0cnkgdG8gZ3JhYiBETUEgb3duZXJzaGlwIGlmIHdlIHdhbnQKKyAqCXRvIGJlIHRoZSBETUEgZW5kLiBUaGlzIGhhcyB0byBiZSBiZWNvbWUgZHluYW1pYyB0byBoYW5kbGUgaG90CisgKglwbHVnLgorICovCisJCQkJCWlmIChod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmRtYV9iYXNlKSB7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogc2ltcGxleCBkZXZpY2U6ICIKKwkJCQkJCQkiRE1BIGRpc2FibGVkXG4iLAorCQkJCQkJCWh3aWYtPmNkcy0+bmFtZSk7CisJCQkJCQlkbWFfYmFzZSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCX0KKwl9CisJcmV0dXJuIGRtYV9iYXNlOworfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9QQ0kgKi8KKwordm9pZCBpZGVfc2V0dXBfcGNpX25vaXNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJREUgY29udHJvbGxlciBhdCBQQ0kgc2xvdCAlc1xuIiwKKwkJCSBkLT5uYW1lLCBwY2lfbmFtZShkZXYpKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3NldHVwX3BjaV9ub2lzZSk7CisKKworLyoqCisgKglpZGVfcGNpX2VuYWJsZQktCWRvIFBDSSBlbmFibGVzCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAZDogSURFIHBjaSBkZXZpY2UgZGF0YQorICoKKyAqCUVuYWJsZSB0aGUgSURFIFBDSSBkZXZpY2UuIFdlIGF0dGVtcHQgdG8gZW5hYmxlIHRoZSBkZXZpY2UgaW4gZnVsbAorICoJYnV0IGlmIHRoYXQgZmFpbHMgdGhlbiB3ZSBvbmx5IG5lZWQgQkFSNCBzbyB3ZSB3aWxsIGVuYWJsZSB0aGF0LgorICoJCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlCisgKi8KKyAKK3N0YXRpYyBpbnQgaWRlX3BjaV9lbmFibGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKKwkJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2VfYmFycyhkZXYsIDEgPDwgNCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKGlkZV9zZXR1cF9wY2lfZGV2aWNlOikgIgorCQkJCSJDb3VsZCBub3QgZW5hYmxlIGRldmljZS5cbiIsIGQtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJJT1MgY29uZmlndXJhdGlvbiBmaXhlZC5cbiIsIGQtPm5hbWUpOworCX0KKworCS8qCisJICogYXNzdW1lIGFsbCBkZXZpY2VzIGNhbiBkbyAzMi1iaXQgZG1hIGZvciBub3cuIHdlIGNhbiBhZGQgYQorCSAqIGRtYSBtYXNrIGZpZWxkIHRvIHRoZSBpZGVfcGNpX2RldmljZV90IGlmIHdlIG5lZWQgaXQgKG9yIGxldAorCSAqIGxvd2VyIGxldmVsIGRyaXZlciBzZXQgdGhlIGRtYSBtYXNrKQorCSAqLworCXJldCA9IHBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3Qgc2V0IGRtYSBtYXNrXG4iLCBkLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRklYTUU6IFRlbXBvcmFyeSAtIHVudGlsIHdlIHB1dCBpbiB0aGUgaG90cGx1ZyBpbnRlcmZhY2UgbG9naWMKKwkgICBDaGVjayB0aGF0IHRoZSBiaXRzIHdlIHdhbnQgYXJlIG5vdCBpbiB1c2UgYnkgc29tZW9uZSBlbHNlLiAqLworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDQsICJpZGVfdG1wIik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgNCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglpZGVfcGNpX2NvbmZpZ3VyZQktCWNvbmZpZ3VyZSBhbiB1bmNvbmZpZ3VyZWQgZGV2aWNlCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAZDogSURFIHBjaSBkZXZpY2UgZGF0YQorICoKKyAqCUVuYWJsZSBhbmQgY29uZmlndXJlIHRoZSBQQ0kgZGV2aWNlIHdlIGhhdmUgYmVlbiBwYXNzZWQuCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlLgorICovCisgCitzdGF0aWMgaW50IGlkZV9wY2lfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQpCit7CisJdTE2IHBjaWNtZCA9IDA7CisJLyoKKwkgKiBQblAgQklPUyB3YXMgKnN1cHBvc2VkKiB0byBoYXZlIHNldHVwIHRoaXMgZGV2aWNlLCBidXQgd2UKKwkgKiBjYW4gZG8gaXQgb3Vyc2VsdmVzLCBzbyBsb25nIGFzIHRoZSBCSU9TIGhhcyBhc3NpZ25lZCBhbiBJUlEKKwkgKiAob3IgcG9zc2libHkgdGhlIGRldmljZSBpcyB1c2luZyBhICJsZWdhY3kgaGVhZGVyIiBmb3IgSVJRcykuCisJICogTWF5YmUgdGhlIHVzZXIgZGVsaWJlcmF0ZWx5ICpkaXNhYmxlZCogdGhlIGRldmljZSwKKwkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBpZ25vcmUgaXQgYWdhaW4gaWYgbm8gZHJpdmVzIHJlc3BvbmQuCisJICovCisJaWYgKGlkZV9zZXR1cF9wY2lfYmFzZXJlZ3MoZGV2LCBkLT5uYW1lKSB8fCBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgcGNpY21kfFBDSV9DT01NQU5EX0lPKSkgCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlIGRpc2FibGVkIChCSU9TKVxuIiwgZC0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAocGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJnBjaWNtZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgYWNjZXNzaW5nIFBDSSByZWdzXG4iLCBkLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghKHBjaWNtZCAmIFBDSV9DT01NQU5EX0lPKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZW5hYmxlIElERSBjb250cm9sbGVyXG4iLCBkLT5uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaWRlX3BjaV9jaGVja19pb21lbQktCWNoZWNrIGEgcmVnaXN0ZXIgaXMgSS9PCisgKglAZGV2OiBwY2kgZGV2aWNlCisgKglAZDogaWRlX3BjaV9kZXZpY2UKKyAqCUBiYXI6IGJhciBudW1iZXIKKyAqCisgKglDaGVja3MgaWYgYSBCQVIgaXMgY29uZmlndXJlZCBhbmQgcG9pbnRzIHRvIE1NSU8gc3BhY2UuIElmIHNvCisgKglwcmludCBhbiBlcnJvciBhbmQgcmV0dXJuIGFuIGVycm9yIGNvZGUuIE90aGVyd2lzZSByZXR1cm4gMAorICovCisgCitzdGF0aWMgaW50IGlkZV9wY2lfY2hlY2tfaW9tZW0oc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCwgaW50IGJhcikKK3sKKwl1bG9uZyBmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsIGJhcik7CisJCisJLyogVW5jb25maWd1cmVkID8gKi8KKwlpZiAoIWZsYWdzIHx8IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpID09IDApCisJCXJldHVybiAwOworCisJLyogSS9PIHNwYWNlICovCQkKKwlpZihmbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSykKKwkJcmV0dXJuIDA7CisJCQorCS8qIEJhZCAqLworCXByaW50ayhLRVJOX0VSUiAiJXM6IElPIGJhc2VyZWdzIChCSU9TKSBhcmUgcmVwb3J0ZWQgIgorCQkJImFzIE1FTSwgcmVwb3J0IHRvICIKKwkJCSI8YW5kcmVAbGludXgtaWRlLm9yZz4uXG4iLCBkLT5uYW1lKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKglpZGVfaHdpZl9jb25maWd1cmUJLQljb25maWd1cmUgYW4gSURFIGludGVyZmFjZQorICoJQGRldjogUENJIGRldmljZSBob2xkaW5nIGludGVyZmFjZQorICoJQGQ6IElERSBwY2kgZGF0YQorICoJQG1hdGU6IFBhaXJlZCBpbnRlcmZhY2UgaWYgYW55CisgKgorICoJUGVyZm9ybSB0aGUgaW5pdGlhbCBzZXQgdXAgZm9yIHRoZSBoYXJkd2FyZSBpbnRlcmZhY2Ugc3RydWN0dXJlLiBUaGlzCisgKglpcyBkb25lIHBlciBpbnRlcmZhY2UgcG9ydCByYXRoZXIgdGhhbiBwZXIgUENJIGRldmljZS4gVGhlcmUgbWF5IGJlCisgKgltb3JlIHRoYW4gb25lIHBvcnQgcGVyIGRldmljZS4KKyAqCisgKglSZXR1cm5zIHRoZSBuZXcgaGFyZHdhcmUgaW50ZXJmYWNlIHN0cnVjdHVyZSwgb3IgTlVMTCBvbiBhIGZhaWx1cmUKKyAqLworIAorc3RhdGljIGlkZV9od2lmX3QgKmlkZV9od2lmX2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkLCBpZGVfaHdpZl90ICptYXRlLCBpbnQgcG9ydCwgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGN0bCA9IDAsIGJhc2UgPSAwOworCWlkZV9od2lmX3QgKmh3aWY7CisKKwlpZiAoKGQtPmZsYWdzICYgSURFUENJX0ZMQUdfSVNBX1BPUlRTKSA9PSAwKSB7CisJCS8qICBQb3NzaWJseSB3ZSBzaG91bGQgZmFpbCBpZiB0aGVzZSBjaGVja3MgcmVwb3J0IHRydWUgKi8KKwkJaWRlX3BjaV9jaGVja19pb21lbShkZXYsIGQsIDIqcG9ydCk7CisJCWlkZV9wY2lfY2hlY2tfaW9tZW0oZGV2LCBkLCAyKnBvcnQrMSk7CisgCisJCWN0bCAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKnBvcnQrMSk7CisJCWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKnBvcnQpOworCQlpZiAoKGN0bCAmJiAhYmFzZSkgfHwgKGJhc2UgJiYgIWN0bCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGluY29uc2lzdGVudCBiYXNlcmVncyAoQklPUykgIgorCQkJCSJmb3IgcG9ydCAlZCwgc2tpcHBpbmdcbiIsIGQtPm5hbWUsIHBvcnQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKCFjdGwpCisJeworCQkvKiBVc2UgZGVmYXVsdCB2YWx1ZXMgKi8KKwkJY3RsID0gcG9ydCA/IDB4Mzc0IDogMHgzZjQ7CisJCWJhc2UgPSBwb3J0ID8gMHgxNzAgOiAweDFmMDsKKwl9CisJaWYgKChod2lmID0gaWRlX21hdGNoX2h3aWYoYmFzZSwgZC0+Ym9vdGFibGUsIGQtPm5hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsJLyogbm8gcm9vbSBpbiBpZGVfaHdpZnNbXSAqLworCWlmIChod2lmLT5pb19wb3J0c1tJREVfREFUQV9PRkZTRVRdICE9IGJhc2UgfHwKKwkgICAgaHdpZi0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSAhPSAoY3RsIHwgMikpIHsKKwkJbWVtc2V0KCZod2lmLT5odywgMCwgc2l6ZW9mKGh3aWYtPmh3KSk7CisjaWZuZGVmIElERV9BUkNIX09CU09MRVRFX0lOSVQKKwkJaWRlX3N0ZF9pbml0X3BvcnRzKCZod2lmLT5odywgYmFzZSwgKGN0bCB8IDIpKTsKKwkJaHdpZi0+aHcuaW9fcG9ydHNbSURFX0lSUV9PRkZTRVRdID0gMDsKKyNlbHNlCisJCWlkZV9pbml0X2h3aWZfcG9ydHMoJmh3aWYtPmh3LCBiYXNlLCAoY3RsIHwgMiksIE5VTEwpOworI2VuZGlmCisJCW1lbWNweShod2lmLT5pb19wb3J0cywgaHdpZi0+aHcuaW9fcG9ydHMsIHNpemVvZihod2lmLT5pb19wb3J0cykpOworCQlod2lmLT5ub3Byb2JlID0gIWh3aWYtPmlvX3BvcnRzW0lERV9EQVRBX09GRlNFVF07CisJfQorCWh3aWYtPmNoaXBzZXQgPSBpZGVfcGNpOworCWh3aWYtPnBjaV9kZXYgPSBkZXY7CisJaHdpZi0+Y2RzID0gKHN0cnVjdCBpZGVfcGNpX2RldmljZV9zICopIGQ7CisJaHdpZi0+Y2hhbm5lbCA9IHBvcnQ7CisKKwlpZiAoIWh3aWYtPmlycSkKKwkJaHdpZi0+aXJxID0gaXJxOworCWlmIChtYXRlKSB7CisJCWh3aWYtPm1hdGUgPSBtYXRlOworCQltYXRlLT5tYXRlID0gaHdpZjsKKwl9CisJcmV0dXJuIGh3aWY7Cit9CisKKy8qKgorICoJaWRlX2h3aWZfc2V0dXBfZG1hCS0JY29uZmlndXJlIERNQSBpbnRlcmZhY2UKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCUBkOiBJREUgcGNpIGRhdGEKKyAqCUBod2lmOiBIYXJkd2FyZSBpbnRlcmZhY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nCisgKgorICoJU2V0IHVwIHRoZSBETUEgYmFzZSBmb3IgdGhlIGludGVyZmFjZS4gRW5hYmxlIHRoZSBtYXN0ZXIgYml0cyBhcworICoJbmVjZXNzYXJ5IGFuZCBhdHRlbXB0IHRvIGJyaW5nIHRoZSBkZXZpY2UgRE1BIGludG8gYSByZWFkeSB0byB1c2UKKyAqCXN0YXRlCisgKi8KKyAKKyNpZm5kZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1BDSQorc3RhdGljIHZvaWQgaWRlX2h3aWZfc2V0dXBfZG1hKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQsIGlkZV9od2lmX3QgKmh3aWYpCit7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaWRlX2h3aWZfc2V0dXBfZG1hKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQsIGlkZV9od2lmX3QgKmh3aWYpCit7CisJdTE2IHBjaWNtZDsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmcGNpY21kKTsKKworCWlmICgoZC0+YXV0b2RtYSA9PSBBVVRPRE1BKSB8fAorCSAgICAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFICYmCisJICAgICAoZGV2LT5jbGFzcyAmIDB4ODApKSkgeworCQl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gaWRlX2dldF9vcl9zZXRfZG1hX2Jhc2UoaHdpZik7CisJCWlmIChkbWFfYmFzZSAmJiAhKHBjaWNtZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKwkJCS8qCisgCQkJICogU2V0IHVwIEJNLURNQSBjYXBhYmlsaXR5CisJCQkgKiAoUG5QIEJJT1Mgc2hvdWxkIGhhdmUgZG9uZSB0aGlzKQorIAkJCSAqLworCQkJLyogZGVmYXVsdCBETUEgb2ZmIGlmIHdlIGhhZCB0byBjb25maWd1cmUgaXQgaGVyZSAqLworCQkJaHdpZi0+YXV0b2RtYSA9IDA7CisJCQlwY2lfc2V0X21hc3RlcihkZXYpOworCQkJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZwY2ljbWQpIHx8ICEocGNpY21kICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGVycm9yIHVwZGF0aW5nIFBDSUNNRFxuIiwKKwkJCQkJaHdpZi0+bmFtZSwgZC0+bmFtZSk7CisJCQkJZG1hX2Jhc2UgPSAwOworCQkJfQorCQl9CisJCWlmIChkbWFfYmFzZSkgeworCQkJaWYgKGQtPmluaXRfZG1hKSB7CisJCQkJZC0+aW5pdF9kbWEoaHdpZiwgZG1hX2Jhc2UpOworCQkJfSBlbHNlIHsKKwkJCQlpZGVfc2V0dXBfZG1hKGh3aWYsIGRtYV9iYXNlLCA4KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBCdXMtTWFzdGVyIERNQSBkaXNhYmxlZCAiCisJCQkJIihCSU9TKVxuIiwgaHdpZi0+bmFtZSwgZC0+bmFtZSk7CisJCX0KKwl9Cit9CisKKyNpZm5kZWYgQ09ORklHX0lERURNQV9QQ0lfQVVUTworI3dhcm5pbmcgQ09ORklHX0lERURNQV9QQ0lfQVVUTz1uIHN1cHBvcnQgaXMgb2Jzb2xldGUsIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4KKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BX1BDSSovCisKKy8qKgorICoJaWRlX3NldHVwX3BjaV9jb250cm9sbGVyCS0Jc2V0IHVwIElERSBQQ0kKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCUBkOiBJREUgUENJIGRhdGEKKyAqCUBub2lzeTogdmVyYm9zZSBmbGFnCisgKglAY29uZmlnOiByZXR1cm5lZCBhcyAxIGlmIHdlIGNvbmZpZ3VyZWQgdGhlIGhhcmR3YXJlCisgKgorICoJU2V0IHVwIHRoZSBQQ0kgYW5kIGNvbnRyb2xsZXIgc2lkZSBvZiB0aGUgSURFIGludGVyZmFjZS4gVGhpcyBicmluZ3MKKyAqCXVwIHRoZSBQQ0kgc2lkZSBvZiB0aGUgZGV2aWNlLCBjaGVja3MgdGhhdCB0aGUgZGV2aWNlIGlzIGVuYWJsZWQKKyAqCWFuZCBlbmFibGVzIGl0IGlmIG5lZWQgYmUKKyAqLworIAorc3RhdGljIGludCBpZGVfc2V0dXBfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCwgaW50IG5vaXN5LCBpbnQgKmNvbmZpZykKK3sKKwlpbnQgcmV0OworCXUzMiBjbGFzc19yZXY7CisJdTE2IHBjaWNtZDsKKworCWlmIChub2lzeSkKKwkJaWRlX3NldHVwX3BjaV9ub2lzZShkZXYsIGQpOworCisJcmV0ID0gaWRlX3BjaV9lbmFibGUoZGV2LCBkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmcGNpY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBhY2Nlc3NpbmcgUENJIHJlZ3NcbiIsIGQtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCEocGNpY21kICYgUENJX0NPTU1BTkRfSU8pKSB7CS8qIGlzIGRldmljZSBkaXNhYmxlZD8gKi8KKwkJcmV0ID0gaWRlX3BjaV9jb25maWd1cmUoZGV2LCBkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJKmNvbmZpZyA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgZW5hYmxlZCAoTGludXgpXG4iLCBkLT5uYW1lKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOworCWNsYXNzX3JldiAmPSAweGZmOworCWlmIChub2lzeSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoaXBzZXQgcmV2aXNpb24gJWRcbiIsIGQtPm5hbWUsIGNsYXNzX3Jldik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglpZGVfcGNpX3NldHVwX3BvcnRzCS0JY29uZmlndXJlIHBvcnRzL2RldmljZXMgb24gUENJIElERQorICoJQGRldjogUENJIGRldmljZQorICoJQGQ6IElERSBwY2kgZGV2aWNlIGluZm8KKyAqCUBwY2lpcnE6IElSUSBsaW5lCisgKglAaW5kZXg6IGF0YSBpbmRleCB0byB1cGRhdGUKKyAqCisgKglTY2FuIHRoZSBpbnRlcmZhY2VzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlIGFuZCBkbyBhbnkKKyAqCW5lY2Vzc2FyeSBwZXIgcG9ydCBzZXR1cC4gQXR0YWNoIHRoZSBkZXZpY2VzIGFuZCBhc2sgdGhlCisgKglnZW5lcmljIERNQSBsYXllciB0byBkbyBpdHMgd29yayBmb3IgdXMuCisgKgorICoJTm9ybWFsbHkgY2FsbGVkIGF1dG9tYXRpY2FsbCBmcm9tIGRvX2lkZV9wY2lfc2V0dXBfZGV2aWNlLAorICoJYnV0IGlzIGFsc28gdXNlZCBkaXJlY3RseSBhcyBhIGhlbHBlciBmdW5jdGlvbiBieSBzb21lIGNvbnRyb2xsZXJzCisgKgl3aGVyZSB0aGUgY2hpcHNldCBzZXR1cCBpcyBub3QgdGhlIGRlZmF1bHQgUENJIElERSBvbmUuCisgKi8KKyAKK3ZvaWQgaWRlX3BjaV9zZXR1cF9wb3J0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkLCBpbnQgcGNpaXJxLCBhdGFfaW5kZXhfdCAqaW5kZXgpCit7CisJaW50IHBvcnQ7CisJaW50IGF0X2xlYXN0X29uZV9od2lmX2VuYWJsZWQgPSAwOworCWlkZV9od2lmX3QgKmh3aWYsICptYXRlID0gTlVMTDsKKwlzdGF0aWMgaW50IHNlY29uZHBkYyA9IDA7CisJdTggdG1wOworCisJaW5kZXgtPmFsbCA9IDB4ZjBmMDsKKworCS8qCisJICogU2V0IHVwIHRoZSBJREUgcG9ydHMKKwkgKi8KKwkgCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8PSAxOyArK3BvcnQpIHsKKwkJaWRlX3BjaV9lbmFibGViaXRfdCAqZSA9ICYoZC0+ZW5hYmxlYml0c1twb3J0XSk7CisJCisJCS8qIAorCQkgKiBJZiB0aGlzIGlzIGEgUHJvbWlzZSBGYWtlUmFpZCBjb250cm9sbGVyLAorCQkgKiB0aGUgMm5kIGNvbnRyb2xsZXIgd2lsbCBiZSBtYXJrZWQgYXMgCisJCSAqIGRpc2FibGVkIHdoaWxlIGl0IGlzIGFjdHVhbGx5IHRoZXJlIGFuZCBlbmFibGVkCisJCSAqIGJ5IHRoZSBiaW9zIGZvciByYWlkIHB1cnBvc2VzLiAKKwkJICogU2tpcCB0aGUgbm9ybWFsICJpcyBpdCBlbmFibGVkIiB0ZXN0IGZvciB0aG9zZS4KKwkJICovCisJCWlmICgoZC0+ZmxhZ3MgJiBJREVQQ0lfRkxBR19GT1JDRV9QREMpICYmCisJCSAgICAoc2Vjb25kcGRjKys9PTEpICYmIChwb3J0PT0xKSkKKwkJCWdvdG8gY29udHJvbGxlcl9vazsKKwkJCQorCQlpZiAoZS0+cmVnICYmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGUtPnJlZywgJnRtcCkgfHwKKwkJICAgICh0bXAgJiBlLT5tYXNrKSAhPSBlLT52YWwpKQorCQkJY29udGludWU7CS8qIHBvcnQgbm90IGVuYWJsZWQgKi8KK2NvbnRyb2xsZXJfb2s6CisKKwkJaWYgKGQtPmNoYW5uZWxzCTw9IHBvcnQpCisJCQlicmVhazsKKwkKKwkJaWYgKChod2lmID0gaWRlX2h3aWZfY29uZmlndXJlKGRldiwgZCwgbWF0ZSwgcG9ydCwgcGNpaXJxKSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNldHVwIHByb3BlciBhbmNlc3RyYWwgaW5mb3JtYXRpb24gKi8KKwkJaHdpZi0+Z2VuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCQlpZiAoaHdpZi0+Y2hhbm5lbCkgeworCQkJaW5kZXgtPmIuaGlnaCA9IGh3aWYtPmluZGV4OworCQl9IGVsc2UgeworCQkJaW5kZXgtPmIubG93ID0gaHdpZi0+aW5kZXg7CisJCX0KKworCQkKKwkJaWYgKGQtPmluaXRfaW9wcykKKwkJCWQtPmluaXRfaW9wcyhod2lmKTsKKworCQlpZiAoZC0+YXV0b2RtYSA9PSBOT0RNQSkKKwkJCWdvdG8gYnlwYXNzX2xlZ2FjeV9kbWE7CisKKwkJaWYoZC0+aW5pdF9zZXR1cF9kbWEpCisJCQlkLT5pbml0X3NldHVwX2RtYShkZXYsIGQsIGh3aWYpOworCQllbHNlCisJCQlpZGVfaHdpZl9zZXR1cF9kbWEoZGV2LCBkLCBod2lmKTsKK2J5cGFzc19sZWdhY3lfZG1hOgorCQlpZiAoZC0+aW5pdF9od2lmKQorCQkJLyogQ2FsbCBjaGlwc2V0LXNwZWNpZmljIHJvdXRpbmUKKwkJCSAqIGZvciBlYWNoIGVuYWJsZWQgaHdpZgorCQkJICovCisJCQlkLT5pbml0X2h3aWYoaHdpZik7CisKKwkJbWF0ZSA9IGh3aWY7CisJCWF0X2xlYXN0X29uZV9od2lmX2VuYWJsZWQgPSAxOworCX0KKwlpZiAoIWF0X2xlYXN0X29uZV9od2lmX2VuYWJsZWQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBuZWl0aGVyIElERSBwb3J0IGVuYWJsZWQgKEJJT1MpXG4iLCBkLT5uYW1lKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BjaV9zZXR1cF9wb3J0cyk7CisKKy8qCisgKiBpZGVfc2V0dXBfcGNpX2RldmljZSgpIGxvb2tzIGF0IHRoZSBwcmltYXJ5L3NlY29uZGFyeSBpbnRlcmZhY2VzCisgKiBvbiBhIFBDSSBJREUgZGV2aWNlIGFuZCwgaWYgdGhleSBhcmUgZW5hYmxlZCwgcHJlcGFyZXMgdGhlIElERSBkcml2ZXIKKyAqIGZvciB1c2Ugd2l0aCB0aGVtLiAgVGhpcyBnZW5lcmljIGNvZGUgd29ya3MgZm9yIG1vc3QgUENJIGNoaXBzZXRzLgorICoKKyAqIE9uZSB0aGluZyB0aGF0IGlzIG5vdCBzdGFuZGFyZGl6ZWQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQorICogcHJpbWFyeS9zZWNvbmRhcnkgaW50ZXJmYWNlICJlbmFibGUvZGlzYWJsZSIgYml0cy4gIEZvciBjaGlwc2V0cyB0aGF0CisgKiB3ZSAia25vdyIgYWJvdXQsIHRoaXMgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGlkZV9wY2lfZGV2aWNlX3Qgc3RydWN0OworICogZm9yIGFsbCBvdGhlciBjaGlwc2V0cywgd2UganVzdCBhc3N1bWUgYm90aCBpbnRlcmZhY2VzIGFyZSBlbmFibGVkLgorICovCitzdGF0aWMgaW50IGRvX2lkZV9zZXR1cF9wY2lfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQsCisJCQkJICAgYXRhX2luZGV4X3QgKmluZGV4LCB1OCBub2lzeSkKK3sKKwlzdGF0aWMgYXRhX2luZGV4X3QgYXRhX2luZGV4ID0geyAuYiA9IHsgLmxvdyA9IDB4ZmYsIC5oaWdoID0gMHhmZiB9IH07CisJaW50IHRyaWVkX2NvbmZpZyA9IDA7CisJaW50IHBjaWlycSwgcmV0OworCisJcmV0ID0gaWRlX3NldHVwX3BjaV9jb250cm9sbGVyKGRldiwgZCwgbm9pc3ksICZ0cmllZF9jb25maWcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ2FuIHdlIHRydXN0IHRoZSByZXBvcnRlZCBJUlE/CisJICovCisJcGNpaXJxID0gZGV2LT5pcnE7CisKKwkvKiBJcyBpdCBhbiAiSURFIHN0b3JhZ2UiIGRldmljZSBpbiBub24tUENJIG1vZGU/ICovCisJaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJiAoZGV2LT5jbGFzcyAmIDUpICE9IDUpIHsKKwkJaWYgKG5vaXN5KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vdCAxMDAlJSBuYXRpdmUgbW9kZTogIgorCQkJCSJ3aWxsIHByb2JlIGlycXMgbGF0ZXJcbiIsIGQtPm5hbWUpOworCQkvKgorCQkgKiBUaGlzIGFsbG93cyBvZmZib2FyZCBpZGUtcGNpIGNhcmRzIHRoZSBlbmFibGUgYSBCSU9TLAorCQkgKiB2ZXJpZnkgaW50ZXJydXB0IHNldHRpbmdzIG9mIHNwbGl0LW1pcnJvciBwY2ktY29uZmlnCisJCSAqIHNwYWNlLCBwbGFjZSBjaGlwc2V0IGludG8gaW5pdC1tb2RlLCBhbmQvb3IgcHJlc2VydmUKKwkJICogYW4gaW50ZXJydXB0IGlmIHRoZSBjYXJkIGlzIG5vdCBuYXRpdmUgaWRlIHN1cHBvcnQuCisJCSAqLworCQlyZXQgPSBkLT5pbml0X2NoaXBzZXQgPyBkLT5pbml0X2NoaXBzZXQoZGV2LCBkLT5uYW1lKSA6IDA7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXBjaWlycSA9IHJldDsKKwl9IGVsc2UgaWYgKHRyaWVkX2NvbmZpZykgeworCQlpZiAobm9pc3kpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogd2lsbCBwcm9iZSBpcnFzIGxhdGVyXG4iLCBkLT5uYW1lKTsKKwkJcGNpaXJxID0gMDsKKwl9IGVsc2UgaWYgKCFwY2lpcnEpIHsKKwkJaWYgKG5vaXN5KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJhZCBpcnEgKCVkKTogd2lsbCBwcm9iZSBsYXRlclxuIiwKKwkJCQlkLT5uYW1lLCBwY2lpcnEpOworCQlwY2lpcnEgPSAwOworCX0gZWxzZSB7CisJCWlmIChkLT5pbml0X2NoaXBzZXQpIHsKKwkJCXJldCA9IGQtPmluaXRfY2hpcHNldChkZXYsIGQtPm5hbWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKG5vaXN5KQorI2lmZGVmIF9fc3BhcmNfXworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDEwMCUlIG5hdGl2ZSBtb2RlIG9uIGlycSAlc1xuIiwKKwkJCSAgICAgICBkLT5uYW1lLCBfX2lycV9pdG9hKHBjaWlycSkpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAxMDAlJSBuYXRpdmUgbW9kZSBvbiBpcnEgJWRcbiIsCisJCQkJZC0+bmFtZSwgcGNpaXJxKTsKKyNlbmRpZgorCX0KKworCS8qIEZJWE1FOiBzaWxlbnQgZmFpbHVyZSBjYW4gaGFwcGVuICovCisKKwkqaW5kZXggPSBhdGFfaW5kZXg7CisJaWRlX3BjaV9zZXR1cF9wb3J0cyhkZXYsIGQsIHBjaWlycSwgaW5kZXgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBpZGVfc2V0dXBfcGNpX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQoreworCWF0YV9pbmRleF90IGluZGV4X2xpc3Q7CisJaW50IHJldDsKKworCXJldCA9IGRvX2lkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCwgJmluZGV4X2xpc3QsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmICgoaW5kZXhfbGlzdC5iLmxvdyAmIDB4ZjApICE9IDB4ZjApCisJCXByb2JlX2h3aWZfaW5pdF93aXRoX2ZpeHVwKCZpZGVfaHdpZnNbaW5kZXhfbGlzdC5iLmxvd10sIGQtPmZpeHVwKTsKKwlpZiAoKGluZGV4X2xpc3QuYi5oaWdoICYgMHhmMCkgIT0gMHhmMCkKKwkJcHJvYmVfaHdpZl9pbml0X3dpdGhfZml4dXAoJmlkZV9od2lmc1tpbmRleF9saXN0LmIuaGlnaF0sIGQtPmZpeHVwKTsKKworCWNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3NldHVwX3BjaV9kZXZpY2UpOworCitpbnQgaWRlX3NldHVwX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYxLCBzdHJ1Y3QgcGNpX2RldiAqZGV2MiwKKwkJCSAgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldltdID0geyBkZXYxLCBkZXYyIH07CisJYXRhX2luZGV4X3QgaW5kZXhfbGlzdFsyXTsKKwlpbnQgcmV0LCBpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlyZXQgPSBkb19pZGVfc2V0dXBfcGNpX2RldmljZShwZGV2W2ldLCBkLCBpbmRleF9saXN0ICsgaSwgIWkpOworCQkvKgorCQkgKiBGSVhNRTogTW9tLCBtb20sIHRoZXkgc3RvbGUgbWUgdGhlIGhlbHBlciBmdW5jdGlvbiB0byB1bmRvCisJCSAqIGRvX2lkZV9zZXR1cF9wY2lfZGV2aWNlKCkgb24gdGhlIGZpcnN0IGRldmljZSEKKwkJICovCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl1OCBpZHhbMl0gPSB7IGluZGV4X2xpc3RbaV0uYi5sb3csIGluZGV4X2xpc3RbaV0uYi5oaWdoIH07CisJCWludCBqOworCisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWlmICgoaWR4W2pdICYgMHhmMCkgIT0gMHhmMCkKKwkJCQlwcm9iZV9od2lmX2luaXQoaWRlX2h3aWZzICsgaWR4W2pdKTsKKwkJfQorCX0KKworCWNyZWF0ZV9wcm9jX2lkZV9pbnRlcmZhY2VzKCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3NldHVwX3BjaV9kZXZpY2VzKTsKKworLyoKKyAqCU1vZHVsZSBpbnRlcmZhY2VzCisgKi8KKyAKK3N0YXRpYyBpbnQgcHJlX2luaXQgPSAxOwkJLyogQmVmb3JlIGZpcnN0IG9yZGVyZWQgSURFIHNjYW4gKi8KK3N0YXRpYyBMSVNUX0hFQUQoaWRlX3BjaV9kcml2ZXJzKTsKKworLyoKKyAqCWlkZV9yZWdpc3Rlcl9wY2lfZHJpdmVyCQktCWF0dGFjaCBJREUgZHJpdmVyCisgKglAZHJpdmVyOiBwY2kgZHJpdmVyCisgKgorICoJUmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggdGhlIElERSBsYXllci4gVGhlIElERSBsYXllciBhcnJhbmdlcyB0aGF0CisgKglib290IHRpbWUgc2V0dXAgaXMgZG9uZSBpbiB0aGUgZXhwZWN0ZWQgZGV2aWNlIG9yZGVyIGFuZCB0aGVuIAorICoJaGFuZHMgdGhlIGNvbnRyb2xsZXJzIG9mZiB0byB0aGUgY29yZSBQQ0kgY29kZSB0byBkbyB0aGUgcmVzdCBvZgorICoJdGhlIHdvcmsuCisgKgorICoJVGhlIGRyaXZlcl9kYXRhIG9mIHRoZSBkcml2ZXIgdGFibGUgbXVzdCBwb2ludCB0byBhbiBpZGVfcGNpX2RldmljZV90CisgKglkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UuCisgKgorICoJUmV0dXJucyBhcmUgdGhlIHNhbWUgYXMgZm9yIHBjaV9yZWdpc3Rlcl9kcml2ZXIKKyAqLworCitpbnQgaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpZighcHJlX2luaXQpCisJCXJldHVybiBwY2lfbW9kdWxlX2luaXQoZHJpdmVyKTsKKwlsaXN0X2FkZF90YWlsKCZkcml2ZXItPm5vZGUsICZpZGVfcGNpX2RyaXZlcnMpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcik7CisKKy8qKgorICoJaWRlX3VucmVnaXN0ZXJfcGNpX2RyaXZlcgktCXVucmVnaXN0ZXIgYW4gSURFIGRyaXZlcgorICoJQGRyaXZlcjogZHJpdmVyIHRvIHJlbW92ZQorICoKKyAqCVVucmVnaXN0ZXIgYSBjdXJyZW50bHkgaW5zdGFsbGVkIElERSBkcml2ZXIuIFJldHVybnMgYXJlIHRoZSBzYW1lCisgKglhcyBmb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyCisgKi8KKyAKK3ZvaWQgaWRlX3BjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyKQoreworCWlmKCFwcmVfaW5pdCkKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7CisJZWxzZQorCQlsaXN0X2RlbCgmZHJpdmVyLT5ub2RlKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BjaV91bnJlZ2lzdGVyX2RyaXZlcik7CisKKy8qKgorICoJaWRlX3NjYW5fcGNpZGV2CQktCWZpbmQgYW4gSURFIGRyaXZlciBmb3IgYSBkZXZpY2UKKyAqCUBkZXY6IFBDSSBkZXZpY2UgdG8gY2hlY2sKKyAqCisgKglMb29rIGZvciBhbiBJREUgZHJpdmVyIHRvIGhhbmRsZSB0aGUgZGV2aWNlIHdlIGFyZSBjb25zaWRlcmluZy4KKyAqCVRoaXMgaXMgb25seSB1c2VkIGR1cmluZyBib290IHVwIHRvIGdldCB0aGUgb3JkZXJpbmcgY29ycmVjdC4gQWZ0ZXIKKyAqCWJvb3QgdXAgdGhlIHBjaSBsYXllciB0YWtlcyBvdmVyIHRoZSBqb2IuCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGlkZV9zY2FuX3BjaWRldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IHBjaV9kcml2ZXIgKmQ7CisJCisJbGlzdF9mb3JfZWFjaChsLCAmaWRlX3BjaV9kcml2ZXJzKQorCXsKKwkJZCA9IGxpc3RfZW50cnkobCwgc3RydWN0IHBjaV9kcml2ZXIsIG5vZGUpOworCQlpZihkLT5pZF90YWJsZSkKKwkJeworCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkID0gcGNpX21hdGNoX2RldmljZShkLT5pZF90YWJsZSwgZGV2KTsKKwkJCWlmKGlkICE9IE5VTEwpCisJCQl7CisJCQkJaWYoZC0+cHJvYmUoZGV2LCBpZCkgPj0gMCkKKwkJCQl7CisJCQkJCWRldi0+ZHJpdmVyID0gZDsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCWlkZV9zY2FuX3BjaWJ1cwkJLQlwZXJmb3JtIHRoZSBpbml0aWFsIElERSBkcml2ZXIgc2NhbgorICoJQHNjYW5fZGlyZWN0aW9uOiBzZXQgZm9yIHJldmVyc2Ugb3JkZXIgc2Nhbm5pbmcKKyAqCisgKglQZXJmb3JtIHRoZSBpbml0aWFsIGJ1cyByYXRoZXIgdGhhbiBkcml2ZXIgb3JkZXJlZCBzY2FuIG9mIHRoZQorICoJUENJIGRyaXZlcnMuIEFmdGVyIHRoaXMgYWxsIElERSBwY2kgaGFuZGxpbmcgYmVjb21lcyBzdGFuZGFyZAorICoJbW9kdWxlIG9yZGVyaW5nIG5vdCB0cmFkaXRpb25hbGx5IG9yZGVyZWQuCisgKi8KKyAJCit2b2lkIF9faW5pdCBpZGVfc2Nhbl9wY2lidXMgKGludCBzY2FuX2RpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKworCXByZV9pbml0ID0gMDsKKwlpZiAoIXNjYW5fZGlyZWN0aW9uKSB7CisJCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwkJCWlkZV9zY2FuX3BjaWRldihkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2VfcmV2ZXJzZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJCQlpZGVfc2Nhbl9wY2lkZXYoZGV2KTsKKwkJfQorCX0KKwkKKwkvKgorCSAqCUhhbmQgdGhlIGRyaXZlcnMgb3ZlciB0byB0aGUgUENJIGxheWVyIG5vdyB3ZQorCSAqCWFyZSBwb3N0IGluaXQuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJmlkZV9wY2lfZHJpdmVycykKKwl7CisJCWxpc3RfZGVsKGwpOworCQlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcGNpX2RyaXZlciwgbm9kZSk7CisJCXBjaV9yZWdpc3Rlcl9kcml2ZXIoZCk7CisJfQorfQo=