ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggOTY0MTczMi4uZjEzODQ4YyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTE3LDcgKzE3LDYgQEAKICMgICBVU0VfUE9MTCAgICAgICAgICAgICA6IGVuYWJsZSBwb2xsKCkuIEF1dG9tYXRpYy4KICMgICBVU0VfUFJJVkFURV9DQUNIRSAgICA6IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBjYWNoZSBvZiBzc2wgc2Vzc2lvbnMuCiAjICAgVVNFX1JFR1BBUk0gICAgICAgICAgOiBlbmFibGUgcmVncGFybSBvcHRpbWl6YXRpb24uIFJlY29tbWVuZGVkIG9uIHg4Ni4KLSMgICBVU0VfU0VQT0xMICAgICAgICAgICA6IGVuYWJsZSBzcGVjdWxhdGl2ZSBlcG9sbCgpLiBBdXRvbWF0aWMuCiAjICAgVVNFX1NUQVRJQ19QQ1JFICAgICAgOiBlbmFibGUgc3RhdGljIGxpYnBjcmUuIFJlY29tbWVuZGVkLgogIyAgIFVTRV9UUFJPWFkgICAgICAgICAgIDogZW5hYmxlIHRyYW5zcGFyZW50IHByb3h5LiBBdXRvbWF0aWMuCiAjICAgVVNFX0xJTlVYX1RQUk9YWSAgICAgOiBlbmFibGUgZnVsbCB0cmFuc3BhcmVudCBwcm94eS4gQXV0b21hdGljLgpAQCAtMjE2LDcgKzIxNSw2IEBACiAgIFVTRV9ORVRGSUxURVIgICA9IGltcGxpY2l0CiAgIFVTRV9QT0xMICAgICAgICA9IGltcGxpY2l0CiAgIFVTRV9FUE9MTCAgICAgICA9IGltcGxpY2l0Ci0gIFVTRV9TRVBPTEwgICAgICA9IGltcGxpY2l0CiAgIFVTRV9NWV9FUE9MTCAgICA9IGltcGxpY2l0CiAgIFVTRV9UUFJPWFkgICAgICA9IGltcGxpY2l0CiAgIFVTRV9MSUJDUllQVCAgICA9IGltcGxpY2l0CkBAIC0yMjcsNyArMjI1LDYgQEAKICAgVVNFX05FVEZJTFRFUiAgID0gaW1wbGljaXQKICAgVVNFX1BPTEwgICAgICAgID0gaW1wbGljaXQKICAgVVNFX0VQT0xMICAgICAgID0gaW1wbGljaXQKLSAgVVNFX1NFUE9MTCAgICAgID0gaW1wbGljaXQKICAgVVNFX1RQUk9YWSAgICAgID0gaW1wbGljaXQKICAgVVNFX0xJQkNSWVBUICAgID0gaW1wbGljaXQKICAgVVNFX0ZVVEVYICAgICAgID0gaW1wbGljaXQKQEAgLTIzOCw3ICsyMzUsNiBAQAogICBVU0VfTkVURklMVEVSICAgPSBpbXBsaWNpdAogICBVU0VfUE9MTCAgICAgICAgPSBpbXBsaWNpdAogICBVU0VfRVBPTEwgICAgICAgPSBpbXBsaWNpdAotICBVU0VfU0VQT0xMICAgICAgPSBpbXBsaWNpdAogICBVU0VfVFBST1hZICAgICAgPSBpbXBsaWNpdAogICBVU0VfTElCQ1JZUFQgICAgPSBpbXBsaWNpdAogICBVU0VfTElOVVhfU1BMSUNFPSBpbXBsaWNpdApAQCAtNDI0LDEyICs0MjAsNiBAQAogQlVJTERfT1BUSU9OUyAgKz0gJChjYWxsIGlnbm9yZV9pbXBsaWNpdCxVU0VfRVBPTEwpCiBlbmRpZgogCi1pZm5lcSAoJChVU0VfU0VQT0xMKSwpCi1PUFRJT05TX0NGTEFHUyArPSAtREVOQUJMRV9TRVBPTEwKLU9QVElPTlNfT0JKUyAgICs9IHNyYy9ldl9zZXBvbGwubwotQlVJTERfT1BUSU9OUyAgKz0gJChjYWxsIGlnbm9yZV9pbXBsaWNpdCxVU0VfU0VQT0xMKQotZW5kaWYKLQogaWZuZXEgKCQoVVNFX01ZX0VQT0xMKSwpCiBPUFRJT05TX0NGTEFHUyArPSAtRFVTRV9NWV9FUE9MTAogQlVJTERfT1BUSU9OUyAgKz0gJChjYWxsIGlnbm9yZV9pbXBsaWNpdCxVU0VfTVlfRVBPTEwpCmRpZmYgLS1naXQgYS9kb2MvY29uZmlndXJhdGlvbi50eHQgYi9kb2MvY29uZmlndXJhdGlvbi50eHQKaW5kZXggZGZiMzdhZS4uYjUwMzcyMCAxMDA2NDQKLS0tIGEvZG9jL2NvbmZpZ3VyYXRpb24udHh0CisrKyBiL2RvYy9jb25maWd1cmF0aW9uLnR4dApAQCAtNDYxLDcgKzQ2MSw2IEBACiAgICAtIG5vZXBvbGwKICAgIC0gbm9rcXVldWUKICAgIC0gbm9wb2xsCi0gICAtIG5vc2Vwb2xsCiAgICAtIG5vc3BsaWNlCiAgICAtIHNwcmVhZC1jaGVja3MKICAgIC0gdHVuZS5idWZzaXplCkBAIC03MDgsNyArNzA3LDcgQEAKIG5vZXBvbGwKICAgRGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgImVwb2xsIiBldmVudCBwb2xsaW5nIHN5c3RlbSBvbiBMaW51eC4gSXQgaXMKICAgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50ICItZGUiLiBUaGUgbmV4dCBwb2xsaW5nIHN5c3RlbQotICB1c2VkIHdpbGwgZ2VuZXJhbGx5IGJlICJwb2xsIi4gU2VlIGFsc28gIm5vc2Vwb2xsIiwgYW5kICJub3BvbGwiLgorICB1c2VkIHdpbGwgZ2VuZXJhbGx5IGJlICJwb2xsIi4gU2VlIGFsc28gIm5vcG9sbCIuCiAKIG5va3F1ZXVlCiAgIERpc2FibGVzIHRoZSB1c2Ugb2YgdGhlICJrcXVldWUiIGV2ZW50IHBvbGxpbmcgc3lzdGVtIG9uIEJTRC4gSXQgaXMKQEAgLTcxOSwxMyArNzE4LDcgQEAKICAgRGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgInBvbGwiIGV2ZW50IHBvbGxpbmcgc3lzdGVtLiBJdCBpcyBlcXVpdmFsZW50IHRvIHRoZQogICBjb21tYW5kLWxpbmUgYXJndW1lbnQgIi1kcCIuIFRoZSBuZXh0IHBvbGxpbmcgc3lzdGVtIHVzZWQgd2lsbCBiZSAic2VsZWN0Ii4KICAgSXQgc2hvdWxkIG5ldmVyIGJlIG5lZWRlZCB0byBkaXNhYmxlICJwb2xsIiBzaW5jZSBpdCdzIGF2YWlsYWJsZSBvbiBhbGwKLSAgcGxhdGZvcm1zIHN1cHBvcnRlZCBieSBIQVByb3h5LiBTZWUgYWxzbyAibm9zZXBvbGwiLCBhbmQgIm5vcG9sbCIgYW5kCi0gICJub2txdWV1ZSIuCi0KLW5vc2Vwb2xsCi0gIERpc2FibGVzIHRoZSB1c2Ugb2YgdGhlICJzcGVjdWxhdGl2ZSBlcG9sbCIgZXZlbnQgcG9sbGluZyBzeXN0ZW0gb24gTGludXguIEl0Ci0gIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudCAiLWRzIi4gVGhlIG5leHQgcG9sbGluZyBzeXN0ZW0KLSAgdXNlZCB3aWxsIGdlbmVyYWxseSBiZSAiZXBvbGwiLiBTZWUgYWxzbyAibm9zZXBvbGwiLCBhbmQgIm5vcG9sbCIuCisgIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgSEFQcm94eS4gU2VlIGFsc28gIm5va3F1ZXVlIiBhbmQgIm5vZXBvbGwiLgogCiBub3NwbGljZQogICBEaXNhYmxlcyB0aGUgdXNlIG9mIGtlcm5lbCB0Y3Agc3BsaWNpbmcgYmV0d2VlbiBzb2NrZXRzIG9uIExpbnV4LiBJdCBpcwpkaWZmIC0tZ2l0IGEvZG9jL2hhcHJveHktZW4udHh0IGIvZG9jL2hhcHJveHktZW4udHh0CmluZGV4IDZhN2FhMDEuLjNkMmEyYmUgMTAwNjQ0Ci0tLSBhL2RvYy9oYXByb3h5LWVuLnR4dAorKysgYi9kb2MvaGFwcm94eS1lbi50eHQKQEAgLTYyLDcgKzYyLDYgQEAKICAgICAtcyBzaG93cyBzdGF0aXN0aWNzIChvbmx5IGlmIGNvbXBpbGVkIGluKQogICAgIC1sIHNob3dzIGV2ZW4gbW9yZSBzdGF0aXN0aWNzIChpbXBsaWVzICctcycpCiAgICAgLWRrIGRpc2FibGVzIHVzZSBvZiBrcXVldWUoKQotICAgIC1kcyBkaXNhYmxlcyB1c2Ugb2Ygc3BlY3VsYXRpdmUgZXBvbGwoKQogICAgIC1kZSBkaXNhYmxlcyB1c2Ugb2YgZXBvbGwoKQogICAgIC1kcCBkaXNhYmxlcyB1c2Ugb2YgcG9sbCgpCiAgICAgLWRiIGRpc2FibGVzIGJhY2tncm91bmQgbW9kZSAoc3RheXMgaW4gZm9yZWdyb3VuZCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpCkBAIC0xMzAsNyArMTI5LDYgQEAKICAgLSBkYWVtb24KICAgLSBkZWJ1ZwogICAtIG5va3F1ZXVlCi0gIC0gbm9zZXBvbGwKICAgLSBub2Vwb2xsCiAgIC0gbm9wb2xsCiAgIC0gcXVpZXQKQEAgLTM1Nyw4ICszNTUsOCBAQAogSGFwcm94eSB3aWxsIHVzZSBrcXVldWUoKSBvciBzcGVjdWxhdGl2ZSBlcG9sbCgpIHdoZW4gYXZhaWxhYmxlLCB0aGVuIGVwb2xsKCksCiBhbmQgd2lsbCBmYWxsIGJhY2sgdG8gcG9sbCgpLCB0aGVuIHRvIHNlbGVjdCgpLiBIb3dldmVyLCBpZiBmb3IgYW55IHJlYXNvbiB5b3UKIG5lZWQgdG8gZGlzYWJsZSBlcG9sbCgpIG9yIHBvbGwoKSAoZWcuIGJlY2F1c2Ugb2YgYSBidWcgb3IganVzdCB0byBjb21wYXJlCi1wZXJmb3JtYW5jZSksIG5ldyBnbG9iYWwgb3B0aW9ucyBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgdGhpcyBtYXR0ZXIgOiAnbm9zZXBvbGwnLAotJ25va3F1ZXVlJywgJ25vZXBvbGwnIGFuZCAnbm9wb2xsJy4KK3BlcmZvcm1hbmNlKSwgbmV3IGdsb2JhbCBvcHRpb25zIGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGlzIG1hdHRlciA6ICdub3BvbGwnLAorJ25va3F1ZXVlJywgYW5kICdub2Vwb2xsJy4KIAogRXhhbXBsZSA6CiAtLS0tLS0tLS0KQEAgLTM3OCw3ICszNzYsNyBAQAogVG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLCB0aGUgJy1kZScgcnVudGltZSBhcmd1bWVudCBkaXNhYmxlcyBlcG9sbCBzdXBwb3J0LAogdGhlICctZHAnIGFyZ3VtZW50IGRpc2FibGVzIHBvbGwgc3VwcG9ydCwgJy1kaycgZGlzYWJsZXMga3F1ZXVlIGFuZCAnLWRzJwogZGlzYWJsZXMgc3BlY3VsYXRpdmUgZXBvbGwoKS4gVGhleSBhcmUgcmVzcGVjdGl2ZWx5IGVxdWl2YWxlbnQgdG8gJ25vZXBvbGwnLAotJ25vcG9sbCcsICdub2txdWV1ZScgYW5kICdub3NlcG9sbCcuCisnbm9wb2xsJywgYW5kICdub2txdWV1ZScuCiAKIAogMikgRGVjbGFyYXRpb24gb2YgYSBsaXN0ZW5pbmcgc2VydmljZQpkaWZmIC0tZ2l0IGEvZG9jL2hhcHJveHktZnIudHh0IGIvZG9jL2hhcHJveHktZnIudHh0CmluZGV4IDg5ZGY4Y2IuLjg3YmI5NzIgMTAwNjQ0Ci0tLSBhL2RvYy9oYXByb3h5LWZyLnR4dAorKysgYi9kb2MvaGFwcm94eS1mci50eHQKQEAgLTEzNyw3ICsxMzcsNiBAQAogICAtIGRhZW1vbgogICAtIGRlYnVnCiAgIC0gbm9rcXVldWUKLSAgLSBub3NlcG9sbAogICAtIG5vZXBvbGwKICAgLSBub3BvbGwKICAgLSBxdWlldApAQCAtMzg0LDcgKzM4Myw3IEBACiBDZXBlbmRhbnQsIHNpIHBvdXIgdW5lIHJhaXNvbiBxdWVsY29ucXVlIGlsIHMnYXbpcmFpdCBu6WNlc3NhaXJlIGRlIGTpc2FjdGl2ZXIKIGVwb2xsKCkgb3UgcG9sbCgpIChwLmV4OiDgIGNhdXNlIGQndW4gYnVnIG91IGp1c3RlIHBvdXIgY29tcGFyZXIgbGVzCiBwZXJmb3JtYW5jZXMpLCBkZSBub3V2ZWxsZXMgb3B0aW9ucyBnbG9iYWxlcyBvbnQg6XTpIGFqb3V06WVzIGRhbnMgY2UgYnV0IDoKLSdub3NlcG9sbCcsICdub2txdWV1ZScsICdub2Vwb2xsJyBldCAnbm9wb2xsJy4KKydub2txdWV1ZScsICdub2Vwb2xsJyBldCAnbm9wb2xsJy4KIAogRXhlbXBsZSA6CiAtLS0tLS0tLS0KQEAgLTQwMyw3ICs0MDIsNyBAQAogQWZpbiBkZSBzaW1wbGlmaWVyIGxhIHLpc29sdXRpb24gZGUgcHJvYmzobWVzLCBsZSBwYXJhbeh0cmUgJy1kZScgZW4gbGlnbmUgZGUKIGNvbW1hbmRlIGTpc2FjdGl2ZSBlcG9sbCgpLCBsZSBwYXJhbeh0cmUgJy1kcCcgZOlzYWN0aXZlIHBvbGwoKSwgJy1kaycga3F1ZXVlKCkKIGV0ICctZHMnIGTpc2FjdGl2ZSBzcGVjdWxhdGl2ZSBlcG9sbCgpLiBJbHMgc29udCByZXNwZWN0aXZlbWVudCDpcXVpdmFsZW50cyDgCi0nbm9lcG9sbCcsICdub3BvbGwnLCAnbm9rcXVldWUnIGV0ICdub3NlcG9sbCcuCisnbm9lcG9sbCcsICdub3BvbGwnLCBldCAnbm9rcXVldWUnLgogCiAKIDIpIETpZmluaXRpb24gZCd1biBzZXJ2aWNlIGVuIOljb3V0ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb24vZXBvbGwuaCBiL2luY2x1ZGUvY29tbW9uL2Vwb2xsLmgKaW5kZXggNDk1MzIzMC4uY2MzOTVjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tb24vZXBvbGwuaAorKysgYi9pbmNsdWRlL2NvbW1vbi9lcG9sbC5oCkBAIC0yLDcgKzIsNyBAQAogICogaW5jbHVkZS9jb21tb24vZXBvbGwuaAogICogZXBvbGwgZGVmaW5pdGlvbnMgZm9yIG9sZGVyIGxpYmMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMTEgV2lsbHkgVGFycmVhdSAtIHdAMXd0LmV1CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMiBXaWxseSBUYXJyZWF1IC0gd0Axd3QuZXUKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yOSw3ICsyOSw3IEBACiAjaWZuZGVmIF9DT01NT05fRVBPTExfSAogI2RlZmluZSBfQ09NTU9OX0VQT0xMX0gKIAotI2lmIGRlZmluZWQgKF9fbGludXhfXykgJiYgKGRlZmluZWQoRU5BQkxFX0VQT0xMKSB8fCBkZWZpbmVkKEVOQUJMRV9TRVBPTEwpKQorI2lmIGRlZmluZWQgKF9fbGludXhfXykgJiYgZGVmaW5lZChFTkFCTEVfRVBPTEwpCiAKICNpZm5kZWYgVVNFX01ZX0VQT0xMCiAjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CkBAIC05NCw3ICs5NCw3IEBACiAKICNlbmRpZiAvKiBVU0VfTVlfRVBPTEwgKi8KIAotI2VuZGlmIC8qIF9fbGludXhfXyAmJiAoRU5BQkxFX0VQT0xMIHx8IEVOQUJMRV9TRVBPTEwpICovCisjZW5kaWYgLyogX19saW51eF9fICYmIEVOQUJMRV9FUE9MTCAqLwogCiAjZW5kaWYgLyogX0NPTU1PTl9FUE9MTF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHlwZXMvZ2xvYmFsLmggYi9pbmNsdWRlL3R5cGVzL2dsb2JhbC5oCmluZGV4IDZiMjY3ZmIuLjlkMmVlZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHlwZXMvZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS90eXBlcy9nbG9iYWwuaApAQCAtMiw3ICsyLDcgQEAKICAqIGluY2x1ZGUvdHlwZXMvZ2xvYmFsLmgKICAqIEdsb2JhbCB2YXJpYWJsZXMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMTAgV2lsbHkgVGFycmVhdSAtIHdAMXd0LmV1CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMiBXaWxseSBUYXJyZWF1IC0gd0Axd3QuZXUKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC01NCw5ICs1NCw4IEBACiAjZGVmaW5lIEdUVU5FX1VTRV9QT0xMICAgICAgICAgICAoMTw8MSkKICNkZWZpbmUgR1RVTkVfVVNFX0VQT0xMICAgICAgICAgICgxPDwyKQogI2RlZmluZSBHVFVORV9VU0VfS1FVRVVFICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIEdUVU5FX1VTRV9TRVBPTEwgICAgICAgICAoMTw8NCkKIC8qIHBsYXRmb3JtLXNwZWNpZmljIG9wdGlvbnMgKi8KLSNkZWZpbmUgR1RVTkVfVVNFX1NQTElDRSAgICAgICAgICgxPDw1KQorI2RlZmluZSBHVFVORV9VU0VfU1BMSUNFICAgICAgICAgKDE8PDQpCiAKIC8qIEFjY2VzcyBsZXZlbCBmb3IgYSBzdGF0cyBzb2NrZXQgKi8KICNkZWZpbmUgQUNDRVNTX0xWTF9OT05FICAgICAwCmRpZmYgLS1naXQgYS9zcmMvY2ZncGFyc2UuYyBiL3NyYy9jZmdwYXJzZS5jCmluZGV4IDZhNGUwYmIuLjZjNThlNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jZmdwYXJzZS5jCisrKyBiL3NyYy9jZmdwYXJzZS5jCkBAIC01MTQsOSArNTE0LDYgQEAKIAllbHNlIGlmICghc3RyY21wKGFyZ3NbMF0sICJub2Vwb2xsIikpIHsKIAkJZ2xvYmFsLnR1bmUub3B0aW9ucyAmPSB+R1RVTkVfVVNFX0VQT0xMOwogCX0KLQllbHNlIGlmICghc3RyY21wKGFyZ3NbMF0sICJub3NlcG9sbCIpKSB7Ci0JCWdsb2JhbC50dW5lLm9wdGlvbnMgJj0gfkdUVU5FX1VTRV9TRVBPTEw7Ci0JfQogCWVsc2UgaWYgKCFzdHJjbXAoYXJnc1swXSwgIm5va3F1ZXVlIikpIHsKIAkJZ2xvYmFsLnR1bmUub3B0aW9ucyAmPSB+R1RVTkVfVVNFX0tRVUVVRTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvZXZfZXBvbGwuYyBiL3NyYy9ldl9lcG9sbC5jCmluZGV4IDkwNzY5YzEuLjYyNzE4ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9ldl9lcG9sbC5jCisrKyBiL3NyYy9ldl9lcG9sbC5jCkBAIC0xLDEzICsxLDEyIEBACiAvKgotICogRkQgcG9sbGluZyBmdW5jdGlvbnMgZm9yIGxpbnV4IGVwb2xsKCkKKyAqIEZEIHBvbGxpbmcgZnVuY3Rpb25zIGZvciBMaW51eCBlcG9sbAogICoKLSAqIENvcHlyaWdodCAyMDAwLTIwMTEgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CisgKiBDb3B5cmlnaHQgMjAwMC0yMDEyIFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgogICovCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTE2LDM3ICsxNSwyMSBAQAogCiAjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgogI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KICNpbmNsdWRlIDxjb21tb24vZXBvbGwuaD4KICNpbmNsdWRlIDxjb21tb24vc3RhbmRhcmQuaD4KICNpbmNsdWRlIDxjb21tb24vdGlja3MuaD4KICNpbmNsdWRlIDxjb21tb24vdGltZS5oPgogI2luY2x1ZGUgPGNvbW1vbi90b29scy5oPgogCi0jaW5jbHVkZSA8dHlwZXMvZmQuaD4KICNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KIAorI2luY2x1ZGUgPHByb3RvL2ZkLmg+CiAjaW5jbHVkZSA8cHJvdG8vc2lnbmFsLmg+CiAjaW5jbHVkZSA8cHJvdG8vdGFzay5oPgogCi0vKiBUaGlzIGlzIHdoYXQgd2Ugc3RvcmUgaW4gYSBsaXN0LiBJdCBjb25zaXN0cyBpbiBvbGQgdmFsdWVzIGFuZCBmZHMgdG8gZGV0ZWN0IGNoYW5nZXMuICovCi1zdHJ1Y3QgZmRfY2hnIHsKLQl1bnNpZ25lZCBpbnQgcHJldjoyOwkvLyBwcmV2aW91cyBzdGF0ZSBtYXNrLiBOZXcgb25lIGlzIGluIGZkX2V2dHMuCi0JdW5zaWduZWQgaW50IGZkOjMwOwkvLyBmaWxlIGRlc2NyaXB0b3IKLX07Ci0KLXN0YXRpYyBpbnQgbmJjaGFuZ2VzID0gMDsJCS8vIG51bWJlciBvZiBjaGFuZ2VzIHBlbmRpbmcKLXN0YXRpYyBzdHJ1Y3QgZmRfY2hnICpjaGdfbGlzdCA9IE5VTEw7CS8vIGxpc3Qgb2YgY2hhbmdlcwotc3RhdGljIHN0cnVjdCBmZF9jaGcgKipjaGdfcHRyID0gTlVMTDsJLy8gcGVyLWZkIGNoYW5nZXMKLQotLyogRWFjaCAzMi1iaXQgd29yZCBjb250YWlucyAyLWJpdCBkZXNjcmlwdG9ycyBvZiB0aGUgbGF0ZXN0IHN0YXRlIGZvciAxNiBGRHMgOgotICogICBkZXNjID0gKHUzMiA+PiAoMipmZCkpICYgMwotICogICBkZXNjID0gMCA6IEZEIG5vdCBzZXQKLSAqICAgICAgICAgIDEgOiBXUklURSBub3Qgc2V0LCBSRUFEIHNldAotICogICAgICAgICAgMiA6IFdSSVRFIHNldCwgUkVBRCBub3Qgc2V0Ci0gKiAgICAgICAgICAzIDogV1JJVEUgc2V0LCBSRUFEIHNldAotICovCiAKLXN0YXRpYyB1aW50MzJfdCAqZmRfZXZ0czsKK3N0YXRpYyBpbnQgYWJzbWF4ZXZlbnRzID0gMDsgICAgLy8gYWJzb2x1dGUgbWF4aW11bSBhbW91bnRzIG9mIHBvbGxlZCBldmVudHMKIAogLyogcHJpdmF0ZSBkYXRhICovCiBzdGF0aWMgc3RydWN0IGVwb2xsX2V2ZW50ICplcG9sbF9ldmVudHM7CkBAIC01NywxOTAgKzQwLDEwMiBAQAogICovCiBzdGF0aWMgc3RydWN0IGVwb2xsX2V2ZW50IGV2OwogCi0vKiBjb252ZXJ0cyBhIGRpcmVjdGlvbiB0byBhIHNpbmdsZSBiaXRtYXNrLgotICogIDAgPT4gMQotICogIDEgPT4gMgotICovCi0jZGVmaW5lIERJUjJNU0soZGlyKSAoKGRpcikgKyAxKQotCi0vKiBjb252ZXJ0cyBhbiBGRCB0byBhbiBmZF9ldnRzIG9mZnNldCBhbmQgdG8gYSBiaXQgc2hpZnQgKi8KLSNkZWZpbmUgRkQyT0ZTKGZkKSAgICgodWludDMyX3QpKGZkKSA+PiA0KQotI2RlZmluZSBGRDJCSVQoZmQpICAgKCgodWludDMyX3QpKGZkKSAmIDB4RikgPDwgMSkKLSNkZWZpbmUgRkQyTVNLKGZkKSAgICgzIDw8IEZEMkJJVChmZCkpCi0KIC8qCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGRpcmVjdGlvbiA8ZGlyPiBpcyBhbHJlYWR5IHNldCBmb3IgPGZkPi4KKyAqIHNwZWN1bGF0aXZlIGVwb2xsKCkgcG9sbGVyCiAgKi8KLVJFR1BSTTIgc3RhdGljIGludCBfX2ZkX2lzX3NldChjb25zdCBpbnQgZmQsIGludCBkaXIpCi17Ci0JcmV0dXJuIChmZF9ldnRzW0ZEMk9GUyhmZCldID4+IEZEMkJJVChmZCkpICYgRElSMk1TSyhkaXIpOwotfQotCi0vKgotICogQWRkcywgbW9kcyBvciBkZWxldGVzIDxmZD4gYWNjb3JkaW5nIHRvIGN1cnJlbnQgc3RhdHVzIGFuZCB0byBuZXcgZGVzaXJlZAotICogbWFzayA8ZG1hc2s+IDoKLSAqCi0gKiAgICAwID0gbm90aGluZwotICogICAgMSA9IEVQT0xMSU4KLSAqICAgIDIgPSBFUE9MTE9VVAotICogICAgMyA9IEVQT0xMSU4gfCBFUE9MTE9VVAotICoKLSAqLwotc3RhdGljIGludCBkbXNrMmV2ZW50WzRdID0geyAwLCBFUE9MTElOLCBFUE9MTE9VVCwgRVBPTExJTiB8IEVQT0xMT1VUIH07Ci0KLQotUkVHUFJNMiBzdGF0aWMgdm9pZCBmZF9mbHVzaF9jaGFuZ2VzKCkKK1JFR1BSTTIgc3RhdGljIHZvaWQgX2RvX3BvbGwoc3RydWN0IHBvbGxlciAqcCwgaW50IGV4cCkKIHsKLQl1aW50MzJfdCBvZnM7Ci0JaW50IG9wY29kZTsKLQlpbnQgcHJldiwgbmV4dDsKLQlpbnQgY2hnLCBmZDsKKwlpbnQgc3RhdHVzLCBlbywgZW47CisJaW50IGZkLCBvcGNvZGU7CisJaW50IGNvdW50OworCWludCB1cGR0X2lkeDsKKwlpbnQgd2FpdF90aW1lOwogCi0JZm9yIChjaGcgPSAwOyBjaGcgPCBuYmNoYW5nZXM7IGNoZysrKSB7Ci0JCXByZXYgPSBjaGdfbGlzdFtjaGddLnByZXY7Ci0JCWZkID0gY2hnX2xpc3RbY2hnXS5mZDsKLQkJY2hnX3B0cltmZF0gPSBOVUxMOworCS8qIGZpcnN0LCBzY2FuIHRoZSB1cGRhdGUgbGlzdCB0byBmaW5kIGNoYW5nZXMgKi8KKwlmb3IgKHVwZHRfaWR4ID0gMDsgdXBkdF9pZHggPCBmZF9uYnVwZHQ7IHVwZHRfaWR4KyspIHsKKwkJZmQgPSBmZF91cGR0W3VwZHRfaWR4XTsKKwkJZW4gPSBmZHRhYltmZF0uc3BlY19lICYgMTU7ICAvKiBuZXcgZXZlbnRzICovCisJCWVvID0gZmR0YWJbZmRdLnNwZWNfZSA+PiA0OyAgLyogcHJldmlvdXMgZXZlbnRzICovCiAKLQkJb2ZzID0gRkQyT0ZTKGZkKTsKLQkJbmV4dCA9IChmZF9ldnRzW29mc10gPj4gRkQyQklUKGZkKSkgJiAzOworCQlpZiAoZmR0YWJbZmRdLm93bmVyICYmIChlbyBeIGVuKSkgeworCQkJaWYgKChlbyBeIGVuKSAmIEZEX0VWX1BPTExFRF9SVykgeworCQkJCS8qIHBvbGwgc3RhdHVzIGNoYW5nZWQgKi8KKwkJCQlpZiAoKGVuICYgRkRfRVZfUE9MTEVEX1JXKSA9PSAwKSB7CisJCQkJCS8qIGZkIHJlbW92ZWQgZnJvbSBwb2xsIGxpc3QgKi8KKwkJCQkJb3Bjb2RlID0gRVBPTExfQ1RMX0RFTDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGVvICYgRkRfRVZfUE9MTEVEX1JXKSA9PSAwKSB7CisJCQkJCS8qIG5ldyBmZCBpbiB0aGUgcG9sbCBsaXN0ICovCisJCQkJCW9wY29kZSA9IEVQT0xMX0NUTF9BREQ7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBmZCBzdGF0dXMgY2hhbmdlZCAqLworCQkJCQlvcGNvZGUgPSBFUE9MTF9DVExfTU9EOworCQkJCX0KIAotCQlpZiAocHJldiA9PSBuZXh0KQotCQkJLyogaWYgdGhlIHZhbHVlIHdhcyB1bmNoYW5nZWQsIGRvIG5vdGhpbmcgKi8KLQkJCWNvbnRpbnVlOworCQkJCS8qIGNvbnN0cnVjdCB0aGUgZXBvbGwgZXZlbnRzIGJhc2VkIG9uIG5ldyBzdGF0ZSAqLworCQkJCWV2LmV2ZW50cyA9IDA7CisJCQkJaWYgKGVuICYgRkRfRVZfUE9MTEVEX1IpCisJCQkJCWV2LmV2ZW50cyB8PSBFUE9MTElOOwogCi0JCWV2LmV2ZW50cyA9IGRtc2syZXZlbnRbbmV4dF07Ci0JCWV2LmRhdGEuZmQgPSBmZDsKKwkJCQlpZiAoZW4gJiBGRF9FVl9QT0xMRURfVykKKwkJCQkJZXYuZXZlbnRzIHw9IEVQT0xMT1VUOwogCi0JCWlmIChwcmV2KSB7Ci0JCQlpZiAoIW5leHQpIHsKLQkJCQkvKiB3ZSB3YW50IHRvIGRlbGV0ZSBpdCBub3cgKi8KLQkJCQlvcGNvZGUgPSBFUE9MTF9DVExfREVMOwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3ZSB3YW50IHRvIHN3aXRjaCBpdCAqLwotCQkJCW9wY29kZSA9IEVQT0xMX0NUTF9NT0Q7CisJCQkJZXYuZGF0YS5mZCA9IGZkOworCQkJCWVwb2xsX2N0bChlcG9sbF9mZCwgb3Bjb2RlLCBmZCwgJmV2KTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHRoZSBGRCBkaWQgbm90IGV4aXN0LCBsZXQncyBhZGQgaXQgKi8KLQkJCW9wY29kZSA9IEVQT0xMX0NUTF9BREQ7Ci0JCX0KLQotCQllcG9sbF9jdGwoZXBvbGxfZmQsIG9wY29kZSwgZmQsICZldik7Ci0JfQotCW5iY2hhbmdlcyA9IDA7Ci19Ci0KLVJFR1BSTTIgc3RhdGljIHZvaWQgYWxsb2NfY2hnX2xpc3QoY29uc3QgaW50IGZkLCBpbnQgb2xkX2V2dCkKLXsKLQlzdHJ1Y3QgZmRfY2hnICpwdHI7Ci0KLQlpZiAodW5saWtlbHkoY2hnX3B0cltmZF0gIT0gTlVMTCkpCi0JCXJldHVybjsKLQotI2lmIExJTUlUX05VTUJFUl9PRl9DSEFOR0VTCi0JaWYgKG5iY2hhbmdlcyA+IDIpCi0JCWZkX2ZsdXNoX2NoYW5nZXMoKTsKLSNlbmRpZgotCi0JcHRyID0gJmNoZ19saXN0W25iY2hhbmdlcysrXTsKLQljaGdfcHRyW2ZkXSA9IHB0cjsKLQlwdHItPmZkID0gZmQ7Ci0JcHRyLT5wcmV2ID0gb2xkX2V2dDsKLX0KLQotUkVHUFJNMiBzdGF0aWMgdm9pZCBfX2ZkX3NldChjb25zdCBpbnQgZmQsIGludCBkaXIpCi17Ci0JdWludDMyX3Qgb2ZzID0gRkQyT0ZTKGZkKTsKLQl1aW50MzJfdCBkbXNrID0gRElSMk1TSyhkaXIpOwotCXVpbnQzMl90IG9sZF9ldnQ7Ci0KLQlvbGRfZXZ0ID0gZmRfZXZ0c1tvZnNdID4+IEZEMkJJVChmZCk7Ci0Jb2xkX2V2dCAmPSAzOwotCWlmICh1bmxpa2VseShvbGRfZXZ0ICYgZG1zaykpCi0JCXJldHVybjsKLQotCWFsbG9jX2NoZ19saXN0KGZkLCBvbGRfZXZ0KTsKLQlkbXNrIDw8PSBGRDJCSVQoZmQpOwotCWZkX2V2dHNbb2ZzXSB8PSBkbXNrOwotfQotCi1SRUdQUk0yIHN0YXRpYyB2b2lkIF9fZmRfY2xyKGNvbnN0IGludCBmZCwgaW50IGRpcikKLXsKLQl1aW50MzJfdCBvZnMgPSBGRDJPRlMoZmQpOwotCXVpbnQzMl90IGRtc2sgPSBESVIyTVNLKGRpcik7Ci0JdWludDMyX3Qgb2xkX2V2dDsKLQotCW9sZF9ldnQgPSBmZF9ldnRzW29mc10gPj4gRkQyQklUKGZkKTsKLQlvbGRfZXZ0ICY9IDM7Ci0JaWYgKHVubGlrZWx5KCEob2xkX2V2dCAmIGRtc2spKSkKLQkJcmV0dXJuOwotCi0JYWxsb2NfY2hnX2xpc3QoZmQsIG9sZF9ldnQpOwotCWRtc2sgPDw9IEZEMkJJVChmZCk7Ci0JZmRfZXZ0c1tvZnNdICY9IH5kbXNrOwotfQotCi1SRUdQUk0xIHN0YXRpYyB2b2lkIF9fZmRfcmVtKGludCBmZCkKLXsKLQl1aW50MzJfdCBvZnMgPSBGRDJPRlMoZmQpOwotCXVpbnQzMl90IG9sZF9ldnQ7CiAKLQlvbGRfZXZ0ID0gZmRfZXZ0c1tvZnNdID4+IEZEMkJJVChmZCk7Ci0Jb2xkX2V2dCAmPSAzOworCQkJZmR0YWJbZmRdLnNwZWNfZSA9IChlbiA8PCA0KSArIGVuOyAgLyogc2F2ZSBuZXcgZXZlbnRzICovCiAKLQlpZiAodW5saWtlbHkoIW9sZF9ldnQpKQotCQlyZXR1cm47Ci0KLQlhbGxvY19jaGdfbGlzdChmZCwgb2xkX2V2dCk7Ci0JZmRfZXZ0c1tvZnNdICY9IH5GRDJNU0soZmQpOwotfQorCQkJaWYgKCEoZW4gJiBGRF9FVl9BQ1RJVkVfUlcpKSB7CisJCQkJLyogVGhpcyBmZCBkb2Vzbid0IHVzZSBhbnkgYWN0aXZlIGVudHJ5IGFueW1vcmUsIHdlIGNhbgorCQkJCSAqIGtpbGwgaXRzIGVudHJ5LgorCQkJCSAqLworCQkJCXJlbGVhc2Vfc3BlY19lbnRyeShmZCk7CisJCQl9CisJCQllbHNlIGlmICgoZW4gJiB+ZW8pICYgRkRfRVZfQUNUSVZFX1JXKSB7CisJCQkJLyogd2UgbmVlZCBhIG5ldyBzcGVjIGVudHJ5IG5vdyAqLworCQkJCWFsbG9jX3NwZWNfZW50cnkoZmQpOworCQkJfQogCi0vKgotICogT24gdmFsaWQgZXBvbGwoKSBpbXBsZW1lbnRhdGlvbnMsIGEgY2FsbCB0byBjbG9zZSgpIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcwotICogdGhlIGZkcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBGRCB3aWxsIGFwcGVhciBhcyBwcmV2aW91c2x5IHVuc2V0LgotICovCi1SRUdQUk0xIHN0YXRpYyB2b2lkIF9fZmRfY2xvKGludCBmZCkKLXsKLQlzdHJ1Y3QgZmRfY2hnICpwdHI7Ci0JZmRfZXZ0c1tGRDJPRlMoZmQpXSAmPSB+RkQyTVNLKGZkKTsKLQlwdHIgPSBjaGdfcHRyW2ZkXTsKLQlpZiAocHRyKSB7Ci0JCXB0ci0+cHJldiA9IDA7Ci0JCWNoZ19wdHJbZmRdID0gTlVMTDsKKwkJfQorCQlmZHRhYltmZF0udXBkYXRlZCA9IDA7CisJCWZkdGFiW2ZkXS5uZXcgPSAwOwogCX0KLX0KLQotLyoKLSAqIGVwb2xsKCkgcG9sbGVyCi0gKi8KLVJFR1BSTTIgc3RhdGljIHZvaWQgX2RvX3BvbGwoc3RydWN0IHBvbGxlciAqcCwgaW50IGV4cCkKLXsKLQlpbnQgc3RhdHVzOwotCWludCBmZDsKLQlpbnQgY291bnQ7Ci0JaW50IHdhaXRfdGltZTsKKwlmZF9uYnVwZHQgPSAwOwogCi0JaWYgKGxpa2VseShuYmNoYW5nZXMpKQotCQlmZF9mbHVzaF9jaGFuZ2VzKCk7CisJLyogY29tcHV0ZSB0aGUgZXBvbGxfd2FpdCgpIHRpbWVvdXQgKi8KIAotCS8qIG5vdyBsZXQncyB3YWl0IGZvciBldmVudHMgKi8KLQlpZiAocnVuX3F1ZXVlIHx8IHNpZ25hbF9xdWV1ZV9sZW4pCi0JCXdhaXRfdGltZSA9IDA7Ci0JZWxzZSBpZiAoIWV4cCkKLQkJd2FpdF90aW1lID0gTUFYX0RFTEFZX01TOwotCWVsc2UgaWYgKHRpY2tfaXNfZXhwaXJlZChleHAsIG5vd19tcykpCisJaWYgKGZkX25ic3BlYyB8fCBydW5fcXVldWUgfHwgc2lnbmFsX3F1ZXVlX2xlbikgeworCQkvKiBNYXliZSB3ZSBzdGlsbCBoYXZlIGV2ZW50cyBpbiB0aGUgc3BlYyBsaXN0LCBvciB0aGVyZSBhcmUKKwkJICogc29tZSB0YXNrcyBsZWZ0IHBlbmRpbmcgaW4gdGhlIHJ1bl9xdWV1ZSwgc28gd2UgbXVzdCBub3QKKwkJICogd2FpdCBpbiBlcG9sbCgpIG90aGVyd2lzZSB3ZSB3b3VsZCBkZWxheSB0aGVpciBkZWxpdmVyeSBieQorCQkgKiB0aGUgbmV4dCB0aW1lb3V0LgorCQkgKi8KIAkJd2FpdF90aW1lID0gMDsKKwl9CiAJZWxzZSB7Ci0JCXdhaXRfdGltZSA9IFRJQ0tTX1RPX01TKHRpY2tfcmVtYWluKG5vd19tcywgZXhwKSkgKyAxOwotCQlpZiAod2FpdF90aW1lID4gTUFYX0RFTEFZX01TKQorCQlpZiAoIWV4cCkKIAkJCXdhaXRfdGltZSA9IE1BWF9ERUxBWV9NUzsKKwkJZWxzZSBpZiAodGlja19pc19leHBpcmVkKGV4cCwgbm93X21zKSkKKwkJCXdhaXRfdGltZSA9IDA7CisJCWVsc2UgeworCQkJd2FpdF90aW1lID0gVElDS1NfVE9fTVModGlja19yZW1haW4obm93X21zLCBleHApKSArIDE7CisJCQlpZiAod2FpdF90aW1lID4gTUFYX0RFTEFZX01TKQorCQkJCXdhaXRfdGltZSA9IE1BWF9ERUxBWV9NUzsKKwkJfQogCX0KIAorCS8qIG5vdyBsZXQncyB3YWl0IGZvciBwb2xsZWQgZXZlbnRzICovCisKIAlmZCA9IE1JTihtYXhmZCwgZ2xvYmFsLnR1bmUubWF4cG9sbGV2ZW50cyk7CiAJZ2V0dGltZW9mZGF5KCZiZWZvcmVfcG9sbCwgTlVMTCk7CiAJc3RhdHVzID0gZXBvbGxfd2FpdChlcG9sbF9mZCwgZXBvbGxfZXZlbnRzLCBmZCwgd2FpdF90aW1lKTsKIAl0dl91cGRhdGVfZGF0ZSh3YWl0X3RpbWUsIHN0YXR1cyk7CiAJbWVhc3VyZV9pZGxlKCk7CiAKKwkvKiBwcm9jZXNzIHBvbGxlZCBldmVudHMgKi8KKwogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHN0YXR1czsgY291bnQrKykgewogCQlpbnQgZSA9IGVwb2xsX2V2ZW50c1tjb3VudF0uZXZlbnRzOwogCQlmZCA9IGVwb2xsX2V2ZW50c1tjb3VudF0uZGF0YS5mZDsKQEAgLTI1OSw1MyArMTU0LDg0IEBACiAJCQkoKGUgJiBFUE9MTEVSUikgPyBGRF9QT0xMX0VSUiA6IDApIHwKIAkJCSgoZSAmIEVQT0xMSFVQKSA/IEZEX1BPTExfSFVQIDogMCk7CiAKKwkJaWYgKGZkdGFiW2ZkXS5pb2NiICYmIGZkdGFiW2ZkXS5vd25lciAmJiBmZHRhYltmZF0uZXYpIHsKKwkJCWludCBuZXdfdXBkdCwgb2xkX3VwZHQgPSBmZF9uYnVwZHQ7IC8qIFNhdmUgbnVtYmVyIG9mIHVwZGF0ZXMgdG8gZGV0ZWN0IGNyZWF0aW9uIG9mIG5ldyBGRHMuICovCisKLQkJaWYgKGZkdGFiW2ZkXS5pb2NiICYmIGZkdGFiW2ZkXS5vd25lciAmJiBmZHRhYltmZF0uZXYpCisJCQkvKiBNYXJrIHRoZSBldmVudHMgYXMgc3BlY3VsYXRpdmUgYmVmb3JlIHByb2Nlc3NpbmcKKwkJCSAqIHRoZW0gc28gdGhhdCBpZiBub3RoaW5nIGNhbiBiZSBkb25lIHdlIGRvbid0IG5lZWQKKwkJCSAqIHRvIHBvbGwgYWdhaW4uCisJCQkgKi8KKwkJCWlmIChmZHRhYltmZF0uZXYgJiAoRkRfUE9MTF9JTnxGRF9QT0xMX0hVUHxGRF9QT0xMX0VSUikpCisJCQkJZmRfZXZfc2V0KGZkLCBESVJfUkQpOworCisJCQlpZiAoZmR0YWJbZmRdLmV2ICYgKEZEX1BPTExfT1VUfEZEX1BPTExfRVJSKSkKKwkJCQlmZF9ldl9zZXQoZmQsIERJUl9XUik7CisKIAkJCWZkdGFiW2ZkXS5pb2NiKGZkKTsKKworCQkJLyogT25lIG9yIG1vcmUgZmQgbWlnaHQgaGF2ZSBiZWVuIGNyZWF0ZWQgZHVyaW5nIHRoZSBpb2NiKCkuCisJCQkgKiBUaGlzIG1haW5seSBoYXBwZW5zIHdpdGggbmV3IGluY29taW5nIGNvbm5lY3Rpb25zIHRoYXQgaGF2ZQorCQkJICoganVzdCBiZWVuIGFjY2VwdGVkLCBzbyB3ZSdkIGxpa2UgdG8gcHJvY2VzcyB0aGVtIGltbWVkaWF0ZWx5CisJCQkgKiBmb3IgYmV0dGVyIGVmZmljaWVuY3kuIFNlY29uZCBiZW5lZml0LCBpZiBhdCB0aGUgZW5kIHRoZSBmZHMKKwkJCSAqIGFyZSBkaXNhYmxlZCBhZ2Fpbiwgd2UgY2FuIHNhZmVseSBkZXN0cm95IHRoZWlyIHVwZGF0ZSBlbnRyeQorCQkJICogdG8gcmVkdWNlIHRoZSBzY29wZSBvZiBsYXRlciBzY2Fucy4gVGhpcyBpcyB0aGUgcmVhc29uIHdlCisJCQkgKiBzY2FuIHRoZSBuZXcgZW50cmllcyBiYWNrd2FyZHMuCisJCQkgKi8KKworCQkJZm9yIChuZXdfdXBkdCA9IGZkX25idXBkdDsgbmV3X3VwZHQgPiBvbGRfdXBkdDsgbmV3X3VwZHQtLSkgeworCQkJCWZkID0gZmRfdXBkdFtuZXdfdXBkdCAtIDFdOworCQkJCWlmICghZmR0YWJbZmRdLm5ldykKKwkJCQkJY29udGludWU7CisKKwkJCQlmZHRhYltmZF0ubmV3ID0gMDsKKwkJCQlmZHRhYltmZF0uZXYgJj0gRkRfUE9MTF9TVElDS1k7CisKKwkJCQlpZiAoKGZkdGFiW2ZkXS5zcGVjX2UgJiBGRF9FVl9TVEFUVVNfUikgPT0gRkRfRVZfQUNUSVZFX1IpCisJCQkJCWZkdGFiW2ZkXS5ldiB8PSBGRF9QT0xMX0lOOworCisJCQkJaWYgKChmZHRhYltmZF0uc3BlY19lICYgRkRfRVZfU1RBVFVTX1cpID09IEZEX0VWX0FDVElWRV9XKQorCQkJCQlmZHRhYltmZF0uZXYgfD0gRkRfUE9MTF9PVVQ7CisKKwkJCQlpZiAoZmR0YWJbZmRdLmV2ICYmIGZkdGFiW2ZkXS5pb2NiICYmIGZkdGFiW2ZkXS5vd25lcikKKwkJCQkJZmR0YWJbZmRdLmlvY2IoZmQpOworCisJCQkJLyogd2UgY2FuIHJlbW92ZSB0aGlzIHVwZGF0ZSBlbnRyeSBpZiBpdCdzIHRoZSBsYXN0IG9uZSBhbmQgaXMKKwkJCQkgKiB1bnVzZWQsIG90aGVyd2lzZSB3ZSBkb24ndCB0b3VjaCBhbnl0aGluZy4KKwkJCQkgKi8KKwkJCQlpZiAobmV3X3VwZHQgPT0gZmRfbmJ1cGR0ICYmIGZkdGFiW2ZkXS5zcGVjX2UgPT0gMCkgeworCQkJCQlmZHRhYltmZF0udXBkYXRlZCA9IDA7CisJCQkJCWZkX25idXBkdC0tOworCQkJCX0KKwkJCX0KKwkJfQogCX0KKworCS8qIHRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2Ygc3BlY3VsYXRpdmUgZXZlbnRzICovCiB9CiAKIC8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgZXBvbGwoKSBwb2xsZXIuCisgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgc3BlY3VsYXRpdmUgZXBvbGwoKSBwb2xsZXIuCiAgKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBmYWlsdXJlLCBub24temVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MuIElmIGl0IGZhaWxzLCBpdAogICogZGlzYWJsZXMgdGhlIHBvbGxlciBieSBzZXR0aW5nIGl0cyBwcmVmIHRvIDAuCiAgKi8KIFJFR1BSTTEgc3RhdGljIGludCBfZG9faW5pdChzdHJ1Y3QgcG9sbGVyICpwKQogewotCV9fbGFiZWxfXyBmYWlsX2NoZ19wdHIsIGZhaWxfY2hnX2xpc3QsIGZhaWxfZmRldnQsIGZhaWxfZWUsIGZhaWxfZmQ7Ci0JaW50IGZkX3NldF9ieXRlczsKLQogCXAtPnByaXZhdGUgPSBOVUxMOwotCWZkX3NldF9ieXRlcyA9IDQgKiAoZ2xvYmFsLm1heHNvY2sgKyAxNSkgLyAxNjsKIAogCWVwb2xsX2ZkID0gZXBvbGxfY3JlYXRlKGdsb2JhbC5tYXhzb2NrICsgMSk7CiAJaWYgKGVwb2xsX2ZkIDwgMCkKIAkJZ290byBmYWlsX2ZkOwogCisJLyogU2VlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgYWJvdXQgdGhpcyBmb3JtdWxhLiAqLworCWFic21heGV2ZW50cyA9IE1BWChnbG9iYWwudHVuZS5tYXhwb2xsZXZlbnRzLCBnbG9iYWwubWF4c29jayk7CiAJZXBvbGxfZXZlbnRzID0gKHN0cnVjdCBlcG9sbF9ldmVudCopCi0JCWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSAqIGdsb2JhbC50dW5lLm1heHBvbGxldmVudHMpOworCQljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkgKiBhYnNtYXhldmVudHMpOwogCiAJaWYgKGVwb2xsX2V2ZW50cyA9PSBOVUxMKQogCQlnb3RvIGZhaWxfZWU7CiAKLQlpZiAoKGZkX2V2dHMgPSAodWludDMyX3QgKiljYWxsb2MoMSwgZmRfc2V0X2J5dGVzKSkgPT0gTlVMTCkKLQkJZ290byBmYWlsX2ZkZXZ0OwotCi0JY2hnX2xpc3QgPSAoc3RydWN0IGZkX2NoZyAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGZkX2NoZykgKiBnbG9iYWwubWF4c29jayk7Ci0JaWYgKGNoZ19saXN0ID09IE5VTEwpCi0JCWdvdG8gZmFpbF9jaGdfbGlzdDsKLQotCWNoZ19wdHIgPSAoc3RydWN0IGZkX2NoZyAqKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBmZF9jaGcqKSAqIGdsb2JhbC5tYXhzb2NrKTsKLQlpZiAoY2hnX3B0ciA9PSBOVUxMKQotCQlnb3RvIGZhaWxfY2hnX3B0cjsKLQogCXJldHVybiAxOwogCi0gZmFpbF9jaGdfcHRyOgotCWZyZWUoY2hnX2xpc3QpOwotIGZhaWxfY2hnX2xpc3Q6Ci0JZnJlZShmZF9ldnRzKTsKLSBmYWlsX2ZkZXZ0OgotCWZyZWUoZXBvbGxfZXZlbnRzKTsKICBmYWlsX2VlOgogCWNsb3NlKGVwb2xsX2ZkKTsKIAllcG9sbF9mZCA9IC0xOwpAQCAtMzE1LDE2ICsyNDEsMTEgQEAKIH0KIAogLyoKLSAqIFRlcm1pbmF0aW9uIG9mIHRoZSBlcG9sbCgpIHBvbGxlci4KKyAqIFRlcm1pbmF0aW9uIG9mIHRoZSBzcGVjdWxhdGl2ZSBlcG9sbCgpIHBvbGxlci4KICAqIE1lbW9yeSBpcyByZWxlYXNlZCBhbmQgdGhlIHBvbGxlciBpcyBtYXJrZWQgYXMgdW5zZWxlY3RhYmxlLgogICovCiBSRUdQUk0xIHN0YXRpYyB2b2lkIF9kb190ZXJtKHN0cnVjdCBwb2xsZXIgKnApCiB7Ci0JZmRfZmx1c2hfY2hhbmdlcygpOwotCi0JZnJlZShjaGdfcHRyKTsKLQlmcmVlKGNoZ19saXN0KTsKLQlmcmVlKGZkX2V2dHMpOwogCWZyZWUoZXBvbGxfZXZlbnRzKTsKIAogCWlmIChlcG9sbF9mZCA+PSAwKSB7CkBAIC0zMzIsMTEgKzI1Myw3IEBACiAJCWVwb2xsX2ZkID0gLTE7CiAJfQogCi0JY2hnX3B0ciA9IE5VTEw7Ci0JY2hnX2xpc3QgPSBOVUxMOwotCWZkX2V2dHMgPSBOVUxMOwogCWVwb2xsX2V2ZW50cyA9IE5VTEw7Ci0KIAlwLT5wcml2YXRlID0gTlVMTDsKIAlwLT5wcmVmID0gMDsKIH0KQEAgLTM5OCwxMiArMzE1LDEyIEBACiAJcC0+cG9sbCA9IF9kb19wb2xsOwogCXAtPmZvcmsgPSBfZG9fZm9yazsKIAotCXAtPmlzX3NldCAgPSBfX2ZkX2lzX3NldDsKLQlwLT5zZXQgPSBfX2ZkX3NldDsKLQlwLT53YWkgPSBfX2ZkX3NldDsKLQlwLT5jbHIgPSBfX2ZkX2NscjsKLQlwLT5yZW0gPSBfX2ZkX3JlbTsKLQlwLT5jbG8gPSBfX2ZkX2NsbzsKKwlwLT5pc19zZXQgID0gTlVMTDsKKwlwLT5zZXQgPSBOVUxMOworCXAtPndhaSA9IE5VTEw7CisJcC0+Y2xyID0gTlVMTDsKKwlwLT5yZW0gPSBOVUxMOworCXAtPmNsbyA9IE5VTEw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2V2X3NlcG9sbC5jIGIvc3JjL2V2X3NlcG9sbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU0MDE0Li4wMDAwMDAwCi0tLSBhL3NyYy9ldl9zZXBvbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKgotICogRkQgcG9sbGluZyBmdW5jdGlvbnMgZm9yIFNwZWN1bGF0aXZlIEkvTyBjb21iaW5lZCB3aXRoIExpbnV4IGVwb2xsKCkKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDEyIFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjb21tb24vY29tcGF0Lmg+Ci0jaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgotI2luY2x1ZGUgPGNvbW1vbi9kZWJ1Zy5oPgotI2luY2x1ZGUgPGNvbW1vbi9lcG9sbC5oPgotI2luY2x1ZGUgPGNvbW1vbi9zdGFuZGFyZC5oPgotI2luY2x1ZGUgPGNvbW1vbi90aWNrcy5oPgotI2luY2x1ZGUgPGNvbW1vbi90aW1lLmg+Ci0jaW5jbHVkZSA8Y29tbW9uL3Rvb2xzLmg+Ci0KLSNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KLQotI2luY2x1ZGUgPHByb3RvL2ZkLmg+Ci0jaW5jbHVkZSA8cHJvdG8vc2lnbmFsLmg+Ci0jaW5jbHVkZSA8cHJvdG8vdGFzay5oPgotCi0KLXN0YXRpYyBpbnQgYWJzbWF4ZXZlbnRzID0gMDsgICAgLy8gYWJzb2x1dGUgbWF4aW11bSBhbW91bnRzIG9mIHBvbGxlZCBldmVudHMKLQotLyogcHJpdmF0ZSBkYXRhICovCi1zdGF0aWMgc3RydWN0IGVwb2xsX2V2ZW50ICplcG9sbF9ldmVudHM7Ci1zdGF0aWMgaW50IGVwb2xsX2ZkOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UuIFdhcm5pbmchIGRvIG5vdCB1c2UgaXQgaW4KLSAqIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgIQotICovCi1zdGF0aWMgc3RydWN0IGVwb2xsX2V2ZW50IGV2OwotCi0vKgotICogc3BlY3VsYXRpdmUgZXBvbGwoKSBwb2xsZXIKLSAqLwotUkVHUFJNMiBzdGF0aWMgdm9pZCBfZG9fcG9sbChzdHJ1Y3QgcG9sbGVyICpwLCBpbnQgZXhwKQotewotCWludCBzdGF0dXMsIGVvLCBlbjsKLQlpbnQgZmQsIG9wY29kZTsKLQlpbnQgY291bnQ7Ci0JaW50IHVwZHRfaWR4OwotCWludCB3YWl0X3RpbWU7Ci0KLQkvKiBmaXJzdCwgc2NhbiB0aGUgdXBkYXRlIGxpc3QgdG8gZmluZCBjaGFuZ2VzICovCi0JZm9yICh1cGR0X2lkeCA9IDA7IHVwZHRfaWR4IDwgZmRfbmJ1cGR0OyB1cGR0X2lkeCsrKSB7Ci0JCWZkID0gZmRfdXBkdFt1cGR0X2lkeF07Ci0JCWVuID0gZmR0YWJbZmRdLnNwZWNfZSAmIDE1OyAgLyogbmV3IGV2ZW50cyAqLwotCQllbyA9IGZkdGFiW2ZkXS5zcGVjX2UgPj4gNDsgIC8qIHByZXZpb3VzIGV2ZW50cyAqLwotCi0JCWlmIChmZHRhYltmZF0ub3duZXIgJiYgKGVvIF4gZW4pKSB7Ci0JCQlpZiAoKGVvIF4gZW4pICYgRkRfRVZfUE9MTEVEX1JXKSB7Ci0JCQkJLyogcG9sbCBzdGF0dXMgY2hhbmdlZCAqLwotCQkJCWlmICgoZW4gJiBGRF9FVl9QT0xMRURfUlcpID09IDApIHsKLQkJCQkJLyogZmQgcmVtb3ZlZCBmcm9tIHBvbGwgbGlzdCAqLwotCQkJCQlvcGNvZGUgPSBFUE9MTF9DVExfREVMOwotCQkJCX0KLQkJCQllbHNlIGlmICgoZW8gJiBGRF9FVl9QT0xMRURfUlcpID09IDApIHsKLQkJCQkJLyogbmV3IGZkIGluIHRoZSBwb2xsIGxpc3QgKi8KLQkJCQkJb3Bjb2RlID0gRVBPTExfQ1RMX0FERDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qIGZkIHN0YXR1cyBjaGFuZ2VkICovCi0JCQkJCW9wY29kZSA9IEVQT0xMX0NUTF9NT0Q7Ci0JCQkJfQotCi0JCQkJLyogY29uc3RydWN0IHRoZSBlcG9sbCBldmVudHMgYmFzZWQgb24gbmV3IHN0YXRlICovCi0JCQkJZXYuZXZlbnRzID0gMDsKLQkJCQlpZiAoZW4gJiBGRF9FVl9QT0xMRURfUikKLQkJCQkJZXYuZXZlbnRzIHw9IEVQT0xMSU47Ci0KLQkJCQlpZiAoZW4gJiBGRF9FVl9QT0xMRURfVykKLQkJCQkJZXYuZXZlbnRzIHw9IEVQT0xMT1VUOwotCi0JCQkJZXYuZGF0YS5mZCA9IGZkOwotCQkJCWVwb2xsX2N0bChlcG9sbF9mZCwgb3Bjb2RlLCBmZCwgJmV2KTsKLQkJCX0KLQotCQkJZmR0YWJbZmRdLnNwZWNfZSA9IChlbiA8PCA0KSArIGVuOyAgLyogc2F2ZSBuZXcgZXZlbnRzICovCi0KLQkJCWlmICghKGVuICYgRkRfRVZfQUNUSVZFX1JXKSkgewotCQkJCS8qIFRoaXMgZmQgZG9lc24ndCB1c2UgYW55IGFjdGl2ZSBlbnRyeSBhbnltb3JlLCB3ZSBjYW4KLQkJCQkgKiBraWxsIGl0cyBlbnRyeS4KLQkJCQkgKi8KLQkJCQlyZWxlYXNlX3NwZWNfZW50cnkoZmQpOwotCQkJfQotCQkJZWxzZSBpZiAoKGVuICYgfmVvKSAmIEZEX0VWX0FDVElWRV9SVykgewotCQkJCS8qIHdlIG5lZWQgYSBuZXcgc3BlYyBlbnRyeSBub3cgKi8KLQkJCQlhbGxvY19zcGVjX2VudHJ5KGZkKTsKLQkJCX0KLQotCQl9Ci0JCWZkdGFiW2ZkXS51cGRhdGVkID0gMDsKLQkJZmR0YWJbZmRdLm5ldyA9IDA7Ci0JfQotCWZkX25idXBkdCA9IDA7Ci0KLQkvKiBjb21wdXRlIHRoZSBlcG9sbF93YWl0KCkgdGltZW91dCAqLwotCi0JaWYgKGZkX25ic3BlYyB8fCBydW5fcXVldWUgfHwgc2lnbmFsX3F1ZXVlX2xlbikgewotCQkvKiBNYXliZSB3ZSBzdGlsbCBoYXZlIGV2ZW50cyBpbiB0aGUgc3BlYyBsaXN0LCBvciB0aGVyZSBhcmUKLQkJICogc29tZSB0YXNrcyBsZWZ0IHBlbmRpbmcgaW4gdGhlIHJ1bl9xdWV1ZSwgc28gd2UgbXVzdCBub3QKLQkJICogd2FpdCBpbiBlcG9sbCgpIG90aGVyd2lzZSB3ZSB3b3VsZCBkZWxheSB0aGVpciBkZWxpdmVyeSBieQotCQkgKiB0aGUgbmV4dCB0aW1lb3V0LgotCQkgKi8KLQkJd2FpdF90aW1lID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghZXhwKQotCQkJd2FpdF90aW1lID0gTUFYX0RFTEFZX01TOwotCQllbHNlIGlmICh0aWNrX2lzX2V4cGlyZWQoZXhwLCBub3dfbXMpKQotCQkJd2FpdF90aW1lID0gMDsKLQkJZWxzZSB7Ci0JCQl3YWl0X3RpbWUgPSBUSUNLU19UT19NUyh0aWNrX3JlbWFpbihub3dfbXMsIGV4cCkpICsgMTsKLQkJCWlmICh3YWl0X3RpbWUgPiBNQVhfREVMQVlfTVMpCi0JCQkJd2FpdF90aW1lID0gTUFYX0RFTEFZX01TOwotCQl9Ci0JfQotCi0JLyogbm93IGxldCdzIHdhaXQgZm9yIHBvbGxlZCBldmVudHMgKi8KLQotCWZkID0gTUlOKG1heGZkLCBnbG9iYWwudHVuZS5tYXhwb2xsZXZlbnRzKTsKLQlnZXR0aW1lb2ZkYXkoJmJlZm9yZV9wb2xsLCBOVUxMKTsKLQlzdGF0dXMgPSBlcG9sbF93YWl0KGVwb2xsX2ZkLCBlcG9sbF9ldmVudHMsIGZkLCB3YWl0X3RpbWUpOwotCXR2X3VwZGF0ZV9kYXRlKHdhaXRfdGltZSwgc3RhdHVzKTsKLQltZWFzdXJlX2lkbGUoKTsKLQotCS8qIHByb2Nlc3MgcG9sbGVkIGV2ZW50cyAqLwotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3RhdHVzOyBjb3VudCsrKSB7Ci0JCWludCBlID0gZXBvbGxfZXZlbnRzW2NvdW50XS5ldmVudHM7Ci0JCWZkID0gZXBvbGxfZXZlbnRzW2NvdW50XS5kYXRhLmZkOwotCi0JCWlmICghZmR0YWJbZmRdLm93bmVyKQotCQkJY29udGludWU7Ci0KLQkJLyogaXQgbG9va3MgY29tcGxpY2F0ZWQgYnV0IGdjYyBjYW4gb3B0aW1pemUgaXQgYXdheSB3aGVuIGNvbnN0YW50cwotCQkgKiBoYXZlIHNhbWUgdmFsdWVzLgotCQkgKi8KLQkJZmR0YWJbZmRdLmV2ICY9IEZEX1BPTExfU1RJQ0tZOwotCQlmZHRhYltmZF0uZXYgfD0KLQkJCSgoZSAmIEVQT0xMSU4gKSA/IEZEX1BPTExfSU4gIDogMCkgfAotCQkJKChlICYgRVBPTExQUkkpID8gRkRfUE9MTF9QUkkgOiAwKSB8Ci0JCQkoKGUgJiBFUE9MTE9VVCkgPyBGRF9QT0xMX09VVCA6IDApIHwKLQkJCSgoZSAmIEVQT0xMRVJSKSA/IEZEX1BPTExfRVJSIDogMCkgfAotCQkJKChlICYgRVBPTExIVVApID8gRkRfUE9MTF9IVVAgOiAwKTsKLQotCQlpZiAoZmR0YWJbZmRdLmlvY2IgJiYgZmR0YWJbZmRdLm93bmVyICYmIGZkdGFiW2ZkXS5ldikgewotCQkJaW50IG5ld191cGR0LCBvbGRfdXBkdCA9IGZkX25idXBkdDsgLyogU2F2ZSBudW1iZXIgb2YgdXBkYXRlcyB0byBkZXRlY3QgY3JlYXRpb24gb2YgbmV3IEZEcy4gKi8KLQotCQkJLyogTWFyayB0aGUgZXZlbnRzIGFzIHNwZWN1bGF0aXZlIGJlZm9yZSBwcm9jZXNzaW5nCi0JCQkgKiB0aGVtIHNvIHRoYXQgaWYgbm90aGluZyBjYW4gYmUgZG9uZSB3ZSBkb24ndCBuZWVkCi0JCQkgKiB0byBwb2xsIGFnYWluLgotCQkJICovCi0JCQlpZiAoZmR0YWJbZmRdLmV2ICYgKEZEX1BPTExfSU58RkRfUE9MTF9IVVB8RkRfUE9MTF9FUlIpKQotCQkJCWZkX2V2X3NldChmZCwgRElSX1JEKTsKLQotCQkJaWYgKGZkdGFiW2ZkXS5ldiAmIChGRF9QT0xMX09VVHxGRF9QT0xMX0VSUikpCi0JCQkJZmRfZXZfc2V0KGZkLCBESVJfV1IpOwotCi0JCQlmZHRhYltmZF0uaW9jYihmZCk7Ci0KLQkJCS8qIE9uZSBvciBtb3JlIGZkIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIGR1cmluZyB0aGUgaW9jYigpLgotCQkJICogVGhpcyBtYWlubHkgaGFwcGVucyB3aXRoIG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucyB0aGF0IGhhdmUKLQkJCSAqIGp1c3QgYmVlbiBhY2NlcHRlZCwgc28gd2UnZCBsaWtlIHRvIHByb2Nlc3MgdGhlbSBpbW1lZGlhdGVseQotCQkJICogZm9yIGJldHRlciBlZmZpY2llbmN5LiBTZWNvbmQgYmVuZWZpdCwgaWYgYXQgdGhlIGVuZCB0aGUgZmRzCi0JCQkgKiBhcmUgZGlzYWJsZWQgYWdhaW4sIHdlIGNhbiBzYWZlbHkgZGVzdHJveSB0aGVpciB1cGRhdGUgZW50cnkKLQkJCSAqIHRvIHJlZHVjZSB0aGUgc2NvcGUgb2YgbGF0ZXIgc2NhbnMuIFRoaXMgaXMgdGhlIHJlYXNvbiB3ZQotCQkJICogc2NhbiB0aGUgbmV3IGVudHJpZXMgYmFja3dhcmRzLgotCQkJICovCi0KLQkJCWZvciAobmV3X3VwZHQgPSBmZF9uYnVwZHQ7IG5ld191cGR0ID4gb2xkX3VwZHQ7IG5ld191cGR0LS0pIHsKLQkJCQlmZCA9IGZkX3VwZHRbbmV3X3VwZHQgLSAxXTsKLQkJCQlpZiAoIWZkdGFiW2ZkXS5uZXcpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJZmR0YWJbZmRdLm5ldyA9IDA7Ci0JCQkJZmR0YWJbZmRdLmV2ICY9IEZEX1BPTExfU1RJQ0tZOwotCi0JCQkJaWYgKChmZHRhYltmZF0uc3BlY19lICYgRkRfRVZfU1RBVFVTX1IpID09IEZEX0VWX0FDVElWRV9SKQotCQkJCQlmZHRhYltmZF0uZXYgfD0gRkRfUE9MTF9JTjsKLQotCQkJCWlmICgoZmR0YWJbZmRdLnNwZWNfZSAmIEZEX0VWX1NUQVRVU19XKSA9PSBGRF9FVl9BQ1RJVkVfVykKLQkJCQkJZmR0YWJbZmRdLmV2IHw9IEZEX1BPTExfT1VUOwotCi0JCQkJaWYgKGZkdGFiW2ZkXS5ldiAmJiBmZHRhYltmZF0uaW9jYiAmJiBmZHRhYltmZF0ub3duZXIpCi0JCQkJCWZkdGFiW2ZkXS5pb2NiKGZkKTsKLQotCQkJCS8qIHdlIGNhbiByZW1vdmUgdGhpcyB1cGRhdGUgZW50cnkgaWYgaXQncyB0aGUgbGFzdCBvbmUgYW5kIGlzCi0JCQkJICogdW51c2VkLCBvdGhlcndpc2Ugd2UgZG9uJ3QgdG91Y2ggYW55dGhpbmcuCi0JCQkJICovCi0JCQkJaWYgKG5ld191cGR0ID09IGZkX25idXBkdCAmJiBmZHRhYltmZF0uc3BlY19lID09IDApIHsKLQkJCQkJZmR0YWJbZmRdLnVwZGF0ZWQgPSAwOwotCQkJCQlmZF9uYnVwZHQtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiB0aGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHNwZWN1bGF0aXZlIGV2ZW50cyAqLwotfQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIHNwZWN1bGF0aXZlIGVwb2xsKCkgcG9sbGVyLgotICogUmV0dXJucyAwIGluIGNhc2Ugb2YgZmFpbHVyZSwgbm9uLXplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLiBJZiBpdCBmYWlscywgaXQKLSAqIGRpc2FibGVzIHRoZSBwb2xsZXIgYnkgc2V0dGluZyBpdHMgcHJlZiB0byAwLgotICovCi1SRUdQUk0xIHN0YXRpYyBpbnQgX2RvX2luaXQoc3RydWN0IHBvbGxlciAqcCkKLXsKLQlwLT5wcml2YXRlID0gTlVMTDsKLQotCWVwb2xsX2ZkID0gZXBvbGxfY3JlYXRlKGdsb2JhbC5tYXhzb2NrICsgMSk7Ci0JaWYgKGVwb2xsX2ZkIDwgMCkKLQkJZ290byBmYWlsX2ZkOwotCi0JLyogU2VlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgYWJvdXQgdGhpcyBmb3JtdWxhLiAqLwotCWFic21heGV2ZW50cyA9IE1BWChnbG9iYWwudHVuZS5tYXhwb2xsZXZlbnRzLCBnbG9iYWwubWF4c29jayk7Ci0JZXBvbGxfZXZlbnRzID0gKHN0cnVjdCBlcG9sbF9ldmVudCopCi0JCWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSAqIGFic21heGV2ZW50cyk7Ci0KLQlpZiAoZXBvbGxfZXZlbnRzID09IE5VTEwpCi0JCWdvdG8gZmFpbF9lZTsKLQotCXJldHVybiAxOwotCi0gZmFpbF9lZToKLQljbG9zZShlcG9sbF9mZCk7Ci0JZXBvbGxfZmQgPSAtMTsKLSBmYWlsX2ZkOgotCXAtPnByZWYgPSAwOwotCXJldHVybiAwOwotfQotCi0vKgotICogVGVybWluYXRpb24gb2YgdGhlIHNwZWN1bGF0aXZlIGVwb2xsKCkgcG9sbGVyLgotICogTWVtb3J5IGlzIHJlbGVhc2VkIGFuZCB0aGUgcG9sbGVyIGlzIG1hcmtlZCBhcyB1bnNlbGVjdGFibGUuCi0gKi8KLVJFR1BSTTEgc3RhdGljIHZvaWQgX2RvX3Rlcm0oc3RydWN0IHBvbGxlciAqcCkKLXsKLQlmcmVlKGVwb2xsX2V2ZW50cyk7Ci0KLQlpZiAoZXBvbGxfZmQgPj0gMCkgewotCQljbG9zZShlcG9sbF9mZCk7Ci0JCWVwb2xsX2ZkID0gLTE7Ci0JfQotCi0JZXBvbGxfZXZlbnRzID0gTlVMTDsKLQlwLT5wcml2YXRlID0gTlVMTDsKLQlwLT5wcmVmID0gMDsKLX0KLQotLyoKLSAqIENoZWNrIHRoYXQgdGhlIHBvbGxlciB3b3Jrcy4KLSAqIFJldHVybnMgMSBpZiBPSywgb3RoZXJ3aXNlIDAuCi0gKi8KLVJFR1BSTTEgc3RhdGljIGludCBfZG9fdGVzdChzdHJ1Y3QgcG9sbGVyICpwKQotewotCWludCBmZDsKLQotCWZkID0gZXBvbGxfY3JlYXRlKGdsb2JhbC5tYXhzb2NrICsgMSk7Ci0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIDA7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAxOwotfQotCi0vKgotICogUmVjcmVhdGUgdGhlIGVwb2xsIGZpbGUgZGVzY3JpcHRvciBhZnRlciBhIGZvcmsoKS4gUmV0dXJucyAxIGlmIE9LLAotICogb3RoZXJ3aXNlIDAuIEl0IHdpbGwgZW5zdXJlIHRoYXQgYWxsIHByb2Nlc3NlcyB3aWxsIG5vdCBzaGFyZSB0aGVpcgotICogZXBvbGxfZmQuIFNvbWUgc2lkZSBlZmZlY3RzIHdlcmUgZW5jb3VudGVyZWQgYmVjYXVzZSBvZiB0aGlzLCBzdWNoCi0gKiBhcyBlcG9sbF93YWl0KCkgcmV0dXJuaW5nIGFuIEZEIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRlbGV0ZWQuCi0gKi8KLVJFR1BSTTEgc3RhdGljIGludCBfZG9fZm9yayhzdHJ1Y3QgcG9sbGVyICpwKQotewotCWlmIChlcG9sbF9mZCA+PSAwKQotCQljbG9zZShlcG9sbF9mZCk7Ci0JZXBvbGxfZmQgPSBlcG9sbF9jcmVhdGUoZ2xvYmFsLm1heHNvY2sgKyAxKTsKLQlpZiAoZXBvbGxfZmQgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIEl0IGlzIGEgY29uc3RydWN0b3IsIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNhbGxlZCBiZWZvcmUKLSAqIG1haW4oKS4gVGhpcyBpcyBHQ0Mtc3BlY2lmaWMgYnV0IGl0IHdvcmtzIGF0IGxlYXN0IHNpbmNlIDIuOTUuCi0gKiBTcGVjaWFsIGNhcmUgbXVzdCBiZSB0YWtlbiBzbyB0aGF0IGl0IGRvZXMgbm90IG5lZWQgYW55IHVuaW5pdGlhbGl6ZWQgZGF0YS4KLSAqLwotX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQotc3RhdGljIHZvaWQgX2RvX3JlZ2lzdGVyKHZvaWQpCi17Ci0Jc3RydWN0IHBvbGxlciAqcDsKLQotCWlmIChuYnBvbGxlcnMgPj0gTUFYX1BPTExFUlMpCi0JCXJldHVybjsKLQotCWVwb2xsX2ZkID0gLTE7Ci0JcCA9ICZwb2xsZXJzW25icG9sbGVycysrXTsKLQotCXAtPm5hbWUgPSAic2Vwb2xsIjsKLQlwLT5wcmVmID0gNDAwOwotCXAtPnByaXZhdGUgPSBOVUxMOwotCi0JcC0+dGVzdCA9IF9kb190ZXN0OwotCXAtPmluaXQgPSBfZG9faW5pdDsKLQlwLT50ZXJtID0gX2RvX3Rlcm07Ci0JcC0+cG9sbCA9IF9kb19wb2xsOwotCXAtPmZvcmsgPSBfZG9fZm9yazsKLQotCXAtPmlzX3NldCAgPSBOVUxMOwotCXAtPnNldCA9IE5VTEw7Ci0JcC0+d2FpID0gTlVMTDsKLQlwLT5jbHIgPSBOVUxMOwotCXAtPnJlbSA9IE5VTEw7Ci0JcC0+Y2xvID0gTlVMTDsKLX0KLQotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2hhcHJveHkuYyBiL3NyYy9oYXByb3h5LmMKaW5kZXggMWJiNjVjMS4uMzJkYjI4MSAxMDA2NDQKLS0tIGEvc3JjL2hhcHJveHkuYworKysgYi9zcmMvaGFwcm94eS5jCkBAIC0zMDgsOSArMzA4LDYgQEAKICNpZiBkZWZpbmVkKEVOQUJMRV9FUE9MTCkKIAkJIiAgICAgICAgLWRlIGRpc2FibGVzIGVwb2xsKCkgdXNhZ2UgZXZlbiB3aGVuIGF2YWlsYWJsZVxuIgogI2VuZGlmCi0jaWYgZGVmaW5lZChFTkFCTEVfU0VQT0xMKQotCQkiICAgICAgICAtZHMgZGlzYWJsZXMgc3BlY3VsYXRpdmUgZXBvbGwoKSB1c2FnZSBldmVuIHdoZW4gYXZhaWxhYmxlXG4iCi0jZW5kaWYKICNpZiBkZWZpbmVkKEVOQUJMRV9LUVVFVUUpCiAJCSIgICAgICAgIC1kayBkaXNhYmxlcyBrcXVldWUoKSB1c2FnZSBldmVuIHdoZW4gYXZhaWxhYmxlXG4iCiAjZW5kaWYKQEAgLTQ3Niw5ICs0NzMsNiBAQAogI2lmIGRlZmluZWQoRU5BQkxFX0VQT0xMKQogCWdsb2JhbC50dW5lLm9wdGlvbnMgfD0gR1RVTkVfVVNFX0VQT0xMOwogI2VuZGlmCi0jaWYgZGVmaW5lZChFTkFCTEVfU0VQT0xMKQotCWdsb2JhbC50dW5lLm9wdGlvbnMgfD0gR1RVTkVfVVNFX1NFUE9MTDsKLSNlbmRpZgogI2lmIGRlZmluZWQoRU5BQkxFX0tRVUVVRSkKIAlnbG9iYWwudHVuZS5vcHRpb25zIHw9IEdUVU5FX1VTRV9LUVVFVUU7CiAjZW5kaWYKQEAgLTUxMiwxMCArNTA2LDYgQEAKIAkJCWVsc2UgaWYgKCpmbGFnID09ICdkJyAmJiBmbGFnWzFdID09ICdlJykKIAkJCQlnbG9iYWwudHVuZS5vcHRpb25zICY9IH5HVFVORV9VU0VfRVBPTEw7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKEVOQUJMRV9TRVBPTEwpCi0JCQllbHNlIGlmICgqZmxhZyA9PSAnZCcgJiYgZmxhZ1sxXSA9PSAncycpCi0JCQkJZ2xvYmFsLnR1bmUub3B0aW9ucyAmPSB+R1RVTkVfVVNFX1NFUE9MTDsKLSNlbmRpZgogI2lmIGRlZmluZWQoRU5BQkxFX1BPTEwpCiAJCQllbHNlIGlmICgqZmxhZyA9PSAnZCcgJiYgZmxhZ1sxXSA9PSAncCcpCiAJCQkJZ2xvYmFsLnR1bmUub3B0aW9ucyAmPSB+R1RVTkVfVVNFX1BPTEw7CkBAIC03OTIsOSArNzgyLDYgQEAKIAlpZiAoIShnbG9iYWwudHVuZS5vcHRpb25zICYgR1RVTkVfVVNFX0VQT0xMKSkKIAkJZGlzYWJsZV9wb2xsZXIoImVwb2xsIik7CiAKLQlpZiAoIShnbG9iYWwudHVuZS5vcHRpb25zICYgR1RVTkVfVVNFX1NFUE9MTCkpCi0JCWRpc2FibGVfcG9sbGVyKCJzZXBvbGwiKTsKLQogCWlmICghKGdsb2JhbC50dW5lLm9wdGlvbnMgJiBHVFVORV9VU0VfUE9MTCkpCiAJCWRpc2FibGVfcG9sbGVyKCJwb2xsIik7CiAK