LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfZHJpdmVyLmMgJAogKiAkUmV2aXNpb246ICM5MSAkCiAqICREYXRlOiAyMDExLzEwLzI0ICQKICogJENoYW5nZTogMTg3MTE1OSAkCiAqCiAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAogKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcwogKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KICoKICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAogKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCiAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQogKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgogKgogKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKiBAZmlsZQogKiBUaGUgZHdjX290Z19kcml2ZXIgbW9kdWxlIHByb3ZpZGVzIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBlbnRyeQogKiBwb2ludHMgZm9yIHRoZSBEV0Nfb3RnIGRyaXZlci4gVGhpcyBtb2R1bGUgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YWxsZWQKICogYWZ0ZXIgTGludXggaXMgYm9vdGVkIHVzaW5nIHRoZSBpbnNtb2QgY29tbWFuZC4gV2hlbiB0aGUgbW9kdWxlIGlzCiAqIGluc3RhbGxlZCwgdGhlIGR3Y19vdGdfZHJpdmVyX2luaXQgZnVuY3Rpb24gaXMgY2FsbGVkLiBXaGVuIHRoZSBtb2R1bGUgaXMKICogcmVtb3ZlZCAodXNpbmcgcm1tb2QpLCB0aGUgZHdjX290Z19kcml2ZXJfY2xlYW51cCBmdW5jdGlvbiBpcyBjYWxsZWQuCiAqCiAqIFRoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyBhIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgZHdjX290Z19kcml2ZXIsIHdoaWNoIGlzCiAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgQVJNIGxtX2RldmljZSBzdHJ1Y3R1cmUuIFRoZXNlCiAqIHN0cnVjdHVyZXMgYWxsb3cgdGhlIE9URyBkcml2ZXIgdG8gY29tcGx5IHdpdGggdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlcgogKiBtb2RlbCBpbiB3aGljaCBkZXZpY2VzIGFuZCBkcml2ZXJzIGFyZSByZWdpc3RlcmVkIHdpdGggYSBidXMgZHJpdmVyLiBUaGlzCiAqIGhhcyB0aGUgYmVuZWZpdCB0aGF0IExpbnV4IGNhbiBleHBvc2UgYXR0cmlidXRlcyBvZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UKICogaW4gaXRzIHNwZWNpYWwgc3lzZnMgZmlsZSBzeXN0ZW0uIFVzZXJzIGNhbiB0aGVuIHJlYWQgb3Igd3JpdGUgZmlsZXMgaW4KICogdGhpcyBmaWxlIHN5c3RlbSB0byBwZXJmb3JtIGRpYWdub3N0aWNzIG9uIHRoZSBkcml2ZXIgY29tcG9uZW50cyBvciB0aGUKICogZGV2aWNlLgogKi8KCiNpbmNsdWRlICJkd2Nfb3RnX29zX2RlcC5oIgojaW5jbHVkZSAiZHdjX29zLmgiCiNpbmNsdWRlICJkd2Nfb3RnX2RiZy5oIgojaW5jbHVkZSAiZHdjX290Z19kcml2ZXIuaCIKI2luY2x1ZGUgImR3Y19vdGdfYXR0ci5oIgojaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCiNpbmNsdWRlICJkd2Nfb3RnX3BjZF9pZi5oIgojaW5jbHVkZSAiZHdjX290Z19oY2RfaWYuaCIKI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KCiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9wbS5oPgoKLyogVVNCIDMuMCBjbG9jayAqLwpzdGF0aWMgc3RydWN0IGNsayAqdXNiMl9jbGs7CgpleHRlcm4gdm9pZCBkd2Nfb3RnX2hvc3RfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpOwpleHRlcm4gdm9pZCBkd2Nfb3RnX2hvc3RfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCk7CgoKI2RlZmluZSBEV0NfRFJJVkVSX1ZFUlNJT04JIjIuOTRhIDI3LU9DVC0yMDExIgojZGVmaW5lIERXQ19EUklWRVJfREVTQwkJIkhTIE9URyBVU0IgQ29udHJvbGxlciBkcml2ZXIiCgpzdGF0aWMgY29uc3QgY2hhciBkd2NfZHJpdmVyX25hbWVbXSA9ICJkd2Nfb3RnIjsKCmV4dGVybiBpbnQgcGNkX2luaXQoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICk7CmV4dGVybiBpbnQgaGNkX2luaXQoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICk7CgpleHRlcm4gaW50IHBjZF9yZW1vdmUoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgICBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CiNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCSAgICAgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CiNlbmRpZgogICAgKTsKCmV4dGVybiB2b2lkIGhjZF9yZW1vdmUoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApOwoKZXh0ZXJuIHZvaWQgZHdjX290Z19hZHBfc3RhcnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50OF90IGlzX2hvc3QpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogRW5jYXBzdWxhdGUgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgc2V0dGluZ3MgKi8KCnN0cnVjdCBkd2Nfb3RnX2RyaXZlcl9tb2R1bGVfcGFyYW1zIHsKCWludDMyX3Qgb3B0OwoJaW50MzJfdCBvdGdfY2FwOwoJaW50MzJfdCBkbWFfZW5hYmxlOwoJaW50MzJfdCBkbWFfZGVzY19lbmFibGU7CglpbnQzMl90IGRtYV9idXJzdF9zaXplOwoJaW50MzJfdCBzcGVlZDsKCWludDMyX3QgaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcjsKCWludDMyX3QgaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsazsKCWludDMyX3QgZW5hYmxlX2R5bmFtaWNfZmlmbzsKCWludDMyX3QgZGF0YV9maWZvX3NpemU7CglpbnQzMl90IGRldl9yeF9maWZvX3NpemU7CglpbnQzMl90IGRldl9ucGVyaW9fdHhfZmlmb19zaXplOwoJdWludDMyX3QgZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVtNQVhfUEVSSU9fRklGT1NdOwoJaW50MzJfdCBob3N0X3J4X2ZpZm9fc2l6ZTsKCWludDMyX3QgaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplOwoJaW50MzJfdCBob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZTsKCWludDMyX3QgbWF4X3RyYW5zZmVyX3NpemU7CglpbnQzMl90IG1heF9wYWNrZXRfY291bnQ7CglpbnQzMl90IGhvc3RfY2hhbm5lbHM7CglpbnQzMl90IGRldl9lbmRwb2ludHM7CglpbnQzMl90IHBoeV90eXBlOwoJaW50MzJfdCBwaHlfdXRtaV93aWR0aDsKCWludDMyX3QgcGh5X3VscGlfZGRyOwoJaW50MzJfdCBwaHlfdWxwaV9leHRfdmJ1czsKCWludDMyX3QgaTJjX2VuYWJsZTsKCWludDMyX3QgdWxwaV9mc19sczsKCWludDMyX3QgdHNfZGxpbmU7CglpbnQzMl90IGVuX211bHRpcGxlX3R4X2ZpZm87Cgl1aW50MzJfdCBkZXZfdHhfZmlmb19zaXplW01BWF9UWF9GSUZPU107Cgl1aW50MzJfdCB0aHJfY3RsOwoJdWludDMyX3QgdHhfdGhyX2xlbmd0aDsKCXVpbnQzMl90IHJ4X3Rocl9sZW5ndGg7CglpbnQzMl90IHB0aV9lbmFibGU7CglpbnQzMl90IG1waV9lbmFibGU7CglpbnQzMl90IGxwbV9lbmFibGU7CglpbnQzMl90IGljX3VzYl9jYXA7CglpbnQzMl90IGFoYl90aHJfcmF0aW87CglpbnQzMl90IHBvd2VyX2Rvd247CglpbnQzMl90IHJlbG9hZF9jdGw7CglpbnQzMl90IGRldl9vdXRfbmFrOwoJaW50MzJfdCBjb250X29uX2JuYTsKCWludDMyX3QgYWhiX3NpbmdsZTsKCWludDMyX3Qgb3RnX3ZlcjsKCWludDMyX3QgYWRwX2VuYWJsZTsKfTsKCnN0YXRpYyBzdHJ1Y3QgZHdjX290Z19kcml2ZXJfbW9kdWxlX3BhcmFtcyBkd2Nfb3RnX21vZHVsZV9wYXJhbXMgPSB7Cgkub3B0ID0gLTEsCgkub3RnX2NhcCA9IC0xLAoJLmRtYV9lbmFibGUgPSAtMSwKCS5kbWFfZGVzY19lbmFibGUgPSAtMSwKCS5kbWFfYnVyc3Rfc2l6ZSA9IC0xLAoJLnNwZWVkID0gLTEsCgkuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciA9IC0xLAoJLmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsgPSAtMSwKCS5lbmFibGVfZHluYW1pY19maWZvID0gLTEsCgkuZGF0YV9maWZvX3NpemUgPSAtMSwKCS5kZXZfcnhfZmlmb19zaXplID0gLTEsCgkuZGV2X25wZXJpb190eF9maWZvX3NpemUgPSAtMSwKCS5kZXZfcGVyaW9fdHhfZmlmb19zaXplID0gewoJCQkJICAgLyogZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xICovCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEKCQkJCSAgIC8qIDE1ICovCgkJCQkgICB9LAoJLmhvc3RfcnhfZmlmb19zaXplID0gLTEsCgkuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplID0gLTEsCgkuaG9zdF9wZXJpb190eF9maWZvX3NpemUgPSAtMSwKCS5tYXhfdHJhbnNmZXJfc2l6ZSA9IC0xLAoJLm1heF9wYWNrZXRfY291bnQgPSAtMSwKCS5ob3N0X2NoYW5uZWxzID0gLTEsCgkuZGV2X2VuZHBvaW50cyA9IC0xLAoJLnBoeV90eXBlID0gLTEsCgkucGh5X3V0bWlfd2lkdGggPSAtMSwKCS5waHlfdWxwaV9kZHIgPSAtMSwKCS5waHlfdWxwaV9leHRfdmJ1cyA9IC0xLAoJLmkyY19lbmFibGUgPSAtMSwKCS51bHBpX2ZzX2xzID0gLTEsCgkudHNfZGxpbmUgPSAtMSwKCS5lbl9tdWx0aXBsZV90eF9maWZvID0gLTEsCgkuZGV2X3R4X2ZpZm9fc2l6ZSA9IHsKCQkJICAgICAvKiBkZXZfdHhfZmlmb19zaXplICovCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEsCgkJCSAgICAgLTEKCQkJICAgICAvKiAxNSAqLwoJCQkgICAgIH0sCgkudGhyX2N0bCA9IC0xLAoJLnR4X3Rocl9sZW5ndGggPSAtMSwKCS5yeF90aHJfbGVuZ3RoID0gLTEsCgkucHRpX2VuYWJsZSA9IC0xLAoJLm1waV9lbmFibGUgPSAtMSwKCS5scG1fZW5hYmxlID0gLTEsCgkuaWNfdXNiX2NhcCA9IC0xLAoJLmFoYl90aHJfcmF0aW8gPSAtMSwKCS5wb3dlcl9kb3duID0gLTEsCgkucmVsb2FkX2N0bCA9IC0xLAoJLmRldl9vdXRfbmFrID0gLTEsCgkuY29udF9vbl9ibmEgPSAtMSwKCS5haGJfc2luZ2xlID0gLTEsCgkub3RnX3ZlciA9IC0xLAoJLmFkcF9lbmFibGUgPSAtMSwKfTsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIHNob3dzIHRoZSBEcml2ZXIgVmVyc2lvbi4KICovCnN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGV2LCBjaGFyICpidWYpCnsKCXJldHVybiBzbnByaW50ZihidWYsIHNpemVvZihEV0NfRFJJVkVSX1ZFUlNJT04pICsgMiwgIiVzXG4iLAoJCQlEV0NfRFJJVkVSX1ZFUlNJT04pOwp9CgpzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKCi8qKgogKiBHbG9iYWwgRGVidWcgTGV2ZWwgTWFzay4KICovCnVpbnQzMl90IGdfZGJnX2x2bCA9IDA7CQkvKiBPRkYgKi8KCi8qKgogKiBUaGlzIGZ1bmN0aW9uIHNob3dzIHRoZSBkcml2ZXIgRGVidWcgTGV2ZWwuCiAqLwpzdGF0aWMgc3NpemVfdCBkYmdfbGV2ZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjaGFyICpidWYpCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTB4XG4iLCBnX2RiZ19sdmwpOwp9CgovKioKICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIGRyaXZlciBEZWJ1ZyBMZXZlbC4KICovCnN0YXRpYyBzc2l6ZV90IGRiZ19sZXZlbF9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsCgkJCSAgICAgICBzaXplX3QgY291bnQpCnsKCWdfZGJnX2x2bCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgRFJJVkVSX0FUVFIoZGVidWdsZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsIGRiZ19sZXZlbF9zaG93LAoJCSAgIGRiZ19sZXZlbF9zdG9yZSk7CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIG1vZHVsZSBpbnRpYWxpemF0aW9uCiAqIHRvIHBhc3MgbW9kdWxlIHBhcmFtZXRlcnMgdG8gdGhlIERXQ19PVEcgQ09SRS4KICovCnN0YXRpYyBpbnQgc2V0X3BhcmFtZXRlcnMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQp7CglpbnQgcmV0dmFsID0gMDsKCWludCBpOwoKCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX2NhcCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9vdGdfY2FwKGNvcmVfaWYsCgkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXApOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIGRtYV9lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfZGVzY19lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZG1hX2Rlc2NfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICAgZG1hX2Rlc2NfZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3B0ICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX29wdChjb3JlX2lmLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3B0KTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2J1cnN0X3NpemUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZG1hX2J1cnN0X3NpemUoY29yZV9pZiwKCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICAgZG1hX2J1cnN0X3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIoY29yZV9pZiwKCQkJCQkJCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkJICAgaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcik7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuYWJsZV9keW5hbWljX2ZpZm8gIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZW5hYmxlX2R5bmFtaWNfZmlmbyhjb3JlX2lmLAoJCQkJCQkJICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkgIGVuYWJsZV9keW5hbWljX2ZpZm8pOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kYXRhX2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kYXRhX2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICBkYXRhX2ZpZm9fc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9yeF9maWZvX3NpemUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGV2X3J4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgICAgZGV2X3J4X2ZpZm9fc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9ucGVyaW9fdHhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9ucGVyaW9fdHhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkgICAgICBkZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfcnhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9yeF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X25wZXJpb190eF9maWZvX3NpemUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1faG9zdF9ucGVyaW9fdHhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICAgICAgIGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcGVyaW9fdHhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfcGVyaW9fdHhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkgICAgICBob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm1heF90cmFuc2Zlcl9zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21heF90cmFuc2Zlcl9zaXplKGNvcmVfaWYsCgkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQltYXhfdHJhbnNmZXJfc2l6ZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm1heF9wYWNrZXRfY291bnQgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fbWF4X3BhY2tldF9jb3VudChjb3JlX2lmLAoJCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgICAgbWF4X3BhY2tldF9jb3VudCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfY2hhbm5lbHMgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1faG9zdF9jaGFubmVscyhjb3JlX2lmLAoJCQkJCQkgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgaG9zdF9jaGFubmVscyk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9lbmRwb2ludHMgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGV2X2VuZHBvaW50cyhjb3JlX2lmLAoJCQkJCQkgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgZGV2X2VuZHBvaW50cyk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV90eXBlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3BoeV90eXBlKGNvcmVfaWYsCgkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdHlwZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnNwZWVkICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3NwZWVkKGNvcmVfaWYsCgkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5zcGVlZCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1faG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsayhjb3JlX2lmLAoJCQkJCQkJCWR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJCQlob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZGRyICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91bHBpX2Rkcihjb3JlX2lmLAoJCQkJCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgIHBoeV91bHBpX2Rkcik7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2V4dF92YnVzICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91bHBpX2V4dF92YnVzKGNvcmVfaWYsCgkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQlwaHlfdWxwaV9leHRfdmJ1cyk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91dG1pX3dpZHRoICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91dG1pX3dpZHRoKGNvcmVfaWYsCgkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgIHBoeV91dG1pX3dpZHRoKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudWxwaV9mc19scyAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV91bHBpX2ZzX2xzKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudWxwaV9mc19scyk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnRzX2RsaW5lICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3RzX2RsaW5lKGNvcmVfaWYsCgkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50c19kbGluZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmkyY19lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1faTJjX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgaTJjX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuX211bHRpcGxlX3R4X2ZpZm8gIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZW5fbXVsdGlwbGVfdHhfZmlmbyhjb3JlX2lmLAoJCQkJCQkJICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkgIGVuX211bHRpcGxlX3R4X2ZpZm8pOwoJfQoKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKCQlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbaV0gIT0gLTEpIHsKCQkJcmV0dmFsICs9CgkJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcGVyaW9fdHhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkJICAgICBkZXZfcGVyaW9fdHhfZmlmb19zaXplCgkJCQkJCQkJICAgICBbaV0sIGkpOwoJCX0KCX0KCglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplW2ldICE9IC0xKSB7CgkJCXJldHZhbCArPSBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfdHhfZmlmb19zaXplKGNvcmVfaWYsCgkJCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkJICAgICBkZXZfdHhfZmlmb19zaXplCgkJCQkJCQkJICAgICBbaV0sIGkpOwoJCX0KCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudGhyX2N0bCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV90aHJfY3RsKGNvcmVfaWYsCgkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLnRocl9jdGwpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tcGlfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21waV9lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIG1waV9lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wdGlfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3B0aV9lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIHB0aV9lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5scG1fZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2xwbV9lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIGxwbV9lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5pY191c2JfY2FwICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2ljX3VzYl9jYXAoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIGljX3VzYl9jYXApOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50eF90aHJfbGVuZ3RoICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3R4X3Rocl9sZW5ndGgoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50eF90aHJfbGVuZ3RoKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucnhfdGhyX2xlbmd0aCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9yeF90aHJfbGVuZ3RoKGNvcmVfaWYsCgkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICByeF90aHJfbGVuZ3RoKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3Rocl9yYXRpbyAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9haGJfdGhyX3JhdGlvKGNvcmVfaWYsCgkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3Rocl9yYXRpbyk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBvd2VyX2Rvd24gIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcG93ZXJfZG93bihjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBvd2VyX2Rvd24pOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yZWxvYWRfY3RsICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3JlbG9hZF9jdGwoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yZWxvYWRfY3RsKTsKCX0KCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9vdXRfbmFrICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJCWR3Y19vdGdfc2V0X3BhcmFtX2Rldl9vdXRfbmFrKGNvcmVfaWYsCgkJCWR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfb3V0X25hayk7Cgl9CgoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5jb250X29uX2JuYSAhPSAtMSkgewoJCXJldHZhbCArPQoJCQlkd2Nfb3RnX3NldF9wYXJhbV9jb250X29uX2JuYShjb3JlX2lmLAoJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuY29udF9vbl9ibmEpOwoJfQoKCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3NpbmdsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCQlkd2Nfb3RnX3NldF9wYXJhbV9haGJfc2luZ2xlKGNvcmVfaWYsCgkJCWR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfc2luZ2xlKTsKCX0KCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z192ZXIgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fb3RnX3Zlcihjb3JlX2lmLAoJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfdmVyKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWRwX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9hZHBfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBhZHBfZW5hYmxlKTsKCX0KCXJldHVybiByZXR2YWw7Cn0KCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIFVTQiAyIFBIWQogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fdXNiMl9waHlfaW5pdCh2b2lkKQp7CgkJdWludDMyX3QgcmRfZGF0YTsKCiNkZWZpbmUgQ09NQ0VSVE9fVVNCMF9QSFlfQ1RSTF9SRUcwIAkoQ09NQ0VSVE9fRFdDMV9DRkdfQkFTRSArIDB4MDAwKQojZGVmaW5lIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGIAkJKFVTQjJfUEhZX0JBU0UgKyAweDAzQykKCgoJCS8qIHRha2UgZGV2aWNlIG91dCBvZiByZXNldCAsIGVuYWJsZSBjbG9jay4gKi8KCQkvKiBQcm9ncmFtbWluZyB0aGUgVVNCMCBQSFkgQ09OVFJPTCBSRUdJU1RFUiAqLwoJCS8qCUJpdFsyXTp1c2IwX3ZidXN2bGRleHRzZWwgLSBUaGUgaW50ZXJuYWwgU2Vzc2lvbiBWYWxpZCBjb21wYXJhdG9yIGlzIHVzZWQuCgkJICogQml0WzNdOnVzYjBfdmJ1c3ZsZGV4dCAtIFRoZSBWQlVTIHNpZ25hbCBpcyBub3QgdmFsaWQsIGFuZCB0aGUgcHVsbC11cCByZXNpc3RvciBvbiBEKyBpcyBkaXNhYmxlZC4KCQkgKiBCaXRbNF06dXNiMF9vdGdkaXNhYmxlICAtIFRUaGUgT1RHIGJsb2NrIGlzIHBvd2VyZWQgdXAuCgkJICogQml0WzE3OjE2XTp1c2IwX3JlZmNsa2RpdiAtIFJlZmVyZW5jZSBDbG9jayBGcmVxdWVuY3kgU2VsZWN0LCA0OCBNSHoKCQkgKiBCaXRbMjE6MjBdOnVzYjBfcmVmY2xrc2VsIC0gVGhlIFhPIGJsb2NrIHVzZXMgYW4gZXh0ZXJuYWwsIDIuNSBWIGNsb2NrIHN1cHBsaWVkIG9uIHRoZSBYTyBwaW4uCgkJICovCgkJaWYoSEFMX2dldF9yZWZfY2xrKCkgPT0gUkVGX0NMS18yNE1IWikKCQkJd3JpdGVsKDB4MDAyMTAwMDAsIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCk7ICAvLzI0TUh6IHJlZiBjbGsKCQllbHNlCgkJCXdyaXRlbCgweDAwMjIwMDAwLCBDT01DRVJUT19VU0IwX1BIWV9DVFJMX1JFRzApOyAgLy80OE1IeiByZWYgY2xrCgoJCS8qIFByb2dyYW1taW5nIHRoZSBJRFNFTCB2YWx1ZXMgdG8gVVNCIDIuMCBDb250cm9sbGVyIEAgRFdDX0NGR19SRUdGIHJlZ2lzdGVyICovCgkJLyogQ29uZmlndXJpbmcgdGhlIHVzYjIgY29udHJvbGxlciB0byBzZWxlY3QgdGhlIElEIHZhbHVlIGZyb20gcmVnaXN0ZXIgKi8KCQlyZF9kYXRhID0gcmVhZGwoQ09NQ0VSVE9fVVNCMF9EV0NfQ0ZHX1JFR0YpOwoKCQkvKglCaXRbOF06dXNiMF9pZF9zZWwgLSBTZWxlY3RzIGZyb20gdGhlIHJlZ2lzdGVyIGJpdAoJCSAqCUJpdFs5XTp1c2IxX2lkX3NlbCAtIFNlbGVjdHMgZnJvbSB0aGUgcmVnaXN0ZXIgYml0CgkJICovCgkJcmRfZGF0YSA9ICgocmRfZGF0YSAmIDB4RkZGRjExRkYpfCAweDAwMDAxMTAwKTsgIC8vRm9yIEhvc3QgbW9kZS4KCQl3cml0ZWwgKHJkX2RhdGEsIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKCgoJCS8qIFByb2dyYW1taW5nIFVTQjIuMCBjb250cm9sbGVyIHdpdGggc2NhbGUgZG93biB2YWx1ZS4gKi8KCQkvKiBDb25maWd1cmluZyB0aGUgdXNiMiBjb250cm9sbGVyIGluIHNjYWxlZG93biBkaXNhYmxlIG1vZGUgKi8KCQlyZF9kYXRhID0gcmVhZGwoQ09NQ0VSVE9fVVNCMF9EV0NfQ0ZHX1JFR0YpOwoJCXJkX2RhdGEgPSAoKHJkX2RhdGEgJiAweEZGRkZGRkYwKXwgMHgwKTsKCQl3cml0ZWwgKHJkX2RhdGEsIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKfQoKCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIER3YyBPVEcgQ29udHJvbGxlcgogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fc3RhcnRfZHdjX290Zyh2b2lkKQp7CgkvKiBHZXQgdGhlIEZBU1QtVUFSVCBjbGsgc3RydWN0dXJlIGZyb20gRFVTICxUbyBiZSB1c2VkIGZvciBVQVJUMC9VQVJUMSBpbml0aWxpemF0aW9uICovCgl1c2IyX2NsayA9IGNsa19nZXQoTlVMTCwidXNiMCIpOwoKCS8qIEVuYWJsZSB0aGUgQ2xvY2sgKi8KCWlmIChjbGtfZW5hYmxlKHVzYjJfY2xrKSl7CgkJcHJfZXJyKCJjb21jZXJ0b19zdGFydF9kd2Nfb3RnOlVuYWJsZSB0byBlbmFibGUgdGhlIHVzYjIgY2xvY2sgXG4iKTsKCX0KCgkvKiBVU0IgMi4wIFBIWSBJbml0aWFsaXphdGlvbiAqLwoJY29tY2VydG9fdXNiMl9waHlfaW5pdCgpOwoKCS8qIENvbnRpbnVpbmcgcmVzZXRzIG9uIHVzYjIgY29udHJvbGxlcitwaHkgYmxvY2tzICovCgoJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgVVRNSSAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMCwgMSk7CgoJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgUEhZICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVNCMF9QSFksIDEpOwoKCS8qIEFQTExZSU5HIFJFU0VUIFRPIFVTQjIgQVhJIFJFU0VUICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjAsIDEpOwoKCS8qIFJlbGVhc2luZyB0aGUgKFBPUikgUG93ZXIgb24gUmVzZXQgdG8gdXNiMiBuYW5vIHBoeSBibG9jayAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAwKTsKCgkvKiBSZWxlYXNpbmcgdGhlIFVUTUkgUmVzZXQgdG8gdXNiMiBjb250cm9sbGVyIGJsb2NrICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVRNSV9VU0IwLCAwKTsKCgkvKiBSZWxlYXNpbmcgdGhlIEFIQiBSZXNldCB0byB1c2IyIGNvbnRyb2xsZXIgYmxvY2sgLS0gQml0WzRdLVVTQjMsQml0WzNdLVVTQjIgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfVVNCMCwgMCk7Cn0KCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgU2h1dGRvd24gZm9yIER3YyBPVEcgQ29udHJvbGxlcgogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fc3RvcF9kd2Nfb3RnKHZvaWQpCnsKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFVUTUkgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VVE1JX1VTQjAsIDEpOwoKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFBIWSAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAxKTsKCgkvKiBBUExMWUlORyBSRVNFVCBUTyBVU0IyIEFYSSBSRVNFVCAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9VU0IwLCAxKTsKCgkvKiBEaXNhYmxlIHRoZSBDbG9jayAqLwoJY2xrX2Rpc2FibGUodXNiMl9jbGspOwoKCS8qIFJlbGVhc2UgdGhlIGNsb2NrICovCgljbGtfcHV0KHVzYjJfY2xrKTsKfQoKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSB0b3AgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDb21tb24KICogKERldmljZSBhbmQgaG9zdCBtb2RlcykgaW50ZXJydXB0cy4KICovCnN0YXRpYyBpcnFyZXR1cm5fdCBkd2Nfb3RnX2NvbW1vbl9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQp7CglpbnQzMl90IHJldHZhbCA9IElSUV9OT05FOwoKCXJldHZhbCA9IGR3Y19vdGdfaGFuZGxlX2NvbW1vbl9pbnRyKGRldik7CglpZiAocmV0dmFsICE9IDApIHsKCQlTM0MyNDEwWF9DTEVBUl9FSU5UUEVORCgpOwoJfQoJcmV0dXJuIElSUV9SRVRWQUwocmV0dmFsKTsKfQoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBsbV9kZXZpY2UgaXMgdW5yZWdpc3RlcmVkIHdpdGggdGhlCiAqIGR3Y19vdGdfZHJpdmVyLiBUaGlzIGhhcHBlbnMsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBybW1vZCBjb21tYW5kIGlzCiAqIGV4ZWN1dGVkLiBUaGUgZGV2aWNlIG1heSBvciBtYXkgbm90IGJlIGVsZWN0cmljYWxseSBwcmVzZW50LiBJZiBpdCBpcwogKiBwcmVzZW50LCB0aGUgZHJpdmVyIHN0b3BzIGRldmljZSBwcm9jZXNzaW5nLiBBbnkgcmVzb3VyY2VzIHVzZWQgb24gYmVoYWxmCiAqIG9mIHRoaXMgZGV2aWNlIGFyZSBmcmVlZC4KICoKICogQHBhcmFtIF9kZXYKICovCnN0YXRpYyB2b2lkIGR3Y19vdGdfZHJpdmVyX3JlbW92ZSgKI2lmZGVmIExNX0lOVEVSRkFDRQoJCQkJCSBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCQkJCQkgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCQkgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICkKewojaWZkZWYgTE1fSU5URVJGQUNFCglkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEoX2Rldik7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwY2lfZ2V0X2RydmRhdGEoX2Rldik7CiNlbHNlCglkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoX2Rldik7CiNlbmRpZgoKCURXQ19ERUJVR1BMKERCR19BTlksICIlcyglcClcbiIsIF9fZnVuY19fLCBfZGV2KTsKCglpZiAoIW90Z19kZXYpIHsKCQkvKiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGR3Y19vdGdfZGV2aWNlIGZhaWxlZC4gKi8KCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYgTlVMTCFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm47Cgl9CiNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCglpZiAob3RnX2Rldi0+aGNkKSB7CgkJaGNkX3JlbW92ZShfZGV2KTsKCX0gZWxzZSB7CgkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2LT5oY2QgTlVMTCFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm47Cgl9CiNlbmRpZgoKI2lmbmRlZiBEV0NfSE9TVF9PTkxZCglpZiAob3RnX2Rldi0+cGNkKSB7CgkJcGNkX3JlbW92ZShfZGV2KTsKCX0gZWxzZSB7CgkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2LT5wY2QgTlVMTCFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm47Cgl9CiNlbmRpZgoJLyoKCSAqIEZyZWUgdGhlIElSUQoJICovCglpZiAob3RnX2Rldi0+Y29tbW9uX2lycV9pbnN0YWxsZWQpIHsKCQlmcmVlX2lycShvdGdfZGV2LT5pcnEsIG90Z19kZXYpOwoJfSBlbHNlIHsKCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IFRoZXJlIGlzIG5vIGluc3RhbGxlZCBpcnEhXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoKCWlmIChvdGdfZGV2LT5jb3JlX2lmKSB7CgkJZHdjX290Z19jaWxfcmVtb3ZlKG90Z19kZXYtPmNvcmVfaWYpOwoJfSBlbHNlIHsKCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYtPmNvcmVfaWYgTlVMTCFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm47Cgl9CgoJLyoKCSAqIFJlbW92ZSB0aGUgZGV2aWNlIGF0dHJpYnV0ZXMKCSAqLwoJZHdjX290Z19hdHRyX3JlbW92ZShfZGV2KTsKCgkvKgoJICogUmV0dXJuIHRoZSBtZW1vcnkuCgkgKi8KCWlmIChvdGdfZGV2LT5vc19kZXAuYmFzZSkgewoJCWlvdW5tYXAob3RnX2Rldi0+b3NfZGVwLmJhc2UpOwoJfQoKCS8qIERvIHRoZSBQbGF0Zm9ybSBzcGVjaWZpYyBzaHV0ZG93biAqLwoJY29tY2VydG9fc3RvcF9kd2Nfb3RnKCk7CgoJRFdDX0ZSRUUob3RnX2Rldik7CgoJLyoKCSAqIENsZWFyIHRoZSBkcnZkYXRhIHBvaW50ZXIuCgkgKi8KI2lmZGVmIExNX0lOVEVSRkFDRQoJbG1fc2V0X2RydmRhdGEoX2RldiwgMCk7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihvdGdfZGV2LT5vc19kZXAucnNyY19zdGFydCwgb3RnX2Rldi0+b3NfZGVwLnJzcmNfbGVuKTsKCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCAwKTsKI2Vsc2UKCXBsYXRmb3JtX3NldF9kcnZkYXRhKF9kZXYsIDApOwojZW5kaWYKfQoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gbG1fZGV2aWNlIGlzIGJvdW5kIHRvIGEKICogZHdjX290Z19kcml2ZXIuIEl0IGNyZWF0ZXMgdGhlIGRyaXZlciBjb21wb25lbnRzIHJlcXVpcmVkIHRvCiAqIGNvbnRyb2wgdGhlIGRldmljZSAoQ0lMLCBIQ0QsIGFuZCBQQ0QpIGFuZCBpdCBpbml0aWFsaXplcyB0aGUKICogZGV2aWNlLiBUaGUgZHJpdmVyIGNvbXBvbmVudHMgYXJlIHN0b3JlZCBpbiBhIGR3Y19vdGdfZGV2aWNlCiAqIHN0cnVjdHVyZS4gQSByZWZlcmVuY2UgdG8gdGhlIGR3Y19vdGdfZGV2aWNlIGlzIHNhdmVkIGluIHRoZQogKiBsbV9kZXZpY2UuIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gYWNjZXNzIHRoZSBkd2Nfb3RnX2RldmljZQogKiBzdHJ1Y3R1cmUgb24gc3Vic2VxdWVudCBjYWxscyB0byBkcml2ZXIgbWV0aG9kcyBmb3IgdGhpcyBkZXZpY2UuCiAqCiAqIEBwYXJhbSBfZGV2IEJ1cyBkZXZpY2UKICovCnN0YXRpYyBpbnQgZHdjX290Z19kcml2ZXJfcHJvYmUoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJCSAgICAgICBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqX2RldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQKI2Vsc2UKCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICkKewoJaW50IHJldHZhbCA9IDA7Cglkd2Nfb3RnX2RldmljZV90ICpkd2Nfb3RnX2RldmljZTsKCglkZXZfZGJnKCZfZGV2LT5kZXYsICJkd2Nfb3RnX2RyaXZlcl9wcm9iZSglcClcbiIsIF9kZXYpOwojaWZkZWYgTE1fSU5URVJGQUNFCglkZXZfZGJnKCZfZGV2LT5kZXYsICJzdGFydD0weCUwOHhcbiIsICh1bnNpZ25lZClfZGV2LT5yZXNvdXJjZS5zdGFydCk7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCWlmICghaWQpIHsKCQlEV0NfRVJST1IoIkludmFsaWQgcGNpX2RldmljZV9pZCAlcCIsIGlkKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglpZiAoIV9kZXYgfHwgKHBjaV9lbmFibGVfZGV2aWNlKF9kZXYpIDwgMCkpIHsKCQlEV0NfRVJST1IoIkludmFsaWQgcGNpX2RldmljZSAlcCIsIF9kZXYpOwoJCXJldHVybiAtRU5PREVWOwoJfQoJZGV2X2RiZygmX2Rldi0+ZGV2LCAic3RhcnQ9MHglMDh4XG4iLCAodW5zaWduZWQpcGNpX3Jlc291cmNlX3N0YXJ0KF9kZXYsMCkpOwoJLyogb3RoZXIgc3R1ZmYgbmVlZGVkIGFzIHdlbGw/ICovCiNlbHNlCglkZXZfZGJnKCZfZGV2LT5kZXYsICJzdGFydD0weCUwOHhcbiIsICh1bnNpZ25lZClfZGV2LT5yZXNvdXJjZS0+c3RhcnQpOwojZW5kaWYKCglkd2Nfb3RnX2RldmljZSA9IERXQ19BTExPQyhzaXplb2YoZHdjX290Z19kZXZpY2VfdCkpOwoKCWlmICghZHdjX290Z19kZXZpY2UpIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJrbWFsbG9jIG9mIGR3Y19vdGdfZGV2aWNlIGZhaWxlZFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0KGR3Y19vdGdfZGV2aWNlLCAwLCBzaXplb2YoKmR3Y19vdGdfZGV2aWNlKSk7Cglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJlZ19vZmZzZXQgPSAweEZGRkZGRkZGOwoKCS8qIFBsYXRmb3JtIFNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCgljb21jZXJ0b19zdGFydF9kd2Nfb3RnKCk7CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5wYXJlbnQ9ICZfZGV2LT5kZXY7CgoJLyoKCSAqIE1hcCB0aGUgRFdDX290ZyBDb3JlIG1lbW9yeSBpbnRvIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KCSAqLwojaWZkZWYgTE1fSU5URVJGQUNFCglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UgPSBpb3JlbWFwKF9kZXYtPnJlc291cmNlLnN0YXJ0LCBTWl8yNTZLKTsKCglpZiAoIWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgImlvcmVtYXAoKSBmYWlsZWRcbiIpOwoJCURXQ19GUkVFKGR3Y19vdGdfZGV2aWNlKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgImJhc2U9MHglMDh4XG4iLAoJCSh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglfZGV2LT5jdXJyZW50X3N0YXRlID0gUENJX0QwOwoJX2Rldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKCglpZiAoIV9kZXYtPmlycSkgewoJCURXQ19FUlJPUigiRm91bmQgSEMgd2l0aCBubyBJUlEuIENoZWNrIEJJT1MvUENJICVzIHNldHVwISIsCgkJCSAgcGNpX25hbWUoX2RldikpOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KF9kZXYsIDApOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oX2RldiwgMCk7CglEV0NfREVCVUdQTChEQkdfQU5ZLCAiUENJIHJlc291cmNlOiBzdGFydD0lMDh4LCBsZW49JTA4eFxuIiwKCQkgICAgKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQkgICAgKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOwoJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24KCSAgICAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0LCBkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfbGVuLAoJICAgICAiZHdjX290ZyIpKSB7CgkJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBtZW1vcnlcbiIpOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID0KCSAgICBpb3JlbWFwX25vY2FjaGUoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0LAoJCQkgICAgZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbik7CglpZiAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID09IE5VTEwpIHsKCQlkZXZfZGJnKCZfZGV2LT5kZXYsICJlcnJvciBtYXBwaW5nIG1lbW9yeVxuIik7CgkJcmVsZWFzZV9tZW1fcmVnaW9uKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQkJCSAgIGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGJlZm9yZSBhZGp1c3QpIFxuIiwKCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID0gKGNoYXIgKilkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2U7CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGFmdGVyIGFkanVzdCkgXG4iLAoJCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CglkZXZfZGJnKCZfZGV2LT5kZXYsICIlczogbWFwcGVkIFBBIDB4JXggdG8gVkEgMHglcFxuIiwgX19mdW5jX18sCgkJKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoKCXBjaV9zZXRfbWFzdGVyKF9kZXYpOwoJcGNpX3NldF9kcnZkYXRhKF9kZXYsIGR3Y19vdGdfZGV2aWNlKTsKI2Vsc2UKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9IGlvcmVtYXAoX2Rldi0+cmVzb3VyY2UtPnN0YXJ0LCBTWl8yNTZLKTsKCglpZiAoIWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgImlvcmVtYXAoKSBmYWlsZWRcbiIpOwoJCURXQ19GUkVFKGR3Y19vdGdfZGV2aWNlKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgImJhc2U9MHglMDh4XG4iLAoJCSh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwojZW5kaWYKCgkvKgoJICogUmV0cmlldmUgdGhlIG1lbW9yeSBhbmQgSVJRIHJlc291cmNlcy4KCSAqLwoJIGR3Y19vdGdfZGV2aWNlLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKF9kZXYsIDApOwoJaWYgKGR3Y19vdGdfZGV2aWNlLT5pcnEgPD0gMCkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgIm5vIGRldmljZSBpcnFcbiIpOwoJCXJldHZhbCA9IC1FSU5WQUw7CgkJZ290byBmYWlsOwoJfQoKCS8qCgkgKiBJbml0aWFsaXplIGRyaXZlciBkYXRhIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgRFdDX290ZwoJICogRGV2aWNlIHN0cnVjdHVyZS4KCSAqLwojaWZkZWYgTE1fSU5URVJGQUNFCglsbV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CiNlbHNlCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CglfZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopIGR3Y19vdGdfZGV2aWNlOwojZW5kaWYKCWRldl9kYmcoJl9kZXYtPmRldiwgImR3Y19vdGdfZGV2aWNlPTB4JXBcbiIsIGR3Y19vdGdfZGV2aWNlKTsKCglkd2Nfb3RnX2RldmljZS0+Y29yZV9pZiA9IGR3Y19vdGdfY2lsX2luaXQoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCWlmICghZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpIHsKCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJDSUwgaW5pdGlhbGl6YXRpb24gZmFpbGVkIVxuIik7CgkJcmV0dmFsID0gLUVOT01FTTsKCQlnb3RvIGZhaWw7Cgl9CgoJLyoKCSAqIEF0dGVtcHQgdG8gZW5zdXJlIHRoaXMgZGV2aWNlIGlzIHJlYWxseSBhIERXQ19vdGcgQ29udHJvbGxlci4KCSAqIFJlYWQgYW5kIHZlcmlmeSB0aGUgU05QU0lEIHJlZ2lzdGVyIGNvbnRlbnRzLiBUaGUgdmFsdWUgc2hvdWxkIGJlCgkgKiAweDQ1RjQyWFhYLCB3aGljaCBjb3JyZXNwb25kcyB0byAiT1QyIiwgYXMgaW4gIk9URyB2ZXJzaW9uIDIuWFgiLgoJICovCgoJaWYgKChkd2Nfb3RnX2dldF9nc25wc2lkKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSAmIDB4RkZGRkYwMDApICE9CgkgICAgMHg0RjU0MjAwMCkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgIkJhZCB2YWx1ZSBmb3IgU05QU0lEOiAweCUwOHhcbiIsCgkJCWR3Y19vdGdfZ2V0X2dzbnBzaWQoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpKTsKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWdvdG8gZmFpbDsKCX0KCgkvKgoJICogVmFsaWRhdGUgcGFyYW1ldGVyIHZhbHVlcy4KCSAqLwoJaWYgKHNldF9wYXJhbWV0ZXJzKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSkgewoJCXJldHZhbCA9IC1FSU5WQUw7CgkJZ290byBmYWlsOwoJfQoKCS8qCgkgKiBDcmVhdGUgRGV2aWNlIEF0dHJpYnV0ZXMgaW4gc3lzZnMKCSAqLwoJZHdjX290Z19hdHRyX2NyZWF0ZShfZGV2KTsKCgkvKgoJICogRGlzYWJsZSB0aGUgZ2xvYmFsIGludGVycnVwdCB1bnRpbCBhbGwgdGhlIGludGVycnVwdAoJICogaGFuZGxlcnMgYXJlIGluc3RhbGxlZC4KCSAqLwoJZHdjX290Z19kaXNhYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKTsKCgkvKgoJICogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjb21tb24gaW50ZXJydXB0cyBiZWZvcmUKCSAqIGVuYWJsaW5nIGNvbW1vbiBpbnRlcnJ1cHRzIGluIGNvcmVfaW5pdCBiZWxvdy4KCSAqLwoJRFdDX0RFQlVHUEwoREJHX0NJTCwgInJlZ2lzdGVyaW5nIChjb21tb24pIGhhbmRsZXIgZm9yIGlycSVkXG4iLAoJCSAgICBkd2Nfb3RnX2RldmljZS0+aXJxKTsKCXJldHZhbCA9IHJlcXVlc3RfaXJxKGR3Y19vdGdfZGV2aWNlLT5pcnEsIGR3Y19vdGdfY29tbW9uX2lycSwKCQkJICAgICBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQgfCBJUlFfTEVWRUwsICJkd2Nfb3RnIiwKCQkJICAgICBkd2Nfb3RnX2RldmljZSk7CglpZiAocmV0dmFsKSB7CgkJRFdDX0VSUk9SKCJyZXF1ZXN0IG9mIGlycSVkIGZhaWxlZFxuIiwgZHdjX290Z19kZXZpY2UtPmlycSk7CgkJcmV0dmFsID0gLUVCVVNZOwoJCWdvdG8gZmFpbDsKCX0gZWxzZSB7CgkJZHdjX290Z19kZXZpY2UtPmNvbW1vbl9pcnFfaW5zdGFsbGVkID0gMTsKCX0KCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCXNldF9pcnFfdHlwZShfZGV2LT5pcnEsIElSUVRfTE9XKTsKI2VuZGlmCgkvKgoJICogSW5pdGlhbGl6ZSB0aGUgRFdDX290ZyBjb3JlLgoJICovCglkd2Nfb3RnX2NvcmVfaW5pdChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CgojaWZuZGVmIERXQ19IT1NUX09OTFkKCS8qCgkgKiBJbml0aWFsaXplIHRoZSBQQ0QKCSAqLwoJcmV0dmFsID0gcGNkX2luaXQoX2Rldik7CglpZiAocmV0dmFsICE9IDApIHsKCQlEV0NfRVJST1IoInBjZF9pbml0IGZhaWxlZFxuIik7CgkJZHdjX290Z19kZXZpY2UtPnBjZCA9IE5VTEw7CgkJZ290byBmYWlsOwoJfQojZW5kaWYKI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKCS8qCgkgKiBJbml0aWFsaXplIHRoZSBIQ0QKCSAqLwoJcmV0dmFsID0gaGNkX2luaXQoX2Rldik7CglpZiAocmV0dmFsICE9IDApIHsKCQlEV0NfRVJST1IoImhjZF9pbml0IGZhaWxlZFxuIik7CgkJZHdjX290Z19kZXZpY2UtPmhjZCA9IE5VTEw7CgkJZ290byBmYWlsOwoJfQojZW5kaWYKI2lmZGVmIFBDSV9JTlRFUkZBQ0UKCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7Cglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnBjaWRldiA9IF9kZXY7CiNlbmRpZgoKCS8qCgkgKiBFbmFibGUgdGhlIGdsb2JhbCBpbnRlcnJ1cHQgYWZ0ZXIgYWxsIHRoZSBpbnRlcnJ1cHQKCSAqIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQgaWYgdGhlcmUgaXMgbm8gQURQIHN1cHBvcnQgZWxzZQoJICogcGVyZm9ybSBpbml0aWFsIGFjdGlvbnMgcmVxdWlyZWQgZm9yIEludGVybmFsIEFEUCBsb2dpYy4KCSAqLwoJaWYgKCFkd2Nfb3RnX2dldF9wYXJhbV9hZHBfZW5hYmxlKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSkKCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CgllbHNlCgkJZHdjX290Z19hZHBfc3RhcnQoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYsCgkJCQkJCQlkd2Nfb3RnX2lzX2hvc3RfbW9kZShkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikpOwoKCXJldHVybiAwOwoKZmFpbDoKCWR3Y19vdGdfZHJpdmVyX3JlbW92ZShfZGV2KTsKCXJldHVybiByZXR2YWw7Cn0KCiNpZiAwCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGNhbGxlZCBieSBhIGJ1cyBkcml2ZXIKICogZHVyaW5nIHRoZSBsaWZlY3ljbGUgb2YgYSBkZXZpY2Ugb24gdGhhdCBidXMuIEJvdGggZHJpdmVycyBhbmQKICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcwogKiBkZXZpY2VzIHRvIGRyaXZlcnMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZSBhbmQgZHJpdmVyCiAqIHN0cnVjdHVyZXMuCiAqCiAqIFRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYnVzIGRyaXZlciBtYXRjaGVzIGEgZGV2aWNlCiAqIHRvIHRoaXMgZHJpdmVyLiBUaGUgcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzCiAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgogKi8KI2lmZGVmIExNX0lOVEVSRkFDRQpzdGF0aWMgc3RydWN0IGxtX2RyaXZlciBkd2Nfb3RnX2RyaXZlciA9IHsKCS5kcnYgPSB7Lm5hbWUgPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSx9LAoJLnByb2JlID0gZHdjX290Z19kcml2ZXJfcHJvYmUsCgkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAp9OwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRzW10gPSB7IHsKCQkJCQkJIFBDSV9ERVZJQ0UoMHgxNmMzLCAweGFiY2QpLAoJCQkJCQkgLmRyaXZlcl9kYXRhID0KCQkJCQkJICh1bnNpZ25lZCBsb25nKTB4ZGVhZGJlZWYsCgkJCQkJCSB9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkcyk7CgovKiBwY2kgZHJpdmVyIGdsdWU7IHRoaXMgaXMgYSAibmV3IHN0eWxlIiBQQ0kgZHJpdmVyIG1vZHVsZSAqLwpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHdjX290Z19kcml2ZXIgPSB7CgkubmFtZSA9ICJkd2Nfb3RnIiwKCS5pZF90YWJsZSA9IHBjaV9pZHMsCgoJLnByb2JlID0gZHdjX290Z19kcml2ZXJfcHJvYmUsCgkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAoKCS5kcml2ZXIgPSB7CgkJICAgLm5hbWUgPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSwKCQkgICB9LAp9OwojZW5kaWYKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkd2Nfb3RnX2RyaXZlciBpcyBpbnN0YWxsZWQgd2l0aCB0aGUKICogaW5zbW9kIGNvbW1hbmQuIEl0IHJlZ2lzdGVycyB0aGUgZHdjX290Z19kcml2ZXIgc3RydWN0dXJlIHdpdGggdGhlCiAqIGFwcHJvcHJpYXRlIGJ1cyBkcml2ZXIuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZHdjX290Z19kcml2ZXJfcHJvYmUgZnVuY3Rpb24KICogdG8gYmUgY2FsbGVkLiBJbiBhZGRpdGlvbiwgdGhlIGJ1cyBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9zZQogKiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UgYW5kIGRyaXZlciBpbiB0aGUgc3BlY2lhbCBzeXNmcyBmaWxlCiAqIHN5c3RlbS4KICoKICogQHJldHVybgogKi8Kc3RhdGljIGludCBfX2luaXQgZHdjX290Z19kcml2ZXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsID0gMDsKCWludCBlcnJvcjsKCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBkd2NfZHJpdmVyX25hbWUsCgkgICAgICAgRFdDX0RSSVZFUl9WRVJTSU9OKTsKI2lmZGVmIExNX0lOVEVSRkFDRQoJcmV0dmFsID0gbG1fZHJpdmVyX3JlZ2lzdGVyKCZkd2Nfb3RnX2RyaXZlcik7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR3Y19vdGdfZHJpdmVyKTsKI2VuZGlmCglpZiAocmV0dmFsIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUiAiJXMgcmV0dmFsPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKCQlyZXR1cm4gcmV0dmFsOwoJfQojaWZkZWYgTE1fSU5URVJGQUNFCgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfZGVidWdsZXZlbCk7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKI2VuZGlmCglyZXR1cm4gcmV0dmFsOwp9Cgptb2R1bGVfaW5pdChkd2Nfb3RnX2RyaXZlcl9pbml0KTsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwKICogd2l0aCB0aGUgcm1tb2QgY29tbWFuZC4gVGhlIGRyaXZlciB1bnJlZ2lzdGVycyBpdHNlbGYgd2l0aCBpdHMgYnVzCiAqIGRyaXZlci4KICoKICovCnN0YXRpYyB2b2lkIF9fZXhpdCBkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKHZvaWQpCnsKCXByaW50ayhLRVJOX0RFQlVHICJkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKClcbiIpOwoKI2lmZGVmIExNX0lOVEVSRkFDRQoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcnYsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CglsbV9kcml2ZXJfdW5yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOwoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHdjX290Z19kcml2ZXIpOwojZW5kaWYKCglwcmludGsoS0VSTl9JTkZPICIlcyBtb2R1bGUgcmVtb3ZlZFxuIiwgZHdjX2RyaXZlcl9uYW1lKTsKfQoKbW9kdWxlX2V4aXQoZHdjX290Z19kcml2ZXJfY2xlYW51cCk7CiNlbHNlCgovKgogKiBQbGF0Zm9ybSBTcGVjaWZpYyBDb250cm9sbGVyIFN1c3BlbmQgUm91dGllbmUuCiAqIEl0IGRvZXMgYSBQb3J0IHN1c3BlbmQsIGFuZCBnYXRlIHRoZSBjbG9jayAoUG93ZXIgT2ZmIEwxKS4KICogQ29udHJvbGxlciBhbmQgUEhZIHJlc2V0IChQb3dlciBPZmYgTDIpIGZ1bmN0aW9uYWxpdHkKICogaXMgbm90IHN1cHBvcnRlZAogKi8KaW50IGNvbWNlcnRvX3VzYjJfYnVzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqIHBkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCWludCBlcnJvcl9zdGF0dXMgPSAwLCB2YWwgPSAwOwoJc3RydWN0IHVzYl9oY2QgKmhjZCA9IE5VTEw7CgoJLyogQ2hlY2sgZm9yIHRoZSBCaXQgTWFzayBiaXQgZm9yIFVTQjIsIGlmIG5vdCBlbmFibGVkCiAgICAgICAgICogdGhlbiB3ZSBhcmUgbm90IGdvaW5nIHN1c3BlbmQgdGhlIFVTQjIgZGV2aWNlICwgYXMgYnkKICAgICAgICAgKiB0aGlzIGRldmljZSAsIHdlIHdpbGwgd2FrZSBmcm9tIHJlc3VtZS4KICAgICAgICAgKi8KICAgICAgICBpZiAoICEoaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrICYgVVNCMnAwX0lSUSApKXsKCiAgICAgICAgICAgICAgICAvKiBXZSB3aWxsIHJldHVybiBoZXJlLgogICAgICAgICAgICAgICAgICogTm90IHByZXBhcmVkIHlldCBmb3Igc3VzcGVuZCAsIHNvIHRoYXQgZGV2aWNlIHN1c3BlbmQKICAgICAgICAgICAgICAgICAqIHdpbGwgbm90IG9jY3VyLgogICAgICAgICAgICAgICAgKi8KCQlyZXR1cm4gZXJyb3Jfc3RhdHVzOwoJfQoKCWhjZCA9IChzdHJ1Y3QgdXNiX2hjZCAqKSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZCk7CgoJLyogRG8gdGhlIHBvcnQgc3VzcGVuZCBmb3IgVVNCIDIuMCBDb250cm9sbGVyICovCglkd2Nfb3RnX2hvc3RfcG9ydF9zdXNwZW5kKGhjZCk7CgoJZm9yICh2YWwgPSAwIDsgdmFsIDwgNTAgOyB2YWwrKykKCQl1ZGVsYXkoMTAwMCk7CgoJLyogRGlzYWJsZSB0aGUgQ2xvY2sgKi8KCWNsa19kaXNhYmxlKHVzYjJfY2xrKTsKCgkvKiBQTSBQZXJmb3JtYW5jZSBFbmhhbmNlbWVudCA6IFVTQjAgUEQgKi8KCS8qIENvbW1vbiBCbG9jayBQb3dlci1Eb3duIENvbnRyb2wgYW5kIHBvd2VyaW5nIGRvd24gYWxsIGFuYWxvZyBibG9ja3MgKi8KCXdyaXRlbCgweDAxMjIwMDQwLCBDT01DRVJUT19VU0IwX1BIWV9DVFJMX1JFRzApOwoKCXJldHVybiBlcnJvcl9zdGF0dXM7Cn0KCi8qCiAqIFBsYXRmb3JtIFNwZWNpZmljIENvbnRyb2xsZXIgUmVzdW1lIFJvdXRpZW5lLgogKiBJdCBkb2VzIGEgUG9ydCByZXN1bWUsIGFuZCBlbmFibGUgdGhlIGNsb2NrIChQb3dlciBPZmYgTDEpLgogKiBSZXN1bWUgZnJvbSAoUG93ZXIgT2ZmIEwyKSBpcyBub3Qgc3VwcG9ydGVkCiAqLwppbnQgY29tY2VydG9fdXNiMl9idXNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkKQp7CglpbnQgZXJyb3Jfc3RhdHVzID0gMDsKCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBOVUxMOwoKCgkvKiBDaGVjayBmb3IgdGhlIEJpdCBNYXNrIGJpdCBmb3IgVVNCMiwgaWYgbm90IGVuYWJsZWQKICAgICAgICAgKiB0aGVuIHdlIGFyZSBub3QgZ29pbmcgc3VzcGVuZCB0aGUgVVNCMiBkZXZpY2UgLCBhcyBieQogICAgICAgICAqIHRoaXMgZGV2aWNlICwgd2Ugd2lsbCB3YWtlIGZyb20gcmVzdW1lLgogICAgICAgICAqLwogICAgICAgIGlmICggaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrICYgVVNCMnAwX0lSUSApewoKICAgICAgICAgICAgICAgIC8qIFdlIHdpbGwgcmV0dXJuIGhlcmUuCiAgICAgICAgICAgICAgICAgKiBOb3QgcHJlcGFyZWQgeWV0IGZvciBzdXNwZW5kICwgc28gdGhhdCBkZXZpY2Ugc3VzcGVuZAogICAgICAgICAgICAgICAgICogd2lsbCBub3Qgb2NjdXIuCiAgICAgICAgICAgICAgICAqLwoJCXJldHVybiBlcnJvcl9zdGF0dXM7Cgl9CgoJLyogUE0gUGVyZm9ybWFuY2UgRW5oYW5jZW1lbnQgOiBVU0IwIFBEICovCgkvKiBDb21tb24gQmxvY2sgUG93ZXItRG93biBDb250cm9sIGFuZCBwb3dlcmluZyBkb3duIGFsbCBhbmFsb2cgYmxvY2tzICovCgl3cml0ZWwoMHgwMDIyMDAwMCwgQ09NQ0VSVE9fVVNCMF9QSFlfQ1RSTF9SRUcwKTsKCgkvKiBFbmFibGUgdGhlIENsb2NrICovCglpZiAoY2xrX2VuYWJsZSh1c2IyX2NsaykpewoJCXByX2VycigiY29tY2VydG9fdXNiMl9idXNfcmVzdW1lX2R1bW15OlVuYWJsZSB0byBlbmFibGUgdGhlIHVzYjIgY2xvY2sgXG4iKTsKCX0KCgloY2QgPSAoc3RydWN0IHVzYl9oY2QgKikgcGxhdGZvcm1fZ2V0X2RydmRhdGEocGQpOwoKCWR3Y19vdGdfaG9zdF9wb3J0X3Jlc3VtZShoY2QpOwoKCXJldHVybiBlcnJvcl9zdGF0dXM7Cn0KCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGNhbGxlZCBieSBhIGJ1cyBkcml2ZXIKICogZHVyaW5nIHRoZSBsaWZlY3ljbGUgb2YgYSBkZXZpY2Ugb24gdGhhdCBidXMuIEJvdGggZHJpdmVycyBhbmQKICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcwogKiBkZXZpY2VzIHRvIGRyaXZlcnMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZSBhbmQgZHJpdmVyCiAqIHN0cnVjdHVyZXMuCiAqCiAqIFRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYnVzIGRyaXZlciBtYXRjaGVzIGEgZGV2aWNlCiAqIHRvIHRoaXMgZHJpdmVyLiBUaGUgcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzCiAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgogKi8Kc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdjX290Z19kcml2ZXIgPSB7CgkuZHJpdmVyID0gewoJCS5uYW1lCT0gKGNoYXIgKilkd2NfZHJpdmVyX25hbWUsCgl9LAoJLnByb2JlCQk9IGR3Y19vdGdfZHJpdmVyX3Byb2JlLAoJLnJlbW92ZQkJPSBkd2Nfb3RnX2RyaXZlcl9yZW1vdmUsCgoJLnN1c3BlbmQgPSBjb21jZXJ0b191c2IyX2J1c19zdXNwZW5kLAoJLnJlc3VtZSA9IGNvbWNlcnRvX3VzYjJfYnVzX3Jlc3VtZSwKfTsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkd2Nfb3RnX2RyaXZlciBpcyBpbnN0YWxsZWQgd2l0aCB0aGUKICogaW5zbW9kIGNvbW1hbmQuIEl0IHJlZ2lzdGVycyB0aGUgZHdjX290Z19kcml2ZXIgc3RydWN0dXJlIHdpdGggdGhlCiAqIGFwcHJvcHJpYXRlIGJ1cyBkcml2ZXIuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZHdjX290Z19kcml2ZXJfcHJvYmUgZnVuY3Rpb24KICogdG8gYmUgY2FsbGVkLiBJbiBhZGRpdGlvbiwgdGhlIGJ1cyBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9zZQogKiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UgYW5kIGRyaXZlciBpbiB0aGUgc3BlY2lhbCBzeXNmcyBmaWxlCiAqIHN5c3RlbS4KICoKICogQHJldHVybgogKi8Kc3RhdGljIGludCBfX2luaXQgZHdjX290Z19kcml2ZXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsID0gMDsKCWludCBlcnJvcjsKCglwcmludGsoS0VSTl9JTkZPICIlczogdmVyc2lvbiAlc1xuIiwgZHdjX2RyaXZlcl9uYW1lLCBEV0NfRFJJVkVSX1ZFUlNJT04pOwoKCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwoJaWYgKHJldHZhbCkgewoJCXByaW50ayhLRVJOX0VSUiAiJXMgcmV0dmFsPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKCQlyZXR1cm4gcmV0dmFsOwoJfQoKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCglyZXR1cm4gcmV0dmFsOwp9Cm1vZHVsZV9pbml0KGR3Y19vdGdfZHJpdmVyX2luaXQpOwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkIGZyb20gdGhlIGtlcm5lbAogKiB3aXRoIHRoZSBybW1vZCBjb21tYW5kLiBUaGUgZHJpdmVyIHVucmVnaXN0ZXJzIGl0c2VsZiB3aXRoIGl0cyBidXMKICogZHJpdmVyLgogKgogKi8Kc3RhdGljIHZvaWQgX19leGl0IGR3Y19vdGdfZHJpdmVyX2NsZWFudXAodm9pZCkKewoJcHJpbnRrKEtFUk5fREVCVUcgImR3Y19vdGdfZHJpdmVyX2NsZWFudXAoKVxuIik7CgoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CgoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3Y19vdGdfZHJpdmVyKTsKCglwcmludGsoS0VSTl9JTkZPICIlcyBtb2R1bGUgcmVtb3ZlZFxuIiwgZHdjX2RyaXZlcl9uYW1lKTsKfQptb2R1bGVfZXhpdChkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKTsKCiNlbmRpZgoKTU9EVUxFX0RFU0NSSVBUSU9OKERXQ19EUklWRVJfREVTQyk7Ck1PRFVMRV9BVVRIT1IoIlN5bm9wc3lzIEluYy4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKG90Z19jYXAsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfY2FwLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG90Z19jYXAsICJPVEcgQ2FwYWJpbGl0aWVzIDA9SE5QJlNSUCAxPVNSUCBPbmx5IDI9Tm9uZSIpOwptb2R1bGVfcGFyYW1fbmFtZWQob3B0LCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3B0LCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG9wdCwgIk9QVCBNb2RlIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkbWFfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkbWFfZW5hYmxlLCAiRE1BIE1vZGUgMD1TbGF2ZSAxPURNQSBlbmFibGVkIik7Cgptb2R1bGVfcGFyYW1fbmFtZWQoZG1hX2Rlc2NfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2Rlc2NfZW5hYmxlLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZG1hX2Rlc2NfZW5hYmxlLAoJCSAiRE1BIERlc2MgTW9kZSAwPUFkZHJlc3MgRE1BIDE9RE1BIERlc2NyaXB0b3IgZW5hYmxlZCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKGRtYV9idXJzdF9zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2J1cnN0X3NpemUsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkbWFfYnVyc3Rfc2l6ZSwKCQkgIkRNQSBCdXJzdCBTaXplIDEsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChzcGVlZCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnNwZWVkLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHNwZWVkLCAiU3BlZWQgMD1IaWdoIFNwZWVkIDE9RnVsbCBTcGVlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIsCgkJICJTdXBwb3J0IExvdyBQb3dlciB3L0ZTIG9yIExTIDA9U3VwcG9ydCAxPURvbid0IFN1cHBvcnQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGssCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGssIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywKCQkgIkxvdyBTcGVlZCBMb3cgUG93ZXIgQ2xvY2sgMD00OE1oeiAxPTZNaHoiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGVuYWJsZV9keW5hbWljX2ZpZm8sCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuYWJsZV9keW5hbWljX2ZpZm8sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2R5bmFtaWNfZmlmbywgIjA9Y0MgU2V0dGluZyAxPUFsbG93IER5bmFtaWMgU2l6aW5nIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkYXRhX2ZpZm9fc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRhdGFfZmlmb19zaXplLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGF0YV9maWZvX3NpemUsCgkJICJUb3RhbCBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGRhdGEgRklGTyBtZW1vcnkgMzItMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9yeF9maWZvX3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcnhfZmlmb19zaXplLAoJCSAgIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3J4X2ZpZm9fc2l6ZSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgUnggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X25wZXJpb190eF9maWZvX3NpemUsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9ucGVyaW9fdHhfZmlmb19zaXplLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9ucGVyaW9fdHhfZmlmb19zaXplLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzBdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8yLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzFdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMiwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8zLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzJdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMywKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV80LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzNdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNCwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV81LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzRdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV82LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzVdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNiwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV83LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzZdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNywKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV84LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzddLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfOCwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV85LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzhdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfOSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xMCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVs5XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEwLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzExLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEwXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzExLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEyLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzExXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEyLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEzLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEyXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEzLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE0LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEzXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE0LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE1LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzE0XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE1LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChob3N0X3J4X2ZpZm9fc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplLAoJCSAgIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9yeF9maWZvX3NpemUsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFJ4IEZJRk8gMTYtMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gMTYtMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfcGVyaW9fdHhfZmlmb19zaXplLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgaG9zdCBwZXJpb2RpYyBUeCBGSUZPIDE2LTMyNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChtYXhfdHJhbnNmZXJfc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm1heF90cmFuc2Zlcl9zaXplLAoJCSAgIGludCwgMDQ0NCk7Ci8qKiBAdG9kbyBTZXQgdGhlIG1heCB0byA1MTJLLCBtb2RpZnkgY2hlY2tzICovCk1PRFVMRV9QQVJNX0RFU0MobWF4X3RyYW5zZmVyX3NpemUsCgkJICJUaGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIHN1cHBvcnRlZCBpbiBieXRlcyAyMDQ3LTY1NTM1Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChtYXhfcGFja2V0X2NvdW50LCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMubWF4X3BhY2tldF9jb3VudCwKCQkgICBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG1heF9wYWNrZXRfY291bnQsCgkJICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyBpbiBhIHRyYW5zZmVyIDE1LTUxMSIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9jaGFubmVscywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfY2hhbm5lbHMsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X2NoYW5uZWxzLAoJCSAiVGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZSAxLTE2Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfZW5kcG9pbnRzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X2VuZHBvaW50cywgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9lbmRwb2ludHMsCgkJICJUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyBpbiBhZGRpdGlvbiB0byBFUDAgYXZhaWxhYmxlIGZvciBkZXZpY2UgbW9kZSAxLTE1Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChwaHlfdHlwZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV90eXBlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV90eXBlLCAiMD1SZXNlcnZlZCAxPVVUTUkrIDI9VUxQSSIpOwptb2R1bGVfcGFyYW1fbmFtZWQocGh5X3V0bWlfd2lkdGgsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdXRtaV93aWR0aCwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV91dG1pX3dpZHRoLCAiU3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoIDggb3IgMTYgYml0cyIpOwptb2R1bGVfcGFyYW1fbmFtZWQocGh5X3VscGlfZGRyLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZGRyLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV91bHBpX2RkciwKCQkgIlVMUEkgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUgMD1TaW5nbGUgMT1Eb3VibGUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHBoeV91bHBpX2V4dF92YnVzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZXh0X3ZidXMsCgkJICAgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhwaHlfdWxwaV9leHRfdmJ1cywKCQkgIlVMUEkgUEhZIHVzaW5nIGludGVybmFsIG9yIGV4dGVybmFsIHZidXMgMD1JbnRlcm5hbCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaTJjX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmkyY19lbmFibGUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaTJjX2VuYWJsZSwgIkZTIFBIWSBJbnRlcmZhY2UiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHVscGlfZnNfbHMsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy51bHBpX2ZzX2xzLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHVscGlfZnNfbHMsICJVTFBJIFBIWSBGUy9MUyBtb2RlIG9ubHkiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHRzX2RsaW5lLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModHNfZGxpbmUsICJUZXJtIHNlbGVjdCBEbGluZSBwdWxzaW5nIGZvciBhbGwgUEhZcyIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGdfZGJnX2x2bCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIiIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKGVuX211bHRpcGxlX3R4X2ZpZm8sCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuX211bHRpcGxlX3R4X2ZpZm8sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZW5fbXVsdGlwbGVfdHhfZmlmbywKCQkgIkRlZGljYXRlZCBOb24gUGVyaW9kaWMgVHggRklGT3MgMD1kaXNhYmxlZCAxPWVuYWJsZWQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVswXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzIsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsyXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzMsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVszXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzQsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs0XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzUsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs1XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzYsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs2XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzcsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs3XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzgsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs4XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzksICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMTAsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbOV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMiwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxMl0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xMywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxM10sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xNCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVsxNF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3R4X2ZpZm9fc2l6ZV8xNSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKHRocl9jdGwsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50aHJfY3RsLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHRocl9jdGwsCgkJICJUaHJlc2hvbGRpbmcgZW5hYmxlIGZsYWcgYml0IDAgLSBub24gSVNPIFR4IHRoci4sIDEgLSBJU08gVHggdGhyLiwgMiAtIFJ4IHRoci4tIGJpdCAwPWRpc2FibGVkIDE9ZW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQodHhfdGhyX2xlbmd0aCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnR4X3Rocl9sZW5ndGgsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyh0eF90aHJfbGVuZ3RoLCAiVHggVGhyZXNob2xkIGxlbmd0aCBpbiAzMiBiaXQgRFdPUkRzIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChyeF90aHJfbGVuZ3RoLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucnhfdGhyX2xlbmd0aCwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHJ4X3Rocl9sZW5ndGgsICJSeCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBEV09SRHMiKTsKCm1vZHVsZV9wYXJhbV9uYW1lZChwdGlfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucHRpX2VuYWJsZSwgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtX25hbWVkKG1waV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tcGlfZW5hYmxlLCBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW1fbmFtZWQobHBtX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmxwbV9lbmFibGUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobHBtX2VuYWJsZSwgIkxQTSBFbmFibGUgMD1MUE0gRGlzYWJsZWQgMT1MUE0gRW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaWNfdXNiX2NhcCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmljX3VzYl9jYXAsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaWNfdXNiX2NhcCwKCQkgIklDX1VTQiBDYXBhYmlsaXR5IDA9SUNfVVNCIERpc2FibGVkIDE9SUNfVVNCIEVuYWJsZWQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGFoYl90aHJfcmF0aW8sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfdGhyX3JhdGlvLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoYWhiX3Rocl9yYXRpbywgIkFIQiBUaHJlc2hvbGQgUmF0aW8iKTsKbW9kdWxlX3BhcmFtX25hbWVkKHBvd2VyX2Rvd24sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wb3dlcl9kb3duLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX2Rvd24sICJQb3dlciBEb3duIE1vZGUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHJlbG9hZF9jdGwsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yZWxvYWRfY3RsLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHJlbG9hZF9jdGwsICJIRklSIFJlbG9hZCBDb250cm9sIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfb3V0X25haywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9vdXRfbmFrLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9vdXRfbmFrLCAiRW5hYmxlIERldmljZSBPVVQgTkFLIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChjb250X29uX2JuYSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmNvbnRfb25fYm5hLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGNvbnRfb25fYm5hLCAiRW5hYmxlIEVuYWJsZSBDb250aW51ZSBvbiBCTkEiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGFoYl9zaW5nbGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfc2luZ2xlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGFoYl9zaW5nbGUsICJFbmFibGUgQUhCIFNpbmdsZSBTdXBwb3J0Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChhZHBfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWRwX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhhZHBfZW5hYmxlLCAiQURQIEVuYWJsZSAwPUFEUCBEaXNhYmxlZCAxPUFEUCBFbmFibGVkIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChvdGdfdmVyLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX3ZlciwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhvdGdfdmVyLCAiT1RHIHJldmlzaW9uIHN1cHBvcnRlZCAwPU9URyAxLjMgMT1PVEcgMi4wIik7CgovKiogQHBhZ2UgIk1vZHVsZSBQYXJhbWV0ZXJzIgogKgogKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbWF5IGJlIHNwZWNpZmllZCB3aGVuIHN0YXJ0aW5nIHRoZSBtb2R1bGUuCiAqIFRoZXNlIHBhcmFtZXRlcnMgZGVmaW5lIGhvdyB0aGUgRFdDX290ZyBjb250cm9sbGVyIHNob3VsZCBiZQogKiBjb25maWd1cmVkLiBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIENJTCBpbml0aWFsaXphdGlvbgogKiBmdW5jdGlvbiBkd2Nfb3RnX2NpbF9pbml0CiAqCiAqIEV4YW1wbGU6IDxjb2RlPm1vZHByb2JlIGR3Y19vdGcgc3BlZWQ9MSBvdGdfY2FwPTE8L2NvZGU+CiAqCgogPHRhYmxlPgogPHRyPjx0ZD5QYXJhbWV0ZXIgTmFtZTwvdGQ+PHRkPk1lYW5pbmc8L3RkPjwvdHI+CgogPHRyPgogPHRkPm90Z19jYXA8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgT1RHIGNhcGFiaWxpdGllcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZQogdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMgc3BlY2lmaWVkLgogLSAwOiBITlAgYW5kIFNSUCBjYXBhYmxlIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiAtIDE6IFNSUCBPbmx5IGNhcGFibGUKIC0gMjogTm8gSE5QL1NSUCBjYXBhYmxlCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRtYV9lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzbGF2ZSBvciBETUEgbW9kZSBmb3IgYWNjZXNzaW5nIHRoZSBkYXRhIEZJRk9zLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBTbGF2ZQogLSAxOiBETUEgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZG1hX2J1cnN0X3NpemU8L3RkPgogPHRkPlRoZSBETUEgQnVyc3Qgc2l6ZSAoYXBwbGljYWJsZSBvbmx5IGZvciBFeHRlcm5hbCBETUEgTW9kZSkuCiAtIFZhbHVlczogMSwgNCwgOCAxNiwgMzIsIDY0LCAxMjgsIDI1NiAoZGVmYXVsdCAzMikKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+c3BlZWQ8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgbWF4aW11bSBzcGVlZCBvZiBvcGVyYXRpb24gaW4gaG9zdCBhbmQgZGV2aWNlIG1vZGUuIFRoZQogYWN0dWFsIHNwZWVkIGRlcGVuZHMgb24gdGhlIHNwZWVkIG9mIHRoZSBhdHRhY2hlZCBkZXZpY2UgYW5kIHRoZSB2YWx1ZSBvZgogcGh5X3R5cGUuCiAtIDA6IEhpZ2ggU3BlZWQgKGRlZmF1bHQpCiAtIDE6IEZ1bGwgU3BlZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgbG93IHBvd2VyIG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gYXR0YWNoZWQgdG8gYSBGdWxsCiBTcGVlZCBvciBMb3cgU3BlZWQgZGV2aWNlIGluIGhvc3QgbW9kZS4KIC0gMDogRG9uJ3Qgc3VwcG9ydCBsb3cgcG93ZXIgbW9kZSAoZGVmYXVsdCkKIC0gMTogU3VwcG9ydCBsb3cgcG93ZXIgbW9kZQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrPC90ZD4KIDx0ZD5TcGVjaWZpZXMgdGhlIFBIWSBjbG9jayByYXRlIGluIGxvdyBwb3dlciBtb2RlIHdoZW4gY29ubmVjdGVkIHRvIGEgTG93CiBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIG9ubHkgaWYKIEhPU1RfU1VQUE9SVF9GU19MU19MT1dfUE9XRVIgaXMgZW5hYmxlZC4KIC0gMDogNDggTUh6IChkZWZhdWx0KQogLSAxOiA2IE1IegogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5lbmFibGVfZHluYW1pY19maWZvPC90ZD4KIDx0ZD4gU3BlY2lmaWVzIHdoZXRoZXIgRklGT3MgbWF5IGJlIHJlc2l6ZWQgYnkgdGhlIGRyaXZlciBzb2Z0d2FyZS4KIC0gMDogVXNlIGNDIEZJRk8gc2l6ZSBwYXJhbWV0ZXJzCiAtIDE6IEFsbG93IGR5bmFtaWMgRklGTyBzaXppbmcgKGRlZmF1bHQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRhdGFfZmlmb19zaXplPC90ZD4KIDx0ZD5Ub3RhbCBudW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBkYXRhIEZJRk8gbWVtb3J5LiBUaGlzIG1lbW9yeQogaW5jbHVkZXMgdGhlIFJ4IEZJRk8sIG5vbi1wZXJpb2RpYyBUeCBGSUZPLCBhbmQgcGVyaW9kaWMgVHggRklGT3MuCiAtIFZhbHVlczogMzIgdG8gMzI3NjggKGRlZmF1bHQgODE5MikKCiBOb3RlOiBUaGUgdG90YWwgRklGTyBtZW1vcnkgZGVwdGggaW4gdGhlIEZQR0EgY29uZmlndXJhdGlvbiBpcyA4MTkyLgogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfcnhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGRldmljZSBtb2RlIHdoZW4gZHluYW1pYwogRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDY0KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTwvdGQ+CiA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaW4gZGV2aWNlIG1vZGUgd2hlbgogZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9wZXJpb190eF9maWZvX3NpemVfbiAobiA9IDEgdG8gMTUpPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIHBlcmlvZGljIFR4IEZJRk9zIGluIGRldmljZSBtb2RlCiB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiA0IHRvIDc2OCAoZGVmYXVsdCAyNTYpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmhvc3RfcnhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGhvc3QgbW9kZSB3aGVuIGR5bmFtaWMgRklGTwogc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9ucGVyaW9fdHhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpbiBob3N0IG1vZGUgd2hlbgogZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkIGluIHRoZSBjb3JlLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmhvc3RfcGVyaW9fdHhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gd2hlbiBkeW5hbWljIEZJRk8KIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPm1heF90cmFuc2Zlcl9zaXplPC90ZD4KIDx0ZD5UaGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIHN1cHBvcnRlZCBpbiBieXRlcy4KIC0gVmFsdWVzOiAyMDQ3IHRvIDY1LDUzNSAoZGVmYXVsdCA2NSw1MzUpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPm1heF9wYWNrZXRfY291bnQ8L3RkPgogPHRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIuCiAtIFZhbHVlczogMTUgdG8gNTExIChkZWZhdWx0IDUxMSkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9jaGFubmVsczwvdGQ+CiA8dGQ+VGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZS4KIC0gVmFsdWVzOiAxIHRvIDE2IChkZWZhdWx0IDEyKQoKIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDEyIGhvc3QgY2hhbm5lbHMuCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9lbmRwb2ludHM8L3RkPgogPHRkPlRoZSBudW1iZXIgb2YgZW5kcG9pbnRzIGluIGFkZGl0aW9uIHRvIEVQMCBhdmFpbGFibGUgZm9yIGRldmljZSBtb2RlCiBvcGVyYXRpb25zLgogLSBWYWx1ZXM6IDEgdG8gMTUgKGRlZmF1bHQgNiBJTiBhbmQgT1VUKQoKIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDYgSU4gYW5kIE9VVCBlbmRwb2ludHMgaW4KIGFkZGl0aW9uIHRvIEVQMC4KIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cGh5X3R5cGU8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBQSFkgaW50ZXJmYWNlIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlIGRyaXZlciB3aWxsCiBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgcGh5X3R5cGUuCiAtIDA6IEZ1bGwgU3BlZWQKIC0gMTogVVRNSSsgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIC0gMjogVUxQSQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5waHlfdXRtaV93aWR0aDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIGZvciBhCiBwaHlfdHlwZSBvZiBVVE1JKy4gQWxzbywgdGhpcyBwYXJhbWV0ZXIgaXMgYXBwbGljYWJsZSBvbmx5IGlmIHRoZQogT1RHX0hTUEhZX1dJRFRIIGNDIHBhcmFtZXRlciB3YXMgc2V0IHRvICI4IGFuZCAxNiBiaXRzIiwgbWVhbmluZyB0aGF0IHRoZQogY29yZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHdvcmsgYXQgZWl0aGVyIGRhdGEgcGF0aCB3aWR0aC4KIC0gVmFsdWVzOiA4IG9yIDE2IGJpdHMgKGRlZmF1bHQgMTYpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnBoeV91bHBpX2RkcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVMUEkgb3BlcmF0ZXMgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUuIFRoaXMKIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgcGh5X3R5cGUgaXMgVUxQSS4KIC0gMDogc2luZ2xlIGRhdGEgcmF0ZSBVTFBJIGludGVyZmFjZSB3aXRoIDggYml0IHdpZGUgZGF0YSBidXMgKGRlZmF1bHQpCiAtIDE6IGRvdWJsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA0IGJpdCB3aWRlIGRhdGEgYnVzCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmkyY19lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSB0aGUgSTJDIGludGVyZmFjZSBmb3IgZnVsbCBzcGVlZCBQSFkuIFRoaXMKIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgUEhZX1RZUEUgaXMgRlMuCiAtIDA6IERpc2FibGVkIChkZWZhdWx0KQogLSAxOiBFbmFibGVkCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnVscGlfZnNfbHM8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBVTFBJIEZTL0xTIG1vZGUgb25seS4KIC0gMDogRGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IEVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+dHNfZGxpbmU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRlcm0gc2VsZWN0IEQtTGluZSBwdWxzaW5nIGZvciBhbGwgUEhZcyBpcyBlbmFibGVkLgogLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogRW5hYmxlZAogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5lbl9tdWx0aXBsZV90eF9maWZvPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBkZWRpY2F0ZWR0byB0eCBmaWZvcyBhcmUgZW5hYmxlZCBmb3Igbm9uIHBlcmlvZGljIElOIEVQcy4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogRGlzYWJsZWQKIC0gMTogRW5hYmxlZCAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfdHhfZmlmb19zaXplX24gKG4gPSAxIHRvIDE1KTwvdGQ+CiA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiBlYWNoIG9mIHRoZSBUeCBGSUZPcyBpbiBkZXZpY2UgbW9kZQogd2hlbiBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogNCB0byA3NjggKGRlZmF1bHQgMjU2KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD50eF90aHJfbGVuZ3RoPC90ZD4KIDx0ZD5UcmFuc21pdCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBkb3VibGUgd29yZHMKIC0gVmFsdWVzOiA4IHRvIDEyOCAoZGVmYXVsdCA2NCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cnhfdGhyX2xlbmd0aDwvdGQ+CiA8dGQ+UmVjZWl2ZSBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBkb3VibGUgd29yZHMKIC0gVmFsdWVzOiA4IHRvIDEyOCAoZGVmYXVsdCA2NCkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD50aHJfY3RsPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgVGhyZXNob2xkaW5nIGZvciBEZXZpY2UgbW9kZS4gQml0cyAwLCAxLCAyIG9mCiB0aGlzIHBhcm1hdGVyIHNwZWNpZmllcyBpZiB0aHJlc2hvbGRpbmcgaXMgZW5hYmxlZCBmb3Igbm9uLUlzbyBUeCwgSXNvIFR4IGFuZAogUnggdHJhbnNmZXJzIGFjY29yZGluZ2x5LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSBWYWx1ZXM6IDAgdG8gNyAoZGVmYXVsdCAwKQogQml0IHZhbHVlcyBpbmRpY2F0ZToKIC0gMDogVGhyZXNob2xkaW5nIGRpc2FibGVkCiAtIDE6IFRocmVzaG9sZGluZyBlbmFibGVkCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+ZG1hX2Rlc2NfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgRGVzY3JpcHRvciBETUEgbW9kZS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogRGVzY3JpcHRvciBETUEgZGlzYWJsZWQKIC0gMTogRGVzY3JpcHRvciBETUEgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5tcGlfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTVBJIGVuaGFuY2VtZW50IG1vZGUuCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCiBzcGVjaWZpZWQuCiAtIDA6IE1QSSBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogTVBJIGVuYWJsZQogPC90ZD48L3RyPgoKPHRyPgogPHRkPnB0aV9lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBQVEkgZW5oYW5jZW1lbnQgc3VwcG9ydC4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogUFRJIGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBQVEkgZW5hYmxlCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+bHBtX2VuYWJsZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIExQTSBzdXBwb3J0LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBMUE0gZGlzYWJsZWQKIC0gMTogTFBNIGVuYWJsZSAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKPHRyPgogPHRkPmljX3VzYl9jYXA8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBJQ19VU0IgY2FwYWJpbGl0eS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogSUNfVVNCIGRpc2FibGVkIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiAtIDE6IElDX1VTQiBlbmFibGUKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5haGJfdGhyX3JhdGlvPC90ZD4KIDx0ZD5TcGVjaWZpZXMgQUhCIFRocmVzaG9sZCByYXRpby4KIC0gVmFsdWVzOiAwIHRvIDMgKGRlZmF1bHQgMCkKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5wb3dlcl9kb3duPC90ZD4KIDx0ZD5TcGVjaWZpZXMgUG93ZXIgRG93bihIaWJlcm5hdGlvbikgTW9kZS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogUG93ZXIgRG93biBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMjogUG93ZXIgRG93biBlbmFibGVkCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnJlbG9hZF9jdGw8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIGR5bmFtaWMgcmVsb2FkaW5nIG9mIHRoZSBIRklSIHJlZ2lzdGVyIGlzIGFsbG93ZWQgZHVyaW5nCiBydW4gdGltZS4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYKIG5vbmUgaXMgc3BlY2lmaWVkLiBJbiBjYXNlIHRoZSBIRklSIHZhbHVlIGlzIHJlbG9hZGVkIHdoZW4gSEZJUi5SbGRDdHJsID09IDEnYjAKIHRoZSBjb3JlIG1pZ2h0IG1pc2JlaGF2ZS4KIC0gMDogUmVsb2FkIENvbnRyb2wgZGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IFJlbG9hZCBDb250cm9sIGVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZGV2X291dF9uYWs8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyICBEZXZpY2UgT1VUIE5BSyBlbmhhbmNlbWVudCBlbmFibGVkIG9yIG5vLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYKIG5vbmUgaXMgc3BlY2lmaWVkLiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IHdoZW4gT1RHX0VOX0RFU0NfRE1BID09IDGSYjEuCiAtIDA6IFRoZSBjb3JlIGRvZXMgbm90IHNldCBOQUsgYWZ0ZXIgQnVsayBPVVQgdHJhbnNmZXIgY29tcGxldGUgKGRlZmF1bHQpCiAtIDE6IFRoZSBjb3JlIHNldHMgTkFLIGFmdGVyIEJ1bGsgT1VUIHRyYW5zZmVyIGNvbXBsZXRlCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmNvbnRfb25fYm5hPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBFbmFibGUgQ29udGludWUgb24gQk5BIGVuYWJsZWQgb3Igbm8uCiBBZnRlciByZWNlaXZpbmcgQk5BIGludGVycnVwdCB0aGUgY29yZSBkaXNhYmxlcyB0aGUgZW5kcG9pbnQsd2hlbiB0aGUKIGVuZHBvaW50IGlzIHJlLWVuYWJsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRoZQogLSAwOiBDb3JlIHN0YXJ0cyBwcm9jZXNzaW5nIGZyb20gdGhlIERPRVBETUEgZGVzY3JpcHRvciAoZGVmYXVsdCkKIC0gMTogQ29yZSBzdGFydHMgcHJvY2Vzc2luZyBmcm9tIHRoZSBkZXNjcmlwdG9yIHdoaWNoIHJlY2VpdmVkIHRoZSBCTkEuCiBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IHdoZW4gT1RHX0VOX0RFU0NfRE1BID09IDGSYjEuCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmFoYl9zaW5nbGU8L3RkPgogPHRkPlRoaXMgYml0IHdoZW4gcHJvZ3JhbW1lZCBzdXBwb3J0cyBTSU5HTEUgdHJhbnNmZXJzIGZvciByZW1haW5kZXIgZGF0YQogaW4gYSB0cmFuc2ZlciBmb3IgRE1BIG1vZGUgb2Ygb3BlcmF0aW9uLgogLSAwOiBUaGUgcmVtYWluZGVyIGRhdGEgd2lsbCBiZSBzZW50IHVzaW5nIElOQ1IgYnVyc3Qgc2l6ZSAoZGVmYXVsdCkKIC0gMTogVGhlIHJlbWFpbmRlciBkYXRhIHdpbGwgYmUgc2VudCB1c2luZyBTSU5HTEUgYnVyc3Qgc2l6ZS4KIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5hZHBfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBBRFAgZmVhdHVyZSBpcyBlbmFibGVkLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBBRFAgZmVhdHVyZSBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogQURQIGZlYXR1cmUgZW5hYmxlZAogPC90ZD48L3RyPgoKICA8dHI+CiA8dGQ+b3RnX3ZlcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgT1RHIGlzIHBlcmZvcm1pbmcgYXMgVVNCIE9URyBSZXZpc2lvbiAyLjAgb3IgUmV2aXNpb24gMS4zCiBVU0IgT1RHIGRldmljZS4KIC0gMDogT1RHIDIuMCBzdXBwb3J0IGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBPVEcgMi4wIHN1cHBvcnQgZW5hYmxlZAogPC90ZD48L3RyPgoKKi8K