ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDFmZDQ1OGMuLjc2YWZiNzcgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCitpZm5kZWYgV1BBX1NVUFBMSUNBTlRfVkVSU0lPTgorV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiA6PSBWRVJfMF84X1gKK2VuZGlmCiBpZmVxICgkKFdQQV9TVVBQTElDQU5UX1ZFUlNJT04pLFZFUl8wXzhfWCkKICMgVGhlIG9yZGVyIG9mIHRoZSAyIEFuZHJvaWQubWtzIGRvZXMgbWF0dGVyIQogIyBUT0RPOiBDbGVhbiB1cCB0aGUgQW5kcm9pZC5ta3MsIHJlc2V0IGFsbCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyBhdCB0aGUKZGlmZiAtLWdpdCBhL2hvc3RhcGQvQW5kcm9pZC5tayBiL2hvc3RhcGQvQW5kcm9pZC5tawppbmRleCA0NTcxMDAyLi4xMDBlOWNiIDEwMDY0NAotLS0gYS9ob3N0YXBkL0FuZHJvaWQubWsKKysrIGIvaG9zdGFwZC9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw2IEBACiBlbmRpZgogCiBpZmVxICgkKEJPQVJEX1dMQU5fREVWSUNFKSwgcWN3Y24pCi1MX0NGTEFHUyArPSAtREFORFJPSURfUUNPTV9XQ04KIExfQ0ZMQUdTICs9IC1EQU5EUk9JRF9QMlAKIGVuZGlmCiAKQEAgLTg3LDYgKzg2LDcgQEAKIE9CSlMgKz0gc3JjL2FwL2F1dGhzcnYuYwogT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xeC5jCiBPQkpTICs9IHNyYy9hcC9hcF9jb25maWcuYworT0JKUyArPSBzcmMvYXAvZWFwX3VzZXJfZGIuYwogT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMKIE9CSlMgKz0gc3JjL2FwL3N0YV9pbmZvLmMKIE9CSlMgKz0gc3JjL2FwL3dwYV9hdXRoLmMKQEAgLTIxNSw4ICsyMTUsMTUgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgoraWZkZWYgQ09ORklHX1NBRQorTF9DRkxBR1MgKz0gLURDT05GSUdfU0FFCitPQkpTICs9IHNyYy9jb21tb24vc2FlLmMKK05FRURfRUNDPXkKK05FRURfREhfR1JPVVBTPXkKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XTk0KK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSBzcmMvYXAvd25tX2FwLmMKIGVuZGlmCiAKQEAgLTIyNCwxMCArMjMxLDYgQEAKIExfQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19XTk0KLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQotZW5kaWYKLQogaWZkZWYgQ09ORklHX0lFRUU4MDIxMUFDCiBMX0NGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFBQwogZW5kaWYKQEAgLTQwMiwyNSArNDA1LDEwIEBACiBORUVEX01PREVYUD15CiBDT05GSUdfRUFQPXkKIAotaWZkZWYgQ09ORklHX1dQU19VRkQKLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19VRkQKLU9CSlMgKz0gc3JjL3dwcy93cHNfdWZkLmMKLU5FRURfV1BTX09PQj15Ci1lbmRpZgotCiBpZmRlZiBDT05GSUdfV1BTX05GQwogTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQwogT0JKUyArPSBzcmMvd3BzL25kZWYuYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmMuYwogTkVFRF9XUFNfT09CPXkKLWlmZGVmIENPTkZJR19XUFNfTkZDX1BONTMxCi1QTjUzMV9QQVRIID89IC91c3IvbG9jYWwvc3JjL25mYwotTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQ19QTjUzMQotTF9DRkxBR1MgKz0gLUkke1BONTMxX1BBVEh9L2luYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmNfcG41MzEuYwotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi93cHNuZmMuZGxsCi1MSUJTICs9ICR7UE41MzFfUEFUSH0vbGliL2xpYm5mY19tYXBwaW5nX3BuNTN4LmRsbAotZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE5FRURfV1BTX09PQgpAQCAtNzk0LDYgKzc4MiwxMCBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZGVmIE5FRURfRUNDCitMX0NGTEFHUyArPSAtRENPTkZJR19FQ0MKK2VuZGlmCisKIGlmZGVmIENPTkZJR19OT19SQU5ET01fUE9PTAogTF9DRkxBR1MgKz0gLURDT05GSUdfTk9fUkFORE9NX1BPT0wKIGVsc2UKZGlmZiAtLWdpdCBhL2hvc3RhcGQvQ2hhbmdlTG9nIGIvaG9zdGFwZC9DaGFuZ2VMb2cKaW5kZXggOWZjMDVmNy4uMWE0ZTU2NiAxMDA2NDQKLS0tIGEvaG9zdGFwZC9DaGFuZ2VMb2cKKysrIGIvaG9zdGFwZC9DaGFuZ2VMb2cKQEAgLTEsNSArMSwxMDQgQEAKIENoYW5nZUxvZyBmb3IgaG9zdGFwZAogCis/Pz8/LT8/LT8/IC0gdjIuMQorCSogYWRkZWQgc3VwcG9ydCBmb3Igc2ltdWxhdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMgKFNBRSkgZm9yCisJICBzdHJvbmdlciBwYXNzd29yZC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRoIFdQQTItUGVyc29uYWwKKworMjAxMy0wMS0xMiAtIHYyLjAKKwkqIGFkZGVkIEFQLVNUQS1ESVNDT05ORUNURUQgY3RybF9pZmFjZSBldmVudAorCSogaW1wcm92ZWQgZGVidWcgbG9nZ2luZyAoaHVtYW4gcmVhZGFibGUgZXZlbnQgbmFtZXMsIGludGVyZmFjZSBuYW1lCisJICBpbmNsdWRlZCBpbiBtb3JlIGVudHJpZXMpCisJKiBhZGRlZCBudW1iZXIgb2Ygc21hbGwgY2hhbmdlcyB0byBtYWtlIGl0IGVhc2llciBmb3Igc3RhdGljIGFuYWx5emVycworCSAgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKwkqIGFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgV2luZG93cyA3IE1pY2hhZWwgTUlDIGZhaWx1cmUgcmVwb3J0aW5nIGFuZAorCSAgdXNlIG9mIHRoZSBTZWN1cmUgYml0IGluIEVBUE9MLUtleSBtc2cgMy80CisJKiBmaXhlZCBudW1iZXIgb2Ygc21hbGwgYnVncyAoc2VlIGdpdCBsb2dzIGZvciBtb3JlIGRldGFpbHMpCisJKiBjaGFuZ2VkIE9wZW5TU0wgdG8gcmVhZCBmdWxsIGNlcnRpZmljYXRlIGNoYWluIGZyb20gc2VydmVyX2NlcnQgZmlsZQorCSogbmw4MDIxMTogbnVtYmVyIG9mIHVwZGF0ZXMgdG8gdXNlIG5ldyBjZmc4MDIxMS9ubDgwMjExIGZ1bmN0aW9uYWxpdHkKKwkgIC0gcmVwbGFjZSBtb25pdG9yIGludGVyZmFjZSB3aXRoIG5sODAyMTEgY29tbWFuZHMKKwkgIC0gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZHJpdmVyLWJhc2VkIEFQIFNNRQorCSogRUFQLXB3ZDoKKwkgIC0gZml4IEtERiBmb3IgZ3JvdXAgMjEgYW5kIHplcm8tcGFkZGluZworCSAgLSBhZGRlZCBzdXBwb3J0IGZvciBmcmFnbWVudGF0aW9uCisJICAtIGluY3JlYXNlZCBtYXhpbXVtIG51bWJlciBvZiBodW50aW5nLWFuZC1wZWNraW5nIGl0ZXJhdGlvbnMKKwkqIGF2b2lkIGV4Y2Vzc2l2ZSBQcm9iZSBSZXNwb25zZSByZXRyaWVzIGZvciBicm9hZGNhc3QgUHJvYmUgUmVxdWVzdAorCSAgZnJhbWVzIChvbmx5IHdpdGggZHJpdmVycyB1c2luZyBob3N0YXBkIFNNRS9NTE1FKQorCSogYWRkZWQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdXNpbmcgVExTIHYxLjIgKENPTkZJR19UTFNWMTI9eSkKKwkqIGZpeGVkIFdQUyBvcGVyYXRpb24gc3RvcHBpbmcgb24gZHVhbCBjb25jdXJyZW50IEFQCisJKiBhZGRlZCB3cHNfcmZfYmFuZHMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIG92ZXJyaWRpbmcgUkYgQmFuZHMKKwkgIHZhbHVlIGZvciBXUFMKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGdldHRpbmcgcGVyLWRldmljZSBQU0sgZnJvbSBSQURJVVMgVHVubmVsLVBhc3N3b3JkCisJKiBhZGRlZCBzdXBwb3J0IGZvciBsaWJubCAzLjIgYW5kIG5ld2VyCisJKiBpbmNyZWFzZWQgaW5pdGlhbCBncm91cCBrZXkgaGFuZHNoYWtlIHJldHJhbnNtaXQgdGltZW91dCB0byA1MDAgbXMKKwkqIGFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgNC13YXkgaGFuZHNoYWtlIHRvIHVwZGF0ZSBTTm9uY2UgZXZlbiBhZnRlcgorCSAgaGF2aW5nIHNlbnQgRUFQT0wtS2V5IDMvNCB0byBhdm9pZCBpc3N1ZXMgd2l0aCBzb21lIHN1cHBsaWNhbnQKKwkgIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBjaGFuZ2UgU05vbmNlIGZvciBlYWNoIEVBUC1LZXkgMi80CisJKiBhZGRlZCBhIHdvcmthcm91bmQgZm9yIEVBUE9MLUtleSA0LzQgdXNpbmcgaW5jb3JyZWN0IHR5cGUgdmFsdWUgaW4KKwkgIFdQQTIgbW9kZSAoc29tZSBkZXBsb3llZCBzdGF0aW9ucyB1c2UgV1BBIHR5cGUgaW4gdGhhdCBtZXNzYWdlKQorCSogYWRkZWQgYSBXUFMgd29ya2Fyb3VuZCBmb3IgbWl4ZWQgbW9kZSBBUCBTZXR0aW5ncyB3aXRoIFdpbmRvd3MgNworCSogY2hhbmdlZCBXUFMgQVAgUElOIGRpc2FibGluZyBtZWNoYW5pc20gdG8gZGlzYWJsZSB0aGUgUElOIGFmdGVyIDEwCisJICBjb25zZWN1dGl2ZSBmYWlsdXJlcyBpbiBhZGRpdGlvbiB0byB1c2luZyB0aGUgZXhwb25lbnRpYWwgbG9ja291dAorCSAgcGVyaW9kCisJKiBhZGRlZCBzdXBwb3J0IGZvciBXRkEgSG90c3BvdCAyLjAKKwkgIC0gR0FTL0FOUVAgYWR2ZXJ0aXNlbWVudCBvZiBuZXR3b3JrIGluZm9ybWF0aW9uCisJICAtIGRpc2FibGVfZGdhZiBwYXJhbWV0ZXIgdG8gZGlzYWJsZSBkb3duc3RyZWFtIGdyb3VwLWFkZHJlc3NlZAorCSAgICBmb3J3YXJkaW5nCisJKiBzaW1wbGlmaWVkIGxpY2Vuc2luZyB0ZXJtcyBieSBzZWxlY3RpbmcgdGhlIEJTRCBsaWNlbnNlIGFzIHRoZSBvbmx5CisJICBhbHRlcm5hdGl2ZQorCSogRUFQLVNJTTogZml4ZWQgcmUtYXV0aGVudGljYXRpb24gbm90IHRvIHVwZGF0ZSBwc2V1ZG9ueW0KKwkqIEVBUC1TSU06IHVzZSBOb3RpZmljYXRpb24gcm91bmQgYmVmb3JlIEVBUC1GYWlsdXJlCisJKiBFQVAtQUtBOiBhZGRlZCBzdXBwb3J0IGZvciBBVF9DT1VOVEVSX1RPT19TTUFMTAorCSogRUFQLUFLQTogc2tpcCBBS0EvSWRlbnRpdHkgZXhjaGFuZ2UgaWYgRUFQIGlkZW50aXR5IGlzIHJlY29nbml6ZWQKKwkqIEVBUC1BS0EnOiBmaXhlZCBpZGVudGl0eSBmb3IgTUsgZGVyaXZhdGlvbgorCSogRUFQLUFLQSc6IHVwZGF0ZWQgdG8gUkZDIDU0NDggKHVzZXJuYW1lIHByZWZpeGVzIGNoYW5nZWQpOyBub3RlOiB0aGlzCisJICBicmVha3MgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCisJKiBFQVAtU0lNL0FLQTogYWxsb3cgcHNldWRvbnltIHRvIGJlIHVzZWQgYWZ0ZXIgdW5rbm93biByZWF1dGggaWQKKwkqIGNoYW5nZWQgQU5vbmNlIHRvIGJlIGEgcmFuZG9tIG51bWJlciBpbnN0ZWFkIG9mIENvdW50ZXItYmFzZWQKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGNhbmNlbGluZyBXUFMgb3BlcmF0aW9ucyB3aXRoIGhvc3RhcGRfY2xpIHdwc19jYW5jZWwKKwkqIGZpeGVkIEVBUC9XUFMgdG8gUFNLIHRyYW5zaXRpb24gb24gcmVhc3NvY2lhdGlvbiBpbiBjYXNlcyB3aGVyZQorCSAgZGVhdXRoZW50aWNhdGlvbiBpcyBtaXNzZWQKKwkqIGhscl9hdWNfZ3cgZW5oYW5jZW1lbnRzOgorCSAgLSBhIG5ldyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIC11IGNhbiBiZSB1c2VkIHRvIGVuYWJsZSB1cGRhdGluZyBvZgorCSAgICBTUU4gaW4gTWlsZW5hZ2UgZmlsZQorCSAgLSB1c2UgNSBiaXQgSU5EIGZvciBTUU4gdXBkYXRlcworCSAgLSBTUUxpdGUgZGF0YWJhc2UgY2FuIG5vdyBiZSB1c2VkIHRvIHN0b3JlIE1pbGVuYWdlIGluZm9ybWF0aW9uCisJKiBFQVAtU0lNL0FLQSBEQjogYWRkZWQgb3B0aW9uYWwgdXNlIG9mIFNRTGl0ZSBkYXRhYmFzZSBmb3IgcHNldWRvbnltcworCSAgYW5kIHJlYXV0aCBkYXRhCisJKiBhZGRlZCBzdXBwb3J0IGZvciBDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkgKFJGQyA0MzcyKQorCSogYWRkZWQgcmFkaXVzX2F1dGhfcmVxX2F0dHIgYW5kIHJhZGl1c19hY2N0X3JlcV9hdHRyIGNvbmZpZ3VyYXRpb24KKwkgIHBhcmFtZXRlcnMgdG8gYWxsb3cgYWRkaW5nL292ZXJyaWRpbmcgb2YgUkFESVVTIGF0dHJpYnV0ZXMgaW4KKwkgIEFjY2Vzcy1SZXF1ZXN0IGFuZCBBY2NvdW50aW5nLVJlcXVlc3QgcGFja2V0cworCSogYWRkZWQgc3VwcG9ydCBmb3IgUkFESVVTIGR5bmFtaWMgYXV0aG9yaXphdGlvbiBzZXJ2ZXIgKFJGQyA1MTc2KQorCSogYWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciBXTk0gb3BlcmF0aW9ucworCSAgLSBCU1MgbWF4IGlkbGUgcGVyaW9kCisJICAtIFdOTS1TbGVlcCBNb2RlCisJKiBhZGRlZCBuZXcgV1BTIE5GQyBjdHJsX2lmYWNlIG1lY2hhbmlzbQorCSAgLSByZW1vdmVkIG9ic29sZXRlZCBXUFNfT09CIGNvbW1hbmQgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBkZXByZWNhdGVkCisJICAgIFVGRCBjb25maWdfbWV0aG9kKQorCSogYWRkZWQgRlQgc3VwcG9ydCBmb3IgZHJpdmVycyB0aGF0IGltcGxlbWVudCBNTE1FIGludGVybmFsbHkKKwkqIGFkZGVkIFNBIFF1ZXJ5IHN1cHBvcnQgZm9yIGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgTUxNRSBpbnRlcm5hbGx5CisJKiByZW1vdmVkIGRlZmF1bHQgQUNNPTEgZnJvbSBBQ19WTyBhbmQgQUNfVkkKKwkqIGNoYW5nZWQgVkVORE9SLVRFU1QgRUFQIG1ldGhvZCB0byB1c2UgcHJvcGVyIHByaXZhdGUgZW50ZXJwcmlzZSBudW1iZXIKKwkgICh0aGlzIHdpbGwgbm90IGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb25zKQorCSogYWRkZWQgaG9zdGFwZC5jb25mIHBhcmFtZXRlciB2ZW5kb3JfZWxlbWVudHMgdG8gYWxsb3cgYXJiaXRyYXJ5IHZlbmRvcgorCSAgc3BlY2lmaWMgZWxlbWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlIEJlYWNvbiBhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzCisJKiBhZGRlZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBHQ01QIGNpcGhlciBmb3IgSUVFRSA4MDIuMTFhZAorCSogYWRkZWQgc3VwcG9ydCBmb3IgMjU2LWJpdCBBRVMgd2l0aCBpbnRlcm5hbCBUTFMgaW1wbGVtZW50YXRpb24KKwkqIGNoYW5nZWQgRUFQT0wgdHJhbnNtaXNzaW9uIHRvIHVzZSBBQ19WTyBpZiBXTU0gaXMgYWN0aXZlCisJKiBmaXhlZCBFQVAtVExTL1BFQVAvVFRMUy9GQVNUIHNlcnZlciB0byB2YWxpZGF0ZSBUTFMgTWVzc2FnZSBMZW5ndGgKKwkgIGNvcnJlY3RseTsgaW52YWxpZCBtZXNzYWdlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGUgaG9zdGFwZCBwcm9jZXNzIHRvCisJICB0ZXJtaW5hdGUgYmVmb3JlIHRoaXMgZml4IFtDVkUtMjAxMi00NDQ1XQorCSogbGltaXQgbnVtYmVyIG9mIGFjdGl2ZSB3aWxkY2FyZCBQSU5zIGZvciBXUFMgUmVnaXN0cmFyIHRvIG9uZSB0byBhdm9pZAorCSAgY29uZnVzaW5nIGJlaGF2aW9yIHdpdGggbXVsdGlwbGUgd2lsZGNhcmQgUElOcworCSogYWRkZWQgYSB3b3JrYXJvdW5kIGZvciBXUFMgUEJDIHNlc3Npb24gb3ZlcmxhcCBkZXRlY3Rpb24gdG8gYXZvaWQKKwkgIGludGVyb3AgaXNzdWVzIHdpdGggZGVwbG95ZWQgc3RhdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QKKwkgIHJlbW92ZSBhY3RpdmUgUEJDIGluZGljYXRpb24gZnJvbSBQcm9iZSBSZXF1ZXN0IGZyYW1lcyBwcm9wZXJseQorCSogYWRkZWQgc3VwcG9ydCBmb3IgdXNpbmcgU1FMaXRlIGZvciB0aGUgZWFwX3VzZXIgZGF0YWJhc2UKKwkqIGFkZGVkIEFjY3QtU2Vzc2lvbi1JZCBhdHRyaWJ1dGUgaW50byBBY2Nlc3MtUmVxdWVzdCBtZXNzYWdlcworCSogZml4ZWQgRUFQT0wgZnJhbWUgdHJhbnNtaXNzaW9uIHRvIG5vbi1Rb1MgU1RBcyB3aXRoIG5sODAyMTEKKwkgIChkbyBub3Qgc2VuZCBRb1MgZnJhbWVzIGlmIHRoZSBTVEEgZGlkIG5vdCBuZWdvdGlhdGUgdXNlIG9mIFFvUyBmb3IKKwkgIHRoaXMgYXNzb2NpYXRpb24pCisKIDIwMTItMDUtMTAgLSB2MS4wCiAJKiBBZGQgY2hhbm5lbCBzZWxlY3Rpb24gc3VwcG9ydCBpbiBob3N0YXBkLiBTZWUgaG9zdGFwZC5jb25mLgogCSogQWRkIHN1cHBvcnQgZm9yIElFRUUgODAyLjExdiBUaW1lIEFkdmVydGlzZW1lbnQgbWVjaGFuaXNtIHdpdGggVVRDCmRpZmYgLS1naXQgYS9ob3N0YXBkL01ha2VmaWxlIGIvaG9zdGFwZC9NYWtlZmlsZQppbmRleCBmNWRmY2UwLi44NDA0ZTBjIDEwMDY0NAotLS0gYS9ob3N0YXBkL01ha2VmaWxlCisrKyBiL2hvc3RhcGQvTWFrZWZpbGUKQEAgLTQzLDYgKzQzLDcgQEAKIE9CSlMgKz0gLi4vc3JjL2FwL2F1dGhzcnYubwogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xeC5vCiBPQkpTICs9IC4uL3NyYy9hcC9hcF9jb25maWcubworT0JKUyArPSAuLi9zcmMvYXAvZWFwX3VzZXJfZGIubwogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLm8KIE9CSlMgKz0gLi4vc3JjL2FwL3N0YV9pbmZvLm8KIE9CSlMgKz0gLi4vc3JjL2FwL3dwYV9hdXRoLm8KQEAgLTE3MSw4ICsxNzIsMTUgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMVYKK2lmZGVmIENPTkZJR19TQUUKK0NGTEFHUyArPSAtRENPTkZJR19TQUUKK09CSlMgKz0gLi4vc3JjL2NvbW1vbi9zYWUubworTkVFRF9FQ0M9eQorTkVFRF9ESF9HUk9VUFM9eQorZW5kaWYKKworaWZkZWYgQ09ORklHX1dOTQorQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSAuLi9zcmMvYXAvd25tX2FwLm8KIGVuZGlmCiAKQEAgLTE4MCwxMCArMTg4LDYgQEAKIENGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFOCiBlbmRpZgogCi1pZmRlZiBDT05GSUdfV05NCi1DRkxBR1MgKz0gLURDT05GSUdfV05NCi1lbmRpZgotCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExQUMKIENGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFBQwogZW5kaWYKQEAgLTM1NywyNSArMzYxLDEwIEBACiBORUVEX01PREVYUD15CiBDT05GSUdfRUFQPXkKIAotaWZkZWYgQ09ORklHX1dQU19VRkQKLUNGTEFHUyArPSAtRENPTkZJR19XUFNfVUZECi1PQkpTICs9IC4uL3NyYy93cHMvd3BzX3VmZC5vCi1ORUVEX1dQU19PT0I9eQotZW5kaWYKLQogaWZkZWYgQ09ORklHX1dQU19ORkMKIENGTEFHUyArPSAtRENPTkZJR19XUFNfTkZDCiBPQkpTICs9IC4uL3NyYy93cHMvbmRlZi5vCi1PQkpTICs9IC4uL3NyYy93cHMvd3BzX25mYy5vCiBORUVEX1dQU19PT0I9eQotaWZkZWYgQ09ORklHX1dQU19ORkNfUE41MzEKLVBONTMxX1BBVEggPz0gL3Vzci9sb2NhbC9zcmMvbmZjCi1DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQ19QTjUzMQotQ0ZMQUdTICs9IC1JJHtQTjUzMV9QQVRIfS9pbmMKLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfbmZjX3BuNTMxLm8KLUxJQlMgKz0gJHtQTjUzMV9QQVRIfS9saWIvd3BzbmZjLmRsbAotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi9saWJuZmNfbWFwcGluZ19wbjUzeC5kbGwKLWVuZGlmCiBlbmRpZgogCiBpZmRlZiBORUVEX1dQU19PT0IKQEAgLTc0NCw2ICs3MzMsMTAgQEAKIGVuZGlmCiBlbmRpZgogCitpZmRlZiBORUVEX0VDQworQ0ZMQUdTICs9IC1EQ09ORklHX0VDQworZW5kaWYKKwogaWZkZWYgQ09ORklHX05PX1JBTkRPTV9QT09MCiBDRkxBR1MgKz0gLURDT05GSUdfTk9fUkFORE9NX1BPT0wKIGVsc2UKZGlmZiAtLWdpdCBhL2hvc3RhcGQvUkVBRE1FIGIvaG9zdGFwZC9SRUFETUUKaW5kZXggMzRkYWQzMC4uMzliNzBjYSAxMDA2NDQKLS0tIGEvaG9zdGFwZC9SRUFETUUKKysrIGIvaG9zdGFwZC9SRUFETUUKQEAgLTIsNyArMiw3IEBACiAJICBBdXRoZW50aWNhdG9yIGFuZCBSQURJVVMgYXV0aGVudGljYXRpb24gc2VydmVyCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUNvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzCitDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycwogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgbGljZW5zZSAodGhlIG9uZSB3aXRoCmRpZmYgLS1naXQgYS9ob3N0YXBkL2NvbmZpZ19maWxlLmMgYi9ob3N0YXBkL2NvbmZpZ19maWxlLmMKaW5kZXggMGEyNGVjMy4uN2IyMmRmZCAxMDA2NDQKLS0tIGEvaG9zdGFwZC9jb25maWdfZmlsZS5jCisrKyBiL2hvc3RhcGQvY29uZmlnX2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBob3N0YXBkIC8gQ29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjAwLDYgKzIwMCwxMiBAQAogCWlmICghZm5hbWUpCiAJCXJldHVybiAwOwogCisJaWYgKG9zX3N0cm5jbXAoZm5hbWUsICJzcWxpdGU6IiwgNykgPT0gMCkgeworCQlvc19mcmVlKGNvbmYtPmVhcF91c2VyX3NxbGl0ZSk7CisJCWNvbmYtPmVhcF91c2VyX3NxbGl0ZSA9IG9zX3N0cmR1cChmbmFtZSArIDcpOworCQlyZXR1cm4gMDsKKwl9CisKIAlmID0gZm9wZW4oZm5hbWUsICJyIik7CiAJaWYgKCFmKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiRUFQIHVzZXIgZmlsZSAnJXMnIG5vdCBmb3VuZC4iLCBmbmFtZSk7CkBAIC02MjQsNiArNjMwLDEyIEBACiAJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldQQS1FQVAtU0hBMjU2IikgPT0gMCkKIAkJCXZhbCB8PSBXUEFfS0VZX01HTVRfSUVFRTgwMjFYX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiU0FFIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfS0VZX01HTVRfU0FFOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJGVC1TQUUiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9LRVlfTUdNVF9GVF9TQUU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCQllbHNlIHsKIAkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBrZXlfbWdtdCAnJXMnIiwKIAkJCQkgICBsaW5lLCBzdGFydCk7CkBAIC02NDksNDkgKzY2MSwxMiBAQAogCiBzdGF0aWMgaW50IGhvc3RhcGRfY29uZmlnX3BhcnNlX2NpcGhlcihpbnQgbGluZSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0JaW50IHZhbCA9IDAsIGxhc3Q7Ci0JY2hhciAqc3RhcnQsICplbmQsICpidWY7Ci0KLQlidWYgPSBvc19zdHJkdXAodmFsdWUpOwotCWlmIChidWYgPT0gTlVMTCkKKwlpbnQgdmFsID0gd3BhX3BhcnNlX2NpcGhlcih2YWx1ZSk7CisJaWYgKHZhbCA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIGNpcGhlciAnJXMnLiIsCisJCQkgICBsaW5lLCB2YWx1ZSk7CiAJCXJldHVybiAtMTsKLQlzdGFydCA9IGJ1ZjsKLQotCXdoaWxlICgqc3RhcnQgIT0gJ1wwJykgewotCQl3aGlsZSAoKnN0YXJ0ID09ICcgJyB8fCAqc3RhcnQgPT0gJ1x0JykKLQkJCXN0YXJ0Kys7Ci0JCWlmICgqc3RhcnQgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQllbmQgPSBzdGFydDsKLQkJd2hpbGUgKCplbmQgIT0gJyAnICYmICplbmQgIT0gJ1x0JyAmJiAqZW5kICE9ICdcMCcpCi0JCQllbmQrKzsKLQkJbGFzdCA9ICplbmQgPT0gJ1wwJzsKLQkJKmVuZCA9ICdcMCc7Ci0JCWlmIChvc19zdHJjbXAoc3RhcnQsICJDQ01QIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX0NDTVA7Ci0JCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIkdDTVAiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfR0NNUDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiVEtJUCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9US0lQOwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVAxMDQiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfV0VQMTA0OwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVA0MCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVA0MDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiTk9ORSIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9OT05FOwotCQllbHNlIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBjaXBoZXIgJyVzJy4iLAotCQkJCSAgIGxpbmUsIHN0YXJ0KTsKLQkJCW9zX2ZyZWUoYnVmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChsYXN0KQotCQkJYnJlYWs7Ci0JCXN0YXJ0ID0gZW5kICsgMTsKIAl9Ci0Jb3NfZnJlZShidWYpOwotCiAJaWYgKHZhbCA9PSAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogbm8gY2lwaGVyIHZhbHVlcyBjb25maWd1cmVkLiIsCiAJCQkgICBsaW5lKTsKQEAgLTE3NjgsNiArMTc0Myw4IEBACiAJCQkJYnNzLT5zc2lkLnNzaWRfc2V0ID0gMTsKIAkJCX0KIAkJCW9zX2ZyZWUoc3RyKTsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAidXRmOF9zc2lkIikgPT0gMCkgeworCQkJYnNzLT5zc2lkLnV0Zjhfc3NpZCA9IGF0b2kocG9zKSA+IDA7CiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIm1hY2FkZHJfYWNsIikgPT0gMCkgewogCQkJYnNzLT5tYWNhZGRyX2FjbCA9IGF0b2kocG9zKTsKIAkJCWlmIChic3MtPm1hY2FkZHJfYWNsICE9IEFDQ0VQVF9VTkxFU1NfREVOSUVEICYmCkBAIC0yMjk5LDYgKzIyNzYsOCBAQAogCQkJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQjsKIAkJCWVsc2UgaWYgKG9zX3N0cmNtcChwb3MsICJnIikgPT0gMCkKIAkJCQljb25mLT5od19tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc7CisJCQllbHNlIGlmIChvc19zdHJjbXAocG9zLCAiYWQiKSA9PSAwKQorCQkJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ7CiAJCQllbHNlIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IHVua25vd24gIgogCQkJCQkgICAiaHdfbW9kZSAnJXMnIiwgbGluZSwgcG9zKTsKQEAgLTI1MTIsNiArMjQ5MSw5IEBACiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHgiKSA9PSAwKQogCQl7CiAJCQljb25mLT52aHRfb3Blcl9jZW50cl9mcmVxX3NlZzBfaWR4ID0gYXRvaShwb3MpOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ2aHRfb3Blcl9jZW50cl9mcmVxX3NlZzFfaWR4IikgPT0gMCkKKwkJeworCQkJY29uZi0+dmh0X29wZXJfY2VudHJfZnJlcV9zZWcxX2lkeCA9IGF0b2kocG9zKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExQUMgKi8KIAkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAibWF4X2xpc3Rlbl9pbnRlcnZhbCIpID09IDApIHsKIAkJCWJzcy0+bWF4X2xpc3Rlbl9pbnRlcnZhbCA9IGF0b2kocG9zKTsKQEAgLTI3MDIsNiArMjY4NCwxMiBAQAogCQkJYnNzLT50aW1lX3pvbmUgPSBvc19zdHJkdXAocG9zKTsKIAkJCWlmIChic3MtPnRpbWVfem9uZSA9PSBOVUxMKQogCQkJCWVycm9ycysrOworI2lmZGVmIENPTkZJR19XTk0KKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAid25tX3NsZWVwX21vZGUiKSA9PSAwKSB7CisJCQlic3MtPndubV9zbGVlcF9tb2RlID0gYXRvaShwb3MpOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJic3NfdHJhbnNpdGlvbiIpID09IDApIHsKKwkJCWJzcy0+YnNzX3RyYW5zaXRpb24gPSBhdG9pKHBvcyk7CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKIAkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiaW50ZXJ3b3JraW5nIikgPT0gMCkgewogCQkJYnNzLT5pbnRlcndvcmtpbmcgPSBhdG9pKHBvcyk7CkBAIC0yOTEwLDYgKzI4OTgsMTQgQEAKIAogCQkJd3BhYnVmX2ZyZWUoYnNzLT52ZW5kb3JfZWxlbWVudHMpOwogCQkJYnNzLT52ZW5kb3JfZWxlbWVudHMgPSBlbGVtczsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAic2FlX2FudGlfY2xvZ2dpbmdfdGhyZXNob2xkIikgPT0gMCkgeworCQkJYnNzLT5zYWVfYW50aV9jbG9nZ2luZ190aHJlc2hvbGQgPSBhdG9pKHBvcyk7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInNhZV9ncm91cHMiKSA9PSAwKSB7CisJCQlpZiAoaG9zdGFwZF9wYXJzZV9yYXRlcygmYnNzLT5zYWVfZ3JvdXBzLCBwb3MpKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkICIKKwkJCQkJICAgInNhZV9ncm91cHMgdmFsdWUgJyVzJyIsIGxpbmUsIHBvcyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IHVua25vd24gY29uZmlndXJhdGlvbiAiCiAJCQkJICAgIml0ZW0gJyVzJyIsIGxpbmUsIGJ1Zik7CkBAIC0yOTIzLDMxICsyOTE5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGhvc3RhcGRfc2V0X3NlY3VyaXR5X3BhcmFtcyhzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpic3MpCiB7Ci0JaW50IHBhaXJ3aXNlOwotCiAJaWYgKGJzcy0+aW5kaXZpZHVhbF93ZXBfa2V5X2xlbiA9PSAwKSB7CiAJCS8qIGluZGl2aWR1YWwga2V5cyBhcmUgbm90IHVzZTsgY2FuIHVzZSBrZXkgaWR4MCBmb3IKIAkJICogYnJvYWRjYXN0IGtleXMgKi8KIAkJYnNzLT5icm9hZGNhc3Rfa2V5X2lkeF9taW4gPSAwOwogCX0KIAotCS8qIFNlbGVjdCBncm91cCBjaXBoZXIgYmFzZWQgb24gdGhlIGVuYWJsZWQgcGFpcndpc2UgY2lwaGVyCi0JICogc3VpdGVzICovCi0JcGFpcndpc2UgPSAwOwotCWlmIChic3MtPndwYSAmIDEpCi0JCXBhaXJ3aXNlIHw9IGJzcy0+d3BhX3BhaXJ3aXNlOwotCWlmIChic3MtPndwYSAmIDIpIHsKLQkJaWYgKGJzcy0+cnNuX3BhaXJ3aXNlID09IDApCi0JCQlic3MtPnJzbl9wYWlyd2lzZSA9IGJzcy0+d3BhX3BhaXJ3aXNlOwotCQlwYWlyd2lzZSB8PSBic3MtPnJzbl9wYWlyd2lzZTsKLQl9Ci0JaWYgKHBhaXJ3aXNlICYgV1BBX0NJUEhFUl9US0lQKQotCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfVEtJUDsKLQllbHNlIGlmICgocGFpcndpc2UgJiAoV1BBX0NJUEhFUl9DQ01QIHwgV1BBX0NJUEhFUl9HQ01QKSkgPT0KLQkJIFdQQV9DSVBIRVJfR0NNUCkKLQkJYnNzLT53cGFfZ3JvdXAgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JZWxzZQotCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfQ0NNUDsKKwlpZiAoKGJzcy0+d3BhICYgMikgJiYgYnNzLT5yc25fcGFpcndpc2UgPT0gMCkKKwkJYnNzLT5yc25fcGFpcndpc2UgPSBic3MtPndwYV9wYWlyd2lzZTsKKwlic3MtPndwYV9ncm91cCA9IHdwYV9zZWxlY3RfYXBfZ3JvdXBfY2lwaGVyKGJzcy0+d3BhLCBic3MtPndwYV9wYWlyd2lzZSwKKwkJCQkJCSAgICBic3MtPnJzbl9wYWlyd2lzZSk7CiAKIAlic3MtPnJhZGl1cy0+YXV0aF9zZXJ2ZXIgPSBic3MtPnJhZGl1cy0+YXV0aF9zZXJ2ZXJzOwogCWJzcy0+cmFkaXVzLT5hY2N0X3NlcnZlciA9IGJzcy0+cmFkaXVzLT5hY2N0X3NlcnZlcnM7CmRpZmYgLS1naXQgYS9ob3N0YXBkL2N0cmxfaWZhY2UuYyBiL2hvc3RhcGQvY3RybF9pZmFjZS5jCmluZGV4IDFiOGJlZGUuLjkzYjc0MGUgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvY3RybF9pZmFjZS5jCisrKyBiL2hvc3RhcGQvY3RybF9pZmFjZS5jCkBAIC0yNTAsMzAgKzI1MCw2IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19XUFNfT09CCi1zdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV93cHNfb29iKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNoYXIgKnR4dCkKLXsKLQljaGFyICpwYXRoLCAqbWV0aG9kLCAqbmFtZTsKLQotCXBhdGggPSBvc19zdHJjaHIodHh0LCAnICcpOwotCWlmIChwYXRoID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkqcGF0aCsrID0gJ1wwJzsKLQotCW1ldGhvZCA9IG9zX3N0cmNocihwYXRoLCAnICcpOwotCWlmIChtZXRob2QgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSptZXRob2QrKyA9ICdcMCc7Ci0KLQluYW1lID0gb3Nfc3RyY2hyKG1ldGhvZCwgJyAnKTsKLQlpZiAobmFtZSAhPSBOVUxMKQotCQkqbmFtZSsrID0gJ1wwJzsKLQotCXJldHVybiBob3N0YXBkX3dwc19zdGFydF9vb2IoaGFwZCwgdHh0LCBwYXRoLCBtZXRob2QsIG5hbWUpOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KLQogI2lmZGVmIENPTkZJR19XUFNfTkZDCiBzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV93cHNfbmZjX3RhZ19yZWFkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJCSAgICAgICBjaGFyICpwb3MpCkBAIC00NjAsNiArNDM2LDUwIEBACiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCisKK3N0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2Rpc2Fzc29jX2ltbWluZW50KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJCQljb25zdCBjaGFyICpjbWQpCit7CisJdTggYWRkcltFVEhfQUxFTl07CisJdTggYnVmWzEwMDBdLCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwlpbnQgZGlzYXNzb2NfdGltZXI7CisKKwlpZiAoaHdhZGRyX2F0b24oY21kLCBhZGRyKSkKKwkJcmV0dXJuIC0xOworCWlmIChjbWRbMTddICE9ICcgJykKKwkJcmV0dXJuIC0xOworCWRpc2Fzc29jX3RpbWVyID0gYXRvaShjbWQgKyAxNyk7CisKKwlvc19tZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgYnVmOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoV0xBTl9GQ19UWVBFX01HTVQsCisJCQkJCSAgIFdMQU5fRkNfU1RZUEVfQUNUSU9OKTsKKwlvc19tZW1jcHkobWdtdC0+ZGEsIGFkZHIsIEVUSF9BTEVOKTsKKwlvc19tZW1jcHkobWdtdC0+c2EsIGhhcGQtPm93bl9hZGRyLCBFVEhfQUxFTik7CisJb3NfbWVtY3B5KG1nbXQtPmJzc2lkLCBoYXBkLT5vd25fYWRkciwgRVRIX0FMRU4pOworCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9BQ1RJT05fV05NOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5hY3Rpb24gPSBXTk1fQlNTX1RSQU5TX01HTVRfUkVROworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5kaWFsb2dfdG9rZW4gPSAxOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5yZXFfbW9kZSA9CisJCVdOTV9CU1NfVE1fUkVRX0RJU0FTU09DX0lNTUlORU5UOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS5kaXNhc3NvY190aW1lciA9CisJCWhvc3RfdG9fbGUxNihkaXNhc3NvY190aW1lcik7CisJbWdtdC0+dS5hY3Rpb24udS5ic3NfdG1fcmVxLnZhbGlkaXR5X2ludGVydmFsID0gMDsKKworCXBvcyA9IG1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3JlcS52YXJpYWJsZTsKKworCWlmIChob3N0YXBkX2Rydl9zZW5kX21sbWUoaGFwZCwgYnVmLCBwb3MgLSBidWYsIDApIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkZhaWxlZCB0byBzZW5kIEJTUyBUcmFuc2l0aW9uICIKKwkJCSAgICJNYW5hZ2VtZW50IFJlcXVlc3QgZnJhbWUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2Vzc19kaXNhc3NvYyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCQkgICBjb25zdCBjaGFyICpjbWQpCiB7CkBAIC01MTAsNiArNTMwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KKwogCiBzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9nZXRfY29uZmlnKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJCSBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCkBAIC02MTMsMjAgKzYzNSw5IEBACiAJCXBvcyArPSByZXQ7CiAJfQogCi0JaWYgKGhhcGQtPmNvbmYtPndwYSAmJiBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPUNDTVBcbiIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJcG9zICs9IHJldDsKLQl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgotCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPUdDTVBcbiIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJcG9zICs9IHJldDsKLQl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgotCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPVRLSVBcbiIpOworCWlmIChoYXBkLT5jb25mLT53cGEpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJncm91cF9jaXBoZXI9JXNcbiIsCisJCQkJICB3cGFfY2lwaGVyX3R4dChoYXBkLT5jb25mLT53cGFfZ3JvdXApKTsKIAkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKIAkJCXJldHVybiBwb3MgLSBidWY7CiAJCXBvcyArPSByZXQ7CkBAIC02MzgsMjQgKzY0OSwxMSBAQAogCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAkJcG9zICs9IHJldDsKIAotCQlpZiAoaGFwZC0+Y29uZi0+cnNuX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSB7Ci0JCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIkNDTVAgIik7Ci0JCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJCXJldHVybiBwb3MgLSBidWY7Ci0JCQlwb3MgKz0gcmV0OwotCQl9Ci0JCWlmIChoYXBkLT5jb25mLT5yc25fcGFpcndpc2UgJiBXUEFfQ0lQSEVSX0dDTVApIHsKLQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiR0NNUCAiKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJCXBvcyArPSByZXQ7Ci0JCX0KLQkJaWYgKGhhcGQtPmNvbmYtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJUS0lQICIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCQlyZXR1cm4gcG9zIC0gYnVmOwotCQkJcG9zICs9IHJldDsKLQkJfQorCQlyZXQgPSB3cGFfd3JpdGVfY2lwaGVycyhwb3MsIGVuZCwgaGFwZC0+Y29uZi0+cnNuX3BhaXJ3aXNlLAorCQkJCQkiICIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBwb3MgLSBidWY7CisJCXBvcyArPSByZXQ7CiAKIAkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcbiIpOwogCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQpAQCAtNjY5LDI0ICs2NjcsMTEgQEAKIAkJCXJldHVybiBwb3MgLSBidWY7CiAJCXBvcyArPSByZXQ7CiAKLQkJaWYgKGhhcGQtPmNvbmYtPndwYV9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfQ0NNUCkgewotCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJDQ01QICIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCQlyZXR1cm4gcG9zIC0gYnVmOwotCQkJcG9zICs9IHJldDsKLQkJfQotCQlpZiAoaGFwZC0+Y29uZi0+d3BhX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIkdDTVAgIik7Ci0JCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJCXJldHVybiBwb3MgLSBidWY7Ci0JCQlwb3MgKz0gcmV0OwotCQl9Ci0JCWlmIChoYXBkLT5jb25mLT53cGFfcGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApIHsKLQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiVEtJUCAiKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKLQkJCXBvcyArPSByZXQ7Ci0JCX0KKwkJcmV0ID0gd3BhX3dyaXRlX2NpcGhlcnMocG9zLCBlbmQsIGhhcGQtPmNvbmYtPnJzbl9wYWlyd2lzZSwKKwkJCQkJIiAiKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcG9zIC0gYnVmOworCQlwb3MgKz0gcmV0OwogCiAJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXG4iKTsKIAkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKQEAgLTkxMiwxMSArODk3LDYgQEAKIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJXUFNfQ0FOQ0VMIikgPT0gMCkgewogCQlpZiAoaG9zdGFwZF93cHNfY2FuY2VsKGhhcGQpKQogCQkJcmVwbHlfbGVuID0gLTE7Ci0jaWZkZWYgQ09ORklHX1dQU19PT0IKLQl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX09PQiAiLCA4KSA9PSAwKSB7Ci0JCWlmIChob3N0YXBkX2N0cmxfaWZhY2Vfd3BzX29vYihoYXBkLCBidWYgKyA4KSkKLQkJCXJlcGx5X2xlbiA9IC0xOwotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19BUF9QSU4gIiwgMTEpID09IDApIHsKIAkJcmVwbHlfbGVuID0gaG9zdGFwZF9jdHJsX2lmYWNlX3dwc19hcF9waW4oaGFwZCwgYnVmICsgMTEsCiAJCQkJCQkJICByZXBseSwgcmVwbHlfc2l6ZSk7CkBAIC05MzUsOSArOTE1LDE0IEBACiAJCQloYXBkLCBidWYgKyAxNCwgcmVwbHksIHJlcGx5X3NpemUpOwogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLworI2lmZGVmIENPTkZJR19XTk0KKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiRElTQVNTT0NfSU1NSU5FTlQgIiwgMTgpID09IDApIHsKKwkJaWYgKGhvc3RhcGRfY3RybF9pZmFjZV9kaXNhc3NvY19pbW1pbmVudChoYXBkLCBidWYgKyAxOCkpCisJCQlyZXBseV9sZW4gPSAtMTsKIAl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiRVNTX0RJU0FTU09DICIsIDEzKSA9PSAwKSB7CiAJCWlmIChob3N0YXBkX2N0cmxfaWZhY2VfZXNzX2Rpc2Fzc29jKGhhcGQsIGJ1ZiArIDEzKSkKIAkJCXJlcGx5X2xlbiA9IC0xOworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJHRVRfQ09ORklHIikgPT0gMCkgewogCQlyZXBseV9sZW4gPSBob3N0YXBkX2N0cmxfaWZhY2VfZ2V0X2NvbmZpZyhoYXBkLCByZXBseSwKIAkJCQkJCQkgIHJlcGx5X3NpemUpOwpAQCAtMTAyNiwxMiArMTAxMSwyNyBAQAogCX0KIAogCWlmIChoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZV9naWRfc2V0ICYmCi0JICAgIGNob3duKGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlLCAwLAorCSAgICBjaG93bihoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZSwgLTEsCiAJCSAgaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2VfZ2lkKSA8IDApIHsKIAkJcGVycm9yKCJjaG93bltjdHJsX2ludGVyZmFjZV0iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAorI2lmZGVmIEFORFJPSUQKKwkvKgorCSAqIEFuZHJvaWQgaXMgdXNpbmcgdW1hc2sgMDA3NyB3aGljaCB3b3VsZCBsZWF2ZSB0aGUgY29udHJvbCBpbnRlcmZhY2UKKwkgKiBkaXJlY3Rvcnkgd2l0aG91dCBncm91cCBhY2Nlc3MuIFRoaXMgYnJlYWtzIHRoaW5ncyBzaW5jZSBXaS1GaQorCSAqIGZyYW1ld29yayBhc3N1bWVzIHRoYXQgdGhpcyBkaXJlY3RvcnkgY2FuIGJlIGFjY2Vzc2VkIGJ5IG90aGVyCisJICogYXBwbGljYXRpb25zIGluIHRoZSB3aWZpIGdyb3VwLiBGaXggdGhpcyBieSBhZGRpbmcgZ3JvdXAgYWNjZXNzIGV2ZW4KKwkgKiBpZiB1bWFzayB2YWx1ZSB3b3VsZCBwcmV2ZW50IHRoaXMuCisJICovCisJaWYgKGNobW9kKGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlLCBTX0lSV1hVIHwgU19JUldYRykgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiQ1RSTDogQ291bGQgbm90IGNobW9kIGRpcmVjdG9yeTogJXMiLAorCQkJICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogVHJ5IHRvIGNvbnRpbnVlIGFueXdheSAqLworCX0KKyNlbmRpZiAvKiBBTkRST0lEICovCisKIAlpZiAob3Nfc3RybGVuKGhhcGQtPmNvbmYtPmN0cmxfaW50ZXJmYWNlKSArIDEgKwogCSAgICBvc19zdHJsZW4oaGFwZC0+Y29uZi0+aWZhY2UpID49IHNpemVvZihhZGRyLnN1bl9wYXRoKSkKIAkJZ290byBmYWlsOwpAQCAtMTA4NCw3ICsxMDg0LDcgQEAKIAl9CiAKIAlpZiAoaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2VfZ2lkX3NldCAmJgotCSAgICBjaG93bihmbmFtZSwgMCwgaGFwZC0+Y29uZi0+Y3RybF9pbnRlcmZhY2VfZ2lkKSA8IDApIHsKKwkgICAgY2hvd24oZm5hbWUsIC0xLCBoYXBkLT5jb25mLT5jdHJsX2ludGVyZmFjZV9naWQpIDwgMCkgewogCQlwZXJyb3IoImNob3duW2N0cmxfaW50ZXJmYWNlL2lmbmFtZV0iKTsKIAkJZ290byBmYWlsOwogCX0KZGlmZiAtLWdpdCBhL2hvc3RhcGQvZGVmY29uZmlnIGIvaG9zdGFwZC9kZWZjb25maWcKaW5kZXggMjA0YWE3Ni4uYjVkZGNhMyAxMDA2NDQKLS0tIGEvaG9zdGFwZC9kZWZjb25maWcKKysrIGIvaG9zdGFwZC9kZWZjb25maWcKQEAgLTI2NSw1ICsyNjUsNSBAQAogIyBIb3RzcG90IDIuMAogI0NPTkZJR19IUzIwPXkKIAotIyBFbmFibGUgU1FMaXRlIGRhdGFiYXNlIHN1cHBvcnQgaW4gaGxyX2F1Y19ndworIyBFbmFibGUgU1FMaXRlIGRhdGFiYXNlIHN1cHBvcnQgaW4gaGxyX2F1Y19ndywgRUFQLVNJTSBEQiwgYW5kIGVhcF91c2VyX2ZpbGUKICNDT05GSUdfU1FMSVRFPXkKZGlmZiAtLWdpdCBhL2hvc3RhcGQvZHVtcF9zdGF0ZS5jIGIvaG9zdGFwZC9kdW1wX3N0YXRlLmMKaW5kZXggZDMzZTA1Zi4uZmNkOTg5MCAxMDA2NDQKLS0tIGEvaG9zdGFwZC9kdW1wX3N0YXRlLmMKKysrIGIvaG9zdGFwZC9kdW1wX3N0YXRlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJhcC9hcF9jb25maWcuaCIKICNpbmNsdWRlICJhcC9zdGFfaW5mby5oIgogI2luY2x1ZGUgImR1bXBfc3RhdGUuaCIKKyNpbmNsdWRlICJhcC9hcF9kcnZfb3BzLmgiCiAKIAogc3RhdGljIHZvaWQgZnByaW50X2NoYXIoRklMRSAqZiwgY2hhciBjKQpAQCAtNzIsNiArNzMsNyBAQAogI2lmbmRlZiBDT05GSUdfTk9fUkFESVVTCiAJY2hhciAqYnVmOwogI2VuZGlmIC8qIENPTkZJR19OT19SQURJVVMgKi8KKwlzdHJ1Y3QgaG9zdGFwX3N0YV9kcml2ZXJfZGF0YSBkYXRhOwogCiAJaWYgKCFoYXBkLT5jb25mLT5kdW1wX2xvZ19uYW1lKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRHVtcCBmaWxlIG5vdCBkZWZpbmVkIC0gaWdub3JpbmcgZHVtcCAiCkBAIC0xMzksNiArMTQxLDEzIEBACiAJCQkgICJERUFVVEgiKSkpOwogCiAJCWllZWU4MDJfMXhfZHVtcF9zdGF0ZShmLCAiICAiLCBzdGEpOworCisJCWlmIChob3N0YXBkX2Rydl9yZWFkX3N0YV9kYXRhKGhhcGQsICZkYXRhLCBzdGEtPmFkZHIpID09IDApIHsKKwkJCWZwcmludGYoZiwgIiAgcnhfcGt0PSVsdSB0eF9wa3Q9JWx1XG4iCisJCQkJIiAgcnhfYnl0ZT0lbHUgdHhfYnl0ZT0lbHVcbiIsCisJCQkJZGF0YS5yeF9wYWNrZXRzLCBkYXRhLnR4X3BhY2tldHMsCisJCQkJZGF0YS5yeF9ieXRlcywgZGF0YS50eF9ieXRlcyk7CisJCX0KIAl9CiAKICNpZm5kZWYgQ09ORklHX05PX1JBRElVUwpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9ob3N0YXBkLmNvbmYgYi9ob3N0YXBkL2hvc3RhcGQuY29uZgppbmRleCBlZGJkNzcyLi5lY2EzOTk2IDEwMDY0NAotLS0gYS9ob3N0YXBkL2hvc3RhcGQuY29uZgorKysgYi9ob3N0YXBkL2hvc3RhcGQuY29uZgpAQCAtOTAsNiArOTAsOSBAQAogI3NzaWQyPTc0NjU3Mzc0CiAjc3NpZDI9UCJoZWxsb1xudGhlcmUiCiAKKyMgVVRGLTggU1NJRDogV2hldGhlciB0aGUgU1NJRCBpcyB0byBiZSBpbnRlcnByZXRlZCB1c2luZyBVVEYtOCBlbmNvZGluZworI3V0Zjhfc3NpZD0xCisKICMgQ291bnRyeSBjb2RlIChJU08vSUVDIDMxNjYtMSkuIFVzZWQgdG8gc2V0IHJlZ3VsYXRvcnkgZG9tYWluLgogIyBTZXQgYXMgbmVlZGVkIHRvIGluZGljYXRlIGNvdW50cnkgaW4gd2hpY2ggZGV2aWNlIGlzIG9wZXJhdGluZy4KICMgVGhpcyBjYW4gbGltaXQgYXZhaWxhYmxlIGNoYW5uZWxzIGFuZCB0cmFuc21pdCBwb3dlci4KQEAgLTEwMyw2ICsxMDYsOCBAQAogI2llZWU4MDIxMWQ9MQogCiAjIE9wZXJhdGlvbiBtb2RlIChhID0gSUVFRSA4MDIuMTFhLCBiID0gSUVFRSA4MDIuMTFiLCBnID0gSUVFRSA4MDIuMTFnLAorIyBhZCA9IElFRUUgODAyLjExYWQgKDYwIEdIeik7IGEvZyBvcHRpb25zIGFyZSB1c2VkIHdpdGggSUVFRSA4MDIuMTFuLCB0b28sIHRvCisjIHNwZWNpZnkgYmFuZCkKICMgRGVmYXVsdDogSUVFRSA4MDIuMTFiCiBod19tb2RlPWcKIApAQCAtNTcyLDYgKzU3NywxMiBAQAogIyB3aGljaCBpcyBjaGFubmVsIDQyIGluIDVHIGJhbmQKICMKICN2aHRfb3Blcl9jZW50cl9mcmVxX3NlZzBfaWR4PTQyCisjCisjIGNlbnRlciBmcmVxID0gNSBHSHogKyAoNSAqIGluZGV4KQorIyBTbyBpbmRleCAxNTkgZ2l2ZXMgY2VudGVyIGZyZXEgNS43OTUgR0h6CisjIHdoaWNoIGlzIGNoYW5uZWwgMTU5IGluIDVHIGJhbmQKKyMKKyN2aHRfb3Blcl9jZW50cl9mcmVxX3NlZzFfaWR4PTE1OQogCiAjIyMjIyBJRUVFIDgwMi4xWC0yMDA0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTYyOSw2ICs2NDAsOCBAQAogZWFwX3NlcnZlcj0wCiAKICMgUGF0aCBmb3IgRUFQIHNlcnZlciB1c2VyIGRhdGFiYXNlCisjIElmIFNRTGl0ZSBzdXBwb3J0IGlzIGluY2x1ZGVkLCB0aGlzIGNhbiBiZSBzZXQgdG8gInNxbGl0ZTovcGF0aC90by9zcWxpdGUuZGIiCisjIHRvIHVzZSBTUUxpdGUgZGF0YWJhc2UgaW5zdGVhZCBvZiBhIHRleHQgZmlsZS4KICNlYXBfdXNlcl9maWxlPS9ldGMvaG9zdGFwZC5lYXBfdXNlcgogCiAjIENBIGNlcnRpZmljYXRlIChQRU0gb3IgREVSIGZpbGUpIGZvciBFQVAtVExTL1BFQVAvVFRMUwpAQCAtMTAyNCw2ICsxMDM3LDE5IEBACiAjIDEgPSBlbmFibGVkCiAjb2tjPTEKIAorIyBTQUUgdGhyZXNob2xkIGZvciBhbnRpLWNsb2dnaW5nIG1lY2hhbmlzbSAoZG90MTFSU05BU0FFQW50aUNsb2dnaW5nVGhyZXNob2xkKQorIyBUaGlzIHBhcmFtZXRlciBkZWZpbmVzIGhvdyBtYW55IG9wZW4gU0FFIGluc3RhbmNlcyBjYW4gYmUgaW4gcHJvZ3Jlc3MgYXQgdGhlCisjIHNhbWUgdGltZSBiZWZvcmUgdGhlIGFudGktY2xvZ2dpbmcgbWVjaGFuaXNtIGlzIHRha2VuIGludG8gdXNlLgorI3NhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZD01CisKKyMgRW5hYmxlZCBTQUUgZmluaXRlIGN5Y2xpYyBncm91cHMKKyMgU0FFIGltcGxlbWVudGF0aW9uIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGdyb3VwIDE5IChFQ0MgZ3JvdXAgZGVmaW5lZCBvdmVyIGEKKyMgMjU2LWJpdCBwcmltZSBvcmRlciBmaWVsZCkuIEFsbCBncm91cHMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZQorIyBpbXBsZW1lbnRhdGlvbiBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LiBUaGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNhbiBiZQorIyB1c2VkIHRvIHNwZWNpZnkgYSBsaW1pdGVkIHNldCBvZiBhbGxvd2VkIGdyb3Vwcy4gVGhlIGdyb3VwIHZhbHVlcyBhcmUgbGlzdGVkCisjIGluIHRoZSBJQU5BIHJlZ2lzdHJ5OgorIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2lwc2VjLXJlZ2lzdHJ5L2lwc2VjLXJlZ2lzdHJ5LnhtbCNpcHNlYy1yZWdpc3RyeS05Cisjc2FlX2dyb3Vwcz0xOSAyMCAyMSAyNSAyNgogCiAjIyMjIyBJRUVFIDgwMi4xMXIgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTEyOTIsNiArMTMxOCwxNiBAQAogIyBzdGRvZmZzZXRbZHN0W29mZnNldF1bLHN0YXJ0Wy90aW1lXSxlbmRbL3RpbWVdXV0KICN0aW1lX3pvbmU9RVNUNQogCisjIFdOTS1TbGVlcCBNb2RlIChleHRlbmRlZCBzbGVlcCBtb2RlIGZvciBzdGF0aW9ucykKKyMgMCA9IGRpc2FibGVkIChkZWZhdWx0KQorIyAxID0gZW5hYmxlZCAoYWxsb3cgc3RhdGlvbnMgdG8gdXNlIFdOTS1TbGVlcCBNb2RlKQorI3dubV9zbGVlcF9tb2RlPTEKKworIyBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50CisjIDAgPSBkaXNhYmxlZCAoZGVmYXVsdCkKKyMgMSA9IGVuYWJsZWQKKyNic3NfdHJhbnNpdGlvbj0xCisKICMjIyMjIElFRUUgODAyLjExdS0yMDExICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBFbmFibGUgSW50ZXJ3b3JraW5nIHNlcnZpY2UKZGlmZiAtLWdpdCBhL2hvc3RhcGQvaG9zdGFwZC5lYXBfdXNlcl9zcWxpdGUgYi9ob3N0YXBkL2hvc3RhcGQuZWFwX3VzZXJfc3FsaXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODgzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0YXBkL2hvc3RhcGQuZWFwX3VzZXJfc3FsaXRlCkBAIC0wLDAgKzEsMTcgQEAKK0NSRUFURSBUQUJMRSB1c2VycygKKwlpZGVudGl0eSBURVhUIFBSSU1BUlkgS0VZLAorCW1ldGhvZHMgVEVYVCwKKwlwYXNzd29yZCBURVhULAorCXBoYXNlMiBJTlRFR0VSCispOworCitDUkVBVEUgVEFCTEUgd2lsZGNhcmRzKAorCWlkZW50aXR5IFRFWFQgUFJJTUFSWSBLRVksCisJbWV0aG9kcyBURVhUCispOworCitJTlNFUlQgSU5UTyB1c2VycyhpZGVudGl0eSxtZXRob2RzLHBhc3N3b3JkLHBoYXNlMikgVkFMVUVTICgndXNlcicsJ1RUTFMtTVNDSEFQVjInLCdwYXNzd29yZCcsMSk7CitJTlNFUlQgSU5UTyB1c2VycyhpZGVudGl0eSxtZXRob2RzLHBhc3N3b3JkLHBoYXNlMikgVkFMVUVTICgnRE9NQUlOXG1zY2hhcHYyIHVzZXInLCdUVExTLU1TQ0hBUFYyJywncGFzc3dvcmQnLDEpOworCitJTlNFUlQgSU5UTyB3aWxkY2FyZHMoaWRlbnRpdHksbWV0aG9kcykgVkFMVUVTICgnJywnVFRMUyxUTFMnKTsKK0lOU0VSVCBJTlRPIHdpbGRjYXJkcyhpZGVudGl0eSxtZXRob2RzKSBWQUxVRVMgKCcwJywnQUtBJyk7CmRpZmYgLS1naXQgYS9ob3N0YXBkL2hvc3RhcGRfY2xpLmMgYi9ob3N0YXBkL2hvc3RhcGRfY2xpLmMKaW5kZXggMjdiZWEyYS4uYjY5M2ZhMCAxMDA2NDQKLS0tIGEvaG9zdGFwZC9ob3N0YXBkX2NsaS5jCisrKyBiL2hvc3RhcGQvaG9zdGFwZF9jbGkuYwpAQCAtMTgsNyArMTgsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqaG9zdGFwZF9jbGlfdmVyc2lvbiA9CiAiaG9zdGFwZF9jbGkgdiIgVkVSU0lPTl9TVFIgIlxuIgotIkNvcHlyaWdodCAoYykgMjAwNC0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzIjsKKyJDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycyI7CiAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmhvc3RhcGRfY2xpX2xpY2Vuc2UgPQpAQCAtNzIsOSArNzIsNiBAQAogIiAgIHdwc19jaGVja19waW4gPFBJTj4gIHZlcmlmeSBQSU4gY2hlY2tzdW1cbiIKICIgICB3cHNfcGJjICAgICAgICAgICAgICBpbmRpY2F0ZSBidXR0b24gcHVzaGVkIHRvIGluaXRpYXRlIFBCQ1xuIgogIiAgIHdwc19jYW5jZWwgICAgICAgICAgIGNhbmNlbCB0aGUgcGVuZGluZyBXUFMgb3BlcmF0aW9uXG4iCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLSIgICB3cHNfb29iIDx0eXBlPiA8cGF0aD4gPG1ldGhvZD4gIHVzZSBXUFMgd2l0aCBvdXQtb2YtYmFuZCAoVUZEKVxuIgotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKICIgICB3cHNfbmZjX3RhZ19yZWFkIDxoZXhkdW1wPiAgcmVwb3J0IHJlYWQgTkZDIHRhZyB3aXRoIFdQUyBkYXRhXG4iCiAiICAgd3BzX25mY19jb25maWdfdG9rZW4gPFdQUy9OREVGPiAgYnVpbGQgTkZDIGNvbmZpZ3VyYXRpb24gdG9rZW5cbiIKQEAgLTQxMCw0MCArNDA3LDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLXN0YXRpYyBpbnQgaG9zdGFwZF9jbGlfY21kX3dwc19vb2Ioc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKLQkJCQkgICBjaGFyICphcmd2W10pCi17Ci0JY2hhciBjbWRbMjU2XTsKLQlpbnQgcmVzOwotCi0JaWYgKGFyZ2MgIT0gMyAmJiBhcmdjICE9IDQpIHsKLQkJcHJpbnRmKCJJbnZhbGlkIFdQU19PT0IgY29tbWFuZDogbmVlZCB0aHJlZSBvciBmb3VyICIKLQkJICAgICAgICJhcmd1bWVudHM6XG4iCi0JCSAgICAgICAiLSBERVZfVFlQRTogdXNlICd1ZmQnIG9yICduZmMnXG4iCi0JCSAgICAgICAiLSBQQVRIOiBwYXRoIG9mIE9PQiBkZXZpY2UgbGlrZSAnL21udCdcbiIKLQkJICAgICAgICItIE1FVEhPRDogT09CIG1ldGhvZCAncGluLWUnIG9yICdwaW4tcicsICIKLQkJICAgICAgICInY3JlZCdcbiIKLQkJICAgICAgICItIERFVl9OQU1FOiAob25seSBmb3IgTkZDKSBkZXZpY2UgbmFtZSBsaWtlICIKLQkJICAgICAgICIncG41MzEnXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChhcmdjID09IDMpCi0JCXJlcyA9IG9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICJXUFNfT09CICVzICVzICVzIiwKLQkJCQkgIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOwotCWVsc2UKLQkJcmVzID0gb3Nfc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIldQU19PT0IgJXMgJXMgJXMgJXMiLAotCQkJCSAgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSk7Ci0JaWYgKHJlcyA8IDAgfHwgKHNpemVfdCkgcmVzID49IHNpemVvZihjbWQpIC0gMSkgewotCQlwcmludGYoIlRvbyBsb25nIFdQU19PT0IgY29tbWFuZC5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiB3cGFfY3RybF9jb21tYW5kKGN0cmwsIGNtZCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQotCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIHN0YXRpYyBpbnQgaG9zdGFwZF9jbGlfY21kX3dwc19uZmNfdGFnX3JlYWQoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKIAkJCQkJICAgIGNoYXIgKmFyZ3ZbXSkKQEAgLTU4MSw2ICs1NDQsMjYgQEAKICNlbmRpZiAvKiBDT05GSUdfV1BTICovCiAKIAorc3RhdGljIGludCBob3N0YXBkX2NsaV9jbWRfZGlzYXNzb2NfaW1taW5lbnQoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKKwkJCQkJICAgICBjaGFyICphcmd2W10pCit7CisJY2hhciBidWZbMzAwXTsKKwlpbnQgcmVzOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZigiSW52YWxpZCAnZGlzYXNzb2NfaW1taW5lbnQnIGNvbW1hbmQgLSB0d28gYXJndW1lbnRzICIKKwkJICAgICAgICIoU1RBIGFkZHIgYW5kIERpc2Fzc29jaWF0aW9uIFRpbWVyKSBhcmUgbmVlZGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlcyA9IG9zX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJESVNBU1NPQ19JTU1JTkVOVCAlcyAlcyIsCisJCQkgIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWlmIChyZXMgPCAwIHx8IHJlcyA+PSAoaW50KSBzaXplb2YoYnVmKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiB3cGFfY3RybF9jb21tYW5kKGN0cmwsIGJ1Zik7Cit9CisKKwogc3RhdGljIGludCBob3N0YXBkX2NsaV9jbWRfZXNzX2Rpc2Fzc29jKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsCiAJCQkJCWNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTgwOSw5ICs3OTIsNiBAQAogCXsgIndwc19jaGVja19waW4iLCBob3N0YXBkX2NsaV9jbWRfd3BzX2NoZWNrX3BpbiB9LAogCXsgIndwc19wYmMiLCBob3N0YXBkX2NsaV9jbWRfd3BzX3BiYyB9LAogCXsgIndwc19jYW5jZWwiLCBob3N0YXBkX2NsaV9jbWRfd3BzX2NhbmNlbCB9LAotI2lmZGVmIENPTkZJR19XUFNfT09CCi0JeyAid3BzX29vYiIsIGhvc3RhcGRfY2xpX2NtZF93cHNfb29iIH0sCi0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogCXsgIndwc19uZmNfdGFnX3JlYWQiLCBob3N0YXBkX2NsaV9jbWRfd3BzX25mY190YWdfcmVhZCB9LAogCXsgIndwc19uZmNfY29uZmlnX3Rva2VuIiwgaG9zdGFwZF9jbGlfY21kX3dwc19uZmNfY29uZmlnX3Rva2VuIH0sCkBAIC04MjAsNiArODAwLDcgQEAKIAl7ICJ3cHNfYXBfcGluIiwgaG9zdGFwZF9jbGlfY21kX3dwc19hcF9waW4gfSwKIAl7ICJ3cHNfY29uZmlnIiwgaG9zdGFwZF9jbGlfY21kX3dwc19jb25maWcgfSwKICNlbmRpZiAvKiBDT05GSUdfV1BTICovCisJeyAiZGlzYXNzb2NfaW1taW5lbnQiLCBob3N0YXBkX2NsaV9jbWRfZGlzYXNzb2NfaW1taW5lbnQgfSwKIAl7ICJlc3NfZGlzYXNzb2MiLCBob3N0YXBkX2NsaV9jbWRfZXNzX2Rpc2Fzc29jIH0sCiAJeyAiZ2V0X2NvbmZpZyIsIGhvc3RhcGRfY2xpX2NtZF9nZXRfY29uZmlnIH0sCiAJeyAiaGVscCIsIGhvc3RhcGRfY2xpX2NtZF9oZWxwIH0sCmRpZmYgLS1naXQgYS9ob3N0YXBkL21haW4uYyBiL2hvc3RhcGQvbWFpbi5jCmluZGV4IDU2ZjAwMDIuLmQ0MjU2ZDAgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvbWFpbi5jCisrKyBiL2hvc3RhcGQvbWFpbi5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAkJImhvc3RhcGQgdiIgVkVSU0lPTl9TVFIgIlxuIgogCQkiVXNlciBzcGFjZSBkYWVtb24gZm9yIElFRUUgODAyLjExIEFQIG1hbmFnZW1lbnQsXG4iCiAJCSJJRUVFIDgwMi4xWC9XUEEvV1BBMi9FQVAvUkFESVVTIEF1dGhlbnRpY2F0b3JcbiIKLQkJIkNvcHlyaWdodCAoYykgMjAwMi0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiAiCisJCSJDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gIgogCQkiYW5kIGNvbnRyaWJ1dG9yc1xuIik7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9hcC9hY2NvdW50aW5nLmMgYi9zcmMvYXAvYWNjb3VudGluZy5jCmluZGV4IDc1NjNiNTIuLjk1NDA1MzEgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hY2NvdW50aW5nLmMKKysrIGIvc3JjL2FwL2FjY291bnRpbmcuYwpAQCAtMjYsOCArMjYsNiBAQAogICogaW5wdXQvb3V0cHV0IG9jdGV0cyBhbmQgdXBkYXRlcyBBY2N0LXtJbnB1dCxPdXRwdXR9LUdpZ2F3b3Jkcy4gKi8KICNkZWZpbmUgQUNDVF9ERUZBVUxUX1VQREFURV9JTlRFUlZBTCAzMDAKIAotc3RhdGljIHZvaWQgYWNjb3VudGluZ19zdGFfZ2V0X2lkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCi0JCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiBzdGF0aWMgdm9pZCBhY2NvdW50aW5nX3N0YV9pbnRlcmltKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJICAgc3RydWN0IHN0YV9pbmZvICpzdGEpOwogCkBAIC0yMTAsNyArMjA4LDYgQEAKIAlpZiAoc3RhLT5hY2N0X3Nlc3Npb25fc3RhcnRlZCkKIAkJcmV0dXJuOwogCi0JYWNjb3VudGluZ19zdGFfZ2V0X2lkKGhhcGQsIHN0YSk7CiAJaG9zdGFwZF9sb2dnZXIoaGFwZCwgc3RhLT5hZGRyLCBIT1NUQVBEX01PRFVMRV9SQURJVVMsCiAJCSAgICAgICBIT1NUQVBEX0xFVkVMX0lORk8sCiAJCSAgICAgICAic3RhcnRpbmcgYWNjb3VudGluZyBzZXNzaW9uICUwOFgtJTA4WCIsCkBAIC0zNzcsNyArMzc0LDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBhY2NvdW50aW5nX3N0YV9nZXRfaWQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKK3ZvaWQgYWNjb3VudGluZ19zdGFfZ2V0X2lkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlzdGEtPmFjY3Rfc2Vzc2lvbl9pZF9sbyA9IGhhcGQtPmFjY3Rfc2Vzc2lvbl9pZF9sbysrOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL2FjY291bnRpbmcuaCBiL3NyYy9hcC9hY2NvdW50aW5nLmgKaW5kZXggOWQxM2QwMS4uZGNjNTRlZSAxMDA2NDQKLS0tIGEvc3JjL2FwL2FjY291bnRpbmcuaAorKysgYi9zcmMvYXAvYWNjb3VudGluZy5oCkBAIC0xMCw2ICsxMCwxMSBAQAogI2RlZmluZSBBQ0NPVU5USU5HX0gKIAogI2lmZGVmIENPTkZJR19OT19BQ0NPVU5USU5HCitzdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudGluZ19zdGFfZ2V0X2lkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJCSBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3sKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGFjY291bnRpbmdfc3RhX3N0YXJ0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJCXN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewpAQCAtMjksNiArMzQsNyBAQAogewogfQogI2Vsc2UgLyogQ09ORklHX05PX0FDQ09VTlRJTkcgKi8KK3ZvaWQgYWNjb3VudGluZ19zdGFfZ2V0X2lkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIHZvaWQgYWNjb3VudGluZ19zdGFfc3RhcnQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgc3RydWN0IHN0YV9pbmZvICpzdGEpOwogdm9pZCBhY2NvdW50aW5nX3N0YV9zdG9wKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIGludCBhY2NvdW50aW5nX2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CmRpZmYgLS1naXQgYS9zcmMvYXAvYXBfY29uZmlnLmMgYi9zcmMvYXAvYXBfY29uZmlnLmMKaW5kZXggMzFlMWMxOS4uOTIyZjU2NCAxMDA2NDQKLS0tIGEvc3JjL2FwL2FwX2NvbmZpZy5jCisrKyBiL3NyYy9hcC9hcF9jb25maWcuYwpAQCAtODksNiArODksOCBAQAogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAKIAlic3MtPnJhZGl1c19kYXNfdGltZV93aW5kb3cgPSAzMDA7CisKKwlic3MtPnNhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZCA9IDU7CiB9CiAKIApAQCAtMTU4LDYgKzE2MCw5IEBACiAKIAljb25mLT5odF9jYXBhYiA9IEhUX0NBUF9JTkZPX1NNUFNfRElTQUJMRUQ7CiAKKwljb25mLT5hcF90YWJsZV9tYXhfc2l6ZSA9IDI1NTsKKwljb25mLT5hcF90YWJsZV9leHBpcmF0aW9uX3RpbWUgPSA2MDsKKwogCXJldHVybiBjb25mOwogfQogCkBAIC00MDgsNiArNDEzLDcgQEAKIAkJdXNlciA9IHVzZXItPm5leHQ7CiAJCWhvc3RhcGRfY29uZmlnX2ZyZWVfZWFwX3VzZXIocHJldl91c2VyKTsKIAl9CisJb3NfZnJlZShjb25mLT5lYXBfdXNlcl9zcWxpdGUpOwogCiAJb3NfZnJlZShjb25mLT5kdW1wX2xvZ19uYW1lKTsKIAlvc19mcmVlKGNvbmYtPmVhcF9yZXFfaWRfdGV4dCk7CkBAIC01MTUsNiArNTIxLDggQEAKICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCiAJd3BhYnVmX2ZyZWUoY29uZi0+dmVuZG9yX2VsZW1lbnRzKTsKKworCW9zX2ZyZWUoY29uZi0+c2FlX2dyb3Vwcyk7CiB9CiAKIApAQCAtNjE5LDU3ICs2MjcsMyBAQAogCiAJcmV0dXJuIE5VTEw7CiB9Ci0KLQotY29uc3Qgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKgotaG9zdGFwZF9nZXRfZWFwX3VzZXIoY29uc3Qgc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqY29uZiwgY29uc3QgdTggKmlkZW50aXR5LAotCQkgICAgIHNpemVfdCBpZGVudGl0eV9sZW4sIGludCBwaGFzZTIpCi17Ci0Jc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKnVzZXIgPSBjb25mLT5lYXBfdXNlcjsKLQotI2lmZGVmIENPTkZJR19XUFMKLQlpZiAoY29uZi0+d3BzX3N0YXRlICYmIGlkZW50aXR5X2xlbiA9PSBXU0NfSURfRU5ST0xMRUVfTEVOICYmCi0JICAgIG9zX21lbWNtcChpZGVudGl0eSwgV1NDX0lEX0VOUk9MTEVFLCBXU0NfSURfRU5ST0xMRUVfTEVOKSA9PSAwKSB7Ci0JCXN0YXRpYyBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciB3c2NfZW5yb2xsZWU7Ci0JCW9zX21lbXNldCgmd3NjX2Vucm9sbGVlLCAwLCBzaXplb2Yod3NjX2Vucm9sbGVlKSk7Ci0JCXdzY19lbnJvbGxlZS5tZXRob2RzWzBdLm1ldGhvZCA9IGVhcF9zZXJ2ZXJfZ2V0X3R5cGUoCi0JCQkiV1NDIiwgJndzY19lbnJvbGxlZS5tZXRob2RzWzBdLnZlbmRvcik7Ci0JCXJldHVybiAmd3NjX2Vucm9sbGVlOwotCX0KLQotCWlmIChjb25mLT53cHNfc3RhdGUgJiYgaWRlbnRpdHlfbGVuID09IFdTQ19JRF9SRUdJU1RSQVJfTEVOICYmCi0JICAgIG9zX21lbWNtcChpZGVudGl0eSwgV1NDX0lEX1JFR0lTVFJBUiwgV1NDX0lEX1JFR0lTVFJBUl9MRU4pID09IDApIHsKLQkJc3RhdGljIHN0cnVjdCBob3N0YXBkX2VhcF91c2VyIHdzY19yZWdpc3RyYXI7Ci0JCW9zX21lbXNldCgmd3NjX3JlZ2lzdHJhciwgMCwgc2l6ZW9mKHdzY19yZWdpc3RyYXIpKTsKLQkJd3NjX3JlZ2lzdHJhci5tZXRob2RzWzBdLm1ldGhvZCA9IGVhcF9zZXJ2ZXJfZ2V0X3R5cGUoCi0JCQkiV1NDIiwgJndzY19yZWdpc3RyYXIubWV0aG9kc1swXS52ZW5kb3IpOwotCQl3c2NfcmVnaXN0cmFyLnBhc3N3b3JkID0gKHU4ICopIGNvbmYtPmFwX3BpbjsKLQkJd3NjX3JlZ2lzdHJhci5wYXNzd29yZF9sZW4gPSBjb25mLT5hcF9waW4gPwotCQkJb3Nfc3RybGVuKGNvbmYtPmFwX3BpbikgOiAwOwotCQlyZXR1cm4gJndzY19yZWdpc3RyYXI7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KLQotCXdoaWxlICh1c2VyKSB7Ci0JCWlmICghcGhhc2UyICYmIHVzZXItPmlkZW50aXR5ID09IE5VTEwpIHsKLQkJCS8qIFdpbGRjYXJkIG1hdGNoICovCi0JCQlicmVhazsKLQkJfQotCi0JCWlmICh1c2VyLT5waGFzZTIgPT0gISFwaGFzZTIgJiYgdXNlci0+d2lsZGNhcmRfcHJlZml4ICYmCi0JCSAgICBpZGVudGl0eV9sZW4gPj0gdXNlci0+aWRlbnRpdHlfbGVuICYmCi0JCSAgICBvc19tZW1jbXAodXNlci0+aWRlbnRpdHksIGlkZW50aXR5LCB1c2VyLT5pZGVudGl0eV9sZW4pID09Ci0JCSAgICAwKSB7Ci0JCQkvKiBXaWxkY2FyZCBwcmVmaXggbWF0Y2ggKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHVzZXItPnBoYXNlMiA9PSAhIXBoYXNlMiAmJgotCQkgICAgdXNlci0+aWRlbnRpdHlfbGVuID09IGlkZW50aXR5X2xlbiAmJgotCQkgICAgb3NfbWVtY21wKHVzZXItPmlkZW50aXR5LCBpZGVudGl0eSwgaWRlbnRpdHlfbGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCXVzZXIgPSB1c2VyLT5uZXh0OwotCX0KLQotCXJldHVybiB1c2VyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL2FwX2NvbmZpZy5oIGIvc3JjL2FwL2FwX2NvbmZpZy5oCmluZGV4IGY1ZTRhNmEuLjQ3NDIxMDcgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hcF9jb25maWcuaAorKysgYi9zcmMvYXAvYXBfY29uZmlnLmgKQEAgLTUxLDcgKzUxLDggQEAKIHN0cnVjdCBob3N0YXBkX3NzaWQgewogCXU4IHNzaWRbSE9TVEFQRF9NQVhfU1NJRF9MRU5dOwogCXNpemVfdCBzc2lkX2xlbjsKLQlpbnQgc3NpZF9zZXQ7CisJdW5zaWduZWQgaW50IHNzaWRfc2V0OjE7CisJdW5zaWduZWQgaW50IHV0Zjhfc3NpZDoxOwogCiAJY2hhciB2bGFuW0lGTkFNU0laICsgMV07CiAJc2VjcG9saWN5IHNlY3VyaXR5X3BvbGljeTsKQEAgLTk2LDYgKzk3LDExIEBACiB9OwogCiAjZGVmaW5lIFBNS19MRU4gMzIKK3N0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0IHsKKwlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqbmV4dDsKKwl1OCBwc2tbUE1LX0xFTl07Cit9OworCiBzdHJ1Y3QgaG9zdGFwZF93cGFfcHNrIHsKIAlzdHJ1Y3QgaG9zdGFwZF93cGFfcHNrICpuZXh0OwogCWludCBncm91cDsKQEAgLTE5Miw2ICsxOTgsNyBAQAogCWludCBlYXBfc2VydmVyOyAvKiBVc2UgaW50ZXJuYWwgRUFQIHNlcnZlciBpbnN0ZWFkIG9mIGV4dGVybmFsCiAJCQkgKiBSQURJVVMgc2VydmVyICovCiAJc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKmVhcF91c2VyOworCWNoYXIgKmVhcF91c2VyX3NxbGl0ZTsKIAljaGFyICplYXBfc2ltX2RiOwogCXN0cnVjdCBob3N0YXBkX2lwX2FkZHIgb3duX2lwX2FkZHI7CiAJY2hhciAqbmFzX2lkZW50aWZpZXI7CkBAIC0zODQsNiArMzkxLDggQEAKIAkvKiBJRUVFIDgwMi4xMXYgKi8KIAlpbnQgdGltZV9hZHZlcnRpc2VtZW50OwogCWNoYXIgKnRpbWVfem9uZTsKKwlpbnQgd25tX3NsZWVwX21vZGU7CisJaW50IGJzc190cmFuc2l0aW9uOwogCiAJLyogSUVFRSA4MDIuMTF1IC0gSW50ZXJ3b3JraW5nICovCiAJaW50IGludGVyd29ya2luZzsKQEAgLTQ0Niw2ICs0NTUsOSBAQAogI2VuZGlmIC8qIENPTkZJR19SQURJVVNfVEVTVCAqLwogCiAJc3RydWN0IHdwYWJ1ZiAqdmVuZG9yX2VsZW1lbnRzOworCisJdW5zaWduZWQgaW50IHNhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZDsKKwlpbnQgKnNhZV9ncm91cHM7CiB9OwogCiAKQEAgLTUwNSw2ICs1MTcsNyBAQAogCWludCByZXF1aXJlX3ZodDsKIAl1OCB2aHRfb3Blcl9jaHdpZHRoOwogCXU4IHZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHg7CisJdTggdmh0X29wZXJfY2VudHJfZnJlcV9zZWcxX2lkeDsKIH07CiAKIApAQCAtNTIzLDkgKzUzNiw2IEBACiBpbnQgaG9zdGFwZF9zZXR1cF93cGFfcHNrKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmNvbmYpOwogY29uc3QgY2hhciAqIGhvc3RhcGRfZ2V0X3ZsYW5faWRfaWZuYW1lKHN0cnVjdCBob3N0YXBkX3ZsYW4gKnZsYW4sCiAJCQkJCWludCB2bGFuX2lkKTsKLWNvbnN0IHN0cnVjdCBob3N0YXBkX2VhcF91c2VyICoKLWhvc3RhcGRfZ2V0X2VhcF91c2VyKGNvbnN0IHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmNvbmYsIGNvbnN0IHU4ICppZGVudGl0eSwKLQkJICAgICBzaXplX3QgaWRlbnRpdHlfbGVuLCBpbnQgcGhhc2UyKTsKIHN0cnVjdCBob3N0YXBkX3JhZGl1c19hdHRyICoKIGhvc3RhcGRfY29uZmlnX2dldF9yYWRpdXNfYXR0cihzdHJ1Y3QgaG9zdGFwZF9yYWRpdXNfYXR0ciAqYXR0ciwgdTggdHlwZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9hcC9hcF9kcnZfb3BzLmMgYi9zcmMvYXAvYXBfZHJ2X29wcy5jCmluZGV4IDAyZGEyNWIuLmI3MWQ1MWQgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hcF9kcnZfb3BzLmMKKysrIGIvc3JjL2FwL2FwX2Rydl9vcHMuYwpAQCAtMzM4LDYgKzMzOCw3IEBACiAJCSAgICBjb25zdCB1OCAqc3VwcF9yYXRlcywgc2l6ZV90IHN1cHBfcmF0ZXNfbGVuLAogCQkgICAgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKIAkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzICpodF9jYXBhYiwKKwkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqdmh0X2NhcGFiLAogCQkgICAgdTMyIGZsYWdzLCB1OCBxb3NpbmZvKQogewogCXN0cnVjdCBob3N0YXBkX3N0YV9hZGRfcGFyYW1zIHBhcmFtczsKQEAgLTM1NSw2ICszNTYsNyBAQAogCXBhcmFtcy5zdXBwX3JhdGVzX2xlbiA9IHN1cHBfcmF0ZXNfbGVuOwogCXBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPSBsaXN0ZW5faW50ZXJ2YWw7CiAJcGFyYW1zLmh0X2NhcGFiaWxpdGllcyA9IGh0X2NhcGFiOworCXBhcmFtcy52aHRfY2FwYWJpbGl0aWVzID0gdmh0X2NhcGFiOwogCXBhcmFtcy5mbGFncyA9IGhvc3RhcGRfc3RhX2ZsYWdzX3RvX2RydihmbGFncyk7CiAJcGFyYW1zLnFvc2luZm8gPSBxb3NpbmZvOwogCXJldHVybiBoYXBkLT5kcml2ZXItPnN0YV9hZGQoaGFwZC0+ZHJ2X3ByaXYsICZwYXJhbXMpOwpAQCAtNDU0LDE5ICs0NTYsNzYgQEAKIAogCiBpbnQgaG9zdGFwZF9zZXRfZnJlcShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgbW9kZSwgaW50IGZyZXEsCi0JCSAgICAgaW50IGNoYW5uZWwsIGludCBodF9lbmFibGVkLCBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0KQorCQkgICAgIGludCBjaGFubmVsLCBpbnQgaHRfZW5hYmxlZCwgaW50IHZodF9lbmFibGVkLAorCQkgICAgIGludCBzZWNfY2hhbm5lbF9vZmZzZXQsIGludCB2aHRfb3Blcl9jaHdpZHRoLAorCQkgICAgIGludCBjZW50ZXJfc2VnbWVudDAsIGludCBjZW50ZXJfc2VnbWVudDEpCiB7CiAJc3RydWN0IGhvc3RhcGRfZnJlcV9wYXJhbXMgZGF0YTsKLQlpZiAoaGFwZC0+ZHJpdmVyID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChoYXBkLT5kcml2ZXItPnNldF9mcmVxID09IE5VTEwpCi0JCXJldHVybiAwOworCWludCB0bXA7CisKIAlvc19tZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CiAJZGF0YS5tb2RlID0gbW9kZTsKIAlkYXRhLmZyZXEgPSBmcmVxOwogCWRhdGEuY2hhbm5lbCA9IGNoYW5uZWw7CiAJZGF0YS5odF9lbmFibGVkID0gaHRfZW5hYmxlZDsKKwlkYXRhLnZodF9lbmFibGVkID0gdmh0X2VuYWJsZWQ7CiAJZGF0YS5zZWNfY2hhbm5lbF9vZmZzZXQgPSBzZWNfY2hhbm5lbF9vZmZzZXQ7CisJZGF0YS5jZW50ZXJfZnJlcTEgPSBmcmVxICsgc2VjX2NoYW5uZWxfb2Zmc2V0ICogMTA7CisJZGF0YS5jZW50ZXJfZnJlcTIgPSAwOworCWRhdGEuYmFuZHdpZHRoID0gc2VjX2NoYW5uZWxfb2Zmc2V0ID8gNDAgOiAyMDsKKworCS8qCisJICogVGhpcyB2YWxpZGF0aW9uIGNvZGUgaXMgcHJvYmFibHkgbWlzcGxhY2VkLCBtYXliZSBpdCBzaG91bGQgYmUKKwkgKiBpbiBzcmMvYXAvaHdfZmVhdHVyZXMuYyBhbmQgY2hlY2sgdGhlIGhhcmR3YXJlIHN1cHBvcnQgYXMgd2VsbC4KKwkgKi8KKwlpZiAoZGF0YS52aHRfZW5hYmxlZCkgc3dpdGNoICh2aHRfb3Blcl9jaHdpZHRoKSB7CisJY2FzZSBWSFRfQ0hBTldJRFRIX1VTRV9IVDoKKwkJaWYgKGNlbnRlcl9zZWdtZW50MSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKDUwMDAgKyBjZW50ZXJfc2VnbWVudDAgKiA1ICE9IGRhdGEuY2VudGVyX2ZyZXExKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKwljYXNlIFZIVF9DSEFOV0lEVEhfODBQODBNSFo6CisJCWlmIChjZW50ZXJfc2VnbWVudDEgPT0gY2VudGVyX3NlZ21lbnQwICsgNCB8fAorCQkgICAgY2VudGVyX3NlZ21lbnQxID09IGNlbnRlcl9zZWdtZW50MCAtIDQpCisJCQlyZXR1cm4gLTE7CisJCWRhdGEuY2VudGVyX2ZyZXEyID0gNTAwMCArIGNlbnRlcl9zZWdtZW50MSAqIDU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVkhUX0NIQU5XSURUSF84ME1IWjoKKwkJZGF0YS5iYW5kd2lkdGggPSA4MDsKKwkJaWYgKHZodF9vcGVyX2Nod2lkdGggPT0gMSAmJiBjZW50ZXJfc2VnbWVudDEpCisJCQlyZXR1cm4gLTE7CisJCWlmICh2aHRfb3Blcl9jaHdpZHRoID09IDMgJiYgIWNlbnRlcl9zZWdtZW50MSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCFzZWNfY2hhbm5lbF9vZmZzZXQpCisJCQlyZXR1cm4gLTE7CisJCS8qIHByaW1hcnkgNDAgcGFydCBtdXN0IG1hdGNoIHRoZSBIVCBjb25maWd1cmF0aW9uICovCisJCXRtcCA9ICgzMCArIGZyZXEgLSA1MDAwIC0gY2VudGVyX3NlZ21lbnQwICogNSkvMjA7CisJCXRtcCAvPSAyOworCQlpZiAoZGF0YS5jZW50ZXJfZnJlcTEgIT0gNTAwMCArCisJCQkJCSBjZW50ZXJfc2VnbWVudDAgKiA1IC0gMjAgKyA0MCAqIHRtcCkKKwkJCXJldHVybiAtMTsKKwkJZGF0YS5jZW50ZXJfZnJlcTEgPSA1MDAwICsgY2VudGVyX3NlZ21lbnQwICogNTsKKwkJYnJlYWs7CisJY2FzZSBWSFRfQ0hBTldJRFRIXzE2ME1IWjoKKwkJZGF0YS5iYW5kd2lkdGggPSAxNjA7CisJCWlmIChjZW50ZXJfc2VnbWVudDEpCisJCQlyZXR1cm4gLTE7CisJCWlmICghc2VjX2NoYW5uZWxfb2Zmc2V0KQorCQkJcmV0dXJuIC0xOworCQkvKiBwcmltYXJ5IDQwIHBhcnQgbXVzdCBtYXRjaCB0aGUgSFQgY29uZmlndXJhdGlvbiAqLworCQl0bXAgPSAoNzAgKyBmcmVxIC0gNTAwMCAtIGNlbnRlcl9zZWdtZW50MCAqIDUpLzIwOworCQl0bXAgLz0gMjsKKwkJaWYgKGRhdGEuY2VudGVyX2ZyZXExICE9IDUwMDAgKworCQkJCQkgY2VudGVyX3NlZ21lbnQwICogNSAtIDYwICsgNDAgKiB0bXApCisJCQlyZXR1cm4gLTE7CisJCWRhdGEuY2VudGVyX2ZyZXExID0gNTAwMCArIGNlbnRlcl9zZWdtZW50MCAqIDU7CisJCWJyZWFrOworCX0KKwlpZiAoaGFwZC0+ZHJpdmVyID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChoYXBkLT5kcml2ZXItPnNldF9mcmVxID09IE5VTEwpCisJCXJldHVybiAwOwogCXJldHVybiBoYXBkLT5kcml2ZXItPnNldF9mcmVxKGhhcGQtPmRydl9wcml2LCAmZGF0YSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9hcC9hcF9kcnZfb3BzLmggYi9zcmMvYXAvYXBfZHJ2X29wcy5oCmluZGV4IDljNTNiOTkuLmNlYjdlNjggMTAwNjQ0Ci0tLSBhL3NyYy9hcC9hcF9kcnZfb3BzLmgKKysrIGIvc3JjL2FwL2FwX2Rydl9vcHMuaApAQCAtMTMsNiArMTMsNyBAQAogc3RydWN0IHdwYV9ic3NfcGFyYW1zOwogc3RydWN0IHdwYV9kcml2ZXJfc2Nhbl9wYXJhbXM7CiBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllczsKK3N0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllczsKIAogdTMyIGhvc3RhcGRfc3RhX2ZsYWdzX3RvX2Rydih1MzIgZmxhZ3MpOwogaW50IGhvc3RhcGRfYnVpbGRfYXBfZXh0cmFfaWVzKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCkBAIC0zNyw2ICszOCw3IEBACiAJCSAgICBjb25zdCB1OCAqc3VwcF9yYXRlcywgc2l6ZV90IHN1cHBfcmF0ZXNfbGVuLAogCQkgICAgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKIAkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzICpodF9jYXBhYiwKKwkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyAqdmh0X2NhcGFiLAogCQkgICAgdTMyIGZsYWdzLCB1OCBxb3NpbmZvKTsKIGludCBob3N0YXBkX3NldF9wcml2YWN5KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBlbmFibGVkKTsKIGludCBob3N0YXBkX3NldF9nZW5lcmljX2VsZW0oc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmVsZW0sCkBAIC01NSw3ICs1Nyw5IEBACiAJCSAgICAgICBjb25zdCB1OCAqYWRkciwgaW50IGlkeCwgdTggKnNlcSk7CiBpbnQgaG9zdGFwZF9mbHVzaChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKTsKIGludCBob3N0YXBkX3NldF9mcmVxKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBtb2RlLCBpbnQgZnJlcSwKLQkJICAgICBpbnQgY2hhbm5lbCwgaW50IGh0X2VuYWJsZWQsIGludCBzZWNfY2hhbm5lbF9vZmZzZXQpOworCQkgICAgIGludCBjaGFubmVsLCBpbnQgaHRfZW5hYmxlZCwgaW50IHZodF9lbmFibGVkLAorCQkgICAgIGludCBzZWNfY2hhbm5lbF9vZmZzZXQsIGludCB2aHRfb3Blcl9jaHdpZHRoLAorCQkgICAgIGludCBjZW50ZXJfc2VnbWVudDAsIGludCBjZW50ZXJfc2VnbWVudDEpOwogaW50IGhvc3RhcGRfc2V0X3J0cyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBpbnQgcnRzKTsKIGludCBob3N0YXBkX3NldF9mcmFnKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBmcmFnKTsKIGludCBob3N0YXBkX3N0YV9zZXRfZmxhZ3Moc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgdTggKmFkZHIsCmRpZmYgLS1naXQgYS9zcmMvYXAvYXV0aHNydi5jIGIvc3JjL2FwL2F1dGhzcnYuYwppbmRleCA1YzAzZjQ1Li5kNjZkOTdlIDEwMDY0NAotLS0gYS9zcmMvYXAvYXV0aHNydi5jCisrKyBiL3NyYy9hcC9hdXRoc3J2LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAlvc19tZW1zZXQoJnNydiwgMCwgc2l6ZW9mKHNydikpOwogCXNydi5jbGllbnRfZmlsZSA9IGNvbmYtPnJhZGl1c19zZXJ2ZXJfY2xpZW50czsKIAlzcnYuYXV0aF9wb3J0ID0gY29uZi0+cmFkaXVzX3NlcnZlcl9hdXRoX3BvcnQ7Ci0Jc3J2LmNvbmZfY3R4ID0gY29uZjsKKwlzcnYuY29uZl9jdHggPSBoYXBkOwogCXNydi5lYXBfc2ltX2RiX3ByaXYgPSBoYXBkLT5lYXBfc2ltX2RiX3ByaXY7CiAJc3J2LnNzbF9jdHggPSBoYXBkLT5zc2xfY3R4OwogCXNydi5tc2dfY3R4ID0gaGFwZC0+bXNnX2N0eDsKZGlmZiAtLWdpdCBhL3NyYy9hcC9iZWFjb24uYyBiL3NyYy9hcC9iZWFjb24uYwppbmRleCBmNzYxYmY1Li40YzQ3Yzc1IDEwMDY0NAotLS0gYS9zcmMvYXAvYmVhY29uLmMKKysrIGIvc3JjL2FwL2JlYWNvbi5jCkBAIC0yLDcgKzIsNyBAQAogICogaG9zdGFwZCAvIElFRUUgODAyLjExIE1hbmFnZW1lbnQ6IEJlYWNvbiBhbmQgUHJvYmUgUmVxdWVzdC9SZXNwb25zZQogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEluc3RhbnQ4MDIgTmV0d29ya3MsIEluYy4KICAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTMxMCw2ICszMTAsNDYgQEAKIH0KIAogCitlbnVtIHNzaWRfbWF0Y2hfcmVzdWx0IHsKKwlOT19TU0lEX01BVENILAorCUVYQUNUX1NTSURfTUFUQ0gsCisJV0lMRENBUkRfU1NJRF9NQVRDSAorfTsKKworc3RhdGljIGVudW0gc3NpZF9tYXRjaF9yZXN1bHQgc3NpZF9tYXRjaChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCQkgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKKwkJCQkJIGNvbnN0IHU4ICpzc2lkX2xpc3QsCisJCQkJCSBzaXplX3Qgc3NpZF9saXN0X2xlbikKK3sKKwljb25zdCB1OCAqcG9zLCAqZW5kOworCWludCB3aWxkY2FyZCA9IDA7CisKKwlpZiAoc3NpZF9sZW4gPT0gMCkKKwkJd2lsZGNhcmQgPSAxOworCWlmIChzc2lkX2xlbiA9PSBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuICYmCisJICAgIG9zX21lbWNtcChzc2lkLCBoYXBkLT5jb25mLT5zc2lkLnNzaWQsIHNzaWRfbGVuKSA9PSAwKQorCQlyZXR1cm4gRVhBQ1RfU1NJRF9NQVRDSDsKKworCWlmIChzc2lkX2xpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIHdpbGRjYXJkID8gV0lMRENBUkRfU1NJRF9NQVRDSCA6IE5PX1NTSURfTUFUQ0g7CisKKwlwb3MgPSBzc2lkX2xpc3Q7CisJZW5kID0gc3NpZF9saXN0ICsgc3NpZF9saXN0X2xlbjsKKwl3aGlsZSAocG9zICsgMSA8PSBlbmQpIHsKKwkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBlbmQpCisJCQlicmVhazsKKwkJaWYgKHBvc1sxXSA9PSAwKQorCQkJd2lsZGNhcmQgPSAxOworCQlpZiAocG9zWzFdID09IGhhcGQtPmNvbmYtPnNzaWQuc3NpZF9sZW4gJiYKKwkJICAgIG9zX21lbWNtcChwb3MgKyAyLCBoYXBkLT5jb25mLT5zc2lkLnNzaWQsIHBvc1sxXSkgPT0gMCkKKwkJCXJldHVybiBFWEFDVF9TU0lEX01BVENIOworCQlwb3MgKz0gMiArIHBvc1sxXTsKKwl9CisKKwlyZXR1cm4gd2lsZGNhcmQgPyBXSUxEQ0FSRF9TU0lEX01BVENIIDogTk9fU1NJRF9NQVRDSDsKK30KKworCiB2b2lkIGhhbmRsZV9wcm9iZV9yZXEoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCBzaXplX3QgbGVuLAogCQkgICAgICBpbnQgc3NpX3NpZ25hbCkKQEAgLTMyMSw2ICszNjEsNyBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKIAlzaXplX3QgaSwgcmVzcF9sZW47CiAJaW50IG5vYWNrOworCWVudW0gc3NpZF9tYXRjaF9yZXN1bHQgcmVzOwogCiAJaWUgPSBtZ210LT51LnByb2JlX3JlcS52YXJpYWJsZTsKIAlpZiAobGVuIDwgSUVFRTgwMjExX0hEUkxFTiArIHNpemVvZihtZ210LT51LnByb2JlX3JlcSkpCkBAIC0zNzYsNyArNDE3LDggQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwogCi0JaWYgKGhhcGQtPmNvbmYtPmlnbm9yZV9icm9hZGNhc3Rfc3NpZCAmJiBlbGVtcy5zc2lkX2xlbiA9PSAwKSB7CisJaWYgKGhhcGQtPmNvbmYtPmlnbm9yZV9icm9hZGNhc3Rfc3NpZCAmJiBlbGVtcy5zc2lkX2xlbiA9PSAwICYmCisJICAgIGVsZW1zLnNzaWRfbGlzdF9sZW4gPT0gMCkgewogCQl3cGFfcHJpbnRmKE1TR19NU0dEVU1QLCAiUHJvYmUgUmVxdWVzdCBmcm9tICIgTUFDU1RSICIgZm9yICIKIAkJCSAgICJicm9hZGNhc3QgU1NJRCBpZ25vcmVkIiwgTUFDMlNUUihtZ210LT5zYSkpOwogCQlyZXR1cm47CkBAIC0zOTQsMTAgKzQzNiw5IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAotCWlmIChlbGVtcy5zc2lkX2xlbiA9PSAwIHx8Ci0JICAgIChlbGVtcy5zc2lkX2xlbiA9PSBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuICYmCi0JICAgICBvc19tZW1jbXAoZWxlbXMuc3NpZCwgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLCBlbGVtcy5zc2lkX2xlbikgPT0KLQkgICAgIDApKSB7CisJcmVzID0gc3NpZF9tYXRjaChoYXBkLCBlbGVtcy5zc2lkLCBlbGVtcy5zc2lkX2xlbiwKKwkJCSBlbGVtcy5zc2lkX2xpc3QsIGVsZW1zLnNzaWRfbGlzdF9sZW4pOworCWlmIChyZXMgIT0gTk9fU1NJRF9NQVRDSCkgewogCQlpZiAoc3RhKQogCQkJc3RhLT5zc2lkX3Byb2JlID0gJmhhcGQtPmNvbmYtPnNzaWQ7CiAJfSBlbHNlIHsKQEAgLTQwNiw5ICs0NDcsMTAgQEAKIAkJCWllZWU4MDJfMTFfcHJpbnRfc3NpZChzc2lkX3R4dCwgZWxlbXMuc3NpZCwKIAkJCQkJICAgICAgZWxlbXMuc3NpZF9sZW4pOwogCQkJd3BhX3ByaW50ZihNU0dfTVNHRFVNUCwgIlByb2JlIFJlcXVlc3QgZnJvbSAiIE1BQ1NUUgotCQkJCSAgICIgZm9yIGZvcmVpZ24gU1NJRCAnJXMnIChEQSAiIE1BQ1NUUiAiKSIsCisJCQkJICAgIiBmb3IgZm9yZWlnbiBTU0lEICclcycgKERBICIgTUFDU1RSICIpJXMiLAogCQkJCSAgIE1BQzJTVFIobWdtdC0+c2EpLCBzc2lkX3R4dCwKLQkJCQkgICBNQUMyU1RSKG1nbXQtPmRhKSk7CisJCQkJICAgTUFDMlNUUihtZ210LT5kYSksCisJCQkJICAgZWxlbXMuc3NpZF9saXN0ID8gIiAoU1NJRCBsaXN0KSIgOiAiIik7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTQ1NSw3ICs0OTcsOCBAQAogCSAqIElmIHRoaXMgaXMgYSBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCwgYXBwbHkgbm8gYWNrIHBvbGljeSB0byBhdm9pZAogCSAqIGV4Y2Vzc2l2ZSByZXRyaWVzLgogCSAqLwotCW5vYWNrID0gISEoZWxlbXMuc3NpZF9sZW4gPT0gMCAmJiBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtZ210LT5kYSkpOworCW5vYWNrID0gISEocmVzID09IFdJTERDQVJEX1NTSURfTUFUQ0ggJiYKKwkJICAgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWdtdC0+ZGEpKTsKIAogCWlmIChob3N0YXBkX2Rydl9zZW5kX21sbWUoaGFwZCwgcmVzcCwgcmVzcF9sZW4sIG5vYWNrKSA8IDApCiAJCXBlcnJvcigiaGFuZGxlX3Byb2JlX3JlcTogc2VuZCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL2N0cmxfaWZhY2VfYXAuYyBiL3NyYy9hcC9jdHJsX2lmYWNlX2FwLmMKaW5kZXggYWI5YzgzZS4uMWNiN2U3MyAxMDA2NDQKLS0tIGEvc3JjL2FwL2N0cmxfaWZhY2VfYXAuYworKysgYi9zcmMvYXAvY3RybF9pZmFjZV9hcC5jCkBAIC0yMSw2ICsyMSwyOCBAQAogI2luY2x1ZGUgImFwX2Rydl9vcHMuaCIKIAogCitzdGF0aWMgaW50IGhvc3RhcGRfZ2V0X3N0YV9jb25uX3RpbWUoc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJICAgICBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IG9zX3RpbWUgbm93LCBhZ2U7CisJaW50IGxlbiA9IDAsIHJldDsKKworCWlmICghc3RhLT5jb25uZWN0ZWRfdGltZS5zZWMpCisJCXJldHVybiAwOworCisJb3NfZ2V0X3RpbWUoJm5vdyk7CisJb3NfdGltZV9zdWIoJm5vdywgJnN0YS0+Y29ubmVjdGVkX3RpbWUsICZhZ2UpOworCisJcmV0ID0gb3Nfc25wcmludGYoYnVmICsgbGVuLCBidWZsZW4gLSBsZW4sICJjb25uZWN0ZWRfdGltZT0ldVxuIiwKKwkJCSAgKHVuc2lnbmVkIGludCkgYWdlLnNlYyk7CisJaWYgKHJldCA8IDAgfHwgKHNpemVfdCkgcmV0ID49IGJ1ZmxlbiAtIGxlbikKKwkJcmV0dXJuIGxlbjsKKwlsZW4gKz0gcmV0OworCisJcmV0dXJuIGxlbjsKK30KKworCiBzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9zdGFfbWliKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkJICAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQpAQCAtNTgsNiArODAsMTAgQEAKIAlpZiAocmVzID49IDApCiAJCWxlbiArPSByZXM7CiAKKwlyZXMgPSBob3N0YXBkX2dldF9zdGFfY29ubl90aW1lKHN0YSwgYnVmICsgbGVuLCBidWZsZW4gLSBsZW4pOworCWlmIChyZXMgPj0gMCkKKwkJbGVuICs9IHJlczsKKwogCXJldHVybiBsZW47CiB9CiAKQEAgLTE2Myw2ICsxODksNyBAQAogCXU4IGFkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCWNvbnN0IGNoYXIgKnBvczsKKwl1MTYgcmVhc29uID0gV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRDsKIAogCXdwYV9kYmcoaGFwZC0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBERUFVVEhFTlRJQ0FURSAlcyIsCiAJCXR4dGFkZHIpOwpAQCAtMjAyLDExICsyMjksMTQgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1AyUF9NQU5BR0VSICovCiAKLQlob3N0YXBkX2Rydl9zdGFfZGVhdXRoKGhhcGQsIGFkZHIsIFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQpOworCXBvcyA9IG9zX3N0cnN0cih0eHRhZGRyLCAiIHJlYXNvbj0iKTsKKwlpZiAocG9zKQorCQlyZWFzb24gPSBhdG9pKHBvcyArIDgpOworCisJaG9zdGFwZF9kcnZfc3RhX2RlYXV0aChoYXBkLCBhZGRyLCByZWFzb24pOwogCXN0YSA9IGFwX2dldF9zdGEoaGFwZCwgYWRkcik7CiAJaWYgKHN0YSkKLQkJYXBfc3RhX2RlYXV0aGVudGljYXRlKGhhcGQsIHN0YSwKLQkJCQkgICAgICBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEKTsKKwkJYXBfc3RhX2RlYXV0aGVudGljYXRlKGhhcGQsIHN0YSwgcmVhc29uKTsKIAllbHNlIGlmIChhZGRyWzBdID09IDB4ZmYpCiAJCWhvc3RhcGRfZnJlZV9zdGFzKGhhcGQpOwogCkBAIC0yMjAsNiArMjUwLDcgQEAKIAl1OCBhZGRyW0VUSF9BTEVOXTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAljb25zdCBjaGFyICpwb3M7CisJdTE2IHJlYXNvbiA9IFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQ7CiAKIAl3cGFfZGJnKGhhcGQtPm1zZ19jdHgsIE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgRElTQVNTT0NJQVRFICVzIiwKIAkJdHh0YWRkcik7CkBAIC0yNTksMTEgKzI5MCwxNCBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfUDJQX01BTkFHRVIgKi8KIAotCWhvc3RhcGRfZHJ2X3N0YV9kaXNhc3NvYyhoYXBkLCBhZGRyLCBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEKTsKKwlwb3MgPSBvc19zdHJzdHIodHh0YWRkciwgIiByZWFzb249Iik7CisJaWYgKHBvcykKKwkJcmVhc29uID0gYXRvaShwb3MgKyA4KTsKKworCWhvc3RhcGRfZHJ2X3N0YV9kaXNhc3NvYyhoYXBkLCBhZGRyLCByZWFzb24pOwogCXN0YSA9IGFwX2dldF9zdGEoaGFwZCwgYWRkcik7CiAJaWYgKHN0YSkKLQkJYXBfc3RhX2Rpc2Fzc29jaWF0ZShoYXBkLCBzdGEsCi0JCQkJICAgIFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQpOworCQlhcF9zdGFfZGlzYXNzb2NpYXRlKGhhcGQsIHN0YSwgcmVhc29uKTsKIAllbHNlIGlmIChhZGRyWzBdID09IDB4ZmYpCiAJCWhvc3RhcGRfZnJlZV9zdGFzKGhhcGQpOwogCmRpZmYgLS1naXQgYS9zcmMvYXAvZHJ2X2NhbGxiYWNrcy5jIGIvc3JjL2FwL2Rydl9jYWxsYmFja3MuYwppbmRleCAyM2ZhMjQxLi44OTgwYmVjIDEwMDY0NAotLS0gYS9zcmMvYXAvZHJ2X2NhbGxiYWNrcy5jCisrKyBiL3NyYy9hcC9kcnZfY2FsbGJhY2tzLmMKQEAgLTEwOSw2ICsxMDksMTUgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwogCisjaWZkZWYgQ09ORklHX0hTMjAKKwl3cGFidWZfZnJlZShzdGEtPmhzMjBfaWUpOworCWlmIChlbGVtcy5oczIwICYmIGVsZW1zLmhzMjBfbGVuID4gNCkgeworCQlzdGEtPmhzMjBfaWUgPSB3cGFidWZfYWxsb2NfY29weShlbGVtcy5oczIwICsgNCwKKwkJCQkJCSBlbGVtcy5oczIwX2xlbiAtIDQpOworCX0gZWxzZQorCQlzdGEtPmhzMjBfaWUgPSBOVUxMOworI2VuZGlmIC8qIENPTkZJR19IUzIwICovCisKIAlpZiAoaGFwZC0+Y29uZi0+d3BhKSB7CiAJCWlmIChpZSA9PSBOVUxMIHx8IGllbGVuID09IDApIHsKICNpZmRlZiBDT05GSUdfV1BTCkBAIC01MDMsMTMgKzUxMiwxMyBAQAogCQkJCQkgICBhY3Rpb24tPmRhdGEgKyAyKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorI2lmZGVmIENPTkZJR19XTk0KIAlpZiAoYWN0aW9uLT5jYXRlZ29yeSA9PSBXTEFOX0FDVElPTl9XTk0pIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICIlczogV05NX0FDVElPTiBsZW5ndGggJWQiLAogCQkJICAgX19mdW5jX18sIChpbnQpIGFjdGlvbi0+bGVuKTsKIAkJaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKGhhcGQsIGFjdGlvbik7CiAJfQotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogfQogCiAKQEAgLTY3MiwxMiArNjgxLDE1IEBACiAJCQkJICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbikKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9pZmFjZSAqaWZhY2UgPSBoYXBkLT5pZmFjZTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlzaXplX3QgajsKIAogCWZvciAoaiA9IDA7IGogPCBpZmFjZS0+bnVtX2JzczsgaisrKSB7Ci0JCWlmIChhcF9nZXRfc3RhKGlmYWNlLT5ic3Nbal0sIHNyYykpIHsKLQkJCWhhcGQgPSBpZmFjZS0+YnNzW2pdOwotCQkJYnJlYWs7CisJCWlmICgoc3RhID0gYXBfZ2V0X3N0YShpZmFjZS0+YnNzW2pdLCBzcmMpKSkgeworCQkJaWYgKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykgeworCQkJCWhhcGQgPSBpZmFjZS0+YnNzW2pdOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvYXAvZWFwX3VzZXJfZGIuYyBiL3NyYy9hcC9lYXBfdXNlcl9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDUwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXAvZWFwX3VzZXJfZGIuYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIGhvc3RhcGQgLyBFQVAgdXNlciBkYXRhYmFzZQorICogQ29weXJpZ2h0IChjKSAyMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaWZkZWYgQ09ORklHX1NRTElURQorI2luY2x1ZGUgPHNxbGl0ZTMuaD4KKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJlYXBfY29tbW9uL2VhcF93c2NfY29tbW9uLmgiCisjaW5jbHVkZSAiZWFwX3NlcnZlci9lYXBfbWV0aG9kcy5oIgorI2luY2x1ZGUgImVhcF9zZXJ2ZXIvZWFwLmgiCisjaW5jbHVkZSAiYXBfY29uZmlnLmgiCisjaW5jbHVkZSAiaG9zdGFwZC5oIgorCisjaWZkZWYgQ09ORklHX1NRTElURQorCitzdGF0aWMgdm9pZCBzZXRfdXNlcl9tZXRob2RzKHN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyLCBjb25zdCBjaGFyICptZXRob2RzKQoreworCWNoYXIgKmJ1ZiwgKnN0YXJ0OworCWludCBudW1fbWV0aG9kczsKKworCWJ1ZiA9IG9zX3N0cmR1cChtZXRob2RzKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCW9zX21lbXNldCgmdXNlci0+bWV0aG9kcywgMCwgc2l6ZW9mKHVzZXItPm1ldGhvZHMpKTsKKwludW1fbWV0aG9kcyA9IDA7CisJc3RhcnQgPSBidWY7CisJd2hpbGUgKCpzdGFydCkgeworCQljaGFyICpwb3MzID0gb3Nfc3RyY2hyKHN0YXJ0LCAnLCcpOworCQlpZiAocG9zMykKKwkJCSpwb3MzKysgPSAnXDAnOworCQl1c2VyLT5tZXRob2RzW251bV9tZXRob2RzXS5tZXRob2QgPQorCQkJZWFwX3NlcnZlcl9nZXRfdHlwZShzdGFydCwKKwkJCQkJICAgICZ1c2VyLT5tZXRob2RzW251bV9tZXRob2RzXS52ZW5kb3IpOworCQlpZiAodXNlci0+bWV0aG9kc1tudW1fbWV0aG9kc10udmVuZG9yID09IEVBUF9WRU5ET1JfSUVURiAmJgorCQkgICAgdXNlci0+bWV0aG9kc1tudW1fbWV0aG9kc10ubWV0aG9kID09IEVBUF9UWVBFX05PTkUpIHsKKwkJCWlmIChvc19zdHJjbXAoc3RhcnQsICJUVExTLVBBUCIpID09IDApIHsKKwkJCQl1c2VyLT50dGxzX2F1dGggfD0gRUFQX1RUTFNfQVVUSF9QQVA7CisJCQkJZ290byBza2lwX2VhcDsKKwkJCX0KKwkJCWlmIChvc19zdHJjbXAoc3RhcnQsICJUVExTLUNIQVAiKSA9PSAwKSB7CisJCQkJdXNlci0+dHRsc19hdXRoIHw9IEVBUF9UVExTX0FVVEhfQ0hBUDsKKwkJCQlnb3RvIHNraXBfZWFwOworCQkJfQorCQkJaWYgKG9zX3N0cmNtcChzdGFydCwgIlRUTFMtTVNDSEFQIikgPT0gMCkgeworCQkJCXVzZXItPnR0bHNfYXV0aCB8PSBFQVBfVFRMU19BVVRIX01TQ0hBUDsKKwkJCQlnb3RvIHNraXBfZWFwOworCQkJfQorCQkJaWYgKG9zX3N0cmNtcChzdGFydCwgIlRUTFMtTVNDSEFQVjIiKSA9PSAwKSB7CisJCQkJdXNlci0+dHRsc19hdXRoIHw9IEVBUF9UVExTX0FVVEhfTVNDSEFQVjI7CisJCQkJZ290byBza2lwX2VhcDsKKwkJCX0KKwkJCXdwYV9wcmludGYoTVNHX0lORk8sICJEQjogVW5zdXBwb3J0ZWQgRUFQIHR5cGUgJyVzJyIsCisJCQkJICAgc3RhcnQpOworCQkJb3NfZnJlZShidWYpOworCQkJcmV0dXJuOworCQl9CisKKwkJbnVtX21ldGhvZHMrKzsKKwkJaWYgKG51bV9tZXRob2RzID49IEVBUF9NQVhfTUVUSE9EUykKKwkJCWJyZWFrOworCXNraXBfZWFwOgorCQlpZiAocG9zMyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXN0YXJ0ID0gcG9zMzsKKwl9CisKKwlvc19mcmVlKGJ1Zik7Cit9CisKKworc3RhdGljIGludCBnZXRfdXNlcl9jYih2b2lkICpjdHgsIGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmNvbFtdKQoreworCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyID0gY3R4OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAob3Nfc3RyY21wKGNvbFtpXSwgInBhc3N3b3JkIikgPT0gMCAmJiBhcmd2W2ldKSB7CisJCQlvc19mcmVlKHVzZXItPnBhc3N3b3JkKTsKKwkJCXVzZXItPnBhc3N3b3JkX2xlbiA9IG9zX3N0cmxlbihhcmd2W2ldKTsKKwkJCXVzZXItPnBhc3N3b3JkID0gKHU4ICopIG9zX3N0cmR1cChhcmd2W2ldKTsKKwkJCXVzZXItPm5leHQgPSAodm9pZCAqKSAxOworCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChjb2xbaV0sICJtZXRob2RzIikgPT0gMCAmJiBhcmd2W2ldKSB7CisJCQlzZXRfdXNlcl9tZXRob2RzKHVzZXIsIGFyZ3ZbaV0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZXRfd2lsZGNhcmRfY2Iodm9pZCAqY3R4LCBpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyICpjb2xbXSkKK3sKKwlzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqdXNlciA9IGN0eDsKKwlpbnQgaSwgaWQgPSAtMSwgbWV0aG9kcyA9IC0xOworCXNpemVfdCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChvc19zdHJjbXAoY29sW2ldLCAiaWRlbnRpdHkiKSA9PSAwICYmIGFyZ3ZbaV0pCisJCQlpZCA9IGk7CisJCWVsc2UgaWYgKG9zX3N0cmNtcChjb2xbaV0sICJtZXRob2RzIikgPT0gMCAmJiBhcmd2W2ldKQorCQkJbWV0aG9kcyA9IGk7CisJfQorCisJaWYgKGlkIDwgMCB8fCBtZXRob2RzIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBvc19zdHJsZW4oYXJndltpZF0pOworCWlmIChsZW4gPD0gdXNlci0+aWRlbnRpdHlfbGVuICYmCisJICAgIG9zX21lbWNtcChhcmd2W2lkXSwgdXNlci0+aWRlbnRpdHksIGxlbikgPT0gMCAmJgorCSAgICAodXNlci0+cGFzc3dvcmQgPT0gTlVMTCB8fCBsZW4gPiB1c2VyLT5wYXNzd29yZF9sZW4pKSB7CisJCW9zX2ZyZWUodXNlci0+cGFzc3dvcmQpOworCQl1c2VyLT5wYXNzd29yZF9sZW4gPSBvc19zdHJsZW4oYXJndltpZF0pOworCQl1c2VyLT5wYXNzd29yZCA9ICh1OCAqKSBvc19zdHJkdXAoYXJndltpZF0pOworCQl1c2VyLT5uZXh0ID0gKHZvaWQgKikgMTsKKwkJc2V0X3VzZXJfbWV0aG9kcyh1c2VyLCBhcmd2W21ldGhvZHNdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKgorZWFwX3VzZXJfc3FsaXRlX2dldChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICBzaXplX3QgaWRlbnRpdHlfbGVuLCBpbnQgcGhhc2UyKQoreworCXNxbGl0ZTMgKmRiOworCXN0cnVjdCBob3N0YXBkX2VhcF91c2VyICp1c2VyID0gTlVMTDsKKwljaGFyIGlkX3N0clsyNTZdLCBjbWRbMzAwXTsKKwlzaXplX3QgaTsKKworCWlmIChpZGVudGl0eV9sZW4gPj0gc2l6ZW9mKGlkX3N0cikpCisJCXJldHVybiBOVUxMOworCW9zX21lbWNweShpZF9zdHIsIGlkZW50aXR5LCBpZGVudGl0eV9sZW4pOworCWlkX3N0cltpZGVudGl0eV9sZW5dID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyBpIDwgaWRlbnRpdHlfbGVuOyBpKyspIHsKKwkJaWYgKGlkX3N0cltpXSA+PSAnYScgJiYgaWRfc3RyW2ldIDw9ICd6JykKKwkJCWNvbnRpbnVlOworCQlpZiAoaWRfc3RyW2ldID49ICdBJyAmJiBpZF9zdHJbaV0gPD0gJ1onKQorCQkJY29udGludWU7CisJCWlmIChpZF9zdHJbaV0gPj0gJzAnICYmIGlkX3N0cltpXSA8PSAnOScpCisJCQljb250aW51ZTsKKwkJaWYgKGlkX3N0cltpXSA9PSAnLScgfHwgaWRfc3RyW2ldID09ICdfJyB8fCBpZF9zdHJbaV0gPT0gJy4nIHx8CisJCSAgICBpZF9zdHJbaV0gPT0gJywnIHx8IGlkX3N0cltpXSA9PSAnQCcgfHwgaWRfc3RyW2ldID09ICdcXCcgfHwKKwkJICAgIGlkX3N0cltpXSA9PSAnIScgfHwgaWRfc3RyW2ldID09ICcjJyB8fCBpZF9zdHJbaV0gPT0gJyUnIHx8CisJCSAgICBpZF9zdHJbaV0gPT0gJz0nIHx8IGlkX3N0cltpXSA9PSAnICcpCisJCQljb250aW51ZTsKKwkJd3BhX3ByaW50ZihNU0dfSU5GTywgIkRCOiBVbnN1cHBvcnRlZCBjaGFyYWN0ZXIgaW4gaWRlbnRpdHkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJb3NfZnJlZShoYXBkLT50bXBfZWFwX3VzZXIuaWRlbnRpdHkpOworCW9zX2ZyZWUoaGFwZC0+dG1wX2VhcF91c2VyLnBhc3N3b3JkKTsKKwlvc19tZW1zZXQoJmhhcGQtPnRtcF9lYXBfdXNlciwgMCwgc2l6ZW9mKGhhcGQtPnRtcF9lYXBfdXNlcikpOworCWhhcGQtPnRtcF9lYXBfdXNlci5waGFzZTIgPSBwaGFzZTI7CisJaGFwZC0+dG1wX2VhcF91c2VyLmlkZW50aXR5ID0gb3NfemFsbG9jKGlkZW50aXR5X2xlbiArIDEpOworCWlmIChoYXBkLT50bXBfZWFwX3VzZXIuaWRlbnRpdHkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJb3NfbWVtY3B5KGhhcGQtPnRtcF9lYXBfdXNlci5pZGVudGl0eSwgaWRlbnRpdHksIGlkZW50aXR5X2xlbik7CisKKwlpZiAoc3FsaXRlM19vcGVuKGhhcGQtPmNvbmYtPmVhcF91c2VyX3NxbGl0ZSwgJmRiKSkgeworCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiREI6IEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlICVzOiAlcyIsCisJCQkgICBoYXBkLT5jb25mLT5lYXBfdXNlcl9zcWxpdGUsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisJCXNxbGl0ZTNfY2xvc2UoZGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvc19zbnByaW50ZihjbWQsIHNpemVvZihjbWQpLAorCQkgICAgIlNFTEVDVCBwYXNzd29yZCxtZXRob2RzIEZST00gdXNlcnMgV0hFUkUgIgorCQkgICAgImlkZW50aXR5PSclcycgQU5EIHBoYXNlMj0lZDsiLCBpZF9zdHIsIHBoYXNlMik7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJEQjogJXMiLCBjbWQpOworCWlmIChzcWxpdGUzX2V4ZWMoZGIsIGNtZCwgZ2V0X3VzZXJfY2IsICZoYXBkLT50bXBfZWFwX3VzZXIsIE5VTEwpICE9CisJICAgIFNRTElURV9PSykgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkRCOiBGYWlsZWQgdG8gY29tcGxldGUgU1FMIG9wZXJhdGlvbiIpOworCX0gZWxzZSBpZiAoaGFwZC0+dG1wX2VhcF91c2VyLm5leHQpCisJCXVzZXIgPSAmaGFwZC0+dG1wX2VhcF91c2VyOworCisJaWYgKHVzZXIgPT0gTlVMTCAmJiAhcGhhc2UyKSB7CisJCW9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisJCQkgICAgIlNFTEVDVCBpZGVudGl0eSxtZXRob2RzIEZST00gd2lsZGNhcmRzOyIpOworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkRCOiAlcyIsIGNtZCk7CisJCWlmIChzcWxpdGUzX2V4ZWMoZGIsIGNtZCwgZ2V0X3dpbGRjYXJkX2NiLCAmaGFwZC0+dG1wX2VhcF91c2VyLAorCQkJCSBOVUxMKSAhPSBTUUxJVEVfT0spIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiREI6IEZhaWxlZCB0byBjb21wbGV0ZSBTUUwgIgorCQkJCSAgICJvcGVyYXRpb24iKTsKKwkJfSBlbHNlIGlmIChoYXBkLT50bXBfZWFwX3VzZXIubmV4dCkgeworCQkJdXNlciA9ICZoYXBkLT50bXBfZWFwX3VzZXI7CisJCQlvc19mcmVlKHVzZXItPmlkZW50aXR5KTsKKwkJCXVzZXItPmlkZW50aXR5ID0gdXNlci0+cGFzc3dvcmQ7CisJCQl1c2VyLT5pZGVudGl0eV9sZW4gPSB1c2VyLT5wYXNzd29yZF9sZW47CisJCQl1c2VyLT5wYXNzd29yZCA9IE5VTEw7CisJCQl1c2VyLT5wYXNzd29yZF9sZW4gPSAwOworCQl9CisJfQorCisJc3FsaXRlM19jbG9zZShkYik7CisKKwlyZXR1cm4gdXNlcjsKK30KKworI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworCitjb25zdCBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqCitob3N0YXBkX2dldF9lYXBfdXNlcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICAgc2l6ZV90IGlkZW50aXR5X2xlbiwgaW50IHBoYXNlMikKK3sKKwljb25zdCBzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpjb25mID0gaGFwZC0+Y29uZjsKKwlzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqdXNlciA9IGNvbmYtPmVhcF91c2VyOworCisjaWZkZWYgQ09ORklHX1dQUworCWlmIChjb25mLT53cHNfc3RhdGUgJiYgaWRlbnRpdHlfbGVuID09IFdTQ19JRF9FTlJPTExFRV9MRU4gJiYKKwkgICAgb3NfbWVtY21wKGlkZW50aXR5LCBXU0NfSURfRU5ST0xMRUUsIFdTQ19JRF9FTlJPTExFRV9MRU4pID09IDApIHsKKwkJc3RhdGljIHN0cnVjdCBob3N0YXBkX2VhcF91c2VyIHdzY19lbnJvbGxlZTsKKwkJb3NfbWVtc2V0KCZ3c2NfZW5yb2xsZWUsIDAsIHNpemVvZih3c2NfZW5yb2xsZWUpKTsKKwkJd3NjX2Vucm9sbGVlLm1ldGhvZHNbMF0ubWV0aG9kID0gZWFwX3NlcnZlcl9nZXRfdHlwZSgKKwkJCSJXU0MiLCAmd3NjX2Vucm9sbGVlLm1ldGhvZHNbMF0udmVuZG9yKTsKKwkJcmV0dXJuICZ3c2NfZW5yb2xsZWU7CisJfQorCisJaWYgKGNvbmYtPndwc19zdGF0ZSAmJiBpZGVudGl0eV9sZW4gPT0gV1NDX0lEX1JFR0lTVFJBUl9MRU4gJiYKKwkgICAgb3NfbWVtY21wKGlkZW50aXR5LCBXU0NfSURfUkVHSVNUUkFSLCBXU0NfSURfUkVHSVNUUkFSX0xFTikgPT0gMCkgeworCQlzdGF0aWMgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgd3NjX3JlZ2lzdHJhcjsKKwkJb3NfbWVtc2V0KCZ3c2NfcmVnaXN0cmFyLCAwLCBzaXplb2Yod3NjX3JlZ2lzdHJhcikpOworCQl3c2NfcmVnaXN0cmFyLm1ldGhvZHNbMF0ubWV0aG9kID0gZWFwX3NlcnZlcl9nZXRfdHlwZSgKKwkJCSJXU0MiLCAmd3NjX3JlZ2lzdHJhci5tZXRob2RzWzBdLnZlbmRvcik7CisJCXdzY19yZWdpc3RyYXIucGFzc3dvcmQgPSAodTggKikgY29uZi0+YXBfcGluOworCQl3c2NfcmVnaXN0cmFyLnBhc3N3b3JkX2xlbiA9IGNvbmYtPmFwX3BpbiA/CisJCQlvc19zdHJsZW4oY29uZi0+YXBfcGluKSA6IDA7CisJCXJldHVybiAmd3NjX3JlZ2lzdHJhcjsKKwl9CisjZW5kaWYgLyogQ09ORklHX1dQUyAqLworCisJd2hpbGUgKHVzZXIpIHsKKwkJaWYgKCFwaGFzZTIgJiYgdXNlci0+aWRlbnRpdHkgPT0gTlVMTCkgeworCQkJLyogV2lsZGNhcmQgbWF0Y2ggKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVzZXItPnBoYXNlMiA9PSAhIXBoYXNlMiAmJiB1c2VyLT53aWxkY2FyZF9wcmVmaXggJiYKKwkJICAgIGlkZW50aXR5X2xlbiA+PSB1c2VyLT5pZGVudGl0eV9sZW4gJiYKKwkJICAgIG9zX21lbWNtcCh1c2VyLT5pZGVudGl0eSwgaWRlbnRpdHksIHVzZXItPmlkZW50aXR5X2xlbikgPT0KKwkJICAgIDApIHsKKwkJCS8qIFdpbGRjYXJkIHByZWZpeCBtYXRjaCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodXNlci0+cGhhc2UyID09ICEhcGhhc2UyICYmCisJCSAgICB1c2VyLT5pZGVudGl0eV9sZW4gPT0gaWRlbnRpdHlfbGVuICYmCisJCSAgICBvc19tZW1jbXAodXNlci0+aWRlbnRpdHksIGlkZW50aXR5LCBpZGVudGl0eV9sZW4pID09IDApCisJCQlicmVhazsKKwkJdXNlciA9IHVzZXItPm5leHQ7CisJfQorCisjaWZkZWYgQ09ORklHX1NRTElURQorCWlmICh1c2VyID09IE5VTEwgJiYgY29uZi0+ZWFwX3VzZXJfc3FsaXRlKSB7CisJCXJldHVybiBlYXBfdXNlcl9zcWxpdGVfZ2V0KGhhcGQsIGlkZW50aXR5LCBpZGVudGl0eV9sZW4sCisJCQkJCSAgIHBoYXNlMik7CisJfQorI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworCXJldHVybiB1c2VyOworfQpkaWZmIC0tZ2l0IGEvc3JjL2FwL2hvc3RhcGQuYyBiL3NyYy9hcC9ob3N0YXBkLmMKaW5kZXggMzQyOTI1OC4uOTJmZGE1NiAxMDA2NDQKLS0tIGEvc3JjL2FwL2hvc3RhcGQuYworKysgYi9zcmMvYXAvaG9zdGFwZC5jCkBAIC0yNzMsNiArMjczLDExIEBACiAjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwogCWdhc19zZXJ2X2RlaW5pdChoYXBkKTsKICNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisKKyNpZmRlZiBDT05GSUdfU1FMSVRFCisJb3NfZnJlZShoYXBkLT50bXBfZWFwX3VzZXIuaWRlbnRpdHkpOworCW9zX2ZyZWUoaGFwZC0+dG1wX2VhcF91c2VyLnBhc3N3b3JkKTsKKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCiB9CiAKIApAQCAtODg5LDcgKzg5NCwxMSBAQAogCQlpZiAoaG9zdGFwZF9zZXRfZnJlcShoYXBkLCBoYXBkLT5pY29uZi0+aHdfbW9kZSwgaWZhY2UtPmZyZXEsCiAJCQkJICAgICBoYXBkLT5pY29uZi0+Y2hhbm5lbCwKIAkJCQkgICAgIGhhcGQtPmljb25mLT5pZWVlODAyMTFuLAotCQkJCSAgICAgaGFwZC0+aWNvbmYtPnNlY29uZGFyeV9jaGFubmVsKSkgeworCQkJCSAgICAgaGFwZC0+aWNvbmYtPmllZWU4MDIxMWFjLAorCQkJCSAgICAgaGFwZC0+aWNvbmYtPnNlY29uZGFyeV9jaGFubmVsLAorCQkJCSAgICAgaGFwZC0+aWNvbmYtPnZodF9vcGVyX2Nod2lkdGgsCisJCQkJICAgICBoYXBkLT5pY29uZi0+dmh0X29wZXJfY2VudHJfZnJlcV9zZWcwX2lkeCwKKwkJCQkgICAgIGhhcGQtPmljb25mLT52aHRfb3Blcl9jZW50cl9mcmVxX3NlZzFfaWR4KSkgewogCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJDb3VsZCBub3Qgc2V0IGNoYW5uZWwgZm9yICIKIAkJCQkgICAia2VybmVsIGRyaXZlciIpOwogCQkJcmV0dXJuIC0xOwpAQCAtMTExMywxMiArMTEyMiwxMyBAQAogaW50IGhvc3RhcGRfZGlzYWJsZV9pZmFjZShzdHJ1Y3QgaG9zdGFwZF9pZmFjZSAqaGFwZF9pZmFjZSkKIHsKIAlzaXplX3QgajsKLQlzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpic3MgPSBoYXBkX2lmYWNlLT5ic3NbMF0tPmNvbmY7CisJc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqYnNzOwogCWNvbnN0IHN0cnVjdCB3cGFfZHJpdmVyX29wcyAqZHJpdmVyOwogCXZvaWQgKmRydl9wcml2OwogCiAJaWYgKGhhcGRfaWZhY2UgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOworCWJzcyA9IGhhcGRfaWZhY2UtPmJzc1swXS0+Y29uZjsKIAlkcml2ZXIgPSBoYXBkX2lmYWNlLT5ic3NbMF0tPmRyaXZlcjsKIAlkcnZfcHJpdiA9IGhhcGRfaWZhY2UtPmJzc1swXS0+ZHJ2X3ByaXY7CiAKQEAgLTEzNzMsOCArMTM4MywxMCBAQAogCS8qIFN0YXJ0IGFjY291bnRpbmcgaGVyZSwgaWYgSUVFRSA4MDIuMVggYW5kIFdQQSBhcmUgbm90IHVzZWQuCiAJICogSUVFRSA4MDIuMVgvV1BBIGNvZGUgd2lsbCBzdGFydCBhY2NvdW50aW5nIGFmdGVyIHRoZSBzdGF0aW9uIGhhcwogCSAqIGJlZW4gYXV0aG9yaXplZC4gKi8KLQlpZiAoIWhhcGQtPmNvbmYtPmllZWU4MDJfMXggJiYgIWhhcGQtPmNvbmYtPndwYSkKKwlpZiAoIWhhcGQtPmNvbmYtPmllZWU4MDJfMXggJiYgIWhhcGQtPmNvbmYtPndwYSkgeworCQlvc19nZXRfdGltZSgmc3RhLT5jb25uZWN0ZWRfdGltZSk7CiAJCWFjY291bnRpbmdfc3RhX3N0YXJ0KGhhcGQsIHN0YSk7CisJfQogCiAJLyogU3RhcnQgSUVFRSA4MDIuMVggYXV0aGVudGljYXRpb24gcHJvY2VzcyBmb3IgbmV3IHN0YXRpb25zICovCiAJaWVlZTgwMl8xeF9uZXdfc3RhdGlvbihoYXBkLCBzdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL2hvc3RhcGQuaCBiL3NyYy9hcC9ob3N0YXBkLmgKaW5kZXggNzFmNDc2Yy4uYzkwODdiMyAxMDA2NDQKLS0tIGEvc3JjL2FwL2hvc3RhcGQuaAorKysgYi9zcmMvYXAvaG9zdGFwZC5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIEhPU1RBUERfSAogCiAjaW5jbHVkZSAiY29tbW9uL2RlZnMuaCIKKyNpbmNsdWRlICJhcF9jb25maWcuaCIKIAogc3RydWN0IHdwYV9kcml2ZXJfb3BzOwogc3RydWN0IHdwYV9jdHJsX2RzdDsKQEAgLTE4Nyw2ICsxODgsMTYgQEAKICNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCiAJc2l6ZV90IGdhc19mcmFnX2xpbWl0OwogI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KKworI2lmZGVmIENPTkZJR19TUUxJVEUKKwlzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciB0bXBfZWFwX3VzZXI7CisjZW5kaWYgLyogQ09ORklHX1NRTElURSAqLworCisjaWZkZWYgQ09ORklHX1NBRQorCS8qKiBLZXkgdXNlZCBmb3IgZ2VuZXJhdGluZyBTQUUgYW50aS1jbG9nZ2luZyB0b2tlbnMgKi8KKwl1OCBzYWVfdG9rZW5fa2V5WzhdOworCW9zX3RpbWVfdCBsYXN0X3NhZV90b2tlbl9rZXlfdXBkYXRlOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIH07CiAKIApAQCAtMjk3LDQgKzMwOCw4IEBACiB2b2lkIGhvc3RhcGRfZXZlbnRfY2hfc3dpdGNoKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGludCBmcmVxLCBpbnQgaHQsCiAJCQkgICAgIGludCBvZmZzZXQpOwogCitjb25zdCBzdHJ1Y3QgaG9zdGFwZF9lYXBfdXNlciAqCitob3N0YXBkX2dldF9lYXBfdXNlcihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqaWRlbnRpdHksCisJCSAgICAgc2l6ZV90IGlkZW50aXR5X2xlbiwgaW50IHBoYXNlMik7CisKICNlbmRpZiAvKiBIT1NUQVBEX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hcC9od19mZWF0dXJlcy5jIGIvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKaW5kZXggOTdlMTIzOC4uOTIzYjY5OCAxMDA2NDQKLS0tIGEvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKKysrIGIvc3JjL2FwL2h3X2ZlYXR1cmVzLmMKQEAgLTEyMiw2ICsxMjIsOCBAQAogCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc6CiAJCWJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXNfZzsKIAkJYnJlYWs7CisJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ6CisJCXJldHVybiAwOyAvKiBObyBiYXNpYyByYXRlcyBmb3IgMTFhZCAqLwogCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKIAl9CkBAIC03NTYsNiArNzU4LDggQEAKIAkJcmV0dXJuICJJRUVFIDgwMi4xMWIiOwogCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUc6CiAJCXJldHVybiAiSUVFRSA4MDIuMTFnIjsKKwljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBRDoKKwkJcmV0dXJuICJJRUVFIDgwMi4xMWFkIjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gIlVOS05PV04iOwogCX0KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExLmMgYi9zcmMvYXAvaWVlZTgwMl8xMS5jCmluZGV4IGNlMjBlNWYuLjc5MjM1ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzExLmMKKysrIGIvc3JjL2FwL2llZWU4MDJfMTEuYwpAQCAtMTMsMTAgKzEzLDEzIEBACiAjaW5jbHVkZSAidXRpbHMvY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMvZWxvb3AuaCIKICNpbmNsdWRlICJjcnlwdG8vY3J5cHRvLmgiCisjaW5jbHVkZSAiY3J5cHRvL3NoYTI1Ni5oIgorI2luY2x1ZGUgImNyeXB0by9yYW5kb20uaCIKICNpbmNsdWRlICJkcml2ZXJzL2RyaXZlci5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2RlZnMuaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9jb21tb24uaCIKICNpbmNsdWRlICJjb21tb24vd3BhX2N0cmwuaCIKKyNpbmNsdWRlICJjb21tb24vc2FlLmgiCiAjaW5jbHVkZSAicmFkaXVzL3JhZGl1cy5oIgogI2luY2x1ZGUgInJhZGl1cy9yYWRpdXNfY2xpZW50LmgiCiAjaW5jbHVkZSAicDJwL3AycC5oIgpAQCAtMzQsNiArMzcsNyBAQAogI2luY2x1ZGUgImFwX21sbWUuaCIKICNpbmNsdWRlICJwMnBfaG9zdGFwZC5oIgogI2luY2x1ZGUgImFwX2Rydl9vcHMuaCIKKyNpbmNsdWRlICJ3bm1fYXAuaCIKICNpbmNsdWRlICJpZWVlODAyXzExLmgiCiAKIApAQCAtNDksNiArNTMsOCBAQAogCW51bSA9IGhhcGQtPmlmYWNlLT5udW1fcmF0ZXM7CiAJaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFuICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX2h0KQogCQludW0rKzsKKwlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMWFjICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX3ZodCkKKwkJbnVtKys7CiAJaWYgKG51bSA+IDgpIHsKIAkJLyogcmVzdCBvZiB0aGUgcmF0ZXMgYXJlIGVuY29kZWQgaW4gRXh0ZW5kZWQgc3VwcG9ydGVkCiAJCSAqIHJhdGVzIGVsZW1lbnQgKi8KQEAgLTY2LDkgKzcyLDE1IEBACiAJCXBvcysrOwogCX0KIAotCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExbiAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV9odCAmJgotCSAgICBoYXBkLT5pZmFjZS0+bnVtX3JhdGVzIDwgOCkKKwlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMW4gJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfaHQgJiYgY291bnQgPCA4KSB7CisJCWNvdW50Kys7CiAJCSpwb3MrKyA9IDB4ODAgfCBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFk7CisJfQorCisJaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFhYyAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV92aHQgJiYgY291bnQgPCA4KSB7CisJCWNvdW50Kys7CisJCSpwb3MrKyA9IDB4ODAgfCBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9WSFRfUEhZOworCX0KIAogCXJldHVybiBwb3M7CiB9CkBAIC04NSw2ICs5Nyw4IEBACiAJbnVtID0gaGFwZC0+aWZhY2UtPm51bV9yYXRlczsKIAlpZiAoaGFwZC0+aWNvbmYtPmllZWU4MDIxMW4gJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfaHQpCiAJCW51bSsrOworCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExYWMgJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfdmh0KQorCQludW0rKzsKIAlpZiAobnVtIDw9IDgpCiAJCXJldHVybiBlaWQ7CiAJbnVtIC09IDg7CkBAIC0xMDMsOSArMTE3LDE3IEBACiAJCXBvcysrOwogCX0KIAotCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExbiAmJiBoYXBkLT5pY29uZi0+cmVxdWlyZV9odCAmJgotCSAgICBoYXBkLT5pZmFjZS0+bnVtX3JhdGVzID49IDgpCi0JCSpwb3MrKyA9IDB4ODAgfCBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFk7CisJaWYgKGhhcGQtPmljb25mLT5pZWVlODAyMTFuICYmIGhhcGQtPmljb25mLT5yZXF1aXJlX2h0KSB7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDgpCisJCQkqcG9zKysgPSAweDgwIHwgQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZOworCX0KKworCWlmIChoYXBkLT5pY29uZi0+aWVlZTgwMjExYWMgJiYgaGFwZC0+aWNvbmYtPnJlcXVpcmVfdmh0KSB7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDgpCisJCQkqcG9zKysgPSAweDgwIHwgQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfVkhUX1BIWTsKKwl9CiAKIAlyZXR1cm4gcG9zOwogfQpAQCAtMjk2LDYgKzMxOCwyMjIgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCiAKKyNpZmRlZiBDT05GSUdfU0FFCisKK3N0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogYXV0aF9wcm9jZXNzX3NhZV9jb21taXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQkJICAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKworCWlmIChoYXBkLT5jb25mLT5zc2lkLndwYV9wYXNzcGhyYXNlID09IE5VTEwpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IE5vIHBhc3N3b3JkIGF2YWlsYWJsZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2FlX3ByZXBhcmVfY29tbWl0KGhhcGQtPm93bl9hZGRyLCBzdGEtPmFkZHIsCisJCQkgICAgICAgKHU4ICopIGhhcGQtPmNvbmYtPnNzaWQud3BhX3Bhc3NwaHJhc2UsCisJCQkgICAgICAgb3Nfc3RybGVuKGhhcGQtPmNvbmYtPnNzaWQud3BhX3Bhc3NwaHJhc2UpLAorCQkJICAgICAgIHN0YS0+c2FlKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvdWxkIG5vdCBwaWNrIFBXRSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2FlX3Byb2Nlc3NfY29tbWl0KHN0YS0+c2FlKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBwcm9jZXNzIHBlZXIgY29tbWl0Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhTQUVfQ09NTUlUX01BWF9MRU4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc2FlX3dyaXRlX2NvbW1pdChzdGEtPnNhZSwgYnVmLCBOVUxMKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIHN0cnVjdCB3cGFidWYgKiBhdXRoX2J1aWxkX3NhZV9jb25maXJtKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKworCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhTQUVfQ09ORklSTV9NQVhfTEVOKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc2FlX3dyaXRlX2NvbmZpcm0oc3RhLT5zYWUsIGJ1Zik7CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBpbnQgdXNlX3NhZV9hbnRpX2Nsb2dnaW5nKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJdW5zaWduZWQgaW50IG9wZW4gPSAwOworCisJaWYgKGhhcGQtPmNvbmYtPnNhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZCA9PSAwKQorCQlyZXR1cm4gMTsKKworCWZvciAoc3RhID0gaGFwZC0+c3RhX2xpc3Q7IHN0YTsgc3RhID0gc3RhLT5uZXh0KSB7CisJCWlmICghc3RhLT5zYWUpCisJCQljb250aW51ZTsKKwkJaWYgKHN0YS0+c2FlLT5zdGF0ZSAhPSBTQUVfQ09NTUlUVEVEICYmCisJCSAgICBzdGEtPnNhZS0+c3RhdGUgIT0gU0FFX0NPTkZJUk1FRCkKKwkJCWNvbnRpbnVlOworCQlvcGVuKys7CisJCWlmIChvcGVuID49IGhhcGQtPmNvbmYtPnNhZV9hbnRpX2Nsb2dnaW5nX3RocmVzaG9sZCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2tfc2FlX3Rva2VuKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAorCQkJICAgY29uc3QgdTggKnRva2VuLCBzaXplX3QgdG9rZW5fbGVuKQoreworCXU4IG1hY1tTSEEyNTZfTUFDX0xFTl07CisKKwlpZiAodG9rZW5fbGVuICE9IFNIQTI1Nl9NQUNfTEVOKQorCQlyZXR1cm4gLTE7CisJaWYgKGhtYWNfc2hhMjU2KGhhcGQtPnNhZV90b2tlbl9rZXksIHNpemVvZihoYXBkLT5zYWVfdG9rZW5fa2V5KSwKKwkJCWFkZHIsIEVUSF9BTEVOLCBtYWMpIDwgMCB8fAorCSAgICBvc19tZW1jbXAodG9rZW4sIG1hYywgU0hBMjU2X01BQ19MRU4pICE9IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogYXV0aF9idWlsZF90b2tlbl9yZXEoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQkJICAgIGNvbnN0IHU4ICphZGRyKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwl1OCAqdG9rZW47CisJc3RydWN0IG9zX3RpbWUgdDsKKworCW9zX2dldF90aW1lKCZ0KTsKKwlpZiAoaGFwZC0+bGFzdF9zYWVfdG9rZW5fa2V5X3VwZGF0ZSA9PSAwIHx8CisJICAgIHQuc2VjID4gaGFwZC0+bGFzdF9zYWVfdG9rZW5fa2V5X3VwZGF0ZSArIDYwKSB7CisJCWlmIChyYW5kb21fZ2V0X2J5dGVzKGhhcGQtPnNhZV90b2tlbl9rZXksCisJCQkJICAgICBzaXplb2YoaGFwZC0+c2FlX3Rva2VuX2tleSkpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFVwZGF0ZWQgdG9rZW4ga2V5IiwKKwkJCSAgICBoYXBkLT5zYWVfdG9rZW5fa2V5LCBzaXplb2YoaGFwZC0+c2FlX3Rva2VuX2tleSkpOworCQloYXBkLT5sYXN0X3NhZV90b2tlbl9rZXlfdXBkYXRlID0gdC5zZWM7CisJfQorCisJYnVmID0gd3BhYnVmX2FsbG9jKFNIQTI1Nl9NQUNfTEVOKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdG9rZW4gPSB3cGFidWZfcHV0KGJ1ZiwgU0hBMjU2X01BQ19MRU4pOworCWhtYWNfc2hhMjU2KGhhcGQtPnNhZV90b2tlbl9rZXksIHNpemVvZihoYXBkLT5zYWVfdG9rZW5fa2V5KSwKKwkJICAgIGFkZHIsIEVUSF9BTEVOLCB0b2tlbik7CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hdXRoX3NhZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4sCisJCQkgICAgdTggYXV0aF90cmFuc2FjdGlvbikKK3sKKwl1MTYgcmVzcCA9IFdMQU5fU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IHdwYWJ1ZiAqZGF0YSA9IE5VTEw7CisKKwlpZiAoIXN0YS0+c2FlKSB7CisJCWlmIChhdXRoX3RyYW5zYWN0aW9uICE9IDEpCisJCQlyZXR1cm47CisJCXN0YS0+c2FlID0gb3NfemFsbG9jKHNpemVvZigqc3RhLT5zYWUpKTsKKwkJaWYgKHN0YS0+c2FlID09IE5VTEwpCisJCQlyZXR1cm47CisJCXN0YS0+c2FlLT5zdGF0ZSA9IFNBRV9OT1RISU5HOworCX0KKworCWlmIChhdXRoX3RyYW5zYWN0aW9uID09IDEpIHsKKwkJY29uc3QgdTggKnRva2VuID0gTlVMTDsKKwkJc2l6ZV90IHRva2VuX2xlbiA9IDA7CisJCWhvc3RhcGRfbG9nZ2VyKGhhcGQsIHN0YS0+YWRkciwgSE9TVEFQRF9NT0RVTEVfSUVFRTgwMjExLAorCQkJICAgICAgIEhPU1RBUERfTEVWRUxfREVCVUcsCisJCQkgICAgICAgInN0YXJ0IFNBRSBhdXRoZW50aWNhdGlvbiAoUlggY29tbWl0KSIpOworCQlyZXNwID0gc2FlX3BhcnNlX2NvbW1pdChzdGEtPnNhZSwgbWdtdC0+dS5hdXRoLnZhcmlhYmxlLAorCQkJCQkoKGNvbnN0IHU4ICopIG1nbXQpICsgbGVuIC0KKwkJCQkJbWdtdC0+dS5hdXRoLnZhcmlhYmxlLCAmdG9rZW4sCisJCQkJCSZ0b2tlbl9sZW4sIGhhcGQtPmNvbmYtPnNhZV9ncm91cHMpOworCQlpZiAodG9rZW4gJiYgY2hlY2tfc2FlX3Rva2VuKGhhcGQsIHN0YS0+YWRkciwgdG9rZW4sIHRva2VuX2xlbikKKwkJICAgIDwgMCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IERyb3AgY29tbWl0IG1lc3NhZ2Ugd2l0aCAiCisJCQkJICAgImluY29ycmVjdCB0b2tlbiBmcm9tICIgTUFDU1RSLAorCQkJCSAgIE1BQzJTVFIoc3RhLT5hZGRyKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocmVzcCA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAoIXRva2VuICYmIHVzZV9zYWVfYW50aV9jbG9nZ2luZyhoYXBkKSkgeworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBSZXF1ZXN0IGFudGktIgorCQkJCQkgICAiY2xvZ2dpbmcgdG9rZW4gZnJvbSAiIE1BQ1NUUiwKKwkJCQkJICAgTUFDMlNUUihzdGEtPmFkZHIpKTsKKwkJCQlkYXRhID0gYXV0aF9idWlsZF90b2tlbl9yZXEoaGFwZCwgc3RhLT5hZGRyKTsKKwkJCQlyZXNwID0gV0xBTl9TVEFUVVNfQU5USV9DTE9HR0lOR19UT0tFTl9SRVE7CisJCQl9IGVsc2UgeworCQkJCWRhdGEgPSBhdXRoX3Byb2Nlc3Nfc2FlX2NvbW1pdChoYXBkLCBzdGEpOworCQkJCWlmIChkYXRhID09IE5VTEwpCisJCQkJCXJlc3AgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCQkJCWVsc2UKKwkJCQkJc3RhLT5zYWUtPnN0YXRlID0gU0FFX0NPTU1JVFRFRDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAyKSB7CisJCWlmIChzdGEtPnNhZS0+c3RhdGUgIT0gU0FFX0NPTU1JVFRFRCkgeworCQkJaG9zdGFwZF9sb2dnZXIoaGFwZCwgc3RhLT5hZGRyLAorCQkJCSAgICAgICBIT1NUQVBEX01PRFVMRV9JRUVFODAyMTEsCisJCQkJICAgICAgIEhPU1RBUERfTEVWRUxfREVCVUcsCisJCQkJICAgICAgICJTQUUgY29uZmlybSBiZWZvcmUgY29tbWl0Iik7CisJCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OOworCQl9CisJCWhvc3RhcGRfbG9nZ2VyKGhhcGQsIHN0YS0+YWRkciwgSE9TVEFQRF9NT0RVTEVfSUVFRTgwMjExLAorCQkJICAgICAgIEhPU1RBUERfTEVWRUxfREVCVUcsCisJCQkgICAgICAgIlNBRSBhdXRoZW50aWNhdGlvbiAoUlggY29uZmlybSkiKTsKKwkJaWYgKHNhZV9jaGVja19jb25maXJtKHN0YS0+c2FlLCBtZ210LT51LmF1dGgudmFyaWFibGUsCisJCQkJICAgICAgICgodTggKikgbWdtdCkgKyBsZW4gLQorCQkJCSAgICAgICBtZ210LT51LmF1dGgudmFyaWFibGUpIDwgMCkgeworCQkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJCX0gZWxzZSB7CisJCQlyZXNwID0gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKKwkJCXN0YS0+ZmxhZ3MgfD0gV0xBTl9TVEFfQVVUSDsKKwkJCXdwYV9hdXRoX3NtX2V2ZW50KHN0YS0+d3BhX3NtLCBXUEFfQVVUSCk7CisJCQlzdGEtPmF1dGhfYWxnID0gV0xBTl9BVVRIX1NBRTsKKwkJCW1sbWVfYXV0aGVudGljYXRlX2luZGljYXRpb24oaGFwZCwgc3RhKTsKKworCQkJZGF0YSA9IGF1dGhfYnVpbGRfc2FlX2NvbmZpcm0oaGFwZCwgc3RhKTsKKwkJCWlmIChkYXRhID09IE5VTEwpCisJCQkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJCQllbHNlIHsKKwkJCQlzdGEtPnNhZS0+c3RhdGUgPSBTQUVfQUNDRVBURUQ7CisJCQkJc2FlX2NsZWFyX3RlbXBfZGF0YShzdGEtPnNhZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlob3N0YXBkX2xvZ2dlcihoYXBkLCBzdGEtPmFkZHIsIEhPU1RBUERfTU9EVUxFX0lFRUU4MDIxMSwKKwkJCSAgICAgICBIT1NUQVBEX0xFVkVMX0RFQlVHLAorCQkJICAgICAgICJ1bmV4cGVjdGVkIFNBRSBhdXRoZW50aWNhdGlvbiB0cmFuc2FjdGlvbiAldSIsCisJCQkgICAgICAgYXV0aF90cmFuc2FjdGlvbik7CisJCXJlc3AgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047CisJfQorCisJc3RhLT5hdXRoX2FsZyA9IFdMQU5fQVVUSF9TQUU7CisKKwlzZW5kX2F1dGhfcmVwbHkoaGFwZCwgbWdtdC0+c2EsIG1nbXQtPmJzc2lkLCBXTEFOX0FVVEhfU0FFLAorCQkJYXV0aF90cmFuc2FjdGlvbiwgcmVzcCwKKwkJCWRhdGEgPyB3cGFidWZfaGVhZChkYXRhKSA6ICh1OCAqKSAiIiwKKwkJCWRhdGEgPyB3cGFidWZfbGVuKGRhdGEpIDogMCk7CisJd3BhYnVmX2ZyZWUoZGF0YSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCisKIHN0YXRpYyB2b2lkIGhhbmRsZV9hdXRoKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4pCiB7CkBAIC0zMDcsOCArNTQ1LDcgQEAKIAljb25zdCB1OCAqY2hhbGxlbmdlID0gTlVMTDsKIAl1MzIgc2Vzc2lvbl90aW1lb3V0LCBhY2N0X2ludGVyaW1faW50ZXJ2YWw7CiAJaW50IHZsYW5faWQgPSAwOwotCXU4IHBza1tQTUtfTEVOXTsKLQlpbnQgaGFzX3BzayA9IDA7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBzayA9IE5VTEw7CiAJdTggcmVzcF9pZXNbMiArIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOXTsKIAlzaXplX3QgcmVzcF9pZXNfbGVuID0gMDsKIAljaGFyICppZGVudGl0eSA9IE5VTEw7CkBAIC0zNDgsNiArNTg1LDEwIEBACiAJICAgICAgKGhhcGQtPmNvbmYtPndwYSAmJiB3cGFfa2V5X21nbXRfZnQoaGFwZC0+Y29uZi0+d3BhX2tleV9tZ210KSAmJgogCSAgICAgICBhdXRoX2FsZyA9PSBXTEFOX0FVVEhfRlQpIHx8CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJICAgICAgKGhhcGQtPmNvbmYtPndwYSAmJiB3cGFfa2V5X21nbXRfc2FlKGhhcGQtPmNvbmYtPndwYV9rZXlfbWdtdCkgJiYKKwkgICAgICAgYXV0aF9hbGcgPT0gV0xBTl9BVVRIX1NBRSkgfHwKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJICAgICAgKChoYXBkLT5jb25mLT5hdXRoX2FsZ3MgJiBXUEFfQVVUSF9BTEdfU0hBUkVEKSAmJgogCSAgICAgICBhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkpKSB7CiAJCXByaW50ZigiVW5zdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtICglZClcbiIsCkBAIC0zNTYsNyArNTk3LDcgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSB8fAorCWlmICghKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSB8fCBhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0FFIHx8CiAJICAgICAgKGF1dGhfYWxnID09IFdMQU5fQVVUSF9TSEFSRURfS0VZICYmIGF1dGhfdHJhbnNhY3Rpb24gPT0gMykpKSB7CiAJCXByaW50ZigiVW5rbm93biBhdXRoZW50aWNhdGlvbiB0cmFuc2FjdGlvbiBudW1iZXIgKCVkKVxuIiwKIAkJICAgICAgIGF1dGhfdHJhbnNhY3Rpb24pOwpAQCAtMzc0LDcgKzYxNSw3IEBACiAJcmVzID0gaG9zdGFwZF9hbGxvd2VkX2FkZHJlc3MoaGFwZCwgbWdtdC0+c2EsICh1OCAqKSBtZ210LCBsZW4sCiAJCQkJICAgICAgJnNlc3Npb25fdGltZW91dCwKIAkJCQkgICAgICAmYWNjdF9pbnRlcmltX2ludGVydmFsLCAmdmxhbl9pZCwKLQkJCQkgICAgICBwc2ssICZoYXNfcHNrLCAmaWRlbnRpdHksICZyYWRpdXNfY3VpKTsKKwkJCQkgICAgICAmcHNrLCAmaWRlbnRpdHksICZyYWRpdXNfY3VpKTsKIAogCWlmIChyZXMgPT0gSE9TVEFQRF9BQ0xfUkVKRUNUKSB7CiAJCXByaW50ZigiU3RhdGlvbiAiIE1BQ1NUUiAiIG5vdCBhbGxvd2VkIHRvIGF1dGhlbnRpY2F0ZS5cbiIsCkBAIC00MTMsMTMgKzY1NCwxMSBAQAogCQkJICAgICAgIEhPU1RBUERfTEVWRUxfSU5GTywgIlZMQU4gSUQgJWQiLCBzdGEtPnZsYW5faWQpOwogCX0KIAotCWlmIChoYXNfcHNrICYmIGhhcGQtPmNvbmYtPndwYV9wc2tfcmFkaXVzICE9IFBTS19SQURJVVNfSUdOT1JFRCkgewotCQlvc19mcmVlKHN0YS0+cHNrKTsKLQkJc3RhLT5wc2sgPSBvc19tYWxsb2MoUE1LX0xFTik7Ci0JCWlmIChzdGEtPnBzaykKLQkJCW9zX21lbWNweShzdGEtPnBzaywgcHNrLCBQTUtfTEVOKTsKKwlob3N0YXBkX2ZyZWVfcHNrX2xpc3Qoc3RhLT5wc2spOworCWlmIChoYXBkLT5jb25mLT53cGFfcHNrX3JhZGl1cyAhPSBQU0tfUkFESVVTX0lHTk9SRUQpIHsKKwkJc3RhLT5wc2sgPSBwc2s7CisJCXBzayA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJb3NfZnJlZShzdGEtPnBzayk7CiAJCXN0YS0+cHNrID0gTlVMTDsKIAl9CiAKQEAgLTQ4NiwxMSArNzI1LDE3IEBACiAJCS8qIGhhbmRsZV9hdXRoX2Z0X2ZpbmlzaCgpIGNhbGxiYWNrIHdpbGwgY29tcGxldGUgYXV0aC4gKi8KIAkJcmV0dXJuOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCisjaWZkZWYgQ09ORklHX1NBRQorCWNhc2UgV0xBTl9BVVRIX1NBRToKKwkJaGFuZGxlX2F1dGhfc2FlKGhhcGQsIHN0YSwgbWdtdCwgbGVuLCBhdXRoX3RyYW5zYWN0aW9uKTsKKwkJcmV0dXJuOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAl9CiAKICBmYWlsOgogCW9zX2ZyZWUoaWRlbnRpdHkpOwogCW9zX2ZyZWUocmFkaXVzX2N1aSk7CisJaG9zdGFwZF9mcmVlX3Bza19saXN0KHBzayk7CiAKIAlzZW5kX2F1dGhfcmVwbHkoaGFwZCwgbWdtdC0+c2EsIG1nbXQtPmJzc2lkLCBhdXRoX2FsZywKIAkJCWF1dGhfdHJhbnNhY3Rpb24gKyAxLCByZXNwLCByZXNwX2llcywgcmVzcF9pZXNfbGVuKTsKQEAgLTc3OSw2ICsxMDI0LDE2IEBACiAJCX0KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCisjaWZkZWYgQ09ORklHX1NBRQorCQlpZiAod3BhX2F1dGhfdXNlc19zYWUoc3RhLT53cGFfc20pICYmCisJCSAgICBzdGEtPmF1dGhfYWxnICE9IFdMQU5fQVVUSF9TQUUpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiAiIE1BQ1NUUiAiIHRyaWVkIHRvIHVzZSAiCisJCQkJICAgIlNBRSBBS00gYWZ0ZXIgbm9uLVNBRSBhdXRoX2FsZyAldSIsCisJCQkJICAgTUFDMlNUUihzdGEtPmFkZHIpLCBzdGEtPmF1dGhfYWxnKTsKKwkJCXJldHVybiBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHOworCQl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMU4KIAkJaWYgKChzdGEtPmZsYWdzICYgKFdMQU5fU1RBX0hUIHwgV0xBTl9TVEFfVkhUKSkgJiYKIAkJICAgIHdwYV9hdXRoX2dldF9wYWlyd2lzZShzdGEtPndwYV9zbSkgPT0gV1BBX0NJUEhFUl9US0lQKSB7CkBAIC04MDcsNiArMTA2MiwxNSBAQAogCXAycF9ncm91cF9ub3RpZl9hc3NvYyhoYXBkLT5wMnBfZ3JvdXAsIHN0YS0+YWRkciwgaWVzLCBpZXNfbGVuKTsKICNlbmRpZiAvKiBDT05GSUdfUDJQICovCiAKKyNpZmRlZiBDT05GSUdfSFMyMAorCXdwYWJ1Zl9mcmVlKHN0YS0+aHMyMF9pZSk7CisJaWYgKGVsZW1zLmhzMjAgJiYgZWxlbXMuaHMyMF9sZW4gPiA0KSB7CisJCXN0YS0+aHMyMF9pZSA9IHdwYWJ1Zl9hbGxvY19jb3B5KGVsZW1zLmhzMjAgKyA0LAorCQkJCQkJIGVsZW1zLmhzMjBfbGVuIC0gNCk7CisJfSBlbHNlCisJCXN0YS0+aHMyMF9pZSA9IE5VTEw7CisjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KKwogCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOwogfQogCkBAIC0xMjU0LDEzICsxNTE4LDMyIEBACiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAogCisjaWZkZWYgQ09ORklHX1dOTQorc3RhdGljIHZvaWQgaG9zdGFwZF93bm1fYWN0aW9uKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCByeF9hY3Rpb24gYWN0aW9uOworCWlmIChsZW4gPCBJRUVFODAyMTFfSERSTEVOICsgMikKKwkJcmV0dXJuOworCW9zX21lbXNldCgmYWN0aW9uLCAwLCBzaXplb2YoYWN0aW9uKSk7CisJYWN0aW9uLmRhID0gbWdtdC0+ZGE7CisJYWN0aW9uLnNhID0gbWdtdC0+c2E7CisJYWN0aW9uLmJzc2lkID0gbWdtdC0+YnNzaWQ7CisJYWN0aW9uLmNhdGVnb3J5ID0gbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnk7CisJYWN0aW9uLmRhdGEgPSAoY29uc3QgdTggKikgJm1nbXQtPnUuYWN0aW9uLnUud25tX3NsZWVwX3JlcS5hY3Rpb247CisJYWN0aW9uLmxlbiA9IGxlbiAtIElFRUU4MDIxMV9IRFJMRU4gLSAxOworCWFjdGlvbi5mcmVxID0gaGFwZC0+aWZhY2UtPmZyZXE7CisJaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKGhhcGQsICZhY3Rpb24pOworfQorI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KKworCiBzdGF0aWMgdm9pZCBoYW5kbGVfYWN0aW9uKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbikKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFXKSB8fCBkZWZpbmVkKENPTkZJR19JRUVFODAyMTFSKQogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXN0YSA9IGFwX2dldF9zdGEoaGFwZCwgbWdtdC0+c2EpOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXIHx8IENPTkZJR19JRUVFODAyMTFSICovCiAKIAlpZiAobGVuIDwgSUVFRTgwMjExX0hEUkxFTiArIDEpIHsKIAkJaG9zdGFwZF9sb2dnZXIoaGFwZCwgbWdtdC0+c2EsIEhPU1RBUERfTU9EVUxFX0lFRUU4MDIxMSwKQEAgLTEyNzAsNiArMTU1MywxNCBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ICE9IFdMQU5fQUNUSU9OX1BVQkxJQyAmJgorCSAgICAoc3RhID09IE5VTEwgfHwgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpKSkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIklFRUUgODAyLjExOiBJZ25vcmVkIEFjdGlvbiAiCisJCQkgICAiZnJhbWUgKGNhdGVnb3J5PSV1KSBmcm9tIHVuYXNzb2NpYXRlZCBTVEEgIiBNQUNTVFIsCisJCQkgICBNQUMyU1RSKG1nbXQtPnNhKSwgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkpOworCQlyZXR1cm47CisJfQorCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIAlpZiAoc3RhICYmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfTUZQKSAmJgogCSAgICAhKG1nbXQtPmZyYW1lX2NvbnRyb2wgJiBob3N0X3RvX2xlMTYoV0xBTl9GQ19JU1dFUCkgJiYKQEAgLTEyODUsMjAgKzE1NzYsMTAgQEAKIAlzd2l0Y2ggKG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5KSB7CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKIAljYXNlIFdMQU5fQUNUSU9OX0ZUOgotCXsKLQkJaWYgKHN0YSA9PSBOVUxMIHx8ICEoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FTU09DKSkgewotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJRUVFIDgwMi4xMTogSWdub3JlZCBGVCBBY3Rpb24gIgotCQkJCSAgICJmcmFtZSBmcm9tIHVuYXNzb2NpYXRlZCBTVEEgIiBNQUNTVFIsCi0JCQkJICAgTUFDMlNUUihtZ210LT5zYSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KIAkJaWYgKHdwYV9mdF9hY3Rpb25fcngoc3RhLT53cGFfc20sICh1OCAqKSAmbWdtdC0+dS5hY3Rpb24sCiAJCQkJICAgICBsZW4gLSBJRUVFODAyMTFfSERSTEVOKSkKIAkJCWJyZWFrOwotCiAJCXJldHVybjsKLQl9CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAljYXNlIFdMQU5fQUNUSU9OX1dNTToKIAkJaG9zdGFwZF93bW1fYWN0aW9uKGhhcGQsIG1nbXQsIGxlbik7CkBAIC0xMzA4LDYgKzE1ODksMTEgQEAKIAkJaG9zdGFwZF9zYV9xdWVyeV9hY3Rpb24oaGFwZCwgbWdtdCwgbGVuKTsKIAkJcmV0dXJuOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1dOTQorCWNhc2UgV0xBTl9BQ1RJT05fV05NOgorCQlob3N0YXBkX3dubV9hY3Rpb24oaGFwZCwgc3RhLCBtZ210LCBsZW4pOworCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCWNhc2UgV0xBTl9BQ1RJT05fUFVCTElDOgogCQlpZiAoaGFwZC0+cHVibGljX2FjdGlvbl9jYikgewogCQkJaGFwZC0+cHVibGljX2FjdGlvbl9jYihoYXBkLT5wdWJsaWNfYWN0aW9uX2NiX2N0eCwKQEAgLTE1MDUsNiArMTc5MSw3IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJaW50IG5ld19hc3NvYyA9IDE7CiAJc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcGFiaWxpdGllcyB2aHRfY2FwOwogCiAJaWYgKGxlbiA8IElFRUU4MDIxMV9IRFJMRU4gKyAocmVhc3NvYyA/IHNpemVvZihtZ210LT51LnJlYXNzb2NfcmVzcCkgOgogCQkJCSAgICAgIHNpemVvZihtZ210LT51LmFzc29jX3Jlc3ApKSkgewpAQCAtMTU3NywxMSArMTg2NCwxNiBAQAogCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpCiAJCWhvc3RhcGRfZ2V0X2h0X2NhcGFiKGhhcGQsIHN0YS0+aHRfY2FwYWJpbGl0aWVzLCAmaHRfY2FwKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExTiAqLworI2lmZGVmIENPTkZJR19JRUVFODAyMTFBQworCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfVkhUKQorCQlob3N0YXBkX2dldF92aHRfY2FwYWIoaGFwZCwgc3RhLT52aHRfY2FwYWJpbGl0aWVzLCAmdmh0X2NhcCk7CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMUFDICovCiAKIAlpZiAoaG9zdGFwZF9zdGFfYWRkKGhhcGQsIHN0YS0+YWRkciwgc3RhLT5haWQsIHN0YS0+Y2FwYWJpbGl0eSwKIAkJCSAgICBzdGEtPnN1cHBvcnRlZF9yYXRlcywgc3RhLT5zdXBwb3J0ZWRfcmF0ZXNfbGVuLAogCQkJICAgIHN0YS0+bGlzdGVuX2ludGVydmFsLAogCQkJICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCA/ICZodF9jYXAgOiBOVUxMLAorCQkJICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9WSFQgPyAmdmh0X2NhcCA6IE5VTEwsCiAJCQkgICAgc3RhLT5mbGFncywgc3RhLT5xb3NpbmZvKSkgewogCQlob3N0YXBkX2xvZ2dlcihoYXBkLCBzdGEtPmFkZHIsIEhPU1RBUERfTU9EVUxFX0lFRUU4MDIxMSwKIAkJCSAgICAgICBIT1NUQVBEX0xFVkVMX05PVElDRSwKZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExLmggYi9zcmMvYXAvaWVlZTgwMl8xMS5oCmluZGV4IDFlNTgwMGQuLjJhYWI1NmQgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzExLmgKKysrIGIvc3JjL2FwL2llZWU4MDJfMTEuaApAQCAtNTMsNiArNTMsOSBAQAogdm9pZCBob3N0YXBkX2dldF9odF9jYXBhYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRfY2FwLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqbmVnX2h0X2NhcCk7Cit2b2lkIGhvc3RhcGRfZ2V0X3ZodF9jYXBhYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICp2aHRfY2FwLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICpuZWdfdmh0X2NhcCk7CiB1MTYgY29weV9zdGFfaHRfY2FwYWIoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCSAgICAgIGNvbnN0IHU4ICpodF9jYXBhYiwgc2l6ZV90IGh0X2NhcGFiX2xlbik7CiB2b2lkIHVwZGF0ZV9odF9zdGF0ZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CmRpZmYgLS1naXQgYS9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMgYi9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmMKaW5kZXggNjNhZTM0NS4uYzMxMWU1NSAxMDA2NDQKLS0tIGEvc3JjL2FwL2llZWU4MDJfMTFfYXV0aC5jCisrKyBiL3NyYy9hcC9pZWVlODAyXzExX2F1dGguYwpAQCAtMzYsOCArMzYsNyBAQAogCXUzMiBzZXNzaW9uX3RpbWVvdXQ7CiAJdTMyIGFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKIAlpbnQgdmxhbl9pZDsKLQlpbnQgaGFzX3BzazsKLQl1OCBwc2tbUE1LX0xFTl07CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBzazsKIAljaGFyICppZGVudGl0eTsKIAljaGFyICpyYWRpdXNfY3VpOwogfTsKQEAgLTU4LDYgKzU3LDcgQEAKIHsKIAlvc19mcmVlKGUtPmlkZW50aXR5KTsKIAlvc19mcmVlKGUtPnJhZGl1c19jdWkpOworCWhvc3RhcGRfZnJlZV9wc2tfbGlzdChlLT5wc2spOwogCW9zX2ZyZWUoZSk7CiB9CiAKQEAgLTc0LDExICs3NCwzNCBAQAogfQogCiAKK3N0YXRpYyB2b2lkIGNvcHlfcHNrX2xpc3Qoc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKipwc2ssCisJCQkgIHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpzcmMpCit7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKipjb3B5X3RvOworCXN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpjb3B5X2Zyb207CisKKwkvKiBDb3B5IFBTSyBsaW5rZWQgbGlzdCAqLworCWNvcHlfdG8gPSBwc2s7CisJY29weV9mcm9tID0gc3JjOworCXdoaWxlIChjb3B5X2Zyb20gJiYgY29weV90bykgeworCQkqY29weV90byA9IG9zX3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQpKTsKKwkJaWYgKCpjb3B5X3RvID09IE5VTEwpCisJCQlicmVhazsKKwkJb3NfbWVtY3B5KCpjb3B5X3RvLCBjb3B5X2Zyb20sCisJCQkgIHNpemVvZihzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCkpOworCQljb3B5X2Zyb20gPSBjb3B5X2Zyb20tPm5leHQ7CisJCWNvcHlfdG8gPSAmKCgqY29weV90byktPm5leHQpOworCX0KKwlpZiAoY29weV90bykKKwkJKmNvcHlfdG8gPSBOVUxMOworfQorCisKIHN0YXRpYyBpbnQgaG9zdGFwZF9hY2xfY2FjaGVfZ2V0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJCSB1MzIgKnNlc3Npb25fdGltZW91dCwKIAkJCQkgdTMyICphY2N0X2ludGVyaW1faW50ZXJ2YWwsIGludCAqdmxhbl9pZCwKLQkJCQkgdTggKnBzaywgaW50ICpoYXNfcHNrLCBjaGFyICoqaWRlbnRpdHksCi0JCQkJIGNoYXIgKipyYWRpdXNfY3VpKQorCQkJCSBzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqKnBzaywKKwkJCQkgY2hhciAqKmlkZW50aXR5LCBjaGFyICoqcmFkaXVzX2N1aSkKIHsKIAlzdHJ1Y3QgaG9zdGFwZF9jYWNoZWRfcmFkaXVzX2FjbCAqZW50cnk7CiAJc3RydWN0IG9zX3RpbWUgbm93OwpAQCAtOTksMTAgKzEyMiw3IEBACiAJCQkJZW50cnktPmFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKIAkJaWYgKHZsYW5faWQpCiAJCQkqdmxhbl9pZCA9IGVudHJ5LT52bGFuX2lkOwotCQlpZiAocHNrKQotCQkJb3NfbWVtY3B5KHBzaywgZW50cnktPnBzaywgUE1LX0xFTik7Ci0JCWlmIChoYXNfcHNrKQotCQkJKmhhc19wc2sgPSBlbnRyeS0+aGFzX3BzazsKKwkJY29weV9wc2tfbGlzdChwc2ssIGVudHJ5LT5wc2spOwogCQlpZiAoaWRlbnRpdHkpIHsKIAkJCWlmIChlbnRyeS0+aWRlbnRpdHkpCiAJCQkJKmlkZW50aXR5ID0gb3Nfc3RyZHVwKGVudHJ5LT5pZGVudGl0eSk7CkBAIC0yMDAsOCArMjIwLDcgQEAKICAqIEBzZXNzaW9uX3RpbWVvdXQ6IEJ1ZmZlciBmb3IgcmV0dXJuaW5nIHNlc3Npb24gdGltZW91dCAoZnJvbSBSQURJVVMpCiAgKiBAYWNjdF9pbnRlcmltX2ludGVydmFsOiBCdWZmZXIgZm9yIHJldHVybmluZyBhY2NvdW50IGludGVydmFsIChmcm9tIFJBRElVUykKICAqIEB2bGFuX2lkOiBCdWZmZXIgZm9yIHJldHVybmluZyBWTEFOIElECi0gKiBAcHNrOiBCdWZmZXIgZm9yIHJldHVybmluZyBXUEEgUFNLCi0gKiBAaGFzX3BzazogQnVmZmVyIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgcHNrIHdhcyBmaWxsZWQKKyAqIEBwc2s6IExpbmtlZCBsaXN0IGJ1ZmZlciBmb3IgcmV0dXJuaW5nIFdQQSBQU0sKICAqIEBpZGVudGl0eTogQnVmZmVyIGZvciByZXR1cm5pbmcgaWRlbnRpdHkgKGZyb20gUkFESVVTKQogICogQHJhZGl1c19jdWk6IEJ1ZmZlciBmb3IgcmV0dXJuaW5nIENVSSAoZnJvbSBSQURJVVMpCiAgKiBSZXR1cm5zOiBIT1NUQVBEX0FDTF9BQ0NFUFQsIEhPU1RBUERfQUNMX1JFSkVDVCwgb3IgSE9TVEFQRF9BQ0xfUEVORElORwpAQCAtMjEyLDggKzIzMSw4IEBACiBpbnQgaG9zdGFwZF9hbGxvd2VkX2FkZHJlc3Moc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsCiAJCQkgICAgY29uc3QgdTggKm1zZywgc2l6ZV90IGxlbiwgdTMyICpzZXNzaW9uX3RpbWVvdXQsCiAJCQkgICAgdTMyICphY2N0X2ludGVyaW1faW50ZXJ2YWwsIGludCAqdmxhbl9pZCwKLQkJCSAgICB1OCAqcHNrLCBpbnQgKmhhc19wc2ssIGNoYXIgKippZGVudGl0eSwKLQkJCSAgICBjaGFyICoqcmFkaXVzX2N1aSkKKwkJCSAgICBzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqKnBzaywKKwkJCSAgICBjaGFyICoqaWRlbnRpdHksIGNoYXIgKipyYWRpdXNfY3VpKQogewogCWlmIChzZXNzaW9uX3RpbWVvdXQpCiAJCSpzZXNzaW9uX3RpbWVvdXQgPSAwOwpAQCAtMjIxLDEwICsyNDAsOCBAQAogCQkqYWNjdF9pbnRlcmltX2ludGVydmFsID0gMDsKIAlpZiAodmxhbl9pZCkKIAkJKnZsYW5faWQgPSAwOwotCWlmIChoYXNfcHNrKQotCQkqaGFzX3BzayA9IDA7CiAJaWYgKHBzaykKLQkJb3NfbWVtc2V0KHBzaywgMCwgUE1LX0xFTik7CisJCSpwc2sgPSBOVUxMOwogCWlmIChpZGVudGl0eSkKIAkJKmlkZW50aXR5ID0gTlVMTDsKIAlpZiAocmFkaXVzX2N1aSkKQEAgLTI1Myw3ICsyNzAsNyBAQAogCQkvKiBDaGVjayB3aGV0aGVyIEFDTCBjYWNoZSBoYXMgYW4gZW50cnkgZm9yIHRoaXMgc3RhdGlvbiAqLwogCQlpbnQgcmVzID0gaG9zdGFwZF9hY2xfY2FjaGVfZ2V0KGhhcGQsIGFkZHIsIHNlc3Npb25fdGltZW91dCwKIAkJCQkJCWFjY3RfaW50ZXJpbV9pbnRlcnZhbCwKLQkJCQkJCXZsYW5faWQsIHBzaywgaGFzX3BzaywKKwkJCQkJCXZsYW5faWQsIHBzaywKIAkJCQkJCWlkZW50aXR5LCByYWRpdXNfY3VpKTsKIAkJaWYgKHJlcyA9PSBIT1NUQVBEX0FDTF9BQ0NFUFQgfHwKIAkJICAgIHJlcyA9PSBIT1NUQVBEX0FDTF9BQ0NFUFRfVElNRU9VVCkKQEAgLTM5Niw2ICs0MTMsNTQgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBkZWNvZGVfdHVubmVsX3Bhc3N3b3JkcyhzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJCSAgICBjb25zdCB1OCAqc2hhcmVkX3NlY3JldCwKKwkJCQkgICAgc2l6ZV90IHNoYXJlZF9zZWNyZXRfbGVuLAorCQkJCSAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLAorCQkJCSAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgaG9zdGFwZF9jYWNoZWRfcmFkaXVzX2FjbCAqY2FjaGUpCit7CisJaW50IHBhc3NwaHJhc2VsZW47CisJY2hhciAqcGFzc3BocmFzZSwgKnN0cnBhc3NwaHJhc2U7CisJc2l6ZV90IGk7CisJc3RydWN0IGhvc3RhcGRfc3RhX3dwYV9wc2tfc2hvcnQgKnBzazsKKworCS8qCisJICogRGVjb2RlIGFsbCB0dW5uZWwgcGFzc3dvcmRzIGFzIFBTSyBhbmQgc2F2ZSB0aGVtIGludG8gYSBsaW5rZWQgbGlzdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlwYXNzcGhyYXNlID0gcmFkaXVzX21zZ19nZXRfdHVubmVsX3Bhc3N3b3JkKAorCQkJbXNnLCAmcGFzc3BocmFzZWxlbiwgc2hhcmVkX3NlY3JldCwgc2hhcmVkX3NlY3JldF9sZW4sCisJCQlyZXEsIGkpOworCQkvKgorCQkgKiBQYXNzcGhyYXNlIGlzIE5VTEwgaWZmIHRoZXJlIGlzIG5vIGktdGggVHVubmVsLVBhc3N3b3JkCisJCSAqIGF0dHJpYnV0ZSBpbiBtc2cuCisJCSAqLworCQlpZiAocGFzc3BocmFzZSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIHBhc3NwaHJhc2UgZG9lcyBub3QgY29udGFpbiB0aGUgTlVMTCB0ZXJtaW5hdGlvbi4KKwkJICogQWRkIGl0IGhlcmUgYXMgcGJrZGYyX3NoYTEoKSByZXF1aXJlcyBpdC4KKwkJICovCisJCXN0cnBhc3NwaHJhc2UgPSBvc196YWxsb2MocGFzc3BocmFzZWxlbiArIDEpOworCQlwc2sgPSBvc196YWxsb2Moc2l6ZW9mKHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0KSk7CisJCWlmIChzdHJwYXNzcGhyYXNlICYmIHBzaykgeworCQkJb3NfbWVtY3B5KHN0cnBhc3NwaHJhc2UsIHBhc3NwaHJhc2UsIHBhc3NwaHJhc2VsZW4pOworCQkJcGJrZGYyX3NoYTEoc3RycGFzc3BocmFzZSwKKwkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLAorCQkJCSAgICBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuLCA0MDk2LAorCQkJCSAgICBwc2stPnBzaywgUE1LX0xFTik7CisJCQlwc2stPm5leHQgPSBjYWNoZS0+cHNrOworCQkJY2FjaGUtPnBzayA9IHBzazsKKwkJCXBzayA9IE5VTEw7CisJCX0KKwkJb3NfZnJlZShzdHJwYXNzcGhyYXNlKTsKKwkJb3NfZnJlZShwc2spOworCQlvc19mcmVlKHBhc3NwaHJhc2UpOworCX0KK30KKworCiAvKioKICAqIGhvc3RhcGRfYWNsX3JlY3ZfcmFkaXVzIC0gUHJvY2VzcyBpbmNvbWluZyBSQURJVVMgQXV0aGVudGljYXRpb24gbWVzc2FnZXMKICAqIEBtc2c6IFJBRElVUyByZXNwb25zZSBtZXNzYWdlCkBAIC00NTQsOCArNTE5LDYgQEAKIAljYWNoZS0+dGltZXN0YW1wID0gdC5zZWM7CiAJb3NfbWVtY3B5KGNhY2hlLT5hZGRyLCBxdWVyeS0+YWRkciwgc2l6ZW9mKGNhY2hlLT5hZGRyKSk7CiAJaWYgKGhkci0+Y29kZSA9PSBSQURJVVNfQ09ERV9BQ0NFU1NfQUNDRVBUKSB7Ci0JCWludCBwYXNzcGhyYXNlbGVuOwotCQljaGFyICpwYXNzcGhyYXNlOwogCQl1OCAqYnVmOwogCQlzaXplX3QgbGVuOwogCkBAIC00NzgsMjcgKzU0MSw5IEBACiAKIAkJY2FjaGUtPnZsYW5faWQgPSByYWRpdXNfbXNnX2dldF92bGFuaWQobXNnKTsKIAotCQlwYXNzcGhyYXNlID0gcmFkaXVzX21zZ19nZXRfdHVubmVsX3Bhc3N3b3JkKAotCQkJbXNnLCAmcGFzc3BocmFzZWxlbiwKLQkJCWhhcGQtPmNvbmYtPnJhZGl1cy0+YXV0aF9zZXJ2ZXItPnNoYXJlZF9zZWNyZXQsCi0JCQloYXBkLT5jb25mLT5yYWRpdXMtPmF1dGhfc2VydmVyLT5zaGFyZWRfc2VjcmV0X2xlbiwKLQkJCXJlcSk7Ci0JCWNhY2hlLT5oYXNfcHNrID0gcGFzc3BocmFzZSAhPSBOVUxMOwotCQlpZiAocGFzc3BocmFzZSAhPSBOVUxMKSB7Ci0JCQkvKiBwYXNzcGhyYXNlIGRvZXMgbm90IGNvbnRhaW4gdGhlIE5VTEwgdGVybWluYXRpb24uCi0JCQkgKiBBZGQgaXQgaGVyZSBhcyBwYmtkZjJfc2hhMSByZXF1aXJlcyBpdC4gKi8KLQkJCWNoYXIgKnN0cnBhc3NwaHJhc2UgPSBvc196YWxsb2MocGFzc3BocmFzZWxlbiArIDEpOwotCQkJaWYgKHN0cnBhc3NwaHJhc2UpIHsKLQkJCQlvc19tZW1jcHkoc3RycGFzc3BocmFzZSwgcGFzc3BocmFzZSwKLQkJCQkJICBwYXNzcGhyYXNlbGVuKTsKLQkJCQlwYmtkZjJfc2hhMShzdHJwYXNzcGhyYXNlLAotCQkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkLAotCQkJCQkgICAgaGFwZC0+Y29uZi0+c3NpZC5zc2lkX2xlbiwgNDA5NiwKLQkJCQkJICAgIGNhY2hlLT5wc2ssIFBNS19MRU4pOwotCQkJCW9zX2ZyZWUoc3RycGFzc3BocmFzZSk7Ci0JCQl9Ci0JCQlvc19mcmVlKHBhc3NwaHJhc2UpOwotCQl9CisJCWRlY29kZV90dW5uZWxfcGFzc3dvcmRzKGhhcGQsIHNoYXJlZF9zZWNyZXQsIHNoYXJlZF9zZWNyZXRfbGVuLAorCQkJCQltc2csIHJlcSwgY2FjaGUpOworCiAJCWlmIChyYWRpdXNfbXNnX2dldF9hdHRyX3B0cihtc2csIFJBRElVU19BVFRSX1VTRVJfTkFNRSwKIAkJCQkJICAgICZidWYsICZsZW4sIE5VTEwpID09IDApIHsKIAkJCWNhY2hlLT5pZGVudGl0eSA9IG9zX3phbGxvYyhsZW4gKyAxKTsKQEAgLTUxNCw3ICs1NTksNyBAQAogCQl9CiAKIAkJaWYgKGhhcGQtPmNvbmYtPndwYV9wc2tfcmFkaXVzID09IFBTS19SQURJVVNfUkVRVUlSRUQgJiYKLQkJICAgICFjYWNoZS0+aGFzX3BzaykKKwkJICAgICFjYWNoZS0+cHNrKQogCQkJY2FjaGUtPmFjY2VwdGVkID0gSE9TVEFQRF9BQ0xfUkVKRUNUOwogCX0gZWxzZQogCQljYWNoZS0+YWNjZXB0ZWQgPSBIT1NUQVBEX0FDTF9SRUpFQ1Q7CkBAIC01ODYsMyArNjMxLDEzIEBACiAJCWhvc3RhcGRfYWNsX3F1ZXJ5X2ZyZWUocHJldik7CiAJfQogfQorCisKK3ZvaWQgaG9zdGFwZF9mcmVlX3Bza19saXN0KHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpwc2spCit7CisJd2hpbGUgKHBzaykgeworCQlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqcHJldiA9IHBzazsKKwkJcHNrID0gcHNrLT5uZXh0OworCQlvc19mcmVlKHByZXYpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExX2F1dGguaCBiL3NyYy9hcC9pZWVlODAyXzExX2F1dGguaAppbmRleCAwZThkMWNiLi4yYmMxMDY1IDEwMDY0NAotLS0gYS9zcmMvYXAvaWVlZTgwMl8xMV9hdXRoLmgKKysrIGIvc3JjL2FwL2llZWU4MDJfMTFfYXV0aC5oCkBAIC0xOSw5ICsxOSwxMCBAQAogaW50IGhvc3RhcGRfYWxsb3dlZF9hZGRyZXNzKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJICAgIGNvbnN0IHU4ICptc2csIHNpemVfdCBsZW4sIHUzMiAqc2Vzc2lvbl90aW1lb3V0LAogCQkJICAgIHUzMiAqYWNjdF9pbnRlcmltX2ludGVydmFsLCBpbnQgKnZsYW5faWQsCi0JCQkgICAgdTggKnBzaywgaW50ICpoYXNfcHNrLCBjaGFyICoqaWRlbnRpdHksCi0JCQkgICAgY2hhciAqKnJhZGl1c19jdWkpOworCQkJICAgIHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICoqcHNrLAorCQkJICAgIGNoYXIgKippZGVudGl0eSwgY2hhciAqKnJhZGl1c19jdWkpOwogaW50IGhvc3RhcGRfYWNsX2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CiB2b2lkIGhvc3RhcGRfYWNsX2RlaW5pdChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKTsKK3ZvaWQgaG9zdGFwZF9mcmVlX3Bza19saXN0KHN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpwc2spOwogCiAjZW5kaWYgLyogSUVFRTgwMl8xMV9BVVRIX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzExX3NoYXJlZC5jIGIvc3JjL2FwL2llZWU4MDJfMTFfc2hhcmVkLmMKaW5kZXggYjNmZGYzZC4uNzZmNzhhNyAxMDA2NDQKLS0tIGEvc3JjL2FwL2llZWU4MDJfMTFfc2hhcmVkLmMKKysrIGIvc3JjL2FwL2llZWU4MDJfMTFfc2hhcmVkLmMKQEAgLTE3Myw2ICsxNzMsMTQgQEAKIAkJbGVuID0gNTsKIAlpZiAobGVuIDwgNCAmJiBoYXBkLT5jb25mLT5pbnRlcndvcmtpbmcpCiAJCWxlbiA9IDQ7CisJaWYgKGxlbiA8IDMgJiYgaGFwZC0+Y29uZi0+d25tX3NsZWVwX21vZGUpCisJCWxlbiA9IDM7CisJaWYgKGxlbiA8IDcgJiYgaGFwZC0+Y29uZi0+c3NpZC51dGY4X3NzaWQpCisJCWxlbiA9IDc7CisjaWZkZWYgQ09ORklHX1dOTQorCWlmIChsZW4gPCA0KQorCQlsZW4gPSA0OworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAlpZiAobGVuID09IDApCiAJCXJldHVybiBlaWQ7CiAKQEAgLTE4MCw5ICsxODgsMjAgQEAKIAkqcG9zKysgPSBsZW47CiAJKnBvcysrID0gMHgwMDsKIAkqcG9zKysgPSAweDAwOwotCSpwb3MrKyA9IDB4MDA7CiAKIAkqcG9zID0gMHgwMDsKKwlpZiAoaGFwZC0+Y29uZi0+d25tX3NsZWVwX21vZGUpCisJCSpwb3MgfD0gMHgwMjsgLyogQml0IDE3IC0gV05NLVNsZWVwIE1vZGUgKi8KKwlpZiAoaGFwZC0+Y29uZi0+YnNzX3RyYW5zaXRpb24pCisJCSpwb3MgfD0gMHgwODsgLyogQml0IDE5IC0gQlNTIFRyYW5zaXRpb24gKi8KKwlwb3MrKzsKKworCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gcG9zOworCSpwb3MgPSAweDAwOworI2lmZGVmIENPTkZJR19XTk0KKwkqcG9zIHw9IDB4MDI7IC8qIEJpdCAyNSAtIFNTSUQgTGlzdCAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAlpZiAoaGFwZC0+Y29uZi0+dGltZV9hZHZlcnRpc2VtZW50ID09IDIpCiAJCSpwb3MgfD0gMHgwODsgLyogQml0IDI3IC0gVVRDIFRTRiBPZmZzZXQgKi8KIAlpZiAoaGFwZC0+Y29uZi0+aW50ZXJ3b3JraW5nKQpAQCAtMTk4LDYgKzIxNywxOCBAQAogCQkqcG9zIHw9IDB4ODA7IC8qIEJpdCAzOSAtIFRETFMgQ2hhbm5lbCBTd2l0Y2hpbmcgUHJvaGliaXRlZCAqLwogCXBvcysrOwogCisJaWYgKGxlbiA8IDYpCisJCXJldHVybiBwb3M7CisJKnBvcyA9IDB4MDA7CisJcG9zKys7CisKKwlpZiAobGVuIDwgNykKKwkJcmV0dXJuIHBvczsKKwkqcG9zID0gMHgwMDsKKwlpZiAoaGFwZC0+Y29uZi0+c3NpZC51dGY4X3NzaWQpCisJCSpwb3MgfD0gMHgwMTsgLyogQml0IDQ4IC0gVVRGLTggU1NJRCAqLworCXBvcysrOworCiAJcmV0dXJuIHBvczsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2FwL2llZWU4MDJfMTFfdmh0LmMgYi9zcmMvYXAvaWVlZTgwMl8xMV92aHQuYwppbmRleCA3NTk5ZWY4Li5mNmNjNWQ2IDEwMDY0NAotLS0gYS9zcmMvYXAvaWVlZTgwMl8xMV92aHQuYworKysgYi9zcmMvYXAvaWVlZTgwMl8xMV92aHQuYwpAQCAtNjgsNiArNjgsOCBAQAogCSAqLwogCW9wZXItPnZodF9vcF9pbmZvX2NoYW5fY2VudGVyX2ZyZXFfc2VnMF9pZHggPQogCQloYXBkLT5pY29uZi0+dmh0X29wZXJfY2VudHJfZnJlcV9zZWcwX2lkeDsKKwlvcGVyLT52aHRfb3BfaW5mb19jaGFuX2NlbnRlcl9mcmVxX3NlZzFfaWR4ID0KKwkJaGFwZC0+aWNvbmYtPnZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMV9pZHg7CiAKIAlvcGVyLT52aHRfb3BfaW5mb19jaHdpZHRoID0gaGFwZC0+aWNvbmYtPnZodF9vcGVyX2Nod2lkdGg7CiAKQEAgLTEwNiwzICsxMDgsMTQgQEAKIAogCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOwogfQorCit2b2lkIGhvc3RhcGRfZ2V0X3ZodF9jYXBhYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICp2aHRfY2FwLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwYWJpbGl0aWVzICpuZWdfdmh0X2NhcCkKK3sKKwlpZiAodmh0X2NhcCA9PSBOVUxMKQorCQlyZXR1cm47CisJb3NfbWVtY3B5KG5lZ192aHRfY2FwLCB2aHRfY2FwLCBzaXplb2YoKm5lZ192aHRfY2FwKSk7CisKKwkvKiBUT0RPOiBtYXNrIG93biBjYXBhYmlsaXRpZXMsIGxpa2UgZ2V0X2h0X2NhcGFiKCkgKi8KK30KZGlmZiAtLWdpdCBhL3NyYy9hcC9pZWVlODAyXzF4LmMgYi9zcmMvYXAvaWVlZTgwMl8xeC5jCmluZGV4IGM0ZDNkYTguLmE4MzJhNzMgMTAwNjQ0Ci0tLSBhL3NyYy9hcC9pZWVlODAyXzF4LmMKKysrIGIvc3JjL2FwL2llZWU4MDJfMXguYwpAQCAtNjYsOCArNjYsOSBAQAogCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfUFJFQVVUSCkgewogCQlyc25fcHJlYXV0aF9zZW5kKGhhcGQsIHN0YSwgYnVmLCBsZW4pOwogCX0gZWxzZSB7Ci0JCWhvc3RhcGRfZHJ2X2hhcGRfc2VuZF9lYXBvbChoYXBkLCBzdGEtPmFkZHIsIGJ1ZiwgbGVuLAotCQkJCQkgICAgZW5jcnlwdCwgc3RhLT5mbGFncyk7CisJCWhvc3RhcGRfZHJ2X2hhcGRfc2VuZF9lYXBvbCgKKwkJCWhhcGQsIHN0YS0+YWRkciwgYnVmLCBsZW4sCisJCQllbmNyeXB0LCBob3N0YXBkX3N0YV9mbGFnc190b19kcnYoc3RhLT5mbGFncykpOwogCX0KIAogCW9zX2ZyZWUoYnVmKTsKQEAgLTk5LDggKzEwMCwxMCBAQAogCQkgICAgICAgImRyaXZlciAoZXJybm89JWQpLlxuIiwgTUFDMlNUUihzdGEtPmFkZHIpLCBlcnJubyk7CiAJfQogCi0JaWYgKGF1dGhvcml6ZWQpCisJaWYgKGF1dGhvcml6ZWQpIHsKKwkJb3NfZ2V0X3RpbWUoJnN0YS0+Y29ubmVjdGVkX3RpbWUpOwogCQlhY2NvdW50aW5nX3N0YV9zdGFydChoYXBkLCBzdGEpOworCX0KIH0KIAogCkBAIC0zNTIsNiArMzU1LDggQEAKIGNvbnN0IGNoYXIgKnJhZGl1c19tb2RlX3R4dChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKQogewogCXN3aXRjaCAoaGFwZC0+aWZhY2UtPmNvbmYtPmh3X21vZGUpIHsKKwljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBRDoKKwkJcmV0dXJuICI4MDIuMTFhZCI7CiAJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQToKIAkJcmV0dXJuICI4MDIuMTFhIjsKIAljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFHOgpAQCAtNDUwLDYgKzQ1NSwxNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKHN0YS0+YWNjdF9zZXNzaW9uX2lkX2hpIHx8IHN0YS0+YWNjdF9zZXNzaW9uX2lkX2xvKSB7CisJCW9zX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDhYLSUwOFgiLAorCQkJICAgIHN0YS0+YWNjdF9zZXNzaW9uX2lkX2hpLCBzdGEtPmFjY3Rfc2Vzc2lvbl9pZF9sbyk7CisJCWlmICghcmFkaXVzX21zZ19hZGRfYXR0cihtc2csIFJBRElVU19BVFRSX0FDQ1RfU0VTU0lPTl9JRCwKKwkJCQkJICh1OCAqKSBidWYsIG9zX3N0cmxlbihidWYpKSkgeworCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJDb3VsZCBub3QgYWRkIEFjY3QtU2Vzc2lvbi1JZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2ODQsOCArMTY5OSw3IEBACiAJY29uc3Qgc3RydWN0IGhvc3RhcGRfZWFwX3VzZXIgKmVhcF91c2VyOwogCWludCBpOwogCi0JZWFwX3VzZXIgPSBob3N0YXBkX2dldF9lYXBfdXNlcihoYXBkLT5jb25mLCBpZGVudGl0eSwKLQkJCQkJaWRlbnRpdHlfbGVuLCBwaGFzZTIpOworCWVhcF91c2VyID0gaG9zdGFwZF9nZXRfZWFwX3VzZXIoaGFwZCwgaWRlbnRpdHksIGlkZW50aXR5X2xlbiwgcGhhc2UyKTsKIAlpZiAoZWFwX3VzZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCmRpZmYgLS1naXQgYS9zcmMvYXAvcG1rc2FfY2FjaGVfYXV0aC5jIGIvc3JjL2FwL3Bta3NhX2NhY2hlX2F1dGguYwppbmRleCBiYTJjMDMzLi5kMjdmZDMwIDEwMDY0NAotLS0gYS9zcmMvYXAvcG1rc2FfY2FjaGVfYXV0aC5jCisrKyBiL3NyYy9hcC9wbWtzYV9jYWNoZV9hdXRoLmMKQEAgLTk1LDExICs5NSw5IEBACiAKIAlvc19nZXRfdGltZSgmbm93KTsKIAl3aGlsZSAocG1rc2EtPnBta3NhICYmIHBta3NhLT5wbWtzYS0+ZXhwaXJhdGlvbiA8PSBub3cuc2VjKSB7Ci0JCXN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5ID0gcG1rc2EtPnBta3NhOwotCQlwbWtzYS0+cG1rc2EgPSBlbnRyeS0+bmV4dDsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IGV4cGlyZWQgUE1LU0EgY2FjaGUgZW50cnkgZm9yICIKLQkJCSAgIE1BQ1NUUiwgTUFDMlNUUihlbnRyeS0+c3BhKSk7Ci0JCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIGVudHJ5KTsKKwkJCSAgIE1BQ1NUUiwgTUFDMlNUUihwbWtzYS0+cG1rc2EtPnNwYSkpOworCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBwbWtzYS0+cG1rc2EpOwogCX0KIAogCXBta3NhX2NhY2hlX3NldF9leHBpcmF0aW9uKHBta3NhKTsKQEAgLTIxMSw2ICsyMDksOCBAQAogCXBta3NhLT5wbWtpZFtQTUtJRF9IQVNIKGVudHJ5LT5wbWtpZCldID0gZW50cnk7CiAKIAlwbWtzYS0+cG1rc2FfY291bnQrKzsKKwlpZiAocHJldiA9PSBOVUxMKQorCQlwbWtzYV9jYWNoZV9zZXRfZXhwaXJhdGlvbihwbWtzYSk7CiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IGFkZGVkIFBNS1NBIGNhY2hlIGVudHJ5IGZvciAiIE1BQ1NUUiwKIAkJICAgTUFDMlNUUihlbnRyeS0+c3BhKSk7CiAJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiUlNOOiBhZGRlZCBQTUtJRCIsIGVudHJ5LT5wbWtpZCwgUE1LSURfTEVOKTsKZGlmZiAtLWdpdCBhL3NyYy9hcC9zdGFfaW5mby5jIGIvc3JjL2FwL3N0YV9pbmZvLmMKaW5kZXggZDYxMTc3Zi4uOGFkYTEyMSAxMDA2NDQKLS0tIGEvc3JjL2FwL3N0YV9pbmZvLmMKKysrIGIvc3JjL2FwL3N0YV9pbmZvLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJ1dGlscy9lbG9vcC5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2RlZnMuaCIKICNpbmNsdWRlICJjb21tb24vd3BhX2N0cmwuaCIKKyNpbmNsdWRlICJjb21tb24vc2FlLmgiCiAjaW5jbHVkZSAicmFkaXVzL3JhZGl1cy5oIgogI2luY2x1ZGUgInJhZGl1cy9yYWRpdXNfY2xpZW50LmgiCiAjaW5jbHVkZSAiZHJpdmVycy9kcml2ZXIuaCIKQEAgLTIwLDYgKzIxLDcgQEAKICNpbmNsdWRlICJhY2NvdW50aW5nLmgiCiAjaW5jbHVkZSAiaWVlZTgwMl8xeC5oIgogI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKyNpbmNsdWRlICJpZWVlODAyXzExX2F1dGguaCIKICNpbmNsdWRlICJ3cGFfYXV0aC5oIgogI2luY2x1ZGUgInByZWF1dGhfYXV0aC5oIgogI2luY2x1ZGUgImFwX2NvbmZpZy5oIgpAQCAtMjMyLDEyICsyMzQsMTggQEAKIAogCXdwYWJ1Zl9mcmVlKHN0YS0+d3BzX2llKTsKIAl3cGFidWZfZnJlZShzdGEtPnAycF9pZSk7CisJd3BhYnVmX2ZyZWUoc3RhLT5oczIwX2llKTsKIAogCW9zX2ZyZWUoc3RhLT5odF9jYXBhYmlsaXRpZXMpOwotCW9zX2ZyZWUoc3RhLT5wc2spOworCWhvc3RhcGRfZnJlZV9wc2tfbGlzdChzdGEtPnBzayk7CiAJb3NfZnJlZShzdGEtPmlkZW50aXR5KTsKIAlvc19mcmVlKHN0YS0+cmFkaXVzX2N1aSk7CiAKKyNpZmRlZiBDT05GSUdfU0FFCisJc2FlX2NsZWFyX2RhdGEoc3RhLT5zYWUpOworCW9zX2ZyZWUoc3RhLT5zYWUpOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KKwogCW9zX2ZyZWUoc3RhKTsKIH0KIApAQCAtNDkxLDYgKzQ5OSw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlzdGEtPmFjY3RfaW50ZXJpbV9pbnRlcnZhbCA9IGhhcGQtPmNvbmYtPmFjY3RfaW50ZXJpbV9pbnRlcnZhbDsKKwlhY2NvdW50aW5nX3N0YV9nZXRfaWQoaGFwZCwgc3RhKTsKIAogCS8qIGluaXRpYWxpemUgU1RBIGluZm8gZGF0YSAqLwogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXM6IHJlZ2lzdGVyIGFwX2hhbmRsZV90aW1lciB0aW1lb3V0ICIKZGlmZiAtLWdpdCBhL3NyYy9hcC9zdGFfaW5mby5oIGIvc3JjL2FwL3N0YV9pbmZvLmgKaW5kZXggYjNjNTdiNC4uMzJlYTQ2ZSAxMDA2NDQKLS0tIGEvc3JjL2FwL3N0YV9pbmZvLmgKKysrIGIvc3JjL2FwL3N0YV9pbmZvLmgKQEAgLTk1LDcgKzk1LDggQEAKIAlzdHJ1Y3QgaG9zdGFwZF9zc2lkICpzc2lkX3Byb2JlOyAvKiBTU0lEIHNlbGVjdGlvbiBiYXNlZCBvbiBQcm9iZVJlcSAqLwogCiAJaW50IHZsYW5faWQ7Ci0JdTggKnBzazsgLyogUFNLIGZyb20gUkFESVVTIGF1dGhlbnRpY2F0aW9uIHNlcnZlciAqLworCSAvKiBQU0tzIGZyb20gUkFESVVTIGF1dGhlbnRpY2F0aW9uIHNlcnZlciAqLworCXN0cnVjdCBob3N0YXBkX3N0YV93cGFfcHNrX3Nob3J0ICpwc2s7CiAKIAljaGFyICppZGVudGl0eTsgLyogVXNlci1OYW1lIGZyb20gUkFESVVTICovCiAJY2hhciAqcmFkaXVzX2N1aTsgLyogQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IGZyb20gUkFESVVTICovCkBAIC0xMjEsNiArMTIyLDEzIEBACiAKIAlzdHJ1Y3Qgd3BhYnVmICp3cHNfaWU7IC8qIFdQUyBJRSBmcm9tIChSZSlBc3NvY2lhdGlvbiBSZXF1ZXN0ICovCiAJc3RydWN0IHdwYWJ1ZiAqcDJwX2llOyAvKiBQMlAgSUUgZnJvbSAoUmUpQXNzb2NpYXRpb24gUmVxdWVzdCAqLworCXN0cnVjdCB3cGFidWYgKmhzMjBfaWU7IC8qIEhTIDIuMCBJRSBmcm9tIChSZSlBc3NvY2lhdGlvbiBSZXF1ZXN0ICovCisKKwlzdHJ1Y3Qgb3NfdGltZSBjb25uZWN0ZWRfdGltZTsKKworI2lmZGVmIENPTkZJR19TQUUKKwlzdHJ1Y3Qgc2FlX2RhdGEgKnNhZTsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5jIGIvc3JjL2FwL3RraXBfY291bnRlcm1lYXN1cmVzLmMKaW5kZXggZGQ1YWE2OC4uNGEyZWEwNiAxMDA2NDQKLS0tIGEvc3JjL2FwL3RraXBfY291bnRlcm1lYXN1cmVzLmMKKysrIGIvc3JjL2FwL3RraXBfY291bnRlcm1lYXN1cmVzLmMKQEAgLTY2LDkgKzY2LDEwIEBACiB9CiAKIAotdm9pZCBtaWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLCBpbnQgbG9jYWwpCitpbnQgbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqYWRkciwgaW50IGxvY2FsKQogewogCXN0cnVjdCBvc190aW1lIG5vdzsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChhZGRyICYmIGxvY2FsKSB7CiAJCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gYXBfZ2V0X3N0YShoYXBkLCBhZGRyKTsKQEAgLTg0LDcgKzg1LDcgQEAKIAkJCQkgICAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uICIKIAkJCQkgICAiZm9yIG5vdCBhc3NvY2lhdGVkIFNUQSAoIiBNQUNTVFIKIAkJCQkgICAiKSBpZ25vcmVkIiwgTUFDMlNUUihhZGRyKSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC05Myw4ICs5NCwxMiBAQAogCQloYXBkLT5taWNoYWVsX21pY19mYWlsdXJlcyA9IDE7CiAJfSBlbHNlIHsKIAkJaGFwZC0+bWljaGFlbF9taWNfZmFpbHVyZXMrKzsKLQkJaWYgKGhhcGQtPm1pY2hhZWxfbWljX2ZhaWx1cmVzID4gMSkKKwkJaWYgKGhhcGQtPm1pY2hhZWxfbWljX2ZhaWx1cmVzID4gMSkgewogCQkJaWVlZTgwMjExX3RraXBfY291bnRlcm1lYXN1cmVzX3N0YXJ0KGhhcGQpOworCQkJcmV0ID0gMTsKKwkJfQogCX0KIAloYXBkLT5taWNoYWVsX21pY19mYWlsdXJlID0gbm93LnNlYzsKKworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvYXAvdGtpcF9jb3VudGVybWVhc3VyZXMuaCBiL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5oCmluZGV4IGY3YTY2MjQuLmQzZWFlZDMgMTAwNjQ0Ci0tLSBhL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5oCisrKyBiL3NyYy9hcC90a2lwX2NvdW50ZXJtZWFzdXJlcy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGhvc3RhcGQgLyBUS0lQIGNvdW50ZXJtZWFzdXJlcwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtOSw3ICs5LDcgQEAKICNpZm5kZWYgVEtJUF9DT1VOVEVSTUVBU1VSRVNfSAogI2RlZmluZSBUS0lQX0NPVU5URVJNRUFTVVJFU19ICiAKLXZvaWQgbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjb25zdCB1OCAqYWRkciwgaW50IGxvY2FsKTsKK2ludCBtaWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLCBpbnQgbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfdGtpcF9jb3VudGVybWVhc3VyZXNfZGVpbml0KHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQpOwogCiAjZW5kaWYgLyogVEtJUF9DT1VOVEVSTUVBU1VSRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dubV9hcC5jIGIvc3JjL2FwL3dubV9hcC5jCmluZGV4IDI1OTQ0MDQuLjU0YTZiODUgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93bm1fYXAuYworKysgYi9zcmMvYXAvd25tX2FwLmMKQEAgLTE5LDcgKzE5LDYgQEAKIAogI2RlZmluZSBNQVhfVEZTX0lFX0xFTiAgMTAyNAogCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKIAogLyogZ2V0IHRoZSBURlMgSUUgZnJvbSBkcml2ZXIgKi8KIHN0YXRpYyBpbnQgaWVlZTgwMjExXzExX2dldF90ZnNfaWUoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgY29uc3QgdTggKmFkZHIsCkBAIC01Nyw4ICs1Niw4IEBACiAJdTE2IHdubXRmc19pZV9sZW47CiAJdTggKnBvczsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQllbnVtIHdubV9vcGVyIHRmc19vcGVyID0gYWN0aW9uX3R5cGUgPT0gMCA/IFdOTV9TTEVFUF9URlNfUkVTUF9JRV9BREQgOgotCQlXTk1fU0xFRVBfVEZTX1JFU1BfSUVfTk9ORTsKKwllbnVtIHdubV9vcGVyIHRmc19vcGVyID0gYWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRU5URVIgPworCQlXTk1fU0xFRVBfVEZTX1JFU1BfSUVfQUREIDogV05NX1NMRUVQX1RGU19SRVNQX0lFX05PTkU7CiAKIAlzdGEgPSBhcF9nZXRfc3RhKGhhcGQsIGFkZHIpOwogCWlmIChzdGEgPT0gTlVMTCkgewpAQCAtMTA1LDcgKzEwNCw4IEBACiAJbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVzcC5kaWFsb2d0b2tlbiA9IGRpYWxvZ190b2tlbjsKIAlwb3MgPSAodTggKiltZ210LT51LmFjdGlvbi51LndubV9zbGVlcF9yZXNwLnZhcmlhYmxlOwogCS8qIGFkZCBrZXkgZGF0YSBpZiBNRlAgaXMgZW5hYmxlZCAqLwotCWlmICh3cGFfYXV0aF91c2VzX21mcChzdGEtPndwYV9zbSkgfHwgYWN0aW9uX3R5cGUgIT0gMSl7CisJaWYgKCF3cGFfYXV0aF91c2VzX21mcChzdGEtPndwYV9zbSkgfHwKKwkgICAgYWN0aW9uX3R5cGUgIT0gV05NX1NMRUVQX01PREVfRVhJVCkgewogCQltZ210LT51LmFjdGlvbi51LndubV9zbGVlcF9yZXNwLmtleWRhdGFfbGVuID0gMDsKIAl9IGVsc2UgewogCQlndGtfZWxlbV9sZW4gPSB3cGFfd25tc2xlZXBfZ3RrX3N1YmVsZW0oc3RhLT53cGFfc20sIHBvcyk7CkBAIC0xMzIsNyArMTMyLDggQEAKIAlvc19tZW1jcHkocG9zLCAmd25tc2xlZXBfaWUsIHdubXNsZWVwX2llX2xlbik7CiAJLyogY29weSBURlMgSUUgaGVyZSAqLwogCXBvcyArPSB3bm1zbGVlcF9pZV9sZW47Ci0Jb3NfbWVtY3B5KHBvcywgd25tdGZzX2llLCB3bm10ZnNfaWVfbGVuKTsKKwlpZiAod25tdGZzX2llKQorCQlvc19tZW1jcHkocG9zLCB3bm10ZnNfaWUsIHdubXRmc19pZV9sZW4pOwogCiAJbGVuID0gMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LndubV9zbGVlcF9yZXNwKSArIGd0a19lbGVtX2xlbiArCiAJCWlndGtfZWxlbV9sZW4gKyB3bm1zbGVlcF9pZV9sZW4gKyB3bm10ZnNfaWVfbGVuOwpAQCAtMTUyLDcgKzE1Myw3IEBACiAJCSAqIFdOTSBTbGVlcAogCQkgKi8KIAkJaWYgKHdubXNsZWVwX2llLnN0YXR1cyA9PSBXTk1fU1RBVFVTX1NMRUVQX0FDQ0VQVCAmJgotCQkgICAgd25tc2xlZXBfaWUuYWN0aW9uX3R5cGUgPT0gMCkgeworCQkgICAgd25tc2xlZXBfaWUuYWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRU5URVIpIHsKIAkJCWhvc3RhcGRfZHJ2X3dubV9vcGVyKGhhcGQsIFdOTV9TTEVFUF9FTlRFUl9DT05GSVJNLAogCQkJCQkgICAgIGFkZHIsIE5VTEwsIE5VTEwpOwogCQkJd3BhX3NldF93bm1zbGVlcChzdGEtPndwYV9zbSwgMSk7CkBAIC0xNjIsMTIgKzE2MywxNCBAQAogCQkgKiAyLiBzdGFydCBHVEsvSUdUSyB1cGRhdGUgaWYgTUZQIGlzIG5vdCB1c2VkCiAJCSAqIDMuIHVucGF1c2UgdGhlIG5vZGUgaW4gZHJpdmVyCiAJCSAqLwotCQlpZiAod25tc2xlZXBfaWUuc3RhdHVzID09IFdOTV9TVEFUVVNfU0xFRVBfQUNDRVBUICYmCi0JCSAgICB3bm1zbGVlcF9pZS5hY3Rpb25fdHlwZSA9PSAxKSB7CisJCWlmICgod25tc2xlZXBfaWUuc3RhdHVzID09IFdOTV9TVEFUVVNfU0xFRVBfQUNDRVBUIHx8CisJCSAgICAgd25tc2xlZXBfaWUuc3RhdHVzID09CisJCSAgICAgV05NX1NUQVRVU19TTEVFUF9FWElUX0FDQ0VQVF9HVEtfVVBEQVRFKSAmJgorCQkgICAgd25tc2xlZXBfaWUuYWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRVhJVCkgewogCQkJd3BhX3NldF93bm1zbGVlcChzdGEtPndwYV9zbSwgMCk7CiAJCQlob3N0YXBkX2Rydl93bm1fb3BlcihoYXBkLCBXTk1fU0xFRVBfRVhJVF9DT05GSVJNLAogCQkJCQkgICAgIGFkZHIsIE5VTEwsIE5VTEwpOwotCQkJaWYgKHdwYV9hdXRoX3VzZXNfbWZwKHN0YS0+d3BhX3NtKSAmJiBhY3Rpb25fdHlwZSA9PSAxKQorCQkJaWYgKCF3cGFfYXV0aF91c2VzX21mcChzdGEtPndwYV9zbSkpCiAJCQkJd3BhX3dubXNsZWVwX3Jla2V5X2d0ayhzdGEtPndwYV9zbSk7CiAJCX0KIAl9IGVsc2UKQEAgLTE4NCwyOSArMTg3LDI5IEBACiBzdGF0aWMgdm9pZCBpZWVlODAyXzExX3J4X3dubXNsZWVwX3JlcShzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLAogCQkJCSAgICAgICBjb25zdCB1OCAqYWRkciwgY29uc3QgdTggKmZybSwgaW50IGxlbikKIHsKLQkvKgotCSAqIEFjdGlvbiBbMV0gfCBEaWFsb2cgVG9rZW4gWzFdIHwgV05NLVNsZWVwIE1vZGUgSUUgfAotCSAqIFRGUyBSZXNwb25zZSBJRQotCSAqLwotCXU4ICpwb3MgPSAodTggKikgZnJtOyAvKiBwb2ludCB0byBhY3Rpb24gZmllbGQgKi8KLQl1OCBkaWFsb2dfdG9rZW4gPSBwb3NbMV07CisJLyogRGlhbG9nIFRva2VuIFsxXSB8IFdOTS1TbGVlcCBNb2RlIElFIHwgVEZTIFJlc3BvbnNlIElFICovCisJY29uc3QgdTggKnBvcyA9IGZybTsKKwl1OCBkaWFsb2dfdG9rZW47CiAJc3RydWN0IHdubV9zbGVlcF9lbGVtZW50ICp3bm1zbGVlcF9pZSA9IE5VTEw7CiAJLyogbXVsdGlwbGUgVEZTIFJlcSBJRSAoYXNzdW1pbmcgY29uc2VjdXRpdmUpICovCiAJdTggKnRmc3JlcV9pZV9zdGFydCA9IE5VTEw7CiAJdTggKnRmc3JlcV9pZV9lbmQgPSBOVUxMOwogCXUxNiB0ZnNyZXFfaWVfbGVuID0gMDsKIAotCXBvcyArPSAxICsgMTsKLQl3aGlsZSAocG9zIC0gZnJtIDwgbGVuIC0gMSkgewotCQl1OCBpZV9sZW4gPSAqKHBvcysxKTsKKwlkaWFsb2dfdG9rZW4gPSAqcG9zKys7CisJd2hpbGUgKHBvcyArIDEgPCBmcm0gKyBsZW4pIHsKKwkJdTggaWVfbGVuID0gcG9zWzFdOworCQlpZiAocG9zICsgMiArIGllX2xlbiA+IGZybSArIGxlbikKKwkJCWJyZWFrOwogCQlpZiAoKnBvcyA9PSBXTEFOX0VJRF9XTk1TTEVFUCkKLQkJCXdubXNsZWVwX2llID0gKHN0cnVjdCB3bm1fc2xlZXBfZWxlbWVudCAqKXBvczsKKwkJCXdubXNsZWVwX2llID0gKHN0cnVjdCB3bm1fc2xlZXBfZWxlbWVudCAqKSBwb3M7CiAJCWVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfVEZTX1JFUSkgewogCQkJaWYgKCF0ZnNyZXFfaWVfc3RhcnQpCi0JCQkJdGZzcmVxX2llX3N0YXJ0ID0gcG9zOwotCQkJdGZzcmVxX2llX2VuZCA9IHBvczsKKwkJCQl0ZnNyZXFfaWVfc3RhcnQgPSAodTggKikgcG9zOworCQkJdGZzcmVxX2llX2VuZCA9ICh1OCAqKSBwb3M7CiAJCX0gZWxzZQotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJFSUQgJWQgbm90IHJlY29nbml6ZWQiLCAqcG9zKTsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBFSUQgJWQgbm90IHJlY29nbml6ZWQiLAorCQkJCSAgICpwb3MpOwogCQlwb3MgKz0gaWVfbGVuICsgMjsKIAl9CiAKQEAgLTIxNSw4ICsyMTgsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSAwICYmIHRmc3JlcV9pZV9zdGFydCAmJgotCSAgICB0ZnNyZXFfaWVfZW5kICYmIHRmc3JlcV9pZV9lbmQgLSB0ZnNyZXFfaWVfc3RhcnQgPj0gMCkgeworCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRU5URVIgJiYKKwkgICAgdGZzcmVxX2llX3N0YXJ0ICYmIHRmc3JlcV9pZV9lbmQgJiYKKwkgICAgdGZzcmVxX2llX2VuZCAtIHRmc3JlcV9pZV9zdGFydCA+PSAwKSB7CiAJCXRmc3JlcV9pZV9sZW4gPSAodGZzcmVxX2llX2VuZCArIHRmc3JlcV9pZV9lbmRbMV0gKyAyKSAtCiAJCQl0ZnNyZXFfaWVfc3RhcnQ7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVEZTIFJlcSBJRShzKSBmb3VuZCIpOwpAQCAtMjMxLDcgKzIzNSw3IEBACiAJCQkJICAgICAgd25tc2xlZXBfaWUtPmFjdGlvbl90eXBlLAogCQkJCSAgICAgIHdubXNsZWVwX2llLT5pbnR2YWwpOwogCi0JaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSAxKSB7CisJaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSBXTk1fU0xFRVBfTU9ERV9FWElUKSB7CiAJCS8qIGNsZWFyIHRoZSB0ZnMgYWZ0ZXIgc2VuZGluZyB0aGUgcmVzcCBmcmFtZSAqLwogCQlpZWVlODAyMTFfMTFfc2V0X3Rmc19pZShoYXBkLCBhZGRyLCB0ZnNyZXFfaWVfc3RhcnQsCiAJCQkJCSZ0ZnNyZXFfaWVfbGVuLCBXTk1fU0xFRVBfVEZTX0lFX0RFTCk7CkBAIC0yMzksMjAgKzI0MywyOSBAQAogfQogCiAKLXZvaWQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCi0JCQkJIHN0cnVjdCByeF9hY3Rpb24gKmFjdGlvbikKK2ludCBpZWVlODAyXzExX3J4X3dubV9hY3Rpb25fYXAoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwKKwkJCQlzdHJ1Y3QgcnhfYWN0aW9uICphY3Rpb24pCiB7Ci0JdTggKnBvcyA9ICh1OCAqKSBhY3Rpb24tPmRhdGEgKyAxOyAvKiBwb2ludCB0byB0aGUgYWN0aW9uIGZpZWxkICovCi0JdTggYWN0ID0gKnBvczsKKwlpZiAoYWN0aW9uLT5sZW4gPCAxIHx8IGFjdGlvbi0+ZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CiAKLQlzd2l0Y2ggKGFjdCkgeworCXN3aXRjaCAoYWN0aW9uLT5kYXRhWzBdKSB7CisJY2FzZSBXTk1fQlNTX1RSQU5TX01HTVRfUVVFUlk6CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50IFF1ZXJ5Iik7CisJCS8qIFRPRE8gKi8KKwkJcmV0dXJuIC0xOworCWNhc2UgV05NX0JTU19UUkFOU19NR01UX1JFU1A6CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50ICIKKwkJCSAgICJSZXNwb25zZSIpOworCQkvKiBUT0RPICovCisJCXJldHVybiAtMTsKIAljYXNlIFdOTV9TTEVFUF9NT0RFX1JFUToKIAkJaWVlZTgwMl8xMV9yeF93bm1zbGVlcF9yZXEoaGFwZCwgYWN0aW9uLT5zYSwgYWN0aW9uLT5kYXRhICsgMSwKLQkJCQkJICAgYWN0aW9uLT5sZW4pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJCQkJICAgYWN0aW9uLT5sZW4gLSAxKTsKKwkJcmV0dXJuIDA7CiAJfQotfQogCi0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogVW5zdXBwb3J0ZWQgV05NIEFjdGlvbiAldSBmcm9tICIgTUFDU1RSLAorCQkgICBhY3Rpb24tPmRhdGFbMF0sIE1BQzJTVFIoYWN0aW9uLT5zYSkpOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9hcC93bm1fYXAuaCBiL3NyYy9hcC93bm1fYXAuaAppbmRleCBhYjdjNGYxLi5mMDU3MjZlIDEwMDY0NAotLS0gYS9zcmMvYXAvd25tX2FwLmgKKysrIGIvc3JjL2FwL3dubV9hcC5oCkBAIC0xMSw3ICsxMSw3IEBACiAKIHN0cnVjdCByeF9hY3Rpb247CiAKLXZvaWQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCi0JCQkJIHN0cnVjdCByeF9hY3Rpb24gKmFjdGlvbik7CitpbnQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uX2FwKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCisJCQkJc3RydWN0IHJ4X2FjdGlvbiAqYWN0aW9uKTsKIAogI2VuZGlmIC8qIFdOTV9BUF9IICovCmRpZmYgLS1naXQgYS9zcmMvYXAvd3BhX2F1dGguYyBiL3NyYy9hcC93cGFfYXV0aC5jCmluZGV4IDQ5ZDgxNzUuLmZhNGIxY2IgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aC5jCisrKyBiL3NyYy9hcC93cGFfYXV0aC5jCkBAIC01NCwxMSArNTQsMTIgQEAKIHN0YXRpYyBjb25zdCBpbnQgZG90MTFSU05BQ29uZmlnU0FUaW1lb3V0ID0gNjA7CiAKIAotc3RhdGljIGlubGluZSB2b2lkIHdwYV9hdXRoX21pY19mYWlsdXJlX3JlcG9ydCgKK3N0YXRpYyBpbmxpbmUgaW50IHdwYV9hdXRoX21pY19mYWlsdXJlX3JlcG9ydCgKIAlzdHJ1Y3Qgd3BhX2F1dGhlbnRpY2F0b3IgKndwYV9hdXRoLCBjb25zdCB1OCAqYWRkcikKIHsKIAlpZiAod3BhX2F1dGgtPmNiLm1pY19mYWlsdXJlX3JlcG9ydCkKLQkJd3BhX2F1dGgtPmNiLm1pY19mYWlsdXJlX3JlcG9ydCh3cGFfYXV0aC0+Y2IuY3R4LCBhZGRyKTsKKwkJcmV0dXJuIHdwYV9hdXRoLT5jYi5taWNfZmFpbHVyZV9yZXBvcnQod3BhX2F1dGgtPmNiLmN0eCwgYWRkcik7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjgxLDggKzI4Miw5IEBACiBzdGF0aWMgaW50IHdwYV9ncm91cF9pbml0X2dta19hbmRfY291bnRlcihzdHJ1Y3Qgd3BhX2F1dGhlbnRpY2F0b3IgKndwYV9hdXRoLAogCQkJCQkgIHN0cnVjdCB3cGFfZ3JvdXAgKmdyb3VwKQogewotCXU4IGJ1ZltFVEhfQUxFTiArIDggKyBzaXplb2YoZ3JvdXApXTsKKwl1OCBidWZbRVRIX0FMRU4gKyA4ICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKIAl1OCBya2V5WzMyXTsKKwl1bnNpZ25lZCBsb25nIHB0cjsKIAogCWlmIChyYW5kb21fZ2V0X2J5dGVzKGdyb3VwLT5HTUssIFdQQV9HTUtfTEVOKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTI5NCw3ICsyOTYsOCBAQAogCSAqLwogCW9zX21lbWNweShidWYsIHdwYV9hdXRoLT5hZGRyLCBFVEhfQUxFTik7CiAJd3BhX2dldF9udHBfdGltZXN0YW1wKGJ1ZiArIEVUSF9BTEVOKTsKLQlvc19tZW1jcHkoYnVmICsgRVRIX0FMRU4gKyA4LCAmZ3JvdXAsIHNpemVvZihncm91cCkpOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKSBncm91cDsKKwlvc19tZW1jcHkoYnVmICsgRVRIX0FMRU4gKyA4LCAmcHRyLCBzaXplb2YocHRyKSk7CiAJaWYgKHJhbmRvbV9nZXRfYnl0ZXMocmtleSwgc2l6ZW9mKHJrZXkpKSA8IDApCiAJCXJldHVybiAtMTsKIApAQCAtNzAwLDggKzcwMyw4IEBACiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAogCi1zdGF0aWMgdm9pZCB3cGFfcmVjZWl2ZV9lcnJvcl9yZXBvcnQoc3RydWN0IHdwYV9hdXRoZW50aWNhdG9yICp3cGFfYXV0aCwKLQkJCQkgICAgIHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIGludCBncm91cCkKK3N0YXRpYyBpbnQgd3BhX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCB3cGFfYXV0aGVudGljYXRvciAqd3BhX2F1dGgsCisJCQkJICAgIHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIGludCBncm91cCkKIHsKIAkvKiBTdXBwbGljYW50IHJlcG9ydGVkIGEgTWljaGFlbCBNSUMgZXJyb3IgKi8KIAl3cGFfYXV0aF92bG9nZ2VyKHdwYV9hdXRoLCBzbS0+YWRkciwgTE9HR0VSX0lORk8sCkBAIC03MTgsNyArNzIxLDggQEAKIAkJCQkiaWdub3JlIE1pY2hhZWwgTUlDIGZhaWx1cmUgcmVwb3J0IHNpbmNlICIKIAkJCQkicGFpcndpc2UgY2lwaGVyIGlzIG5vdCBUS0lQIik7CiAJfSBlbHNlIHsKLQkJd3BhX2F1dGhfbWljX2ZhaWx1cmVfcmVwb3J0KHdwYV9hdXRoLCBzbS0+YWRkcik7CisJCWlmICh3cGFfYXV0aF9taWNfZmFpbHVyZV9yZXBvcnQod3BhX2F1dGgsIHNtLT5hZGRyKSA+IDApCisJCQlyZXR1cm4gMTsgLyogU1RBIGVudHJ5IHdhcyByZW1vdmVkICovCiAJCXNtLT5kb3QxMVJTTkFTdGF0c1RLSVBSZW1vdGVNSUNGYWlsdXJlcysrOwogCQl3cGFfYXV0aC0+ZG90MTFSU05BU3RhdHNUS0lQUmVtb3RlTUlDRmFpbHVyZXMrKzsKIAl9CkBAIC03MjgsNiArNzMyLDcgQEAKIAkgKiBBdXRoZW50aWNhdG9yIG1heSBkbyBpdCwgbGV0J3MgY2hhbmdlIHRoZSBrZXlzIG5vdyBhbnl3YXkuCiAJICovCiAJd3BhX3JlcXVlc3RfbmV3X3B0ayhzbSk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTA4MSw5ICsxMDg2LDEwIEBACiAjZW5kaWYgLyogQ09ORklHX1BFRVJLRVkgKi8KIAkJCXJldHVybjsKIAkJfSBlbHNlIGlmIChrZXlfaW5mbyAmIFdQQV9LRVlfSU5GT19FUlJPUikgewotCQkJd3BhX3JlY2VpdmVfZXJyb3JfcmVwb3J0KAotCQkJCXdwYV9hdXRoLCBzbSwKLQkJCQkhKGtleV9pbmZvICYgV1BBX0tFWV9JTkZPX0tFWV9UWVBFKSk7CisJCQlpZiAod3BhX3JlY2VpdmVfZXJyb3JfcmVwb3J0KAorCQkJCSAgICB3cGFfYXV0aCwgc20sCisJCQkJICAgICEoa2V5X2luZm8gJiBXUEFfS0VZX0lORk9fS0VZX1RZUEUpKSA+IDApCisJCQkJcmV0dXJuOyAvKiBTVEEgZW50cnkgd2FzIHJlbW92ZWQgKi8KIAkJfSBlbHNlIGlmIChrZXlfaW5mbyAmIFdQQV9LRVlfSU5GT19LRVlfVFlQRSkgewogCQkJd3BhX2F1dGhfbG9nZ2VyKHdwYV9hdXRoLCBzbS0+YWRkciwgTE9HR0VSX0lORk8sCiAJCQkJCSJyZWNlaXZlZCBFQVBPTC1LZXkgUmVxdWVzdCBmb3IgbmV3ICIKQEAgLTI0MDksMTEgKzI0MTUsOSBAQAogCQkJCSJtYXJraW5nIHN0YXRpb24gZm9yIEdUSyByZWtleWluZyIpOwogCX0KIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCi0JLyogRG8gbm90IHJla2V5IEdUSy9JR1RLIHdoZW4gU1RBIGlzIGluIHdubXNsZWVwICovCisJLyogRG8gbm90IHJla2V5IEdUSy9JR1RLIHdoZW4gU1RBIGlzIGluIFdOTS1TbGVlcCBNb2RlICovCiAJaWYgKHNtLT5pc193bm1zbGVlcCkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KIAogCXNtLT5ncm91cC0+R0tleURvbmVTdGF0aW9ucysrOwogCXNtLT5HVXBkYXRlU3RhdGlvbktleXMgPSBUUlVFOwpAQCAtMjQyMyw4ICsyNDI3LDggQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKLS8qIHVwZGF0ZSBHVEsgd2hlbiBleGl0aW5nIHdubXNsZWVwIG1vZGUgKi8KKyNpZmRlZiBDT05GSUdfV05NCisvKiB1cGRhdGUgR1RLIHdoZW4gZXhpdGluZyBXTk0tU2xlZXAgTW9kZSAqLwogdm9pZCB3cGFfd25tc2xlZXBfcmVrZXlfZ3RrKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20pCiB7CiAJaWYgKHNtLT5pc193bm1zbGVlcCkKQEAgLTI0NDIsMTExICsyNDQ2LDY1IEBACiAKIGludCB3cGFfd25tc2xlZXBfZ3RrX3N1YmVsZW0oc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSwgdTggKnBvcykKIHsKLQl1OCAqc3ViZWxlbTsKIAlzdHJ1Y3Qgd3BhX2dyb3VwICpnc20gPSBzbS0+Z3JvdXA7Ci0Jc2l6ZV90IHN1YmVsZW1fbGVuLCBwYWRfbGVuOwotCWNvbnN0IHU4ICprZXk7Ci0Jc2l6ZV90IGtleV9sZW47Ci0JdTgga2V5YnVmWzMyXTsKLQotCS8qIEdUSyBzdWJzbGVtZW50ICovCi0Ja2V5X2xlbiA9IGdzbS0+R1RLX2xlbjsKLQlpZiAoa2V5X2xlbiA+IHNpemVvZihrZXlidWYpKQotCQlyZXR1cm4gMDsKKwl1OCAqc3RhcnQgPSBwb3M7CiAKIAkvKgotCSAqIFBhZCBrZXkgZm9yIEFFUyBLZXkgV3JhcCBpZiBpdCBpcyBub3QgbXVsdGlwbGUgb2YgOCBieXRlcyBvciBpcyBsZXNzCi0JICogdGhhbiAxNiBieXRlcy4KLQkgKi8KLQlwYWRfbGVuID0ga2V5X2xlbiAlIDg7Ci0JaWYgKHBhZF9sZW4pCi0JCXBhZF9sZW4gPSA4IC0gcGFkX2xlbjsKLQlpZiAoa2V5X2xlbiArIHBhZF9sZW4gPCAxNikKLQkJcGFkX2xlbiArPSA4OwotCWlmIChwYWRfbGVuKSB7Ci0JCW9zX21lbWNweShrZXlidWYsIGdzbS0+R1RLW2dzbS0+R04gLSAxXSwga2V5X2xlbik7Ci0JCW9zX21lbXNldChrZXlidWYgKyBrZXlfbGVuLCAwLCBwYWRfbGVuKTsKLQkJa2V5YnVmW2tleV9sZW5dID0gMHhkZDsKLQkJa2V5X2xlbiArPSBwYWRfbGVuOwotCQlrZXkgPSBrZXlidWY7Ci0JfSBlbHNlCi0JCWtleSA9IGdzbS0+R1RLW2dzbS0+R04gLSAxXTsKLQotCS8qCisJICogR1RLIHN1YmVsZW1lbnQ6CiAJICogU3ViLWVsZW0gSURbMV0gfCBMZW5ndGhbMV0gfCBLZXkgSW5mb1syXSB8IEtleSBMZW5ndGhbMV0gfCBSU0NbOF0gfAotCSAqIEtleVs1Li4zMl0gfCA4IHBhZGRpbmcuCisJICogS2V5WzUuLjMyXQogCSAqLwotCXN1YmVsZW1fbGVuID0gMTMgKyBrZXlfbGVuICsgODsKLQlzdWJlbGVtID0gb3NfemFsbG9jKHN1YmVsZW1fbGVuKTsKLQlpZiAoc3ViZWxlbSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCXN1YmVsZW1bMF0gPSBXTk1fU0xFRVBfU1VCRUxFTV9HVEs7Ci0Jc3ViZWxlbVsxXSA9IDExICsga2V5X2xlbiArIDg7CisJKnBvcysrID0gV05NX1NMRUVQX1NVQkVMRU1fR1RLOworCSpwb3MrKyA9IDExICsgZ3NtLT5HVEtfbGVuOwogCS8qIEtleSBJRCBpbiBCMC1CMSBvZiBLZXkgSW5mbyAqLwotCVdQQV9QVVRfTEUxNigmc3ViZWxlbVsyXSwgZ3NtLT5HTiAmIDB4MDMpOwotCXN1YmVsZW1bNF0gPSBnc20tPkdUS19sZW47Ci0JaWYgKHdwYV9hdXRoX2dldF9zZXFudW0oc20tPndwYV9hdXRoLCBOVUxMLCBnc20tPkdOLCBzdWJlbGVtICsgNSkgIT0gMCkKLQl7Ci0JCW9zX2ZyZWUoc3ViZWxlbSk7CisJV1BBX1BVVF9MRTE2KHBvcywgZ3NtLT5HTiAmIDB4MDMpOworCXBvcyArPSAyOworCSpwb3MrKyA9IGdzbS0+R1RLX2xlbjsKKwlpZiAod3BhX2F1dGhfZ2V0X3NlcW51bShzbS0+d3BhX2F1dGgsIE5VTEwsIGdzbS0+R04sIHBvcykgIT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQotCWlmIChhZXNfd3JhcChzbS0+UFRLLmtlaywga2V5X2xlbiAvIDgsIGtleSwgc3ViZWxlbSArIDEzKSkgewotCQlvc19mcmVlKHN1YmVsZW0pOwotCQlyZXR1cm4gMDsKLQl9CisJcG9zICs9IDg7CisJb3NfbWVtY3B5KHBvcywgZ3NtLT5HVEtbZ3NtLT5HTiAtIDFdLCBnc20tPkdUS19sZW4pOworCXBvcyArPSBnc20tPkdUS19sZW47CiAKLQlvc19tZW1jcHkocG9zLCBzdWJlbGVtLCBzdWJlbGVtX2xlbik7Ci0KLQl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiUGxhaW50ZXh0IEdUSyIsCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEdUSyBLZXkgSUQgJXUgaW4gV05NLVNsZWVwIE1vZGUgZXhpdCIsCisJCSAgIGdzbS0+R04pOworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJXTk06IEdUSyBpbiBXTk0tU2xlZXAgTW9kZSBleGl0IiwKIAkJCWdzbS0+R1RLW2dzbS0+R04gLSAxXSwgZ3NtLT5HVEtfbGVuKTsKLQlvc19mcmVlKHN1YmVsZW0pOwogCi0JcmV0dXJuIHN1YmVsZW1fbGVuOworCXJldHVybiBwb3MgLSBzdGFydDsKIH0KIAogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIGludCB3cGFfd25tc2xlZXBfaWd0a19zdWJlbGVtKHN0cnVjdCB3cGFfc3RhdGVfbWFjaGluZSAqc20sIHU4ICpwb3MpCiB7Ci0JdTggKnN1YmVsZW0sICpwdHI7CiAJc3RydWN0IHdwYV9ncm91cCAqZ3NtID0gc20tPmdyb3VwOwotCXNpemVfdCBzdWJlbGVtX2xlbjsKKwl1OCAqc3RhcnQgPSBwb3M7CiAKLQkvKiBJR1RLIHN1YmVsZW1lbnQKLQkgKiBTdWItZWxlbSBJRFsxXSB8IExlbmd0aFsxXSB8IEtleUlEWzJdIHwgUE5bNl0gfAotCSAqIEtleVsxNl0gfCA4IHBhZGRpbmcgKi8KLQlzdWJlbGVtX2xlbiA9IDEgKyAxICsgMiArIDYgKyBXUEFfSUdUS19MRU4gKyA4OwotCXN1YmVsZW0gPSBvc196YWxsb2Moc3ViZWxlbV9sZW4pOwotCWlmIChzdWJlbGVtID09IE5VTEwpCisJLyoKKwkgKiBJR1RLIHN1YmVsZW1lbnQ6CisJICogU3ViLWVsZW0gSURbMV0gfCBMZW5ndGhbMV0gfCBLZXlJRFsyXSB8IFBOWzZdIHwgS2V5WzE2XQorCSAqLworCSpwb3MrKyA9IFdOTV9TTEVFUF9TVUJFTEVNX0lHVEs7CisJKnBvcysrID0gMiArIDYgKyBXUEFfSUdUS19MRU47CisJV1BBX1BVVF9MRTE2KHBvcywgZ3NtLT5HTl9pZ3RrKTsKKwlwb3MgKz0gMjsKKwlpZiAod3BhX2F1dGhfZ2V0X3NlcW51bShzbS0+d3BhX2F1dGgsIE5VTEwsIGdzbS0+R05faWd0aywgcG9zKSAhPSAwKQogCQlyZXR1cm4gMDsKKwlwb3MgKz0gNjsKIAotCXB0ciA9IHN1YmVsZW07Ci0JKnB0cisrID0gV05NX1NMRUVQX1NVQkVMRU1fSUdUSzsKLQkqcHRyKysgPSBzdWJlbGVtX2xlbiAtIDI7Ci0JV1BBX1BVVF9MRTE2KHB0ciwgZ3NtLT5HTl9pZ3RrKTsKLQlwdHIgKz0gMjsKLQlpZiAod3BhX2F1dGhfZ2V0X3NlcW51bShzbS0+d3BhX2F1dGgsIE5VTEwsIGdzbS0+R05faWd0aywgcHRyKSAhPSAwKSB7Ci0JCW9zX2ZyZWUoc3ViZWxlbSk7Ci0JCXJldHVybiAwOwotCX0KLQlwdHIgKz0gNjsKLQlpZiAoYWVzX3dyYXAoc20tPlBUSy5rZWssIFdQQV9JR1RLX0xFTiAvIDgsCi0JCSAgICAgZ3NtLT5JR1RLW2dzbS0+R05faWd0ayAtIDRdLCBwdHIpKSB7Ci0JCW9zX2ZyZWUoc3ViZWxlbSk7Ci0JCXJldHVybiAtMTsKLQl9CisJb3NfbWVtY3B5KHBvcywgZ3NtLT5JR1RLW2dzbS0+R05faWd0ayAtIDRdLCBXUEFfSUdUS19MRU4pOworCXBvcyArPSBXUEFfSUdUS19MRU47CiAKLQlvc19tZW1jcHkocG9zLCBzdWJlbGVtLCBzdWJlbGVtX2xlbik7Ci0KLQl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiUGxhaW50ZXh0IElHVEsiLAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJR1RLIEtleSBJRCAldSBpbiBXTk0tU2xlZXAgTW9kZSBleGl0IiwKKwkJICAgZ3NtLT5HTl9pZ3RrKTsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiV05NOiBJR1RLIGluIFdOTS1TbGVlcCBNb2RlIGV4aXQiLAogCQkJZ3NtLT5JR1RLW2dzbS0+R05faWd0ayAtIDRdLCBXUEFfSUdUS19MRU4pOwotCW9zX2ZyZWUoc3ViZWxlbSk7CiAKLQlyZXR1cm4gc3ViZWxlbV9sZW47CisJcmV0dXJuIHBvcyAtIHN0YXJ0OwogfQogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCi0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAKIAogc3RhdGljIHZvaWQgd3BhX2dyb3VwX3NldGtleXMoc3RydWN0IHdwYV9hdXRoZW50aWNhdG9yICp3cGFfYXV0aCwKQEAgLTMwNTYsMyArMzAxNCwxMSBAQAogCQkJCSAgICAgICB3cGFfc2VuZF9lYXBvbF90aW1lb3V0LCB3cGFfYXV0aCwgc20pOwogCX0KIH0KKworCitpbnQgd3BhX2F1dGhfdXNlc19zYWUoc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlpZiAoc20gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHdwYV9rZXlfbWdtdF9zYWUoc20tPndwYV9rZXlfbWdtdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvYXAvd3BhX2F1dGguaCBiL3NyYy9hcC93cGFfYXV0aC5oCmluZGV4IDkxYmE0OTkuLjQ2NWVlYzYgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aC5oCisrKyBiL3NyYy9hcC93cGFfYXV0aC5oCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl2b2lkICgqbG9nZ2VyKSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyLCBsb2dnZXJfbGV2ZWwgbGV2ZWwsCiAJCSAgICAgICBjb25zdCBjaGFyICp0eHQpOwogCXZvaWQgKCpkaXNjb25uZWN0KSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyLCB1MTYgcmVhc29uKTsKLQl2b2lkICgqbWljX2ZhaWx1cmVfcmVwb3J0KSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyKTsKKwlpbnQgKCptaWNfZmFpbHVyZV9yZXBvcnQpKHZvaWQgKmN0eCwgY29uc3QgdTggKmFkZHIpOwogCXZvaWQgKCpzZXRfZWFwb2wpKHZvaWQgKmN0eCwgY29uc3QgdTggKmFkZHIsIHdwYV9lYXBvbF92YXJpYWJsZSB2YXIsCiAJCQkgIGludCB2YWx1ZSk7CiAJaW50ICgqZ2V0X2VhcG9sKSh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyLCB3cGFfZWFwb2xfdmFyaWFibGUgdmFyKTsKQEAgLTI4MiwxMyArMjgyLDExIEBACiB2b2lkIHdwYV9mdF9wdXNoX3Bta19yMShzdHJ1Y3Qgd3BhX2F1dGhlbnRpY2F0b3IgKndwYV9hdXRoLCBjb25zdCB1OCAqYWRkcik7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCiB2b2lkIHdwYV93bm1zbGVlcF9yZWtleV9ndGsoc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSk7CiB2b2lkIHdwYV9zZXRfd25tc2xlZXAoc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSwgaW50IGZsYWcpOwogaW50IHdwYV93bm1zbGVlcF9ndGtfc3ViZWxlbShzdHJ1Y3Qgd3BhX3N0YXRlX21hY2hpbmUgKnNtLCB1OCAqcG9zKTsKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogaW50IHdwYV93bm1zbGVlcF9pZ3RrX3N1YmVsZW0oc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSwgdTggKnBvcyk7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworCitpbnQgd3BhX2F1dGhfdXNlc19zYWUoc3RydWN0IHdwYV9zdGF0ZV9tYWNoaW5lICpzbSk7CiAKICNlbmRpZiAvKiBXUEFfQVVUSF9IICovCmRpZmYgLS1naXQgYS9zcmMvYXAvd3BhX2F1dGhfZnQuYyBiL3NyYy9hcC93cGFfYXV0aF9mdC5jCmluZGV4IDQ4YmY3OWIuLmNjYjNmODIgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aF9mdC5jCisrKyBiL3NyYy9hcC93cGFfYXV0aF9mdC5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAkJcGFkX2xlbiA9IDggLSBwYWRfbGVuOwogCWlmIChrZXlfbGVuICsgcGFkX2xlbiA8IDE2KQogCQlwYWRfbGVuICs9IDg7Ci0JaWYgKHBhZF9sZW4pIHsKKwlpZiAocGFkX2xlbiAmJiBrZXlfbGVuIDwgc2l6ZW9mKGtleWJ1ZikpIHsKIAkJb3NfbWVtY3B5KGtleWJ1ZiwgZ3NtLT5HVEtbZ3NtLT5HTiAtIDFdLCBrZXlfbGVuKTsKIAkJb3NfbWVtc2V0KGtleWJ1ZiArIGtleV9sZW4sIDAsIHBhZF9sZW4pOwogCQlrZXlidWZba2V5X2xlbl0gPSAweGRkOwpkaWZmIC0tZ2l0IGEvc3JjL2FwL3dwYV9hdXRoX2dsdWUuYyBiL3NyYy9hcC93cGFfYXV0aF9nbHVlLmMKaW5kZXggYmRjODllNC4uZmRhYWFmZiAxMDA2NDQKLS0tIGEvc3JjL2FwL3dwYV9hdXRoX2dsdWUuYworKysgYi9zcmMvYXAvd3BhX2F1dGhfZ2x1ZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGhvc3RhcGQgLyBXUEEgYXV0aGVudGljYXRvciBnbHVlIGNvZGUKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDExLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgInV0aWxzL2NvbW1vbi5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2RlZnMuaCIKKyNpbmNsdWRlICJjb21tb24vc2FlLmgiCiAjaW5jbHVkZSAiZWFwb2xfYXV0aC9lYXBvbF9hdXRoX3NtLmgiCiAjaW5jbHVkZSAiZWFwb2xfYXV0aC9lYXBvbF9hdXRoX3NtX2kuaCIKICNpbmNsdWRlICJlYXBfc2VydmVyL2VhcC5oIgpAQCAtMTEyLDEwICsxMTMsMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBob3N0YXBkX3dwYV9hdXRoX21pY19mYWlsdXJlX3JlcG9ydCh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyKQorc3RhdGljIGludCBob3N0YXBkX3dwYV9hdXRoX21pY19mYWlsdXJlX3JlcG9ydCh2b2lkICpjdHgsIGNvbnN0IHU4ICphZGRyKQogewogCXN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQgPSBjdHg7Ci0JbWljaGFlbF9taWNfZmFpbHVyZShoYXBkLCBhZGRyLCAwKTsKKwlyZXR1cm4gbWljaGFlbF9taWNfZmFpbHVyZShoYXBkLCBhZGRyLCAwKTsKIH0KIAogCkBAIC0xODQsMTQgKzE4NSwzMiBAQAogewogCXN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQgPSBjdHg7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBhcF9nZXRfc3RhKGhhcGQsIGFkZHIpOwotCWNvbnN0IHU4ICpwc2sgPSBob3N0YXBkX2dldF9wc2soaGFwZC0+Y29uZiwgYWRkciwgcHJldl9wc2spOworCWNvbnN0IHU4ICpwc2s7CisKKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKHN0YSAmJiBzdGEtPmF1dGhfYWxnID09IFdMQU5fQVVUSF9TQUUpIHsKKwkJaWYgKCFzdGEtPnNhZSB8fCBwcmV2X3BzaykKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gc3RhLT5zYWUtPnBtazsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCisJcHNrID0gaG9zdGFwZF9nZXRfcHNrKGhhcGQtPmNvbmYsIGFkZHIsIHByZXZfcHNrKTsKIAkvKgogCSAqIFRoaXMgaXMgYWJvdXQgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwc2tzLCBwcmV2X3BzayBnaXZlcyB0aGUgbGFzdAogCSAqIHJldHVybmVkIHBzayB3aGljaCBzaG91bGQgbm90IGJlIHJldHVybmVkIGFnYWluLgotCSAqIGxvZ2ljIGxpc3QgKGFsbCBob3N0YXBkX2dldF9wc2s7IHN0YS0+cHNrKQorCSAqIGxvZ2ljIGxpc3QgKGFsbCBob3N0YXBkX2dldF9wc2s7IGFsbCBzdGEtPnBzaykKIAkgKi8KLQlpZiAoc3RhICYmIHN0YS0+cHNrICYmICFwc2sgJiYgc3RhLT5wc2sgIT0gcHJldl9wc2spCi0JCXBzayA9IHN0YS0+cHNrOworCWlmIChzdGEgJiYgc3RhLT5wc2sgJiYgIXBzaykgeworCQlzdHJ1Y3QgaG9zdGFwZF9zdGFfd3BhX3Bza19zaG9ydCAqcG9zOworCQlwc2sgPSBzdGEtPnBzay0+cHNrOworCQlmb3IgKHBvcyA9IHN0YS0+cHNrOyBwb3M7IHBvcyA9IHBvcy0+bmV4dCkgeworCQkJaWYgKHBvcy0+cHNrID09IHByZXZfcHNrKSB7CisJCQkJcHNrID0gcG9zLT5uZXh0ID8gcG9zLT5uZXh0LT5wc2sgOiBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCXJldHVybiBwc2s7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9hcC93cGFfYXV0aF9pLmggYi9zcmMvYXAvd3BhX2F1dGhfaS5oCmluZGV4IGQ1Y2YyYzUuLjk3NDg5ZDMgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aF9pLmgKKysrIGIvc3JjL2FwL3dwYV9hdXRoX2kuaApAQCAtODcsOSArODcsNyBAQAogCXVuc2lnbmVkIGludCBmdF9jb21wbGV0ZWQ6MTsKIAl1bnNpZ25lZCBpbnQgcG1rX3IxX25hbWVfdmFsaWQ6MTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCiAJdW5zaWduZWQgaW50IGlzX3dubXNsZWVwOjE7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KIAogCXU4IHJlcV9yZXBsYXlfY291bnRlcltXUEFfUkVQTEFZX0NPVU5URVJfTEVOXTsKIAlpbnQgcmVxX3JlcGxheV9jb3VudGVyX3VzZWQ7CmRpZmYgLS1naXQgYS9zcmMvYXAvd3BhX2F1dGhfaWUuYyBiL3NyYy9hcC93cGFfYXV0aF9pZS5jCmluZGV4IDE3ODYyMzAuLmNkZmNjYTEgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cGFfYXV0aF9pZS5jCisrKyBiL3NyYy9hcC93cGFfYXV0aF9pZS5jCkBAIC0xODgsNiArMTg4LDE4IEBACiAJCW51bV9zdWl0ZXMrKzsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKGNvbmYtPndwYV9rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9TQUUpIHsKKwkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX1NBRSk7CisJCXBvcyArPSBSU05fU0VMRUNUT1JfTEVOOworCQludW1fc3VpdGVzKys7CisJfQorCWlmIChjb25mLT53cGFfa2V5X21nbXQgJiBXUEFfS0VZX01HTVRfRlRfU0FFKSB7CisJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9GVF9TQUUpOworCQlwb3MgKz0gUlNOX1NFTEVDVE9SX0xFTjsKKwkJbnVtX3N1aXRlcysrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAKICNpZmRlZiBDT05GSUdfUlNOX1RFU1RJTkcKIAlpZiAocnNuX3Rlc3RpbmcpIHsKQEAgLTQwNyw2ICs0MTksMTIgQEAKIAkJZWxzZSBpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2KQogCQkJc2VsZWN0b3IgPSBSU05fQVVUSF9LRVlfTUdNVF9QU0tfU0hBMjU2OwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1NBRQorCQllbHNlIGlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX1NBRSkKKwkJCXNlbGVjdG9yID0gUlNOX0FVVEhfS0VZX01HTVRfU0FFOworCQllbHNlIGlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX0ZUX1NBRSkKKwkJCXNlbGVjdG9yID0gUlNOX0FVVEhfS0VZX01HTVRfRlRfU0FFOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KIAkJZWxzZSBpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9JRUVFODAyMVgpCiAJCQlzZWxlY3RvciA9IFJTTl9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVg7CiAJCWVsc2UgaWYgKGRhdGEua2V5X21nbXQgJiBXUEFfS0VZX01HTVRfUFNLKQpAQCAtNDc5LDYgKzQ5NywxMiBAQAogCWVsc2UgaWYgKGtleV9tZ210ICYgV1BBX0tFWV9NR01UX1BTS19TSEEyNTYpCiAJCXNtLT53cGFfa2V5X21nbXQgPSBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwllbHNlIGlmIChrZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9TQUUpCisJCXNtLT53cGFfa2V5X21nbXQgPSBXUEFfS0VZX01HTVRfU0FFOworCWVsc2UgaWYgKGtleV9tZ210ICYgV1BBX0tFWV9NR01UX0ZUX1NBRSkKKwkJc20tPndwYV9rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9GVF9TQUU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCWVsc2UgaWYgKGtleV9tZ210ICYgV1BBX0tFWV9NR01UX0lFRUU4MDIxWCkKIAkJc20tPndwYV9rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9JRUVFODAyMVg7CiAJZWxzZQpAQCAtNTQwLDEyICs1NjQsOSBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCi0JaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0NDTVApCi0JCXNtLT5wYWlyd2lzZSA9IFdQQV9DSVBIRVJfQ0NNUDsKLQllbHNlIGlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9HQ01QKQotCQlzbS0+cGFpcndpc2UgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JZWxzZQotCQlzbS0+cGFpcndpc2UgPSBXUEFfQ0lQSEVSX1RLSVA7CisJc20tPnBhaXJ3aXNlID0gd3BhX3BpY2tfcGFpcndpc2VfY2lwaGVyKGNpcGhlcnMsIDApOworCWlmIChzbS0+cGFpcndpc2UgPCAwKQorCQlyZXR1cm4gV1BBX0lOVkFMSURfUEFJUldJU0U7CiAKIAkvKiBUT0RPOiBjbGVhciBXUEEvV1BBMiBzdGF0ZSBpZiBTVEEgY2hhbmdlcyBmcm9tIG9uZSB0byBhbm90aGVyICovCiAJaWYgKHdwYV9pZVswXSA9PSBXTEFOX0VJRF9SU04pCmRpZmYgLS1naXQgYS9zcmMvYXAvd3BzX2hvc3RhcGQuYyBiL3NyYy9hcC93cHNfaG9zdGFwZC5jCmluZGV4IDVlNDRjNzIuLjVjZTRmMWIgMTAwNjQ0Ci0tLSBhL3NyYy9hcC93cHNfaG9zdGFwZC5jCisrKyBiL3NyYy9hcC93cHNfaG9zdGFwZC5jCkBAIC0xMSw4ICsxMSw2IEBACiAjaW5jbHVkZSAidXRpbHMvY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMvZWxvb3AuaCIKICNpbmNsdWRlICJ1dGlscy91dWlkLmgiCi0jaW5jbHVkZSAiY3J5cHRvL2RoX2dyb3Vwcy5oIgotI2luY2x1ZGUgImNyeXB0by9kaF9ncm91cDUuaCIKICNpbmNsdWRlICJjb21tb24vd3BhX2N0cmwuaCIKICNpbmNsdWRlICJjb21tb24vaWVlZTgwMl8xMV9kZWZzLmgiCiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgiCkBAIC05NTksNiArOTU3LDkgQEAKIAlpZiAoY29uZi0+c3NpZC5zZWN1cml0eV9wb2xpY3kgPT0gU0VDVVJJVFlfU1RBVElDX1dFUCkKIAkJY2ZnLnN0YXRpY193ZXBfb25seSA9IDE7CiAJY2ZnLmR1YWxiYW5kID0gaW50ZXJmYWNlX2NvdW50KGhhcGQtPmlmYWNlKSA+IDE7CisJaWYgKCh3cHMtPmRldi5yZl9iYW5kcyAmIChXUFNfUkZfNTBHSFogfCBXUFNfUkZfMjRHSFopKSA9PQorCSAgICAoV1BTX1JGXzUwR0haIHwgV1BTX1JGXzI0R0haKSkKKwkJY2ZnLmR1YWxiYW5kID0gMTsKIAlpZiAoY2ZnLmR1YWxiYW5kKQogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogRHVhbGJhbmQgQVAiKTsKIApAQCAtMTAzNiw4ICsxMDM3LDYgQEAKIAl3cHNfZGV2aWNlX2RhdGFfZnJlZSgmaGFwZC0+d3BzLT5kZXYpOwogCXdwYWJ1Zl9mcmVlKGhhcGQtPndwcy0+ZGhfcHVia2V5KTsKIAl3cGFidWZfZnJlZShoYXBkLT53cHMtPmRoX3ByaXZrZXkpOwotCXdwYWJ1Zl9mcmVlKGhhcGQtPndwcy0+b29iX2NvbmYucHVia2V5X2hhc2gpOwotCXdwYWJ1Zl9mcmVlKGhhcGQtPndwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKTsKIAl3cHNfZnJlZV9wZW5kaW5nX21zZ3MoaGFwZC0+d3BzLT51cG5wX21zZ3MpOwogCWhvc3RhcGRfd3BzX25mY19jbGVhcihoYXBkLT53cHMpOwogCW9zX2ZyZWUoaGFwZC0+d3BzKTsKQEAgLTExNTUsNjAgKzExNTQsNiBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotaW50IGhvc3RhcGRfd3BzX3N0YXJ0X29vYihzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkLCBjaGFyICpkZXZpY2VfdHlwZSwKLQkJCSAgY2hhciAqcGF0aCwgY2hhciAqbWV0aG9kLCBjaGFyICpuYW1lKQotewotCXN0cnVjdCB3cHNfY29udGV4dCAqd3BzID0gaGFwZC0+d3BzOwotCXN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgKm9vYl9kZXY7Ci0KLQlvb2JfZGV2ID0gd3BzX2dldF9vb2JfZGV2aWNlKGRldmljZV90eXBlKTsKLQlpZiAob29iX2RldiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Jb29iX2Rldi0+ZGV2aWNlX3BhdGggPSBwYXRoOwotCW9vYl9kZXYtPmRldmljZV9uYW1lID0gbmFtZTsKLQl3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPSB3cHNfZ2V0X29vYl9tZXRob2QobWV0aG9kKTsKLQotCWlmICh3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPT0gT09CX01FVEhPRF9ERVZfUFdEX1IpIHsKLQkJLyoKLQkJICogVXNlIHByZS1jb25maWd1cmVkIERIIGtleXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB3cml0ZSB0aGUKLQkJICoga2V5IGhhc2ggaW50byB0aGUgT09CIGZpbGUuCi0JCSAqLwotCQl3cGFidWZfZnJlZSh3cHMtPmRoX3B1YmtleSk7Ci0JCXdwYWJ1Zl9mcmVlKHdwcy0+ZGhfcHJpdmtleSk7Ci0JCXdwcy0+ZGhfcHJpdmtleSA9IE5VTEw7Ci0JCXdwcy0+ZGhfcHVia2V5ID0gZGhfaW5pdChkaF9ncm91cHNfZ2V0KFdQU19ESF9HUk9VUCksCi0JCQkJCSAmd3BzLT5kaF9wcml2a2V5KTsKLQkJd3BzLT5kaF9wdWJrZXkgPSB3cGFidWZfemVyb3BhZCh3cHMtPmRoX3B1YmtleSwgMTkyKTsKLQkJaWYgKHdwcy0+ZGhfcHVia2V5ID09IE5VTEwpIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkJICAgIkRpZmZpZS1IZWxsbWFuIGhhbmRzaGFrZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JaWYgKHdwc19wcm9jZXNzX29vYih3cHMsIG9vYl9kZXYsIDEpIDwgMCkKLQkJZ290byBlcnJvcjsKLQotCWlmICgod3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9FIHx8Ci0JICAgICB3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPT0gT09CX01FVEhPRF9ERVZfUFdEX1IpICYmCi0JICAgIGhvc3RhcGRfd3BzX2FkZF9waW4oaGFwZCwgTlVMTCwgImFueSIsCi0JCQkJd3BhYnVmX2hlYWQod3BzLT5vb2JfY29uZi5kZXZfcGFzc3dvcmQpLCAwKSA8Ci0JICAgIDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0Jd3BhYnVmX2ZyZWUod3BzLT5kaF9wdWJrZXkpOwotCXdwcy0+ZGhfcHVia2V5ID0gTlVMTDsKLQl3cGFidWZfZnJlZSh3cHMtPmRoX3ByaXZrZXkpOwotCXdwcy0+ZGhfcHJpdmtleSA9IE5VTEw7Ci0JcmV0dXJuIC0xOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KLQogc3RhdGljIGludCBob3N0YXBkX3dwc19wcm9iZV9yZXFfcngodm9pZCAqY3R4LCBjb25zdCB1OCAqYWRkciwgY29uc3QgdTggKmRhLAogCQkJCSAgICBjb25zdCB1OCAqYnNzaWQsCiAJCQkJICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwKZGlmZiAtLWdpdCBhL3NyYy9hcC93cHNfaG9zdGFwZC5oIGIvc3JjL2FwL3dwc19ob3N0YXBkLmgKaW5kZXggZjk2OGUxNS4uNGU1MDI2YiAxMDA2NDQKLS0tIGEvc3JjL2FwL3dwc19ob3N0YXBkLmgKKysrIGIvc3JjL2FwL3dwc19ob3N0YXBkLmgKQEAgLTIxLDggKzIxLDYgQEAKIGludCBob3N0YXBkX3dwc19idXR0b25fcHVzaGVkKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsCiAJCQkgICAgICBjb25zdCB1OCAqcDJwX2Rldl9hZGRyKTsKIGludCBob3N0YXBkX3dwc19jYW5jZWwoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7Ci1pbnQgaG9zdGFwZF93cHNfc3RhcnRfb29iKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNoYXIgKmRldmljZV90eXBlLAotCQkJICBjaGFyICpwYXRoLCBjaGFyICptZXRob2QsIGNoYXIgKm5hbWUpOwogaW50IGhvc3RhcGRfd3BzX2dldF9taWJfc3RhKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQsIGNvbnN0IHU4ICphZGRyLAogCQkJICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiB2b2lkIGhvc3RhcGRfd3BzX2FwX3Bpbl9kaXNhYmxlKHN0cnVjdCBob3N0YXBkX2RhdGEgKmhhcGQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9kZWZzLmggYi9zcmMvY29tbW9uL2RlZnMuaAppbmRleCBkYjI5YjVkLi4yODFkZDhhIDEwMDY0NAotLS0gYS9zcmMvY29tbW9uL2RlZnMuaAorKysgYi9zcmMvY29tbW9uL2RlZnMuaApAQCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBXUEFfQ0lQSEVSX0FFU18xMjhfQ01BQyBCSVQoNSkKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogI2RlZmluZSBXUEFfQ0lQSEVSX0dDTVAgQklUKDYpCisjZGVmaW5lIFdQQV9DSVBIRVJfU01TNCBCSVQoNykKIAogI2RlZmluZSBXUEFfS0VZX01HTVRfSUVFRTgwMjFYIEJJVCgwKQogI2RlZmluZSBXUEFfS0VZX01HTVRfUFNLIEJJVCgxKQpAQCAtMzgsMTEgKzM5LDE3IEBACiAjZGVmaW5lIFdQQV9LRVlfTUdNVF9JRUVFODAyMVhfU0hBMjU2IEJJVCg3KQogI2RlZmluZSBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NiBCSVQoOCkKICNkZWZpbmUgV1BBX0tFWV9NR01UX1dQUyBCSVQoOSkKKyNkZWZpbmUgV1BBX0tFWV9NR01UX1NBRSBCSVQoMTApCisjZGVmaW5lIFdQQV9LRVlfTUdNVF9GVF9TQUUgQklUKDExKQorI2RlZmluZSBXUEFfS0VZX01HTVRfV0FQSV9QU0sgQklUKDEyKQorI2RlZmluZSBXUEFfS0VZX01HTVRfV0FQSV9DRVJUIEJJVCgxMykKKyNkZWZpbmUgV1BBX0tFWV9NR01UX0NDS00gQklUKDE0KQogCiBzdGF0aWMgaW5saW5lIGludCB3cGFfa2V5X21nbXRfd3BhX2llZWU4MDIxeChpbnQgYWttKQogewogCXJldHVybiAhIShha20gJiAoV1BBX0tFWV9NR01UX0lFRUU4MDIxWCB8CiAJCQkgV1BBX0tFWV9NR01UX0ZUX0lFRUU4MDIxWCB8CisJCQkgV1BBX0tFWV9NR01UX0NDS00gfAogCQkJIFdQQV9LRVlfTUdNVF9JRUVFODAyMVhfU0hBMjU2KSk7CiB9CiAKQEAgLTUwLDEzICs1NywyMSBAQAogewogCXJldHVybiAhIShha20gJiAoV1BBX0tFWV9NR01UX1BTSyB8CiAJCQkgV1BBX0tFWV9NR01UX0ZUX1BTSyB8Ci0JCQkgV1BBX0tFWV9NR01UX1BTS19TSEEyNTYpKTsKKwkJCSBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NiB8CisJCQkgV1BBX0tFWV9NR01UX1NBRSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB3cGFfa2V5X21nbXRfZnQoaW50IGFrbSkKIHsKIAlyZXR1cm4gISEoYWttICYgKFdQQV9LRVlfTUdNVF9GVF9QU0sgfAotCQkJIFdQQV9LRVlfTUdNVF9GVF9JRUVFODAyMVgpKTsKKwkJCSBXUEFfS0VZX01HTVRfRlRfSUVFRTgwMjFYIHwKKwkJCSBXUEFfS0VZX01HTVRfRlRfU0FFKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdwYV9rZXlfbWdtdF9zYWUoaW50IGFrbSkKK3sKKwlyZXR1cm4gISEoYWttICYgKFdQQV9LRVlfTUdNVF9TQUUgfAorCQkJIFdQQV9LRVlfTUdNVF9GVF9TQUUpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgd3BhX2tleV9tZ210X3NoYTI1NihpbnQgYWttKQpAQCAtNzYsMTQgKzkxLDIxIEBACiAJcmV0dXJuIHdwYV9rZXlfbWdtdF93cGEoYWttKSB8fCAoYWttICYgV1BBX0tFWV9NR01UX1dQQV9OT05FKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgd3BhX2tleV9tZ210X2Nja20oaW50IGFrbSkKK3sKKwlyZXR1cm4gYWttID09IFdQQV9LRVlfTUdNVF9DQ0tNOworfQorCiAKICNkZWZpbmUgV1BBX1BST1RPX1dQQSBCSVQoMCkKICNkZWZpbmUgV1BBX1BST1RPX1JTTiBCSVQoMSkKKyNkZWZpbmUgV1BBX1BST1RPX1dBUEkgQklUKDIpCiAKICNkZWZpbmUgV1BBX0FVVEhfQUxHX09QRU4gQklUKDApCiAjZGVmaW5lIFdQQV9BVVRIX0FMR19TSEFSRUQgQklUKDEpCiAjZGVmaW5lIFdQQV9BVVRIX0FMR19MRUFQIEJJVCgyKQogI2RlZmluZSBXUEFfQVVUSF9BTEdfRlQgQklUKDMpCisjZGVmaW5lIFdQQV9BVVRIX0FMR19TQUUgQklUKDQpCiAKIAogZW51bSB3cGFfYWxnIHsKQEAgLTkzLDcgKzExNSw5IEBACiAJV1BBX0FMR19DQ01QLAogCVdQQV9BTEdfSUdUSywKIAlXUEFfQUxHX1BNSywKLQlXUEFfQUxHX0dDTVAKKwlXUEFfQUxHX0dDTVAsCisJV1BBX0FMR19TTVM0LAorCVdQQV9BTEdfS1JLCiB9OwogCiAvKioKQEAgLTEwNSw3ICsxMjksOCBAQAogCUNJUEhFUl9US0lQLAogCUNJUEhFUl9DQ01QLAogCUNJUEhFUl9XRVAxMDQsCi0JQ0lQSEVSX0dDTVAKKwlDSVBIRVJfR0NNUCwKKwlDSVBIRVJfU01TNAogfTsKIAogLyoqCkBAIC0xMjEsNyArMTQ2LDEyIEBACiAJS0VZX01HTVRfRlRfUFNLLAogCUtFWV9NR01UXzgwMl8xWF9TSEEyNTYsCiAJS0VZX01HTVRfUFNLX1NIQTI1NiwKLQlLRVlfTUdNVF9XUFMKKwlLRVlfTUdNVF9XUFMsCisJS0VZX01HTVRfU0FFLAorCUtFWV9NR01UX0ZUX1NBRSwKKwlLRVlfTUdNVF9XQVBJX1BTSywKKwlLRVlfTUdNVF9XQVBJX0NFUlQsCisJS0VZX01HTVRfQ0NLTQogfTsKIAogLyoqCkBAIC0yNTYsOCArMjg2LDkgQEAKIGVudW0gbWZwX29wdGlvbnMgewogCU5PX01HTVRfRlJBTUVfUFJPVEVDVElPTiA9IDAsCiAJTUdNVF9GUkFNRV9QUk9URUNUSU9OX09QVElPTkFMID0gMSwKLQlNR01UX0ZSQU1FX1BST1RFQ1RJT05fUkVRVUlSRUQgPSAyCisJTUdNVF9GUkFNRV9QUk9URUNUSU9OX1JFUVVJUkVEID0gMiwKIH07CisjZGVmaW5lIE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUIDMKIAogLyoqCiAgKiBlbnVtIGhvc3RhcGRfaHdfbW9kZSAtIEhhcmR3YXJlIG1vZGUKQEAgLTI2Niw2ICsyOTcsNyBAQAogCUhPU1RBUERfTU9ERV9JRUVFODAyMTFCLAogCUhPU1RBUERfTU9ERV9JRUVFODAyMTFHLAogCUhPU1RBUERfTU9ERV9JRUVFODAyMTFBLAorCUhPU1RBUERfTU9ERV9JRUVFODAyMTFBRCwKIAlOVU1fSE9TVEFQRF9NT0RFUwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5jIGIvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5jCmluZGV4IGQ5ZDNjZDAuLjk4ZmFkZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vaWVlZTgwMl8xMV9jb21tb24uYworKysgYi9zcmMvY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmMKQEAgLTI4NCw2ICsyODQsMTAgQEAKIAkJCQlicmVhazsKIAkJCWVsZW1zLT5ic3NfbWF4X2lkbGVfcGVyaW9kID0gcG9zOwogCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfU1NJRF9MSVNUOgorCQkJZWxlbXMtPnNzaWRfbGlzdCA9IHBvczsKKwkJCWVsZW1zLT5zc2lkX2xpc3RfbGVuID0gZWxlbjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJdW5rbm93bisrOwogCQkJaWYgKCFzaG93X2Vycm9ycykKZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vaWVlZTgwMl8xMV9jb21tb24uaCBiL3NyYy9jb21tb24vaWVlZTgwMl8xMV9jb21tb24uaAppbmRleCBiZmMzZWIyLi41NWZhNDlkIDEwMDY0NAotLS0gYS9zcmMvY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgKKysrIGIvc3JjL2NvbW1vbi9pZWVlODAyXzExX2NvbW1vbi5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIElFRUUgODAyLjExIENvbW1vbiByb3V0aW5lcwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDksIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtNDMsNiArNDMsNyBAQAogCWNvbnN0IHU4ICpoczIwOwogCWNvbnN0IHU4ICpleHRfY2FwYWI7CiAJY29uc3QgdTggKmJzc19tYXhfaWRsZV9wZXJpb2Q7CisJY29uc3QgdTggKnNzaWRfbGlzdDsKIAogCXU4IHNzaWRfbGVuOwogCXU4IHN1cHBfcmF0ZXNfbGVuOwpAQCAtNzQsNiArNzUsNyBAQAogCXU4IGludGVyd29ya2luZ19sZW47CiAJdTggaHMyMF9sZW47CiAJdTggZXh0X2NhcGFiX2xlbjsKKwl1OCBzc2lkX2xpc3RfbGVuOwogfTsKIAogdHlwZWRlZiBlbnVtIHsgUGFyc2VPSyA9IDAsIFBhcnNlVW5rbm93biA9IDEsIFBhcnNlRmFpbGVkID0gLTEgfSBQYXJzZVJlczsKZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vaWVlZTgwMl8xMV9kZWZzLmggYi9zcmMvY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oCmluZGV4IDJhYjdmYmYuLmY3MmMwZDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vaWVlZTgwMl8xMV9kZWZzLmgKKysrIGIvc3JjL2NvbW1vbi9pZWVlODAyXzExX2RlZnMuaApAQCAtNzYsNiArNzYsNyBAQAogI2RlZmluZSBXTEFOX0FVVEhfT1BFTgkJCTAKICNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkJCTEKICNkZWZpbmUgV0xBTl9BVVRIX0ZUCQkJMgorI2RlZmluZSBXTEFOX0FVVEhfU0FFCQkJMwogI2RlZmluZSBXTEFOX0FVVEhfTEVBUAkJCTEyOAogCiAjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOApAQCAtMTU3LDYgKzE1OCw4IEBACiAjZGVmaW5lIFdMQU5fU1RBVFVTX1JFUV9SRUZVU0VEX1NTUE4gNjcKICNkZWZpbmUgV0xBTl9TVEFUVVNfUkVRX1JFRlVTRURfVU5BVVRIX0FDQ0VTUyA2OAogI2RlZmluZSBXTEFOX1NUQVRVU19JTlZBTElEX1JTTklFIDcyCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FOVElfQ0xPR0dJTkdfVE9LRU5fUkVRIDc2CisjZGVmaW5lIFdMQU5fU1RBVFVTX0ZJTklURV9DWUNMSUNfR1JPVVBfTk9UX1NVUFBPUlRFRCA3NwogI2RlZmluZSBXTEFOX1NUQVRVU19UUkFOU01JU1NJT05fRkFJTFVSRSA3OQogCiAvKiBSZWFzb24gY29kZXMgKElFRUUgODAyLjExLTIwMDcsIDcuMy4xLjcsIFRhYmxlIDctMjIpICovCkBAIC0yMjMsMTEgKzIyNiwxMyBAQAogI2RlZmluZSBXTEFOX0VJRF9SSUNfREFUQSA1NwogI2RlZmluZSBXTEFOX0VJRF9IVF9PUEVSQVRJT04gNjEKICNkZWZpbmUgV0xBTl9FSURfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUIDYyCisjZGVmaW5lIFdMQU5fRUlEX1dBUEkgNjgKICNkZWZpbmUgV0xBTl9FSURfVElNRV9BRFZFUlRJU0VNRU5UIDY5CiAjZGVmaW5lIFdMQU5fRUlEXzIwXzQwX0JTU19DT0VYSVNURU5DRSA3MgogI2RlZmluZSBXTEFOX0VJRF8yMF80MF9CU1NfSU5UT0xFUkFOVCA3MwogI2RlZmluZSBXTEFOX0VJRF9PVkVSTEFQUElOR19CU1NfU0NBTl9QQVJBTVMgNzQKICNkZWZpbmUgV0xBTl9FSURfTU1JRSA3NgorI2RlZmluZSBXTEFOX0VJRF9TU0lEX0xJU1QgODQKICNkZWZpbmUgV0xBTl9FSURfQlNTX01BWF9JRExFX1BFUklPRCA5MAogI2RlZmluZSBXTEFOX0VJRF9URlNfUkVRIDkxCiAjZGVmaW5lIFdMQU5fRUlEX1RGU19SRVNQIDkyCkBAIC0yMzgsNiArMjQzLDcgQEAKICNkZWZpbmUgV0xBTl9FSURfQURWX1BST1RPIDEwOAogI2RlZmluZSBXTEFOX0VJRF9ST0FNSU5HX0NPTlNPUlRJVU0gMTExCiAjZGVmaW5lIFdMQU5fRUlEX0VYVF9DQVBBQiAxMjcKKyNkZWZpbmUgV0xBTl9FSURfQ0NLTSAxNTYKICNkZWZpbmUgV0xBTl9FSURfVkhUX0NBUCAxOTEKICNkZWZpbmUgV0xBTl9FSURfVkhUX09QRVJBVElPTiAxOTIKICNkZWZpbmUgV0xBTl9FSURfVkhUX0VYVEVOREVEX0JTU19MT0FEIDE5MwpAQCAtNTMyLDYgKzUzOCwxNiBAQAogCQkJCQkgKiBFbnRyaWVzICovCiAJCQkJCXU4IHZhcmlhYmxlWzBdOwogCQkJCX0gU1RSVUNUX1BBQ0tFRCBic3NfdG1fcmVxOworCQkJCXN0cnVjdCB7CisJCQkJCXU4IGFjdGlvbjsgLyogOCAqLworCQkJCQl1OCBkaWFsb2dfdG9rZW47CisJCQkJCXU4IHN0YXR1c19jb2RlOworCQkJCQl1OCBic3NfdGVybWluYXRpb25fZGVsYXk7CisJCQkJCS8qIFRhcmdldCBCU1NJRCAob3B0aW9uYWwpLAorCQkJCQkgKiBCU1MgVHJhbnNpdGlvbiBDYW5kaWRhdGUgTGlzdAorCQkJCQkgKiBFbnRyaWVzIChvcHRpb25hbCkgKi8KKwkJCQkJdTggdmFyaWFibGVbMF07CisJCQkJfSBTVFJVQ1RfUEFDS0VEIGJzc190bV9yZXNwOwogCQkJfSB1OwogCQl9IFNUUlVDVF9QQUNLRUQgYWN0aW9uOwogCX0gdTsKQEAgLTY2Niw2ICs2ODIsNyBAQAogI2RlZmluZSBIVF9JTkZPX1NUQkNfUEFSQU1fUENPX0FDVElWRQkJCSgodTE2KSBCSVQoMTApKQogI2RlZmluZSBIVF9JTkZPX1NUQkNfUEFSQU1fUENPX1BIQVNFCQkJKCh1MTYpIEJJVCgxMSkpCiAKKyNkZWZpbmUgQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfVkhUX1BIWSAxMjYKICNkZWZpbmUgQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZIDEyNwogCiAvKiBWSFQgRGVmaW5lcyAqLwpAQCAtNjk1LDYgKzcxMiwxMiBAQAogI2RlZmluZSBWSFRfQ0FQX1JYX0FOVEVOTkFfUEFUVEVSTiAgICAgICAgICAgICAgICAgICgodTMyKSBCSVQoMjgpKQogI2RlZmluZSBWSFRfQ0FQX1RYX0FOVEVOTkFfUEFUVEVSTiAgICAgICAgICAgICAgICAgICgodTMyKSBCSVQoMjkpKQogCisvKiBWSFQgY2hhbm5lbCB3aWR0aHMgKi8KKyNkZWZpbmUgVkhUX0NIQU5XSURUSF9VU0VfSFQJMAorI2RlZmluZSBWSFRfQ0hBTldJRFRIXzgwTUhaCTEKKyNkZWZpbmUgVkhUX0NIQU5XSURUSF8xNjBNSFoJMgorI2RlZmluZSBWSFRfQ0hBTldJRFRIXzgwUDgwTUhaCTMKKwogI2RlZmluZSBPVUlfTUlDUk9TT0ZUIDB4MDA1MGYyIC8qIE1pY3Jvc29mdCAoYWxzbyB1c2VkIGluIFdpLUZpIHNwZWNzKQogCQkJCSogMDA6NTA6RjIgKi8KICNkZWZpbmUgV1BBX0lFX1ZFTkRPUl9UWVBFIDB4MDA1MGYyMDEKQEAgLTk2Niw5ICs5ODksMTcgQEAKICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfTk9fR1JPVVBfQUREUgkweDAwMEZBQzA3CiAjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVAJCTB4MDAwRkFDMDgKIAorI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0CQkweDAwMTQ3MjAxCisKKyNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfQ0tJUAkJMHgwMDQwOTYwMAorI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9DS0lQX0NNSUMJMHgwMDQwOTYwMQorI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9DTUlDCQkweDAwNDA5NjAyCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0tSSwkJMHgwMDQwOTZGRiAvKiBmb3Igbmw4MDIxMSB1c2Ugb25seSAqLworCiAvKiBBS00gc3VpdGUgc2VsZWN0b3JzICovCiAjZGVmaW5lIFdMQU5fQUtNX1NVSVRFXzgwMjFYCQkweDAwMEZBQzAxCiAjZGVmaW5lIFdMQU5fQUtNX1NVSVRFX1BTSwkJMHgwMDBGQUMwMgorI2RlZmluZSBXTEFOX0FLTV9TVUlURV9DQ0tNCQkweDAwNDA5NjAwCiAKIAogLyogSUVFRSA4MDIuMTF2IC0gV05NIEFjdGlvbiBmaWVsZCB2YWx1ZXMgKi8KQEAgLTEwMzQsMTEgKzEwNjUsMTQgQEAKIHN0cnVjdCB3bm1fc2xlZXBfZWxlbWVudCB7CiAJdTggZWlkOyAgICAgLyogV0xBTl9FSURfV05NU0xFRVAgKi8KIAl1OCBsZW47Ci0JdTggYWN0aW9uX3R5cGU7IC8qIFdMQU5fV05NX1NMRUVQX0VOVEVSL0VYSVQgKi8KKwl1OCBhY3Rpb25fdHlwZTsgLyogV05NX1NMRUVQX0VOVEVSL1dOTV9TTEVFUF9NT0RFX0VYSVQgKi8KIAl1OCBzdGF0dXM7CiAJbGUxNiBpbnR2YWw7CiB9IFNUUlVDVF9QQUNLRUQ7CiAKKyNkZWZpbmUgV05NX1NMRUVQX01PREVfRU5URVIgMAorI2RlZmluZSBXTk1fU0xFRVBfTU9ERV9FWElUIDEKKwogZW51bSB3bm1fc2xlZXBfbW9kZV9yZXNwb25zZV9zdGF0dXMgewogCVdOTV9TVEFUVVNfU0xFRVBfQUNDRVBUID0gMCwKIAlXTk1fU1RBVFVTX1NMRUVQX0VYSVRfQUNDRVBUX0dUS19VUERBVEUgPSAxLApkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9zYWUuYyBiL3NyYy9jb21tb24vc2FlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZmNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb21tb24vc2FlLmMKQEAgLTAsMCArMSwxMDI4IEBACisvKgorICogU2ltdWx0YW5lb3VzIGF1dGhlbnRpY2F0aW9uIG9mIGVxdWFscworICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImNyeXB0by9jcnlwdG8uaCIKKyNpbmNsdWRlICJjcnlwdG8vc2hhMjU2LmgiCisjaW5jbHVkZSAiY3J5cHRvL3JhbmRvbS5oIgorI2luY2x1ZGUgImNyeXB0by9kaF9ncm91cHMuaCIKKyNpbmNsdWRlICJpZWVlODAyXzExX2RlZnMuaCIKKyNpbmNsdWRlICJzYWUuaCIKKworCitpbnQgc2FlX3NldF9ncm91cChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgaW50IGdyb3VwKQoreworCXN0cnVjdCBzYWVfdGVtcG9yYXJ5X2RhdGEgKnRtcDsKKworCXNhZV9jbGVhcl9kYXRhKHNhZSk7CisJdG1wID0gc2FlLT50bXAgPSBvc196YWxsb2Moc2l6ZW9mKCp0bXApKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIEZpcnN0LCBjaGVjayBpZiB0aGlzIGlzIGFuIEVDQyBncm91cCAqLworCXRtcC0+ZWMgPSBjcnlwdG9fZWNfaW5pdChncm91cCk7CisJaWYgKHRtcC0+ZWMpIHsKKwkJc2FlLT5ncm91cCA9IGdyb3VwOworCQl0bXAtPnByaW1lX2xlbiA9IGNyeXB0b19lY19wcmltZV9sZW4odG1wLT5lYyk7CisJCXRtcC0+cHJpbWUgPSBjcnlwdG9fZWNfZ2V0X3ByaW1lKHRtcC0+ZWMpOworCQl0bXAtPm9yZGVyID0gY3J5cHRvX2VjX2dldF9vcmRlcih0bXAtPmVjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm90IGFuIEVDQyBncm91cCwgY2hlY2sgRkZDICovCisJdG1wLT5kaCA9IGRoX2dyb3Vwc19nZXQoZ3JvdXApOworCWlmICh0bXAtPmRoKSB7CisJCXNhZS0+Z3JvdXAgPSBncm91cDsKKwkJdG1wLT5wcmltZV9sZW4gPSB0bXAtPmRoLT5wcmltZV9sZW47CisJCWlmICh0bXAtPnByaW1lX2xlbiA+IFNBRV9NQVhfUFJJTUVfTEVOKSB7CisJCQlzYWVfY2xlYXJfZGF0YShzYWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdG1wLT5wcmltZV9idWYgPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KHRtcC0+ZGgtPnByaW1lLAorCQkJCQkJCXRtcC0+cHJpbWVfbGVuKTsKKwkJaWYgKHRtcC0+cHJpbWVfYnVmID09IE5VTEwpIHsKKwkJCXNhZV9jbGVhcl9kYXRhKHNhZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdG1wLT5wcmltZSA9IHRtcC0+cHJpbWVfYnVmOworCisJCXRtcC0+b3JkZXJfYnVmID0gY3J5cHRvX2JpZ251bV9pbml0X3NldCh0bXAtPmRoLT5vcmRlciwKKwkJCQkJCQl0bXAtPmRoLT5vcmRlcl9sZW4pOworCQlpZiAodG1wLT5vcmRlcl9idWYgPT0gTlVMTCkgeworCQkJc2FlX2NsZWFyX2RhdGEoc2FlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0bXAtPm9yZGVyID0gdG1wLT5vcmRlcl9idWY7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVW5zdXBwb3J0ZWQgZ3JvdXAgKi8KKwlyZXR1cm4gLTE7Cit9CisKKwordm9pZCBzYWVfY2xlYXJfdGVtcF9kYXRhKHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCXN0cnVjdCBzYWVfdGVtcG9yYXJ5X2RhdGEgKnRtcDsKKwlpZiAoc2FlID09IE5VTEwgfHwgc2FlLT50bXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCXRtcCA9IHNhZS0+dG1wOworCWNyeXB0b19lY19kZWluaXQodG1wLT5lYyk7CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLT5wcmltZV9idWYsIDApOworCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcC0+b3JkZXJfYnVmLCAwKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdCh0bXAtPnNhZV9yYW5kLCAxKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdCh0bXAtPnB3ZV9mZmMsIDEpOworCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcC0+b3duX2NvbW1pdF9zY2FsYXIsIDApOworCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYywgMCk7CisJY3J5cHRvX2JpZ251bV9kZWluaXQodG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYywgMCk7CisJY3J5cHRvX2VjX3BvaW50X2RlaW5pdCh0bXAtPnB3ZV9lY2MsIDEpOworCWNyeXB0b19lY19wb2ludF9kZWluaXQodG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjLCAwKTsKKwljcnlwdG9fZWNfcG9pbnRfZGVpbml0KHRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9lY2MsIDApOworCW9zX2ZyZWUoc2FlLT50bXApOworCXNhZS0+dG1wID0gTlVMTDsKK30KKworCit2b2lkIHNhZV9jbGVhcl9kYXRhKHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCWlmIChzYWUgPT0gTlVMTCkKKwkJcmV0dXJuOworCXNhZV9jbGVhcl90ZW1wX2RhdGEoc2FlKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwgMCk7CisJb3NfbWVtc2V0KHNhZSwgMCwgc2l6ZW9mKCpzYWUpKTsKK30KKworCitzdGF0aWMgdm9pZCBidWZfc2hpZnRfcmlnaHQodTggKmJ1Ziwgc2l6ZV90IGxlbiwgc2l6ZV90IGJpdHMpCit7CisJc2l6ZV90IGk7CisJZm9yIChpID0gbGVuIC0gMTsgaSA+IDA7IGktLSkKKwkJYnVmW2ldID0gKGJ1ZltpIC0gMV0gPDwgKDggLSBiaXRzKSkgfCAoYnVmW2ldID4+IGJpdHMpOworCWJ1ZlswXSA+Pj0gYml0czsKK30KKworCitzdGF0aWMgc3RydWN0IGNyeXB0b19iaWdudW0gKiBzYWVfZ2V0X3JhbmQoc3RydWN0IHNhZV9kYXRhICpzYWUpCit7CisJdTggdmFsW1NBRV9NQVhfUFJJTUVfTEVOXTsKKwlpbnQgaXRlciA9IDA7CisJc3RydWN0IGNyeXB0b19iaWdudW0gKmJuID0gTlVMTDsKKwlpbnQgb3JkZXJfbGVuX2JpdHMgPSBjcnlwdG9fYmlnbnVtX2JpdHMoc2FlLT50bXAtPm9yZGVyKTsKKwlzaXplX3Qgb3JkZXJfbGVuID0gKG9yZGVyX2xlbl9iaXRzICsgNykgLyA4OworCisJaWYgKG9yZGVyX2xlbiA+IHNpemVvZih2YWwpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoOzspIHsKKwkJaWYgKGl0ZXIrKyA+IDEwMCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAocmFuZG9tX2dldF9ieXRlcyh2YWwsIG9yZGVyX2xlbikgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChvcmRlcl9sZW5fYml0cyAlIDgpCisJCQlidWZfc2hpZnRfcmlnaHQodmFsLCBvcmRlcl9sZW4sIDggLSBvcmRlcl9sZW5fYml0cyAlIDgpOworCQlibiA9IGNyeXB0b19iaWdudW1faW5pdF9zZXQodmFsLCBvcmRlcl9sZW4pOworCQlpZiAoYm4gPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoY3J5cHRvX2JpZ251bV9pc196ZXJvKGJuKSB8fAorCQkgICAgY3J5cHRvX2JpZ251bV9pc19vbmUoYm4pIHx8CisJCSAgICBjcnlwdG9fYmlnbnVtX2NtcChibiwgc2FlLT50bXAtPm9yZGVyKSA+PSAwKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKworCW9zX21lbXNldCh2YWwsIDAsIG9yZGVyX2xlbik7CisJcmV0dXJuIGJuOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqIHNhZV9nZXRfcmFuZF9hbmRfbWFzayhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSkKK3sKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChzYWUtPnRtcC0+c2FlX3JhbmQsIDEpOworCXNhZS0+dG1wLT5zYWVfcmFuZCA9IHNhZV9nZXRfcmFuZChzYWUpOworCWlmIChzYWUtPnRtcC0+c2FlX3JhbmQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNhZV9nZXRfcmFuZChzYWUpOworfQorCisKK3N0YXRpYyB2b2lkIHNhZV9wd2Rfc2VlZF9rZXkoY29uc3QgdTggKmFkZHIxLCBjb25zdCB1OCAqYWRkcjIsIHU4ICprZXkpCit7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IFBXRSBkZXJpdmF0aW9uIC0gYWRkcjE9IiBNQUNTVFIKKwkJICAgIiBhZGRyMj0iIE1BQ1NUUiwgTUFDMlNUUihhZGRyMSksIE1BQzJTVFIoYWRkcjIpKTsKKwlpZiAob3NfbWVtY21wKGFkZHIxLCBhZGRyMiwgRVRIX0FMRU4pID4gMCkgeworCQlvc19tZW1jcHkoa2V5LCBhZGRyMSwgRVRIX0FMRU4pOworCQlvc19tZW1jcHkoa2V5ICsgRVRIX0FMRU4sIGFkZHIyLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJb3NfbWVtY3B5KGtleSwgYWRkcjIsIEVUSF9BTEVOKTsKKwkJb3NfbWVtY3B5KGtleSArIEVUSF9BTEVOLCBhZGRyMSwgRVRIX0FMRU4pOworCX0KK30KKworCitzdGF0aWMgaW50IHNhZV90ZXN0X3B3ZF9zZWVkX2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnB3ZF9zZWVkLAorCQkJCSBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwd2UpCit7CisJdTggcHdkX3ZhbHVlW1NBRV9NQVhfRUNDX1BSSU1FX0xFTl0sIHByaW1lW1NBRV9NQVhfRUNDX1BSSU1FX0xFTl07CisJc3RydWN0IGNyeXB0b19iaWdudW0gKng7CisJaW50IHlfYml0OworCXNpemVfdCBiaXRzOworCisJaWYgKGNyeXB0b19iaWdudW1fdG9fYmluKHNhZS0+dG1wLT5wcmltZSwgcHJpbWUsIHNpemVvZihwcmltZSksCisJCQkJIHNhZS0+dG1wLT5wcmltZV9sZW4pIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlNBRTogcHdkLXNlZWQiLCBwd2Rfc2VlZCwgU0hBMjU2X01BQ19MRU4pOworCisJLyogcHdkLXZhbHVlID0gS0RGLXoocHdkLXNlZWQsICJTQUUgSHVudGluZyBhbmQgUGVja2luZyIsIHApICovCisJYml0cyA9IGNyeXB0b19lY19wcmltZV9sZW5fYml0cyhzYWUtPnRtcC0+ZWMpOworCXNoYTI1Nl9wcmZfYml0cyhwd2Rfc2VlZCwgU0hBMjU2X01BQ19MRU4sICJTQUUgSHVudGluZyBhbmQgUGVja2luZyIsCisJCQlwcmltZSwgc2FlLT50bXAtPnByaW1lX2xlbiwgcHdkX3ZhbHVlLCBiaXRzKTsKKwlpZiAoYml0cyAlIDgpCisJCWJ1Zl9zaGlmdF9yaWdodChwd2RfdmFsdWUsIHNpemVvZihwd2RfdmFsdWUpLCA4IC0gYml0cyAlIDgpOworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IHB3ZC12YWx1ZSIsCisJCQlwd2RfdmFsdWUsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCisJaWYgKG9zX21lbWNtcChwd2RfdmFsdWUsIHByaW1lLCBzYWUtPnRtcC0+cHJpbWVfbGVuKSA+PSAwKQorCQlyZXR1cm4gMDsKKworCXlfYml0ID0gcHdkX3NlZWRbU0hBMjU2X01BQ19MRU4gLSAxXSAmIDB4MDE7CisKKwl4ID0gY3J5cHRvX2JpZ251bV9pbml0X3NldChwd2RfdmFsdWUsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWlmICh4ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoY3J5cHRvX2VjX3BvaW50X3NvbHZlX3lfY29vcmQoc2FlLT50bXAtPmVjLCBwd2UsIHgsIHlfYml0KSA8IDApIHsKKwkJY3J5cHRvX2JpZ251bV9kZWluaXQoeCwgMCk7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBObyBzb2x1dGlvbiBmb3VuZCIpOworCQlyZXR1cm4gMDsKKwl9CisJY3J5cHRvX2JpZ251bV9kZWluaXQoeCwgMCk7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogUFdFIGZvdW5kIik7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHNhZV90ZXN0X3B3ZF9zZWVkX2ZmYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnB3ZF9zZWVkLAorCQkJCSBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcHdlKQoreworCXU4IHB3ZF92YWx1ZVtTQUVfTUFYX1BSSU1FX0xFTl07CisJc2l6ZV90IGJpdHMgPSBzYWUtPnRtcC0+cHJpbWVfbGVuICogODsKKwl1OCBleHBbMV07CisJc3RydWN0IGNyeXB0b19iaWdudW0gKmEsICpiOworCWludCByZXM7CisKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBwd2Qtc2VlZCIsIHB3ZF9zZWVkLCBTSEEyNTZfTUFDX0xFTik7CisKKwkvKiBwd2QtdmFsdWUgPSBLREYteihwd2Qtc2VlZCwgIlNBRSBIdW50aW5nIGFuZCBQZWNraW5nIiwgcCkgKi8KKwlzaGEyNTZfcHJmX2JpdHMocHdkX3NlZWQsIFNIQTI1Nl9NQUNfTEVOLCAiU0FFIEh1bnRpbmcgYW5kIFBlY2tpbmciLAorCQkJc2FlLT50bXAtPmRoLT5wcmltZSwgc2FlLT50bXAtPnByaW1lX2xlbiwgcHdkX3ZhbHVlLAorCQkJYml0cyk7CisJaWYgKGJpdHMgJSA4KQorCQlidWZfc2hpZnRfcmlnaHQocHdkX3ZhbHVlLCBzaXplb2YocHdkX3ZhbHVlKSwgOCAtIGJpdHMgJSA4KTsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBwd2QtdmFsdWUiLCBwd2RfdmFsdWUsCisJCQlzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCWlmIChvc19tZW1jbXAocHdkX3ZhbHVlLCBzYWUtPnRtcC0+ZGgtPnByaW1lLCBzYWUtPnRtcC0+cHJpbWVfbGVuKSA+PSAwKQorCXsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IHB3ZC12YWx1ZSA+PSBwIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFBXRSA9IHB3ZC12YWx1ZV4oKHAtMSkvcikgbW9kdWxvIHAgKi8KKworCWEgPSBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KHB3ZF92YWx1ZSwgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwlpZiAoc2FlLT50bXAtPmRoLT5zYWZlX3ByaW1lKSB7CisJCS8qCisJCSAqIHIgPSAocC0xKS8yIGZvciB0aGUgZ3JvdXAgdXNlZCBoZXJlLCBzbyB0aGlzIGJlY29tZXM6CisJCSAqIFBXRSA9IHB3ZC12YWx1ZV4yIG1vZHVsbyBwCisJCSAqLworCQlleHBbMF0gPSAyOworCQliID0gY3J5cHRvX2JpZ251bV9pbml0X3NldChleHAsIHNpemVvZihleHApKTsKKwl9IGVsc2UgeworCQkvKiBDYWxjdWxhdGUgZXhwb25lbnQ6IChwLTEpL3IgKi8KKwkJZXhwWzBdID0gMTsKKwkJYiA9IGNyeXB0b19iaWdudW1faW5pdF9zZXQoZXhwLCBzaXplb2YoZXhwKSk7CisJCWlmIChiID09IE5VTEwgfHwKKwkJICAgIGNyeXB0b19iaWdudW1fc3ViKHNhZS0+dG1wLT5wcmltZSwgYiwgYikgPCAwIHx8CisJCSAgICBjcnlwdG9fYmlnbnVtX2RpdihiLCBzYWUtPnRtcC0+b3JkZXIsIGIpIDwgMCkgeworCQkJY3J5cHRvX2JpZ251bV9kZWluaXQoYiwgMCk7CisJCQliID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorCQlyZXMgPSAtMTsKKwllbHNlCisJCXJlcyA9IGNyeXB0b19iaWdudW1fZXhwdG1vZChhLCBiLCBzYWUtPnRtcC0+cHJpbWUsIHB3ZSk7CisKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChhLCAwKTsKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChiLCAwKTsKKworCWlmIChyZXMgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBGYWlsZWQgdG8gY2FsY3VsYXRlIFBXRSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogaWYgKFBXRSA+IDEpIC0tPiBmb3VuZCAqLworCWlmIChjcnlwdG9fYmlnbnVtX2lzX3plcm8ocHdlKSB8fCBjcnlwdG9fYmlnbnVtX2lzX29uZShwd2UpKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBQV0UgPD0gMSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogUFdFIGZvdW5kIik7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzYWVfZGVyaXZlX3B3ZV9lY2Moc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICphZGRyMSwKKwkJCSAgICAgIGNvbnN0IHU4ICphZGRyMiwgY29uc3QgdTggKnBhc3N3b3JkLAorCQkJICAgICAgc2l6ZV90IHBhc3N3b3JkX2xlbikKK3sKKwl1OCBjb3VudGVyLCBrID0gNDsKKwl1OCBhZGRyc1syICogRVRIX0FMRU5dOworCWNvbnN0IHU4ICphZGRyWzJdOworCXNpemVfdCBsZW5bMl07CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwd2VfdG1wOworCisJaWYgKHNhZS0+dG1wLT5wd2VfZWNjID09IE5VTEwpIHsKKwkJc2FlLT50bXAtPnB3ZV9lY2MgPSBjcnlwdG9fZWNfcG9pbnRfaW5pdChzYWUtPnRtcC0+ZWMpOworCQlpZiAoc2FlLT50bXAtPnB3ZV9lY2MgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwl9CisJcHdlX3RtcCA9IGNyeXB0b19lY19wb2ludF9pbml0KHNhZS0+dG1wLT5lYyk7CisJaWYgKHB3ZV90bXAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJd3BhX2hleGR1bXBfYXNjaWlfa2V5KE1TR19ERUJVRywgIlNBRTogcGFzc3dvcmQiLAorCQkJICAgICAgcGFzc3dvcmQsIHBhc3N3b3JkX2xlbik7CisKKwkvKgorCSAqIEgoc2FsdCwgaWttKSA9IEhNQUMtU0hBMjU2KHNhbHQsIGlrbSkKKwkgKiBwd2Qtc2VlZCA9IEgoTUFYKFNUQS1BLU1BQywgU1RBLUItTUFDKSB8fCBNSU4oU1RBLUEtTUFDLCBTVEEtQi1NQUMpLAorCSAqICAgICAgICAgICAgICBwYXNzd29yZCB8fCBjb3VudGVyKQorCSAqLworCXNhZV9wd2Rfc2VlZF9rZXkoYWRkcjEsIGFkZHIyLCBhZGRycyk7CisKKwlhZGRyWzBdID0gcGFzc3dvcmQ7CisJbGVuWzBdID0gcGFzc3dvcmRfbGVuOworCWFkZHJbMV0gPSAmY291bnRlcjsKKwlsZW5bMV0gPSBzaXplb2YoY291bnRlcik7CisKKwkvKgorCSAqIENvbnRpbnVlIGZvciBhdCBsZWFzdCBrIGl0ZXJhdGlvbnMgdG8gcHJvdGVjdCBhZ2FpbnN0IHNpZGUtY2hhbm5lbAorCSAqIGF0dGFja3MgdGhhdCBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcmVxdWlyZWQKKwkgKiBpbiB0aGUgbG9vcC4KKwkgKi8KKwlmb3IgKGNvdW50ZXIgPSAxOyBjb3VudGVyIDwgayB8fCAhZm91bmQ7IGNvdW50ZXIrKykgeworCQl1OCBwd2Rfc2VlZFtTSEEyNTZfTUFDX0xFTl07CisJCWludCByZXM7CisKKwkJaWYgKGNvdW50ZXIgPiAyMDApIHsKKwkJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHJhY3RpY2UgKi8KKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBGYWlsZWQgdG8gZGVyaXZlIFBXRSIpOworCQkJYnJlYWs7CisJCX0KKworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogY291bnRlciA9ICV1IiwgY291bnRlcik7CisJCWlmIChobWFjX3NoYTI1Nl92ZWN0b3IoYWRkcnMsIHNpemVvZihhZGRycyksIDIsIGFkZHIsIGxlbiwKKwkJCQkgICAgICAgcHdkX3NlZWQpIDwgMCkKKwkJCWJyZWFrOworCQlyZXMgPSBzYWVfdGVzdF9wd2Rfc2VlZF9lY2Moc2FlLCBwd2Rfc2VlZCwKKwkJCQkJICAgIGZvdW5kID8gcHdlX3RtcCA6CisJCQkJCSAgICBzYWUtPnRtcC0+cHdlX2VjYyk7CisJCWlmIChyZXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChyZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm91bmQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBJZ25vcmUgdGhpcyBQV0UgKG9uZSB3YXMgIgorCQkJCSAgICJhbHJlYWR5IHNlbGVjdGVkKSIpOworCQl9IGVsc2UgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IFVzZSB0aGlzIFBXRSIpOworCQkJZm91bmQgPSAxOworCQl9CisJfQorCisJY3J5cHRvX2VjX3BvaW50X2RlaW5pdChwd2VfdG1wLCAxKTsKKworCXJldHVybiBmb3VuZCA/IDAgOiAtMTsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfcHdlX2ZmYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKmFkZHIxLAorCQkJICAgICAgY29uc3QgdTggKmFkZHIyLCBjb25zdCB1OCAqcGFzc3dvcmQsCisJCQkgICAgICBzaXplX3QgcGFzc3dvcmRfbGVuKQoreworCXU4IGNvdW50ZXI7CisJdTggYWRkcnNbMiAqIEVUSF9BTEVOXTsKKwljb25zdCB1OCAqYWRkclsyXTsKKwlzaXplX3QgbGVuWzJdOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoc2FlLT50bXAtPnB3ZV9mZmMgPT0gTlVMTCkgeworCQlzYWUtPnRtcC0+cHdlX2ZmYyA9IGNyeXB0b19iaWdudW1faW5pdCgpOworCQlpZiAoc2FlLT50bXAtPnB3ZV9mZmMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwl3cGFfaGV4ZHVtcF9hc2NpaV9rZXkoTVNHX0RFQlVHLCAiU0FFOiBwYXNzd29yZCIsCisJCQkgICAgICBwYXNzd29yZCwgcGFzc3dvcmRfbGVuKTsKKworCS8qCisJICogSChzYWx0LCBpa20pID0gSE1BQy1TSEEyNTYoc2FsdCwgaWttKQorCSAqIHB3ZC1zZWVkID0gSChNQVgoU1RBLUEtTUFDLCBTVEEtQi1NQUMpIHx8IE1JTihTVEEtQS1NQUMsIFNUQS1CLU1BQyksCisJICogICAgICAgICAgICAgIHBhc3N3b3JkIHx8IGNvdW50ZXIpCisJICovCisJc2FlX3B3ZF9zZWVkX2tleShhZGRyMSwgYWRkcjIsIGFkZHJzKTsKKworCWFkZHJbMF0gPSBwYXNzd29yZDsKKwlsZW5bMF0gPSBwYXNzd29yZF9sZW47CisJYWRkclsxXSA9ICZjb3VudGVyOworCWxlblsxXSA9IHNpemVvZihjb3VudGVyKTsKKworCWZvciAoY291bnRlciA9IDE7ICFmb3VuZDsgY291bnRlcisrKSB7CisJCXU4IHB3ZF9zZWVkW1NIQTI1Nl9NQUNfTEVOXTsKKwkJaW50IHJlczsKKworCQlpZiAoY291bnRlciA+IDIwMCkgeworCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwcmFjdGljZSAqLworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBkZXJpdmUgUFdFIik7CisJCQlicmVhazsKKwkJfQorCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBjb3VudGVyID0gJXUiLCBjb3VudGVyKTsKKwkJaWYgKGhtYWNfc2hhMjU2X3ZlY3RvcihhZGRycywgc2l6ZW9mKGFkZHJzKSwgMiwgYWRkciwgbGVuLAorCQkJCSAgICAgICBwd2Rfc2VlZCkgPCAwKQorCQkJYnJlYWs7CisJCXJlcyA9IHNhZV90ZXN0X3B3ZF9zZWVkX2ZmYyhzYWUsIHB3ZF9zZWVkLCBzYWUtPnRtcC0+cHdlX2ZmYyk7CisJCWlmIChyZXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChyZXMgPiAwKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogVXNlIHRoaXMgUFdFIik7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gZm91bmQgPyAwIDogLTE7Cit9CisKKworc3RhdGljIGludCBzYWVfZGVyaXZlX2NvbW1pdF9lbGVtZW50X2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwKKwkJCQkJIHN0cnVjdCBjcnlwdG9fYmlnbnVtICptYXNrKQoreworCS8qIENPTU1JVC1FTEVNRU5UID0gaW52ZXJzZShzY2FsYXItb3AobWFzaywgUFdFKSkgKi8KKwlpZiAoIXNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjKSB7CisJCXNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjID0KKwkJCWNyeXB0b19lY19wb2ludF9pbml0KHNhZS0+dG1wLT5lYyk7CisJCWlmICghc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNyeXB0b19lY19wb2ludF9tdWwoc2FlLT50bXAtPmVjLCBzYWUtPnRtcC0+cHdlX2VjYywgbWFzaywKKwkJCQlzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2VjYykgPCAwIHx8CisJICAgIGNyeXB0b19lY19wb2ludF9pbnZlcnQoc2FlLT50bXAtPmVjLAorCQkJCSAgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvdWxkIG5vdCBjb21wdXRlIGNvbW1pdC1lbGVtZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfY29tbWl0X2VsZW1lbnRfZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLAorCQkJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKm1hc2spCit7CisJLyogQ09NTUlULUVMRU1FTlQgPSBpbnZlcnNlKHNjYWxhci1vcChtYXNrLCBQV0UpKSAqLworCWlmICghc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9mZmMpIHsKKwkJc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9mZmMgPSBjcnlwdG9fYmlnbnVtX2luaXQoKTsKKwkJaWYgKCFzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYykKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY3J5cHRvX2JpZ251bV9leHB0bW9kKHNhZS0+dG1wLT5wd2VfZmZjLCBtYXNrLCBzYWUtPnRtcC0+cHJpbWUsCisJCQkJICBzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYykgPCAwIHx8CisJICAgIGNyeXB0b19iaWdudW1faW52ZXJzZShzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYywKKwkJCQkgIHNhZS0+dG1wLT5wcmltZSwKKwkJCQkgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZmZjKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvdWxkIG5vdCBjb21wdXRlIGNvbW1pdC1lbGVtZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfY29tbWl0KHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICptYXNrOworCWludCByZXQgPSAtMTsKKworCW1hc2sgPSBzYWVfZ2V0X3JhbmRfYW5kX21hc2soc2FlKTsKKwlpZiAobWFzayA9PSBOVUxMKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBDb3VsZCBub3QgZ2V0IHJhbmQvbWFzayIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29tbWl0LXNjYWxhciA9IChyYW5kICsgbWFzaykgbW9kdWxvIHIgKi8KKwlpZiAoIXNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhcikgeworCQlzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIgPSBjcnlwdG9fYmlnbnVtX2luaXQoKTsKKwkJaWYgKCFzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIpCisJCQlnb3RvIGZhaWw7CisJfQorCWNyeXB0b19iaWdudW1fYWRkKHNhZS0+dG1wLT5zYWVfcmFuZCwgbWFzaywKKwkJCSAgc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyKTsKKwljcnlwdG9fYmlnbnVtX21vZChzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsIHNhZS0+dG1wLT5vcmRlciwKKwkJCSAgc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyKTsKKworCWlmIChzYWUtPnRtcC0+ZWMgJiYgc2FlX2Rlcml2ZV9jb21taXRfZWxlbWVudF9lY2Moc2FlLCBtYXNrKSA8IDApCisJCWdvdG8gZmFpbDsKKwlpZiAoc2FlLT50bXAtPmRoICYmIHNhZV9kZXJpdmVfY29tbWl0X2VsZW1lbnRfZmZjKHNhZSwgbWFzaykgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSAwOworZmFpbDoKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChtYXNrLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBzYWVfcHJlcGFyZV9jb21taXQoY29uc3QgdTggKmFkZHIxLCBjb25zdCB1OCAqYWRkcjIsCisJCSAgICAgICBjb25zdCB1OCAqcGFzc3dvcmQsIHNpemVfdCBwYXNzd29yZF9sZW4sCisJCSAgICAgICBzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSkKK3sKKwlpZiAoc2FlLT50bXAtPmVjICYmIHNhZV9kZXJpdmVfcHdlX2VjYyhzYWUsIGFkZHIxLCBhZGRyMiwgcGFzc3dvcmQsCisJCQkJCSAgcGFzc3dvcmRfbGVuKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2FlLT50bXAtPmRoICYmIHNhZV9kZXJpdmVfcHdlX2ZmYyhzYWUsIGFkZHIxLCBhZGRyMiwgcGFzc3dvcmQsCisJCQkJCSAgcGFzc3dvcmRfbGVuKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2FlX2Rlcml2ZV9jb21taXQoc2FlKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNhZV9kZXJpdmVfa19lY2Moc3RydWN0IHNhZV9kYXRhICpzYWUsIHU4ICprKQoreworCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKks7CisJaW50IHJldCA9IC0xOworCisJSyA9IGNyeXB0b19lY19wb2ludF9pbml0KHNhZS0+dG1wLT5lYyk7CisJaWYgKEsgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCisJaWYgKCFjcnlwdG9fZWNfcG9pbnRfaXNfb25fY3VydmUoc2FlLT50bXAtPmVjLAorCQkJCQkgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjKSkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogUGVlciBlbGVtZW50IGlzIG5vdCBvbiBjdXJ2ZSIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBLID0gc2NhbGFyLW9wKHJhbmQsIChlbGVtLW9wKHNjYWxhci1vcChwZWVyLWNvbW1pdC1zY2FsYXIsIFBXRSksCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVFUi1DT01NSVQtRUxFTUVOVCkpKQorCSAqIElmIEsgaXMgaWRlbnRpdHkgZWxlbWVudCAocG9pbnQtYXQtaW5maW5pdHkpLCByZWplY3QKKwkgKiBrID0gRihLKSAoPSB4IGNvb3JkaW5hdGUpCisJICovCisKKwlpZiAoY3J5cHRvX2VjX3BvaW50X211bChzYWUtPnRtcC0+ZWMsIHNhZS0+dG1wLT5wd2VfZWNjLAorCQkJCXNhZS0+cGVlcl9jb21taXRfc2NhbGFyLCBLKSA8IDAgfHwKKwkgICAgY3J5cHRvX2VjX3BvaW50X2FkZChzYWUtPnRtcC0+ZWMsIEssCisJCQkJc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjLCBLKSA8IDAgfHwKKwkgICAgY3J5cHRvX2VjX3BvaW50X211bChzYWUtPnRtcC0+ZWMsIEssIHNhZS0+dG1wLT5zYWVfcmFuZCwgSykgPCAwIHx8CisJICAgIGNyeXB0b19lY19wb2ludF9pc19hdF9pbmZpbml0eShzYWUtPnRtcC0+ZWMsIEspIHx8CisJICAgIGNyeXB0b19lY19wb2ludF90b19iaW4oc2FlLT50bXAtPmVjLCBLLCBrLCBOVUxMKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBjYWxjdWxhdGUgSyBhbmQgayIpOworCQlnb3RvIGZhaWw7CisJfQorCisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlNBRTogayIsIGssIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCisJcmV0ID0gMDsKK2ZhaWw6CisJY3J5cHRvX2VjX3BvaW50X2RlaW5pdChLLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9rX2ZmYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgdTggKmspCit7CisJc3RydWN0IGNyeXB0b19iaWdudW0gKks7CisJaW50IHJldCA9IC0xOworCisJSyA9IGNyeXB0b19iaWdudW1faW5pdCgpOworCWlmIChLID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogSyA9IHNjYWxhci1vcChyYW5kLCAoZWxlbS1vcChzY2FsYXItb3AocGVlci1jb21taXQtc2NhbGFyLCBQV0UpLAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFRVItQ09NTUlULUVMRU1FTlQpKSkKKwkgKiBJZiBLIGlzIGlkZW50aXR5IGVsZW1lbnQgKG9uZSksIHJlamVjdC4KKwkgKiBrID0gRihLKSAoPSB4IGNvb3JkaW5hdGUpCisJICovCisKKwlpZiAoY3J5cHRvX2JpZ251bV9leHB0bW9kKHNhZS0+dG1wLT5wd2VfZmZjLCBzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwKKwkJCQkgIHNhZS0+dG1wLT5wcmltZSwgSykgPCAwIHx8CisJICAgIGNyeXB0b19iaWdudW1fbXVsbW9kKEssIHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYywKKwkJCQkgc2FlLT50bXAtPnByaW1lLCBLKSA8IDAgfHwKKwkgICAgY3J5cHRvX2JpZ251bV9leHB0bW9kKEssIHNhZS0+dG1wLT5zYWVfcmFuZCwgc2FlLT50bXAtPnByaW1lLCBLKSA8IDAKKwkgICAgfHwKKwkgICAgY3J5cHRvX2JpZ251bV9pc19vbmUoSykgfHwKKwkgICAgY3J5cHRvX2JpZ251bV90b19iaW4oSywgaywgU0FFX01BWF9QUklNRV9MRU4sIHNhZS0+dG1wLT5wcmltZV9sZW4pIDwKKwkgICAgMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRmFpbGVkIHRvIGNhbGN1bGF0ZSBLIGFuZCBrIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBrIiwgaywgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwlyZXQgPSAwOworZmFpbDoKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChLLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgc2FlX2Rlcml2ZV9rZXlzKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqaykKK3sKKwl1OCBudWxsX2tleVtTQUVfS0VZU0VFRF9LRVlfTEVOXSwgdmFsW1NBRV9NQVhfUFJJTUVfTEVOXTsKKwl1OCBrZXlzZWVkW1NIQTI1Nl9NQUNfTEVOXTsKKwl1OCBrZXlzW1NBRV9LQ0tfTEVOICsgU0FFX1BNS19MRU5dOworCXN0cnVjdCBjcnlwdG9fYmlnbnVtICp0bXA7CisJaW50IHJldCA9IC0xOworCisJdG1wID0gY3J5cHRvX2JpZ251bV9pbml0KCk7CisJaWYgKHRtcCA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwkvKiBrZXlzZWVkID0gSCg8MD4zMiwgaykKKwkgKiBLQ0sgfHwgUE1LID0gS0RGLTUxMihrZXlzZWVkLCAiU0FFIEtDSyBhbmQgUE1LIiwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAoY29tbWl0LXNjYWxhciArIHBlZXItY29tbWl0LXNjYWxhcikgbW9kdWxvIHIpCisJICogUE1LSUQgPSBMKChjb21taXQtc2NhbGFyICsgcGVlci1jb21taXQtc2NhbGFyKSBtb2R1bG8gciwgMCwgMTI4KQorCSAqLworCisJb3NfbWVtc2V0KG51bGxfa2V5LCAwLCBzaXplb2YobnVsbF9rZXkpKTsKKwlobWFjX3NoYTI1NihudWxsX2tleSwgc2l6ZW9mKG51bGxfa2V5KSwgaywgc2FlLT50bXAtPnByaW1lX2xlbiwKKwkJICAgIGtleXNlZWQpOworCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJTQUU6IGtleXNlZWQiLCBrZXlzZWVkLCBzaXplb2Yoa2V5c2VlZCkpOworCisJY3J5cHRvX2JpZ251bV9hZGQoc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyLCBzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwKKwkJCSAgdG1wKTsKKwljcnlwdG9fYmlnbnVtX21vZCh0bXAsIHNhZS0+dG1wLT5vcmRlciwgdG1wKTsKKwljcnlwdG9fYmlnbnVtX3RvX2Jpbih0bXAsIHZhbCwgc2l6ZW9mKHZhbCksIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIlNBRTogUE1LSUQiLCB2YWwsIFNBRV9QTUtJRF9MRU4pOworCXNoYTI1Nl9wcmYoa2V5c2VlZCwgc2l6ZW9mKGtleXNlZWQpLCAiU0FFIEtDSyBhbmQgUE1LIiwKKwkJICAgdmFsLCBzYWUtPnRtcC0+cHJpbWVfbGVuLCBrZXlzLCBzaXplb2Yoa2V5cykpOworCW9zX21lbWNweShzYWUtPnRtcC0+a2NrLCBrZXlzLCBTQUVfS0NLX0xFTik7CisJb3NfbWVtY3B5KHNhZS0+cG1rLCBrZXlzICsgU0FFX0tDS19MRU4sIFNBRV9QTUtfTEVOKTsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiU0FFOiBLQ0siLCBzYWUtPnRtcC0+a2NrLCBTQUVfS0NLX0xFTik7CisJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIlNBRTogUE1LIiwgc2FlLT5wbWssIFNBRV9QTUtfTEVOKTsKKworCXJldCA9IDA7CitmYWlsOgorCWNyeXB0b19iaWdudW1fZGVpbml0KHRtcCwgMCk7CisJcmV0dXJuIHJldDsKK30KKworCitpbnQgc2FlX3Byb2Nlc3NfY29tbWl0KHN0cnVjdCBzYWVfZGF0YSAqc2FlKQoreworCXU4IGtbU0FFX01BWF9QUklNRV9MRU5dOworCWlmICgoc2FlLT50bXAtPmVjICYmIHNhZV9kZXJpdmVfa19lY2Moc2FlLCBrKSA8IDApIHx8CisJICAgIChzYWUtPnRtcC0+ZGggJiYgc2FlX2Rlcml2ZV9rX2ZmYyhzYWUsIGspIDwgMCkgfHwKKwkgICAgc2FlX2Rlcml2ZV9rZXlzKHNhZSwgaykgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzYWVfd3JpdGVfY29tbWl0KHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBzdHJ1Y3Qgd3BhYnVmICpidWYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3cGFidWYgKnRva2VuKQoreworCXU4ICpwb3M7CisJd3BhYnVmX3B1dF9sZTE2KGJ1Ziwgc2FlLT5ncm91cCk7IC8qIEZpbml0ZSBDeWNsaWMgR3JvdXAgKi8KKwlpZiAodG9rZW4pCisJCXdwYWJ1Zl9wdXRfYnVmKGJ1ZiwgdG9rZW4pOworCXBvcyA9IHdwYWJ1Zl9wdXQoYnVmLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwljcnlwdG9fYmlnbnVtX3RvX2JpbihzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsIHBvcywKKwkJCSAgICAgc2FlLT50bXAtPnByaW1lX2xlbiwgc2FlLT50bXAtPnByaW1lX2xlbik7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBvd24gY29tbWl0LXNjYWxhciIsCisJCSAgICBwb3MsIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWlmIChzYWUtPnRtcC0+ZWMpIHsKKwkJcG9zID0gd3BhYnVmX3B1dChidWYsIDIgKiBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwkJY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzYWUtPnRtcC0+ZWMsCisJCQkJICAgICAgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjLAorCQkJCSAgICAgICBwb3MsIHBvcyArIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IG93biBjb21taXQtZWxlbWVudCh4KSIsCisJCQkgICAgcG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBvd24gY29tbWl0LWVsZW1lbnQoeSkiLAorCQkJICAgIHBvcyArIHNhZS0+dG1wLT5wcmltZV9sZW4sIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCX0gZWxzZSB7CisJCXBvcyA9IHdwYWJ1Zl9wdXQoYnVmLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwkJY3J5cHRvX2JpZ251bV90b19iaW4oc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9mZmMsIHBvcywKKwkJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4sIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IG93biBjb21taXQtZWxlbWVudCIsCisJCQkgICAgcG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwl9Cit9CisKKworc3RhdGljIHUxNiBzYWVfZ3JvdXBfYWxsb3dlZChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgaW50ICphbGxvd2VkX2dyb3VwcywKKwkJCSAgICAgdTE2IGdyb3VwKQoreworCWlmIChhbGxvd2VkX2dyb3VwcykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgYWxsb3dlZF9ncm91cHNbaV0gPj0gMDsgaSsrKSB7CisJCQlpZiAoYWxsb3dlZF9ncm91cHNbaV0gPT0gZ3JvdXApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFsbG93ZWRfZ3JvdXBzW2ldICE9IGdyb3VwKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogUHJvcG9zZWQgZ3JvdXAgJXUgbm90ICIKKwkJCQkgICAiZW5hYmxlZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIiwKKwkJCQkgICBncm91cCk7CisJCQlyZXR1cm4gV0xBTl9TVEFUVVNfRklOSVRFX0NZQ0xJQ19HUk9VUF9OT1RfU1VQUE9SVEVEOworCQl9CisJfQorCisJaWYgKHNhZS0+c3RhdGUgPT0gU0FFX0NPTU1JVFRFRCAmJiBncm91cCAhPSBzYWUtPmdyb3VwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBEbyBub3QgYWxsb3cgZ3JvdXAgdG8gYmUgY2hhbmdlZCIpOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfRklOSVRFX0NZQ0xJQ19HUk9VUF9OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChncm91cCAhPSBzYWUtPmdyb3VwICYmIHNhZV9zZXRfZ3JvdXAoc2FlLCBncm91cCkgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBVbnN1cHBvcnRlZCBGaW5pdGUgQ3ljbGljIEdyb3VwICV1IiwKKwkJCSAgIGdyb3VwKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX0ZJTklURV9DWUNMSUNfR1JPVVBfTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoc2FlLT50bXAtPmRoICYmICFhbGxvd2VkX2dyb3VwcykgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogRG8gbm90IGFsbG93IEZGQyBncm91cCAldSB3aXRob3V0ICIKKwkJCSAgICJleHBsaWNpdCBjb25maWd1cmF0aW9uIGVuYWJsaW5nIGl0IiwgZ3JvdXApOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfRklOSVRFX0NZQ0xJQ19HUk9VUF9OT1RfU1VQUE9SVEVEOworCX0KKworCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOworfQorCisKK3N0YXRpYyB2b2lkIHNhZV9wYXJzZV9jb21taXRfdG9rZW4oc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICoqcG9zLAorCQkJCSAgIGNvbnN0IHU4ICplbmQsIGNvbnN0IHU4ICoqdG9rZW4sCisJCQkJICAgc2l6ZV90ICp0b2tlbl9sZW4pCit7CisJaWYgKCpwb3MgKyAoc2FlLT50bXAtPmVjID8gMyA6IDIpICogc2FlLT50bXAtPnByaW1lX2xlbiA8IGVuZCkgeworCQlzaXplX3QgdGxlbiA9IGVuZCAtICgqcG9zICsgKHNhZS0+dG1wLT5lYyA/IDMgOiAyKSAqCisJCQkJICAgICBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBBbnRpLUNsb2dnaW5nIFRva2VuIiwgKnBvcywgdGxlbik7CisJCWlmICh0b2tlbikKKwkJCSp0b2tlbiA9ICpwb3M7CisJCWlmICh0b2tlbl9sZW4pCisJCQkqdG9rZW5fbGVuID0gdGxlbjsKKwkJKnBvcyArPSB0bGVuOworCX0gZWxzZSB7CisJCWlmICh0b2tlbikKKwkJCSp0b2tlbiA9IE5VTEw7CisJCWlmICh0b2tlbl9sZW4pCisJCQkqdG9rZW5fbGVuID0gMDsKKwl9Cit9CisKKworc3RhdGljIHUxNiBzYWVfcGFyc2VfY29tbWl0X3NjYWxhcihzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKipwb3MsCisJCQkJICAgY29uc3QgdTggKmVuZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcGVlcl9zY2FsYXI7CisKKwlpZiAoKnBvcyArIHNhZS0+dG1wLT5wcmltZV9sZW4gPiBlbmQpIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IE5vdCBlbm91Z2ggZGF0YSBmb3Igc2NhbGFyIik7CisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCX0KKworCXBlZXJfc2NhbGFyID0gY3J5cHRvX2JpZ251bV9pbml0X3NldCgqcG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwlpZiAocGVlcl9zY2FsYXIgPT0gTlVMTCkKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisKKwkvKgorCSAqIElFRUUgU3RkIDgwMi4xMS0yMDEyLCAxMS4zLjguNi4xOiBJZiB0aGVyZSBpcyBhIHByb3RvY29sIGluc3RhbmNlIGZvcgorCSAqIHRoZSBwZWVyIGFuZCBpdCBpcyBpbiBBdXRoZW50aWNhdGVkIHN0YXRlLCB0aGUgbmV3IENvbW1pdCBNZXNzYWdlCisJICogc2hhbGwgYmUgZHJvcHBlZCBpZiB0aGUgcGVlci1zY2FsYXIgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgorCSAqIHRoZSBleGlzdGluZyBwcm90b2NvbCBpbnN0YW5jZS4KKwkgKi8KKwlpZiAoc2FlLT5zdGF0ZSA9PSBTQUVfQUNDRVBURUQgJiYgc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIgJiYKKwkgICAgY3J5cHRvX2JpZ251bV9jbXAoc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsIHBlZXJfc2NhbGFyKSA9PSAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBEbyBub3QgYWNjZXB0IHJlLXVzZSBvZiBwcmV2aW91cyAiCisJCQkgICAicGVlci1jb21taXQtc2NhbGFyIik7CisJCWNyeXB0b19iaWdudW1fZGVpbml0KHBlZXJfc2NhbGFyLCAwKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisJLyogMCA8IHNjYWxhciA8IHIgKi8KKwlpZiAoY3J5cHRvX2JpZ251bV9pc196ZXJvKHBlZXJfc2NhbGFyKSB8fAorCSAgICBjcnlwdG9fYmlnbnVtX2NtcChwZWVyX3NjYWxhciwgc2FlLT50bXAtPm9yZGVyKSA+PSAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBJbnZhbGlkIHBlZXIgc2NhbGFyIik7CisJCWNyeXB0b19iaWdudW1fZGVpbml0KHBlZXJfc2NhbGFyLCAwKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChzYWUtPnBlZXJfY29tbWl0X3NjYWxhciwgMCk7CisJc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIgPSBwZWVyX3NjYWxhcjsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFBlZXIgY29tbWl0LXNjYWxhciIsCisJCSAgICAqcG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwkqcG9zICs9IHNhZS0+dG1wLT5wcmltZV9sZW47CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdTE2IHNhZV9wYXJzZV9jb21taXRfZWxlbWVudF9lY2Moc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpwb3MsCisJCQkJCWNvbnN0IHU4ICplbmQpCit7CisJdTggcHJpbWVbU0FFX01BWF9FQ0NfUFJJTUVfTEVOXTsKKworCWlmIChwb3MgKyAyICogc2FlLT50bXAtPnByaW1lX2xlbiA+IGVuZCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogTm90IGVub3VnaCBkYXRhIGZvciAiCisJCQkgICAiY29tbWl0LWVsZW1lbnQiKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisJaWYgKGNyeXB0b19iaWdudW1fdG9fYmluKHNhZS0+dG1wLT5wcmltZSwgcHJpbWUsIHNpemVvZihwcmltZSksCisJCQkJIHNhZS0+dG1wLT5wcmltZV9sZW4pIDwgMCkKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisKKwkvKiBlbGVtZW50IHggYW5kIHkgY29vcmRpbmF0ZXMgPCBwICovCisJaWYgKG9zX21lbWNtcChwb3MsIHByaW1lLCBzYWUtPnRtcC0+cHJpbWVfbGVuKSA+PSAwIHx8CisJICAgIG9zX21lbWNtcChwb3MgKyBzYWUtPnRtcC0+cHJpbWVfbGVuICsgc2FlLT50bXAtPnByaW1lX2xlbiwgcHJpbWUsCisJCSAgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pID49IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEludmFsaWQgY29vcmRpbmF0ZXMgaW4gcGVlciAiCisJCQkgICAiZWxlbWVudCIpOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFBlZXIgY29tbWl0LWVsZW1lbnQoeCkiLAorCQkgICAgcG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IFBlZXIgY29tbWl0LWVsZW1lbnQoeSkiLAorCQkgICAgcG9zICsgc2FlLT50bXAtPnByaW1lX2xlbiwgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwljcnlwdG9fZWNfcG9pbnRfZGVpbml0KHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2VjYywgMCk7CisJc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjID0KKwkJY3J5cHRvX2VjX3BvaW50X2Zyb21fYmluKHNhZS0+dG1wLT5lYywgcG9zKTsKKwlpZiAoc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZWNjID09IE5VTEwpCisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCisJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHUxNiBzYWVfcGFyc2VfY29tbWl0X2VsZW1lbnRfZmZjKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqcG9zLAorCQkJCQljb25zdCB1OCAqZW5kKQoreworCWlmIChwb3MgKyBzYWUtPnRtcC0+cHJpbWVfbGVuID4gZW5kKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBOb3QgZW5vdWdoIGRhdGEgZm9yICIKKwkJCSAgICJjb21taXQtZWxlbWVudCIpOworCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwl9CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBQZWVyIGNvbW1pdC1lbGVtZW50IiwgcG9zLAorCQkgICAgc2FlLT50bXAtPnByaW1lX2xlbik7CisKKwljcnlwdG9fYmlnbnVtX2RlaW5pdChzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMsIDApOworCXNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYyA9CisJCWNyeXB0b19iaWdudW1faW5pdF9zZXQocG9zLCBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwlpZiAoc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjID09IE5VTEwpCisJCXJldHVybiBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCWlmIChjcnlwdG9fYmlnbnVtX2lzX3plcm8oc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjKSB8fAorCSAgICBjcnlwdG9fYmlnbnVtX2lzX29uZShzYWUtPnRtcC0+cGVlcl9jb21taXRfZWxlbWVudF9mZmMpIHx8CisJICAgIGNyeXB0b19iaWdudW1fY21wKHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2ZmYywKKwkJCSAgICAgIHNhZS0+dG1wLT5wcmltZSkgPj0gMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogSW52YWxpZCBwZWVyIGVsZW1lbnQiKTsKKwkJcmV0dXJuIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHUxNiBzYWVfcGFyc2VfY29tbWl0X2VsZW1lbnQoc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpwb3MsCisJCQkJICAgIGNvbnN0IHU4ICplbmQpCit7CisJaWYgKHNhZS0+dG1wLT5kaCkKKwkJcmV0dXJuIHNhZV9wYXJzZV9jb21taXRfZWxlbWVudF9mZmMoc2FlLCBwb3MsIGVuZCk7CisJcmV0dXJuIHNhZV9wYXJzZV9jb21taXRfZWxlbWVudF9lY2Moc2FlLCBwb3MsIGVuZCk7Cit9CisKKwordTE2IHNhZV9wYXJzZV9jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgbGVuLAorCQkgICAgIGNvbnN0IHU4ICoqdG9rZW4sIHNpemVfdCAqdG9rZW5fbGVuLCBpbnQgKmFsbG93ZWRfZ3JvdXBzKQoreworCWNvbnN0IHU4ICpwb3MgPSBkYXRhLCAqZW5kID0gZGF0YSArIGxlbjsKKwl1MTYgcmVzOworCisJLyogQ2hlY2sgRmluaXRlIEN5Y2xpYyBHcm91cCAqLworCWlmIChwb3MgKyAyID4gZW5kKQorCQlyZXR1cm4gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwlyZXMgPSBzYWVfZ3JvdXBfYWxsb3dlZChzYWUsIGFsbG93ZWRfZ3JvdXBzLCBXUEFfR0VUX0xFMTYocG9zKSk7CisJaWYgKHJlcyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gcmVzOworCXBvcyArPSAyOworCisJLyogT3B0aW9uYWwgQW50aS1DbG9nZ2luZyBUb2tlbiAqLworCXNhZV9wYXJzZV9jb21taXRfdG9rZW4oc2FlLCAmcG9zLCBlbmQsIHRva2VuLCB0b2tlbl9sZW4pOworCisJLyogY29tbWl0LXNjYWxhciAqLworCXJlcyA9IHNhZV9wYXJzZV9jb21taXRfc2NhbGFyKHNhZSwgJnBvcywgZW5kKTsKKwlpZiAocmVzICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiByZXM7CisKKwkvKiBjb21taXQtZWxlbWVudCAqLworCXJldHVybiBzYWVfcGFyc2VfY29tbWl0X2VsZW1lbnQoc2FlLCBwb3MsIGVuZCk7Cit9CisKKworc3RhdGljIHZvaWQgc2FlX2NuX2NvbmZpcm0oc3RydWN0IHNhZV9kYXRhICpzYWUsIGNvbnN0IHU4ICpzYywKKwkJCSAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpzY2FsYXIxLAorCQkJICAgY29uc3QgdTggKmVsZW1lbnQxLCBzaXplX3QgZWxlbWVudDFfbGVuLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKnNjYWxhcjIsCisJCQkgICBjb25zdCB1OCAqZWxlbWVudDIsIHNpemVfdCBlbGVtZW50Ml9sZW4sCisJCQkgICB1OCAqY29uZmlybSkKK3sKKwljb25zdCB1OCAqYWRkcls1XTsKKwlzaXplX3QgbGVuWzVdOworCXU4IHNjYWxhcl9iMVtTQUVfTUFYX1BSSU1FX0xFTl0sIHNjYWxhcl9iMltTQUVfTUFYX1BSSU1FX0xFTl07CisKKwkvKiBDb25maXJtCisJICogQ04oa2V5LCBYLCBZLCBaLCAuLi4pID0KKwkgKiAgICBITUFDLVNIQTI1NihrZXksIEQyT1MoWCkgfHwgRDJPUyhZKSB8fCBEMk9TKFopIHwgLi4uKQorCSAqIGNvbmZpcm0gPSBDTihLQ0ssIHNlbmQtY29uZmlybSwgY29tbWl0LXNjYWxhciwgQ09NTUlULUVMRU1FTlQsCisJICogICAgICAgICAgICAgIHBlZXItY29tbWl0LXNjYWxhciwgUEVFUi1DT01NSVQtRUxFTUVOVCkKKwkgKiB2ZXJpZmllciA9IENOKEtDSywgcGVlci1zZW5kLWNvbmZpcm0sIHBlZXItY29tbWl0LXNjYWxhciwKKwkgKiAgICAgICAgICAgICAgIFBFRVItQ09NTUlULUVMRU1FTlQsIGNvbW1pdC1zY2FsYXIsIENPTU1JVC1FTEVNRU5UKQorCSAqLworCWFkZHJbMF0gPSBzYzsKKwlsZW5bMF0gPSAyOworCWNyeXB0b19iaWdudW1fdG9fYmluKHNjYWxhcjEsIHNjYWxhcl9iMSwgc2l6ZW9mKHNjYWxhcl9iMSksCisJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWFkZHJbMV0gPSBzY2FsYXJfYjE7CisJbGVuWzFdID0gc2FlLT50bXAtPnByaW1lX2xlbjsKKwlhZGRyWzJdID0gZWxlbWVudDE7CisJbGVuWzJdID0gZWxlbWVudDFfbGVuOworCWNyeXB0b19iaWdudW1fdG9fYmluKHNjYWxhcjIsIHNjYWxhcl9iMiwgc2l6ZW9mKHNjYWxhcl9iMiksCisJCQkgICAgIHNhZS0+dG1wLT5wcmltZV9sZW4pOworCWFkZHJbM10gPSBzY2FsYXJfYjI7CisJbGVuWzNdID0gc2FlLT50bXAtPnByaW1lX2xlbjsKKwlhZGRyWzRdID0gZWxlbWVudDI7CisJbGVuWzRdID0gZWxlbWVudDJfbGVuOworCWhtYWNfc2hhMjU2X3ZlY3RvcihzYWUtPnRtcC0+a2NrLCBzaXplb2Yoc2FlLT50bXAtPmtjayksIDUsIGFkZHIsIGxlbiwKKwkJCSAgIGNvbmZpcm0pOworfQorCisKK3N0YXRpYyB2b2lkIHNhZV9jbl9jb25maXJtX2VjYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnNjLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpzY2FsYXIxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmVsZW1lbnQxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpzY2FsYXIyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmVsZW1lbnQyLAorCQkJICAgICAgIHU4ICpjb25maXJtKQoreworCXU4IGVsZW1lbnRfYjFbMiAqIFNBRV9NQVhfRUNDX1BSSU1FX0xFTl07CisJdTggZWxlbWVudF9iMlsyICogU0FFX01BWF9FQ0NfUFJJTUVfTEVOXTsKKworCWNyeXB0b19lY19wb2ludF90b19iaW4oc2FlLT50bXAtPmVjLCBlbGVtZW50MSwgZWxlbWVudF9iMSwKKwkJCSAgICAgICBlbGVtZW50X2IxICsgc2FlLT50bXAtPnByaW1lX2xlbik7CisJY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzYWUtPnRtcC0+ZWMsIGVsZW1lbnQyLCBlbGVtZW50X2IyLAorCQkJICAgICAgIGVsZW1lbnRfYjIgKyBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCXNhZV9jbl9jb25maXJtKHNhZSwgc2MsIHNjYWxhcjEsIGVsZW1lbnRfYjEsIDIgKiBzYWUtPnRtcC0+cHJpbWVfbGVuLAorCQkgICAgICAgc2NhbGFyMiwgZWxlbWVudF9iMiwgMiAqIHNhZS0+dG1wLT5wcmltZV9sZW4sIGNvbmZpcm0pOworfQorCisKK3N0YXRpYyB2b2lkIHNhZV9jbl9jb25maXJtX2ZmYyhzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKnNjLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpzY2FsYXIxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICplbGVtZW50MSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqc2NhbGFyMiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqZWxlbWVudDIsCisJCQkgICAgICAgdTggKmNvbmZpcm0pCit7CisJdTggZWxlbWVudF9iMVtTQUVfTUFYX1BSSU1FX0xFTl07CisJdTggZWxlbWVudF9iMltTQUVfTUFYX1BSSU1FX0xFTl07CisKKwljcnlwdG9fYmlnbnVtX3RvX2JpbihlbGVtZW50MSwgZWxlbWVudF9iMSwgc2l6ZW9mKGVsZW1lbnRfYjEpLAorCQkJICAgICBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKwljcnlwdG9fYmlnbnVtX3RvX2JpbihlbGVtZW50MiwgZWxlbWVudF9iMiwgc2l6ZW9mKGVsZW1lbnRfYjIpLAorCQkJICAgICBzYWUtPnRtcC0+cHJpbWVfbGVuKTsKKworCXNhZV9jbl9jb25maXJtKHNhZSwgc2MsIHNjYWxhcjEsIGVsZW1lbnRfYjEsIHNhZS0+dG1wLT5wcmltZV9sZW4sCisJCSAgICAgICBzY2FsYXIyLCBlbGVtZW50X2IyLCBzYWUtPnRtcC0+cHJpbWVfbGVuLCBjb25maXJtKTsKK30KKworCit2b2lkIHNhZV93cml0ZV9jb25maXJtKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBzdHJ1Y3Qgd3BhYnVmICpidWYpCit7CisJY29uc3QgdTggKnNjOworCisJLyogU2VuZC1Db25maXJtICovCisJc2MgPSB3cGFidWZfcHV0KGJ1ZiwgMCk7CisJd3BhYnVmX3B1dF9sZTE2KGJ1Ziwgc2FlLT5zZW5kX2NvbmZpcm0pOworCXNhZS0+c2VuZF9jb25maXJtKys7CisKKwlpZiAoc2FlLT50bXAtPmVjKQorCQlzYWVfY25fY29uZmlybV9lY2Moc2FlLCBzYywgc2FlLT50bXAtPm93bl9jb21taXRfc2NhbGFyLAorCQkJCSAgIHNhZS0+dG1wLT5vd25fY29tbWl0X2VsZW1lbnRfZWNjLAorCQkJCSAgIHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLAorCQkJCSAgIHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2VjYywKKwkJCQkgICB3cGFidWZfcHV0KGJ1ZiwgU0hBMjU2X01BQ19MRU4pKTsKKwllbHNlCisJCXNhZV9jbl9jb25maXJtX2ZmYyhzYWUsIHNjLCBzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9mZmMsCisJCQkJICAgc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJCSAgIHdwYWJ1Zl9wdXQoYnVmLCBTSEEyNTZfTUFDX0xFTikpOworfQorCisKK2ludCBzYWVfY2hlY2tfY29uZmlybShzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4pCit7CisJdTggdmVyaWZpZXJbU0hBMjU2X01BQ19MRU5dOworCisJaWYgKGxlbiA8IDIgKyBTSEEyNTZfTUFDX0xFTikgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogVG9vIHNob3J0IGNvbmZpcm0gbWVzc2FnZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IHBlZXItc2VuZC1jb25maXJtICV1IiwgV1BBX0dFVF9MRTE2KGRhdGEpKTsKKworCWlmIChzYWUtPnRtcC0+ZWMpCisJCXNhZV9jbl9jb25maXJtX2VjYyhzYWUsIGRhdGEsIHNhZS0+cGVlcl9jb21taXRfc2NhbGFyLAorCQkJCSAgIHNhZS0+dG1wLT5wZWVyX2NvbW1pdF9lbGVtZW50X2VjYywKKwkJCQkgICBzYWUtPnRtcC0+b3duX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPm93bl9jb21taXRfZWxlbWVudF9lY2MsCisJCQkJICAgdmVyaWZpZXIpOworCWVsc2UKKwkJc2FlX2NuX2NvbmZpcm1fZmZjKHNhZSwgZGF0YSwgc2FlLT5wZWVyX2NvbW1pdF9zY2FsYXIsCisJCQkJICAgc2FlLT50bXAtPnBlZXJfY29tbWl0X2VsZW1lbnRfZmZjLAorCQkJCSAgIHNhZS0+dG1wLT5vd25fY29tbWl0X3NjYWxhciwKKwkJCQkgICBzYWUtPnRtcC0+b3duX2NvbW1pdF9lbGVtZW50X2ZmYywKKwkJCQkgICB2ZXJpZmllcik7CisKKwlpZiAob3NfbWVtY21wKHZlcmlmaWVyLCBkYXRhICsgMiwgU0hBMjU2X01BQ19MRU4pICE9IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvbmZpcm0gbWlzbWF0Y2giKTsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiU0FFOiBSZWNlaXZlZCBjb25maXJtIiwKKwkJCSAgICBkYXRhICsgMiwgU0hBMjU2X01BQ19MRU4pOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJTQUU6IENhbGN1bGF0ZWQgdmVyaWZpZXIiLAorCQkJICAgIHZlcmlmaWVyLCBTSEEyNTZfTUFDX0xFTik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vc2FlLmggYi9zcmMvY29tbW9uL3NhZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmE5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tbW9uL3NhZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBTaW11bHRhbmVvdXMgYXV0aGVudGljYXRpb24gb2YgZXF1YWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgU0FFX0gKKyNkZWZpbmUgU0FFX0gKKworI2RlZmluZSBTQUVfS0NLX0xFTiAzMgorI2RlZmluZSBTQUVfUE1LX0xFTiAzMgorI2RlZmluZSBTQUVfUE1LSURfTEVOIDE2CisjZGVmaW5lIFNBRV9LRVlTRUVEX0tFWV9MRU4gMzIKKyNkZWZpbmUgU0FFX01BWF9QUklNRV9MRU4gNTEyCisjZGVmaW5lIFNBRV9NQVhfRUNDX1BSSU1FX0xFTiA2NgorI2RlZmluZSBTQUVfQ09NTUlUX01BWF9MRU4gKDIgKyAzICogU0FFX01BWF9QUklNRV9MRU4pCisjZGVmaW5lIFNBRV9DT05GSVJNX01BWF9MRU4gKDIgKyBTQUVfTUFYX1BSSU1FX0xFTikKKworc3RydWN0IHNhZV90ZW1wb3JhcnlfZGF0YSB7CisJdTgga2NrW1NBRV9LQ0tfTEVOXTsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqb3duX2NvbW1pdF9zY2FsYXI7CisJc3RydWN0IGNyeXB0b19iaWdudW0gKm93bl9jb21taXRfZWxlbWVudF9mZmM7CisJc3RydWN0IGNyeXB0b19lY19wb2ludCAqb3duX2NvbW1pdF9lbGVtZW50X2VjYzsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcGVlcl9jb21taXRfZWxlbWVudF9mZmM7CisJc3RydWN0IGNyeXB0b19lY19wb2ludCAqcGVlcl9jb21taXRfZWxlbWVudF9lY2M7CisJc3RydWN0IGNyeXB0b19lY19wb2ludCAqcHdlX2VjYzsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcHdlX2ZmYzsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqc2FlX3JhbmQ7CisJc3RydWN0IGNyeXB0b19lYyAqZWM7CisJaW50IHByaW1lX2xlbjsKKwljb25zdCBzdHJ1Y3QgZGhfZ3JvdXAgKmRoOworCWNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpwcmltZTsKKwljb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqb3JkZXI7CisJc3RydWN0IGNyeXB0b19iaWdudW0gKnByaW1lX2J1ZjsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqb3JkZXJfYnVmOworfTsKKworc3RydWN0IHNhZV9kYXRhIHsKKwllbnVtIHsgU0FFX05PVEhJTkcsIFNBRV9DT01NSVRURUQsIFNBRV9DT05GSVJNRUQsIFNBRV9BQ0NFUFRFRCB9IHN0YXRlOworCXUxNiBzZW5kX2NvbmZpcm07CisJdTggcG1rW1NBRV9QTUtfTEVOXTsKKwlzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqcGVlcl9jb21taXRfc2NhbGFyOworCWludCBncm91cDsKKwlzdHJ1Y3Qgc2FlX3RlbXBvcmFyeV9kYXRhICp0bXA7Cit9OworCitpbnQgc2FlX3NldF9ncm91cChzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSwgaW50IGdyb3VwKTsKK3ZvaWQgc2FlX2NsZWFyX3RlbXBfZGF0YShzdHJ1Y3Qgc2FlX2RhdGEgKnNhZSk7Cit2b2lkIHNhZV9jbGVhcl9kYXRhKHN0cnVjdCBzYWVfZGF0YSAqc2FlKTsKKworaW50IHNhZV9wcmVwYXJlX2NvbW1pdChjb25zdCB1OCAqYWRkcjEsIGNvbnN0IHU4ICphZGRyMiwKKwkJICAgICAgIGNvbnN0IHU4ICpwYXNzd29yZCwgc2l6ZV90IHBhc3N3b3JkX2xlbiwKKwkJICAgICAgIHN0cnVjdCBzYWVfZGF0YSAqc2FlKTsKK2ludCBzYWVfcHJvY2Vzc19jb21taXQoc3RydWN0IHNhZV9kYXRhICpzYWUpOwordm9pZCBzYWVfd3JpdGVfY29tbWl0KHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBzdHJ1Y3Qgd3BhYnVmICpidWYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3cGFidWYgKnRva2VuKTsKK3UxNiBzYWVfcGFyc2VfY29tbWl0KHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbiwKKwkJICAgICBjb25zdCB1OCAqKnRva2VuLCBzaXplX3QgKnRva2VuX2xlbiwgaW50ICphbGxvd2VkX2dyb3Vwcyk7Cit2b2lkIHNhZV93cml0ZV9jb25maXJtKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBzdHJ1Y3Qgd3BhYnVmICpidWYpOworaW50IHNhZV9jaGVja19jb25maXJtKHN0cnVjdCBzYWVfZGF0YSAqc2FlLCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKyNlbmRpZiAvKiBTQUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi92ZXJzaW9uLmggYi9zcmMvY29tbW9uL3ZlcnNpb24uaAppbmRleCA3YWZiYTQ4Li4yZmFhOGM3IDEwMDY0NAotLS0gYS9zcmMvY29tbW9uL3ZlcnNpb24uaAorKysgYi9zcmMvY29tbW9uL3ZlcnNpb24uaApAQCAtNSw2ICs1LDYgQEAKICNkZWZpbmUgVkVSU0lPTl9TVFJfUE9TVEZJWCAiIgogI2VuZGlmIC8qIFZFUlNJT05fU1RSX1BPU1RGSVggKi8KIAotI2RlZmluZSBWRVJTSU9OX1NUUiAiMi4wLWRldmVsIiBWRVJTSU9OX1NUUl9QT1NURklYCisjZGVmaW5lIFZFUlNJT05fU1RSICIyLjEtZGV2ZWwiIFZFUlNJT05fU1RSX1BPU1RGSVgKIAogI2VuZGlmIC8qIFZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi93cGFfY29tbW9uLmMgYi9zcmMvY29tbW9uL3dwYV9jb21tb24uYwppbmRleCAzNmMzMDhhLi5hOGNmNmJlIDEwMDY0NAotLS0gYS9zcmMvY29tbW9uL3dwYV9jb21tb24uYworKysgYi9zcmMvY29tbW9uL3dwYV9jb21tb24uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBXUEEvUlNOIC0gU2hhcmVkIGZ1bmN0aW9ucyBmb3Igc3VwcGxpY2FudCBhbmQgYXV0aGVudGljYXRvcgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDgsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMzc2LDYgKzM3NiwxMiBAQAogCWlmIChSU05fU0VMRUNUT1JfR0VUKHMpID09IFJTTl9BVVRIX0tFWV9NR01UX1BTS19TSEEyNTYpCiAJCXJldHVybiBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NjsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwlpZiAoUlNOX1NFTEVDVE9SX0dFVChzKSA9PSBSU05fQVVUSF9LRVlfTUdNVF9TQUUpCisJCXJldHVybiBXUEFfS0VZX01HTVRfU0FFOworCWlmIChSU05fU0VMRUNUT1JfR0VUKHMpID09IFJTTl9BVVRIX0tFWV9NR01UX0ZUX1NBRSkKKwkJcmV0dXJuIFdQQV9LRVlfTUdNVF9GVF9TQUU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19OT19XUEEyICovCkBAIC0xMTI2LDYgKzExMzIsMjYgQEAKIH0KIAogCitlbnVtIHdwYV9jaXBoZXIgd3BhX2NpcGhlcl90b19zdWl0ZV9kcml2ZXIoaW50IGNpcGhlcikKK3sKKwlzd2l0Y2ggKGNpcGhlcikgeworCWNhc2UgV1BBX0NJUEhFUl9OT05FOgorCQlyZXR1cm4gQ0lQSEVSX05PTkU7CisJY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgorCQlyZXR1cm4gQ0lQSEVSX1dFUDQwOworCWNhc2UgV1BBX0NJUEhFUl9XRVAxMDQ6CisJCXJldHVybiBDSVBIRVJfV0VQMTA0OworCWNhc2UgV1BBX0NJUEhFUl9DQ01QOgorCQlyZXR1cm4gQ0lQSEVSX0NDTVA7CisJY2FzZSBXUEFfQ0lQSEVSX0dDTVA6CisJCXJldHVybiBDSVBIRVJfR0NNUDsKKwljYXNlIFdQQV9DSVBIRVJfVEtJUDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gQ0lQSEVSX1RLSVA7CisJfQorfQorCisKIGludCB3cGFfY2lwaGVyX3ZhbGlkX3BhaXJ3aXNlKGludCBjaXBoZXIpCiB7CiAJcmV0dXJuIGNpcGhlciA9PSBXUEFfQ0lQSEVSX0NDTVAgfHwKQEAgLTEyMDgsMyArMTIzNCwxNTAgQEAKIAogCXJldHVybiBudW1fc3VpdGVzOwogfQorCisKK2ludCB3cGFfcGlja19wYWlyd2lzZV9jaXBoZXIoaW50IGNpcGhlcnMsIGludCBub25lX2FsbG93ZWQpCit7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0NDTVApCisJCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0dDTVApCisJCXJldHVybiBXUEFfQ0lQSEVSX0dDTVA7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1RLSVApCisJCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7CisJaWYgKG5vbmVfYWxsb3dlZCAmJiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfTk9ORSkpCisJCXJldHVybiBXUEFfQ0lQSEVSX05PTkU7CisJcmV0dXJuIC0xOworfQorCisKK2ludCB3cGFfcGlja19ncm91cF9jaXBoZXIoaW50IGNpcGhlcnMpCit7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0NDTVApCisJCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0dDTVApCisJCXJldHVybiBXUEFfQ0lQSEVSX0dDTVA7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1RLSVApCisJCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX1dFUDEwNCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OworCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9XRVA0MCkKKwkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7CisJcmV0dXJuIC0xOworfQorCisKK2ludCB3cGFfcGFyc2VfY2lwaGVyKGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWludCB2YWwgPSAwLCBsYXN0OworCWNoYXIgKnN0YXJ0LCAqZW5kLCAqYnVmOworCisJYnVmID0gb3Nfc3RyZHVwKHZhbHVlKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlzdGFydCA9IGJ1ZjsKKworCXdoaWxlICgqc3RhcnQgIT0gJ1wwJykgeworCQl3aGlsZSAoKnN0YXJ0ID09ICcgJyB8fCAqc3RhcnQgPT0gJ1x0JykKKwkJCXN0YXJ0Kys7CisJCWlmICgqc3RhcnQgPT0gJ1wwJykKKwkJCWJyZWFrOworCQllbmQgPSBzdGFydDsKKwkJd2hpbGUgKCplbmQgIT0gJyAnICYmICplbmQgIT0gJ1x0JyAmJiAqZW5kICE9ICdcMCcpCisJCQllbmQrKzsKKwkJbGFzdCA9ICplbmQgPT0gJ1wwJzsKKwkJKmVuZCA9ICdcMCc7CisJCWlmIChvc19zdHJjbXAoc3RhcnQsICJDQ01QIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfQ0lQSEVSX0NDTVA7CisJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIkdDTVAiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9DSVBIRVJfR0NNUDsKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiVEtJUCIpID09IDApCisJCQl2YWwgfD0gV1BBX0NJUEhFUl9US0lQOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVAxMDQiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9DSVBIRVJfV0VQMTA0OworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXRVA0MCIpID09IDApCisJCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVA0MDsKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiTk9ORSIpID09IDApCisJCQl2YWwgfD0gV1BBX0NJUEhFUl9OT05FOworCQllbHNlIHsKKwkJCW9zX2ZyZWUoYnVmKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChsYXN0KQorCQkJYnJlYWs7CisJCXN0YXJ0ID0gZW5kICsgMTsKKwl9CisJb3NfZnJlZShidWYpOworCisJcmV0dXJuIHZhbDsKK30KKworCitpbnQgd3BhX3dyaXRlX2NpcGhlcnMoY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgaW50IGNpcGhlcnMsIGNvbnN0IGNoYXIgKmRlbGltKQoreworCWNoYXIgKnBvcyA9IHN0YXJ0OworCWludCByZXQ7CisKKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfQ0NNUCkgeworCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzQ0NNUCIsCisJCQkJICBwb3MgPT0gc3RhcnQgPyAiIiA6IGRlbGltKTsKKwkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKKwkJCXJldHVybiAtMTsKKwkJcG9zICs9IHJldDsKKwl9CisJaWYgKGNpcGhlcnMgJiBXUEFfQ0lQSEVSX0dDTVApIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0dDTVAiLAorCQkJCSAgcG9zID09IHN0YXJ0ID8gIiIgOiBkZWxpbSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gLTE7CisJCXBvcyArPSByZXQ7CisJfQorCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9US0lQKSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNUS0lQIiwKKwkJCQkgIHBvcyA9PSBzdGFydCA/ICIiIDogZGVsaW0pOworCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJcmV0dXJuIC0xOworCQlwb3MgKz0gcmV0OworCX0KKwlpZiAoY2lwaGVycyAmIFdQQV9DSVBIRVJfV0VQMTA0KSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNXRVAxMDQiLAorCQkJCSAgcG9zID09IHN0YXJ0ID8gIiIgOiBkZWxpbSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gLTE7CisJCXBvcyArPSByZXQ7CisJfQorCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9XRVA0MCkgeworCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzV0VQNDAiLAorCQkJCSAgcG9zID09IHN0YXJ0ID8gIiIgOiBkZWxpbSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gLTE7CisJCXBvcyArPSByZXQ7CisJfQorCWlmIChjaXBoZXJzICYgV1BBX0NJUEhFUl9OT05FKSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNOT05FIiwKKwkJCQkgIHBvcyA9PSBzdGFydCA/ICIiIDogZGVsaW0pOworCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJcmV0dXJuIC0xOworCQlwb3MgKz0gcmV0OworCX0KKworCXJldHVybiBwb3MgLSBzdGFydDsKK30KKworCitpbnQgd3BhX3NlbGVjdF9hcF9ncm91cF9jaXBoZXIoaW50IHdwYSwgaW50IHdwYV9wYWlyd2lzZSwgaW50IHJzbl9wYWlyd2lzZSkKK3sKKwlpbnQgcGFpcndpc2UgPSAwOworCisJLyogU2VsZWN0IGdyb3VwIGNpcGhlciBiYXNlZCBvbiB0aGUgZW5hYmxlZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGVzICovCisJaWYgKHdwYSAmIDEpCisJCXBhaXJ3aXNlIHw9IHdwYV9wYWlyd2lzZTsKKwlpZiAod3BhICYgMikKKwkJcGFpcndpc2UgfD0gcnNuX3BhaXJ3aXNlOworCisJaWYgKHBhaXJ3aXNlICYgV1BBX0NJUEhFUl9US0lQKQorCQlyZXR1cm4gV1BBX0NJUEhFUl9US0lQOworCWlmICgocGFpcndpc2UgJiAoV1BBX0NJUEhFUl9DQ01QIHwgV1BBX0NJUEhFUl9HQ01QKSkgPT0gV1BBX0NJUEhFUl9HQ01QKQorCQlyZXR1cm4gV1BBX0NJUEhFUl9HQ01QOworCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29tbW9uL3dwYV9jb21tb24uaCBiL3NyYy9jb21tb24vd3BhX2NvbW1vbi5oCmluZGV4IDYwMzE2NmIuLjJkNjM2NjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vd3BhX2NvbW1vbi5oCisrKyBiL3NyYy9jb21tb24vd3BhX2NvbW1vbi5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFdQQSBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbiBob3N0YXBkIGFuZCB3cGFfc3VwcGxpY2FudAotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDgsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjAsNiArMjAsMTIgQEAKICNkZWZpbmUgV1BBX0dNS19MRU4gMzIKICNkZWZpbmUgV1BBX0dUS19NQVhfTEVOIDMyCiAKKyNkZWZpbmUgV1BBX0FMTE9XRURfUEFJUldJU0VfQ0lQSEVSUyBcCisoV1BBX0NJUEhFUl9DQ01QIHwgV1BBX0NJUEhFUl9HQ01QIHwgV1BBX0NJUEhFUl9US0lQIHwgV1BBX0NJUEhFUl9OT05FKQorI2RlZmluZSBXUEFfQUxMT1dFRF9HUk9VUF9DSVBIRVJTIFwKKyhXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVAgfCBXUEFfQ0lQSEVSX1RLSVAgfCBXUEFfQ0lQSEVSX1dFUDEwNCB8IFwKK1dQQV9DSVBIRVJfV0VQNDApCisKICNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0CiAjZGVmaW5lIFdQQV9WRVJTSU9OIDEKICNkZWZpbmUgUlNOX1NFTEVDVE9SX0xFTiA0CkBAIC0zMiw2ICszOCw3IEBACiAjZGVmaW5lIFdQQV9BVVRIX0tFWV9NR01UX05PTkUgUlNOX1NFTEVDVE9SKDB4MDAsIDB4NTAsIDB4ZjIsIDApCiAjZGVmaW5lIFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVggUlNOX1NFTEVDVE9SKDB4MDAsIDB4NTAsIDB4ZjIsIDEpCiAjZGVmaW5lIFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWCBSU05fU0VMRUNUT1IoMHgwMCwgMHg1MCwgMHhmMiwgMikKKyNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfQ0NLTSBSU05fU0VMRUNUT1IoMHgwMCwgMHg0MCwgMHg5NiwgMCkKICNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9OT05FIFJTTl9TRUxFQ1RPUigweDAwLCAweDUwLCAweGYyLCAwKQogI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwIFJTTl9TRUxFQ1RPUigweDAwLCAweDUwLCAweGYyLCAxKQogI2RlZmluZSBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAgUlNOX1NFTEVDVE9SKDB4MDAsIDB4NTAsIDB4ZjIsIDIpCkBAIC01MSw2ICs1OCw5IEBACiAjZGVmaW5lIFJTTl9BVVRIX0tFWV9NR01UXzgwMl8xWF9TSEEyNTYgUlNOX1NFTEVDVE9SKDB4MDAsIDB4MGYsIDB4YWMsIDUpCiAjZGVmaW5lIFJTTl9BVVRIX0tFWV9NR01UX1BTS19TSEEyNTYgUlNOX1NFTEVDVE9SKDB4MDAsIDB4MGYsIDB4YWMsIDYpCiAjZGVmaW5lIFJTTl9BVVRIX0tFWV9NR01UX1RQS19IQU5EU0hBS0UgUlNOX1NFTEVDVE9SKDB4MDAsIDB4MGYsIDB4YWMsIDcpCisjZGVmaW5lIFJTTl9BVVRIX0tFWV9NR01UX1NBRSBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgOCkKKyNkZWZpbmUgUlNOX0FVVEhfS0VZX01HTVRfRlRfU0FFIFJTTl9TRUxFQ1RPUigweDAwLCAweDBmLCAweGFjLCA5KQorI2RlZmluZSBSU05fQVVUSF9LRVlfTUdNVF9DQ0tNIFJTTl9TRUxFQ1RPUigweDAwLCAweDQwLCAweDk2LCAweDAwKQogCiAjZGVmaW5lIFJTTl9DSVBIRVJfU1VJVEVfTk9ORSBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgMCkKICNkZWZpbmUgUlNOX0NJUEhFUl9TVUlURV9XRVA0MCBSU05fU0VMRUNUT1IoMHgwMCwgMHgwZiwgMHhhYywgMSkKQEAgLTM4Miw5ICszOTIsMTUgQEAKIGludCB3cGFfY2lwaGVyX2tleV9sZW4oaW50IGNpcGhlcik7CiBpbnQgd3BhX2NpcGhlcl9yc2NfbGVuKGludCBjaXBoZXIpOwogaW50IHdwYV9jaXBoZXJfdG9fYWxnKGludCBjaXBoZXIpOworZW51bSB3cGFfY2lwaGVyIHdwYV9jaXBoZXJfdG9fc3VpdGVfZHJpdmVyKGludCBjaXBoZXIpOwogaW50IHdwYV9jaXBoZXJfdmFsaWRfcGFpcndpc2UoaW50IGNpcGhlcik7CiB1MzIgd3BhX2NpcGhlcl90b19zdWl0ZShpbnQgcHJvdG8sIGludCBjaXBoZXIpOwogaW50IHJzbl9jaXBoZXJfcHV0X3N1aXRlcyh1OCAqcG9zLCBpbnQgY2lwaGVycyk7CiBpbnQgd3BhX2NpcGhlcl9wdXRfc3VpdGVzKHU4ICpwb3MsIGludCBjaXBoZXJzKTsKK2ludCB3cGFfcGlja19wYWlyd2lzZV9jaXBoZXIoaW50IGNpcGhlcnMsIGludCBub25lX2FsbG93ZWQpOworaW50IHdwYV9waWNrX2dyb3VwX2NpcGhlcihpbnQgY2lwaGVycyk7CitpbnQgd3BhX3BhcnNlX2NpcGhlcihjb25zdCBjaGFyICp2YWx1ZSk7CitpbnQgd3BhX3dyaXRlX2NpcGhlcnMoY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgaW50IGNpcGhlcnMsIGNvbnN0IGNoYXIgKmRlbGltKTsKK2ludCB3cGFfc2VsZWN0X2FwX2dyb3VwX2NpcGhlcihpbnQgd3BhLCBpbnQgd3BhX3BhaXJ3aXNlLCBpbnQgcnNuX3BhaXJ3aXNlKTsKIAogI2VuZGlmIC8qIFdQQV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcnlwdG8uaCBiL3NyYy9jcnlwdG8vY3J5cHRvLmgKaW5kZXggMjZiOWFjZi4uOWJjY2FhYSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcnlwdG8uaAorKysgYi9zcmMvY3J5cHRvL2NyeXB0by5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFdQQSBTdXBwbGljYW50IC8gd3JhcHBlciBmdW5jdGlvbnMgZm9yIGNyeXB0byBsaWJyYXJpZXMKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA5LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogV3JhcHBlciBmdW5jdGlvbnMgZm9yIGNyeXB0byBsaWJyYXJpZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC00NTcsNCArNDU3LDMyOSBAQAogICovCiBpbnQgY3J5cHRvX2dldF9yYW5kb20odm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKIAorCisvKioKKyAqIHN0cnVjdCBjcnlwdG9fYmlnbnVtIC0gYmlnbnVtCisgKgorICogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIGJpZ251bSBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvbnRlbnRzIGlzIHNwZWNpZmljCisgKiB0byB0aGUgdXNlZCBjcnlwdG8gbGlicmFyeS4KKyAqLworc3RydWN0IGNyeXB0b19iaWdudW07CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9pbml0IC0gQWxsb2NhdGUgbWVtb3J5IGZvciBiaWdudW0KKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gYWxsb2NhdGVkIGJpZ251bSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2JpZ251bV9pbml0KHZvaWQpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faW5pdF9zZXQgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJpZ251bSBhbmQgc2V0IHRoZSB2YWx1ZQorICogQGJ1ZjogQnVmZmVyIHdpdGggdW5zaWduZWQgYmluYXJ5IHZhbHVlCisgKiBAbGVuOiBMZW5ndGggb2YgYnVmIGluIG9jdGV0cworICogUmV0dXJuczogUG9pbnRlciB0byBhbGxvY2F0ZWQgYmlnbnVtIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fZGVpbml0IC0gRnJlZSBiaWdudW0KKyAqIEBuOiBCaWdudW0gZnJvbSBjcnlwdG9fYmlnbnVtX2luaXQoKSBvciBjcnlwdG9fYmlnbnVtX2luaXRfc2V0KCkKKyAqIEBjbGVhcjogV2hldGhlciB0byBjbGVhciB0aGUgdmFsdWUgZnJvbSBtZW1vcnkKKyAqLwordm9pZCBjcnlwdG9fYmlnbnVtX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqbiwgaW50IGNsZWFyKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3RvX2JpbiAtIFNldCBiaW5hcnkgYnVmZmVyIHRvIHVuc2lnbmVkIGJpZ251bQorICogQGE6IEJpZ251bQorICogQGJ1ZjogQnVmZmVyIGZvciB0aGUgYmluYXJ5IG51bWJlcgorICogQGxlbjogTGVuZ3RoIG9mIEBidWYgaW4gb2N0ZXRzCisgKiBAcGFkbGVuOiBMZW5ndGggaW4gb2N0ZXRzIHRvIHBhZCB0aGUgcmVzdWx0IHRvIG9yIDAgdG8gaW5kaWNhdGUgbm8gcGFkZGluZworICogUmV0dXJuczogTnVtYmVyIG9mIG9jdGV0cyB3cml0dGVuIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fdG9fYmluKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJIHU4ICpidWYsIHNpemVfdCBidWZsZW4sIHNpemVfdCBwYWRsZW4pOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fYWRkIC0gYyA9IGEgKyBiCisgKiBAYTogQmlnbnVtCisgKiBAYjogQmlnbnVtCisgKiBAYzogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYSArIGIKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9hZGQoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYyk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9tb2QgLSBjID0gYSAlIGIKKyAqIEBhOiBCaWdudW0KKyAqIEBiOiBCaWdudW0KKyAqIEBjOiBCaWdudW07IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBhICUgYgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX21vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2V4cHRtb2QgLSBNb2R1bGFyIGV4cG9uZW50aWF0aW9uOiBkID0gYV5iIChtb2QgYykKKyAqIEBhOiBCaWdudW07IGJhc2UKKyAqIEBiOiBCaWdudW07IGV4cG9uZW50CisgKiBAYzogQmlnbnVtOyBtb2R1bHVzCisgKiBAZDogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYV5iIChtb2QgYykKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9leHB0bW9kKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmMsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpkKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3JzaGlmdCAtIGIgPSBhID4+IG4KKyAqIEBhOiBCaWdudW0KKyAqIEBuOiBOdW1iZXIgb2YgYml0cyB0byBzaGlmdAorICogQGI6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgPj4gbgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX3JzaGlmdChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwgaW50IG4sCisJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKmIpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faW52ZXJzZSAtIEludmVyc2UgYSBiaWdudW0gc28gdGhhdCBhICogYyA9IDEgKG1vZCBiKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0CisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1faW52ZXJzZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX3N1YiAtIGMgPSBhIC0gYgorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgLSBiCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fc3ViKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJICAgICAgc3RydWN0IGNyeXB0b19iaWdudW0gKmMpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1fZGl2IC0gYyA9IGEgLyBiCisgKiBAYTogQmlnbnVtCisgKiBAYjogQmlnbnVtCisgKiBAYzogQmlnbnVtOyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYSAvIGIKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2JpZ251bV9kaXYoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYyk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9tdWxtb2QgLSBkID0gYSAqIGIgKG1vZCBjKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bQorICogQGQ6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIChhICogYikgJSBjCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19iaWdudW1fbXVsbW9kKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkJIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkJIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjLAorCQkJIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpkKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2NtcCAtIENvbXBhcmUgdHdvIGJpZ251bXMKKyAqIEBhOiBCaWdudW0KKyAqIEBiOiBCaWdudW0KKyAqIFJldHVybnM6IC0xIGlmIGEgPCBiLCAwIGlmIGEgPT0gYiwgb3IgMSBpZiBhID4gYgorICovCitpbnQgY3J5cHRvX2JpZ251bV9jbXAoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX2JpdHMgLSBHZXQgc2l6ZSBvZiBhIGJpZ251bSBpbiBiaXRzCisgKiBAYTogQmlnbnVtCisgKiBSZXR1cm5zOiBOdW1iZXIgb2YgYml0cyBpbiB0aGUgYmlnbnVtCisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2JpdHMoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faXNfemVybyAtIElzIHRoZSBnaXZlbiBiaWdudW0gemVybworICogQGE6IEJpZ251bQorICogUmV0dXJuczogMSBpZiBAYSBpcyB6ZXJvIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2lzX3plcm8oY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpOworCisvKioKKyAqIGNyeXB0b19iaWdudW1faXNfb25lIC0gSXMgdGhlIGdpdmVuIGJpZ251bSBvbmUKKyAqIEBhOiBCaWdudW0KKyAqIFJldHVybnM6IDEgaWYgQGEgaXMgb25lIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fYmlnbnVtX2lzX29uZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSk7CisKKy8qKgorICogc3RydWN0IGNyeXB0b19lYyAtIEVsbGlwdGljIGN1cnZlIGNvbnRleHQKKyAqCisgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgRUMgaW1wbGVtZW50YXRpb24uIFRoZSBjb250ZW50cyBpcyBzcGVjaWZpYworICogdG8gdGhlIHVzZWQgY3J5cHRvIGxpYnJhcnkuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWM7CisKKy8qKgorICogY3J5cHRvX2VjX2luaXQgLSBJbml0aWFsaXplIGVsbGlwdGljIGN1cnZlIGNvbnRleHQKKyAqIEBncm91cDogSWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgRUNDIGdyb3VwIChJQU5BICJHcm91cCBEZXNjcmlwdGlvbiIKKyAqCWF0dHJpYnV0ZSByZWdpc3RydHkgZm9yIFJGQyAyNDA5KQorICogUmV0dXJuczogUG9pbnRlciB0byBFQyBjb250ZXh0IG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGNyeXB0b19lYyAqIGNyeXB0b19lY19pbml0KGludCBncm91cCk7CisKKy8qKgorICogY3J5cHRvX2VjX2RlaW5pdCAtIERlaW5pdGlhbGl6ZSBlbGxpcHRpYyBjdXJ2ZSBjb250ZXh0CisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqLwordm9pZCBjcnlwdG9fZWNfZGVpbml0KHN0cnVjdCBjcnlwdG9fZWMgKmUpOworCisvKioKKyAqIGNyeXB0b19lY19wcmltZV9sZW4gLSBHZXQgbGVuZ3RoIG9mIHRoZSBwcmltZSBpbiBvY3RldHMKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogUmV0dXJuczogTGVuZ3RoIG9mIHRoZSBwcmltZSBkZWZpbmluZyB0aGUgZ3JvdXAKKyAqLworc2l6ZV90IGNyeXB0b19lY19wcmltZV9sZW4oc3RydWN0IGNyeXB0b19lYyAqZSk7CisKKy8qKgorICogY3J5cHRvX2VjX3ByaW1lX2xlbl9iaXRzIC0gR2V0IGxlbmd0aCBvZiB0aGUgcHJpbWUgaW4gYml0cworICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBSZXR1cm5zOiBMZW5ndGggb2YgdGhlIHByaW1lIGRlZmluaW5nIHRoZSBncm91cCBpbiBiaXRzCisgKi8KK3NpemVfdCBjcnlwdG9fZWNfcHJpbWVfbGVuX2JpdHMoc3RydWN0IGNyeXB0b19lYyAqZSk7CisKKy8qKgorICogY3J5cHRvX2VjX2dldF9wcmltZSAtIEdldCBwcmltZSBkZWZpbmluZyBhbiBFQyBncm91cAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBSZXR1cm5zOiBQcmltZSAoYmlnbnVtKSBkZWZpbmluZyB0aGUgZ3JvdXAKKyAqLworY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fZWNfZ2V0X3ByaW1lKHN0cnVjdCBjcnlwdG9fZWMgKmUpOworCisvKioKKyAqIGNyeXB0b19lY19nZXRfb3JkZXIgLSBHZXQgb3JkZXIgb2YgYW4gRUMgZ3JvdXAKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogUmV0dXJuczogT3JkZXIgKGJpZ251bSkgb2YgdGhlIGdyb3VwCisgKi8KK2NvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2VjX2dldF9vcmRlcihzdHJ1Y3QgY3J5cHRvX2VjICplKTsKKworLyoqCisgKiBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50IC0gRWxsaXB0aWMgY3VydmUgcG9pbnQKKyAqCisgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgRUMgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50IGEgcG9pbnQuIFRoZQorICogY29udGVudHMgaXMgc3BlY2lmaWMgdG8gdGhlIHVzZWQgY3J5cHRvIGxpYnJhcnkuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQ7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2luaXQgLSBJbml0aWFsaXplIGRhdGEgZm9yIGFuIEVDIHBvaW50CisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gRUMgcG9pbnQgZGF0YSBvciAlTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKiBjcnlwdG9fZWNfcG9pbnRfaW5pdChzdHJ1Y3QgY3J5cHRvX2VjICplKTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfZGVpbml0IC0gRGVpbml0aWFsaXplIEVDIHBvaW50IGRhdGEKKyAqIEBwOiBFQyBwb2ludCBkYXRhIGZyb20gY3J5cHRvX2VjX3BvaW50X2luaXQoKQorICogQGNsZWFyOiBXaGV0aGVyIHRvIGNsZWFyIHRoZSBFQyBwb2ludCB2YWx1ZSBmcm9tIG1lbW9yeQorICovCit2b2lkIGNyeXB0b19lY19wb2ludF9kZWluaXQoc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCwgaW50IGNsZWFyKTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfdG9fYmluIC0gV3JpdGUgRUMgcG9pbnQgdmFsdWUgYXMgYmluYXJ5IGRhdGEKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHA6IEVDIHBvaW50IGRhdGEgZnJvbSBjcnlwdG9fZWNfcG9pbnRfaW5pdCgpCisgKiBAeDogQnVmZmVyIGZvciB3cml0aW5nIHRoZSBiaW5hcnkgZGF0YSBmb3IgeCBjb29yZGluYXRlIG9yICVOVUxMIGlmIG5vdCB1c2VkCisgKiBAeTogQnVmZmVyIGZvciB3cml0aW5nIHRoZSBiaW5hcnkgZGF0YSBmb3IgeSBjb29yZGluYXRlIG9yICVOVUxMIGlmIG5vdCB1c2VkCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFuIEVDIHBvaW50IGFzIGJpbmFyeSBkYXRhIGluIGEgZm9ybWF0CisgKiB0aGF0IGhhcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgZmllbGRzIHBhZGRlZCB0bworICogdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWUgZGVmaW5pbmcgdGhlIGdyb3VwLgorICovCitpbnQgY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcG9pbnQsIHU4ICp4LCB1OCAqeSk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2Zyb21fYmluIC0gQ3JlYXRlIEVDIHBvaW50IGZyb20gYmluYXJ5IGRhdGEKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHZhbDogQmluYXJ5IGRhdGEgdG8gcmVhZCB0aGUgRUMgcG9pbnQgZnJvbQorICogUmV0dXJuczogUG9pbnRlciB0byBFQyBwb2ludCBkYXRhIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRlcnMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgRUMgcG9pbnQgZnJvbSB0aGUgcHJvdmlkZWQKKyAqIGJ1ZmZlciBhc3N1bWluZyB0aGUgdmFsdWVzIGFyZSBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgd2l0aCBmaWVsZHMgcGFkZGVkIHRvCisgKiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltZSBkZWZpbmluZyB0aGUgZ3JvdXAuCisgKi8KK3N0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKiBjcnlwdG9fZWNfcG9pbnRfZnJvbV9iaW4oc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQkJCSAgY29uc3QgdTggKnZhbCk7CisKKy8qKgorICogY3J5cHRvX2JpZ251bV9hZGQgLSBjID0gYSArIGIKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQGE6IEJpZ251bQorICogQGI6IEJpZ251bQorICogQGM6IEJpZ251bTsgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgKyBiCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9hZGQoc3RydWN0IGNyeXB0b19lYyAqZSwgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqYSwKKwkJCWNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmIsCisJCQlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpjKTsKKworLyoqCisgKiBjcnlwdG9fYmlnbnVtX211bCAtIHJlcyA9IGIgKiBwCisgKiBAZTogRUMgY29udGV4dCBmcm9tIGNyeXB0b19lY19pbml0KCkKKyAqIEBwOiBFQyBwb2ludAorICogQGI6IEJpZ251bQorICogQHJlczogRUMgcG9pbnQ7IHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBiICogcAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBjcnlwdG9fZWNfcG9pbnRfbXVsKHN0cnVjdCBjcnlwdG9fZWMgKmUsIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnJlcyk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X2ludmVydCAtIENvbXB1dGUgaW52ZXJzZSBvZiBhbiBFQyBwb2ludAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQgdG8gaW52ZXJ0IChhbmQgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24pCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9pbnZlcnQoc3RydWN0IGNyeXB0b19lYyAqZSwgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCk7CisKKy8qKgorICogY3J5cHRvX2VjX3BvaW50X3NvbHZlX3lfY29vcmQgLSBTb2x2ZSB5IGNvb3JkaW5hdGUgZm9yIGFuIHggY29vcmRpbmF0ZQorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQgdG8gdXNlIGZvciB0aGUgcmV0dXJuaW5nIHRoZSByZXN1bHQKKyAqIEB4OiB4IGNvb3JkaW5hdGUKKyAqIEB5X2JpdDogeS1iaXQgKDAgb3IgMSkgZm9yIHNlbGVjdGluZyB0aGUgeSB2YWx1ZSB0byB1c2UKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitpbnQgY3J5cHRvX2VjX3BvaW50X3NvbHZlX3lfY29vcmQoc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQkgIHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQkJICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqeCwgaW50IHlfYml0KTsKKworLyoqCisgKiBjcnlwdG9fZWNfcG9pbnRfaXNfYXRfaW5maW5pdHkgLSBDaGVjayB3aGV0aGVyIEVDIHBvaW50IGlzIG5ldXRyYWwgZWxlbWVudAorICogQGU6IEVDIGNvbnRleHQgZnJvbSBjcnlwdG9fZWNfaW5pdCgpCisgKiBAcDogRUMgcG9pbnQKKyAqIFJldHVybnM6IDEgaWYgdGhlIHNwZWNpZmllZCBFQyBwb2ludCBpcyB0aGUgbmV1dHJhbCBlbGVtZW50IG9mIHRoZSBncm91cCBvcgorICoJMCBpZiBub3QKKyAqLworaW50IGNyeXB0b19lY19wb2ludF9pc19hdF9pbmZpbml0eShzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnApOworCisvKioKKyAqIGNyeXB0b19lY19wb2ludF9pc19vbl9jdXJ2ZSAtIENoZWNrIHdoZXRoZXIgRUMgcG9pbnQgaXMgb24gY3VydmUKKyAqIEBlOiBFQyBjb250ZXh0IGZyb20gY3J5cHRvX2VjX2luaXQoKQorICogQHA6IEVDIHBvaW50CisgKiBSZXR1cm5zOiAxIGlmIHRoZSBzcGVjaWZpZWQgRUMgcG9pbnQgaXMgb24gdGhlIGN1cnZlIG9yIDAgaWYgbm90CisgKi8KK2ludCBjcnlwdG9fZWNfcG9pbnRfaXNfb25fY3VydmUoc3RydWN0IGNyeXB0b19lYyAqZSwKKwkJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwKTsKKwogI2VuZGlmIC8qIENSWVBUT19IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NyeXB0b19vcGVuc3NsLmMgYi9zcmMvY3J5cHRvL2NyeXB0b19vcGVuc3NsLmMKaW5kZXggNzExZTMxMi4uNTIxNWMwMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcnlwdG9fb3BlbnNzbC5jCisrKyBiL3NyYy9jcnlwdG8vY3J5cHRvX29wZW5zc2wuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBXUEEgU3VwcGxpY2FudCAvIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBsaWJjcnlwdG8KLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogV3JhcHBlciBmdW5jdGlvbnMgZm9yIE9wZW5TU0wgbGliY3J5cHRvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTksNiArMTksOSBAQAogI2lmZGVmIENPTkZJR19PUEVOU1NMX0NNQUMKICNpbmNsdWRlIDxvcGVuc3NsL2NtYWMuaD4KICNlbmRpZiAvKiBDT05GSUdfT1BFTlNTTF9DTUFDICovCisjaWZkZWYgQ09ORklHX0VDQworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNlbmRpZiAvKiBDT05GSUdfRUNDICovCiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJ3cGFidWYuaCIKQEAgLTgxOCwzICs4MjEsNDEzIEBACiAJcmV0dXJuIG9tYWMxX2Flc18xMjhfdmVjdG9yKGtleSwgMSwgJmRhdGEsICZkYXRhX2xlbiwgbWFjKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfT1BFTlNTTF9DTUFDICovCisKKworc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fYmlnbnVtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBjcnlwdG9fYmlnbnVtICopIEJOX25ldygpOworfQorCisKK3N0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2JpZ251bV9pbml0X3NldChjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCUJJR05VTSAqYm4gPSBCTl9iaW4yYm4oYnVmLCBsZW4sIE5VTEwpOworCXJldHVybiAoc3RydWN0IGNyeXB0b19iaWdudW0gKikgYm47Cit9CisKKwordm9pZCBjcnlwdG9fYmlnbnVtX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqbiwgaW50IGNsZWFyKQoreworCWlmIChjbGVhcikKKwkJQk5fY2xlYXJfZnJlZSgoQklHTlVNICopIG4pOworCWVsc2UKKwkJQk5fZnJlZSgoQklHTlVNICopIG4pOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3RvX2Jpbihjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSB1OCAqYnVmLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgcGFkbGVuKQoreworCWludCBudW1fYnl0ZXMsIG9mZnNldDsKKworCWlmIChwYWRsZW4gPiBidWZsZW4pCisJCXJldHVybiAtMTsKKworCW51bV9ieXRlcyA9IEJOX251bV9ieXRlcygoY29uc3QgQklHTlVNICopIGEpOworCWlmICgoc2l6ZV90KSBudW1fYnl0ZXMgPiBidWZsZW4pCisJCXJldHVybiAtMTsKKwlpZiAocGFkbGVuID4gKHNpemVfdCkgbnVtX2J5dGVzKQorCQlvZmZzZXQgPSBwYWRsZW4gLSBudW1fYnl0ZXM7CisJZWxzZQorCQlvZmZzZXQgPSAwOworCisJb3NfbWVtc2V0KGJ1ZiwgMCwgb2Zmc2V0KTsKKwlCTl9ibjJiaW4oKGNvbnN0IEJJR05VTSAqKSBhLCBidWYgKyBvZmZzZXQpOworCisJcmV0dXJuIG51bV9ieXRlcyArIG9mZnNldDsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9hZGQoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpiLAorCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYykKK3sKKwlyZXR1cm4gQk5fYWRkKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLCAoY29uc3QgQklHTlVNICopIGIpID8KKwkJMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX21vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCWludCByZXM7CisJQk5fQ1RYICpibmN0eDsKKworCWJuY3R4ID0gQk5fQ1RYX25ldygpOworCWlmIChibmN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gQk5fbW9kKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLCAoY29uc3QgQklHTlVNICopIGIsCisJCSAgICAgYm5jdHgpOworCUJOX0NUWF9mcmVlKGJuY3R4KTsKKworCXJldHVybiByZXMgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fZXhwdG1vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjLAorCQkJICBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqZCkKK3sKKwlpbnQgcmVzOworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX21vZF9leHAoKEJJR05VTSAqKSBkLCAoY29uc3QgQklHTlVNICopIGEsIChjb25zdCBCSUdOVU0gKikgYiwKKwkJCSAoY29uc3QgQklHTlVNICopIGMsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3JzaGlmdChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwgaW50IG4sCisJCQkgc3RydWN0IGNyeXB0b19iaWdudW0gKmIpCit7CisJcmV0dXJuIEJOX3JzaGlmdCgoQklHTlVNICopIGIsIChjb25zdCBCSUdOVU0gKikgYSwgbikgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1faW52ZXJzZShjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCQkgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCUJJR05VTSAqcmVzOworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX21vZF9pbnZlcnNlKChCSUdOVU0gKikgYywgKGNvbnN0IEJJR05VTSAqKSBhLAorCQkJICAgICAoY29uc3QgQklHTlVNICopIGIsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX3N1Yihjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmIsCisJCSAgICAgIHN0cnVjdCBjcnlwdG9fYmlnbnVtICpjKQoreworCXJldHVybiBCTl9zdWIoKEJJR05VTSAqKSBjLCAoY29uc3QgQklHTlVNICopIGEsIChjb25zdCBCSUdOVU0gKikgYikgPworCQkwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fZGl2KGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJICAgICAgc3RydWN0IGNyeXB0b19iaWdudW0gKmMpCit7CisJaW50IHJlczsKKworCUJOX0NUWCAqYm5jdHg7CisKKwlibmN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoYm5jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IEJOX2RpdigoQklHTlVNICopIGMsIE5VTEwsIChjb25zdCBCSUdOVU0gKikgYSwKKwkJICAgICAoY29uc3QgQklHTlVNICopIGIsIGJuY3R4KTsKKwlCTl9DVFhfZnJlZShibmN0eCk7CisKKwlyZXR1cm4gcmVzID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX211bG1vZChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYSwKKwkJCSBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCSBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYywKKwkJCSBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqZCkKK3sKKwlpbnQgcmVzOworCisJQk5fQ1RYICpibmN0eDsKKworCWJuY3R4ID0gQk5fQ1RYX25ldygpOworCWlmIChibmN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gQk5fbW9kX211bCgoQklHTlVNICopIGQsIChjb25zdCBCSUdOVU0gKikgYSwgKGNvbnN0IEJJR05VTSAqKSBiLAorCQkJIChjb25zdCBCSUdOVU0gKikgYywgYm5jdHgpOworCUJOX0NUWF9mcmVlKGJuY3R4KTsKKworCXJldHVybiByZXMgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19iaWdudW1fY21wKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYikKK3sKKwlyZXR1cm4gQk5fY21wKChjb25zdCBCSUdOVU0gKikgYSwgKGNvbnN0IEJJR05VTSAqKSBiKTsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9iaXRzKGNvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICphKQoreworCXJldHVybiBCTl9udW1fYml0cygoY29uc3QgQklHTlVNICopIGEpOworfQorCisKK2ludCBjcnlwdG9fYmlnbnVtX2lzX3plcm8oY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpCit7CisJcmV0dXJuIEJOX2lzX3plcm8oKGNvbnN0IEJJR05VTSAqKSBhKTsKK30KKworCitpbnQgY3J5cHRvX2JpZ251bV9pc19vbmUoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKmEpCit7CisJcmV0dXJuIEJOX2lzX29uZSgoY29uc3QgQklHTlVNICopIGEpOworfQorCisKKyNpZmRlZiBDT05GSUdfRUNDCisKK3N0cnVjdCBjcnlwdG9fZWMgeworCUVDX0dST1VQICpncm91cDsKKwlCTl9DVFggKmJuY3R4OworCUJJR05VTSAqcHJpbWU7CisJQklHTlVNICpvcmRlcjsKK307CisKK3N0cnVjdCBjcnlwdG9fZWMgKiBjcnlwdG9fZWNfaW5pdChpbnQgZ3JvdXApCit7CisJc3RydWN0IGNyeXB0b19lYyAqZTsKKwlpbnQgbmlkOworCisJLyogTWFwIGZyb20gSUFOQSByZWdpc3RyeSBmb3IgSUtFIEQtSCBncm91cHMgdG8gT3BlblNTTCBOSUQgKi8KKwlzd2l0Y2ggKGdyb3VwKSB7CisJY2FzZSAxOToKKwkJbmlkID0gTklEX1g5XzYyX3ByaW1lMjU2djE7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCW5pZCA9IE5JRF9zZWNwMzg0cjE7CisJCWJyZWFrOworCWNhc2UgMjE6CisJCW5pZCA9IE5JRF9zZWNwNTIxcjE7CisJCWJyZWFrOworCWNhc2UgMjU6CisJCW5pZCA9IE5JRF9YOV82Ml9wcmltZTE5MnYxOworCQlicmVhazsKKwljYXNlIDI2OgorCQluaWQgPSBOSURfc2VjcDIyNHIxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllID0gb3NfemFsbG9jKHNpemVvZigqZSkpOworCWlmIChlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZS0+Ym5jdHggPSBCTl9DVFhfbmV3KCk7CisJZS0+Z3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCWUtPnByaW1lID0gQk5fbmV3KCk7CisJZS0+b3JkZXIgPSBCTl9uZXcoKTsKKwlpZiAoZS0+Z3JvdXAgPT0gTlVMTCB8fCBlLT5ibmN0eCA9PSBOVUxMIHx8IGUtPnByaW1lID09IE5VTEwgfHwKKwkgICAgZS0+b3JkZXIgPT0gTlVMTCB8fAorCSAgICAhRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChlLT5ncm91cCwgZS0+cHJpbWUsIE5VTEwsIE5VTEwsIGUtPmJuY3R4KSB8fAorCSAgICAhRUNfR1JPVVBfZ2V0X29yZGVyKGUtPmdyb3VwLCBlLT5vcmRlciwgZS0+Ym5jdHgpKSB7CisJCWNyeXB0b19lY19kZWluaXQoZSk7CisJCWUgPSBOVUxMOworCX0KKworCXJldHVybiBlOworfQorCisKK3ZvaWQgY3J5cHRvX2VjX2RlaW5pdChzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCWlmIChlID09IE5VTEwpCisJCXJldHVybjsKKwlCTl9mcmVlKGUtPm9yZGVyKTsKKwlFQ19HUk9VUF9mcmVlKGUtPmdyb3VwKTsKKwlCTl9DVFhfZnJlZShlLT5ibmN0eCk7CisJb3NfZnJlZShlKTsKK30KKworCitzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICogY3J5cHRvX2VjX3BvaW50X2luaXQoc3RydWN0IGNyeXB0b19lYyAqZSkKK3sKKwlpZiAoZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKikgRUNfUE9JTlRfbmV3KGUtPmdyb3VwKTsKK30KKworCitzaXplX3QgY3J5cHRvX2VjX3ByaW1lX2xlbihzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCXJldHVybiBCTl9udW1fYnl0ZXMoZS0+cHJpbWUpOworfQorCisKK3NpemVfdCBjcnlwdG9fZWNfcHJpbWVfbGVuX2JpdHMoc3RydWN0IGNyeXB0b19lYyAqZSkKK3sKKwlyZXR1cm4gQk5fbnVtX2JpdHMoZS0+cHJpbWUpOworfQorCisKK2NvbnN0IHN0cnVjdCBjcnlwdG9fYmlnbnVtICogY3J5cHRvX2VjX2dldF9wcmltZShzdHJ1Y3QgY3J5cHRvX2VjICplKQoreworCXJldHVybiAoY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKikgZS0+cHJpbWU7Cit9CisKKworY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKiBjcnlwdG9fZWNfZ2V0X29yZGVyKHN0cnVjdCBjcnlwdG9fZWMgKmUpCit7CisJcmV0dXJuIChjb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqKSBlLT5vcmRlcjsKK30KKworCit2b2lkIGNyeXB0b19lY19wb2ludF9kZWluaXQoc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCwgaW50IGNsZWFyKQoreworCWlmIChjbGVhcikKKwkJRUNfUE9JTlRfY2xlYXJfZnJlZSgoRUNfUE9JTlQgKikgcCk7CisJZWxzZQorCQlFQ19QT0lOVF9mcmVlKChFQ19QT0lOVCAqKSBwKTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X3RvX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcG9pbnQsIHU4ICp4LCB1OCAqeSkKK3sKKwlCSUdOVU0gKnhfYm4sICp5X2JuOworCWludCByZXQgPSAtMTsKKwlpbnQgbGVuID0gQk5fbnVtX2J5dGVzKGUtPnByaW1lKTsKKworCXhfYm4gPSBCTl9uZXcoKTsKKwl5X2JuID0gQk5fbmV3KCk7CisKKwlpZiAoeF9ibiAmJiB5X2JuICYmCisJICAgIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGUtPmdyb3VwLCAoRUNfUE9JTlQgKikgcG9pbnQsCisJCQkJCQl4X2JuLCB5X2JuLCBlLT5ibmN0eCkpIHsKKwkJaWYgKHgpIHsKKwkJCWNyeXB0b19iaWdudW1fdG9fYmluKChzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqKSB4X2JuLAorCQkJCQkgICAgIHgsIGxlbiwgbGVuKTsKKwkJfQorCQlpZiAoeSkgeworCQkJY3J5cHRvX2JpZ251bV90b19iaW4oKHN0cnVjdCBjcnlwdG9fYmlnbnVtICopIHlfYm4sCisJCQkJCSAgICAgeSwgbGVuLCBsZW4pOworCQl9CisJCXJldCA9IDA7CisJfQorCisJQk5fZnJlZSh4X2JuKTsKKwlCTl9mcmVlKHlfYm4pOworCXJldHVybiByZXQ7Cit9CisKKworc3RydWN0IGNyeXB0b19lY19wb2ludCAqIGNyeXB0b19lY19wb2ludF9mcm9tX2JpbihzdHJ1Y3QgY3J5cHRvX2VjICplLAorCQkJCQkJICBjb25zdCB1OCAqdmFsKQoreworCUJJR05VTSAqeCwgKnk7CisJRUNfUE9JTlQgKmVsZW07CisJaW50IGxlbiA9IEJOX251bV9ieXRlcyhlLT5wcmltZSk7CisKKwl4ID0gQk5fYmluMmJuKHZhbCwgbGVuLCBOVUxMKTsKKwl5ID0gQk5fYmluMmJuKHZhbCArIGxlbiwgbGVuLCBOVUxMKTsKKwllbGVtID0gRUNfUE9JTlRfbmV3KGUtPmdyb3VwKTsKKwlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCB8fCBlbGVtID09IE5VTEwpIHsKKwkJQk5fZnJlZSh4KTsKKwkJQk5fZnJlZSh5KTsKKwkJRUNfUE9JTlRfZnJlZShlbGVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChlLT5ncm91cCwgZWxlbSwgeCwgeSwKKwkJCQkJCSBlLT5ibmN0eCkpIHsKKwkJRUNfUE9JTlRfZnJlZShlbGVtKTsKKwkJZWxlbSA9IE5VTEw7CisJfQorCisJQk5fZnJlZSh4KTsKKwlCTl9mcmVlKHkpOworCisJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICopIGVsZW07Cit9CisKKworaW50IGNyeXB0b19lY19wb2ludF9hZGQoc3RydWN0IGNyeXB0b19lYyAqZSwgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqYSwKKwkJCWNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKmIsCisJCQlzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpjKQoreworCXJldHVybiBFQ19QT0lOVF9hZGQoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBjLCAoY29uc3QgRUNfUE9JTlQgKikgYSwKKwkJCSAgICAoY29uc3QgRUNfUE9JTlQgKikgYiwgZS0+Ym5jdHgpID8gMCA6IC0xOworfQorCisKK2ludCBjcnlwdG9fZWNfcG9pbnRfbXVsKHN0cnVjdCBjcnlwdG9fZWMgKmUsIGNvbnN0IHN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnAsCisJCQljb25zdCBzdHJ1Y3QgY3J5cHRvX2JpZ251bSAqYiwKKwkJCXN0cnVjdCBjcnlwdG9fZWNfcG9pbnQgKnJlcykKK3sKKwlyZXR1cm4gRUNfUE9JTlRfbXVsKGUtPmdyb3VwLCAoRUNfUE9JTlQgKikgcmVzLCBOVUxMLAorCQkJICAgIChjb25zdCBFQ19QT0lOVCAqKSBwLCAoY29uc3QgQklHTlVNICopIGIsIGUtPmJuY3R4KQorCQk/IDAgOiAtMTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2ludmVydChzdHJ1Y3QgY3J5cHRvX2VjICplLCBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwKQoreworCXJldHVybiBFQ19QT0lOVF9pbnZlcnQoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCkgPyAwIDogLTE7Cit9CisKKworaW50IGNyeXB0b19lY19wb2ludF9zb2x2ZV95X2Nvb3JkKHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJICBzdHJ1Y3QgY3J5cHRvX2VjX3BvaW50ICpwLAorCQkJCSAgY29uc3Qgc3RydWN0IGNyeXB0b19iaWdudW0gKngsIGludCB5X2JpdCkKK3sKKwlpZiAoIUVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChlLT5ncm91cCwgKEVDX1BPSU5UICopIHAsCisJCQkJCQkgICAgIChjb25zdCBCSUdOVU0gKikgeCwgeV9iaXQsCisJCQkJCQkgICAgIGUtPmJuY3R4KSB8fAorCSAgICAhRUNfUE9JTlRfaXNfb25fY3VydmUoZS0+Z3JvdXAsIChFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2lzX2F0X2luZmluaXR5KHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJICAgY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCkKK3sKKwlyZXR1cm4gRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZS0+Z3JvdXAsIChjb25zdCBFQ19QT0lOVCAqKSBwKTsKK30KKworCitpbnQgY3J5cHRvX2VjX3BvaW50X2lzX29uX2N1cnZlKHN0cnVjdCBjcnlwdG9fZWMgKmUsCisJCQkJY29uc3Qgc3RydWN0IGNyeXB0b19lY19wb2ludCAqcCkKK3sKKwlyZXR1cm4gRUNfUE9JTlRfaXNfb25fY3VydmUoZS0+Z3JvdXAsIChjb25zdCBFQ19QT0lOVCAqKSBwLCBlLT5ibmN0eCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRUNDICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5jIGIvc3JjL2NyeXB0by9kaF9ncm91cHMuYwppbmRleCBmNzU3YjZiLi4zYTY3NWRmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5jCisrKyBiL3NyYy9jcnlwdG8vZGhfZ3JvdXBzLmMKQEAgLTM1LDYgKzM1LDIwIEBACiAJMHhGNCwgMHg0QywgMHg0MiwgMHhFOSwgMHhBNiwgMHgzQSwgMHgzNiwgMHgyMCwKIAkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCiB9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMV9vcmRlcls5Nl0gPSB7CisJMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEU0LCAweDg3LCAweEVELCAweDUxLCAweDEwLCAweEI0LCAweDYxLCAweDFBLAorCTB4NjIsIDB4NjMsIDB4MzEsIDB4NDUsIDB4QzAsIDB4NkUsIDB4MEUsIDB4NjgsCisJMHg5NCwgMHg4MSwgMHgyNywgMHgwNCwgMHg0NSwgMHgzMywgMHhFNiwgMHgzQSwKKwkweDAxLCAweDA1LCAweERGLCAweDUzLCAweDFELCAweDg5LCAweENELCAweDkxLAorCTB4MjgsIDB4QTUsIDB4MDQsIDB4M0MsIDB4QzcsIDB4MUEsIDB4MDIsIDB4NkUsCisJMHhGNywgMHhDQSwgMHg4QywgMHhEOSwgMHhFNiwgMHg5RCwgMHgyMSwgMHg4RCwKKwkweDk4LCAweDE1LCAweDg1LCAweDM2LCAweEY5LCAweDJGLCAweDhBLCAweDFCLAorCTB4QTcsIDB4RjAsIDB4OUEsIDB4QjYsIDB4QjYsIDB4QTgsIDB4RTEsIDB4MjIsCisJMHhGMiwgMHg0MiwgMHhEQSwgMHhCQiwgMHgzMSwgMHgyRiwgMHgzRiwgMHg2MywKKwkweDdBLCAweDI2LCAweDIxLCAweDc0LCAweEQzLCAweDFELCAweDFCLCAweDEwLAorCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKIC8qIFJGQyA0MzA2LCBCLjIuIEdyb3VwIDIgLSAxMDI0IEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTU5LDYgKzczLDI0IEBACiAJMHg0OSwgMHgyOCwgMHg2NiwgMHg1MSwgMHhFQywgMHhFNiwgMHg1MywgMHg4MSwKIAkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCiB9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMl9vcmRlclsxMjhdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDczLCAweDI5LCAweEMwLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKICNlbmRpZiAvKiBBTExfREhfR1JPVVBTICovCiAKQEAgLTkzLDYgKzEyNSwzMiBAQAogCTB4RjEsIDB4NzQsIDB4NkMsIDB4MDgsIDB4Q0EsIDB4MjMsIDB4NzMsIDB4MjcsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDVfb3JkZXJbMTkyXSA9IHsKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4RTQsIDB4ODcsIDB4RUQsIDB4NTEsIDB4MTAsIDB4QjQsIDB4NjEsIDB4MUEsCisJMHg2MiwgMHg2MywgMHgzMSwgMHg0NSwgMHhDMCwgMHg2RSwgMHgwRSwgMHg2OCwKKwkweDk0LCAweDgxLCAweDI3LCAweDA0LCAweDQ1LCAweDMzLCAweEU2LCAweDNBLAorCTB4MDEsIDB4MDUsIDB4REYsIDB4NTMsIDB4MUQsIDB4ODksIDB4Q0QsIDB4OTEsCisJMHgyOCwgMHhBNSwgMHgwNCwgMHgzQywgMHhDNywgMHgxQSwgMHgwMiwgMHg2RSwKKwkweEY3LCAweENBLCAweDhDLCAweEQ5LCAweEU2LCAweDlELCAweDIxLCAweDhELAorCTB4OTgsIDB4MTUsIDB4ODUsIDB4MzYsIDB4RjksIDB4MkYsIDB4OEEsIDB4MUIsCisJMHhBNywgMHhGMCwgMHg5QSwgMHhCNiwgMHhCNiwgMHhBOCwgMHhFMSwgMHgyMiwKKwkweEYyLCAweDQyLCAweERBLCAweEJCLCAweDMxLCAweDJGLCAweDNGLCAweDYzLAorCTB4N0EsIDB4MjYsIDB4MjEsIDB4NzQsIDB4RDMsIDB4MUIsIDB4RjYsIDB4QjUsCisJMHg4NSwgMHhGRiwgMHhBRSwgMHg1QiwgMHg3QSwgMHgwMywgMHg1QiwgMHhGNiwKKwkweEY3LCAweDFDLCAweDM1LCAweEZELCAweEFELCAweDQ0LCAweENGLCAweEQyLAorCTB4RDcsIDB4NEYsIDB4OTIsIDB4MDgsIDB4QkUsIDB4MjUsIDB4OEYsIDB4RjMsCisJMHgyNCwgMHg5NCwgMHgzMywgMHgyOCwgMHhGNiwgMHg3MiwgMHgyRCwgMHg5RSwKKwkweEUxLCAweDAwLCAweDNFLCAweDVDLCAweDUwLCAweEIxLCAweERGLCAweDgyLAorCTB4Q0MsIDB4NkQsIDB4MjQsIDB4MUIsIDB4MEUsIDB4MkEsIDB4RTksIDB4Q0QsCisJMHgzNCwgMHg4QiwgMHgxRiwgMHhENCwgMHg3RSwgMHg5MiwgMHg2NywgMHhBRiwKKwkweEMxLCAweEIyLCAweEFFLCAweDkxLCAweEVFLCAweDUxLCAweEQ2LCAweENCLAorCTB4MEUsIDB4MzEsIDB4NzksIDB4QUIsIDB4MTAsIDB4NDIsIDB4QTksIDB4NUQsCisJMHhDRiwgMHg2QSwgMHg5NCwgMHg4MywgMHhCOCwgMHg0QiwgMHg0QiwgMHgzNiwKKwkweEIzLCAweDg2LCAweDFBLCAweEE3LCAweDI1LCAweDVFLCAweDRDLCAweDAyLAorCTB4NzgsIDB4QkEsIDB4MzYsIDB4MDQsIDB4NjUsIDB4MTEsIDB4QjksIDB4OTMsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorfTsKIAogI2lmZGVmIEFMTF9ESF9HUk9VUFMKIApAQCAtMTM1LDYgKzE5Myw0MCBAQAogCTB4MTUsIDB4NzIsIDB4OEUsIDB4NUEsIDB4OEEsIDB4QUMsIDB4QUEsIDB4NjgsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDE0X29yZGVyWzI1Nl0gPSB7CisJMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEU0LCAweDg3LCAweEVELCAweDUxLCAweDEwLCAweEI0LCAweDYxLCAweDFBLAorCTB4NjIsIDB4NjMsIDB4MzEsIDB4NDUsIDB4QzAsIDB4NkUsIDB4MEUsIDB4NjgsCisJMHg5NCwgMHg4MSwgMHgyNywgMHgwNCwgMHg0NSwgMHgzMywgMHhFNiwgMHgzQSwKKwkweDAxLCAweDA1LCAweERGLCAweDUzLCAweDFELCAweDg5LCAweENELCAweDkxLAorCTB4MjgsIDB4QTUsIDB4MDQsIDB4M0MsIDB4QzcsIDB4MUEsIDB4MDIsIDB4NkUsCisJMHhGNywgMHhDQSwgMHg4QywgMHhEOSwgMHhFNiwgMHg5RCwgMHgyMSwgMHg4RCwKKwkweDk4LCAweDE1LCAweDg1LCAweDM2LCAweEY5LCAweDJGLCAweDhBLCAweDFCLAorCTB4QTcsIDB4RjAsIDB4OUEsIDB4QjYsIDB4QjYsIDB4QTgsIDB4RTEsIDB4MjIsCisJMHhGMiwgMHg0MiwgMHhEQSwgMHhCQiwgMHgzMSwgMHgyRiwgMHgzRiwgMHg2MywKKwkweDdBLCAweDI2LCAweDIxLCAweDc0LCAweEQzLCAweDFCLCAweEY2LCAweEI1LAorCTB4ODUsIDB4RkYsIDB4QUUsIDB4NUIsIDB4N0EsIDB4MDMsIDB4NUIsIDB4RjYsCisJMHhGNywgMHgxQywgMHgzNSwgMHhGRCwgMHhBRCwgMHg0NCwgMHhDRiwgMHhEMiwKKwkweEQ3LCAweDRGLCAweDkyLCAweDA4LCAweEJFLCAweDI1LCAweDhGLCAweEYzLAorCTB4MjQsIDB4OTQsIDB4MzMsIDB4MjgsIDB4RjYsIDB4NzIsIDB4MkQsIDB4OUUsCisJMHhFMSwgMHgwMCwgMHgzRSwgMHg1QywgMHg1MCwgMHhCMSwgMHhERiwgMHg4MiwKKwkweENDLCAweDZELCAweDI0LCAweDFCLCAweDBFLCAweDJBLCAweEU5LCAweENELAorCTB4MzQsIDB4OEIsIDB4MUYsIDB4RDQsIDB4N0UsIDB4OTIsIDB4NjcsIDB4QUYsCisJMHhDMSwgMHhCMiwgMHhBRSwgMHg5MSwgMHhFRSwgMHg1MSwgMHhENiwgMHhDQiwKKwkweDBFLCAweDMxLCAweDc5LCAweEFCLCAweDEwLCAweDQyLCAweEE5LCAweDVELAorCTB4Q0YsIDB4NkEsIDB4OTQsIDB4ODMsIDB4QjgsIDB4NEIsIDB4NEIsIDB4MzYsCisJMHhCMywgMHg4NiwgMHgxQSwgMHhBNywgMHgyNSwgMHg1RSwgMHg0QywgMHgwMiwKKwkweDc4LCAweEJBLCAweDM2LCAweDA0LCAweDY1LCAweDBDLCAweDEwLCAweEJFLAorCTB4MTksIDB4NDgsIDB4MkYsIDB4MjMsIDB4MTcsIDB4MUIsIDB4NjcsIDB4MUQsCisJMHhGMSwgMHhDRiwgMHgzQiwgMHg5NiwgMHgwQywgMHgwNywgMHg0MywgMHgwMSwKKwkweENELCAweDkzLCAweEMxLCAweEQxLCAweDc2LCAweDAzLCAweEQxLCAweDQ3LAorCTB4REEsIDB4RTIsIDB4QUUsIDB4RjgsIDB4MzcsIDB4QTYsIDB4MjksIDB4NjQsCisJMHhFRiwgMHgxNSwgMHhFNSwgMHhGQiwgMHg0QSwgMHhBQywgMHgwQiwgMHg4QywKKwkweDFDLCAweENBLCAweEE0LCAweEJFLCAweDc1LCAweDRBLCAweEI1LCAweDcyLAorCTB4OEEsIDB4RTksIDB4MTMsIDB4MEMsIDB4NEMsIDB4N0QsIDB4MDIsIDB4ODgsCisJMHgwQSwgMHhCOSwgMHg0NywgMHgyRCwgMHg0NSwgMHg1NiwgMHg1NSwgMHgzNCwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNC4gR3JvdXAgMTUgLSAzMDcyIEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTE5MSw2ICsyODMsNTYgQEAKIAkweDRCLCAweDgyLCAweEQxLCAweDIwLCAweEE5LCAweDNBLCAweEQyLCAweENBLAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxNV9vcmRlclszODRdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5RCwgMHg2OSwgMHg2NSwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNS4gR3JvdXAgMTYgLSA0MDk2IEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTI2Myw2ICs0MDUsNzIgQEAKIAkweDRELCAweEY0LCAweDM1LCAweEM5LCAweDM0LCAweDA2LCAweDMxLCAweDk5LAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxNl9vcmRlcls1MTJdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAzLCAweDE4LCAweENDLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKK307CiAKIC8qIFJGQyAzNTI2LCA2LiBHcm91cCAxNyAtIDYxNDQgQml0IE1PRFAKICAqIEdlbmVyYXRvcjogMgpAQCAtMzY3LDYgKzU3NSwxMDQgQEAKIAkweEU2LCAweDk0LCAweEY5LCAweDFFLCAweDZELCAweENDLCAweDQwLCAweDI0LAogCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYKIH07CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAxN19vcmRlcls3NjhdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAxLCAweDQyLCAweDQ5LAorCTB4MUIsIDB4NjEsIDB4RkQsIDB4NUEsIDB4NjksIDB4M0UsIDB4MzgsIDB4MTMsCisJMHg2MCwgMHhFQSwgMHg2RSwgMHg1OSwgMHgzMCwgMHgxMywgMHgyMywgMHg2RiwKKwkweDY0LCAweEJBLCAweDhGLCAweDNCLCAweDFFLCAweERELCAweDFCLCAweERFLAorCTB4RkMsIDB4N0YsIDB4Q0EsIDB4MDMsIDB4NTYsIDB4Q0YsIDB4MjksIDB4ODcsCisJMHg3MiwgMHhFRCwgMHg5QywgMHgxNywgMHhBMCwgMHg5OCwgMHgwMCwgMHhENywKKwkweDU4LCAweDM1LCAweDI5LCAweEY2LCAweEM4LCAweDEzLCAweEVDLCAweDE4LAorCTB4OEIsIDB4Q0IsIDB4OTMsIDB4RDgsIDB4NDMsIDB4MkQsIDB4NDQsIDB4OEMsCisJMHg2RCwgMHgxRiwgMHg2RCwgMHhGNSwgMHhFNywgMHhDRCwgMHg4QSwgMHg3NiwKKwkweEEyLCAweDY3LCAweDM2LCAweDVELCAweDY3LCAweDZBLCAweDVELCAweDhELAorCTB4RUQsIDB4QkYsIDB4OEEsIDB4MjMsIDB4RjMsIDB4NjYsIDB4MTIsIDB4QTUsCisJMHg5OSwgMHg5MCwgMHgyOCwgMHhBOCwgMHg5NSwgMHhFQiwgMHhENywgMHhBMSwKKwkweDM3LCAweERDLCAweDdBLCAweDAwLCAweDlCLCAweEM2LCAweDY5LCAweDVGLAorCTB4QUMsIDB4QzEsIDB4RTUsIDB4MDAsIDB4RTMsIDB4MjUsIDB4QzksIDB4NzYsCisJMHg3OCwgMHgxOSwgMHg3NSwgMHgwQSwgMHhFOCwgMHhCOSwgMHgwRSwgMHg4MSwKKwkweEZBLCAweDQxLCAweDZCLCAweEU3LCAweDM3LCAweDNBLCAweDdGLCAweDdCLAorCTB4NkEsIDB4QUYsIDB4MzgsIDB4MTcsIDB4QTMsIDB4NEMsIDB4MDYsIDB4NDEsCisJMHg1QSwgMHhENCwgMHgyMCwgMHgxOCwgMHhDOCwgMHgwNSwgMHg4RSwgMHg0RiwKKwkweDJDLCAweEYzLCAweEU0LCAweEJGLCAweERGLCAweDYzLCAweEY0LCAweDc5LAorCTB4OTEsIDB4RDQsIDB4QkQsIDB4M0YsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NUYsCisJMHgwNywgMHg4RSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhBQywgMHgyRCwgMHg2MiwKKwkweEE1LCAweEVBLCAweDAzLCAweEQ5LCAweDE1LCAweEEwLCAweEFBLCAweDU1LAorCTB4NjYsIDB4NDcsIDB4QjYsIDB4QkYsIDB4NUYsIDB4QTQsIDB4NzAsIDB4RUMsCisJMHgwQSwgMHg2NiwgMHgyRiwgMHg2OSwgMHgwNywgMHhDMCwgMHgxQiwgMHhGMCwKKwkweDUzLCAweENCLCAweDhBLCAweEY3LCAweDc5LCAweDRELCAweEYxLCAweDk0LAorCTB4MDMsIDB4NTAsIDB4RUEsIDB4QzUsIDB4REIsIDB4RTIsIDB4RUQsIDB4M0IsCisJMHg3QSwgMHhBOCwgMHg1NSwgMHgxRSwgMHhDNSwgMHgwRiwgMHhERiwgMHhGOCwKKwkweDc1LCAweDhDLCAweEU2LCAweDU4LCAweEQxLCAweDg5LCAweEVBLCAweEFFLAorCTB4NkQsIDB4MkIsIDB4NjQsIDB4RjYsIDB4MTcsIDB4NzksIDB4NEIsIDB4MTksCisJMHgxQywgMHgzRiwgMHhGNCwgMHg2QiwgMHhCNywgMHgxRSwgMHgwMiwgMHgzNCwKKwkweDAyLCAweDFGLCAweDQ3LCAweEIzLCAweDFGLCAweEE0LCAweDMwLCAweDc3LAorCTB4MDksIDB4NUYsIDB4OTYsIDB4QUQsIDB4ODUsIDB4QkEsIDB4M0EsIDB4NkIsCisJMHg3MywgMHg0QSwgMHg3QywgMHg4RiwgMHgzNiwgMHhFNiwgMHgyMCwgMHgxMiwKKwkweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCit9OwogCiAvKiBSRkMgMzUyNiwgNy4gR3JvdXAgMTggLSA4MTkyIEJpdCBNT0RQCiAgKiBHZW5lcmF0b3I6IDIKQEAgLTUwMywyNSArODA5LDM2MyBAQAogCTB4NjAsIDB4QzksIDB4ODAsIDB4REQsIDB4OTgsIDB4RUQsIDB4RDMsIDB4REYsCiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgogfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDE4X29yZGVyWzEwMjRdID0geworCTB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhFNCwgMHg4NywgMHhFRCwgMHg1MSwgMHgxMCwgMHhCNCwgMHg2MSwgMHgxQSwKKwkweDYyLCAweDYzLCAweDMxLCAweDQ1LCAweEMwLCAweDZFLCAweDBFLCAweDY4LAorCTB4OTQsIDB4ODEsIDB4MjcsIDB4MDQsIDB4NDUsIDB4MzMsIDB4RTYsIDB4M0EsCisJMHgwMSwgMHgwNSwgMHhERiwgMHg1MywgMHgxRCwgMHg4OSwgMHhDRCwgMHg5MSwKKwkweDI4LCAweEE1LCAweDA0LCAweDNDLCAweEM3LCAweDFBLCAweDAyLCAweDZFLAorCTB4RjcsIDB4Q0EsIDB4OEMsIDB4RDksIDB4RTYsIDB4OUQsIDB4MjEsIDB4OEQsCisJMHg5OCwgMHgxNSwgMHg4NSwgMHgzNiwgMHhGOSwgMHgyRiwgMHg4QSwgMHgxQiwKKwkweEE3LCAweEYwLCAweDlBLCAweEI2LCAweEI2LCAweEE4LCAweEUxLCAweDIyLAorCTB4RjIsIDB4NDIsIDB4REEsIDB4QkIsIDB4MzEsIDB4MkYsIDB4M0YsIDB4NjMsCisJMHg3QSwgMHgyNiwgMHgyMSwgMHg3NCwgMHhEMywgMHgxQiwgMHhGNiwgMHhCNSwKKwkweDg1LCAweEZGLCAweEFFLCAweDVCLCAweDdBLCAweDAzLCAweDVCLCAweEY2LAorCTB4RjcsIDB4MUMsIDB4MzUsIDB4RkQsIDB4QUQsIDB4NDQsIDB4Q0YsIDB4RDIsCisJMHhENywgMHg0RiwgMHg5MiwgMHgwOCwgMHhCRSwgMHgyNSwgMHg4RiwgMHhGMywKKwkweDI0LCAweDk0LCAweDMzLCAweDI4LCAweEY2LCAweDcyLCAweDJELCAweDlFLAorCTB4RTEsIDB4MDAsIDB4M0UsIDB4NUMsIDB4NTAsIDB4QjEsIDB4REYsIDB4ODIsCisJMHhDQywgMHg2RCwgMHgyNCwgMHgxQiwgMHgwRSwgMHgyQSwgMHhFOSwgMHhDRCwKKwkweDM0LCAweDhCLCAweDFGLCAweEQ0LCAweDdFLCAweDkyLCAweDY3LCAweEFGLAorCTB4QzEsIDB4QjIsIDB4QUUsIDB4OTEsIDB4RUUsIDB4NTEsIDB4RDYsIDB4Q0IsCisJMHgwRSwgMHgzMSwgMHg3OSwgMHhBQiwgMHgxMCwgMHg0MiwgMHhBOSwgMHg1RCwKKwkweENGLCAweDZBLCAweDk0LCAweDgzLCAweEI4LCAweDRCLCAweDRCLCAweDM2LAorCTB4QjMsIDB4ODYsIDB4MUEsIDB4QTcsIDB4MjUsIDB4NUUsIDB4NEMsIDB4MDIsCisJMHg3OCwgMHhCQSwgMHgzNiwgMHgwNCwgMHg2NSwgMHgwQywgMHgxMCwgMHhCRSwKKwkweDE5LCAweDQ4LCAweDJGLCAweDIzLCAweDE3LCAweDFCLCAweDY3LCAweDFELAorCTB4RjEsIDB4Q0YsIDB4M0IsIDB4OTYsIDB4MEMsIDB4MDcsIDB4NDMsIDB4MDEsCisJMHhDRCwgMHg5MywgMHhDMSwgMHhEMSwgMHg3NiwgMHgwMywgMHhEMSwgMHg0NywKKwkweERBLCAweEUyLCAweEFFLCAweEY4LCAweDM3LCAweEE2LCAweDI5LCAweDY0LAorCTB4RUYsIDB4MTUsIDB4RTUsIDB4RkIsIDB4NEEsIDB4QUMsIDB4MEIsIDB4OEMsCisJMHgxQywgMHhDQSwgMHhBNCwgMHhCRSwgMHg3NSwgMHg0QSwgMHhCNSwgMHg3MiwKKwkweDhBLCAweEU5LCAweDEzLCAweDBDLCAweDRDLCAweDdELCAweDAyLCAweDg4LAorCTB4MEEsIDB4QjksIDB4NDcsIDB4MkQsIDB4NDUsIDB4NTUsIDB4NjIsIDB4MTYsCisJMHhENiwgMHg5OSwgMHg4QiwgMHg4NiwgMHg4MiwgMHgyOCwgMHgzRCwgMHgxOSwKKwkweEQ0LCAweDJBLCAweDkwLCAweEQ1LCAweEVGLCAweDhFLCAweDVELCAweDMyLAorCTB4NzYsIDB4N0QsIDB4QzIsIDB4ODIsIDB4MkMsIDB4NkQsIDB4RjcsIDB4ODUsCisJMHg0NSwgMHg3NSwgMHgzOCwgMHhBQiwgMHhBRSwgMHg4MywgMHgwNiwgMHgzRSwKKwkweEQ5LCAweENCLCAweDg3LCAweEMyLCAweEQzLCAweDcwLCAweEYyLCAweDYzLAorCTB4RDUsIDB4RkEsIDB4RDcsIDB4NDYsIDB4NkQsIDB4ODQsIDB4OTksIDB4RUIsCisJMHg4RiwgMHg0NiwgMHg0QSwgMHg3MCwgMHgyNSwgMHgxMiwgMHhCMCwgMHhDRSwKKwkweEU3LCAweDcxLCAweEU5LCAweDEzLCAweDBELCAweDY5LCAweDc3LCAweDM1LAorCTB4RjgsIDB4OTcsIDB4RkQsIDB4MDMsIDB4NkMsIDB4QzUsIDB4MDQsIDB4MzIsCisJMHg2QywgMHgzQiwgMHgwMSwgMHgzOSwgMHg5RiwgMHg2NCwgMHgzNSwgMHgzMiwKKwkweDI5LCAweDBGLCAweDk1LCAweDhDLCAweDBCLCAweEJELCAweDkwLCAweDA2LAorCTB4NUQsIDB4RjAsIDB4OEIsIDB4QUIsIDB4QkQsIDB4MzAsIDB4QUUsIDB4QjYsCisJMHgzQiwgMHg4NCwgMHhDNCwgMHg2MCwgMHg1RCwgMHg2QywgMHhBMywgMHg3MSwKKwkweDA0LCAweDcxLCAweDI3LCAweEQwLCAweDNBLCAweDcyLCAweEQ1LCAweDk4LAorCTB4QTEsIDB4RUQsIDB4QUQsIDB4RkUsIDB4NzAsIDB4N0UsIDB4ODgsIDB4NDcsCisJMHgyNSwgMHhDMSwgMHg2OCwgMHg5MCwgMHg1NCwgMHg5MCwgMHg4NCwgMHgwMCwKKwkweDhELCAweDM5LCAweDFFLCAweDA5LCAweDUzLCAweEMzLCAweEYzLCAweDZCLAorCTB4QzQsIDB4MzgsIDB4Q0QsIDB4MDgsIDB4NUUsIDB4REQsIDB4MkQsIDB4OTMsCisJMHg0QywgMHhFMSwgMHg5MywgMHg4QywgMHgzNSwgMHg3QSwgMHg3MSwgMHgxRSwKKwkweDBELCAweDRBLCAweDM0LCAweDFBLCAweDVCLCAweDBBLCAweDg1LCAweEVELAorCTB4MTIsIDB4QzEsIDB4RjQsIDB4RTUsIDB4MTUsIDB4NkEsIDB4MjYsIDB4NzQsCisJMHg2RCwgMHhERCwgMHhFMSwgMHg2RCwgMHg4MiwgMHg2RiwgMHg0NywgMHg3QywKKwkweDk3LCAweDQ3LCAweDdFLCAweDBBLCAweDBGLCAweERGLCAweDY1LCAweDUzLAorCTB4MTQsIDB4M0UsIDB4MkMsIDB4QTMsIDB4QTcsIDB4MzUsIDB4RTAsIDB4MkUsCisJMHhDQywgMHhEOSwgMHg0QiwgMHgyNywgMHhEMCwgMHg0OCwgMHg2MSwgMHhEMSwKKwkweDExLCAweDlELCAweEQwLCAweEMzLCAweDI4LCAweEFELCAweEYzLCAweEY2LAorCTB4OEYsIDB4QjAsIDB4OTQsIDB4QjgsIDB4NjcsIDB4NzEsIDB4NkIsIDB4RDcsCisJMHhEQywgMHgwRCwgMHhFRSwgMHhCQiwgMHgxMCwgMHhCOCwgMHgyNCwgMHgwRSwKKwkweDY4LCAweDAzLCAweDQ4LCAweDkzLCAweEVBLCAweEQ4LCAweDJELCAweDU0LAorCTB4QzksIDB4REEsIDB4NzUsIDB4NEMsIDB4NDYsIDB4QzcsIDB4RUUsIDB4RTAsCisJMHhDMywgMHg3RiwgMHhEQiwgMHhFRSwgMHg0OCwgMHg1MywgMHg2MCwgMHg0NywKKwkweEE2LCAweEZBLCAweDFBLCAweEU0LCAweDlBLCAweDAxLCAweDQyLCAweDQ5LAorCTB4MUIsIDB4NjEsIDB4RkQsIDB4NUEsIDB4NjksIDB4M0UsIDB4MzgsIDB4MTMsCisJMHg2MCwgMHhFQSwgMHg2RSwgMHg1OSwgMHgzMCwgMHgxMywgMHgyMywgMHg2RiwKKwkweDY0LCAweEJBLCAweDhGLCAweDNCLCAweDFFLCAweERELCAweDFCLCAweERFLAorCTB4RkMsIDB4N0YsIDB4Q0EsIDB4MDMsIDB4NTYsIDB4Q0YsIDB4MjksIDB4ODcsCisJMHg3MiwgMHhFRCwgMHg5QywgMHgxNywgMHhBMCwgMHg5OCwgMHgwMCwgMHhENywKKwkweDU4LCAweDM1LCAweDI5LCAweEY2LCAweEM4LCAweDEzLCAweEVDLCAweDE4LAorCTB4OEIsIDB4Q0IsIDB4OTMsIDB4RDgsIDB4NDMsIDB4MkQsIDB4NDQsIDB4OEMsCisJMHg2RCwgMHgxRiwgMHg2RCwgMHhGNSwgMHhFNywgMHhDRCwgMHg4QSwgMHg3NiwKKwkweEEyLCAweDY3LCAweDM2LCAweDVELCAweDY3LCAweDZBLCAweDVELCAweDhELAorCTB4RUQsIDB4QkYsIDB4OEEsIDB4MjMsIDB4RjMsIDB4NjYsIDB4MTIsIDB4QTUsCisJMHg5OSwgMHg5MCwgMHgyOCwgMHhBOCwgMHg5NSwgMHhFQiwgMHhENywgMHhBMSwKKwkweDM3LCAweERDLCAweDdBLCAweDAwLCAweDlCLCAweEM2LCAweDY5LCAweDVGLAorCTB4QUMsIDB4QzEsIDB4RTUsIDB4MDAsIDB4RTMsIDB4MjUsIDB4QzksIDB4NzYsCisJMHg3OCwgMHgxOSwgMHg3NSwgMHgwQSwgMHhFOCwgMHhCOSwgMHgwRSwgMHg4MSwKKwkweEZBLCAweDQxLCAweDZCLCAweEU3LCAweDM3LCAweDNBLCAweDdGLCAweDdCLAorCTB4NkEsIDB4QUYsIDB4MzgsIDB4MTcsIDB4QTMsIDB4NEMsIDB4MDYsIDB4NDEsCisJMHg1QSwgMHhENCwgMHgyMCwgMHgxOCwgMHhDOCwgMHgwNSwgMHg4RSwgMHg0RiwKKwkweDJDLCAweEYzLCAweEU0LCAweEJGLCAweERGLCAweDYzLCAweEY0LCAweDc5LAorCTB4OTEsIDB4RDQsIDB4QkQsIDB4M0YsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NUYsCisJMHgwNywgMHg4RSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhBQywgMHgyRCwgMHg2MiwKKwkweEE1LCAweEVBLCAweDAzLCAweEQ5LCAweDE1LCAweEEwLCAweEFBLCAweDU1LAorCTB4NjYsIDB4NDcsIDB4QjYsIDB4QkYsIDB4NUYsIDB4QTQsIDB4NzAsIDB4RUMsCisJMHgwQSwgMHg2NiwgMHgyRiwgMHg2OSwgMHgwNywgMHhDMCwgMHgxQiwgMHhGMCwKKwkweDUzLCAweENCLCAweDhBLCAweEY3LCAweDc5LCAweDRELCAweEYxLCAweDk0LAorCTB4MDMsIDB4NTAsIDB4RUEsIDB4QzUsIDB4REIsIDB4RTIsIDB4RUQsIDB4M0IsCisJMHg3QSwgMHhBOCwgMHg1NSwgMHgxRSwgMHhDNSwgMHgwRiwgMHhERiwgMHhGOCwKKwkweDc1LCAweDhDLCAweEU2LCAweDU4LCAweEQxLCAweDg5LCAweEVBLCAweEFFLAorCTB4NkQsIDB4MkIsIDB4NjQsIDB4RjYsIDB4MTcsIDB4NzksIDB4NEIsIDB4MTksCisJMHgxQywgMHgzRiwgMHhGNCwgMHg2QiwgMHhCNywgMHgxRSwgMHgwMiwgMHgzNCwKKwkweDAyLCAweDFGLCAweDQ3LCAweEIzLCAweDFGLCAweEE0LCAweDMwLCAweDc3LAorCTB4MDksIDB4NUYsIDB4OTYsIDB4QUQsIDB4ODUsIDB4QkEsIDB4M0EsIDB4NkIsCisJMHg3MywgMHg0QSwgMHg3QywgMHg4RiwgMHgzNiwgMHhERiwgMHgwOCwgMHhBQywKKwkweEJBLCAweDUxLCAweEM5LCAweDM3LCAweDg5LCAweDdGLCAweDcyLCAweEYyLAorCTB4MUMsIDB4M0IsIDB4QkUsIDB4NUIsIDB4NTQsIDB4OTksIDB4NkYsIDB4QzYsCisJMHg2QywgMHg1RiwgMHg2MiwgMHg2OCwgMHgzOSwgMHhEQywgMHg5OCwgMHhERCwKKwkweDFELCAweEU0LCAweDE5LCAweDVCLCAweDQ2LCAweENFLCAweEU5LCAweDgwLAorCTB4M0EsIDB4MEYsIDB4RDMsIDB4REYsIDB4QzUsIDB4N0UsIDB4MjMsIDB4RjYsCisJMHg5MiwgMHhCQiwgMHg3QiwgMHg0OSwgMHhCNSwgMHhEMiwgMHgxMiwgMHgzMywKKwkweDFELCAweDU1LCAweEIxLCAweENFLCAweDJELCAweDcyLCAweDdBLCAweEI0LAorCTB4MUEsIDB4MTEsIDB4REEsIDB4M0EsIDB4MTUsIDB4RjgsIDB4RTQsIDB4QkMsCisJMHgxMSwgMHhDNywgMHg4QiwgMHg2NSwgMHhGMSwgMHhDRSwgMHhCMiwgMHg5NiwKKwkweEYxLCAweEZFLCAweERDLCAweDVGLCAweDdFLCAweDQyLCAweDQ1LCAweDZDLAorCTB4OTEsIDB4MTEsIDB4MTcsIDB4MDIsIDB4NTIsIDB4MDEsIDB4QkUsIDB4MDMsCisJMHg4OSwgMHhGNSwgMHhBQiwgMHhENCwgMHgwRCwgMHgxMSwgMHhGOCwgMHg2MywKKwkweDlBLCAweDM5LCAweEZFLCAweDMyLCAweDM2LCAweDc1LCAweDE4LCAweDM1LAorCTB4QTUsIDB4RTUsIDB4RTQsIDB4NDMsIDB4MTcsIDB4QzEsIDB4QzIsIDB4RUUsCisJMHhGRCwgMHg0RSwgMHhBNSwgMHhCRiwgMHhEMSwgMHg2MCwgMHg0MywgMHhGNCwKKwkweDNDLCAweEI0LCAweDE5LCAweDgxLCAweEY2LCAweEFELCAweEVFLCAweDlELAorCTB4MDMsIDB4MTUsIDB4OUUsIDB4N0EsIDB4RDksIDB4RDEsIDB4M0MsIDB4NTMsCisJMHgzNiwgMHg5NSwgMHgwOSwgMHhGQywgMHgxRiwgMHhBMiwgMHg3QywgMHgxNiwKKwkweEVGLCAweDk4LCAweDg3LCAweDcwLCAweDNBLCAweDU1LCAweEI1LCAweDFCLAorCTB4MjIsIDB4Q0IsIDB4RjQsIDB4NEMsIDB4RDAsIDB4MTIsIDB4QUUsIDB4RTAsCisJMHhCMiwgMHg3OSwgMHg4RSwgMHg2MiwgMHg4NCwgMHgyMywgMHg0MiwgMHg4RSwKKwkweEZDLCAweEQ1LCAweEE0LCAweDBDLCAweEFFLCAweEY2LCAweEJGLCAweDUwLAorCTB4RDgsIDB4RUEsIDB4ODgsIDB4NUUsIDB4QkYsIDB4NzMsIDB4QTYsIDB4QjksCisJMHhGRCwgMHg3OSwgMHhCNSwgMHhFMSwgMHg4RiwgMHg2NywgMHhEMSwgMHgzNCwKKwkweDFBLCAweEM4LCAweDIzLCAweDdBLCAweDc1LCAweEMzLCAweENGLCAweEM5LAorCTB4MjAsIDB4MDQsIDB4QTEsIDB4QzUsIDB4QTQsIDB4MEUsIDB4MzYsIDB4NkIsCisJMHhDNCwgMHg0RCwgMHgwMCwgMHgxNywgMHg2QSwgMHhGNywgMHgxQywgMHgxNSwKKwkweEU0LCAweDhDLCAweDg2LCAweEQzLCAweDdFLCAweDAxLCAweDM3LCAweDIzLAorCTB4Q0EsIDB4QUMsIDB4NzIsIDB4MjMsIDB4QUIsIDB4M0IsIDB4RjQsIDB4RDUsCisJMHg0RiwgMHgxOCwgMHgyOCwgMHg3MSwgMHgzQiwgMHgyQiwgMHg0QSwgMHg2RiwKKwkweEU0LCAweDBGLCAweEFCLCAweDc0LCAweDQwLCAweDVDLCAweEI3LCAweDM4LAorCTB4QjAsIDB4NjQsIDB4QzAsIDB4NkUsIDB4Q0MsIDB4NzYsIDB4RTksIDB4RUYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorfTsKKworLyoKKyAqIFJGQyA1MTE0LCAyLjEuCisgKiBHcm91cCAyMiAtIDEwMjQtYml0IE1PRFAgR3JvdXAgd2l0aCAxNjAtYml0IFByaW1lIE9yZGVyIFN1Ymdyb3VwCisgKi8KK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDIyX2dlbmVyYXRvcltdID0geworCTB4QTQsIDB4RDEsIDB4Q0IsIDB4RDUsIDB4QzMsIDB4RkQsIDB4MzQsIDB4MTIsCisJMHg2NywgMHg2NSwgMHhBNCwgMHg0MiwgMHhFRiwgMHhCOSwgMHg5OSwgMHgwNSwKKwkweEY4LCAweDEwLCAweDRELCAweEQyLCAweDU4LCAweEFDLCAweDUwLCAweDdGLAorCTB4RDYsIDB4NDAsIDB4NkMsIDB4RkYsIDB4MTQsIDB4MjYsIDB4NkQsIDB4MzEsCisJMHgyNiwgMHg2RiwgMHhFQSwgMHgxRSwgMHg1QywgMHg0MSwgMHg1NiwgMHg0QiwKKwkweDc3LCAweDdFLCAweDY5LCAweDBGLCAweDU1LCAweDA0LCAweEYyLCAweDEzLAorCTB4MTYsIDB4MDIsIDB4MTcsIDB4QjQsIDB4QjAsIDB4MUIsIDB4ODgsIDB4NkEsCisJMHg1RSwgMHg5MSwgMHg1NCwgMHg3RiwgMHg5RSwgMHgyNywgMHg0OSwgMHhGNCwKKwkweEQ3LCAweEZCLCAweEQ3LCAweEQzLCAweEI5LCAweEE5LCAweDJFLCAweEUxLAorCTB4OTAsIDB4OUQsIDB4MEQsIDB4MjIsIDB4NjMsIDB4RjgsIDB4MEEsIDB4NzYsCisJMHhBNiwgMHhBMiwgMHg0QywgMHgwOCwgMHg3QSwgMHgwOSwgMHgxRiwgMHg1MywKKwkweDFELCAweEJGLCAweDBBLCAweDAxLCAweDY5LCAweEI2LCAweEEyLCAweDhBLAorCTB4RDYsIDB4NjIsIDB4QTQsIDB4RDEsIDB4OEUsIDB4NzMsIDB4QUYsIDB4QTMsCisJMHgyRCwgMHg3NywgMHg5RCwgMHg1OSwgMHgxOCwgMHhEMCwgMHg4QiwgMHhDOCwKKwkweDg1LCAweDhGLCAweDRELCAweENFLCAweEY5LCAweDdDLCAweDJBLCAweDI0LAorCTB4ODUsIDB4NUUsIDB4NkUsIDB4RUIsIDB4MjIsIDB4QjMsIDB4QjIsIDB4RTUKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyMl9wcmltZVtdID0geworCTB4QjEsIDB4MEIsIDB4OEYsIDB4OTYsIDB4QTAsIDB4ODAsIDB4RTAsIDB4MUQsCisJMHhERSwgMHg5MiwgMHhERSwgMHg1RSwgMHhBRSwgMHg1RCwgMHg1NCwgMHhFQywKKwkweDUyLCAweEM5LCAweDlGLCAweEJDLCAweEZCLCAweDA2LCAweEEzLCAweEM2LAorCTB4OUEsIDB4NkEsIDB4OUQsIDB4Q0EsIDB4NTIsIDB4RDIsIDB4M0IsIDB4NjEsCisJMHg2MCwgMHg3MywgMHhFMiwgMHg4NiwgMHg3NSwgMHhBMiwgMHgzRCwgMHgxOCwKKwkweDk4LCAweDM4LCAweEVGLCAweDFFLCAweDJFLCAweEU2LCAweDUyLCAweEMwLAorCTB4MTMsIDB4RUMsIDB4QjQsIDB4QUUsIDB4QTksIDB4MDYsIDB4MTEsIDB4MjMsCisJMHgyNCwgMHg5NywgMHg1QywgMHgzQywgMHhENCwgMHg5QiwgMHg4MywgMHhCRiwKKwkweEFDLCAweENCLCAweERELCAweDdELCAweDkwLCAweEM0LCAweEJELCAweDcwLAorCTB4OTgsIDB4NDgsIDB4OEUsIDB4OUMsIDB4MjEsIDB4OUEsIDB4NzMsIDB4NzIsCisJMHg0RSwgMHhGRiwgMHhENiwgMHhGQSwgMHhFNSwgMHg2NCwgMHg0NywgMHgzOCwKKwkweEZBLCAweEEzLCAweDFBLCAweDRGLCAweEY1LCAweDVCLCAweENDLCAweEMwLAorCTB4QTEsIDB4NTEsIDB4QUYsIDB4NUYsIDB4MEQsIDB4QzgsIDB4QjQsIDB4QkQsCisJMHg0NSwgMHhCRiwgMHgzNywgMHhERiwgMHgzNiwgMHg1QywgMHgxQSwgMHg2NSwKKwkweEU2LCAweDhDLCAweEZELCAweEE3LCAweDZELCAweDRELCAweEE3LCAweDA4LAorCTB4REYsIDB4MUYsIDB4QjIsIDB4QkMsIDB4MkUsIDB4NEEsIDB4NDMsIDB4NzEKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyMl9vcmRlcltdID0geworCTB4RjUsIDB4MTgsIDB4QUEsIDB4ODcsIDB4ODEsIDB4QTgsIDB4REYsIDB4MjcsCisJMHg4QSwgMHhCQSwgMHg0RSwgMHg3RCwgMHg2NCwgMHhCNywgMHhDQiwgMHg5RCwKKwkweDQ5LCAweDQ2LCAweDIzLCAweDUzCit9OworCisvKgorICogUkZDIDUxMTQsIDIuMi4KKyAqIEdyb3VwIDIzIC0gMjA0OC1iaXQgTU9EUCBHcm91cCB3aXRoIDIyNC1iaXQgUHJpbWUgT3JkZXIgU3ViZ3JvdXAKKyAqLworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMjNfZ2VuZXJhdG9yW10gPSB7CisJMHhBQywgMHg0MCwgMHgzMiwgMHhFRiwgMHg0RiwgMHgyRCwgMHg5QSwgMHhFMywKKwkweDlELCAweEYzLCAweDBCLCAweDVDLCAweDhGLCAweEZELCAweEFDLCAweDUwLAorCTB4NkMsIDB4REUsIDB4QkUsIDB4N0IsIDB4ODksIDB4OTksIDB4OEMsIDB4QUYsCisJMHg3NCwgMHg4NiwgMHg2QSwgMHgwOCwgMHhDRiwgMHhFNCwgMHhGRiwgMHhFMywKKwkweEE2LCAweDgyLCAweDRBLCAweDRFLCAweDEwLCAweEI5LCAweEE2LCAweEYwLAorCTB4REQsIDB4OTIsIDB4MUYsIDB4MDEsIDB4QTcsIDB4MEMsIDB4NEEsIDB4RkEsCisJMHhBQiwgMHg3MywgMHg5RCwgMHg3NywgMHgwMCwgMHhDMiwgMHg5RiwgMHg1MiwKKwkweEM1LCAweDdELCAweEIxLCAweDdDLCAweDYyLCAweDBBLCAweDg2LCAweDUyLAorCTB4QkUsIDB4NUUsIDB4OTAsIDB4MDEsIDB4QTgsIDB4RDYsIDB4NkEsIDB4RDcsCisJMHhDMSwgMHg3NiwgMHg2OSwgMHgxMCwgMHgxOSwgMHg5OSwgMHgwMiwgMHg0QSwKKwkweEY0LCAweEQwLCAweDI3LCAweDI3LCAweDVBLCAweEMxLCAweDM0LCAweDhCLAorCTB4QjgsIDB4QTcsIDB4NjIsIDB4RDAsIDB4NTIsIDB4MUIsIDB4QzksIDB4OEEsCisJMHhFMiwgMHg0NywgMHgxNSwgMHgwNCwgMHgyMiwgMHhFQSwgMHgxRSwgMHhENCwKKwkweDA5LCAweDkzLCAweDlELCAweDU0LCAweERBLCAweDc0LCAweDYwLCAweENELAorCTB4QjUsIDB4RjYsIDB4QzYsIDB4QjIsIDB4NTAsIDB4NzEsIDB4N0MsIDB4QkUsCisJMHhGMSwgMHg4MCwgMHhFQiwgMHgzNCwgMHgxMSwgMHg4RSwgMHg5OCwgMHhEMSwKKwkweDE5LCAweDUyLCAweDlBLCAweDQ1LCAweEQ2LCAweEY4LCAweDM0LCAweDU2LAorCTB4NkUsIDB4MzAsIDB4MjUsIDB4RTMsIDB4MTYsIDB4QTMsIDB4MzAsIDB4RUYsCisJMHhCQiwgMHg3NywgMHhBOCwgMHg2RiwgMHgwQywgMHgxQSwgMHhCMSwgMHg1QiwKKwkweDA1LCAweDFBLCAweEUzLCAweEQ0LCAweDI4LCAweEM4LCAweEY4LCAweEFDLAorCTB4QjcsIDB4MEEsIDB4ODEsIDB4MzcsIDB4MTUsIDB4MEIsIDB4OEUsIDB4RUIsCisJMHgxMCwgMHhFMSwgMHg4MywgMHhFRCwgMHhEMSwgMHg5OSwgMHg2MywgMHhERCwKKwkweEQ5LCAweEUyLCAweDYzLCAweEU0LCAweDc3LCAweDA1LCAweDg5LCAweEVGLAorCTB4NkEsIDB4QTIsIDB4MUUsIDB4N0YsIDB4NUYsIDB4MkYsIDB4RjMsIDB4ODEsCisJMHhCNSwgMHgzOSwgMHhDQywgMHhFMywgMHg0MCwgMHg5RCwgMHgxMywgMHhDRCwKKwkweDU2LCAweDZBLCAweEZCLCAweEI0LCAweDhELCAweDZDLCAweDAxLCAweDkxLAorCTB4ODEsIDB4RTEsIDB4QkMsIDB4RkUsIDB4OTQsIDB4QjMsIDB4MDIsIDB4NjksCisJMHhFRCwgMHhGRSwgMHg3MiwgMHhGRSwgMHg5QiwgMHg2QSwgMHhBNCwgMHhCRCwKKwkweDdCLCAweDVBLCAweDBGLCAweDFDLCAweDcxLCAweENGLCAweEZGLCAweDRDLAorCTB4MTksIDB4QzQsIDB4MTgsIDB4RTEsIDB4RjYsIDB4RUMsIDB4MDEsIDB4NzksCisJMHg4MSwgMHhCQywgMHgwOCwgMHg3RiwgMHgyQSwgMHg3MCwgMHg2NSwgMHhCMywKKwkweDg0LCAweEI4LCAweDkwLCAweEQzLCAweDE5LCAweDFGLCAweDJCLCAweEZBCit9Oworc3RhdGljIGNvbnN0IHU4IGRoX2dyb3VwMjNfcHJpbWVbXSA9IHsKKwkweEFELCAweDEwLCAweDdFLCAweDFFLCAweDkxLCAweDIzLCAweEE5LCAweEQwLAorCTB4RDYsIDB4NjAsIDB4RkEsIDB4QTcsIDB4OTUsIDB4NTksIDB4QzUsIDB4MUYsCisJMHhBMiwgMHgwRCwgMHg2NCwgMHhFNSwgMHg2OCwgMHgzQiwgMHg5RiwgMHhEMSwKKwkweEI1LCAweDRCLCAweDE1LCAweDk3LCAweEI2LCAweDFELCAweDBBLCAweDc1LAorCTB4RTYsIDB4RkEsIDB4MTQsIDB4MUQsIDB4RjksIDB4NUEsIDB4NTYsIDB4REIsCisJMHhBRiwgMHg5QSwgMHgzQywgMHg0MCwgMHg3QiwgMHhBMSwgMHhERiwgMHgxNSwKKwkweEVCLCAweDNELCAweDY4LCAweDhBLCAweDMwLCAweDlDLCAweDE4LCAweDBFLAorCTB4MUQsIDB4RTYsIDB4QjgsIDB4NUEsIDB4MTIsIDB4NzQsIDB4QTAsIDB4QTYsCisJMHg2RCwgMHgzRiwgMHg4MSwgMHg1MiwgMHhBRCwgMHg2QSwgMHhDMiwgMHgxMiwKKwkweDkwLCAweDM3LCAweEM5LCAweEVELCAweEVGLCAweERBLCAweDRELCAweEY4LAorCTB4RDksIDB4MUUsIDB4OEYsIDB4RUYsIDB4NTUsIDB4QjcsIDB4MzksIDB4NEIsCisJMHg3QSwgMHhENSwgMHhCNywgMHhEMCwgMHhCNiwgMHhDMSwgMHgyMiwgMHgwNywKKwkweEM5LCAweEY5LCAweDhELCAweDExLCAweEVELCAweDM0LCAweERCLCAweEY2LAorCTB4QzYsIDB4QkEsIDB4MEIsIDB4MkMsIDB4OEIsIDB4QkMsIDB4MjcsIDB4QkUsCisJMHg2QSwgMHgwMCwgMHhFMCwgMHhBMCwgMHhCOSwgMHhDNCwgMHg5NywgMHgwOCwKKwkweEIzLCAweEJGLCAweDhBLCAweDMxLCAweDcwLCAweDkxLCAweDg4LCAweDM2LAorCTB4ODEsIDB4MjgsIDB4NjEsIDB4MzAsIDB4QkMsIDB4ODksIDB4ODUsIDB4REIsCisJMHgxNiwgMHgwMiwgMHhFNywgMHgxNCwgMHg0MSwgMHg1RCwgMHg5MywgMHgzMCwKKwkweDI3LCAweDgyLCAweDczLCAweEM3LCAweERFLCAweDMxLCAweEVGLCAweERDLAorCTB4NzMsIDB4MTAsIDB4RjcsIDB4MTIsIDB4MUYsIDB4RDUsIDB4QTAsIDB4NzQsCisJMHgxNSwgMHg5OCwgMHg3RCwgMHg5QSwgMHhEQywgMHgwQSwgMHg0OCwgMHg2RCwKKwkweENELCAweEY5LCAweDNBLCAweENDLCAweDQ0LCAweDMyLCAweDgzLCAweDg3LAorCTB4MzEsIDB4NUQsIDB4NzUsIDB4RTEsIDB4OTgsIDB4QzYsIDB4NDEsIDB4QTQsCisJMHg4MCwgMHhDRCwgMHg4NiwgMHhBMSwgMHhCOSwgMHhFNSwgMHg4NywgMHhFOCwKKwkweEJFLCAweDYwLCAweEU2LCAweDlDLCAweEM5LCAweDI4LCAweEIyLCAweEI5LAorCTB4QzUsIDB4MjEsIDB4NzIsIDB4RTQsIDB4MTMsIDB4MDQsIDB4MkUsIDB4OUIsCisJMHgyMywgMHhGMSwgMHgwQiwgMHgwRSwgMHgxNiwgMHhFNywgMHg5NywgMHg2MywKKwkweEM5LCAweEI1LCAweDNELCAweENGLCAweDRCLCAweEE4LCAweDBBLCAweDI5LAorCTB4RTMsIDB4RkIsIDB4NzMsIDB4QzEsIDB4NkIsIDB4OEUsIDB4NzUsIDB4QjksCisJMHg3RSwgMHhGMywgMHg2MywgMHhFMiwgMHhGRiwgMHhBMywgMHgxRiwgMHg3MSwKKwkweENGLCAweDlELCAweEU1LCAweDM4LCAweDRFLCAweDcxLCAweEI4LCAweDFDLAorCTB4MEEsIDB4QzQsIDB4REYsIDB4RkUsIDB4MEMsIDB4MTAsIDB4RTYsIDB4NEYKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyM19vcmRlcltdID0geworCTB4ODAsIDB4MUMsIDB4MEQsIDB4MzQsIDB4QzUsIDB4OEQsIDB4OTMsIDB4RkUsCisJMHg5OSwgMHg3MSwgMHg3NywgMHgxMCwgMHgxRiwgMHg4MCwgMHg1MywgMHg1QSwKKwkweDQ3LCAweDM4LCAweENFLCAweEJDLCAweEJGLCAweDM4LCAweDlBLCAweDk5LAorCTB4QjMsIDB4NjMsIDB4NzEsIDB4RUIKK307CisKKy8qCisgKiBSRkMgNTExNCwgMi4zLgorICogR3JvdXAgMjQgLSAyMDQ4LWJpdCBNT0RQIEdyb3VwIHdpdGggMjU2LWJpdCBQcmltZSBPcmRlciBTdWJncm91cAorICovCitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyNF9nZW5lcmF0b3JbXSA9IHsKKwkweDNGLCAweEIzLCAweDJDLCAweDlCLCAweDczLCAweDEzLCAweDRELCAweDBCLAorCTB4MkUsIDB4NzcsIDB4NTAsIDB4NjYsIDB4NjAsIDB4RUQsIDB4QkQsIDB4NDgsCisJMHg0QywgMHhBNywgMHhCMSwgMHg4RiwgMHgyMSwgMHhFRiwgMHgyMCwgMHg1NCwKKwkweDA3LCAweEY0LCAweDc5LCAweDNBLCAweDFBLCAweDBCLCAweEExLCAweDI1LAorCTB4MTAsIDB4REIsIDB4QzEsIDB4NTAsIDB4NzcsIDB4QkUsIDB4NDYsIDB4M0YsCisJMHhGRiwgMHg0RiwgMHhFRCwgMHg0QSwgMHhBQywgMHgwQiwgMHhCNSwgMHg1NSwKKwkweEJFLCAweDNBLCAweDZDLCAweDFCLCAweDBDLCAweDZCLCAweDQ3LCAweEIxLAorCTB4QkMsIDB4MzcsIDB4NzMsIDB4QkYsIDB4N0UsIDB4OEMsIDB4NkYsIDB4NjIsCisJMHg5MCwgMHgxMiwgMHgyOCwgMHhGOCwgMHhDMiwgMHg4QywgMHhCQiwgMHgxOCwKKwkweEE1LCAweDVBLCAweEUzLCAweDEzLCAweDQxLCAweDAwLCAweDBBLCAweDY1LAorCTB4MDEsIDB4OTYsIDB4RjksIDB4MzEsIDB4QzcsIDB4N0EsIDB4NTcsIDB4RjIsCisJMHhERCwgMHhGNCwgMHg2MywgMHhFNSwgMHhFOSwgMHhFQywgMHgxNCwgMHg0QiwKKwkweDc3LCAweDdELCAweEU2LCAweDJBLCAweEFBLCAweEI4LCAweEE4LCAweDYyLAorCTB4OEEsIDB4QzMsIDB4NzYsIDB4RDIsIDB4ODIsIDB4RDYsIDB4RUQsIDB4MzgsCisJMHg2NCwgMHhFNiwgMHg3OSwgMHg4MiwgMHg0MiwgMHg4RSwgMHhCQywgMHg4MywKKwkweDFELCAweDE0LCAweDM0LCAweDhGLCAweDZGLCAweDJGLCAweDkxLCAweDkzLAorCTB4QjUsIDB4MDQsIDB4NUEsIDB4RjIsIDB4NzYsIDB4NzEsIDB4NjQsIDB4RTEsCisJMHhERiwgMHhDOSwgMHg2NywgMHhDMSwgMHhGQiwgMHgzRiwgMHgyRSwgMHg1NSwKKwkweEE0LCAweEJELCAweDFCLCAweEZGLCAweEU4LCAweDNCLCAweDlDLCAweDgwLAorCTB4RDAsIDB4NTIsIDB4QjksIDB4ODUsIDB4RDEsIDB4ODIsIDB4RUEsIDB4MEEsCisJMHhEQiwgMHgyQSwgMHgzQiwgMHg3MywgMHgxMywgMHhEMywgMHhGRSwgMHgxNCwKKwkweEM4LCAweDQ4LCAweDRCLCAweDFFLCAweDA1LCAweDI1LCAweDg4LCAweEI5LAorCTB4QjcsIDB4RDIsIDB4QkIsIDB4RDIsIDB4REYsIDB4MDEsIDB4NjEsIDB4OTksCisJMHhFQywgMHhEMCwgMHg2RSwgMHgxNSwgMHg1NywgMHhDRCwgMHgwOSwgMHgxNSwKKwkweEIzLCAweDM1LCAweDNCLCAweEJCLCAweDY0LCAweEUwLCAweEVDLCAweDM3LAorCTB4N0YsIDB4RDAsIDB4MjgsIDB4MzcsIDB4MEQsIDB4RjksIDB4MkIsIDB4NTIsCisJMHhDNywgMHg4OSwgMHgxNCwgMHgyOCwgMHhDRCwgMHhDNiwgMHg3RSwgMHhCNiwKKwkweDE4LCAweDRCLCAweDUyLCAweDNELCAweDFELCAweEIyLCAweDQ2LCAweEMzLAorCTB4MkYsIDB4NjMsIDB4MDcsIDB4ODQsIDB4OTAsIDB4RjAsIDB4MEUsIDB4RjgsCisJMHhENiwgMHg0NywgMHhEMSwgMHg0OCwgMHhENCwgMHg3OSwgMHg1NCwgMHg1MSwKKwkweDVFLCAweDIzLCAweDI3LCAweENGLCAweEVGLCAweDk4LCAweEM1LCAweDgyLAorCTB4NjYsIDB4NEIsIDB4NEMsIDB4MEYsIDB4NkMsIDB4QzQsIDB4MTYsIDB4NTkKK307CitzdGF0aWMgY29uc3QgdTggZGhfZ3JvdXAyNF9wcmltZVtdID0geworCTB4ODcsIDB4QTgsIDB4RTYsIDB4MUQsIDB4QjQsIDB4QjYsIDB4NjYsIDB4M0MsCisJMHhGRiwgMHhCQiwgMHhEMSwgMHg5QywgMHg2NSwgMHgxOSwgMHg1OSwgMHg5OSwKKwkweDhDLCAweEVFLCAweEY2LCAweDA4LCAweDY2LCAweDBELCAweEQwLCAweEYyLAorCTB4NUQsIDB4MkMsIDB4RUUsIDB4RDQsIDB4NDMsIDB4NUUsIDB4M0IsIDB4MDAsCisJMHhFMCwgMHgwRCwgMHhGOCwgMHhGMSwgMHhENiwgMHgxOSwgMHg1NywgMHhENCwKKwkweEZBLCAweEY3LCAweERGLCAweDQ1LCAweDYxLCAweEIyLCAweEFBLCAweDMwLAorCTB4MTYsIDB4QzMsIDB4RDksIDB4MTEsIDB4MzQsIDB4MDksIDB4NkYsIDB4QUEsCisJMHgzQiwgMHhGNCwgMHgyOSwgMHg2RCwgMHg4MywgMHgwRSwgMHg5QSwgMHg3QywKKwkweDIwLCAweDlFLCAweDBDLCAweDY0LCAweDk3LCAweDUxLCAweDdBLCAweEJELAorCTB4NUEsIDB4OEEsIDB4OUQsIDB4MzAsIDB4NkIsIDB4Q0YsIDB4NjcsIDB4RUQsCisJMHg5MSwgMHhGOSwgMHhFNiwgMHg3MiwgMHg1QiwgMHg0NywgMHg1OCwgMHhDMCwKKwkweDIyLCAweEUwLCAweEIxLCAweEVGLCAweDQyLCAweDc1LCAweEJGLCAweDdCLAorCTB4NkMsIDB4NUIsIDB4RkMsIDB4MTEsIDB4RDQsIDB4NUYsIDB4OTAsIDB4ODgsCisJMHhCOSwgMHg0MSwgMHhGNSwgMHg0RSwgMHhCMSwgMHhFNSwgMHg5QiwgMHhCOCwKKwkweEJDLCAweDM5LCAweEEwLCAweEJGLCAweDEyLCAweDMwLCAweDdGLCAweDVDLAorCTB4NEYsIDB4REIsIDB4NzAsIDB4QzUsIDB4ODEsIDB4QjIsIDB4M0YsIDB4NzYsCisJMHhCNiwgMHgzQSwgMHhDQSwgMHhFMSwgMHhDQSwgMHhBNiwgMHhCNywgMHg5MCwKKwkweDJELCAweDUyLCAweDUyLCAweDY3LCAweDM1LCAweDQ4LCAweDhBLCAweDBFLAorCTB4RjEsIDB4M0MsIDB4NkQsIDB4OUEsIDB4NTEsIDB4QkYsIDB4QTQsIDB4QUIsCisJMHgzQSwgMHhEOCwgMHgzNCwgMHg3NywgMHg5NiwgMHg1MiwgMHg0RCwgMHg4RSwKKwkweEY2LCAweEExLCAweDY3LCAweEI1LCAweEE0LCAweDE4LCAweDI1LCAweEQ5LAorCTB4NjcsIDB4RTEsIDB4NDQsIDB4RTUsIDB4MTQsIDB4MDUsIDB4NjQsIDB4MjUsCisJMHgxQywgMHhDQSwgMHhDQiwgMHg4MywgMHhFNiwgMHhCNCwgMHg4NiwgMHhGNiwKKwkweEIzLCAweENBLCAweDNGLCAweDc5LCAweDcxLCAweDUwLCAweDYwLCAweDI2LAorCTB4QzAsIDB4QjgsIDB4NTcsIDB4RjYsIDB4ODksIDB4OTYsIDB4MjgsIDB4NTYsCisJMHhERSwgMHhENCwgMHgwMSwgMHgwQSwgMHhCRCwgMHgwQiwgMHhFNiwgMHgyMSwKKwkweEMzLCAweEEzLCAweDk2LCAweDBBLCAweDU0LCAweEU3LCAweDEwLCAweEMzLAorCTB4NzUsIDB4RjIsIDB4NjMsIDB4NzUsIDB4RDcsIDB4MDEsIDB4NDEsIDB4MDMsCisJMHhBNCwgMHhCNSwgMHg0MywgMHgzMCwgMHhDMSwgMHg5OCwgMHhBRiwgMHgxMiwKKwkweDYxLCAweDE2LCAweEQyLCAweDI3LCAweDZFLCAweDExLCAweDcxLCAweDVGLAorCTB4NjksIDB4MzgsIDB4NzcsIDB4RkEsIDB4RDcsIDB4RUYsIDB4MDksIDB4Q0EsCisJMHhEQiwgMHgwOSwgMHg0QSwgMHhFOSwgMHgxRSwgMHgxQSwgMHgxNSwgMHg5NworfTsKK3N0YXRpYyBjb25zdCB1OCBkaF9ncm91cDI0X29yZGVyW10gPSB7CisJMHg4QywgMHhGOCwgMHgzNiwgMHg0MiwgMHhBNywgMHgwOSwgMHhBMCwgMHg5NywKKwkweEI0LCAweDQ3LCAweDk5LCAweDc2LCAweDQwLCAweDEyLCAweDlELCAweEEyLAorCTB4OTksIDB4QjEsIDB4QTQsIDB4N0QsIDB4MUUsIDB4QjMsIDB4NzUsIDB4MEIsCisJMHhBMywgMHgwOCwgMHhCMCwgMHhGRSwgMHg2NCwgMHhGNSwgMHhGQiwgMHhEMworfTsKIAogI2VuZGlmIC8qIEFMTF9ESF9HUk9VUFMgKi8KIAogCi0jZGVmaW5lIERIX0dST1VQKGlkKSBcCisjZGVmaW5lIERIX0dST1VQKGlkLHNhZmUpIFwKIHsgaWQsIGRoX2dyb3VwICMjIGlkICMjIF9nZW5lcmF0b3IsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfZ2VuZXJhdG9yKSwgXAotZGhfZ3JvdXAgIyMgaWQgIyMgX3ByaW1lLCBzaXplb2YoZGhfZ3JvdXAgIyMgaWQgIyMgX3ByaW1lKSB9CitkaF9ncm91cCAjIyBpZCAjIyBfcHJpbWUsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfcHJpbWUpLCBcCitkaF9ncm91cCAjIyBpZCAjIyBfb3JkZXIsIHNpemVvZihkaF9ncm91cCAjIyBpZCAjIyBfb3JkZXIpLCBzYWZlIH0KIAkJCiAKIHN0YXRpYyBzdHJ1Y3QgZGhfZ3JvdXAgZGhfZ3JvdXBzW10gPSB7Ci0JREhfR1JPVVAoNSksCisJREhfR1JPVVAoNSwgMSksCiAjaWZkZWYgQUxMX0RIX0dST1VQUwotCURIX0dST1VQKDEpLAotCURIX0dST1VQKDIpLAotCURIX0dST1VQKDE0KSwKLQlESF9HUk9VUCgxNSksCi0JREhfR1JPVVAoMTYpLAotCURIX0dST1VQKDE3KSwKLQlESF9HUk9VUCgxOCkKKwlESF9HUk9VUCgxLCAxKSwKKwlESF9HUk9VUCgyLCAxKSwKKwlESF9HUk9VUCgxNCwgMSksCisJREhfR1JPVVAoMTUsIDEpLAorCURIX0dST1VQKDE2LCAxKSwKKwlESF9HUk9VUCgxNywgMSksCisJREhfR1JPVVAoMTgsIDEpLAorCURIX0dST1VQKDIyLCAwKSwKKwlESF9HUk9VUCgyMywgMCksCisJREhfR1JPVVAoMjQsIDApCiAjZW5kaWYgLyogQUxMX0RIX0dST1VQUyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kaF9ncm91cHMuaCBiL3NyYy9jcnlwdG8vZGhfZ3JvdXBzLmgKaW5kZXggMjI1ZjAwNi4uZDBlNzRiOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaF9ncm91cHMuaAorKysgYi9zcmMvY3J5cHRvL2RoX2dyb3Vwcy5oCkBAIC0xNSw2ICsxNSw5IEBACiAJc2l6ZV90IGdlbmVyYXRvcl9sZW47CiAJY29uc3QgdTggKnByaW1lOwogCXNpemVfdCBwcmltZV9sZW47CisJY29uc3QgdTggKm9yZGVyOworCXNpemVfdCBvcmRlcl9sZW47CisJdW5zaWduZWQgaW50IHNhZmVfcHJpbWU6MTsKIH07CiAKIGNvbnN0IHN0cnVjdCBkaF9ncm91cCAqIGRoX2dyb3Vwc19nZXQoaW50IGlkKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbWQ1LWludGVybmFsLmMgYi9zcmMvY3J5cHRvL21kNS1pbnRlcm5hbC5jCmluZGV4IDc5MGE2ZjMuLmYwYTJhNWQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbWQ1LWludGVybmFsLmMKKysrIGIvc3JjL2NyeXB0by9tZDUtaW50ZXJuYWwuYwpAQCAtMTc2LDggKzE3Niw4IEBACiAgICAgYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTQpOwogCiAgICAgLyogQXBwZW5kIGxlbmd0aCBpbiBiaXRzIGFuZCB0cmFuc2Zvcm0gKi8KLSAgICAoKHUzMiAqKSBjdHgtPmluKVsxNF0gPSBjdHgtPmJpdHNbMF07Ci0gICAgKCh1MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOworICAgICgodTMyICopIGFsaWFzaW5nX2hpZGVfdHlwZWNhc3QoY3R4LT5pbiwgdTMyKSlbMTRdID0gY3R4LT5iaXRzWzBdOworICAgICgodTMyICopIGFsaWFzaW5nX2hpZGVfdHlwZWNhc3QoY3R4LT5pbiwgdTMyKSlbMTVdID0gY3R4LT5iaXRzWzFdOwogCiAgICAgTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAodTMyICopIGN0eC0+aW4pOwogICAgIGJ5dGVSZXZlcnNlKCh1bnNpZ25lZCBjaGFyICopIGN0eC0+YnVmLCA0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc2hhMjU2LXByZi5jIGIvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKaW5kZXggMGRhNmQxMy4uOWExMTIwOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKKysrIGIvc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogU0hBMjU2LWJhc2VkIFBSRiAoSUVFRSA4MDIuMTFyKQotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgogICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjksMTIgKzI5LDM2IEBACiB2b2lkIHNoYTI1Nl9wcmYoY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IGNoYXIgKmxhYmVsLAogCQljb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqYnVmLCBzaXplX3QgYnVmX2xlbikKIHsKKwlzaGEyNTZfcHJmX2JpdHMoa2V5LCBrZXlfbGVuLCBsYWJlbCwgZGF0YSwgZGF0YV9sZW4sIGJ1ZiwgYnVmX2xlbiAqIDgpOworfQorCisKKy8qKgorICogc2hhMjU2X3ByZl9iaXRzIC0gSUVFRSBTdGQgODAyLjExLTIwMTIsIDExLjYuMS43LjIgS2V5IGRlcml2YXRpb24gZnVuY3Rpb24KKyAqIEBrZXk6IEtleSBmb3IgS0RGCisgKiBAa2V5X2xlbjogTGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBsYWJlbDogQSB1bmlxdWUgbGFiZWwgZm9yIGVhY2ggcHVycG9zZSBvZiB0aGUgUFJGCisgKiBAZGF0YTogRXh0cmEgZGF0YSB0byBiaW5kIGludG8gdGhlIGtleQorICogQGRhdGFfbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBidWY6IEJ1ZmZlciBmb3IgdGhlIGdlbmVyYXRlZCBwc2V1ZG8tcmFuZG9tIGtleQorICogQGJ1Zl9sZW46IE51bWJlciBvZiBiaXRzIG9mIGtleSB0byBnZW5lcmF0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXJpdmUgbmV3LCBjcnlwdG9ncmFwaGljYWxseSBzZXBhcmF0ZSBrZXlzIGZyb20gYQorICogZ2l2ZW4ga2V5LiBJZiB0aGUgcmVxdWVzdGVkIGJ1Zl9sZW4gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhlIGxlYXN0CisgKiBzaWduaWZpY2FudCAxLTcgYml0cyBvZiB0aGUgbGFzdCBvY3RldCBpbiB0aGUgb3V0cHV0IGFyZSBub3QgcGFydCBvZiB0aGUKKyAqIHJlcXVlc3RlZCBvdXRwdXQuCisgKi8KK3ZvaWQgc2hhMjU2X3ByZl9iaXRzKGNvbnN0IHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJICAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqYnVmLAorCQkgICAgIHNpemVfdCBidWZfbGVuX2JpdHMpCit7CiAJdTE2IGNvdW50ZXIgPSAxOwogCXNpemVfdCBwb3MsIHBsZW47CiAJdTggaGFzaFtTSEEyNTZfTUFDX0xFTl07CiAJY29uc3QgdTggKmFkZHJbNF07CiAJc2l6ZV90IGxlbls0XTsKIAl1OCBjb3VudGVyX2xlWzJdLCBsZW5ndGhfbGVbMl07CisJc2l6ZV90IGJ1Zl9sZW4gPSAoYnVmX2xlbl9iaXRzICsgNykgLyA4OwogCiAJYWRkclswXSA9IGNvdW50ZXJfbGU7CiAJbGVuWzBdID0gMjsKQEAgLTQ1LDcgKzY5LDcgQEAKIAlhZGRyWzNdID0gbGVuZ3RoX2xlOwogCWxlblszXSA9IHNpemVvZihsZW5ndGhfbGUpOwogCi0JV1BBX1BVVF9MRTE2KGxlbmd0aF9sZSwgYnVmX2xlbiAqIDgpOworCVdQQV9QVVRfTEUxNihsZW5ndGhfbGUsIGJ1Zl9sZW5fYml0cyk7CiAJcG9zID0gMDsKIAl3aGlsZSAocG9zIDwgYnVmX2xlbikgewogCQlwbGVuID0gYnVmX2xlbiAtIHBvczsKQEAgLTU3LDggKzgxLDE4IEBACiAJCX0gZWxzZSB7CiAJCQlobWFjX3NoYTI1Nl92ZWN0b3Ioa2V5LCBrZXlfbGVuLCA0LCBhZGRyLCBsZW4sIGhhc2gpOwogCQkJb3NfbWVtY3B5KCZidWZbcG9zXSwgaGFzaCwgcGxlbik7CisJCQlwb3MgKz0gcGxlbjsKIAkJCWJyZWFrOwogCQl9CiAJCWNvdW50ZXIrKzsKIAl9CisKKwkvKgorCSAqIE1hc2sgb3V0IHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG9jdGV0IGlmIGl0IGRvZXMgbm90IHVzZSBhbGwgdGhlCisJICogYml0cy4KKwkgKi8KKwlpZiAoYnVmX2xlbl9iaXRzICUgOCkgeworCQl1OCBtYXNrID0gMHhmZiA8PCAoOCAtIGJ1Zl9sZW5fYml0cyAlIDgpOworCQlidWZbcG9zIC0gMV0gJj0gbWFzazsKKwl9CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYTI1Ni5oIGIvc3JjL2NyeXB0by9zaGEyNTYuaAppbmRleCBmY2FjODAwLi43NTk2YTUyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYTI1Ni5oCisrKyBiL3NyYy9jcnlwdG8vc2hhMjU2LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogU0hBMjU2IGhhc2ggaW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZSBmdW5jdGlvbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDExLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTE3LDYgKzE3LDkgQEAKIAkJc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKIHZvaWQgc2hhMjU2X3ByZihjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgY2hhciAqbGFiZWwsCiAJICAgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pOwordm9pZCBzaGEyNTZfcHJmX2JpdHMoY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkgICAgIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICpidWYsCisJCSAgICAgc2l6ZV90IGJ1Zl9sZW5fYml0cyk7CiB2b2lkIHRsc19wcmZfc2hhMjU2KGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLAogCQkgICAgY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IHU4ICpzZWVkLCBzaXplX3Qgc2VlZF9sZW4sCiAJCSAgICB1OCAqb3V0LCBzaXplX3Qgb3V0bGVuKTsKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlci5oIGIvc3JjL2RyaXZlcnMvZHJpdmVyLmgKaW5kZXggZTlmOTI2Zi4uNWU4ZmQ2NSAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyLmgKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAkvKioKIAkgKiBmcmVxIC0gRnJlcXVlbmN5IGluIE1IegogCSAqLwotCXNob3J0IGZyZXE7CisJaW50IGZyZXE7CiAKIAkvKioKIAkgKiBmbGFnIC0gQ2hhbm5lbCBmbGFncyAoSE9TVEFQRF9DSEFOXyopCkBAIC0zMTQsNiArMzE0LDkgQEAKIAkgKi8KIAlpbnQgcDJwOwogCisJY29uc3QgdTggKnNhZV9kYXRhOworCXNpemVfdCBzYWVfZGF0YV9sZW47CisKIH07CiAKIGVudW0gd3BzX21vZGUgewpAQCAtNzU4LDYgKzc2MSw3IEBACiAjZGVmaW5lIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEFfTk9ORQkweDAwMDAwMDEwCiAjZGVmaW5lIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9GVAkJMHgwMDAwMDAyMAogI2RlZmluZSBXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfRlRfUFNLCQkweDAwMDAwMDQwCisjZGVmaW5lIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XQVBJX1BTSwkweDAwMDAwMDgwCiAJdW5zaWduZWQgaW50IGtleV9tZ210OwogCiAjZGVmaW5lIFdQQV9EUklWRVJfQ0FQQV9FTkNfV0VQNDAJMHgwMDAwMDAwMQpAQCAtODM0LDYgKzgzOCwxMCBAQAogI2RlZmluZSBXUEFfRFJJVkVSX0ZMQUdTX0lOQUNUSVZJVFlfVElNRVIJCTB4MDA4MDAwMDAKIC8qIERyaXZlciBleHBlY3RzIHVzZXIgc3BhY2UgaW1wbGVtZW50YXRpb24gb2YgTUxNRSBpbiBBUCBtb2RlICovCiAjZGVmaW5lIFdQQV9EUklWRVJfRkxBR1NfQVBfTUxNRQkJCTB4MDEwMDAwMDAKKy8qIERyaXZlciBzdXBwb3J0cyBTQUUgd2l0aCB1c2VyIHNwYWNlIFNNRSAqLworI2RlZmluZSBXUEFfRFJJVkVSX0ZMQUdTX1NBRQkJCQkweDAyMDAwMDAwCisvKiBEcml2ZXIgbWFrZXMgdXNlIG9mIE9CU1Mgc2NhbiBtZWNoYW5pc20gaW4gd3BhX3N1cHBsaWNhbnQgKi8KKyNkZWZpbmUgV1BBX0RSSVZFUl9GTEFHU19PQlNTX1NDQU4JCQkweDA0MDAwMDAwCiAJdW5zaWduZWQgaW50IGZsYWdzOwogCiAJaW50IG1heF9zY2FuX3NzaWRzOwpAQCAtODkwLDYgKzg5OCw3IEBACiAJc2l6ZV90IHN1cHBfcmF0ZXNfbGVuOwogCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgKmh0X2NhcGFiaWxpdGllczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXBhYmlsaXRpZXMgKnZodF9jYXBhYmlsaXRpZXM7CiAJdTMyIGZsYWdzOyAvKiBiaXRtYXNrIG9mIFdQQV9TVEFfKiBmbGFncyAqLwogCWludCBzZXQ7IC8qIFNldCBTVEEgcGFyYW1ldGVycyBpbnN0ZWFkIG9mIGFkZCAqLwogCXU4IHFvc2luZm87CkBAIC04OTksMTAgKzkwOCwxOSBAQAogCWludCBtb2RlOwogCWludCBmcmVxOwogCWludCBjaGFubmVsOworCS8qIGZvciBIVCAqLwogCWludCBodF9lbmFibGVkOwogCWludCBzZWNfY2hhbm5lbF9vZmZzZXQ7IC8qIDAgPSBIVDQwIGRpc2FibGVkLCAtMSA9IEhUNDAgZW5hYmxlZCwKIAkJCQkgKiBzZWNvbmRhcnkgY2hhbm5lbCBiZWxvdyBwcmltYXJ5LCAxID0gSFQ0MAogCQkJCSAqIGVuYWJsZWQsIHNlY29uZGFyeSBjaGFubmVsIGFib3ZlIHByaW1hcnkgKi8KKworCS8qIGZvciBWSFQgKi8KKwlpbnQgdmh0X2VuYWJsZWQ7CisKKwkvKiB2YWxpZCBmb3IgYm90aCBIVCBhbmQgVkhULCBjZW50ZXJfZnJlcTIgaXMgbm9uLXplcm8KKwkgKiBvbmx5IGZvciBiYW5kd2lkdGggODAgYW5kIGFuIDgwKzgwIGNoYW5uZWwgKi8KKwlpbnQgY2VudGVyX2ZyZXExLCBjZW50ZXJfZnJlcTI7CisJaW50IGJhbmR3aWR0aDsKIH07CiAKIGVudW0gd3BhX2RyaXZlcl9pZl90eXBlIHsKQEAgLTExOTUsMTcgKzEyMTMsNiBAQAogCWludCAoKmRlYXV0aGVudGljYXRlKSh2b2lkICpwcml2LCBjb25zdCB1OCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKTsKIAogCS8qKgotCSAqIGRpc2Fzc29jaWF0ZSAtIFJlcXVlc3QgZHJpdmVyIHRvIGRpc2Fzc29jaWF0ZQotCSAqIEBwcml2OiBwcml2YXRlIGRyaXZlciBpbnRlcmZhY2UgZGF0YQotCSAqIEBhZGRyOiBwZWVyIGFkZHJlc3MgKEJTU0lEIG9mIHRoZSBBUCkKLQkgKiBAcmVhc29uX2NvZGU6IDE2LWJpdCByZWFzb24gY29kZSB0byBiZSBzZW50IGluIHRoZSBkaXNhc3NvY2lhdGlvbgotCSAqCWZyYW1lCi0JICoKLQkgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLQkgKi8KLQlpbnQgKCpkaXNhc3NvY2lhdGUpKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLCBpbnQgcmVhc29uX2NvZGUpOwotCi0JLyoqCiAJICogYXNzb2NpYXRlIC0gUmVxdWVzdCBkcml2ZXIgdG8gYXNzb2NpYXRlCiAJICogQHByaXY6IHByaXZhdGUgZHJpdmVyIGludGVyZmFjZSBkYXRhCiAJICogQHBhcmFtczogYXNzb2NpYXRpb24gcGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvZHJpdmVyX2F0aGVyb3MuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9hdGhlcm9zLmMKaW5kZXggNWYyZTY3NS4uYzJmNTkzNCAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyX2F0aGVyb3MuYworKysgYi9zcmMvZHJpdmVycy9kcml2ZXJfYXRoZXJvcy5jCkBAIC04NzQsNyArODc0LDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfSUVFRTgwMjExVikgJiYgIWRlZmluZWQoQ09ORklHX0lFRUU4MDIxMVIpCisjaWYgZGVmaW5lZChDT05GSUdfV05NKSAmJiAhZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikKIHN0YXRpYyB2b2lkIGF0aGVyb3NfcmF3X3JlY3ZfMTF2KHZvaWQgKmN0eCwgY29uc3QgdTggKnNyY19hZGRyLCBjb25zdCB1OCAqYnVmLAogCQkJCSBzaXplX3QgbGVuKQogewpAQCAtOTIxLDkgKzkyMSw5IEBACiAJCWJyZWFrOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1dQUykgfHwgZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikgfHwgZGVmaW5lZChDT05GSUdfSUVFRTgwMjExVikKKyNpZiBkZWZpbmVkKENPTkZJR19XUFMpIHx8IGRlZmluZWQoQ09ORklHX0lFRUU4MDIxMVIpIHx8IGRlZmluZWQoQ09ORklHX1dOTSkKIHN0YXRpYyB2b2lkIGF0aGVyb3NfcmF3X3JlY2VpdmUodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjX2FkZHIsIGNvbnN0IHU4ICpidWYsCiAJCQkJc2l6ZV90IGxlbikKIHsKQEAgLTkzMyw5ICs5MzMsOSBAQAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiAJYXRoZXJvc19yYXdfcmVjdl8xMXIoY3R4LCBzcmNfYWRkciwgYnVmLCBsZW4pOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCi0jaWYgZGVmaW5lZChDT05GSUdfSUVFRTgwMjExVikgJiYgIWRlZmluZWQoQ09ORklHX0lFRUU4MDIxMVIpCisjaWYgZGVmaW5lZChDT05GSUdfV05NKSAmJiAhZGVmaW5lZChDT05GSUdfSUVFRTgwMjExUikKIAlhdGhlcm9zX3Jhd19yZWN2XzExdihjdHgsIHNyY19hZGRyLCBidWYsIGxlbik7Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAjaWZkZWYgQ09ORklHX0hTMjAKIAlhdGhlcm9zX3Jhd19yZWN2X2hzMjAoY3R4LCBzcmNfYWRkciwgYnVmLCBsZW4pOwogI2VuZGlmIC8qIENPTkZJR19IUzIwICovCkBAIC05NTcsOSArOTU3LDkgQEAKIAkJCSAgICAgICBJRUVFODAyMTFfRklMVEVSX1RZUEVfQVVUSCB8CiAJCQkgICAgICAgSUVFRTgwMjExX0ZJTFRFUl9UWVBFX0FDVElPTik7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorI2lmZGVmIENPTkZJR19XTk0KIAlmaWx0LmFwcF9maWx0ZXJ5cGUgfD0gSUVFRTgwMjExX0ZJTFRFUl9UWVBFX0FDVElPTjsKLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KICNpZmRlZiBDT05GSUdfSFMyMAogCWZpbHQuYXBwX2ZpbHRlcnlwZSB8PSBJRUVFODAyMTFfRklMVEVSX1RZUEVfQUNUSU9OOwogI2VuZGlmIC8qIENPTkZJR19IUzIwICovCkBAIC05NzYsOCArOTc2LDYgQEAKIAlpZiAoZHJ2LT5zb2NrX3JhdyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAjZW5kaWYgLyogQ09ORklHX1dQUyB8fCBDT05GSUdfSUVFRTgwMjExUiAqLwotCWlmIChsMl9wYWNrZXRfZ2V0X293bl9hZGRyKGRydi0+c29ja194bWl0LCBkcnYtPm93bl9hZGRyKSkKLQkJcmV0dXJuIC0xOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE2NTYsNiArMTY1NCw3IEBACiAJCWdvdG8gYmFkOwogCWlmIChsMl9wYWNrZXRfZ2V0X293bl9hZGRyKGRydi0+c29ja194bWl0LCBwYXJhbXMtPm93bl9hZGRyKSkKIAkJZ290byBiYWQ7CisJb3NfbWVtY3B5KGRydi0+b3duX2FkZHIsIHBhcmFtcy0+b3duX2FkZHIsIEVUSF9BTEVOKTsKIAlpZiAocGFyYW1zLT5icmlkZ2VbMF0pIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDb25maWd1cmUgYnJpZGdlICVzIGZvciBFQVBPTCB0cmFmZmljLiIsCiAJCQkgICBwYXJhbXMtPmJyaWRnZVswXSk7CkBAIC0xNjg5LDEzICsxNjg4LDE3IEBACiAJbGludXhfc2V0X2lmYWNlX2ZsYWdzKGRydi0+aW9jdGxfc29jaywgZHJ2LT5pZmFjZSwgMCk7CiAJYXRoZXJvc19zZXRfcHJpdmFjeShkcnYsIDApOyAvKiBkZWZhdWx0IHRvIG5vIHByaXZhY3kgKi8KIAotCWF0aGVyb3NfcmVjZWl2ZV9wa3QoZHJ2KTsKKwlpZiAoYXRoZXJvc19yZWNlaXZlX3BrdChkcnYpKQorCQlnb3RvIGJhZDsKIAogCWlmIChhdGhlcm9zX3dpcmVsZXNzX2V2ZW50X2luaXQoZHJ2KSkKIAkJZ290byBiYWQ7CiAKIAlyZXR1cm4gZHJ2OwogYmFkOgorCWF0aGVyb3NfcmVzZXRfYXBwZmlsdGVyKGRydik7CisJaWYgKGRydi0+c29ja19yYXcpCisJCWwyX3BhY2tldF9kZWluaXQoZHJ2LT5zb2NrX3Jhdyk7CiAJaWYgKGRydi0+c29ja19yZWN2ICE9IE5VTEwgJiYgZHJ2LT5zb2NrX3JlY3YgIT0gZHJ2LT5zb2NrX3htaXQpCiAJCWwyX3BhY2tldF9kZWluaXQoZHJ2LT5zb2NrX3JlY3YpOwogCWlmIChkcnYtPnNvY2tfeG1pdCAhPSBOVUxMKQpAQCAtMTk2MCw3ICsxOTYzLDcgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKKyNpZmRlZiBDT05GSUdfV05NCiBzdGF0aWMgaW50IGF0aHJfd25tX3RmcyhzdHJ1Y3QgYXRoZXJvc19kcml2ZXJfZGF0YSAqZHJ2LCBjb25zdCB1OCogcGVlciwKIAkJCXU4ICppZSwgdTE2ICpsZW4sIGVudW0gd25tX29wZXIgb3BlcikKIHsKQEAgLTIxMTMsNyArMjExNiw3IEBACiAJCXJldHVybiAtMTsKIAl9CiB9Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCiAKIAogY29uc3Qgc3RydWN0IHdwYV9kcml2ZXJfb3BzIHdwYV9kcml2ZXJfYXRoZXJvc19vcHMgPSB7CkBAIC0yMTQ3LDcgKzIxNTAsNyBAQAogCS5hZGRfc3RhX25vZGUgICAgCT0gYXRoZXJvc19hZGRfc3RhX25vZGUsCiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KIAkuc2VuZF9hY3Rpb24JCT0gYXRoZXJvc19zZW5kX2FjdGlvbiwKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorI2lmZGVmIENPTkZJR19XTk0KIAkud25tX29wZXIJCT0gYXRoZXJvc193bm1fb3BlciwKLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIH07CmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfYnNkLmMgYi9zcmMvZHJpdmVycy9kcml2ZXJfYnNkLmMKaW5kZXggYTJiMzRjMS4uOWQ4NjliMSAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyX2JzZC5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9ic2QuYwpAQCAtOTczLDEzICs5NzMsNiBAQAogfQogCiBzdGF0aWMgaW50Ci13cGFfZHJpdmVyX2JzZF9kaXNhc3NvY2lhdGUodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsIGludCByZWFzb25fY29kZSkKLXsKLQlyZXR1cm4gYnNkX3NlbmRfbWxtZV9wYXJhbShwcml2LCBJRUVFODAyMTFfTUxNRV9ESVNBU1NPQywgcmVhc29uX2NvZGUsCi0JCQkJICAgYWRkcik7Ci19Ci0KLXN0YXRpYyBpbnQKIHdwYV9kcml2ZXJfYnNkX3NldF9hdXRoX2FsZyh2b2lkICpwcml2LCBpbnQgYXV0aF9hbGcpCiB7CiAJaW50IGF1dGhtb2RlOwpAQCAtMTU2NCw3ICsxNTU3LDYgQEAKIAkuc2NhbjIJCQk9IHdwYV9kcml2ZXJfYnNkX3NjYW4sCiAJLmdldF9zY2FuX3Jlc3VsdHMyCT0gd3BhX2RyaXZlcl9ic2RfZ2V0X3NjYW5fcmVzdWx0czIsCiAJLmRlYXV0aGVudGljYXRlCQk9IHdwYV9kcml2ZXJfYnNkX2RlYXV0aGVudGljYXRlLAotCS5kaXNhc3NvY2lhdGUJCT0gd3BhX2RyaXZlcl9ic2RfZGlzYXNzb2NpYXRlLAogCS5hc3NvY2lhdGUJCT0gd3BhX2RyaXZlcl9ic2RfYXNzb2NpYXRlLAogCS5nZXRfY2FwYQkJPSB3cGFfZHJpdmVyX2JzZF9nZXRfY2FwYSwKICNlbmRpZiAvKiBIT1NUQVBEICovCmRpZmYgLS1naXQgYS9zcmMvZHJpdmVycy9kcml2ZXJfbmRpcy5jIGIvc3JjL2RyaXZlcnMvZHJpdmVyX25kaXMuYwppbmRleCBiOWUwOTZjLi43YWYzMzE3IDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9kcml2ZXJfbmRpcy5jCisrKyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9uZGlzLmMKQEAgLTcyNSwxNCArNzI1LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHdwYV9kcml2ZXJfbmRpc19kaXNhc3NvY2lhdGUodm9pZCAqcHJpdiwgY29uc3QgdTggKmFkZHIsCi0JCQkJCWludCByZWFzb25fY29kZSkKLXsKLQlzdHJ1Y3Qgd3BhX2RyaXZlcl9uZGlzX2RhdGEgKmRydiA9IHByaXY7Ci0JcmV0dXJuIHdwYV9kcml2ZXJfbmRpc19kaXNjb25uZWN0KGRydik7Ci19Ci0KLQogc3RhdGljIHZvaWQgd3BhX2RyaXZlcl9uZGlzX3NjYW5fdGltZW91dCh2b2lkICplbG9vcF9jdHgsIHZvaWQgKnRpbWVvdXRfY3R4KQogewogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU2NhbiB0aW1lb3V0IC0gdHJ5IHRvIGdldCByZXN1bHRzIik7CkBAIC0zMjIzLDcgKzMyMTUsNiBAQAogCXdwYV9kcml2ZXJfbmRpc19vcHMuaW5pdCA9IHdwYV9kcml2ZXJfbmRpc19pbml0OwogCXdwYV9kcml2ZXJfbmRpc19vcHMuZGVpbml0ID0gd3BhX2RyaXZlcl9uZGlzX2RlaW5pdDsKIAl3cGFfZHJpdmVyX25kaXNfb3BzLmRlYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl9uZGlzX2RlYXV0aGVudGljYXRlOwotCXdwYV9kcml2ZXJfbmRpc19vcHMuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9uZGlzX2Rpc2Fzc29jaWF0ZTsKIAl3cGFfZHJpdmVyX25kaXNfb3BzLmFzc29jaWF0ZSA9IHdwYV9kcml2ZXJfbmRpc19hc3NvY2lhdGU7CiAJd3BhX2RyaXZlcl9uZGlzX29wcy5hZGRfcG1raWQgPSB3cGFfZHJpdmVyX25kaXNfYWRkX3Bta2lkOwogCXdwYV9kcml2ZXJfbmRpc19vcHMucmVtb3ZlX3Bta2lkID0gd3BhX2RyaXZlcl9uZGlzX3JlbW92ZV9wbWtpZDsKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl9ubDgwMjExLmMgYi9zcmMvZHJpdmVycy9kcml2ZXJfbmw4MDIxMS5jCmluZGV4IDQ1NzQ5MzguLmU1MzA5MTEgMTAwNjQ0Ci0tLSBhL3NyYy9kcml2ZXJzL2RyaXZlcl9ubDgwMjExLmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyX25sODAyMTEuYwpAQCAtMTk1LDYgKzE5NSw3IEBACiAKIAlpbnQgZnJlcTsKIAorCXZvaWQgKmN0eDsKIAlzdHJ1Y3QgbmxfaGFuZGxlICpubF9wcmVxLCAqbmxfbWdtdDsKIAlzdHJ1Y3QgbmxfY2IgKm5sX2NiOwogCkBAIC0yNDQsNiArMjQ1LDcgQEAKIAl1bnNpZ25lZCBpbnQgc2Nhbl9mb3JfYXV0aDoxOwogCXVuc2lnbmVkIGludCByZXRyeV9hdXRoOjE7CiAJdW5zaWduZWQgaW50IHVzZV9tb25pdG9yOjE7CisJdW5zaWduZWQgaW50IGlnbm9yZV9uZXh0X2xvY2FsX2Rpc2Nvbm5lY3Q6MTsKIAogCXU2NCByZW1haW5fb25fY2hhbl9jb29raWU7CiAJdTY0IHNlbmRfYWN0aW9uX2Nvb2tpZTsKQEAgLTEwMzgsNiArMTA0MCw3IEBACiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OwogCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBBdXRoZW50aWNhdGUgZXZlbnQiKTsKIAltZ210ID0gKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBmcmFtZTsKIAlpZiAobGVuIDwgMjQgKyBzaXplb2YobWdtdC0+dS5hdXRoKSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFRvbyBzaG9ydCBhc3NvY2lhdGlvbiBldmVudCAiCkBAIC0xMDQ5LDYgKzEwNTIsOCBAQAogCW9zX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwogCW9zX21lbWNweShldmVudC5hdXRoLnBlZXIsIG1nbXQtPnNhLCBFVEhfQUxFTik7CiAJZXZlbnQuYXV0aC5hdXRoX3R5cGUgPSBsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKKwlldmVudC5hdXRoLmF1dGhfdHJhbnNhY3Rpb24gPQorCQlsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24pOwogCWV2ZW50LmF1dGguc3RhdHVzX2NvZGUgPSBsZV90b19ob3N0MTYobWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlKTsKIAlpZiAobGVuID4gMjQgKyBzaXplb2YobWdtdC0+dS5hdXRoKSkgewogCQlldmVudC5hdXRoLmllcyA9IG1nbXQtPnUuYXV0aC52YXJpYWJsZTsKQEAgLTEwOTcsNiArMTEwMiw3IEBACiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZXZlbnQ7CiAJdTE2IHN0YXR1czsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogQXNzb2NpYXRlIGV2ZW50Iik7CiAJbWdtdCA9IChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgZnJhbWU7CiAJaWYgKGxlbiA8IDI0ICsgc2l6ZW9mKG1nbXQtPnUuYXNzb2NfcmVzcCkpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBUb28gc2hvcnQgYXNzb2NpYXRpb24gZXZlbnQgIgpAQCAtMTE1Myw2ICsxMTU5LDExIEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoY21kID09IE5MODAyMTFfQ01EX0NPTk5FQ1QpCisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogQ29ubmVjdCBldmVudCIpOworCWVsc2UgaWYgKGNtZCA9PSBOTDgwMjExX0NNRF9ST0FNKQorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFJvYW0gZXZlbnQiKTsKKwogCW9zX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwogCWlmIChjbWQgPT0gTkw4MDIxMV9DTURfQ09OTkVDVCAmJgogCSAgICBubGFfZ2V0X3UxNihzdGF0dXMpICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKQEAgLTExOTEsNiArMTIwMiw3IEBACiAJCQkJICBzdHJ1Y3QgbmxhdHRyICpieV9hcCkKIHsKIAl1bmlvbiB3cGFfZXZlbnRfZGF0YSBkYXRhOworCXVuc2lnbmVkIGludCBsb2NhbGx5X2dlbmVyYXRlZCA9IGJ5X2FwID09IE5VTEw7CiAKIAlpZiAoZHJ2LT5jYXBhLmZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TTUUpIHsKIAkJLyoKQEAgLTEyMDIsNiArMTIxNCwxOSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKGRydi0+aWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdCkgeworCQlkcnYtPmlnbm9yZV9uZXh0X2xvY2FsX2Rpc2Nvbm5lY3QgPSAwOworCQlpZiAobG9jYWxseV9nZW5lcmF0ZWQpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogSWdub3JlIGRpc2Nvbm5lY3QgIgorCQkJCSAgICJldmVudCB0cmlnZ2VyZWQgZHVyaW5nIHJlYXNzb2NpYXRpb24iKTsKKwkJCXJldHVybjsKKwkJfQorCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAibmw4MDIxMTogV2FzIGV4cGVjdGluZyBsb2NhbCAiCisJCQkgICAiZGlzY29ubmVjdCBidXQgZ290IGFub3RoZXIgZGlzY29ubmVjdCAiCisJCQkgICAiZXZlbnQgZmlyc3QiKTsKKwl9CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IERpc2Nvbm5lY3QgZXZlbnQiKTsKIAlkcnYtPmFzc29jaWF0ZWQgPSAwOwogCW9zX21lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKIAlpZiAocmVhc29uKQpAQCAtMTI3OSw2ICsxMzA0LDcgQEAKIAl1MTYgZmMsIHN0eXBlOwogCWludCBzc2lfc2lnbmFsID0gMDsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogRnJhbWUgZXZlbnQiKTsKIAltZ210ID0gKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBmcmFtZTsKIAlpZiAobGVuIDwgMjQpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBUb28gc2hvcnQgYWN0aW9uIGZyYW1lIik7CkBAIC0xMzIxLDYgKzEzNDcsNyBAQAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTE2IGZjOwogCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBGcmFtZSBUWCBzdGF0dXMgZXZlbnQiKTsKIAlpZiAoIWlzX2FwX2ludGVyZmFjZShkcnYtPm5sbW9kZSkpIHsKIAkJdTY0IGNvb2tpZV92YWw7CiAKQEAgLTEzNjAsNiArMTM4NywxMSBAQAogCWNvbnN0IHU4ICpic3NpZCA9IE5VTEw7CiAJdTE2IHJlYXNvbl9jb2RlID0gMDsKIAorCWlmICh0eXBlID09IEVWRU5UX0RFQVVUSCkKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBEZWF1dGhlbnRpY2F0ZSBldmVudCIpOworCWVsc2UKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBEaXNhc3NvY2lhdGUgZXZlbnQiKTsKKwogCW1nbXQgPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICopIGZyYW1lOwogCWlmIChsZW4gPj0gMjQpIHsKIAkJYnNzaWQgPSBtZ210LT5ic3NpZDsKQEAgLTE0MjAsNiArMTQ1MiwxMSBAQAogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OwogCXUxNiByZWFzb25fY29kZSA9IDA7CiAKKwlpZiAodHlwZSA9PSBFVkVOVF9VTlBST1RfREVBVVRIKQorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFVucHJvdCBEZWF1dGhlbnRpY2F0ZSBldmVudCIpOworCWVsc2UKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBVbnByb3QgRGlzYXNzb2NpYXRlIGV2ZW50Iik7CisKIAlpZiAobGVuIDwgMjQpCiAJCXJldHVybjsKIApAQCAtMTUwMiw3ICsxNTM5LDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBtbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCitzdGF0aWMgdm9pZCBtbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IGk4MDJfYnNzICpic3MsCiAJCQkJCSAgIHN0cnVjdCBubGF0dHIgKnRiW10pCiB7CiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKQEAgLTE1MzQsNyArMTU3MSw3IEBACiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogS2V5IElkICVkIiwga2V5X2lkKTsKIAl9CiAKLQl3cGFfc3VwcGxpY2FudF9ldmVudChkcnYtPmN0eCwgRVZFTlRfTUlDSEFFTF9NSUNfRkFJTFVSRSwgJmRhdGEpOworCXdwYV9zdXBwbGljYW50X2V2ZW50KGJzcy0+Y3R4LCBFVkVOVF9NSUNIQUVMX01JQ19GQUlMVVJFLCAmZGF0YSk7CiB9CiAKIApAQCAtMjA0Niw2ICsyMDgzLDggQEAKIAl9OwogCXVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CiAKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFBNS1NBIGNhbmRpZGF0ZSBldmVudCIpOworCiAJaWYgKCF0YltOTDgwMjExX0FUVFJfUE1LU0FfQ0FORElEQVRFXSkKIAkJcmV0dXJuOwogCWlmIChubGFfcGFyc2VfbmVzdGVkKGNhbmQsIE1BWF9OTDgwMjExX1BNS1NBX0NBTkRJREFURSwKQEAgLTIwNzEsNiArMjExMCw4IEBACiB7CiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZGF0YTsKIAorCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogUHJvYmUgY2xpZW50IGV2ZW50Iik7CisKIAlpZiAoIXRiW05MODAyMTFfQVRUUl9NQUNdIHx8ICF0YltOTDgwMjExX0FUVFJfQUNLXSkKIAkJcmV0dXJuOwogCkBAIC0yMDgyLDYgKzIxMjMsNDMgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBubDgwMjExX3RkbHNfb3Blcl9ldmVudChzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiwKKwkJCQkgICAgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXVuaW9uIHdwYV9ldmVudF9kYXRhIGRhdGE7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFRETFMgb3BlcmF0aW9uIGV2ZW50Iik7CisKKwlpZiAoIXRiW05MODAyMTFfQVRUUl9NQUNdIHx8ICF0YltOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT05dKQorCQlyZXR1cm47CisKKwlvc19tZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJb3NfbWVtY3B5KGRhdGEudGRscy5wZWVyLCBubGFfZGF0YSh0YltOTDgwMjExX0FUVFJfTUFDXSksIEVUSF9BTEVOKTsKKwlzd2l0Y2ggKG5sYV9nZXRfdTgodGJbTkw4MDIxMV9BVFRSX1RETFNfT1BFUkFUSU9OXSkpIHsKKwljYXNlIE5MODAyMTFfVERMU19TRVRVUDoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBURExTIHNldHVwIHJlcXVlc3QgZm9yIHBlZXIgIgorCQkJICAgTUFDU1RSLCBNQUMyU1RSKGRhdGEudGRscy5wZWVyKSk7CisJCWRhdGEudGRscy5vcGVyID0gVERMU19SRVFVRVNUX1NFVFVQOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfVERMU19URUFSRE9XTjoKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBURExTIHRlYXJkb3duIHJlcXVlc3QgZm9yIHBlZXIgIgorCQkJICAgTUFDU1RSLCBNQUMyU1RSKGRhdGEudGRscy5wZWVyKSk7CisJCWRhdGEudGRscy5vcGVyID0gVERMU19SRVFVRVNUX1RFQVJET1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFVuc3VwcG9ydGVkIFRETFMgb3BlcmF0aW9uZSAiCisJCQkgICAiZXZlbnQiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGJbTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFXSkgeworCQlkYXRhLnRkbHMucmVhc29uX2NvZGUgPQorCQkJbmxhX2dldF91MTYodGJbTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFXSk7CisJfQorCisJd3BhX3N1cHBsaWNhbnRfZXZlbnQoZHJ2LT5jdHgsIEVWRU5UX1RETFMsICZkYXRhKTsKK30KKworCiBzdGF0aWMgdm9pZCBubDgwMjExX3NwdXJpb3VzX2ZyYW1lKHN0cnVjdCBpODAyX2JzcyAqYnNzLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCiAJCQkJICAgaW50IHdkcykKIHsKQEAgLTIxMDAsOSArMjE3OCwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGRvX3Byb2Nlc3NfZHJ2X2V2ZW50KHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAotCQkJCSBpbnQgY21kLCBzdHJ1Y3QgbmxhdHRyICoqdGIpCitzdGF0aWMgdm9pZCBkb19wcm9jZXNzX2Rydl9ldmVudChzdHJ1Y3QgaTgwMl9ic3MgKmJzcywgaW50IGNtZCwKKwkJCQkgc3RydWN0IG5sYXR0ciAqKnRiKQogeworCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2ID0gYnNzLT5kcnY7CisKIAlpZiAoZHJ2LT5hcF9zY2FuX2FzX3N0YXRpb24gIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQgJiYKIAkgICAgKGNtZCA9PSBOTDgwMjExX0NNRF9ORVdfU0NBTl9SRVNVTFRTIHx8CiAJICAgICBjbWQgPT0gTkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEKSkgewpAQCAtMjE3NSw3ICsyMjU1LDcgQEAKIAkJCQkgICAgICB0YltOTDgwMjExX0FUVFJfRElTQ09OTkVDVEVEX0JZX0FQXSk7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9DTURfTUlDSEFFTF9NSUNfRkFJTFVSRToKLQkJbWxtZV9ldmVudF9taWNoYWVsX21pY19mYWlsdXJlKGRydiwgdGIpOworCQltbG1lX2V2ZW50X21pY2hhZWxfbWljX2ZhaWx1cmUoYnNzLCB0Yik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9DTURfSk9JTl9JQlNTOgogCQltbG1lX2V2ZW50X2pvaW5faWJzcyhkcnYsIHRiKTsKQEAgLTIyMTQsNiArMjI5NCw5IEBACiAJY2FzZSBOTDgwMjExX0NNRF9QUk9CRV9DTElFTlQ6CiAJCW5sODAyMTFfY2xpZW50X3Byb2JlX2V2ZW50KGRydiwgdGIpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ01EX1RETFNfT1BFUjoKKwkJbmw4MDIxMV90ZGxzX29wZXJfZXZlbnQoZHJ2LCB0Yik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogSWdub3JlZCB1bmtub3duIGV2ZW50ICIKIAkJCSAgICIoY21kPSVkKSIsIGNtZCk7CkBAIC0yMjI3LDIxICsyMzEwLDI1IEBACiAJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYgPSBhcmc7CiAJc3RydWN0IGdlbmxtc2doZHIgKmdubGggPSBubG1zZ19kYXRhKG5sbXNnX2hkcihtc2cpKTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX0FUVFJfTUFYICsgMV07CisJc3RydWN0IGk4MDJfYnNzICpic3M7CisJaW50IGlmaWR4ID0gLTE7CiAKIAlubGFfcGFyc2UodGIsIE5MODAyMTFfQVRUUl9NQVgsIGdlbmxtc2dfYXR0cmRhdGEoZ25saCwgMCksCiAJCSAgZ2VubG1zZ19hdHRybGVuKGdubGgsIDApLCBOVUxMKTsKIAotCWlmICh0YltOTDgwMjExX0FUVFJfSUZJTkRFWF0pIHsKLQkJaW50IGlmaW5kZXggPSBubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfSUZJTkRFWF0pOwotCQlpZiAoaWZpbmRleCAhPSBkcnYtPmlmaW5kZXggJiYgIWhhdmVfaWZpZHgoZHJ2LCBpZmluZGV4KSkgewotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBJZ25vcmVkIGV2ZW50IChjbWQ9JWQpIgotCQkJCSAgICIgZm9yIGZvcmVpZ24gaW50ZXJmYWNlIChpZmluZGV4ICVkKSIsCi0JCQkJICAgZ25saC0+Y21kLCBpZmluZGV4KTsKKwlpZiAodGJbTkw4MDIxMV9BVFRSX0lGSU5ERVhdKQorCQlpZmlkeCA9IG5sYV9nZXRfdTMyKHRiW05MODAyMTFfQVRUUl9JRklOREVYXSk7CisKKwlmb3IgKGJzcyA9ICZkcnYtPmZpcnN0X2JzczsgYnNzOyBic3MgPSBic3MtPm5leHQpIHsKKwkJaWYgKGlmaWR4ID09IC0xIHx8IGlmaWR4ID09IGJzcy0+aWZpbmRleCkgeworCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoYnNzLCBnbmxoLT5jbWQsIHRiKTsKIAkJCXJldHVybiBOTF9TS0lQOwogCQl9CiAJfQogCi0JZG9fcHJvY2Vzc19kcnZfZXZlbnQoZHJ2LCBnbmxoLT5jbWQsIHRiKTsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IElnbm9yZWQgZXZlbnQgKGNtZD0lZCkgZm9yIGZvcmVpZ24gIgorCQkgICAiaW50ZXJmYWNlIChpZmluZGV4ICVkKSIsIGdubGgtPmNtZCwgaWZpZHgpOworCiAJcmV0dXJuIE5MX1NLSVA7CiB9CiAKQEAgLTIyNTMsNiArMjM0MCw3IEBACiAJc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9BVFRSX01BWCArIDFdOwogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LCAqdG1wOwogCWludCBpZmlkeCA9IC0xOworCXN0cnVjdCBpODAyX2JzcyAqYnNzOwogCiAJbmxhX3BhcnNlKHRiLCBOTDgwMjExX0FUVFJfTUFYLCBnZW5sbXNnX2F0dHJkYXRhKGdubGgsIDApLAogCQkgIGdlbmxtc2dfYXR0cmxlbihnbmxoLCAwKSwgTlVMTCk7CkBAIC0yMjYyLDkgKzIzNTAsMTIgQEAKIAogCWRsX2xpc3RfZm9yX2VhY2hfc2FmZShkcnYsIHRtcCwgJmdsb2JhbC0+aW50ZXJmYWNlcywKIAkJCSAgICAgIHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSwgbGlzdCkgewotCQlpZiAoaWZpZHggPT0gLTEgfHwgaWZpZHggPT0gZHJ2LT5pZmluZGV4IHx8Ci0JCSAgICBoYXZlX2lmaWR4KGRydiwgaWZpZHgpKQotCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoZHJ2LCBnbmxoLT5jbWQsIHRiKTsKKwkJZm9yIChic3MgPSAmZHJ2LT5maXJzdF9ic3M7IGJzczsgYnNzID0gYnNzLT5uZXh0KSB7CisJCQlpZiAoaWZpZHggPT0gLTEgfHwgaWZpZHggPT0gYnNzLT5pZmluZGV4KSB7CisJCQkJZG9fcHJvY2Vzc19kcnZfZXZlbnQoYnNzLCBnbmxoLT5jbWQsIHRiKTsKKwkJCQlyZXR1cm4gTkxfU0tJUDsKKwkJCX0KKwkJfQogCX0KIAogCXJldHVybiBOTF9TS0lQOwpAQCAtMjU4Nyw2ICsyNjc4LDEyIEBACiAKIAkJaWYgKGZsYWdzICYgTkw4MDIxMV9GRUFUVVJFX0lOQUNUSVZJVFlfVElNRVIpCiAJCQljYXBhLT5mbGFncyB8PSBXUEFfRFJJVkVSX0ZMQUdTX0lOQUNUSVZJVFlfVElNRVI7CisKKwkJaWYgKGZsYWdzICYgTkw4MDIxMV9GRUFUVVJFX1NBRSkKKwkJCWNhcGEtPmZsYWdzIHw9IFdQQV9EUklWRVJfRkxBR1NfU0FFOworCisJCWlmIChmbGFncyAmIE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTikKKwkJCWNhcGEtPmZsYWdzIHw9IFdQQV9EUklWRVJfRkxBR1NfT0JTU19TQ0FOOwogCX0KIAogCWlmICh0YltOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF9PRkZMT0FEXSkgewpAQCAtMzAwMSw2ICszMDk4LDggQEAKIAlkcnYtPmN0eCA9IGN0eDsKIAlic3MgPSAmZHJ2LT5maXJzdF9ic3M7CiAJYnNzLT5kcnYgPSBkcnY7CisJYnNzLT5jdHggPSBjdHg7CisKIAlvc19zdHJsY3B5KGJzcy0+aWZuYW1lLCBpZm5hbWUsIHNpemVvZihic3MtPmlmbmFtZSkpOwogCWRydi0+bW9uaXRvcl9pZmlkeCA9IC0xOwogCWRydi0+bW9uaXRvcl9zb2NrID0gLTE7CkBAIC0zMTk4LDYgKzMyOTcsOSBAQAogCS8qIFdOTSAtIEJTUyBUcmFuc2l0aW9uIE1hbmFnZW1lbnQgUmVxdWVzdCAqLwogCWlmIChubDgwMjExX3JlZ2lzdGVyX2FjdGlvbl9mcmFtZShic3MsICh1OCAqKSAiXHgwYVx4MDciLCAyKSA8IDApCiAJCXJldHVybiAtMTsKKwkvKiBXTk0tU2xlZXAgTW9kZSBSZXNwb25zZSAqLworCWlmIChubDgwMjExX3JlZ2lzdGVyX2FjdGlvbl9mcmFtZShic3MsICh1OCAqKSAiXHgwYVx4MTEiLCAyKSA8IDApCisJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwogfQpAQCAtNDIyNyw2ICs0MzI5LDE0IEBACiAJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSLAogCQkJCSAgICBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQyk7CiAJCQlicmVhazsKKwkJY2FzZSBXUEFfQUxHX1NNUzQ6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSLAorCQkJCSAgICBXTEFOX0NJUEhFUl9TVUlURV9TTVM0KTsKKwkJCWJyZWFrOworCQljYXNlIFdQQV9BTEdfS1JLOgorCQkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfS0VZX0NJUEhFUiwKKwkJCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfS1JLKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICIlczogVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiAiCiAJCQkJICAgImFsZ29yaXRobSAlZCIsIF9fZnVuY19fLCBhbGcpOwpAQCAtNDQ2NCw3ICs0NTc0LDggQEAKIAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGRydi0+aWZpbmRleCk7CiAJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX0FUVFJfUkVBU09OX0NPREUsIHJlYXNvbl9jb2RlKTsKLQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOworCWlmIChhZGRyKQorCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOwogCWlmIChsb2NhbF9zdGF0ZV9jaGFuZ2UpCiAJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfQVRUUl9MT0NBTF9TVEFURV9DSEFOR0UpOwogCkBAIC00NDg1LDEyICs0NTk2LDEzIEBACiAKIAogc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfZGlzY29ubmVjdChzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiwKLQkJCQkJIGNvbnN0IHU4ICphZGRyLCBpbnQgcmVhc29uX2NvZGUpCisJCQkJCSBpbnQgcmVhc29uX2NvZGUpCiB7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyhhZGRyPSIgTUFDU1RSICIgcmVhc29uX2NvZGU9JWQpIiwKLQkJICAgX19mdW5jX18sIE1BQzJTVFIoYWRkciksIHJlYXNvbl9jb2RlKTsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzKHJlYXNvbl9jb2RlPSVkKSIsIF9fZnVuY19fLCByZWFzb25fY29kZSk7CiAJZHJ2LT5hc3NvY2lhdGVkID0gMDsKLQlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX21sbWUoZHJ2LCBhZGRyLCBOTDgwMjExX0NNRF9ESVNDT05ORUNULAorCWRydi0+aWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdCA9IDA7CisJLyogRGlzY29ubmVjdCBjb21tYW5kIGRvZXNuJ3QgbmVlZCBCU1NJRCAtIGl0IHVzZXMgY2FjaGVkIHZhbHVlICovCisJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9tbG1lKGRydiwgTlVMTCwgTkw4MDIxMV9DTURfRElTQ09OTkVDVCwKIAkJCQkgICAgICAgcmVhc29uX2NvZGUsIDApOwogfQogCkBAIC00NTAxLDcgKzQ2MTMsNyBAQAogCXN0cnVjdCBpODAyX2JzcyAqYnNzID0gcHJpdjsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCWlmICghKGRydi0+Y2FwYS5mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU01FKSkKLQkJcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KGRydiwgYWRkciwgcmVhc29uX2NvZGUpOworCQlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX2Rpc2Nvbm5lY3QoZHJ2LCByZWFzb25fY29kZSk7CiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyhhZGRyPSIgTUFDU1RSICIgcmVhc29uX2NvZGU9JWQpIiwKIAkJICAgX19mdW5jX18sIE1BQzJTVFIoYWRkciksIHJlYXNvbl9jb2RlKTsKIAlkcnYtPmFzc29jaWF0ZWQgPSAwOwpAQCAtNDUxMiwyMCArNDYyNCw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfZGlzYXNzb2NpYXRlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLAotCQkJCQkgICBpbnQgcmVhc29uX2NvZGUpCi17Ci0Jc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OwotCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2ID0gYnNzLT5kcnY7Ci0JaWYgKCEoZHJ2LT5jYXBhLmZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TTUUpKQotCQlyZXR1cm4gd3BhX2RyaXZlcl9ubDgwMjExX2Rpc2Nvbm5lY3QoZHJ2LCBhZGRyLCByZWFzb25fY29kZSk7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyIsIF9fZnVuY19fKTsKLQlkcnYtPmFzc29jaWF0ZWQgPSAwOwotCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfbWxtZShkcnYsIGFkZHIsIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURSwKLQkJCQkgICAgICAgcmVhc29uX2NvZGUsIDApOwotfQotCi0KIHN0YXRpYyB2b2lkIG5sODAyMTFfY29weV9hdXRoX3BhcmFtcyhzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiwKIAkJCQkgICAgIHN0cnVjdCB3cGFfZHJpdmVyX2F1dGhfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC00NjQyLDYgKzQ3NDAsMTIgQEAKIAl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICIgICogSUVzIiwgcGFyYW1zLT5pZSwgcGFyYW1zLT5pZV9sZW4pOwogCWlmIChwYXJhbXMtPmllKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0lFLCBwYXJhbXMtPmllX2xlbiwgcGFyYW1zLT5pZSk7CisJaWYgKHBhcmFtcy0+c2FlX2RhdGEpIHsKKwkJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiICAqIFNBRSBkYXRhIiwgcGFyYW1zLT5zYWVfZGF0YSwKKwkJCSAgICBwYXJhbXMtPnNhZV9kYXRhX2xlbik7CisJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfU0FFX0RBVEEsIHBhcmFtcy0+c2FlX2RhdGFfbGVuLAorCQkJcGFyYW1zLT5zYWVfZGF0YSk7CisJfQogCWlmIChwYXJhbXMtPmF1dGhfYWxnICYgV1BBX0FVVEhfQUxHX09QRU4pCiAJCXR5cGUgPSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOwogCWVsc2UgaWYgKHBhcmFtcy0+YXV0aF9hbGcgJiBXUEFfQVVUSF9BTEdfU0hBUkVEKQpAQCAtNDY1MCw2ICs0NzU0LDggQEAKIAkJdHlwZSA9IE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA7CiAJZWxzZSBpZiAocGFyYW1zLT5hdXRoX2FsZyAmIFdQQV9BVVRIX0FMR19GVCkKIAkJdHlwZSA9IE5MODAyMTFfQVVUSFRZUEVfRlQ7CisJZWxzZSBpZiAocGFyYW1zLT5hdXRoX2FsZyAmIFdQQV9BVVRIX0FMR19TQUUpCisJCXR5cGUgPSBOTDgwMjExX0FVVEhUWVBFX1NBRTsKIAllbHNlCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiICAqIEF1dGggVHlwZSAlZCIsIHR5cGUpOwpAQCAtNDg5OSwxOSArNTAwNSwzNSBAQAogCQkJCS8qIGNydWRlIGhldXJpc3RpYyAqLwogCQkJCWlmIChtb2RlLT5jaGFubmVsc1tpZHhdLmZyZXEgPCA0MDAwKQogCQkJCQltb2RlLT5tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUI7CisJCQkJZWxzZSBpZiAobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxID4gNTAwMDApCisJCQkJCW1vZGUtPm1vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ7CiAJCQkJZWxzZQogCQkJCQltb2RlLT5tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUE7CiAJCQkJbW9kZV9pc19zZXQgPSAxOwogCQkJfQogCi0JCQkvKiBjcnVkZSBoZXVyaXN0aWMgKi8KLQkJCWlmIChtb2RlLT5jaGFubmVsc1tpZHhdLmZyZXEgPCA0MDAwKQorCQkJc3dpdGNoIChtb2RlLT5tb2RlKSB7CisJCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBRDoKKwkJCQltb2RlLT5jaGFubmVsc1tpZHhdLmNoYW4gPQorCQkJCQkobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxIC0gNTYxNjApIC8KKwkJCQkJMjE2MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUE6CisJCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5jaGFuID0KKwkJCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxIC8gNSAtIDEwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFCOgorCQkJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExRzoKIAkJCQlpZiAobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxID09IDI0ODQpCiAJCQkJCW1vZGUtPmNoYW5uZWxzW2lkeF0uY2hhbiA9IDE0OwogCQkJCWVsc2UKLQkJCQkJbW9kZS0+Y2hhbm5lbHNbaWR4XS5jaGFuID0gKG1vZGUtPmNoYW5uZWxzW2lkeF0uZnJlcSAtIDI0MDcpIC8gNTsKLQkJCWVsc2UKLQkJCQltb2RlLT5jaGFubmVsc1tpZHhdLmNoYW4gPSBtb2RlLT5jaGFubmVsc1tpZHhdLmZyZXEvNSAtIDEwMDA7CisJCQkJCW1vZGUtPmNoYW5uZWxzW2lkeF0uY2hhbiA9CisJCQkJCQkobW9kZS0+Y2hhbm5lbHNbaWR4XS5mcmVxIC0KKwkJCQkJCSAyNDA3KSAvIDU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQogCiAJCQlpZiAodGJfZnJlcVtOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RJU0FCTEVEXSkKIAkJCQltb2RlLT5jaGFubmVsc1tpZHhdLmZsYWcgfD0KQEAgLTUyNjcsNyArNTM4OSw3IEBACiAKIAlpZiAobm9hY2spCiAJCXR4ZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfTk9BQ0s7Ci0JKihsZTE2ICopICZydGFwX2hkclsxMl0gPSBob3N0X3RvX2xlMTYodHhmbGFncyk7CisJV1BBX1BVVF9MRTE2KCZydGFwX2hkclsxMl0sIHR4ZmxhZ3MpOwogCiAJcmVzID0gc2VuZG1zZyhkcnYtPm1vbml0b3Jfc29jaywgJm1zZywgMCk7CiAJaWYgKHJlcyA8IDApIHsKQEAgLTU1NzUsMTYgKzU2OTcsMTYgQEAKIAogCiBzdGF0aWMgaW50IHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfZnJlcShzdHJ1Y3QgaTgwMl9ic3MgKmJzcywKLQkJCQkgICAgICAgaW50IGZyZXEsIGludCBodF9lbmFibGVkLAotCQkJCSAgICAgICBpbnQgc2VjX2NoYW5uZWxfb2Zmc2V0KQorCQkJCSAgICAgICBzdHJ1Y3QgaG9zdGFwZF9mcmVxX3BhcmFtcyAqZnJlcSkKIHsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9ubDgwMjExX2RhdGEgKmRydiA9IGJzcy0+ZHJ2OwogCXN0cnVjdCBubF9tc2cgKm1zZzsKIAlpbnQgcmV0OwogCi0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBTZXQgZnJlcSAlZCAoaHRfZW5hYmxlZD0lZCAiCi0JCSAgICJzZWNfY2hhbm5lbF9vZmZzZXQ9JWQpIiwKLQkJICAgZnJlcSwgaHRfZW5hYmxlZCwgc2VjX2NoYW5uZWxfb2Zmc2V0KTsKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IFNldCBmcmVxICVkIChodF9lbmFibGVkPSVkLCB2aHRfZW5hYmxlZD0lZCwiCisJCSAgICIgYmFuZHdpZHRoPSVkIE1IeiwgY2YxPSVkIE1IeiwgY2YyPSVkIE1IeikiLAorCQkgICBmcmVxLT5mcmVxLCBmcmVxLT5odF9lbmFibGVkLCBmcmVxLT52aHRfZW5hYmxlZCwKKwkJICAgZnJlcS0+YmFuZHdpZHRoLCBmcmVxLT5jZW50ZXJfZnJlcTEsIGZyZXEtPmNlbnRlcl9mcmVxMik7CiAJbXNnID0gbmxtc2dfYWxsb2MoKTsKIAlpZiAoIW1zZykKIAkJcmV0dXJuIC0xOwpAQCAtNTU5Miw5ICs1NzE0LDM4IEBACiAJbmw4MDIxMV9jbWQoZHJ2LCBtc2csIDAsIE5MODAyMTFfQ01EX1NFVF9XSVBIWSk7CiAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkcnYtPmlmaW5kZXgpOwotCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsIGZyZXEpOwotCWlmIChodF9lbmFibGVkKSB7Ci0JCXN3aXRjaCAoc2VjX2NoYW5uZWxfb2Zmc2V0KSB7CisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwgZnJlcS0+ZnJlcSk7CisJaWYgKGZyZXEtPnZodF9lbmFibGVkKSB7CisJCXN3aXRjaCAoZnJlcS0+YmFuZHdpZHRoKSB7CisJCWNhc2UgMjA6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRILAorCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfMjApOworCQkJYnJlYWs7CisJCWNhc2UgNDA6CisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRILAorCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfNDApOworCQkJYnJlYWs7CisJCWNhc2UgODA6CisJCQlpZiAoZnJlcS0+Y2VudGVyX2ZyZXEyKQorCQkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0NIQU5ORUxfV0lEVEgsCisJCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfODBQODApOworCQkJZWxzZQorCQkJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0NIQU5ORUxfV0lEVEgsCisJCQkJCSAgICBOTDgwMjExX0NIQU5fV0lEVEhfODApOworCQkJYnJlYWs7CisJCWNhc2UgMTYwOgorCQkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSCwKKwkJCQkgICAgTkw4MDIxMV9DSEFOX1dJRFRIXzE2MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEsIGZyZXEtPmNlbnRlcl9mcmVxMSk7CisJCWlmIChmcmVxLT5jZW50ZXJfZnJlcTIpCisJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTIsCisJCQkJICAgIGZyZXEtPmNlbnRlcl9mcmVxMik7CisJfSBlbHNlIGlmIChmcmVxLT5odF9lbmFibGVkKSB7CisJCXN3aXRjaCAoZnJlcS0+c2VjX2NoYW5uZWxfb2Zmc2V0KSB7CiAJCWNhc2UgLTE6CiAJCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUsCiAJCQkJICAgIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMpOwpAQCAtNTYxMywxMSArNTc2NCwxMSBAQAogCXJldCA9IHNlbmRfYW5kX3JlY3ZfbXNncyhkcnYsIG1zZywgTlVMTCwgTlVMTCk7CiAJbXNnID0gTlVMTDsKIAlpZiAocmV0ID09IDApIHsKLQkJYnNzLT5mcmVxID0gZnJlcTsKKwkJYnNzLT5mcmVxID0gZnJlcS0+ZnJlcTsKIAkJcmV0dXJuIDA7CiAJfQogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogRmFpbGVkIHRvIHNldCBjaGFubmVsIChmcmVxPSVkKTogIgotCQkgICAiJWQgKCVzKSIsIGZyZXEsIHJldCwgc3RyZXJyb3IoLXJldCkpOworCQkgICAiJWQgKCVzKSIsIGZyZXEtPmZyZXEsIHJldCwgc3RyZXJyb3IoLXJldCkpOwogbmxhX3B1dF9mYWlsdXJlOgogCW5sbXNnX2ZyZWUobXNnKTsKIAlyZXR1cm4gLTE7CkBAIC01Njc4LDYgKzU4MjksMTIgQEAKIAkJCXBhcmFtcy0+aHRfY2FwYWJpbGl0aWVzKTsKIAl9CiAKKwlpZiAocGFyYW1zLT52aHRfY2FwYWJpbGl0aWVzKSB7CisJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFksCisJCQlzaXplb2YoKnBhcmFtcy0+dmh0X2NhcGFiaWxpdGllcyksCisJCQlwYXJhbXMtPnZodF9jYXBhYmlsaXRpZXMpOworCX0KKwogCW9zX21lbXNldCgmdXBkLCAwLCBzaXplb2YodXBkKSk7CiAJdXBkLm1hc2sgPSBzdGFfZmxhZ3Nfbmw4MDIxMShwYXJhbXMtPmZsYWdzKTsKIAl1cGQuc2V0ID0gdXBkLm1hc2s7CkBAIC02NTEzLDcgKzY2NzAsMTAgQEAKIHN0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2FwKHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAogCQkJCSBzdHJ1Y3Qgd3BhX2RyaXZlcl9hc3NvY2lhdGVfcGFyYW1zICpwYXJhbXMpCiB7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBubG1vZGU7CisJZW51bSBubDgwMjExX2lmdHlwZSBubG1vZGUsIG9sZF9tb2RlOworCXN0cnVjdCBob3N0YXBkX2ZyZXFfcGFyYW1zIGZyZXEgPSB7CisJCS5mcmVxID0gcGFyYW1zLT5mcmVxLAorCX07CiAKIAlpZiAocGFyYW1zLT5wMnApIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBTZXR1cCBBUCBvcGVyYXRpb25zIGZvciBQMlAgIgpAQCAtNjUyMiw4ICs2NjgyLDE1IEBACiAJfSBlbHNlCiAJCW5sbW9kZSA9IE5MODAyMTFfSUZUWVBFX0FQOwogCi0JaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG5sbW9kZSkgfHwKLQkgICAgd3BhX2RyaXZlcl9ubDgwMjExX3NldF9mcmVxKCZkcnYtPmZpcnN0X2JzcywgcGFyYW1zLT5mcmVxLCAwLCAwKSkgeworCW9sZF9tb2RlID0gZHJ2LT5ubG1vZGU7CisJaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG5sbW9kZSkpIHsKKwkJbmw4MDIxMV9yZW1vdmVfbW9uaXRvcl9pbnRlcmZhY2UoZHJ2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoJmRydi0+Zmlyc3RfYnNzLCAmZnJlcSkpIHsKKwkJaWYgKG9sZF9tb2RlICE9IG5sbW9kZSkKKwkJCXdwYV9kcml2ZXJfbmw4MDIxMV9zZXRfbW9kZSgmZHJ2LT5maXJzdF9ic3MsIG9sZF9tb2RlKTsKIAkJbmw4MDIxMV9yZW1vdmVfbW9uaXRvcl9pbnRlcmZhY2UoZHJ2KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTY2NDgsNTYgKzY4MTUsNyBAQAogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmw4MDIxMV9nZXRfYXNzb2NfYnNzaWQoc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCi0JCQkJCSAgICB1OCAqYnNzaWQpCi17Ci0Jc3RydWN0IG5sX21zZyAqbXNnOwotCWludCByZXQ7Ci0Jc3RydWN0IG5sODAyMTFfYnNzX2luZm9fYXJnIGFyZzsKLQotCW9zX21lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7Ci0JbXNnID0gbmxtc2dfYWxsb2MoKTsKLQlpZiAoIW1zZykKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0KLQlubDgwMjExX2NtZChkcnYsIG1zZywgTkxNX0ZfRFVNUCwgTkw4MDIxMV9DTURfR0VUX1NDQU4pOwotCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGRydi0+aWZpbmRleCk7Ci0KLQlhcmcuZHJ2ID0gZHJ2OwotCXJldCA9IHNlbmRfYW5kX3JlY3ZfbXNncyhkcnYsIG1zZywgYnNzX2luZm9faGFuZGxlciwgJmFyZyk7Ci0JbXNnID0gTlVMTDsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhcmcuYXNzb2NfYnNzaWQpKQotCQkJcmV0dXJuIC1FTk9UQ09OTjsKLQkJb3NfbWVtY3B5KGJzc2lkLCBhcmcuYXNzb2NfYnNzaWQsIEVUSF9BTEVOKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAibmw4MDIxMTogU2NhbiByZXN1bHQgZmV0Y2ggZmFpbGVkOiByZXQ9JWQgIgotCQkgICAiKCVzKSIsIHJldCwgc3RyZXJyb3IoLXJldCkpOwotbmxhX3B1dF9mYWlsdXJlOgotCW5sbXNnX2ZyZWUobXNnKTsKLQlyZXR1cm4gZHJ2LT5hc3NvY19mcmVxOwotfQotCi0KLXN0YXRpYyBpbnQgbmw4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAotCQkJICAgICAgY29uc3QgdTggKmJzc2lkKQotewotCXU4IGFkZHJbRVRIX0FMRU5dOwotCi0JaWYgKGJzc2lkID09IE5VTEwpIHsKLQkJaW50IHJlcyA9IG5sODAyMTFfZ2V0X2Fzc29jX2Jzc2lkKGRydiwgYWRkcik7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCQlic3NpZCA9IGFkZHI7Ci0JfQotCi0JcmV0dXJuIHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KGRydiwgYnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7Ci19Ci0KLQotc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfY29ubmVjdCgKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX3RyeV9jb25uZWN0KAogCXN0cnVjdCB3cGFfZHJpdmVyX25sODAyMTFfZGF0YSAqZHJ2LAogCXN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTY3ODgsNiArNjkwNiw5IEBACiAJCWludCBjaXBoZXI7CiAKIAkJc3dpdGNoIChwYXJhbXMtPnBhaXJ3aXNlX3N1aXRlKSB7CisJCWNhc2UgQ0lQSEVSX1NNUzQ6CisJCQljaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OworCQkJYnJlYWs7CiAJCWNhc2UgQ0lQSEVSX1dFUDQwOgogCQkJY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7CiAJCQlicmVhazsKQEAgLTY4MTIsNiArNjkzMyw5IEBACiAJCWludCBjaXBoZXI7CiAKIAkJc3dpdGNoIChwYXJhbXMtPmdyb3VwX3N1aXRlKSB7CisJCWNhc2UgQ0lQSEVSX1NNUzQ6CisJCQljaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OworCQkJYnJlYWs7CiAJCWNhc2UgQ0lQSEVSX1dFUDQwOgogCQkJY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7CiAJCQlicmVhazsKQEAgLTY4MzMsMTAgKzY5NTcsMTQgQEAKIAl9CiAKIAlpZiAocGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF84MDJfMVggfHwKLQkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9QU0spIHsKKwkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9QU0sgfHwKKwkgICAgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSA9PSBLRVlfTUdNVF9DQ0tNKSB7CiAJCWludCBtZ210ID0gV0xBTl9BS01fU1VJVEVfUFNLOwogCiAJCXN3aXRjaCAocGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSkgeworCQljYXNlIEtFWV9NR01UX0NDS006CisJCQltZ210ID0gV0xBTl9BS01fU1VJVEVfQ0NLTTsKKwkJCWJyZWFrOwogCQljYXNlIEtFWV9NR01UXzgwMl8xWDoKIAkJCW1nbXQgPSBXTEFOX0FLTV9TVUlURV84MDIxWDsKIAkJCWJyZWFrOwpAQCAtNjg0OCw2ICs2OTc2LDExIEBACiAJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMsIG1nbXQpOwogCX0KIAorI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCisJaWYgKHBhcmFtcy0+bWdtdF9mcmFtZV9wcm90ZWN0aW9uID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCkKKwkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfVVNFX01GUCwgTkw4MDIxMV9NRlBfUkVRVUlSRUQpOworI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisKIAlpZiAocGFyYW1zLT5kaXNhYmxlX2h0KQogCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX0FUVFJfRElTQUJMRV9IVCk7CiAKQEAgLTY4NjcsMTQgKzcwMDAsNiBAQAogCWlmIChyZXQpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJubDgwMjExOiBNTE1FIGNvbm5lY3QgZmFpbGVkOiByZXQ9JWQgIgogCQkJICAgIiglcykiLCByZXQsIHN0cmVycm9yKC1yZXQpKTsKLQkJLyoKLQkJICogY2ZnODAyMTEgZG9lcyBub3QgY3VycmVudGx5IGFjY2VwdCBuZXcgY29ubmVjdGlvbiBpZiB3ZSBhcmUKLQkJICogYWxyZWFkeSBjb25uZWN0ZWQuIEFzIGEgd29ya2Fyb3VuZCwgZm9yY2UgZGlzY29ubmVjdGlvbiBhbmQKLQkJICogdHJ5IGFnYWluIG9uY2UgdGhlIGRyaXZlciBpbmRpY2F0ZXMgaXQgY29tcGxldGVkCi0JCSAqIGRpc2Nvbm5lY3Rpb24uCi0JCSAqLwotCQlpZiAocmV0ID09IC1FQUxSRUFEWSkKLQkJCW5sODAyMTFfZGlzY29ubmVjdChkcnYsIHBhcmFtcy0+YnNzaWQpOwogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAJcmV0ID0gMDsKQEAgLTY4ODcsNiArNzAxMiwzMSBAQAogfQogCiAKK3N0YXRpYyBpbnQgd3BhX2RyaXZlcl9ubDgwMjExX2Nvbm5lY3QoCisJc3RydWN0IHdwYV9kcml2ZXJfbmw4MDIxMV9kYXRhICpkcnYsCisJc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQoreworCWludCByZXQgPSB3cGFfZHJpdmVyX25sODAyMTFfdHJ5X2Nvbm5lY3QoZHJ2LCBwYXJhbXMpOworCWlmIChyZXQgPT0gLUVBTFJFQURZKSB7CisJCS8qCisJCSAqIGNmZzgwMjExIGRvZXMgbm90IGN1cnJlbnRseSBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zIGlmCisJCSAqIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4gQXMgYSB3b3JrYXJvdW5kLCBmb3JjZQorCQkgKiBkaXNjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uCisJCSAqLworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIm5sODAyMTE6IEV4cGxpY2l0bHkgIgorCQkJICAgImRpc2Nvbm5lY3RpbmcgYmVmb3JlIHJlYXNzb2NpYXRpb24gIgorCQkJICAgImF0dGVtcHQiKTsKKwkJaWYgKHdwYV9kcml2ZXJfbmw4MDIxMV9kaXNjb25uZWN0KAorCQkJICAgIGRydiwgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCkpCisJCQlyZXR1cm4gLTE7CisJCS8qIElnbm9yZSB0aGUgbmV4dCBsb2NhbCBkaXNjb25uZWN0IG1lc3NhZ2UuICovCisJCWRydi0+aWdub3JlX25leHRfbG9jYWxfZGlzY29ubmVjdCA9IDE7CisJCXJldCA9IHdwYV9kcml2ZXJfbmw4MDIxMV90cnlfY29ubmVjdChkcnYsIHBhcmFtcyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIGludCB3cGFfZHJpdmVyX25sODAyMTFfYXNzb2NpYXRlKAogCXZvaWQgKnByaXYsIHN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTcyMzIsOCArNzM4Miw3IEBACiBzdGF0aWMgaW50IGk4MDJfc2V0X2ZyZXEodm9pZCAqcHJpdiwgc3RydWN0IGhvc3RhcGRfZnJlcV9wYXJhbXMgKmZyZXEpCiB7CiAJc3RydWN0IGk4MDJfYnNzICpic3MgPSBwcml2OwotCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoYnNzLCBmcmVxLT5mcmVxLCBmcmVxLT5odF9lbmFibGVkLAotCQkJCQkgICBmcmVxLT5zZWNfY2hhbm5lbF9vZmZzZXQpOworCXJldHVybiB3cGFfZHJpdmVyX25sODAyMTFfc2V0X2ZyZXEoYnNzLCBmcmVxKTsKIH0KIAogCkBAIC04MDY5LDYgKzgyMTgsNyBAQAogCQluZXdfYnNzLT5kcnYgPSBkcnY7CiAJCW5ld19ic3MtPm5leHQgPSBkcnYtPmZpcnN0X2Jzcy5uZXh0OwogCQluZXdfYnNzLT5mcmVxID0gZHJ2LT5maXJzdF9ic3MuZnJlcTsKKwkJbmV3X2Jzcy0+Y3R4ID0gYnNzX2N0eDsKIAkJZHJ2LT5maXJzdF9ic3MubmV4dCA9IG5ld19ic3M7CiAJCWlmIChkcnZfcHJpdikKIAkJCSpkcnZfcHJpdiA9IG5ld19ic3M7CkBAIC05MTg2LDcgKzkzMzYsNiBAQAogCS5zdG9wX3NjaGVkX3NjYW4gPSB3cGFfZHJpdmVyX25sODAyMTFfc3RvcF9zY2hlZF9zY2FuLAogCS5nZXRfc2Nhbl9yZXN1bHRzMiA9IHdwYV9kcml2ZXJfbmw4MDIxMV9nZXRfc2Nhbl9yZXN1bHRzLAogCS5kZWF1dGhlbnRpY2F0ZSA9IHdwYV9kcml2ZXJfbmw4MDIxMV9kZWF1dGhlbnRpY2F0ZSwKLQkuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9ubDgwMjExX2Rpc2Fzc29jaWF0ZSwKIAkuYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl9ubDgwMjExX2F1dGhlbnRpY2F0ZSwKIAkuYXNzb2NpYXRlID0gd3BhX2RyaXZlcl9ubDgwMjExX2Fzc29jaWF0ZSwKIAkuZ2xvYmFsX2luaXQgPSBubDgwMjExX2dsb2JhbF9pbml0LApkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvZHJpdmVyX3ByaXZzZXAuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl9wcml2c2VwLmMKaW5kZXggOTQ4MWNiZi4uZWQ4OGU3MSAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyX3ByaXZzZXAuYworKysgYi9zcmMvZHJpdmVycy9kcml2ZXJfcHJpdnNlcC5jCkBAIC0zMDQsMTcgKzMwNCw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX3ByaXZzZXBfZGlzYXNzb2NpYXRlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLAotCQkJCQlpbnQgcmVhc29uX2NvZGUpCi17Ci0JLy9zdHJ1Y3Qgd3BhX2RyaXZlcl9wcml2c2VwX2RhdGEgKmRydiA9IHByaXY7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyBhZGRyPSIgTUFDU1RSICIgcmVhc29uX2NvZGU9JWQiLAotCQkgICBfX2Z1bmNfXywgTUFDMlNUUihhZGRyKSwgcmVhc29uX2NvZGUpOwotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMgLSBUT0RPIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyB2b2lkIHdwYV9kcml2ZXJfcHJpdnNlcF9ldmVudF9hc3NvYyh2b2lkICpjdHgsCiAJCQkJCSAgIGVudW0gd3BhX2V2ZW50X3R5cGUgZXZlbnQsCiAJCQkJCSAgIHU4ICpidWYsIHNpemVfdCBsZW4pCkBAIC03MzYsNyArNzI1LDYgQEAKIAkuc2V0X3BhcmFtID0gd3BhX2RyaXZlcl9wcml2c2VwX3NldF9wYXJhbSwKIAkuc2NhbjIgPSB3cGFfZHJpdmVyX3ByaXZzZXBfc2NhbiwKIAkuZGVhdXRoZW50aWNhdGUgPSB3cGFfZHJpdmVyX3ByaXZzZXBfZGVhdXRoZW50aWNhdGUsCi0JLmRpc2Fzc29jaWF0ZSA9IHdwYV9kcml2ZXJfcHJpdnNlcF9kaXNhc3NvY2lhdGUsCiAJLmFzc29jaWF0ZSA9IHdwYV9kcml2ZXJfcHJpdnNlcF9hc3NvY2lhdGUsCiAJLmdldF9jYXBhID0gd3BhX2RyaXZlcl9wcml2c2VwX2dldF9jYXBhLAogCS5nZXRfbWFjX2FkZHIgPSB3cGFfZHJpdmVyX3ByaXZzZXBfZ2V0X21hY19hZGRyLApkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvZHJpdmVyX3Rlc3QuYyBiL3NyYy9kcml2ZXJzL2RyaXZlcl90ZXN0LmMKaW5kZXggZTdiZjE5NS4uYmQ2NWRkOCAxMDA2NDQKLS0tIGEvc3JjL2RyaXZlcnMvZHJpdmVyX3Rlc3QuYworKysgYi9zcmMvZHJpdmVycy9kcml2ZXJfdGVzdC5jCkBAIC0xMzIxLDcgKzEzMjEsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5udW1fc2NhbnJlczsgaSsrKSB7CiAJCQlzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpic3MgPSBkcnYtPnNjYW5yZXNbaV07CiAJCQlpZiAocDJwX3NjYW5fcmVzX2hhbmRsZXIoZHJ2LT5wMnAsIGJzcy0+YnNzaWQsCi0JCQkJCQkgYnNzLT5mcmVxLCBic3MtPmxldmVsLAorCQkJCQkJIGJzcy0+ZnJlcSwgYnNzLT5hZ2UsCisJCQkJCQkgYnNzLT5sZXZlbCwKIAkJCQkJCSAoY29uc3QgdTggKikgKGJzcyArIDEpLAogCQkJCQkJIGJzcy0+aWVfbGVuKSA+IDApCiAJCQkJcmV0dXJuOwpAQCAtMTcxNCwyMCArMTcxNSw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX3Rlc3RfZGlzYXNzb2NpYXRlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLAotCQkJCQlpbnQgcmVhc29uX2NvZGUpCi17Ci0Jc3RydWN0IHRlc3RfZHJpdmVyX2JzcyAqZGJzcyA9IHByaXY7Ci0Jc3RydWN0IHdwYV9kcml2ZXJfdGVzdF9kYXRhICpkcnYgPSBkYnNzLT5kcnY7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyBhZGRyPSIgTUFDU1RSICIgcmVhc29uX2NvZGU9JWQiLAotCQkgICBfX2Z1bmNfXywgTUFDMlNUUihhZGRyKSwgcmVhc29uX2NvZGUpOwotCW9zX21lbXNldChkYnNzLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCWRydi0+YXNzb2NpYXRlZCA9IDA7Ci0Jd3BhX3N1cHBsaWNhbnRfZXZlbnQoZHJ2LT5jdHgsIEVWRU5UX0RJU0FTU09DLCBOVUxMKTsKLQlyZXR1cm4gd3BhX2RyaXZlcl90ZXN0X3NlbmRfZGlzYXNzb2MoZHJ2KTsKLX0KLQotCiBzdGF0aWMgY29uc3QgdTggKiB3cGFfc2Nhbl9nZXRfaWUoY29uc3Qgc3RydWN0IHdwYV9zY2FuX3JlcyAqcmVzLCB1OCBpZSkKIHsKIAljb25zdCB1OCAqZW5kLCAqcG9zOwpAQCAtMjg3MCw3ICsyODU3LDcgQEAKIAkJcmV0dXJuIC0xOwogCXJldHVybiBwMnBfY29ubmVjdChkcnYtPnAycCwgcGVlcl9hZGRyLCB3cHNfbWV0aG9kLCBnb19pbnRlbnQsCiAJCQkgICBvd25faW50ZXJmYWNlX2FkZHIsIGZvcmNlX2ZyZXEsIHBlcnNpc3RlbnRfZ3JvdXAsCi0JCQkgICBOVUxMLCAwLCAwKTsKKwkJCSAgIE5VTEwsIDAsIDAsIDApOwogfQogCiAKQEAgLTMyOTksNyArMzI4Niw2IEBACiAJLmRlaW5pdCA9IHdwYV9kcml2ZXJfdGVzdF9kZWluaXQsCiAJLnNldF9wYXJhbSA9IHdwYV9kcml2ZXJfdGVzdF9zZXRfcGFyYW0sCiAJLmRlYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl90ZXN0X2RlYXV0aGVudGljYXRlLAotCS5kaXNhc3NvY2lhdGUgPSB3cGFfZHJpdmVyX3Rlc3RfZGlzYXNzb2NpYXRlLAogCS5hc3NvY2lhdGUgPSB3cGFfZHJpdmVyX3Rlc3RfYXNzb2NpYXRlLAogCS5nZXRfY2FwYSA9IHdwYV9kcml2ZXJfdGVzdF9nZXRfY2FwYSwKIAkuZ2V0X21hY19hZGRyID0gd3BhX2RyaXZlcl90ZXN0X2dldF9tYWNfYWRkciwKZGlmZiAtLWdpdCBhL3NyYy9kcml2ZXJzL2RyaXZlcl93ZXh0LmMgYi9zcmMvZHJpdmVycy9kcml2ZXJfd2V4dC5jCmluZGV4IGJkMzdjYTEuLjk3MzNlMDEgMTAwNjQ0Ci0tLSBhL3NyYy9kcml2ZXJzL2RyaXZlcl93ZXh0LmMKKysrIGIvc3JjL2RyaXZlcnMvZHJpdmVyX3dleHQuYwpAQCAtMTkzOCwxOCArMTkzOCw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cGFfZHJpdmVyX3dleHRfZGlzYXNzb2NpYXRlKHZvaWQgKnByaXYsIGNvbnN0IHU4ICphZGRyLAotCQkJCQlpbnQgcmVhc29uX2NvZGUpCi17Ci0Jc3RydWN0IHdwYV9kcml2ZXJfd2V4dF9kYXRhICpkcnYgPSBwcml2OwotCWludCByZXQ7Ci0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0ID0gd3BhX2RyaXZlcl93ZXh0X21sbWUoZHJ2LCBhZGRyLCBJV19NTE1FX0RJU0FTU09DLCByZWFzb25fY29kZSk7Ci0Jd3BhX2RyaXZlcl93ZXh0X2Rpc2Nvbm5lY3QoZHJ2KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KIHN0YXRpYyBpbnQgd3BhX2RyaXZlcl93ZXh0X3NldF9nZW5faWUodm9pZCAqcHJpdiwgY29uc3QgdTggKmllLAogCQkJCSAgICAgIHNpemVfdCBpZV9sZW4pCiB7CkBAIC0yNDg1LDcgKzI0NzMsNiBAQAogCS5zY2FuMiA9IHdwYV9kcml2ZXJfd2V4dF9zY2FuLAogCS5nZXRfc2Nhbl9yZXN1bHRzMiA9IHdwYV9kcml2ZXJfd2V4dF9nZXRfc2Nhbl9yZXN1bHRzLAogCS5kZWF1dGhlbnRpY2F0ZSA9IHdwYV9kcml2ZXJfd2V4dF9kZWF1dGhlbnRpY2F0ZSwKLQkuZGlzYXNzb2NpYXRlID0gd3BhX2RyaXZlcl93ZXh0X2Rpc2Fzc29jaWF0ZSwKIAkuYXNzb2NpYXRlID0gd3BhX2RyaXZlcl93ZXh0X2Fzc29jaWF0ZSwKIAkuaW5pdCA9IHdwYV9kcml2ZXJfd2V4dF9pbml0LAogCS5kZWluaXQgPSB3cGFfZHJpdmVyX3dleHRfZGVpbml0LApkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvbmV0bGluay5jIGIvc3JjL2RyaXZlcnMvbmV0bGluay5jCmluZGV4IGRkNjYyZjMuLjZjNjA1NTAgMTAwNjQ0Ci0tLSBhL3NyYy9kcml2ZXJzL25ldGxpbmsuYworKysgYi9zcmMvZHJpdmVycy9uZXRsaW5rLmMKQEAgLTk3LDggKzk3LDYgQEAKIAlpZiAobmV0bGluayA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCW5ldGxpbmstPmNmZyA9IGNmZzsKLQogCW5ldGxpbmstPnNvY2sgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfUk9VVEUpOwogCWlmIChuZXRsaW5rLT5zb2NrIDwgMCkgewogCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIm5ldGxpbms6IEZhaWxlZCB0byBvcGVuIG5ldGxpbmsgIgpAQCAtMTIxLDYgKzExOSw4IEBACiAJZWxvb3BfcmVnaXN0ZXJfcmVhZF9zb2NrKG5ldGxpbmstPnNvY2ssIG5ldGxpbmtfcmVjZWl2ZSwgbmV0bGluaywKIAkJCQkgTlVMTCk7CiAKKwluZXRsaW5rLT5jZmcgPSBjZmc7CisKIAlyZXR1cm4gbmV0bGluazsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2RyaXZlcnMvbmw4MDIxMV9jb3B5LmggYi9zcmMvZHJpdmVycy9ubDgwMjExX2NvcHkuaAppbmRleCAyZjM4Nzg4Li5lM2UxOWY4IDEwMDY0NAotLS0gYS9zcmMvZHJpdmVycy9ubDgwMjExX2NvcHkuaAorKysgYi9zcmMvZHJpdmVycy9ubDgwMjExX2NvcHkuaApAQCAtMTE4LDggKzExOCw5IEBACiAgKgl0byBnZXQgYSBsaXN0IG9mIGFsbCBwcmVzZW50IHdpcGh5cy4KICAqIEBOTDgwMjExX0NNRF9TRVRfV0lQSFk6IHNldCB3aXBoeSBwYXJhbWV0ZXJzLCBuZWVkcyAlTkw4MDIxMV9BVFRSX1dJUEhZIG9yCiAgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVg7IGNhbiBiZSB1c2VkIHRvIHNldCAlTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVMsICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwKLSAqCSVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFLCAlTkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX1NIT1JULAorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TLCAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgKGFuZCB0aGUKKyAqCWF0dHJpYnV0ZXMgZGV0ZXJtaW5pbmcgdGhlIGNoYW5uZWwgd2lkdGg7IHRoaXMgaXMgdXNlZCBmb3Igc2V0dGluZworICoJbW9uaXRvciBtb2RlIGNoYW5uZWwpLCAgJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKICAqCSVOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkFHX1RIUkVTSE9MRCwKICAqCWFuZC9vciAlTkw4MDIxMV9BVFRSX1dJUEhZX1JUU19USFJFU0hPTEQuCiAgKglIb3dldmVyLCBmb3Igc2V0dGluZyB0aGUgY2hhbm5lbCwgc2VlICVOTDgwMjExX0NNRF9TRVRfQ0hBTk5FTApAQCAtMTcxLDcgKzE3Miw3IEBACiAgKgklTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMsICVOTDgwMjExX0FUVFJfUFJJVkFDWSwKICAqCSVOTDgwMjExX0FUVFJfQVVUSF9UWVBFIGFuZCAlTkw4MDIxMV9BVFRSX0lOQUNUSVZJVFlfVElNRU9VVC4KICAqCVRoZSBjaGFubmVsIHRvIHVzZSBjYW4gYmUgc2V0IG9uIHRoZSBpbnRlcmZhY2Ugb3IgYmUgZ2l2ZW4gdXNpbmcgdGhlCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIGF0dHJzLgorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGFuZCB0aGUgYXR0cmlidXRlcyBkZXRlcm1pbmluZyBjaGFubmVsIHdpZHRoLgogICogQE5MODAyMTFfQ01EX05FV19CRUFDT046IG9sZCBhbGlhcyBmb3IgJU5MODAyMTFfQ01EX1NUQVJUX0FQCiAgKiBATkw4MDIxMV9DTURfU1RPUF9BUDogU3RvcCBBUCBvcGVyYXRpb24gb24gdGhlIGdpdmVuIGludGVyZmFjZQogICogQE5MODAyMTFfQ01EX0RFTF9CRUFDT046IG9sZCBhbGlhcyBmb3IgJU5MODAyMTFfQ01EX1NUT1BfQVAKQEAgLTQwMSw4ICs0MDIsNyBAQAogICoJYSByZXNwb25zZSB3aGlsZSBiZWluZyBhc3NvY2lhdGVkIHRvIGFuIEFQIG9uIGFub3RoZXIgY2hhbm5lbC4KICAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggaW50ZXJmYWNlIChhbmQgdGh1cwogICoJcmFkaW8pIGlzIHVzZWQuICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gKglmcmVxdWVuY3kgZm9yIHRoZSBvcGVyYXRpb24gYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIG1heSBiZQotICoJb3B0aW9uYWxseSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBjaGFubmVsIHBhcmFtZXRlcnMuCisgKglmcmVxdWVuY3kgZm9yIHRoZSBvcGVyYXRpb24uCiAgKgklTkw4MDIxMV9BVFRSX0RVUkFUSU9OIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCiAgKgl0byByZW1haW4gb24gdGhlIGNoYW5uZWwuIFRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgYXMgYW4gZXZlbnQgdG8KICAqCW5vdGlmeSB3aGVuIHRoZSByZXF1ZXN0ZWQgZHVyYXRpb24gc3RhcnRzIChpdCBtYXkgdGFrZSBhIHdoaWxlIGZvciB0aGUKQEAgLTQ0MCwxMiArNDQwLDExIEBACiAgKglhcyBhbiBldmVudCBpbmRpY2F0aW5nIHJlY2VwdGlvbiBvZiBhIGZyYW1lIHRoYXQgd2FzIG5vdCBwcm9jZXNzZWQgaW4KICAqCWtlcm5lbCBjb2RlLCBidXQgaXMgZm9yIHVzIChpLmUuLCB3aGljaCBtYXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgaW4gYQogICoJdXNlciBzcGFjZSBhcHBsaWNhdGlvbikuICVOTDgwMjExX0FUVFJfRlJBTUUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotICoJZnJhbWUgY29udGVudHMgKGluY2x1ZGluZyBoZWFkZXIpLiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgKGFuZAotICoJb3B0aW9uYWxseSAlTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSkgaXMgdXNlZCB0byBpbmRpY2F0ZSBvbgotICoJd2hpY2ggY2hhbm5lbCB0aGUgZnJhbWUgaXMgdG8gYmUgdHJhbnNtaXR0ZWQgb3Igd2FzIHJlY2VpdmVkLiBJZiB0aGlzCi0gKgljaGFubmVsIGlzIG5vdCB0aGUgY3VycmVudCBjaGFubmVsIChyZW1haW4tb24tY2hhbm5lbCBvciB0aGUKLSAqCW9wZXJhdGlvbmFsIGNoYW5uZWwpIHRoZSBkZXZpY2Ugd2lsbCBzd2l0Y2ggdG8gdGhlIGdpdmVuIGNoYW5uZWwgYW5kCi0gKgl0cmFuc21pdCB0aGUgZnJhbWUsIG9wdGlvbmFsbHkgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmb3IgdGhlIHRpbWUKKyAqCWZyYW1lIGNvbnRlbnRzIChpbmNsdWRpbmcgaGVhZGVyKS4gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGlzIHVzZWQKKyAqCXRvIGluZGljYXRlIG9uIHdoaWNoIGNoYW5uZWwgdGhlIGZyYW1lIGlzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIHdhcworICoJcmVjZWl2ZWQuIElmIHRoaXMgY2hhbm5lbCBpcyBub3QgdGhlIGN1cnJlbnQgY2hhbm5lbCAocmVtYWluLW9uLWNoYW5uZWwKKyAqCW9yIHRoZSBvcGVyYXRpb25hbCBjaGFubmVsKSB0aGUgZGV2aWNlIHdpbGwgc3dpdGNoIHRvIHRoZSBnaXZlbiBjaGFubmVsCisgKglhbmQgdHJhbnNtaXQgdGhlIGZyYW1lLCBvcHRpb25hbGx5IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZm9yIHRoZSB0aW1lCiAgKglzcGVjaWZpZWQgdXNpbmcgJU5MODAyMTFfQVRUUl9EVVJBVElPTi4gV2hlbiBjYWxsZWQsIHRoaXMgb3BlcmF0aW9uCiAgKglyZXR1cm5zIGEgY29va2llICglTkw4MDIxMV9BVFRSX0NPT0tJRSkgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggdGhlCiAgKglUWCBzdGF0dXMgZXZlbnQgcGVydGFpbmluZyB0byB0aGUgVFggcmVxdWVzdC4KQEAgLTQ3Myw4ICs0NzIsOCBAQAogICoJY29tbWFuZCBpcyB1c2VkIGFzIGFuIGV2ZW50IHRvIGluZGljYXRlIHRoZSB0aGF0IGEgdHJpZ2dlciBsZXZlbCB3YXMKICAqCXJlYWNoZWQuCiAgKiBATkw4MDIxMV9DTURfU0VUX0NIQU5ORUw6IFNldCB0aGUgY2hhbm5lbCAodXNpbmcgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRCi0gKglhbmQgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUpIHRoZSBnaXZlbiBpbnRlcmZhY2UgKGlkZW50aWZlZAotICoJYnkgJU5MODAyMTFfQVRUUl9JRklOREVYKSBzaGFsbCBvcGVyYXRlIG9uLgorICoJYW5kIHRoZSBhdHRyaWJ1dGVzIGRldGVybWluaW5nIGNoYW5uZWwgd2lkdGgpIHRoZSBnaXZlbiBpbnRlcmZhY2UKKyAqCShpZGVudGlmZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYKSBzaGFsbCBvcGVyYXRlIG9uLgogICoJSW4gY2FzZSBtdWx0aXBsZSBjaGFubmVscyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIHRoZSBtZWNoYW5pc20KICAqCXdpdGggd2hpY2ggaXQgc3dpdGNoZXMgY2hhbm5lbHMgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KICAqCVdoZW4gYSBtb25pdG9yIGludGVyZmFjZSBpcyBnaXZlbiwgaXQgY2FuIG9ubHkgc3dpdGNoIGNoYW5uZWwgd2hpbGUKQEAgLTUyNiw2ICs1MjUsMTIgQEAKICAqCW9mIFBNS1NBIGNhY2hpbmcgZGFuZGlkYXRlcy4KICAqCiAgKiBATkw4MDIxMV9DTURfVERMU19PUEVSOiBQZXJmb3JtIGEgaGlnaC1sZXZlbCBURExTIGNvbW1hbmQgKGUuZy4gbGluayBzZXR1cCkuCisgKglJbiBhZGRpdGlvbiwgdGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBldmVudCB0byByZXF1ZXN0IHVzZXJzcGFjZSB0byB0YWtlCisgKglhY3Rpb25zIG9uIFRETFMgbGlua3MgKHNldCB1cCBhIG5ldyBsaW5rIG9yIHRlYXIgZG93biBhbiBleGlzdGluZyBvbmUpLgorICoJSW4gc3VjaCBldmVudHMsICVOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT04gaW5kaWNhdGVzIHRoZSByZXF1ZXN0ZWQKKyAqCW9wZXJhdGlvbiwgJU5MODAyMTFfQVRUUl9NQUMgY29udGFpbnMgdGhlIHBlZXIgTUFDIGFkZHJlc3MsIGFuZAorICoJJU5MODAyMTFfQVRUUl9SRUFTT05fQ09ERSB0aGUgcmVhc29uIGNvZGUgdG8gYmUgdXNlZCAob25seSB3aXRoCisgKgklTkw4MDIxMV9URExTX1RFQVJET1dOKS4KICAqIEBOTDgwMjExX0NNRF9URExTX01HTVQ6IFNlbmQgYSBURExTIG1hbmFnZW1lbnQgZnJhbWUuCiAgKgogICogQE5MODAyMTFfQ01EX1VORVhQRUNURURfRlJBTUU6IFVzZWQgYnkgYW4gYXBwbGljYXRpb24gY29udHJvbGxpbmcgYW4gQVAKQEAgLTU2Miw4ICs1NjcsMjQgQEAKICAqCiAgKiBATkw4MDIxMV9DTURfQ0hfU1dJVENIX05PVElGWTogQW4gQVAgb3IgR08gbWF5IGRlY2lkZSB0byBzd2l0Y2ggY2hhbm5lbHMKICAqCWluZGVwZW5kZW50bHkgb2YgdGhlIHVzZXJzcGFjZSBTTUUsIHNlbmQgdGhpcyBldmVudCBpbmRpY2F0aW5nCi0gKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgbm93IG9uICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSB3aXRoCi0gKgklTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRS4KKyAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyBub3cgb24gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGFuZCB0aGUKKyAqCWF0dHJpYnV0ZXMgZGV0ZXJtaW5pbmcgY2hhbm5lbCB3aWR0aC4KKyAqCisgKiBATkw4MDIxMV9DTURfU1RBUlRfUDJQX0RFVklDRTogU3RhcnQgdGhlIGdpdmVuIFAyUCBEZXZpY2UsIGlkZW50aWZpZWQgYnkKKyAqCWl0cyAlTkw4MDIxMV9BVFRSX1dERVYgaWRlbnRpZmllci4gSXQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoCisgKgklTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRSBwcmV2aW91c2x5LiBBZnRlciBpdCBoYXMgYmVlbiBzdGFydGVkLCB0aGUKKyAqCVAyUCBEZXZpY2UgY2FuIGJlIHVzZWQgZm9yIFAyUCBvcGVyYXRpb25zLCBlLmcuIHJlbWFpbi1vbi1jaGFubmVsIGFuZAorICoJcHVibGljIGFjdGlvbiBmcmFtZSBUWC4KKyAqIEBOTDgwMjExX0NNRF9TVE9QX1AyUF9ERVZJQ0U6IFN0b3AgdGhlIGdpdmVuIFAyUCBEZXZpY2UsIGlkZW50aWZpZWQgYnkKKyAqCWl0cyAlTkw4MDIxMV9BVFRSX1dERVYgaWRlbnRpZmllci4KKyAqCisgKiBATkw4MDIxMV9DTURfQ09OTl9GQUlMRUQ6IGNvbm5lY3Rpb24gcmVxdWVzdCB0byBhbiBBUCBmYWlsZWQ7IHVzZWQgdG8KKyAqCW5vdGlmeSB1c2Vyc3BhY2UgdGhhdCBBUCBoYXMgcmVqZWN0ZWQgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBmcm9tIGEKKyAqCXN0YXRpb24sIGR1ZSB0byBwYXJ0aWN1bGFyIHJlYXNvbi4gJU5MODAyMTFfQVRUUl9DT05OX0ZBSUxFRF9SRUFTT04KKyAqCWlzIHVzZWQgZm9yIHRoaXMuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9NQ0FTVF9SQVRFOiBDaGFuZ2UgdGhlIHJhdGUgdXNlZCB0byBzZW5kIG11bHRpY2FzdCBmcmFtZXMKKyAqCWZvciBJQlNTIG9yIE1FU0ggdmlmLgogICoKICAqIEBOTDgwMjExX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICogQF9fTkw4MDIxMV9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCkBAIC03MDgsNiArNzI5LDEzIEBACiAKIAlOTDgwMjExX0NNRF9DSF9TV0lUQ0hfTk9USUZZLAogCisJTkw4MDIxMV9DTURfU1RBUlRfUDJQX0RFVklDRSwKKwlOTDgwMjExX0NNRF9TVE9QX1AyUF9ERVZJQ0UsCisKKwlOTDgwMjExX0NNRF9DT05OX0ZBSUxFRCwKKworCU5MODAyMTFfQ01EX1NFVF9NQ0FTVF9SQVRFLAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTc0NCwxNCArNzcyLDI2IEBACiAgKgkvc3lzL2NsYXNzL2llZWU4MDIxMS88cGh5bmFtZT4vaW5kZXgKICAqIEBOTDgwMjExX0FUVFJfV0lQSFlfTkFNRTogd2lwaHkgbmFtZSAodXNlZCBmb3IgcmVuYW1pbmcpCiAgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVM6IGEgbmVzdGVkIGFycmF5IG9mIFRYIHF1ZXVlIHBhcmFtZXRlcnMKLSAqIEBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUTogZnJlcXVlbmN5IG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsIGluIE1IegorICogQE5MODAyMTFfQVRUUl9XSVBIWV9GUkVROiBmcmVxdWVuY3kgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwgaW4gTUh6LAorICoJZGVmaW5lcyB0aGUgY2hhbm5lbCB0b2dldGhlciB3aXRoIHRoZSAoZGVwcmVjYXRlZCkKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIGF0dHJpYnV0ZSBvciB0aGUgYXR0cmlidXRlcworICoJJU5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRIIGFuZCBpZiBuZWVkZWQgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWFuZCAlTkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMgorICogQE5MODAyMTFfQVRUUl9DSEFOTkVMX1dJRFRIOiB1MzIgYXR0cmlidXRlIGNvbnRhaW5pbmcgb25lIG9mIHRoZSB2YWx1ZXMKKyAqCW9mICZlbnVtIG5sODAyMTFfY2hhbl93aWR0aCwgZGVzY3JpYmluZyB0aGUgY2hhbm5lbCB3aWR0aC4gU2VlIHRoZQorICoJZG9jdW1lbnRhdGlvbiBvZiB0aGUgZW51bSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIEBOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVExOiBDZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZQorICoJY2hhbm5lbCwgdXNlZCBmb3IgYW55dGhpbmcgYnV0IDIwIE1IeiBiYW5kd2lkdGgKKyAqIEBOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVEyOiBDZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUKKyAqCWNoYW5uZWwsIHVzZWQgb25seSBmb3IgODArODAgTUh6IGJhbmR3aWR0aAogICogQE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEU6IGluY2x1ZGVkIHdpdGggTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEKLSAqCWlmIEhUMjAgb3IgSFQ0MCBhcmUgYWxsb3dlZCAoaS5lLiwgODAyLjExbiBkaXNhYmxlZCBpZiBub3QgaW5jbHVkZWQpOgorICoJaWYgSFQyMCBvciBIVDQwIGFyZSB0byBiZSB1c2VkIChpLmUuLCBIVCBkaXNhYmxlZCBpZiBub3QgaW5jbHVkZWQpOgogICoJTkw4MDIxMV9DSEFOX05PX0hUID0gSFQgbm90IGFsbG93ZWQgKGkuZS4sIHNhbWUgYXMgbm90IGluY2x1ZGluZwogICoJCXRoaXMgYXR0cmlidXRlKQogICoJTkw4MDIxMV9DSEFOX0hUMjAgPSBIVDIwIG9ubHkKICAqCU5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgPSBzZWNvbmRhcnkgY2hhbm5lbCBpcyBiZWxvdyB0aGUgcHJpbWFyeSBjaGFubmVsCiAgKglOTDgwMjExX0NIQU5fSFQ0MFBMVVMgPSBzZWNvbmRhcnkgY2hhbm5lbCBpcyBhYm92ZSB0aGUgcHJpbWFyeSBjaGFubmVsCisgKglUaGlzIGF0dHJpYnV0ZSBpcyBub3cgZGVwcmVjYXRlZC4KICAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQ6IFRYIHJldHJ5IGxpbWl0IGZvciBmcmFtZXMgd2hvc2UgbGVuZ3RoIGlzCiAgKglsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIFJUUyB0aHJlc2hvbGQ7IGFsbG93ZWQgcmFuZ2U6IDEuLjI1NTsKICAqCWRvdDExU2hvcnRSZXRyeUxpbWl0OyB1OApAQCAtMTI1MSw2ICsxMjkxLDI1IEBACiAgKgl3YXMgdXNlZCB0byBwcm92aWRlIHRoZSBoaW50LiBGb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZgogICoJYWxsb3dlZCB1c2VyIHJlZ3VsYXRvcnkgaGludHMgc2VlIG5sODAyMTFfdXNlcl9yZWdfaGludF90eXBlLgogICoKKyAqIEBOTDgwMjExX0FUVFJfQ09OTl9GQUlMRURfUkVBU09OOiBUaGUgcmVhc29uIGZvciB3aGljaCBBUCBoYXMgcmVqZWN0ZWQKKyAqCXRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZnJvbSBhIHN0YXRpb24uIG5sODAyMTFfY29ubmVjdF9mYWlsZWRfcmVhc29uCisgKgllbnVtIGhhcyBkaWZmZXJlbnQgcmVhc29ucyBvZiBjb25uZWN0aW9uIGZhaWx1cmUuCisgKgorICogQE5MODAyMTFfQVRUUl9TQUVfREFUQTogU0FFIGVsZW1lbnRzIGluIEF1dGhlbnRpY2F0aW9uIGZyYW1lcy4gVGhpcyBzdGFydHMKKyAqCXdpdGggdGhlIEF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciBmaWVsZC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1ZIVF9DQVBBQklMSVRZOiBWSFQgQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBlbGVtZW50IChmcm9tCisgKglhc3NvY2lhdGlvbiByZXF1ZXN0IHdoZW4gdXNlZCB3aXRoIE5MODAyMTFfQ01EX05FV19TVEFUSU9OKQorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9GTEFHUzogc2NhbiByZXF1ZXN0IGNvbnRyb2wgZmxhZ3MgKHUzMikKKyAqCisgKiBATkw4MDIxMV9BVFRSX1AyUF9DVFdJTkRPVzogUDJQIEdPIENsaWVudCBUcmFmZmljIFdpbmRvdyAodTgpLCB1c2VkIHdpdGgKKyAqCXRoZSBTVEFSVF9BUCBhbmQgU0VUX0JTUyBjb21tYW5kcworICogQE5MODAyMTFfQVRUUl9QMlBfT1BQUFM6IFAyUCBHTyBvcHBvcnR1bmlzdGljIFBTICh1OCksIHVzZWQgd2l0aCB0aGUKKyAqCVNUQVJUX0FQIGFuZCBTRVRfQlNTIGNvbW1hbmRzLiBUaGlzIGNhbiBoYXZlIHRoZSB2YWx1ZXMgMCBvciAxOworICoJaWYgbm90IGdpdmVuIGluIFNUQVJUX0FQIDAgaXMgYXNzdW1lZCwgaWYgbm90IGdpdmVuIGluIFNFVF9CU1MKKyAqCW5vIGNoYW5nZSBpcyBtYWRlLgorICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTUwNiw2ICsxNTY1LDIxIEBACiAKIAlOTDgwMjExX0FUVFJfVVNFUl9SRUdfSElOVF9UWVBFLAogCisJTkw4MDIxMV9BVFRSX0NPTk5fRkFJTEVEX1JFQVNPTiwKKworCU5MODAyMTFfQVRUUl9TQUVfREFUQSwKKworCU5MODAyMTFfQVRUUl9WSFRfQ0FQQUJJTElUWSwKKworCU5MODAyMTFfQVRUUl9TQ0FOX0ZMQUdTLAorCisJTkw4MDIxMV9BVFRSX0NIQU5ORUxfV0lEVEgsCisJTkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMSwKKwlOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVEyLAorCisJTkw4MDIxMV9BVFRSX1AyUF9DVFdJTkRPVywKKwlOTDgwMjExX0FUVFJfUDJQX09QUFBTLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMTU0OSw2ICsxNjIzLDcgQEAKICNkZWZpbmUgTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1RYX01JQ19LRVkJMTYKICNkZWZpbmUgTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1JYX01JQ19LRVkJMjQKICNkZWZpbmUgTkw4MDIxMV9IVF9DQVBBQklMSVRZX0xFTgkJMjYKKyNkZWZpbmUgTkw4MDIxMV9WSFRfQ0FQQUJJTElUWV9MRU4JCTEyCiAKICNkZWZpbmUgTkw4MDIxMV9NQVhfTlJfQ0lQSEVSX1NVSVRFUwkJNQogI2RlZmluZSBOTDgwMjExX01BWF9OUl9BS01fU1VJVEVTCQkyCkBAIC0xNTc1LDYgKzE2NTAsMTAgQEAKICAqIEBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOiBtZXNoIHBvaW50CiAgKiBATkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDogUDJQIGNsaWVudAogICogQE5MODAyMTFfSUZUWVBFX1AyUF9HTzogUDJQIGdyb3VwIG93bmVyCisgKiBATkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRTogUDJQIGRldmljZSBpbnRlcmZhY2UgdHlwZSwgdGhpcyBpcyBub3QgYSBuZXRkZXYKKyAqCWFuZCB0aGVyZWZvcmUgY2FuJ3QgYmUgY3JlYXRlZCBpbiB0aGUgbm9ybWFsIHdheXMsIHVzZSB0aGUKKyAqCSVOTDgwMjExX0NNRF9TVEFSVF9QMlBfREVWSUNFIGFuZCAlTkw4MDIxMV9DTURfU1RPUF9QMlBfREVWSUNFCisgKgljb21tYW5kcyB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgb25lCiAgKiBATkw4MDIxMV9JRlRZUEVfTUFYOiBoaWdoZXN0IGludGVyZmFjZSB0eXBlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAogICogQE5VTV9OTDgwMjExX0lGVFlQRVM6IG51bWJlciBvZiBkZWZpbmVkIGludGVyZmFjZSB0eXBlcwogICoKQEAgLTE1OTMsNiArMTY3Miw3IEBACiAJTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCwKIAlOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5ULAogCU5MODAyMTFfSUZUWVBFX1AyUF9HTywKKwlOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFLAogCiAJLyoga2VlcCBsYXN0ICovCiAJTlVNX05MODAyMTFfSUZUWVBFUywKQEAgLTE2NjQsMTAgKzE3NDQsMTUgQEAKICAqIEBfX05MODAyMTFfUkFURV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAogICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEU6IHRvdGFsIGJpdHJhdGUgKHUxNiwgMTAwa2JpdC9zKQogICogQE5MODAyMTFfUkFURV9JTkZPX01DUzogbWNzIGluZGV4IGZvciA4MDIuMTFuICh1OCkKLSAqIEBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEg6IDQwIE1oeiBkdWFsY2hhbm5lbCBiaXRyYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRIOiA0MCBNSHogZHVhbGNoYW5uZWwgYml0cmF0ZQogICogQE5MODAyMTFfUkFURV9JTkZPX1NIT1JUX0dJOiA0MDBucyBndWFyZCBpbnRlcnZhbAogICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEUzMjogdG90YWwgYml0cmF0ZSAodTMyLCAxMDBrYml0L3MpCiAgKiBATkw4MDIxMV9SQVRFX0lORk9fTUFYOiBoaWdoZXN0IHJhdGVfaW5mbyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19WSFRfTUNTOiBNQ1MgaW5kZXggZm9yIFZIVCAodTgpCisgKiBATkw4MDIxMV9SQVRFX0lORk9fVkhUX05TUzogbnVtYmVyIG9mIHN0cmVhbXMgaW4gVkhUICh1OCkKKyAqIEBOTDgwMjExX1JBVEVfSU5GT184MF9NSFpfV0lEVEg6IDgwIE1IeiBWSFQgcmF0ZQorICogQE5MODAyMTFfUkFURV9JTkZPXzgwUDgwX01IWl9XSURUSDogODArODAgTUh6IFZIVCByYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fMTYwX01IWl9XSURUSDogMTYwIE1IeiBWSFQgcmF0ZQogICogQF9fTkw4MDIxMV9SQVRFX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KIGVudW0gbmw4MDIxMV9yYXRlX2luZm8gewpAQCAtMTY3Nyw2ICsxNzYyLDExIEBACiAJTkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRILAogCU5MODAyMTFfUkFURV9JTkZPX1NIT1JUX0dJLAogCU5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEUzMiwKKwlOTDgwMjExX1JBVEVfSU5GT19WSFRfTUNTLAorCU5MODAyMTFfUkFURV9JTkZPX1ZIVF9OU1MsCisJTkw4MDIxMV9SQVRFX0lORk9fODBfTUhaX1dJRFRILAorCU5MODAyMTFfUkFURV9JTkZPXzgwUDgwX01IWl9XSURUSCwKKwlOTDgwMjExX1JBVEVfSU5GT18xNjBfTUhaX1dJRFRILAogCiAJLyoga2VlcCBsYXN0ICovCiAJX19OTDgwMjExX1JBVEVfSU5GT19BRlRFUl9MQVNULApAQCAtMjM4NSw2ICsyNDc1LDE1IEBACiAjZGVmaW5lIE5MODAyMTFfVFhRX1FfQkUJTkw4MDIxMV9BQ19CRQogI2RlZmluZSBOTDgwMjExX1RYUV9RX0JLCU5MODAyMTFfQUNfQksKIAorLyoqCisgKiBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIC0gY2hhbm5lbCB0eXBlCisgKiBATkw4MDIxMV9DSEFOX05PX0hUOiAyMCBNSHosIG5vbi1IVCBjaGFubmVsCisgKiBATkw4MDIxMV9DSEFOX0hUMjA6IDIwIE1IeiBIVCBjaGFubmVsCisgKiBATkw4MDIxMV9DSEFOX0hUNDBNSU5VUzogSFQ0MCBjaGFubmVsLCBzZWNvbmRhcnkgY2hhbm5lbAorICoJYmVsb3cgdGhlIGNvbnRyb2wgY2hhbm5lbAorICogQE5MODAyMTFfQ0hBTl9IVDQwUExVUzogSFQ0MCBjaGFubmVsLCBzZWNvbmRhcnkgY2hhbm5lbAorICoJYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbAorICovCiBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHsKIAlOTDgwMjExX0NIQU5fTk9fSFQsCiAJTkw4MDIxMV9DSEFOX0hUMjAsCkBAIC0yMzkzLDYgKzI0OTIsMzIgQEAKIH07CiAKIC8qKgorICogZW51bSBubDgwMjExX2NoYW5fd2lkdGggLSBjaGFubmVsIHdpZHRoIGRlZmluaXRpb25zCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggdGhlICVOTDgwMjExX0FUVFJfQ0hBTk5FTF9XSURUSAorICogYXR0cmlidXRlLgorICoKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVDogMjAgTUh6LCBub24tSFQgY2hhbm5lbAorICogQE5MODAyMTFfQ0hBTl9XSURUSF8yMDogMjAgTUh6IEhUIGNoYW5uZWwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfNDA6IDQwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIHdlbGwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfODA6IDgwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWF0dHJpYnV0ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIHdlbGwKKyAqIEBOTDgwMjExX0NIQU5fV0lEVEhfODBQODA6IDgwKzgwIE1IeiBjaGFubmVsLCB0aGUgJU5MODAyMTFfQVRUUl9DRU5URVJfRlJFUTEKKyAqCWFuZCAlTkw4MDIxMV9BVFRSX0NFTlRFUl9GUkVRMiBhdHRyaWJ1dGVzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2VsbAorICogQE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6IDE2MCBNSHogY2hhbm5lbCwgdGhlICVOTDgwMjExX0FUVFJfQ0VOVEVSX0ZSRVExCisgKglhdHRyaWJ1dGUgbXVzdCBiZSBwcm92aWRlZCBhcyB3ZWxsCisgKi8KK2VudW0gbmw4MDIxMV9jaGFuX3dpZHRoIHsKKwlOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVCwKKwlOTDgwMjExX0NIQU5fV0lEVEhfMjAsCisJTkw4MDIxMV9DSEFOX1dJRFRIXzQwLAorCU5MODAyMTFfQ0hBTl9XSURUSF84MCwKKwlOTDgwMjExX0NIQU5fV0lEVEhfODBQODAsCisJTkw4MDIxMV9DSEFOX1dJRFRIXzE2MCwKK307CisKKy8qKgogICogZW51bSBubDgwMjExX2JzcyAtIG5ldGxpbmsgYXR0cmlidXRlcyBmb3IgYSBCU1MKICAqCiAgKiBAX19OTDgwMjExX0JTU19JTlZBTElEOiBpbnZhbGlkCkBAIC0yNDYwLDYgKzI1ODUsNyBAQAogICogQE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWTogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiAoV0VQIG9ubHkpCiAgKiBATkw4MDIxMV9BVVRIVFlQRV9GVDogRmFzdCBCU1MgVHJhbnNpdGlvbiAoSUVFRSA4MDIuMTFyKQogICogQE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6IE5ldHdvcmsgRUFQIChzb21lIENpc2NvIEFQcyBhbmQgbWFpbmx5IExFQVApCisgKiBATkw4MDIxMV9BVVRIVFlQRV9TQUU6IFNpbXVsdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMKICAqIEBfX05MODAyMTFfQVVUSFRZUEVfTlVNOiBpbnRlcm5hbAogICogQE5MODAyMTFfQVVUSFRZUEVfTUFYOiBtYXhpbXVtIHZhbGlkIGF1dGggYWxnb3JpdGhtCiAgKiBATkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6IGRldGVybWluZSBhdXRvbWF0aWNhbGx5IChpZiBuZWNlc3NhcnkgYnkKQEAgLTI0NzEsNiArMjU5Nyw3IEBACiAJTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZLAogCU5MODAyMTFfQVVUSFRZUEVfRlQsCiAJTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUCwKKwlOTDgwMjExX0FVVEhUWVBFX1NBRSwKIAogCS8qIGtlZXAgbGFzdCAqLwogCV9fTkw4MDIxMV9BVVRIVFlQRV9OVU0sCkBAIC0yOTk0LDEyICszMTIxLDQwIEBACiAgKiBATkw4MDIxMV9GRUFUVVJFX0NFTExfQkFTRV9SRUdfSElOVFM6IFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZAogICoJdG8gd29yayBwcm9wZXJseSB0byBzdXBwcG9ydCByZWNlaXZpbmcgcmVndWxhdG9yeSBoaW50cyBmcm9tCiAgKgljZWxsdWxhciBiYXNlIHN0YXRpb25zLgorICogQE5MODAyMTFfRkVBVFVSRV9QMlBfREVWSUNFX05FRURTX0NIQU5ORUw6IElmIHRoaXMgaXMgc2V0LCBhbiBhY3RpdmUKKyAqCVAyUCBEZXZpY2UgKCVOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSByZXF1aXJlcyBpdHMgb3duIGNoYW5uZWwKKyAqCWluIHRoZSBpbnRlcmZhY2UgY29tYmluYXRpb25zLCBldmVuIHdoZW4gaXQncyBvbmx5IHVzZWQgZm9yIHNjYW4KKyAqCWFuZCByZW1haW4tb24tY2hhbm5lbC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8sIGZvciBleGFtcGxlLCB0aGUKKyAqCXJlbWFpbi1vbi1jaGFubmVsIGltcGxlbWVudGF0aW9uIHJlcXVpcmluZyBhIGNoYW5uZWwgY29udGV4dC4KKyAqIEBOTDgwMjExX0ZFQVRVUkVfU0FFOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBzaW11bHRhbmVvdXMgYXV0aGVudGljYXRpb24gb2YKKyAqCWVxdWFscyAoU0FFKSB3aXRoIHVzZXIgc3BhY2UgU01FIChOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUpIGluIHN0YXRpb24KKyAqCW1vZGUKKyAqIEBOTDgwMjExX0ZFQVRVUkVfTE9XX1BSSU9SSVRZX1NDQU46IFRoaXMgZHJpdmVyIHN1cHBvcnRzIGxvdyBwcmlvcml0eSBzY2FuCisgKiBATkw4MDIxMV9GRUFUVVJFX1NDQU5fRkxVU0g6IFNjYW4gZmx1c2ggaXMgc3VwcG9ydGVkCisgKiBATkw4MDIxMV9GRUFUVVJFX0FQX1NDQU46IFN1cHBvcnQgc2Nhbm5pbmcgdXNpbmcgYW4gQVAgdmlmCisgKiBATkw4MDIxMV9GRUFUVVJFX1ZJRl9UWFBPV0VSOiBUaGUgZHJpdmVyIHN1cHBvcnRzIHBlci12aWYgVFggcG93ZXIgc2V0dGluZworICogQE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTjogVGhlIGRyaXZlciBleHBlY3RzIHVzZXJzcGFjZSB0byBwZXJmb3JtCisgKglPQlNTIHNjYW5zIGFuZCBnZW5lcmF0ZSAyMC80MCBCU1MgY29leCByZXBvcnRzLiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5CisgKglmb3IgZHJpdmVycyBpbXBsZW1lbnRpbmcgdGhlIENPTk5FQ1QgQVBJLCBmb3IgQVVUSC9BU1NPQyBpdCBpcyBpbXBsaWVkLgorICogQE5MODAyMTFfRkVBVFVSRV9QMlBfR09fQ1RXSU46IFAyUCBHTyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBDVCBXaW5kb3cKKyAqCXNldHRpbmcKKyAqIEBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX09QUFBTOiBQMlAgR08gaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb3Bwb3J0dW5pc3RpYworICoJcG93ZXJzYXZlCiAgKi8KIGVudW0gbmw4MDIxMV9mZWF0dXJlX2ZsYWdzIHsKLQlOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTCT0gMSA8PCAwLAotCU5MODAyMTFfRkVBVFVSRV9IVF9JQlNTCQk9IDEgPDwgMSwKLQlOTDgwMjExX0ZFQVRVUkVfSU5BQ1RJVklUWV9USU1FUiA9IDEgPDwgMiwKLQlOTDgwMjExX0ZFQVRVUkVfQ0VMTF9CQVNFX1JFR19ISU5UUyA9IDEgPDwgMywKKwlOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTCQkJPSAxIDw8IDAsCisJTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1MJCQkJPSAxIDw8IDEsCisJTkw4MDIxMV9GRUFUVVJFX0lOQUNUSVZJVFlfVElNRVIJCT0gMSA8PCAyLAorCU5MODAyMTFfRkVBVFVSRV9DRUxMX0JBU0VfUkVHX0hJTlRTCQk9IDEgPDwgMywKKwlOTDgwMjExX0ZFQVRVUkVfUDJQX0RFVklDRV9ORUVEU19DSEFOTkVMCT0gMSA8PCA0LAorCU5MODAyMTFfRkVBVFVSRV9TQUUJCQkJPSAxIDw8IDUsCisJTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOCQk9IDEgPDwgNiwKKwlOTDgwMjExX0ZFQVRVUkVfU0NBTl9GTFVTSAkJCT0gMSA8PCA3LAorCU5MODAyMTFfRkVBVFVSRV9BUF9TQ0FOCQkJCT0gMSA8PCA4LAorCU5MODAyMTFfRkVBVFVSRV9WSUZfVFhQT1dFUgkJCT0gMSA8PCA5LAorCU5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTgkJCT0gMSA8PCAxMCwKKwlOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX0NUV0lOCQkJPSAxIDw8IDExLAorCU5MODAyMTFfRkVBVFVSRV9QMlBfR09fT1BQUFMJCQk9IDEgPDwgMTIsCiB9OwogCiAvKioKQEAgLTMwMjMsNCArMzE3OCwzNiBAQAogCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfODAyMTFVID0JMTw8MywKIH07CiAKKy8qKgorICogZW51bSBubDgwMjExX2Nvbm5lY3RfZmFpbGVkX3JlYXNvbiAtIGNvbm5lY3Rpb24gcmVxdWVzdCBmYWlsZWQgcmVhc29ucworICogQE5MODAyMTFfQ09OTl9GQUlMX01BWF9DTElFTlRTOiBNYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHRoYXQgY2FuIGJlCisgKgloYW5kbGVkIGJ5IHRoZSBBUCBpcyByZWFjaGVkLgorICogQE5MODAyMTFfQ09OTl9GQUlMX0JMT0NLRURfQ0xJRU5UOiBDbGllbnQncyBNQUMgaXMgaW4gdGhlIEFQJ3MgYmxvY2tsaXN0LgorICovCitlbnVtIG5sODAyMTFfY29ubmVjdF9mYWlsZWRfcmVhc29uIHsKKwlOTDgwMjExX0NPTk5fRkFJTF9NQVhfQ0xJRU5UUywKKwlOTDgwMjExX0NPTk5fRkFJTF9CTE9DS0VEX0NMSUVOVCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3NjYW5fZmxhZ3MgLSAgc2NhbiByZXF1ZXN0IGNvbnRyb2wgZmxhZ3MKKyAqCisgKiBTY2FuIHJlcXVlc3QgY29udHJvbCBmbGFncyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBoYW5kbGluZworICogb2YgTkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOIGFuZCBOTDgwMjExX0NNRF9TVEFSVF9TQ0hFRF9TQ0FOCisgKiByZXF1ZXN0cy4KKyAqCisgKiBATkw4MDIxMV9TQ0FOX0ZMQUdfTE9XX1BSSU9SSVRZOiBzY2FuIHJlcXVlc3QgaGFzIGxvdyBwcmlvcml0eQorICogQE5MODAyMTFfU0NBTl9GTEFHX0ZMVVNIOiBmbHVzaCBjYWNoZSBiZWZvcmUgc2Nhbm5pbmcKKyAqIEBOTDgwMjExX1NDQU5fRkxBR19BUDogZm9yY2UgYSBzY2FuIGV2ZW4gaWYgdGhlIGludGVyZmFjZSBpcyBjb25maWd1cmVkCisgKglhcyBBUCBhbmQgdGhlIGJlYWNvbmluZyBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuIFRoaXMgYXR0cmlidXRlIGlzCisgKglkYW5nZXJvdXMgYmVjYXVzZSB3aWxsIGRlc3Ryb3kgc3RhdGlvbnMgcGVyZm9ybWFuY2UgYXMgYSBsb3Qgb2YgZnJhbWVzCisgKgl3aWxsIGJlIGxvc3Qgd2hpbGUgc2Nhbm5pbmcgb2ZmLWNoYW5uZWwsIHRoZXJlZm9yZSBpdCBtdXN0IGJlIHVzZWQgb25seQorICoJd2hlbiByZWFsbHkgbmVlZGVkCisgKi8KK2VudW0gbmw4MDIxMV9zY2FuX2ZsYWdzIHsKKwlOTDgwMjExX1NDQU5fRkxBR19MT1dfUFJJT1JJVFkJCQk9IDE8PDAsCisJTkw4MDIxMV9TQ0FOX0ZMQUdfRkxVU0gJCQkJPSAxPDwxLAorCU5MODAyMTFfU0NBTl9GTEFHX0FQCQkJCT0gMTw8MiwKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VhcF9wZWVyL2VhcC5jIGIvc3JjL2VhcF9wZWVyL2VhcC5jCmluZGV4IGE0YzliMjUuLjg1YzI0MmEgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXAuYworKysgYi9zcmMvZWFwX3BlZXIvZWFwLmMKQEAgLTg5MSw2ICs4OTEsNyBAQAogCiAJd3BhX21zZyhzbS0+bXNnX2N0eCwgTVNHX0lORk8sIFdQQV9FVkVOVF9FQVBfU1RBUlRFRAogCQkiRUFQIGF1dGhlbnRpY2F0aW9uIHN0YXJ0ZWQiKTsKKwllYXBfbm90aWZ5X3N0YXR1cyhzbSwgInN0YXJ0ZWQiLCAiIik7CiAKIAlwb3MgPSBlYXBfaGRyX3ZhbGlkYXRlKEVBUF9WRU5ET1JfSUVURiwgRUFQX1RZUEVfSURFTlRJVFksIHJlcSwKIAkJCSAgICAgICAmbXNnX2xlbik7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX2Zhc3RfcGFjLmMgYi9zcmMvZWFwX3BlZXIvZWFwX2Zhc3RfcGFjLmMKaW5kZXggZmM5ODdkYS4uOGM0ODBiOSAxMDA2NDQKLS0tIGEvc3JjL2VhcF9wZWVyL2VhcF9mYXN0X3BhYy5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfZmFzdF9wYWMuYwpAQCAtNDIyLDggKzQyMiwxMiBAQAogCWlmIChlYXBfZmFzdF9pbml0X3BhY19kYXRhKHNtLCBwYWNfZmlsZSwgJnJjKSA8IDApCiAJCXJldHVybiAwOwogCi0JaWYgKGVhcF9mYXN0X3JlYWRfbGluZSgmcmMsICZwb3MpIDwgMCB8fAotCSAgICBvc19zdHJjbXAocGFjX2ZpbGVfaGRyLCByYy5idWYpICE9IDApCisJaWYgKGVhcF9mYXN0X3JlYWRfbGluZSgmcmMsICZwb3MpIDwgMCkgeworCQkvKiBlbXB0eSBmaWxlIC0gYXNzdW1lIGl0IGlzIGZpbmUgdG8gb3ZlcndyaXRlICovCisJCWVhcF9mYXN0X2RlaW5pdF9wYWNfZGF0YSgmcmMpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9zX3N0cmNtcChwYWNfZmlsZV9oZHIsIHJjLmJ1ZikgIT0gMCkKIAkJZXJyID0gIlVucmVjb2duaXplZCBoZWFkZXIgbGluZSI7CiAKIAl3aGlsZSAoIWVyciAmJiBlYXBfZmFzdF9yZWFkX2xpbmUoJnJjLCAmcG9zKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zcmMvZWFwX3BlZXIvZWFwX3Rsc19jb21tb24uYyBiL3NyYy9lYXBfcGVlci9lYXBfdGxzX2NvbW1vbi5jCmluZGV4IDdlZWZlOGMuLmFlZGQ4NWEgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfcGVlci9lYXBfdGxzX2NvbW1vbi5jCisrKyBiL3NyYy9lYXBfcGVlci9lYXBfdGxzX2NvbW1vbi5jCkBAIC04MjksNiArODI5LDE0IEBACiAJCX0KIAkJcG9zICs9IDQ7CiAJCWxlZnQgLT0gNDsKKworCQlpZiAobGVmdCA+IHRsc19tc2dfbGVuKSB7CisJCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiU1NMOiBUTFMgTWVzc2FnZSBMZW5ndGggKCVkICIKKwkJCQkgICAiYnl0ZXMpIHNtYWxsZXIgdGhhbiB0aGlzIGZyYWdtZW50ICglZCAiCisJCQkJICAgImJ5dGVzKSIsIChpbnQpIHRsc19tc2dfbGVuLCAoaW50KSBsZWZ0KTsKKwkJCXJldC0+aWdub3JlID0gVFJVRTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQogCiAJcmV0LT5pZ25vcmUgPSBGQUxTRTsKZGlmZiAtLWdpdCBhL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfYWthLmMgYi9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX2FrYS5jCmluZGV4IGE5NjVjYWMuLjQ2OWI5YTAgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfYWthLmMKKysrIGIvc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl9ha2EuYwpAQCAtMzY1LDYgKzM2NSw3IEBACiAJCWVhcF9zaW1fbXNnX2FkZChtc2csIEVBUF9TSU1fQVRfQU5ZX0lEX1JFUSwgMCwgTlVMTCwgMCk7CiAJfSBlbHNlIGlmIChkYXRhLT5pZGVudGl0eV9yb3VuZCA+IDMpIHsKIAkJLyogQ2Fubm90IHVzZSBtb3JlIHRoYW4gdGhyZWUgcm91bmRzIG9mIElkZW50aXR5IG1lc3NhZ2VzICovCisJCWVhcF9zaW1fbXNnX2ZyZWUobXNnKTsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIGlmIChzbS0+aWRlbnRpdHkgJiYgc20tPmlkZW50aXR5X2xlbiA+IDAgJiYKIAkJICAgKHNtLT5pZGVudGl0eVswXSA9PSBFQVBfQUtBX1JFQVVUSF9JRF9QUkVGSVggfHwKQEAgLTczMCw2ICs3MzEsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmICgoKGRhdGEtPmVhcF9tZXRob2QgPT0gRUFQX1RZUEVfQUtBX1BSSU1FICYmCisJICAgICAgdXNlcm5hbWVbMF0gPT0gRUFQX0FLQV9QUklNRV9SRUFVVEhfSURfUFJFRklYKSB8fAorCSAgICAgKGRhdGEtPmVhcF9tZXRob2QgPT0gRUFQX1RZUEVfQUtBICYmCisJICAgICAgdXNlcm5hbWVbMF0gPT0gRUFQX0FLQV9SRUFVVEhfSURfUFJFRklYKSkgJiYKKwkgICAgZGF0YS0+aWRlbnRpdHlfcm91bmQgPT0gMSkgeworCQkvKiBSZW1haW4gaW4gSURFTlRJVFkgc3RhdGUgZm9yIGFub3RoZXIgcm91bmQgdG8gcmVxdWVzdCBmdWxsCisJCSAqIGF1dGggaWRlbnRpdHkgc2luY2Ugd2UgZGlkIG5vdCByZWNvZ25pemUgcmVhdXRoIGlkICovCisJCW9zX2ZyZWUodXNlcm5hbWUpOworCQlyZXR1cm47CisJfQorCiAJaWYgKChkYXRhLT5lYXBfbWV0aG9kID09IEVBUF9UWVBFX0FLQV9QUklNRSAmJgogCSAgICAgdXNlcm5hbWVbMF0gPT0gRUFQX0FLQV9QUklNRV9QU0VVRE9OWU1fUFJFRklYKSB8fAogCSAgICAoZGF0YS0+ZWFwX21ldGhvZCA9PSBFQVBfVFlQRV9BS0EgJiYKZGlmZiAtLWdpdCBhL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfc2ltLmMgYi9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3NpbS5jCmluZGV4IGY4M2MzY2IuLmI1MzEyNDEgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfc2ltLmMKKysrIGIvc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl9zaW0uYwpAQCAtMTE3LDYgKzExNyw3IEBACiAJCWVhcF9zaW1fbXNnX2FkZChtc2csIEVBUF9TSU1fQVRfQU5ZX0lEX1JFUSwgMCwgTlVMTCwgMCk7CiAJfSBlbHNlIGlmIChkYXRhLT5zdGFydF9yb3VuZCA+IDMpIHsKIAkJLyogQ2Fubm90IHVzZSBtb3JlIHRoYW4gdGhyZWUgcm91bmRzIG9mIFN0YXJ0IG1lc3NhZ2VzICovCisJCWVhcF9zaW1fbXNnX2ZyZWUobXNnKTsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIGlmIChkYXRhLT5zdGFydF9yb3VuZCA9PSAwKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rsc19jb21tb24uYyBiL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfdGxzX2NvbW1vbi5jCmluZGV4IDMxYmUyZWMuLjllZmI1YjIgMTAwNjQ0Ci0tLSBhL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfdGxzX2NvbW1vbi5jCisrKyBiL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfdGxzX2NvbW1vbi5jCkBAIC0yMjgsNiArMjI4LDE0IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAorCQlpZiAobGVuID4gbWVzc2FnZV9sZW5ndGgpIHsKKwkJCXdwYV9wcmludGYoTVNHX0lORk8sICJTU0w6IFRvbyBtdWNoIGRhdGEgKCVkIGJ5dGVzKSBpbiAiCisJCQkJICAgImZpcnN0IGZyYWdtZW50IG9mIGZyYW1lIChUTFMgTWVzc2FnZSAiCisJCQkJICAgIkxlbmd0aCAlZCBieXRlcykiLAorCQkJCSAgIChpbnQpIGxlbiwgKGludCkgbWVzc2FnZV9sZW5ndGgpOworCQkJcmV0dXJuIC0xOworCQl9CisKIAkJZGF0YS0+dGxzX2luID0gd3BhYnVmX2FsbG9jKG1lc3NhZ2VfbGVuZ3RoKTsKIAkJaWYgKGRhdGEtPnRsc19pbiA9PSBOVUxMKSB7CiAJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNTTDogTm8gbWVtb3J5IGZvciBtZXNzYWdlIik7CkBAIC0yODksNiArMjk3LDEzIEBACiAJCQkgICB0bHNfbXNnX2xlbik7CiAJCSpwb3MgKz0gNDsKIAkJKmxlZnQgLT0gNDsKKworCQlpZiAoKmxlZnQgPiB0bHNfbXNnX2xlbikgeworCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgIlNTTDogVExTIE1lc3NhZ2UgTGVuZ3RoICglZCAiCisJCQkJICAgImJ5dGVzKSBzbWFsbGVyIHRoYW4gdGhpcyBmcmFnbWVudCAoJWQgIgorCQkJCSAgICJieXRlcykiLCAoaW50KSB0bHNfbXNnX2xlbiwgKGludCkgKmxlZnQpOworCQkJcmV0dXJuIC0xOworCQl9CiAJfQogCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTU0w6IFJlY2VpdmVkIHBhY2tldDogRmxhZ3MgMHgleCAiCmRpZmYgLS1naXQgYS9zcmMvZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmMgYi9zcmMvZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmMKaW5kZXggODUxY2Y0OS4uZjkwZmI2MiAxMDA2NDQKLS0tIGEvc3JjL2VhcG9sX3N1cHAvZWFwb2xfc3VwcF9zbS5jCisrKyBiL3NyYy9lYXBvbF9zdXBwL2VhcG9sX3N1cHBfc20uYwpAQCAtMTQ2OSwxMCArMTQ2OSw3IEBACiAJaWYgKHNtID09IE5VTEwpCiAJCXJldHVybjsKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkVBUE9MOiBQTUtTQSBjYWNoaW5nIHdhcyB1c2VkIC0gc2tpcCBFQVBPTCIpOwotCXNtLT5TVVBQX1BBRV9zdGF0ZSA9IFNVUFBfUEFFX0FVVEhFTlRJQ0FURUQ7Ci0Jc20tPnN1cHBQb3J0U3RhdHVzID0gQXV0aG9yaXplZDsKLQllYXBvbF9zbV9zZXRfcG9ydF9hdXRob3JpemVkKHNtKTsKLQlzbS0+cG9ydFZhbGlkID0gVFJVRTsKKwlzbS0+ZWFwU3VjY2VzcyA9IFRSVUU7CiAJZWFwX25vdGlmeV9zdWNjZXNzKHNtLT5lYXApOwogCWVhcG9sX3NtX3N0ZXAoc20pOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3AycC9wMnAuYyBiL3NyYy9wMnAvcDJwLmMKaW5kZXggYTNlYWE4Yy4uYWFhY2M5YSAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnAuYworKysgYi9zcmMvcDJwL3AycC5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBwMnBfbGlzdGVuX2luX2ZpbmQoc3RydWN0IHAycF9kYXRhICpwMnApCitzdGF0aWMgdm9pZCBwMnBfbGlzdGVuX2luX2ZpbmQoc3RydWN0IHAycF9kYXRhICpwMnAsIGludCBkZXZfZGlzYykKIHsKIAl1bnNpZ25lZCBpbnQgciwgdHU7CiAJaW50IGZyZXE7CkBAIC0yNzcsNiArMjc3LDE5IEBACiAJb3NfZ2V0X3JhbmRvbSgodTggKikgJnIsIHNpemVvZihyKSk7CiAJdHUgPSAociAlICgocDJwLT5tYXhfZGlzY19pbnQgLSBwMnAtPm1pbl9kaXNjX2ludCkgKyAxKSArCiAJICAgICAgcDJwLT5taW5fZGlzY19pbnQpICogMTAwOworCWlmIChwMnAtPm1heF9kaXNjX3R1ID49IDAgJiYgdHUgPiAodW5zaWduZWQgaW50KSBwMnAtPm1heF9kaXNjX3R1KQorCQl0dSA9IHAycC0+bWF4X2Rpc2NfdHU7CisJaWYgKCFkZXZfZGlzYyAmJiB0dSA8IDEwMCkKKwkJdHUgPSAxMDA7IC8qIE5lZWQgdG8gd2FpdCBpbiBub24tZGV2aWNlIGRpc2NvdmVyeSB1c2UgY2FzZXMgKi8KKwlpZiAocDJwLT5jZmctPm1heF9saXN0ZW4gJiYgMTAyNCAqIHR1IC8gMTAwMCA+IHAycC0+Y2ZnLT5tYXhfbGlzdGVuKQorCQl0dSA9IHAycC0+Y2ZnLT5tYXhfbGlzdGVuICogMTAwMCAvIDEwMjQ7CisKKwlpZiAodHUgPT0gMCkgeworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNraXAgbGlzdGVuIHN0YXRlICIKKwkJCSJzaW5jZSBkdXJhdGlvbiB3YXMgMCBUVSIpOworCQlwMnBfc2V0X3RpbWVvdXQocDJwLCAwLCAwKTsKKwkJcmV0dXJuOworCX0KIAogCXAycC0+cGVuZGluZ19saXN0ZW5fZnJlcSA9IGZyZXE7CiAJcDJwLT5wZW5kaW5nX2xpc3Rlbl9zZWMgPSAwOwpAQCAtNjE3LDYgKzYzMCw3IEBACiAgKglQMlAgRGV2aWNlIEFkZHJlc3Mgb3IgUDJQIEludGVyZmFjZSBBZGRyZXNzKQogICogQGxldmVsOiBTaWduYWwgbGV2ZWwgKHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUgZnJvbSB0aGUgcGVlcikKICAqIEBmcmVxOiBGcmVxdWVuY3kgb24gd2hpY2ggdGhlIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZSBmcmFtZSB3YXMgcmVjZWl2ZWQKKyAqIEBhZ2VfbXM6IEFnZSBvZiB0aGUgaW5mb3JtYXRpb24gaW4gbWlsbGlzZWNvbmRzCiAgKiBAaWVzOiBJRXMgZnJvbSB0aGUgQmVhY29uIG9yIFByb2JlIFJlc3BvbnNlIGZyYW1lCiAgKiBAaWVzX2xlbjogTGVuZ3RoIG9mIGllcyBidWZmZXIgaW4gb2N0ZXRzCiAgKiBAc2Nhbl9yZXM6IFdoZXRoZXIgdGhpcyB3YXMgYmFzZWQgb24gc2NhbiByZXN1bHRzCkBAIC02MjcsMTMgKzY0MSwxNSBAQAogICogbGlrZSBQcm92aXNpb24gRGlzY292ZXJ5IFJlcXVlc3QgdGhhdCBjb250YWlucyBQMlAgQ2FwYWJpbGl0eSBhbmQgUDJQIERldmljZQogICogSW5mbyBhdHRyaWJ1dGVzLgogICovCi1pbnQgcDJwX2FkZF9kZXZpY2Uoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICphZGRyLCBpbnQgZnJlcSwgaW50IGxldmVsLAotCQkgICBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbiwgaW50IHNjYW5fcmVzKQoraW50IHAycF9hZGRfZGV2aWNlKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqYWRkciwgaW50IGZyZXEsCisJCSAgIHVuc2lnbmVkIGludCBhZ2VfbXMsIGludCBsZXZlbCwgY29uc3QgdTggKmllcywKKwkJICAgc2l6ZV90IGllc19sZW4sIGludCBzY2FuX3JlcykKIHsKIAlzdHJ1Y3QgcDJwX2RldmljZSAqZGV2OwogCXN0cnVjdCBwMnBfbWVzc2FnZSBtc2c7CiAJY29uc3QgdTggKnAycF9kZXZfYWRkcjsKIAlpbnQgaTsKKwlzdHJ1Y3Qgb3NfdGltZSB0aW1lX25vdywgdGltZV90bXBfYWdlLCBlbnRyeV90czsKIAogCW9zX21lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAJaWYgKHAycF9wYXJzZV9pZXMoaWVzLCBpZXNfbGVuLCAmbXNnKSkgewpAQCAtNjYwLDYgKzY3Niw3IEBACiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogRG8gbm90IGFkZCBwZWVyICIKIAkJCSJmaWx0ZXIgZm9yICIgTUFDU1RSICIgZHVlIHRvIHBlZXIgZmlsdGVyIiwKIAkJCU1BQzJTVFIocDJwX2Rldl9hZGRyKSk7CisJCXAycF9wYXJzZV9mcmVlKCZtc2cpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY2OCw3ICs2ODUsMjQgQEAKIAkJcDJwX3BhcnNlX2ZyZWUoJm1zZyk7CiAJCXJldHVybiAtMTsKIAl9Ci0Jb3NfZ2V0X3RpbWUoJmRldi0+bGFzdF9zZWVuKTsKKworCW9zX2dldF90aW1lKCZ0aW1lX25vdyk7CisJdGltZV90bXBfYWdlLnNlYyA9IGFnZV9tcyAvIDEwMDA7CisJdGltZV90bXBfYWdlLnVzZWMgPSAoYWdlX21zICUgMTAwMCkgKiAxMDAwOworCW9zX3RpbWVfc3ViKCZ0aW1lX25vdywgJnRpbWVfdG1wX2FnZSwgJmVudHJ5X3RzKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBkZXZpY2UgZW50cnkgb25seSBpZiB0aGUgbmV3IHBlZXIKKwkgKiBlbnRyeSBpcyBuZXdlciB0aGFuIHRoZSBvbmUgcHJldmlvdXNseSBzdG9yZWQuCisJICovCisJaWYgKGRldi0+bGFzdF9zZWVuLnVzZWMgPiAwICYmCisJICAgIG9zX3RpbWVfYmVmb3JlKCZlbnRyeV90cywgJmRldi0+bGFzdF9zZWVuKSkgeworCQlwMnBfcGFyc2VfZnJlZSgmbXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9zX21lbWNweSgmZGV2LT5sYXN0X3NlZW4sICZlbnRyeV90cywgc2l6ZW9mKHN0cnVjdCBvc190aW1lKSk7CisKIAlkZXYtPmZsYWdzICY9IH4oUDJQX0RFVl9QUk9CRV9SRVFfT05MWSB8IFAyUF9ERVZfR1JPVVBfQ0xJRU5UX09OTFkpOwogCiAJaWYgKG9zX21lbWNtcChhZGRyLCBwMnBfZGV2X2FkZHIsIEVUSF9BTEVOKSAhPSAwKQpAQCAtMTExMCw3ICsxMTQ0LDkgQEAKIAl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFN0b3BwaW5nIGZpbmQiKTsKIAllbG9vcF9jYW5jZWxfdGltZW91dChwMnBfZmluZF90aW1lb3V0LCBwMnAsIE5VTEwpOwogCXAycF9jbGVhcl90aW1lb3V0KHAycCk7Ci0JaWYgKHAycC0+c3RhdGUgPT0gUDJQX1NFQVJDSCkKKwlpZiAocDJwLT5zdGF0ZSA9PSBQMlBfU0VBUkNIIHx8CisJICAgIHAycC0+c3RhdGUgPT0gUDJQX0NPTlRJTlVFX1NFQVJDSF9XSEVOX1JFQURZIHx8CisJICAgIHAycC0+c3RhdGUgPT0gUDJQX1NFQVJDSF9XSEVOX1JFQURZKQogCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfSU5GTywgUDJQX0VWRU5UX0ZJTkRfU1RPUFBFRCk7CiAJcDJwX3NldF9zdGF0ZShwMnAsIFAyUF9JRExFKTsKIAlwMnBfZnJlZV9yZXFfZGV2X3R5cGVzKHAycCk7CkBAIC0xMTUzLDEwMyArMTE4OSwxMTUgQEAKIH0KIAogCi1zdGF0aWMgaW50IHAycF9wcmVwYXJlX2NoYW5uZWwoc3RydWN0IHAycF9kYXRhICpwMnAsIHVuc2lnbmVkIGludCBmb3JjZV9mcmVxKQorc3RhdGljIGludCBwMnBfcHJlcGFyZV9jaGFubmVsX3ByZWYoc3RydWN0IHAycF9kYXRhICpwMnAsCisJCQkJICAgIHVuc2lnbmVkIGludCBmb3JjZV9mcmVxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcHJlZl9mcmVxKQogeworCXU4IG9wX2NsYXNzLCBvcF9jaGFubmVsOworCXVuc2lnbmVkIGludCBmcmVxID0gZm9yY2VfZnJlcSA/IGZvcmNlX2ZyZXEgOiBwcmVmX2ZyZXE7CisKKwlpZiAocDJwX2ZyZXFfdG9fY2hhbm5lbChwMnAtPmNmZy0+Y291bnRyeSwgZnJlcSwKKwkJCQkmb3BfY2xhc3MsICZvcF9jaGFubmVsKSA8IDApIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAorCQkJIlAyUDogVW5zdXBwb3J0ZWQgZnJlcXVlbmN5ICV1IE1IeiIsIGZyZXEpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFwMnBfY2hhbm5lbHNfaW5jbHVkZXMoJnAycC0+Y2ZnLT5jaGFubmVscywgb3BfY2xhc3MsIG9wX2NoYW5uZWwpKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCSJQMlA6IEZyZXF1ZW5jeSAldSBNSHogKG9wZXJfY2xhc3MgJXUgY2hhbm5lbCAldSkgbm90ICIKKwkJCSJhbGxvd2VkIGZvciBQMlAiLCBmcmVxLCBvcF9jbGFzcywgb3BfY2hhbm5lbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwMnAtPm9wX3JlZ19jbGFzcyA9IG9wX2NsYXNzOworCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7CisKIAlpZiAoZm9yY2VfZnJlcSkgewotCQl1OCBvcF9yZWdfY2xhc3MsIG9wX2NoYW5uZWw7Ci0JCWlmIChwMnBfZnJlcV90b19jaGFubmVsKHAycC0+Y2ZnLT5jb3VudHJ5LCBmb3JjZV9mcmVxLAotCQkJCQkmb3BfcmVnX2NsYXNzLCAmb3BfY2hhbm5lbCkgPCAwKSB7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogVW5zdXBwb3J0ZWQgZnJlcXVlbmN5ICV1IE1IeiIsCi0JCQkJZm9yY2VfZnJlcSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFwMnBfY2hhbm5lbHNfaW5jbHVkZXMoJnAycC0+Y2ZnLT5jaGFubmVscywgb3BfcmVnX2NsYXNzLAotCQkJCQkgICBvcF9jaGFubmVsKSkgewotCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAotCQkJCSJQMlA6IEZyZXF1ZW5jeSAldSBNSHogKG9wZXJfY2xhc3MgJXUgIgotCQkJCSJjaGFubmVsICV1KSBub3QgYWxsb3dlZCBmb3IgUDJQIiwKLQkJCQlmb3JjZV9mcmVxLCBvcF9yZWdfY2xhc3MsIG9wX2NoYW5uZWwpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfcmVnX2NsYXNzOwotCQlwMnAtPm9wX2NoYW5uZWwgPSBvcF9jaGFubmVsOwotI2lmbmRlZiBBTkRST0lEX1AyUAogCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc2VzID0gMTsKIAkJcDJwLT5jaGFubmVscy5yZWdfY2xhc3NbMF0uY2hhbm5lbHMgPSAxOwogCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc1swXS5yZWdfY2xhc3MgPSBwMnAtPm9wX3JlZ19jbGFzczsKIAkJcDJwLT5jaGFubmVscy5yZWdfY2xhc3NbMF0uY2hhbm5lbFswXSA9IHAycC0+b3BfY2hhbm5lbDsKLSNlbHNlCi0JCWlmKHAycC0+Y2ZnLT5wMnBfY29uY3VycmVuY3kgPT0gUDJQX01VTFRJX0NIQU5ORUxfQ09OQ1VSUkVOVCkgewotCQkJLyogV2Ugd2UgYXJlIHJlcXVlc3RpbmcgZm9yIGEgcHJlZmVycmVkIGNoYW5uZWwuIEJ1dCBzaW5jZQotCQkJICogYXJlIG11bHRpY2hhbm5lbCBjb25jdXJyZW50LCB3ZSBoYXZlIHRvIHBvcGx1bGF0ZSB0aGUKLQkJCSAqIHAycF9jaGFubmVscyB3aXRoIGxpc3Qgb2YgY2hhbm5lbHMgdGhhdCB3ZSBzdXBwb3J0LgotCQkJICovCi0jaWZkZWYgQU5EUk9JRF9QMlAKLQkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIkZ1bGwgY2hhbm5lbCBsaXN0Iik7Ci0jZW5kaWYKLQkJCW9zX21lbWNweSgmcDJwLT5jaGFubmVscywgJnAycC0+Y2ZnLT5jaGFubmVscywKLQkJCQlzaXplb2Yoc3RydWN0IHAycF9jaGFubmVscykpOwotCQl9IGVsc2UgewotI2lmZGVmIEFORFJPSURfUDJQCi0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJTaW5nbGUgY2hhbm5lbCBsaXN0ICVkIiwgcDJwLT5vcF9jaGFubmVsKTsKLSNlbmRpZgotCQkJcDJwLT5jaGFubmVscy5yZWdfY2xhc3NlcyA9IDE7Ci0JCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc1swXS5jaGFubmVscyA9IDE7Ci0JCQlwMnAtPmNoYW5uZWxzLnJlZ19jbGFzc1swXS5yZWdfY2xhc3MgPSBwMnAtPm9wX3JlZ19jbGFzczsKLQkJCXAycC0+Y2hhbm5lbHMucmVnX2NsYXNzWzBdLmNoYW5uZWxbMF0gPSBwMnAtPm9wX2NoYW5uZWw7Ci0JCX0KLSNlbmRpZgogCX0gZWxzZSB7Ci0JCXU4IG9wX3JlZ19jbGFzcywgb3BfY2hhbm5lbDsKLQotCQlpZiAoIXAycC0+Y2ZnLT5jZmdfb3BfY2hhbm5lbCAmJiBwMnAtPmJlc3RfZnJlcV9vdmVyYWxsID4gMCAmJgotCQkgICAgcDJwX3N1cHBvcnRlZF9mcmVxKHAycCwgcDJwLT5iZXN0X2ZyZXFfb3ZlcmFsbCkgJiYKLQkJICAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksCi0JCQkJCXAycC0+YmVzdF9mcmVxX292ZXJhbGwsCi0JCQkJCSZvcF9yZWdfY2xhc3MsICZvcF9jaGFubmVsKSA9PSAwKSB7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogU2VsZWN0IGJlc3Qgb3ZlcmFsbCBjaGFubmVsIGFzICIKLQkJCQkib3BlcmF0aW5nIGNoYW5uZWwgcHJlZmVyZW5jZSIpOwotCQkJcDJwLT5vcF9yZWdfY2xhc3MgPSBvcF9yZWdfY2xhc3M7Ci0JCQlwMnAtPm9wX2NoYW5uZWwgPSBvcF9jaGFubmVsOwotCQl9IGVsc2UgaWYgKCFwMnAtPmNmZy0+Y2ZnX29wX2NoYW5uZWwgJiYgcDJwLT5iZXN0X2ZyZXFfNSA+IDAgJiYKLQkJCSAgIHAycF9zdXBwb3J0ZWRfZnJlcShwMnAsIHAycC0+YmVzdF9mcmVxXzUpICYmCi0JCQkgICBwMnBfZnJlcV90b19jaGFubmVsKHAycC0+Y2ZnLT5jb3VudHJ5LAotCQkJCQkgICAgICAgcDJwLT5iZXN0X2ZyZXFfNSwKLQkJCQkJICAgICAgICZvcF9yZWdfY2xhc3MsICZvcF9jaGFubmVsKSA9PQotCQkJICAgMCkgewotCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAotCQkJCSJQMlA6IFNlbGVjdCBiZXN0IDUgR0h6IGNoYW5uZWwgYXMgIgotCQkJCSJvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJlbmNlIik7Ci0JCQlwMnAtPm9wX3JlZ19jbGFzcyA9IG9wX3JlZ19jbGFzczsKLQkJCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7Ci0JCX0gZWxzZSBpZiAoIXAycC0+Y2ZnLT5jZmdfb3BfY2hhbm5lbCAmJgotCQkJICAgcDJwLT5iZXN0X2ZyZXFfMjQgPiAwICYmCi0JCQkgICBwMnBfc3VwcG9ydGVkX2ZyZXEocDJwLCBwMnAtPmJlc3RfZnJlcV8yNCkgJiYKLQkJCSAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksCi0JCQkJCSAgICAgICBwMnAtPmJlc3RfZnJlcV8yNCwKLQkJCQkJICAgICAgICZvcF9yZWdfY2xhc3MsICZvcF9jaGFubmVsKSA9PQotCQkJICAgMCkgewotCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAotCQkJCSJQMlA6IFNlbGVjdCBiZXN0IDIuNCBHSHogY2hhbm5lbCBhcyAiCi0JCQkJIm9wZXJhdGluZyBjaGFubmVsIHByZWZlcmVuY2UiKTsKLQkJCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfcmVnX2NsYXNzOwotCQkJcDJwLT5vcF9jaGFubmVsID0gb3BfY2hhbm5lbDsKLQkJfSBlbHNlIHsKLQkJCXAycC0+b3BfcmVnX2NsYXNzID0gcDJwLT5jZmctPm9wX3JlZ19jbGFzczsKLQkJCXAycC0+b3BfY2hhbm5lbCA9IHAycC0+Y2ZnLT5vcF9jaGFubmVsOwotCQl9Ci0KIAkJb3NfbWVtY3B5KCZwMnAtPmNoYW5uZWxzLCAmcDJwLT5jZmctPmNoYW5uZWxzLAogCQkJICBzaXplb2Yoc3RydWN0IHAycF9jaGFubmVscykpOwogCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHAycF9wcmVwYXJlX2NoYW5uZWxfYmVzdChzdHJ1Y3QgcDJwX2RhdGEgKnAycCkKK3sKKwl1OCBvcF9jbGFzcywgb3BfY2hhbm5lbDsKKworCWlmICghcDJwLT5jZmctPmNmZ19vcF9jaGFubmVsICYmIHAycC0+YmVzdF9mcmVxX292ZXJhbGwgPiAwICYmCisJICAgIHAycF9zdXBwb3J0ZWRfZnJlcShwMnAsIHAycC0+YmVzdF9mcmVxX292ZXJhbGwpICYmCisJICAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksIHAycC0+YmVzdF9mcmVxX292ZXJhbGwsCisJCQkJJm9wX2NsYXNzLCAmb3BfY2hhbm5lbCkgPT0gMCkgeworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNlbGVjdCBiZXN0ICIKKwkJCSJvdmVyYWxsIGNoYW5uZWwgYXMgb3BlcmF0aW5nIGNoYW5uZWwgcHJlZmVyZW5jZSIpOworCQlwMnAtPm9wX3JlZ19jbGFzcyA9IG9wX2NsYXNzOworCQlwMnAtPm9wX2NoYW5uZWwgPSBvcF9jaGFubmVsOworCX0gZWxzZSBpZiAoIXAycC0+Y2ZnLT5jZmdfb3BfY2hhbm5lbCAmJiBwMnAtPmJlc3RfZnJlcV81ID4gMCAmJgorCQkgICBwMnBfc3VwcG9ydGVkX2ZyZXEocDJwLCBwMnAtPmJlc3RfZnJlcV81KSAmJgorCQkgICBwMnBfZnJlcV90b19jaGFubmVsKHAycC0+Y2ZnLT5jb3VudHJ5LCBwMnAtPmJlc3RfZnJlcV81LAorCQkJCSAgICAgICAmb3BfY2xhc3MsICZvcF9jaGFubmVsKSA9PSAwKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU2VsZWN0IGJlc3QgNSBHSHogIgorCQkJImNoYW5uZWwgYXMgb3BlcmF0aW5nIGNoYW5uZWwgcHJlZmVyZW5jZSIpOworCQlwMnAtPm9wX3JlZ19jbGFzcyA9IG9wX2NsYXNzOworCQlwMnAtPm9wX2NoYW5uZWwgPSBvcF9jaGFubmVsOworCX0gZWxzZSBpZiAoIXAycC0+Y2ZnLT5jZmdfb3BfY2hhbm5lbCAmJiBwMnAtPmJlc3RfZnJlcV8yNCA+IDAgJiYKKwkJICAgcDJwX3N1cHBvcnRlZF9mcmVxKHAycCwgcDJwLT5iZXN0X2ZyZXFfMjQpICYmCisJCSAgIHAycF9mcmVxX3RvX2NoYW5uZWwocDJwLT5jZmctPmNvdW50cnksIHAycC0+YmVzdF9mcmVxXzI0LAorCQkJCSAgICAgICAmb3BfY2xhc3MsICZvcF9jaGFubmVsKSA9PSAwKSB7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU2VsZWN0IGJlc3QgMi40ICIKKwkJCSJHSHogY2hhbm5lbCBhcyBvcGVyYXRpbmcgY2hhbm5lbCBwcmVmZXJlbmNlIik7CisJCXAycC0+b3BfcmVnX2NsYXNzID0gb3BfY2xhc3M7CisJCXAycC0+b3BfY2hhbm5lbCA9IG9wX2NoYW5uZWw7CisJfSBlbHNlIHsKKwkJcDJwLT5vcF9yZWdfY2xhc3MgPSBwMnAtPmNmZy0+b3BfcmVnX2NsYXNzOworCQlwMnAtPm9wX2NoYW5uZWwgPSBwMnAtPmNmZy0+b3BfY2hhbm5lbDsKKwl9CisKKwlvc19tZW1jcHkoJnAycC0+Y2hhbm5lbHMsICZwMnAtPmNmZy0+Y2hhbm5lbHMsCisJCSAgc2l6ZW9mKHN0cnVjdCBwMnBfY2hhbm5lbHMpKTsKK30KKworCisvKioKKyAqIHAycF9wcmVwYXJlX2NoYW5uZWwgLSBTZWxlY3Qgb3BlcmF0aW5nIGNoYW5uZWwgZm9yIEdPIE5lZ290aWF0aW9uCisgKiBAcDJwOiBQMlAgbW9kdWxlIGNvbnRleHQgZnJvbSBwMnBfaW5pdCgpCisgKiBAZGV2OiBTZWxlY3RlZCBwZWVyIGRldmljZQorICogQGZvcmNlX2ZyZXE6IEZvcmNlZCBmcmVxdWVuY3kgaW4gTUh6IG9yIDAgaWYgbm90IGZvcmNlZAorICogQHByZWZfZnJlcTogUHJlZmVycmVkIGZyZXF1ZW5jeSBpbiBNSHogb3IgMCBpZiBubyBwcmVmZXJlbmNlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKGNoYW5uZWwgbm90IHN1cHBvcnRlZCBmb3IgUDJQKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyBpbml0aWFsIG9wZXJhdGluZyBjaGFubmVsIHNlbGVjdGlvbiBmb3IgR08KKyAqIE5lZ290aWF0aW9uIHByaW9yIHRvIGhhdmluZyByZWNlaXZlZCBwZWVyIGluZm9ybWF0aW9uLiBUaGUgc2VsZWN0ZWQgY2hhbm5lbAorICogbWF5IGJlIGZ1cnRoZXIgb3B0aW1pemVkIGluIHAycF9yZXNlbGVjdF9jaGFubmVsKCkgb25jZSB0aGUgcGVlciBpbmZvcm1hdGlvbgorICogaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IHAycF9wcmVwYXJlX2NoYW5uZWwoc3RydWN0IHAycF9kYXRhICpwMnAsIHN0cnVjdCBwMnBfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEsIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpCit7CisJaWYgKGZvcmNlX2ZyZXEgfHwgcHJlZl9mcmVxKSB7CisJCWlmIChwMnBfcHJlcGFyZV9jaGFubmVsX3ByZWYocDJwLCBmb3JjZV9mcmVxLCBwcmVmX2ZyZXEpIDwgMCkKKwkJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlwMnBfcHJlcGFyZV9jaGFubmVsX2Jlc3QocDJwKTsKKwl9CiAJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkiUDJQOiBPd24gcHJlZmVyZW5jZSBmb3Igb3BlcmF0aW9uIGNoYW5uZWw6ICIKIAkJIk9wZXJhdGluZyBDbGFzcyAldSBDaGFubmVsICV1JXMiLAogCQlwMnAtPm9wX3JlZ19jbGFzcywgcDJwLT5vcF9jaGFubmVsLAogCQlmb3JjZV9mcmVxID8gIiAoZm9yY2VkKSIgOiAiIik7CiAKKwlpZiAoZm9yY2VfZnJlcSkKKwkJZGV2LT5mbGFncyB8PSBQMlBfREVWX0ZPUkNFX0ZSRVE7CisJZWxzZQorCQlkZXYtPmZsYWdzICY9IH5QMlBfREVWX0ZPUkNFX0ZSRVE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI3OSwxOSArMTMyNywxNiBAQAogCQlpbnQgZ29faW50ZW50LCBjb25zdCB1OCAqb3duX2ludGVyZmFjZV9hZGRyLAogCQl1bnNpZ25lZCBpbnQgZm9yY2VfZnJlcSwgaW50IHBlcnNpc3RlbnRfZ3JvdXAsCiAJCWNvbnN0IHU4ICpmb3JjZV9zc2lkLCBzaXplX3QgZm9yY2Vfc3NpZF9sZW4sCi0JCWludCBwZF9iZWZvcmVfZ29fbmVnKQorCQlpbnQgcGRfYmVmb3JlX2dvX25lZywgdW5zaWduZWQgaW50IHByZWZfZnJlcSkKIHsKIAlzdHJ1Y3QgcDJwX2RldmljZSAqZGV2OwogCiAJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkiUDJQOiBSZXF1ZXN0IHRvIHN0YXJ0IGdyb3VwIG5lZ290aWF0aW9uIC0gcGVlcj0iIE1BQ1NUUgogCQkiICBHTyBJbnRlbnQ9JWQgIEludGVuZGVkIEludGVyZmFjZSBBZGRyZXNzPSIgTUFDU1RSCi0JCSIgd3BzX21ldGhvZD0lZCBwZXJzaXN0ZW50X2dyb3VwPSVkIHBkX2JlZm9yZV9nb19uZWc9JWQgZm9yY2VfZnJlcSAlZCIsCisJCSIgd3BzX21ldGhvZD0lZCBwZXJzaXN0ZW50X2dyb3VwPSVkIHBkX2JlZm9yZV9nb19uZWc9JWQiLAogCQlNQUMyU1RSKHBlZXJfYWRkciksIGdvX2ludGVudCwgTUFDMlNUUihvd25faW50ZXJmYWNlX2FkZHIpLAotCQl3cHNfbWV0aG9kLCBwZXJzaXN0ZW50X2dyb3VwLCBwZF9iZWZvcmVfZ29fbmVnLCBmb3JjZV9mcmVxKTsKLQotCWlmIChwMnBfcHJlcGFyZV9jaGFubmVsKHAycCwgZm9yY2VfZnJlcSkgPCAwKQotCQlyZXR1cm4gLTE7CisJCXdwc19tZXRob2QsIHBlcnNpc3RlbnRfZ3JvdXAsIHBkX2JlZm9yZV9nb19uZWcpOwogCiAJZGV2ID0gcDJwX2dldF9kZXZpY2UocDJwLCBwZWVyX2FkZHIpOwogCWlmIChkZXYgPT0gTlVMTCB8fCAoZGV2LT5mbGFncyAmIFAyUF9ERVZfUFJPQkVfUkVRX09OTFkpKSB7CkBAIC0xMzAxLDYgKzEzNDYsOSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKHAycF9wcmVwYXJlX2NoYW5uZWwocDJwLCBkZXYsIGZvcmNlX2ZyZXEsIHByZWZfZnJlcSkgPCAwKQorCQlyZXR1cm4gLTE7CisKIAlpZiAoZGV2LT5mbGFncyAmIFAyUF9ERVZfR1JPVVBfQ0xJRU5UX09OTFkpIHsKIAkJaWYgKCEoZGV2LT5pbmZvLmRldl9jYXBhYiAmCiAJCSAgICAgIFAyUF9ERVZfQ0FQQUJfQ0xJRU5UX0RJU0NPVkVSQUJJTElUWSkpIHsKQEAgLTEzNDAsOCArMTM4OCwxNiBAQAogCWRldi0+ZmxhZ3MgJj0gflAyUF9ERVZfV0FJVF9HT19ORUdfQ09ORklSTTsKIAlpZiAocGRfYmVmb3JlX2dvX25lZykKIAkJZGV2LT5mbGFncyB8PSBQMlBfREVWX1BEX0JFRk9SRV9HT19ORUc7Ci0JZWxzZQorCWVsc2UgewogCQlkZXYtPmZsYWdzICY9IH5QMlBfREVWX1BEX0JFRk9SRV9HT19ORUc7CisJCS8qCisJCSAqIEFzc2lnbiBkaWFsb2cgdG9rZW4gaGVyZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgaW4gZWFjaAorCQkgKiByZXRyeSB3aXRoaW4gdGhlIHNhbWUgR08gTmVnb3RpYXRpb24gZXhjaGFuZ2UuCisJCSAqLworCQlkZXYtPmRpYWxvZ190b2tlbisrOworCQlpZiAoZGV2LT5kaWFsb2dfdG9rZW4gPT0gMCkKKwkJCWRldi0+ZGlhbG9nX3Rva2VuID0gMTsKKwl9CiAJZGV2LT5jb25uZWN0X3JlcXMgPSAwOwogCWRldi0+Z29fbmVnX3JlcV9zZW50ID0gMDsKIAlkZXYtPmdvX3N0YXRlID0gVU5LTk9XTl9HTzsKQEAgLTEzNjgsMTEgKzE0MjQsNiBAQAogCWRldi0+d3BzX21ldGhvZCA9IHdwc19tZXRob2Q7CiAJZGV2LT5zdGF0dXMgPSBQMlBfU0NfU1VDQ0VTUzsKIAotCWlmIChmb3JjZV9mcmVxKQotCQlkZXYtPmZsYWdzIHw9IFAyUF9ERVZfRk9SQ0VfRlJFUTsKLQllbHNlCi0JCWRldi0+ZmxhZ3MgJj0gflAyUF9ERVZfRk9SQ0VfRlJFUTsKLQogCWlmIChwMnAtPnAycF9zY2FuX3J1bm5pbmcpIHsKIAkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkJIlAyUDogcDJwX3NjYW4gcnVubmluZyAtIGRlbGF5IGNvbm5lY3Qgc2VuZCIpOwpAQCAtMTM5MCw3ICsxNDQxLDggQEAKIAkJICBlbnVtIHAycF93cHNfbWV0aG9kIHdwc19tZXRob2QsCiAJCSAgaW50IGdvX2ludGVudCwgY29uc3QgdTggKm93bl9pbnRlcmZhY2VfYWRkciwKIAkJICB1bnNpZ25lZCBpbnQgZm9yY2VfZnJlcSwgaW50IHBlcnNpc3RlbnRfZ3JvdXAsCi0JCSAgY29uc3QgdTggKmZvcmNlX3NzaWQsIHNpemVfdCBmb3JjZV9zc2lkX2xlbikKKwkJICBjb25zdCB1OCAqZm9yY2Vfc3NpZCwgc2l6ZV90IGZvcmNlX3NzaWRfbGVuLAorCQkgIHVuc2lnbmVkIGludCBwcmVmX2ZyZXEpCiB7CiAJc3RydWN0IHAycF9kZXZpY2UgKmRldjsKIApAQCAtMTQwMSw5ICsxNDUzLDYgQEAKIAkJTUFDMlNUUihwZWVyX2FkZHIpLCBnb19pbnRlbnQsIE1BQzJTVFIob3duX2ludGVyZmFjZV9hZGRyKSwKIAkJd3BzX21ldGhvZCwgcGVyc2lzdGVudF9ncm91cCk7CiAKLQlpZiAocDJwX3ByZXBhcmVfY2hhbm5lbChwMnAsIGZvcmNlX2ZyZXEpIDwgMCkKLQkJcmV0dXJuIC0xOwotCiAJZGV2ID0gcDJwX2dldF9kZXZpY2UocDJwLCBwZWVyX2FkZHIpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCkBAIC0xNDEyLDYgKzE0NjEsOSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKHAycF9wcmVwYXJlX2NoYW5uZWwocDJwLCBkZXYsIGZvcmNlX2ZyZXEsIHByZWZfZnJlcSkgPCAwKQorCQlyZXR1cm4gLTE7CisKIAlwMnAtPnNzaWRfc2V0ID0gMDsKIAlpZiAoZm9yY2Vfc3NpZCkgewogCQl3cGFfaGV4ZHVtcF9hc2NpaShNU0dfREVCVUcsICJQMlA6IEZvcmNlZCBTU0lEIiwKQEAgLTE0MzIsMTEgKzE0ODQsNiBAQAogCWRldi0+d3BzX21ldGhvZCA9IHdwc19tZXRob2Q7CiAJZGV2LT5zdGF0dXMgPSBQMlBfU0NfU1VDQ0VTUzsKIAotCWlmIChmb3JjZV9mcmVxKQotCQlkZXYtPmZsYWdzIHw9IFAyUF9ERVZfRk9SQ0VfRlJFUTsKLQllbHNlCi0JCWRldi0+ZmxhZ3MgJj0gflAyUF9ERVZfRk9SQ0VfRlJFUTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yNDE2LDYgKzI0NjMsNyBAQAogCXAycC0+bWluX2Rpc2NfaW50ID0gMTsKICNlbmRpZgogCXAycC0+bWF4X2Rpc2NfaW50ID0gMzsKKwlwMnAtPm1heF9kaXNjX3R1ID0gLTE7CiAKIAlvc19nZXRfcmFuZG9tKCZwMnAtPm5leHRfdGllX2JyZWFrZXIsIDEpOwogCXAycC0+bmV4dF90aWVfYnJlYWtlciAmPSAweDAxOwpAQCAtMjcxMiw3ICsyNzYwLDcgQEAKIAkJfQogCX0KIAotCXAycF9saXN0ZW5faW5fZmluZChwMnApOworCXAycF9saXN0ZW5faW5fZmluZChwMnAsIDEpOwogfQogCiAKQEAgLTI3NTgsOCArMjgwNiw3IEBACiAKIAkvKgogCSAqIFJldHJ5IHRoZSBwcm92IGRpc2MgcmVxIGF0dGVtcHQgb25seSBmb3IgdGhlIHBlZXIgdGhhdCB0aGUgdXNlciBoYWQKLQkgKiByZXF1ZXN0ZWQgZm9yIGFuZCBwcm92aWRlZCBhIGpvaW4gaGFzIG5vdCBiZWVuIGluaXRpYXRlZCBvbiBpdAotCSAqIGluIHRoZSBtZWFudGltZS4KKwkgKiByZXF1ZXN0ZWQuCiAJICovCiAKIAlkbF9saXN0X2Zvcl9lYWNoKGRldiwgJnAycC0+ZGV2aWNlcywgc3RydWN0IHAycF9kZXZpY2UsIGxpc3QpIHsKQEAgLTI3NjgsMTUgKzI4MTUsMTQgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIWRldi0+cmVxX2NvbmZpZ19tZXRob2RzKQogCQkJY29udGludWU7Ci0JCWlmIChkZXYtPmZsYWdzICYgUDJQX0RFVl9QRF9GT1JfSk9JTikKLQkJCWNvbnRpbnVlOwogCiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogU2VuZCAiCiAJCQkicGVuZGluZyBQcm92aXNpb24gRGlzY292ZXJ5IFJlcXVlc3QgdG8gIgogCQkJTUFDU1RSICIgKGNvbmZpZyBtZXRob2RzIDB4JXgpIiwKIAkJCU1BQzJTVFIoZGV2LT5pbmZvLnAycF9kZXZpY2VfYWRkciksCiAJCQlkZXYtPnJlcV9jb25maWdfbWV0aG9kcyk7Ci0JCXAycF9zZW5kX3Byb3ZfZGlzY19yZXEocDJwLCBkZXYsIDAsIDApOworCQlwMnBfc2VuZF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LAorCQkJCSAgICAgICBkZXYtPmZsYWdzICYgUDJQX0RFVl9QRF9GT1JfSk9JTiwgMCk7CiAJCXJldHVybjsKIAl9CiB9CkBAIC0yODQxLDkgKzI4ODcsMTAgQEAKIAogCiBpbnQgcDJwX3NjYW5fcmVzX2hhbmRsZXIoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICpic3NpZCwgaW50IGZyZXEsCi0JCQkgaW50IGxldmVsLCBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbikKKwkJCSB1bnNpZ25lZCBpbnQgYWdlLCBpbnQgbGV2ZWwsIGNvbnN0IHU4ICppZXMsCisJCQkgc2l6ZV90IGllc19sZW4pCiB7Ci0JcDJwX2FkZF9kZXZpY2UocDJwLCBic3NpZCwgZnJlcSwgbGV2ZWwsIGllcywgaWVzX2xlbiwgMSk7CisJcDJwX2FkZF9kZXZpY2UocDJwLCBic3NpZCwgZnJlcSwgYWdlLCBsZXZlbCwgaWVzLCBpZXNfbGVuLCAxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzE5OCw3ICszMjQ1LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlwMnBfc2V0X3N0YXRlKHAycCwgUDJQX0NPTk5FQ1RfTElTVEVOKTsKLQlwMnBfbGlzdGVuX2luX2ZpbmQocDJwKTsKKwlwMnBfbGlzdGVuX2luX2ZpbmQocDJwLCAwKTsKIH0KIAogCkBAIC0zMjYyLDcgKzMzMDksNyBAQAogCQkiUDJQOiBHbyB0byBMaXN0ZW4gc3RhdGUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHBlZXIgdG8gYmVjb21lICIKIAkJInJlYWR5IGZvciBHTyBOZWdvdGlhdGlvbiIpOwogCXAycF9zZXRfc3RhdGUocDJwLCBQMlBfV0FJVF9QRUVSX0NPTk5FQ1QpOwotCXAycF9saXN0ZW5faW5fZmluZChwMnApOworCXAycF9saXN0ZW5faW5fZmluZChwMnAsIDApOwogfQogCiAKQEAgLTMzMDcsOSArMzM1NCwyMyBAQAogCQlwMnAtPnBkX3JldHJpZXMtLTsKIAkJcDJwX3JldHJ5X3BkKHAycCk7CiAJfSBlbHNlIHsKKwkJc3RydWN0IHAycF9kZXZpY2UgKmRldjsKKwkJaW50IGZvcl9qb2luID0gMDsKKworCQlkbF9saXN0X2Zvcl9lYWNoKGRldiwgJnAycC0+ZGV2aWNlcywgc3RydWN0IHAycF9kZXZpY2UsIGxpc3QpIHsKKwkJCWlmIChvc19tZW1jbXAocDJwLT5wZW5kaW5nX3BkX2RldmFkZHIsCisJCQkJICAgICAgZGV2LT5pbmZvLnAycF9kZXZpY2VfYWRkciwgRVRIX0FMRU4pICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoZGV2LT5yZXFfY29uZmlnX21ldGhvZHMgJiYKKwkJCSAgICAoZGV2LT5mbGFncyAmIFAyUF9ERVZfUERfRk9SX0pPSU4pKQorCQkJCWZvcl9qb2luID0gMTsKKwkJfQorCiAJCWlmIChwMnAtPmNmZy0+cHJvdl9kaXNjX2ZhaWwpCiAJCQlwMnAtPmNmZy0+cHJvdl9kaXNjX2ZhaWwocDJwLT5jZmctPmNiX2N0eCwKIAkJCQkJCSBwMnAtPnBlbmRpbmdfcGRfZGV2YWRkciwKKwkJCQkJCSBmb3Jfam9pbiA/CisJCQkJCQkgUDJQX1BST1ZfRElTQ19USU1FT1VUX0pPSU4gOgogCQkJCQkJIFAyUF9QUk9WX0RJU0NfVElNRU9VVCk7CiAJCXAycF9yZXNldF9wZW5kaW5nX3BkKHAycCk7CiAJfQpAQCAtMzMzMCw3ICszMzkxLDcgQEAKIAkJcDJwX3NldF90aW1lb3V0KHAycCwgMCwgMTAwMDAwKTsKIAkJcmV0dXJuOwogCX0KLQlwMnBfbGlzdGVuX2luX2ZpbmQocDJwKTsKKwlwMnBfbGlzdGVuX2luX2ZpbmQocDJwLCAwKTsKIH0KIAogCkBAIC00Mzg0LDMgKzQ0NDUsMjAgQEAKIH0KIAogI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KKworCitpbnQgcDJwX3NldF9kaXNjX2ludChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgaW50IG1pbl9kaXNjX2ludCwgaW50IG1heF9kaXNjX2ludCwKKwkJICAgICBpbnQgbWF4X2Rpc2NfdHUpCit7CisJaWYgKG1pbl9kaXNjX2ludCA+IG1heF9kaXNjX2ludCB8fCBtaW5fZGlzY19pbnQgPCAwIHx8IG1heF9kaXNjX2ludCA8IDApCisJCXJldHVybiAtMTsKKworCXAycC0+bWluX2Rpc2NfaW50ID0gbWluX2Rpc2NfaW50OworCXAycC0+bWF4X2Rpc2NfaW50ID0gbWF4X2Rpc2NfaW50OworCXAycC0+bWF4X2Rpc2NfdHUgPSBtYXhfZGlzY190dTsKKwl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNldCBkaXNjb3ZlcmFibGUgaW50ZXJ2YWw6ICIKKwkJIm1pbj0lZCBtYXg9JWQgbWF4X3R1PSVkIiwgbWluX2Rpc2NfaW50LCBtYXhfZGlzY19pbnQsCisJCW1heF9kaXNjX3R1KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3AycC9wMnAuaCBiL3NyYy9wMnAvcDJwLmgKaW5kZXggYjgwZjg5OC4uMThlNzMzYiAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnAuaAorKysgYi9zcmMvcDJwL3AycC5oCkBAIC05Miw2ICs5MiwxNiBAQAogCXNpemVfdCBzc2lkX2xlbjsKIAogCS8qKgorCSAqIHBzayAtIFdQQSBwcmUtc2hhcmVkIGtleSAoMjU2IGJpdHMpIChHTyBvbmx5KQorCSAqLworCXU4IHBza1szMl07CisKKwkvKioKKwkgKiBwc2tfc2V0IC0gV2hldGhlciBQU0sgZmllbGQgaXMgY29uZmlndXJlZCAoR08gb25seSkKKwkgKi8KKwlpbnQgcHNrX3NldDsKKworCS8qKgogCSAqIHBhc3NwaHJhc2UgLSBXUEEyLVBlcnNvbmFsIHBhc3NwaHJhc2UgZm9yIHRoZSBncm91cCAoR08gb25seSkKIAkgKi8KIAljaGFyIHBhc3NwaHJhc2VbNjRdOwpAQCAtMjI3LDYgKzIzNyw3IEBACiAJUDJQX1BST1ZfRElTQ19TVUNDRVNTLAogCVAyUF9QUk9WX0RJU0NfVElNRU9VVCwKIAlQMlBfUFJPVl9ESVNDX1JFSkVDVEVELAorCVAyUF9QUk9WX0RJU0NfVElNRU9VVF9KT0lOLAogfTsKIAogc3RydWN0IHAycF9jaGFubmVsIHsKQEAgLTM1OSw2ICszNzAsMTEgQEAKIAkgKi8KIAlzaXplX3Qgc3NpZF9wb3N0Zml4X2xlbjsKIAorCS8qKgorCSAqIG1heF9saXN0ZW4gLSBNYXhpbXVtIGxpc3RlbiBkdXJhdGlvbiBpbiBtcworCSAqLworCXVuc2lnbmVkIGludCBtYXhfbGlzdGVuOworCiAjaWZkZWYgQU5EUk9JRF9QMlAKIAllbnVtIHAycF9jb25jdXJyZW5jeV90eXBlIHsKIAkJUDJQX05PTl9DT05DVVJSRU5ULApAQCAtOTAyLDYgKzkxOCw4IEBACiAgKiBAcGRfYmVmb3JlX2dvX25lZzogV2hldGhlciB0byBzZW5kIFByb3Zpc2lvbiBEaXNjb3ZlcnkgcHJpb3IgdG8gR08KICAqCU5lZ290aWF0aW9uIGFzIGFuIGludGVyb3BlcmFiaWxpdHkgd29ya2Fyb3VuZCB3aGVuIGluaXRpYXRpbmcgZ3JvdXAKICAqCWZvcm1hdGlvbgorICogQHByZWZfZnJlcTogUHJlZmVycmVkIG9wZXJhdGluZyBmcmVxdWVuY3kgaW4gTUh6IG9yIDAgKHRoaXMgaXMgb25seSB1c2VkIGlmCisgKglmb3JjZV9mcmVxID09IDApCiAgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKICAqLwogaW50IHAycF9jb25uZWN0KHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqcGVlcl9hZGRyLApAQCAtOTA5LDcgKzkyNyw3IEBACiAJCWludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCXVuc2lnbmVkIGludCBmb3JjZV9mcmVxLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKIAkJY29uc3QgdTggKmZvcmNlX3NzaWQsIHNpemVfdCBmb3JjZV9zc2lkX2xlbiwKLQkJaW50IHBkX2JlZm9yZV9nb19uZWcpOworCQlpbnQgcGRfYmVmb3JlX2dvX25lZywgdW5zaWduZWQgaW50IHByZWZfZnJlcSk7CiAKIC8qKgogICogcDJwX2F1dGhvcml6ZSAtIEF1dGhvcml6ZSBQMlAgZ3JvdXAgZm9ybWF0aW9uIChHTyBuZWdvdGlhdGlvbikKQEAgLTkyNSw2ICs5NDMsOCBAQAogICogQGZvcmNlX3NzaWQ6IEZvcmNlZCBTU0lEIGZvciB0aGUgZ3JvdXAgaWYgd2UgYmVjb21lIEdPIG9yICVOVUxMIHRvIGdlbmVyYXRlCiAgKglhIG5ldyBTU0lECiAgKiBAZm9yY2Vfc3NpZF9sZW46IExlbmd0aCBvZiAkZm9yY2Vfc3NpZCBidWZmZXIKKyAqIEBwcmVmX2ZyZXE6IFByZWZlcnJlZCBvcGVyYXRpbmcgZnJlcXVlbmN5IGluIE1IeiBvciAwICh0aGlzIGlzIG9ubHkgdXNlZCBpZgorICoJZm9yY2VfZnJlcSA9PSAwKQogICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCiAgKgogICogVGhpcyBpcyBsaWtlIHAycF9jb25uZWN0KCksIGJ1dCB0aGUgYWN0dWFsIGdyb3VwIG5lZ290aWF0aW9uIGlzIG5vdApAQCAtOTM0LDcgKzk1NCw4IEBACiAJCSAgZW51bSBwMnBfd3BzX21ldGhvZCB3cHNfbWV0aG9kLAogCQkgIGludCBnb19pbnRlbnQsIGNvbnN0IHU4ICpvd25faW50ZXJmYWNlX2FkZHIsCiAJCSAgdW5zaWduZWQgaW50IGZvcmNlX2ZyZXEsIGludCBwZXJzaXN0ZW50X2dyb3VwLAotCQkgIGNvbnN0IHU4ICpmb3JjZV9zc2lkLCBzaXplX3QgZm9yY2Vfc3NpZF9sZW4pOworCQkgIGNvbnN0IHU4ICpmb3JjZV9zc2lkLCBzaXplX3QgZm9yY2Vfc3NpZF9sZW4sCisJCSAgdW5zaWduZWQgaW50IHByZWZfZnJlcSk7CiAKIC8qKgogICogcDJwX3JlamVjdCAtIFJlamVjdCBwZWVyIGRldmljZSAoZXhwbGljaXRseSBibG9jayBjb25uZWN0aW9uIGF0dGVtcHRzKQpAQCAtOTUxLDYgKzk3Miw3IEBACiAgKiBAY29uZmlnX21ldGhvZHM6IFdQUyBDb25maWcgTWV0aG9kcyB2YWx1ZSAob25seSBvbmUgYml0IHNldCkKICAqIEBqb2luOiBXaGV0aGVyIHRoaXMgaXMgdXNlZCBieSBhIGNsaWVudCBqb2luaW5nIGFuIGFjdGl2ZSBncm91cAogICogQGZvcmNlX2ZyZXE6IEZvcmNlZCBUWCBmcmVxdWVuY3kgZm9yIHRoZSBmcmFtZSAobWFpbmx5IGZvciB0aGUgam9pbiBjYXNlKQorICogQHVzZXJfaW5pdGlhdGVkX3BkOiBGbGFnIHRvIGluZGljYXRlIGlmIGluaXRpYXRlZCBieSB1c2VyIG9yIG5vdAogICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCiAgKgogICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGEgZGlzY292ZXJlZCBQMlAgcGVlciB0byBkaXNwbGF5IGEgUElOCkBAIC05NjIsNyArOTg0LDggQEAKICAqIGluZGljYXRlZCB3aXRoIHRoZSBwMnBfY29uZmlnOjpwcm92X2Rpc2NfcmVzcCgpIGNhbGxiYWNrLgogICovCiBpbnQgcDJwX3Byb3ZfZGlzY19yZXEoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICpwZWVyX2FkZHIsCi0JCSAgICAgIHUxNiBjb25maWdfbWV0aG9kcywgaW50IGpvaW4sIGludCBmb3JjZV9mcmVxKTsKKwkJICAgICAgdTE2IGNvbmZpZ19tZXRob2RzLCBpbnQgam9pbiwgaW50IGZvcmNlX2ZyZXEsCisJCSAgICAgIGludCB1c2VyX2luaXRpYXRlZF9wZCk7CiAKIC8qKgogICogcDJwX3NkX3JlcXVlc3QgLSBTY2hlZHVsZSBhIHNlcnZpY2UgZGlzY292ZXJ5IHF1ZXJ5CkBAIC0xMTc3LDYgKzEyMDAsNyBAQAogICogQHAycDogUDJQIG1vZHVsZSBjb250ZXh0IGZyb20gcDJwX2luaXQoKQogICogQGJzc2lkOiBCU1NJRCBvZiB0aGUgc2NhbiByZXN1bHQKICAqIEBmcmVxOiBGcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIGRldmljZSB3YXMgZm91bmQgaW4gTUh6CisgKiBAYWdlOiBBZ2Ugb2YgdGhlIHNjYW4gcmVzdWx0IGluIG1pbGxpc2Vjb25kcwogICogQGxldmVsOiBTaWduYWwgbGV2ZWwgKHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgQmVhY29uL1Byb2JlIFJlc3BvbnNlCiAgKglmcmFtZSkKICAqIEBpZXM6IFBvaW50ZXIgdG8gSUVzIGZyb20gdGhlIHNjYW4gcmVzdWx0CkBAIC0xMTk4LDcgKzEyMjIsOCBAQAogICogc3RhcnQgb2YgYSBwZW5kaW5nIG9wZXJhdGlvbiwgZS5nLiwgdG8gc3RhcnQgYSBwZW5kaW5nIEdPIG5lZ290aWF0aW9uLgogICovCiBpbnQgcDJwX3NjYW5fcmVzX2hhbmRsZXIoc3RydWN0IHAycF9kYXRhICpwMnAsIGNvbnN0IHU4ICpic3NpZCwgaW50IGZyZXEsCi0JCQkgaW50IGxldmVsLCBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbik7CisJCQkgdW5zaWduZWQgaW50IGFnZSwgaW50IGxldmVsLCBjb25zdCB1OCAqaWVzLAorCQkJIHNpemVfdCBpZXNfbGVuKTsKIAogLyoqCiAgKiBwMnBfc2Nhbl9yZXNfaGFuZGxlZCAtIEluZGljYXRlIGVuZCBvZiBzY2FuIHJlc3VsdHMKQEAgLTE3NjcsNCArMTc5MiwyNSBAQAogCQkJCSAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZWxlbSk7CiBzdHJ1Y3Qgd3BhYnVmICogd2lmaV9kaXNwbGF5X2VuY2FwcyhzdHJ1Y3Qgd3BhYnVmICpzdWJlbGVtcyk7CiAKKy8qKgorICogcDJwX3NldF9kaXNjX2ludCAtIFNldCBtaW4vbWF4IGRpc2NvdmVyYWJsZSBpbnRlcnZhbCBmb3IgcDJwX2ZpbmQKKyAqIEBwMnA6IFAyUCBtb2R1bGUgY29udGV4dCBmcm9tIHAycF9pbml0KCkKKyAqIEBtaW5fZGlzY19pbnQ6IG1pbkRpc2NvdmVyYWJsZUludGVydmFsIChpbiB1bml0cyBvZiAxMDAgVFUpOyBkZWZhdWx0IDEKKyAqIEBtYXhfZGlzY19pbnQ6IG1heERpc2NvdmVyYWJsZUludGVydmFsIChpbiB1bml0cyBvZiAxMDAgVFUpOyBkZWZhdWx0IDMKKyAqIEBtYXhfZGlzY190dTogTWF4aW11bSBudW1iZXIgb2YgVFVzICgxLjAyNCBtcykgZm9yIGRpc2NvdmVyYWJsZSBpbnRlcnZhbDsgb3IKKyAqCS0xIG5vdCB0byBsaW1pdAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbWluRGlzY292ZXJhYmxlSW50ZXJ2YWwgYW5kCisgKiBtYXhEaXNjb3ZlcmFibGVJbnRlcnZhbCBwYXJhbWV0ZXJzIGZvciB0aGUgTGlzdGVuIHN0YXRlIGR1cmluZyBkZXZpY2UKKyAqIGRpc2NvdmVyeSAocDJwX2ZpbmQpLiBBIHJhbmRvbSBudW1iZXIgb2YgMTAwIFRVIHVuaXRzIGlzIHBpY2tlZCBmb3IgZWFjaAorICogTGlzdGVuIHN0YXRlIGl0ZXJhdGlvbiBmcm9tIFttaW5fZGlzY19pbnQsbWF4X2Rpc2NfaW50XSByYW5nZS4KKyAqCisgKiBtYXhfZGlzY190dSBjYW4gYmUgdXNlZCB0byBmdXRoZXIgbGltaXQgdGhlIGRpc2NvdmVyYWJsZSBkdXJhdGlvbi4gSG93ZXZlciwKKyAqIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHVzZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcmVjb21tZW5kZWQgc2luY2UgaXQKKyAqIHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCB0aGUgUDJQIHNwZWNpZmljYXRpb24uCisgKi8KK2ludCBwMnBfc2V0X2Rpc2NfaW50KHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBpbnQgbWluX2Rpc2NfaW50LCBpbnQgbWF4X2Rpc2NfaW50LAorCQkgICAgIGludCBtYXhfZGlzY190dSk7CisKICNlbmRpZiAvKiBQMlBfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3AycC9wMnBfYnVpbGQuYyBiL3NyYy9wMnAvcDJwX2J1aWxkLmMKaW5kZXggYmUwNjlhNS4uNTgzOGQzNSAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfYnVpbGQuYworKysgYi9zcmMvcDJwL3AycF9idWlsZC5jCkBAIC0xMzYsNiArMTM2LDcgQEAKIAkJICAgIGxlbiArIDIsICh1OCAqKSB3cGFidWZfcHV0KGJ1ZiwgMCkgLSBsZW4gLSAyKTsKIH0KIAorCiB2b2lkIHAycF9idWZfYWRkX3N0YXR1cyhzdHJ1Y3Qgd3BhYnVmICpidWYsIHU4IHN0YXR1cykKIHsKIAkvKiBTdGF0dXMgKi8KZGlmZiAtLWdpdCBhL3NyYy9wMnAvcDJwX2dvX25lZy5jIGIvc3JjL3AycC9wMnBfZ29fbmVnLmMKaW5kZXggYjIxZDk3Yy4uMzdkNDNiYiAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfZ29fbmVnLmMKKysrIGIvc3JjL3AycC9wMnBfZ29fbmVnLmMKQEAgLTE0NSw5ICsxNDUsNiBAQAogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlwZWVyLT5kaWFsb2dfdG9rZW4rKzsKLQlpZiAocGVlci0+ZGlhbG9nX3Rva2VuID09IDApCi0JCXBlZXItPmRpYWxvZ190b2tlbiA9IDE7CiAJcDJwX2J1Zl9hZGRfcHVibGljX2FjdGlvbl9oZHIoYnVmLCBQMlBfR09fTkVHX1JFUSwgcGVlci0+ZGlhbG9nX3Rva2VuKTsKIAogCWxlbiA9IHAycF9idWZfYWRkX2llX2hkcihidWYpOwpAQCAtMjExLDcgKzIwOCw3IEBACiAJCWVsc2UKIAkJCXJldHVybiAtMTsKIAkJcmV0dXJuIHAycF9wcm92X2Rpc2NfcmVxKHAycCwgZGV2LT5pbmZvLnAycF9kZXZpY2VfYWRkciwKLQkJCQkJIGNvbmZpZ19tZXRob2QsIDAsIDApOworCQkJCQkgY29uZmlnX21ldGhvZCwgMCwgMCwgMSk7CiAJfQogCiAJZnJlcSA9IGRldi0+bGlzdGVuX2ZyZXEgPiAwID8gZGV2LT5saXN0ZW5fZnJlcSA6IGRldi0+b3Blcl9mcmVxOwpAQCAtMzAyLDcgKzI5OSw2IEBACiAJCQkJCSAgICAgIHAycC0+b3BfY2hhbm5lbCk7CiAJfQogCXAycF9idWZfYWRkX2ludGVuZGVkX2FkZHIoYnVmLCBwMnAtPmludGVuZGVkX2FkZHIpOwotCiAJaWYgKHN0YXR1cyB8fCBwZWVyID09IE5VTEwpIHsKIAkJcDJwX2J1Zl9hZGRfY2hhbm5lbF9saXN0KGJ1ZiwgcDJwLT5jZmctPmNvdW50cnksCiAJCQkJCSAmcDJwLT5jaGFubmVscyk7CkBAIC0zMTUsNyArMzExLDYgQEAKIAkJCQkgICAgICAgJnJlcyk7CiAJCXAycF9idWZfYWRkX2NoYW5uZWxfbGlzdChidWYsIHAycC0+Y2ZnLT5jb3VudHJ5LCAmcmVzKTsKIAl9Ci0KIAlwMnBfYnVmX2FkZF9kZXZpY2VfaW5mbyhidWYsIHAycCwgcGVlcik7CiAJaWYgKHBlZXIgJiYgcGVlci0+Z29fc3RhdGUgPT0gTE9DQUxfR08pIHsKIAkJcDJwX2J1Zl9hZGRfZ3JvdXBfaWQoYnVmLCBwMnAtPmNmZy0+ZGV2X2FkZHIsIHAycC0+c3NpZCwKQEAgLTMzOCw2ICszMzMsMTcgQEAKIH0KIAogCisvKioKKyAqIHAycF9yZXNlbGVjdF9jaGFubmVsIC0gUmUtc2VsZWN0IG9wZXJhdGluZyBjaGFubmVsIGJhc2VkIG9uIHBlZXIgaW5mb3JtYXRpb24KKyAqIEBwMnA6IFAyUCBtb2R1bGUgY29udGV4dCBmcm9tIHAycF9pbml0KCkKKyAqIEBpbnRlcnNlY3Rpb246IFN1cHBvcnQgY2hhbm5lbCBsaXN0IGludGVyc2VjdGlvbiBmcm9tIGxvY2FsIGFuZCBwZWVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlLXNlbGVjdCB0aGUgYmVzdCBjaGFubmVsIGFmdGVyIGhhdmluZyByZWNlaXZlZAorICogaW5mb3JtYXRpb24gZnJvbSB0aGUgcGVlciB0byBhbGxvdyBzdXBwb3J0ZWQgY2hhbm5lbCBsaXN0cyB0byBiZSBpbnRlcnNlY3RlZC4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSBpbml0aWFsIGNoYW5uZWwgc2VsZWN0aW9uIGRvbmUgaW4KKyAqIHAycF9wcmVwYXJlX2NoYW5uZWwoKSBwcmlvciB0byB0aGUgc3RhcnQgb2YgR08gTmVnb3RpYXRpb24uIEluIGFkZGl0aW9uLCB0aGlzCisgKiBjYW4gYmUgdXNlZCBmb3IgSW52aXRhdGlvbiBjYXNlLgorICovCiB2b2lkIHAycF9yZXNlbGVjdF9jaGFubmVsKHN0cnVjdCBwMnBfZGF0YSAqcDJwLAogCQkJICBzdHJ1Y3QgcDJwX2NoYW5uZWxzICppbnRlcnNlY3Rpb24pCiB7CkBAIC0zOTIsNiArMzk4LDM1IEBACiAJCX0KIAl9CiAKKwkvKiBUcnkgYSBjaGFubmVsIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gdXNlIEhUNDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW50ZXJzZWN0aW9uLT5yZWdfY2xhc3NlczsgaSsrKSB7CisJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjID0gJmludGVyc2VjdGlvbi0+cmVnX2NsYXNzW2ldOworCQlpZiAoYy0+cmVnX2NsYXNzID09IDExNiB8fCBjLT5yZWdfY2xhc3MgPT0gMTE3IHx8CisJCSAgICBjLT5yZWdfY2xhc3MgPT0gMTI2IHx8IGMtPnJlZ19jbGFzcyA9PSAxMjcpIHsKKwkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCQkiUDJQOiBQaWNrIHBvc3NpYmxlIEhUNDAgY2hhbm5lbCAocmVnX2NsYXNzICIKKwkJCQkiJXUgY2hhbm5lbCAldSkgZnJvbSBpbnRlcnNlY3Rpb24iLAorCQkJCWMtPnJlZ19jbGFzcywgYy0+Y2hhbm5lbFswXSk7CisJCQlwMnAtPm9wX3JlZ19jbGFzcyA9IGMtPnJlZ19jbGFzczsKKwkJCXAycC0+b3BfY2hhbm5lbCA9IGMtPmNoYW5uZWxbMF07CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIFRyeSB0byBzZWUgaWYgdGhlIG9yaWdpbmFsIGNoYW5uZWwgaXMgaW4gdGhlIGludGVyc2VjdGlvbi4gSWYKKwkgKiBzbywgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcsIGFzIGl0IGFscmVhZHkgY29udGFpbnMgc29tZQorCSAqIHJhbmRvbW5lc3MuCisJICovCisJaWYgKHAycF9jaGFubmVsc19pbmNsdWRlcyhpbnRlcnNlY3Rpb24sIHAycC0+b3BfcmVnX2NsYXNzLAorCQkJCSAgcDJwLT5vcF9jaGFubmVsKSkgeworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCisJCQkiUDJQOiBVc2luZyBvcmlnaW5hbCBvcGVyYXRpbmcgY2xhc3MgYW5kIGNoYW5uZWwgIgorCQkJIihvcF9jbGFzcyAldSBjaGFubmVsICV1KSBmcm9tIGludGVyc2VjdGlvbiIsCisJCQlwMnAtPm9wX3JlZ19jbGFzcywgcDJwLT5vcF9jaGFubmVsKTsKKwkJcmV0dXJuOworCX0KKwogCS8qCiAJICogRmFsbCBiYWNrIHRvIHdoYXRldmVyIGlzIGluY2x1ZGVkIGluIHRoZSBjaGFubmVsIGludGVyc2VjdGlvbiBzaW5jZQogCSAqIG5vIGJldHRlciBvcHRpb25zIHNlZW1zIHRvIGJlIGF2YWlsYWJsZS4KQEAgLTQwNSw2ICs0NDAsNjAgQEAKIH0KIAogCitzdGF0aWMgaW50IHAycF9nb19zZWxlY3RfY2hhbm5lbChzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgc3RydWN0IHAycF9kZXZpY2UgKmRldiwKKwkJCQkgdTggKnN0YXR1cykKK3sKKwlzdHJ1Y3QgcDJwX2NoYW5uZWxzIGludGVyc2VjdGlvbjsKKwlzaXplX3QgaTsKKworCXAycF9jaGFubmVsc19pbnRlcnNlY3QoJnAycC0+Y2hhbm5lbHMsICZkZXYtPmNoYW5uZWxzLCAmaW50ZXJzZWN0aW9uKTsKKwlpZiAoaW50ZXJzZWN0aW9uLnJlZ19jbGFzc2VzID09IDAgfHwKKwkgICAgaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1swXS5jaGFubmVscyA9PSAwKSB7CisJCSpzdGF0dXMgPSBQMlBfU0NfRkFJTF9OT19DT01NT05fQ0hBTk5FTFM7CisJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKKwkJCSJQMlA6IE5vIGNvbW1vbiBjaGFubmVscyBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGludGVyc2VjdGlvbi5yZWdfY2xhc3NlczsgaSsrKSB7CisJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjOworCQljID0gJmludGVyc2VjdGlvbi5yZWdfY2xhc3NbaV07CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiByZWdfY2xhc3MgJXUiLCBjLT5yZWdfY2xhc3MpOworCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJQMlA6IGNoYW5uZWxzIiwKKwkJCSAgICBjLT5jaGFubmVsLCBjLT5jaGFubmVscyk7CisJfQorCisJaWYgKCFwMnBfY2hhbm5lbHNfaW5jbHVkZXMoJmludGVyc2VjdGlvbiwgcDJwLT5vcF9yZWdfY2xhc3MsCisJCQkJICAgcDJwLT5vcF9jaGFubmVsKSkgeworCQlpZiAoZGV2LT5mbGFncyAmIFAyUF9ERVZfRk9SQ0VfRlJFUSkgeworCQkJKnN0YXR1cyA9IFAyUF9TQ19GQUlMX05PX0NPTU1PTl9DSEFOTkVMUzsKKwkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywgIlAyUDogUGVlciBkb2VzICIKKwkJCQkibm90IHN1cHBvcnQgdGhlIGZvcmNlZCBjaGFubmVsIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsICJQMlA6IFNlbGVjdGVkIG9wZXJhdGluZyAiCisJCQkiY2hhbm5lbCAob3BfY2xhc3MgJXUgY2hhbm5lbCAldSkgbm90IGFjY2VwdGFibGUgdG8gIgorCQkJInRoZSBwZWVyIiwgcDJwLT5vcF9yZWdfY2xhc3MsIHAycC0+b3BfY2hhbm5lbCk7CisJCXAycF9yZXNlbGVjdF9jaGFubmVsKHAycCwgJmludGVyc2VjdGlvbik7CisJfSBlbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBQMlBfREVWX0ZPUkNFX0ZSRVEpICYmCisJCSAgICFwMnAtPmNmZy0+Y2ZnX29wX2NoYW5uZWwpIHsKKwkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLCAiUDJQOiBUcnkgdG8gb3B0aW1pemUgIgorCQkJImNoYW5uZWwgc2VsZWN0aW9uIHdpdGggcGVlciBpbmZvcm1hdGlvbiByZWNlaXZlZDsgIgorCQkJInByZXZpb3VzbHkgc2VsZWN0ZWQgb3BfY2xhc3MgJXUgY2hhbm5lbCAldSIsCisJCQlwMnAtPm9wX3JlZ19jbGFzcywgcDJwLT5vcF9jaGFubmVsKTsKKwkJcDJwX3Jlc2VsZWN0X2NoYW5uZWwocDJwLCAmaW50ZXJzZWN0aW9uKTsKKwl9CisKKwlpZiAoIXAycC0+c3NpZF9zZXQpIHsKKwkJcDJwX2J1aWxkX3NzaWQocDJwLCBwMnAtPnNzaWQsICZwMnAtPnNzaWRfbGVuKTsKKwkJcDJwLT5zc2lkX3NldCA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwogdm9pZCBwMnBfcHJvY2Vzc19nb19uZWdfcmVxKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqc2EsCiAJCQkgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sIGludCByeF9mcmVxKQogewpAQCAtNjIxLDM2ICs3MTAsOCBAQAogCQkJZ290byBmYWlsOwogCQl9CiAKLQkJaWYgKGdvKSB7Ci0JCQlzdHJ1Y3QgcDJwX2NoYW5uZWxzIGludGVyc2VjdGlvbjsKLQkJCXNpemVfdCBpOwotCQkJcDJwX2NoYW5uZWxzX2ludGVyc2VjdCgmcDJwLT5jaGFubmVscywgJmRldi0+Y2hhbm5lbHMsCi0JCQkJCSAgICAgICAmaW50ZXJzZWN0aW9uKTsKLQkJCWlmIChpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXMgPT0gMCB8fAotCQkJICAgIGludGVyc2VjdGlvbi5yZWdfY2xhc3NbMF0uY2hhbm5lbHMgPT0gMCkgewotCQkJCXN0YXR1cyA9IFAyUF9TQ19GQUlMX05PX0NPTU1PTl9DSEFOTkVMUzsKLQkJCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJCSJQMlA6IE5vIGNvbW1vbiBjaGFubmVscyBmb3VuZCIpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWZvciAoaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXM7IGkrKykgewotCQkJCXN0cnVjdCBwMnBfcmVnX2NsYXNzICpjOwotCQkJCWMgPSAmaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1tpXTsKLQkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogcmVnX2NsYXNzICV1IiwKLQkJCQkJICAgYy0+cmVnX2NsYXNzKTsKLQkJCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJQMlA6IGNoYW5uZWxzIiwKLQkJCQkJICAgIGMtPmNoYW5uZWwsIGMtPmNoYW5uZWxzKTsKLQkJCX0KLQkJCWlmICghcDJwX2NoYW5uZWxzX2luY2x1ZGVzKCZpbnRlcnNlY3Rpb24sCi0JCQkJCQkgICBwMnAtPm9wX3JlZ19jbGFzcywKLQkJCQkJCSAgIHAycC0+b3BfY2hhbm5lbCkpCi0JCQkJcDJwX3Jlc2VsZWN0X2NoYW5uZWwocDJwLCAmaW50ZXJzZWN0aW9uKTsKLQotCQkJaWYgKCFwMnAtPnNzaWRfc2V0KSB7Ci0JCQkJcDJwX2J1aWxkX3NzaWQocDJwLCBwMnAtPnNzaWQsICZwMnAtPnNzaWRfbGVuKTsKLQkJCQlwMnAtPnNzaWRfc2V0ID0gMTsKLQkJCX0KLQkJfQorCQlpZiAoZ28gJiYgcDJwX2dvX3NlbGVjdF9jaGFubmVsKHAycCwgZGV2LCAmc3RhdHVzKSA8IDApCisJCQlnb3RvIGZhaWw7CiAKIAkJZGV2LT5nb19zdGF0ZSA9IGdvID8gTE9DQUxfR08gOiBSRU1PVEVfR087CiAJCWRldi0+b3Blcl9mcmVxID0gcDJwX2NoYW5uZWxfdG9fZnJlcSgoY29uc3QgY2hhciAqKQpAQCAtMTAyMywzNSArMTA4NCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoZ28pIHsKLQkJc3RydWN0IHAycF9jaGFubmVscyBpbnRlcnNlY3Rpb247Ci0JCXNpemVfdCBpOwotCQlwMnBfY2hhbm5lbHNfaW50ZXJzZWN0KCZwMnAtPmNoYW5uZWxzLCAmZGV2LT5jaGFubmVscywKLQkJCQkgICAgICAgJmludGVyc2VjdGlvbik7Ci0JCWlmIChpbnRlcnNlY3Rpb24ucmVnX2NsYXNzZXMgPT0gMCB8fAotCQkgICAgaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1swXS5jaGFubmVscyA9PSAwKSB7Ci0JCQlzdGF0dXMgPSBQMlBfU0NfRkFJTF9OT19DT01NT05fQ0hBTk5FTFM7Ci0JCQl3cGFfbXNnKHAycC0+Y2ZnLT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkJIlAyUDogTm8gY29tbW9uIGNoYW5uZWxzIGZvdW5kIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IGludGVyc2VjdGlvbi5yZWdfY2xhc3NlczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcDJwX3JlZ19jbGFzcyAqYzsKLQkJCWMgPSAmaW50ZXJzZWN0aW9uLnJlZ19jbGFzc1tpXTsKLQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiByZWdfY2xhc3MgJXUiLAotCQkJCSAgIGMtPnJlZ19jbGFzcyk7Ci0JCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJQMlA6IGNoYW5uZWxzIiwKLQkJCQkgICAgYy0+Y2hhbm5lbCwgYy0+Y2hhbm5lbHMpOwotCQl9Ci0JCWlmICghcDJwX2NoYW5uZWxzX2luY2x1ZGVzKCZpbnRlcnNlY3Rpb24sIHAycC0+b3BfcmVnX2NsYXNzLAotCQkJCQkgICBwMnAtPm9wX2NoYW5uZWwpKQotCQkJcDJwX3Jlc2VsZWN0X2NoYW5uZWwocDJwLCAmaW50ZXJzZWN0aW9uKTsKLQotCQlpZiAoIXAycC0+c3NpZF9zZXQpIHsKLQkJCXAycF9idWlsZF9zc2lkKHAycCwgcDJwLT5zc2lkLCAmcDJwLT5zc2lkX2xlbik7Ci0JCQlwMnAtPnNzaWRfc2V0ID0gMTsKLQkJfQotCX0KKwlpZiAoZ28gJiYgcDJwX2dvX3NlbGVjdF9jaGFubmVsKHAycCwgZGV2LCAmc3RhdHVzKSA8IDApCisJCWdvdG8gZmFpbDsKIAogCXAycF9zZXRfc3RhdGUocDJwLCBQMlBfR09fTkVHKTsKIAlwMnBfY2xlYXJfdGltZW91dChwMnApOwpkaWZmIC0tZ2l0IGEvc3JjL3AycC9wMnBfZ3JvdXAuYyBiL3NyYy9wMnAvcDJwX2dyb3VwLmMKaW5kZXggODY4NzMyMC4uNjMzZGQ1YyAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfZ3JvdXAuYworKysgYi9zcmMvcDJwL3AycF9ncm91cC5jCkBAIC0xNjksNiArMTY5LDM5IEBACiB9CiAKIAorc3RhdGljIHN0cnVjdCB3cGFidWYgKiBwMnBfZ3JvdXBfZW5jYXBzX3Byb2JlX3Jlc3Aoc3RydWN0IHdwYWJ1ZiAqc3ViZWxlbXMpCit7CisJc3RydWN0IHdwYWJ1ZiAqaWU7CisJY29uc3QgdTggKnBvcywgKmVuZDsKKwlzaXplX3QgbGVuOworCisJaWYgKHN1YmVsZW1zID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gd3BhYnVmX2xlbihzdWJlbGVtcykgKyAxMDA7CisKKwlpZSA9IHdwYWJ1Zl9hbGxvYyhsZW4pOworCWlmIChpZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IHdwYWJ1Zl9oZWFkKHN1YmVsZW1zKTsKKwllbmQgPSBwb3MgKyB3cGFidWZfbGVuKHN1YmVsZW1zKTsKKworCXdoaWxlIChlbmQgPiBwb3MpIHsKKwkJc2l6ZV90IGZyYWdfbGVuID0gZW5kIC0gcG9zOworCQlpZiAoZnJhZ19sZW4gPiAyNTEpCisJCQlmcmFnX2xlbiA9IDI1MTsKKwkJd3BhYnVmX3B1dF91OChpZSwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDKTsKKwkJd3BhYnVmX3B1dF91OChpZSwgNCArIGZyYWdfbGVuKTsKKwkJd3BhYnVmX3B1dF9iZTMyKGllLCBQMlBfSUVfVkVORE9SX1RZUEUpOworCQl3cGFidWZfcHV0X2RhdGEoaWUsIHBvcywgZnJhZ19sZW4pOworCQlwb3MgKz0gZnJhZ19sZW47CisJfQorCisJcmV0dXJuIGllOworfQorCisKIHN0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogcDJwX2dyb3VwX2J1aWxkX2JlYWNvbl9pZShzdHJ1Y3QgcDJwX2dyb3VwICpncm91cCkKIHsKIAlzdHJ1Y3Qgd3BhYnVmICppZTsKQEAgLTM2Nyw5ICs0MDAsOCBAQAogc3RhdGljIHN0cnVjdCB3cGFidWYgKiBwMnBfZ3JvdXBfYnVpbGRfcHJvYmVfcmVzcF9pZShzdHJ1Y3QgcDJwX2dyb3VwICpncm91cCkKIHsKIAl1OCAqZ3JvdXBfaW5mbzsKLQlzdHJ1Y3Qgd3BhYnVmICppZTsKKwlzdHJ1Y3Qgd3BhYnVmICpwMnBfc3ViZWxlbXMsICppZTsKIAlzdHJ1Y3QgcDJwX2dyb3VwX21lbWJlciAqbTsKLQl1OCAqbGVuOwogCXNpemVfdCBleHRyYSA9IDA7CiAKICNpZmRlZiBDT05GSUdfV0lGSV9ESVNQTEFZCkBAIC0zNzcsMzMgKzQwOSwzMiBAQAogCQlleHRyYSArPSB3cGFidWZfbGVuKGdyb3VwLT53ZmRfaWUpOwogI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KIAotCWllID0gd3BhYnVmX2FsbG9jKDI1NyArIGV4dHJhKTsKLQlpZiAoaWUgPT0gTlVMTCkKKwlwMnBfc3ViZWxlbXMgPSB3cGFidWZfYWxsb2MoNTAwICsgZXh0cmEpOworCWlmIChwMnBfc3ViZWxlbXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBDT05GSUdfV0lGSV9ESVNQTEFZCiAJaWYgKGdyb3VwLT53ZmRfaWUpCi0JCXdwYWJ1Zl9wdXRfYnVmKGllLCBncm91cC0+d2ZkX2llKTsKKwkJd3BhYnVmX3B1dF9idWYocDJwX3N1YmVsZW1zLCBncm91cC0+d2ZkX2llKTsKICNlbmRpZiAvKiBDT05GSUdfV0lGSV9ESVNQTEFZICovCiAKLQlsZW4gPSBwMnBfYnVmX2FkZF9pZV9oZHIoaWUpOwotCi0JcDJwX2dyb3VwX2FkZF9jb21tb25faWVzKGdyb3VwLCBpZSk7Ci0JcDJwX2dyb3VwX2FkZF9ub2EoaWUsIGdyb3VwLT5ub2EpOworCXAycF9ncm91cF9hZGRfY29tbW9uX2llcyhncm91cCwgcDJwX3N1YmVsZW1zKTsKKwlwMnBfZ3JvdXBfYWRkX25vYShwMnBfc3ViZWxlbXMsIGdyb3VwLT5ub2EpOwogCiAJLyogUDJQIERldmljZSBJbmZvICovCi0JcDJwX2J1Zl9hZGRfZGV2aWNlX2luZm8oaWUsIGdyb3VwLT5wMnAsIE5VTEwpOworCXAycF9idWZfYWRkX2RldmljZV9pbmZvKHAycF9zdWJlbGVtcywgZ3JvdXAtPnAycCwgTlVMTCk7CiAKIAkvKiBQMlAgR3JvdXAgSW5mbyAqLwotCWdyb3VwX2luZm8gPSB3cGFidWZfcHV0KGllLCAwKTsKLQl3cGFidWZfcHV0X3U4KGllLCBQMlBfQVRUUl9HUk9VUF9JTkZPKTsKLQl3cGFidWZfcHV0X2xlMTYoaWUsIDApOyAvKiBMZW5ndGggdG8gYmUgZmlsbGVkICovCisJZ3JvdXBfaW5mbyA9IHdwYWJ1Zl9wdXQocDJwX3N1YmVsZW1zLCAwKTsKKwl3cGFidWZfcHV0X3U4KHAycF9zdWJlbGVtcywgUDJQX0FUVFJfR1JPVVBfSU5GTyk7CisJd3BhYnVmX3B1dF9sZTE2KHAycF9zdWJlbGVtcywgMCk7IC8qIExlbmd0aCB0byBiZSBmaWxsZWQgKi8KIAlmb3IgKG0gPSBncm91cC0+bWVtYmVyczsgbTsgbSA9IG0tPm5leHQpCi0JCXAycF9jbGllbnRfaW5mbyhpZSwgbSk7CisJCXAycF9jbGllbnRfaW5mbyhwMnBfc3ViZWxlbXMsIG0pOwogCVdQQV9QVVRfTEUxNihncm91cF9pbmZvICsgMSwKLQkJICAgICAodTggKikgd3BhYnVmX3B1dChpZSwgMCkgLSBncm91cF9pbmZvIC0gMyk7CisJCSAgICAgKHU4ICopIHdwYWJ1Zl9wdXQocDJwX3N1YmVsZW1zLCAwKSAtIGdyb3VwX2luZm8gLSAzKTsKIAotCXAycF9idWZfdXBkYXRlX2llX2hkcihpZSwgbGVuKTsKKwlpZSA9IHAycF9ncm91cF9lbmNhcHNfcHJvYmVfcmVzcChwMnBfc3ViZWxlbXMpOworCXdwYWJ1Zl9mcmVlKHAycF9zdWJlbGVtcyk7CiAKIAlyZXR1cm4gaWU7CiB9CmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycF9pLmggYi9zcmMvcDJwL3AycF9pLmgKaW5kZXggNjczYzRjMS4uNzEyNTQ0YiAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfaS5oCisrKyBiL3NyYy9wMnAvcDJwX2kuaApAQCAtMjI2LDYgKzIyNiwxMSBAQAogCWludCBtYXhfZGlzY19pbnQ7CiAKIAkvKioKKwkgKiBtYXhfZGlzY190dSAtIE1heGltdW0gbnVtYmVyIG9mIFRVcyBmb3IgZGlzY292ZXJhYmxlIGludGVydmFsCisJICovCisJaW50IG1heF9kaXNjX3R1OworCisJLyoqCiAJICogZGV2aWNlcyAtIExpc3Qgb2Yga25vd24gUDJQIERldmljZSBwZWVycwogCSAqLwogCXN0cnVjdCBkbF9saXN0IGRldmljZXM7CkBAIC03MDAsOCArNzA1LDkgQEAKIAkJCQkJCXN0cnVjdCBwMnBfbWVzc2FnZSAqbXNnKTsKIHZvaWQgcDJwX2FkZF9kZXZfaW5mbyhzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKmFkZHIsCiAJCSAgICAgIHN0cnVjdCBwMnBfZGV2aWNlICpkZXYsIHN0cnVjdCBwMnBfbWVzc2FnZSAqbXNnKTsKLWludCBwMnBfYWRkX2RldmljZShzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKmFkZHIsIGludCBmcmVxLCBpbnQgbGV2ZWwsCi0JCSAgIGNvbnN0IHU4ICppZXMsIHNpemVfdCBpZXNfbGVuLCBpbnQgc2Nhbl9yZXMpOworaW50IHAycF9hZGRfZGV2aWNlKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqYWRkciwgaW50IGZyZXEsCisJCSAgIHVuc2lnbmVkIGludCBhZ2VfbXMsIGludCBsZXZlbCwgY29uc3QgdTggKmllcywKKwkJICAgc2l6ZV90IGllc19sZW4sIGludCBzY2FuX3Jlcyk7CiBzdHJ1Y3QgcDJwX2RldmljZSAqIHAycF9nZXRfZGV2aWNlKHN0cnVjdCBwMnBfZGF0YSAqcDJwLCBjb25zdCB1OCAqYWRkcik7CiBzdHJ1Y3QgcDJwX2RldmljZSAqIHAycF9nZXRfZGV2aWNlX2ludGVyZmFjZShzdHJ1Y3QgcDJwX2RhdGEgKnAycCwKIAkJCQkJICAgICBjb25zdCB1OCAqYWRkcik7CmRpZmYgLS1naXQgYS9zcmMvcDJwL3AycF9pbnZpdGF0aW9uLmMgYi9zcmMvcDJwL3AycF9pbnZpdGF0aW9uLmMKaW5kZXggN2JmNjYwMC4uYWM2NzkzMiAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfaW52aXRhdGlvbi5jCisrKyBiL3NyYy9wMnAvcDJwX2ludml0YXRpb24uYwpAQCAtMTc2LDggKzE3Niw4IEBACiAJCQkiUDJQOiBJbnZpdGF0aW9uIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIgIgogCQkJTUFDU1RSLCBNQUMyU1RSKHNhKSk7CiAKLQkJaWYgKHAycF9hZGRfZGV2aWNlKHAycCwgc2EsIHJ4X2ZyZXEsIDAsIGRhdGEgKyAxLCBsZW4gLSAxLCAwKSkKLQkJeworCQlpZiAocDJwX2FkZF9kZXZpY2UocDJwLCBzYSwgcnhfZnJlcSwgMCwgMCwgZGF0YSArIDEsIGxlbiAtIDEsCisJCQkJICAgMCkpIHsKIAkJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKIAkJCQkiUDJQOiBJbnZpdGF0aW9uIFJlcXVlc3QgYWRkIGRldmljZSBmYWlsZWQgIgogCQkJCU1BQ1NUUiwgTUFDMlNUUihzYSkpOwpkaWZmIC0tZ2l0IGEvc3JjL3AycC9wMnBfcGQuYyBiL3NyYy9wMnAvcDJwX3BkLmMKaW5kZXggNDI0NDdlNS4uY2EzM2YxNyAxMDA2NDQKLS0tIGEvc3JjL3AycC9wMnBfcGQuYworKysgYi9zcmMvcDJwL3AycF9wZC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBOdW1iZXIgb2YgcmV0cmllcyB0byBhdHRlbXB0IGZvciBwcm92aXNpb24gZGlzY292ZXJ5IHJlcXVlc3RzCiAgKiBpbiBjYXNlIHRoZSBwZWVyIGlzIG5vdCBsaXN0ZW5pbmcuCiAgKi8KLSNkZWZpbmUgTUFYX1BST1ZfRElTQ19SRVFfUkVUUklFUyAxMAorI2RlZmluZSBNQVhfUFJPVl9ESVNDX1JFUV9SRVRSSUVTIDEyMAogCiAKIHN0YXRpYyB2b2lkIHAycF9idWlsZF93cHNfaWVfY29uZmlnX21ldGhvZHMoc3RydWN0IHdwYWJ1ZiAqYnVmLApAQCAtMTUxLDggKzE1MSw5IEBACiAJCXdwYV9tc2cocDJwLT5jZmctPm1zZ19jdHgsIE1TR19ERUJVRywKIAkJCSJQMlA6IFByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVxdWVzdCBmcm9tICIKIAkJCSJ1bmtub3duIHBlZXIgIiBNQUNTVFIsIE1BQzJTVFIoc2EpKTsKLQkJaWYgKHAycF9hZGRfZGV2aWNlKHAycCwgc2EsIHJ4X2ZyZXEsIDAsIGRhdGEgKyAxLCBsZW4gLSAxLCAwKSkKLQkJeworCisJCWlmIChwMnBfYWRkX2RldmljZShwMnAsIHNhLCByeF9mcmVxLCAwLCAwLCBkYXRhICsgMSwgbGVuIC0gMSwKKwkJCQkgICAwKSkgewogCQkJd3BhX21zZyhwMnAtPmNmZy0+bXNnX2N0eCwgTVNHX0RFQlVHLAogCQkJICAgICAgICAiUDJQOiBQcm92aXNpb24gRGlzY292ZXJ5IFJlcXVlc3QgYWRkIGRldmljZSAiCiAJCQkJImZhaWxlZCAiIE1BQ1NUUiwgTUFDMlNUUihzYSkpOwpAQCAtMzc5LDkgKzM4MCw2IEBACiAJCS8qIFRPRE86IHVzZSBkZXZpY2UgZGlzY292ZXJhYmlsaXR5IHJlcXVlc3QgdGhyb3VnaCBHTyAqLwogCX0KIAotCWRldi0+ZGlhbG9nX3Rva2VuKys7Ci0JaWYgKGRldi0+ZGlhbG9nX3Rva2VuID09IDApCi0JCWRldi0+ZGlhbG9nX3Rva2VuID0gMTsKIAlyZXEgPSBwMnBfYnVpbGRfcHJvdl9kaXNjX3JlcShwMnAsIGRldi0+ZGlhbG9nX3Rva2VuLAogCQkJCSAgICAgIGRldi0+cmVxX2NvbmZpZ19tZXRob2RzLAogCQkJCSAgICAgIGpvaW4gPyBkZXYgOiBOVUxMKTsKQEAgLTQwOCw3ICs0MDYsOCBAQAogCiAKIGludCBwMnBfcHJvdl9kaXNjX3JlcShzdHJ1Y3QgcDJwX2RhdGEgKnAycCwgY29uc3QgdTggKnBlZXJfYWRkciwKLQkJICAgICAgdTE2IGNvbmZpZ19tZXRob2RzLCBpbnQgam9pbiwgaW50IGZvcmNlX2ZyZXEpCisJCSAgICAgIHUxNiBjb25maWdfbWV0aG9kcywgaW50IGpvaW4sIGludCBmb3JjZV9mcmVxLAorCQkgICAgICBpbnQgdXNlcl9pbml0aWF0ZWRfcGQpCiB7CiAJc3RydWN0IHAycF9kZXZpY2UgKmRldjsKIApAQCAtNDQ2LDE1ICs0NDUsMTkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyoKLQkgKiBXZSB1c2UgdGhlIGpvaW4gcGFyYW0gYXMgYSBjdWUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHVzZXIKLQkgKiBpbml0aWF0ZWQgUEQgcmVxdWVzdCBhbmQgb25lIGlzc3VlZCBkdXJpbmcgZmluZHMgKGludGVybmFsKS4KLQkgKi8KLQlwMnAtPnVzZXJfaW5pdGlhdGVkX3BkID0gIWpvaW47CisJcDJwLT51c2VyX2luaXRpYXRlZF9wZCA9IHVzZXJfaW5pdGlhdGVkX3BkOwogCiAJaWYgKHAycC0+dXNlcl9pbml0aWF0ZWRfcGQpCiAJCXAycC0+cGRfcmV0cmllcyA9IE1BWF9QUk9WX0RJU0NfUkVRX1JFVFJJRVM7CiAKKwkvKgorCSAqIEFzc2lnbiBkaWFsb2cgdG9rZW4gaGVyZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgaW4gZWFjaCByZXRyeSB3aXRoaW4KKwkgKiB0aGUgc2FtZSBQRCBleGNoYW5nZS4KKwkgKi8KKwlkZXYtPmRpYWxvZ190b2tlbisrOworCWlmIChkZXYtPmRpYWxvZ190b2tlbiA9PSAwKQorCQlkZXYtPmRpYWxvZ190b2tlbiA9IDE7CisKIAlyZXR1cm4gcDJwX3NlbmRfcHJvdl9kaXNjX3JlcShwMnAsIGRldiwgam9pbiwgZm9yY2VfZnJlcSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9yYWRpdXMvcmFkaXVzLmMgYi9zcmMvcmFkaXVzL3JhZGl1cy5jCmluZGV4IGQ1ZWRmZDguLmQxZmVlYzkgMTAwNjQ0Ci0tLSBhL3NyYy9yYWRpdXMvcmFkaXVzLmMKKysrIGIvc3JjL3JhZGl1cy9yYWRpdXMuYwpAQCAtMTQwNiwxMSArMTQwNiwxMiBAQAogICogQHNlY3JldDogUkFESVVTIHNoYXJlZCBzZWNyZXQKICAqIEBzZWNyZXRfbGVuOiBMZW5ndGggb2Ygc2VjcmV0CiAgKiBAc2VudF9tc2c6IFNlbnQgUkFESVVTIG1lc3NhZ2UKLSAqIFJldHVybnM6IHBvaW50ZXIgdG8gcGFzc3dvcmQgKGZyZWUgd2l0aCBvc19mcmVlKSBvciAlTlVMTAorICogQG46IE51bWJlciBvZiBwYXNzd29yZCBhdHRyaWJ1dGUgdG8gcmV0dXJuIChzdGFydGluZyB3aXRoIDApCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIG4tdGggcGFzc3dvcmQgKGZyZWUgd2l0aCBvc19mcmVlKSBvciAlTlVMTAogICovCiBjaGFyICogcmFkaXVzX21zZ19nZXRfdHVubmVsX3Bhc3N3b3JkKHN0cnVjdCByYWRpdXNfbXNnICptc2csIGludCAqa2V5bGVuLAogCQkJCSAgICAgIGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLAotCQkJCSAgICAgIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZykKKwkJCQkgICAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqc2VudF9tc2csIHNpemVfdCBuKQogewogCXU4ICpidWYgPSBOVUxMOwogCXNpemVfdCBidWZsZW47CkBAIC0xNDIwLDcgKzE0MjEsNyBAQAogCXNpemVfdCBsZW5bM107CiAJdTggaGFzaFsxNl07CiAJdTggKnBvczsKLQlzaXplX3QgaTsKKwlzaXplX3QgaSwgaiA9IDA7CiAJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0cjsKIAljb25zdCB1OCAqZGF0YTsKIAlzaXplX3QgZGxlbjsKQEAgLTE0MjgsNyArMTQyOSw3IEBACiAJc2l6ZV90IGZkbGVuID0gLTE7CiAJY2hhciAqcmV0ID0gTlVMTDsKIAotCS8qIGZpbmQgYXR0cmlidXRlIHdpdGggbG93ZXN0IHRhZyBhbmQgY2hlY2sgaXQgKi8KKwkvKiBmaW5kIG4tdGggdmFsaWQgVHVubmVsLVBhc3N3b3JkIGF0dHJpYnV0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBtc2ctPmF0dHJfdXNlZDsgaSsrKSB7CiAJCWF0dHIgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CiAJCWlmIChhdHRyID09IE5VTEwgfHwKQEAgLTE0NDEsMTEgKzE0NDIsMTMgQEAKIAkJZGxlbiA9IGF0dHItPmxlbmd0aCAtIHNpemVvZigqYXR0cik7CiAJCWlmIChkbGVuIDw9IDMgfHwgZGxlbiAlIDE2ICE9IDMpCiAJCQljb250aW51ZTsKLQkJaWYgKGZkYXRhICE9IE5VTEwgJiYgZmRhdGFbMF0gPD0gZGF0YVswXSkKKwkJaisrOworCQlpZiAoaiA8PSBuKQogCQkJY29udGludWU7CiAKIAkJZmRhdGEgPSBkYXRhOwogCQlmZGxlbiA9IGRsZW47CisJCWJyZWFrOwogCX0KIAlpZiAoZmRhdGEgPT0gTlVMTCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9zcmMvcmFkaXVzL3JhZGl1cy5oIGIvc3JjL3JhZGl1cy9yYWRpdXMuaAppbmRleCA3Mjc2NDBiLi4yMDMxMDU0IDEwMDY0NAotLS0gYS9zcmMvcmFkaXVzL3JhZGl1cy5oCisrKyBiL3NyYy9yYWRpdXMvcmFkaXVzLmgKQEAgLTI0Miw3ICsyNDIsNyBAQAogaW50IHJhZGl1c19tc2dfZ2V0X3ZsYW5pZChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnKTsKIGNoYXIgKiByYWRpdXNfbXNnX2dldF90dW5uZWxfcGFzc3dvcmQoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgaW50ICprZXlsZW4sCiAJCQkJICAgICAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4sCi0JCQkJICAgICAgc3RydWN0IHJhZGl1c19tc2cgKnNlbnRfbXNnKTsKKwkJCQkgICAgICBzdHJ1Y3QgcmFkaXVzX21zZyAqc2VudF9tc2csIHNpemVfdCBuKTsKIAogc3RhdGljIGlubGluZSBpbnQgcmFkaXVzX21zZ19hZGRfYXR0cl9pbnQzMihzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCB1OCB0eXBlLAogCQkJCQkgICAgdTMyIHZhbHVlKQpkaWZmIC0tZ2l0IGEvc3JjL3Jzbl9zdXBwL3BlZXJrZXkuYyBiL3NyYy9yc25fc3VwcC9wZWVya2V5LmMKaW5kZXggZjJiYWMzNC4uNzg5YWMyNSAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3BlZXJrZXkuYworKysgYi9zcmMvcnNuX3N1cHAvcGVlcmtleS5jCkBAIC0yMTcsMjMgKzIxNywxNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JY2lwaGVyID0gaWUucGFpcndpc2VfY2lwaGVyICYgc20tPmFsbG93ZWRfcGFpcndpc2VfY2lwaGVyOwotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFVzaW5nIENDTVAgZm9yIFBlZXJLZXkiKTsKLQkJY2lwaGVyID0gV1BBX0NJUEhFUl9DQ01QOwotCX0gZWxzZSBpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBVc2luZyBHQ01QIGZvciBQZWVyS2V5Iik7Ci0JCWNpcGhlciA9IFdQQV9DSVBIRVJfR0NNUDsKLQl9IGVsc2UgaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgVEtJUCBmb3IgUGVlcktleSIpOwotCQljaXBoZXIgPSBXUEFfQ0lQSEVSX1RLSVA7Ci0JfSBlbHNlIHsKKwljaXBoZXIgPSB3cGFfcGlja19wYWlyd2lzZV9jaXBoZXIoaWUucGFpcndpc2VfY2lwaGVyICYKKwkJCQkJICBzbS0+YWxsb3dlZF9wYWlyd2lzZV9jaXBoZXIsIDApOworCWlmIChjaXBoZXIgPCAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0lORk8sICJSU046IE5vIGFjY2VwdGFibGUgY2lwaGVyIGluIFNNSyBNMiIpOwogCQl3cGFfc3VwcGxpY2FudF9zZW5kX3Nta19lcnJvcihzbSwgc3JjX2FkZHIsIGtkZS5tYWNfYWRkciwKIAkJCQkJICAgICAgU1RLX01VSV9TTUssIFNUS19FUlJfQ1BIUl9OUywKIAkJCQkJICAgICAgdmVyKTsKIAkJcmV0dXJuIC0xOwogCX0KKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgJXMgZm9yIFBlZXJLZXkiLAorCQkgICB3cGFfY2lwaGVyX3R4dChjaXBoZXIpKTsKIAogCS8qIFRPRE86IGZpbmQgZXhpc3RpbmcgZW50cnkgYW5kIGlmIGZvdW5kLCB1c2UgdGhhdCBpbnN0ZWFkIG9mIGFkZGluZwogCSAqIGEgbmV3IG9uZTsgaG93IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBib3RoIGVuZHMgaW5pdGlhdGUgYXQgdGhlCkBAIC00OTYsMTcgKzQ5MCw5IEBACiAJcGVlcmtleS0+cnNuaWVfcF9sZW4gPSBrZGUtPnJzbl9pZV9sZW47CiAJb3NfbWVtY3B5KHBlZXJrZXktPnBub25jZSwga2RlLT5ub25jZSwgV1BBX05PTkNFX0xFTik7CiAKLQljaXBoZXIgPSBpZS5wYWlyd2lzZV9jaXBoZXIgJiBzbS0+YWxsb3dlZF9wYWlyd2lzZV9jaXBoZXI7Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkgewotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJTTjogVXNpbmcgQ0NNUCBmb3IgUGVlcktleSIpOwotCQlwZWVya2V5LT5jaXBoZXIgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0JfSBlbHNlIGlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0dDTVApIHsKLQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFVzaW5nIEdDTVAgZm9yIFBlZXJLZXkiKTsKLQkJcGVlcmtleS0+Y2lwaGVyID0gV1BBX0NJUEhFUl9HQ01QOwotCX0gZWxzZSBpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUlNOOiBVc2luZyBUS0lQIGZvciBQZWVyS2V5Iik7Ci0JCXBlZXJrZXktPmNpcGhlciA9IFdQQV9DSVBIRVJfVEtJUDsKLQl9IGVsc2UgeworCWNpcGhlciA9IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihpZS5wYWlyd2lzZV9jaXBoZXIgJgorCQkJCQkgIHNtLT5hbGxvd2VkX3BhaXJ3aXNlX2NpcGhlciwgMCk7CisJaWYgKGNpcGhlciA8IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfSU5GTywgIlJTTjogU01LIFBlZXIgU1RBICIgTUFDU1RSICIgc2VsZWN0ZWQgIgogCQkJICAgInVuYWNjZXB0YWJsZSBjaXBoZXIiLCBNQUMyU1RSKGtkZS0+bWFjX2FkZHIpKTsKIAkJd3BhX3N1cHBsaWNhbnRfc2VuZF9zbWtfZXJyb3Ioc20sIHNyY19hZGRyLCBrZGUtPm1hY19hZGRyLApAQCAtNTE1LDYgKzUwMSw5IEBACiAJCS8qIFRPRE86IGFib3J0IG5lZ290aWF0aW9uICovCiAJCXJldHVybiAtMTsKIAl9CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFVzaW5nICVzIGZvciBQZWVyS2V5IiwKKwkJICAgd3BhX2NpcGhlcl90eHQoY2lwaGVyKSk7CisJcGVlcmtleS0+Y2lwaGVyID0gY2lwaGVyOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvcG1rc2FfY2FjaGUuYyBiL3NyYy9yc25fc3VwcC9wbWtzYV9jYWNoZS5jCmluZGV4IDk3ODNlN2MuLmRmNjc1ODMgMTAwNjQ0Ci0tLSBhL3NyYy9yc25fc3VwcC9wbWtzYV9jYWNoZS5jCisrKyBiL3NyYy9yc25fc3VwcC9wbWtzYV9jYWNoZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAJc3RydWN0IHdwYV9zbSAqc207IC8qIFRPRE86IGdldCByaWQgb2YgdGhpcyByZWZlcmVuY2UoPykgKi8KIAogCXZvaWQgKCpmcmVlX2NiKShzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSwgdm9pZCAqY3R4LAotCQkJaW50IHJlcGxhY2UpOworCQkJZW51bSBwbWtzYV9mcmVlX3JlYXNvbiByZWFzb24pOwogCXZvaWQgKmN0eDsKIH07CiAKQEAgLTQxLDExICs0MSwxMSBAQAogCiBzdGF0aWMgdm9pZCBwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHN0cnVjdCByc25fcG1rc2FfY2FjaGUgKnBta3NhLAogCQkJCSAgIHN0cnVjdCByc25fcG1rc2FfY2FjaGVfZW50cnkgKmVudHJ5LAotCQkJCSAgIGludCByZXBsYWNlKQorCQkJCSAgIGVudW0gcG1rc2FfZnJlZV9yZWFzb24gcmVhc29uKQogewogCXdwYV9zbV9yZW1vdmVfcG1raWQocG1rc2EtPnNtLCBlbnRyeS0+YWEsIGVudHJ5LT5wbWtpZCk7CiAJcG1rc2EtPnBta3NhX2NvdW50LS07Ci0JcG1rc2EtPmZyZWVfY2IoZW50cnksIHBta3NhLT5jdHgsIHJlcGxhY2UpOworCXBta3NhLT5mcmVlX2NiKGVudHJ5LCBwbWtzYS0+Y3R4LCByZWFzb24pOwogCV9wbWtzYV9jYWNoZV9mcmVlX2VudHJ5KGVudHJ5KTsKIH0KIApAQCAtNjEsNyArNjEsNyBAQAogCQlwbWtzYS0+cG1rc2EgPSBlbnRyeS0+bmV4dDsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IGV4cGlyZWQgUE1LU0EgY2FjaGUgZW50cnkgZm9yICIKIAkJCSAgIE1BQ1NUUiwgTUFDMlNUUihlbnRyeS0+YWEpKTsKLQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgZW50cnksIDApOworCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBlbnRyeSwgUE1LU0FfRVhQSVJFKTsKIAl9CiAKIAlwbWtzYV9jYWNoZV9zZXRfZXhwaXJhdGlvbihwbWtzYSk7CkBAIC0xNjQsMjIgKzE2NCw5IEBACiAJCQkJcG1rc2EtPnBta3NhID0gcG9zLT5uZXh0OwogCQkJZWxzZQogCQkJCXByZXYtPm5leHQgPSBwb3MtPm5leHQ7Ci0JCQlpZiAocG9zID09IHBta3NhLT5zbS0+Y3VyX3Bta3NhKSB7Ci0JCQkJLyogV2UgYXJlIGFib3V0IHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgUE1LU0EKLQkJCQkgKiBjYWNoZSBlbnRyeS4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIFBNS1NBCi0JCQkJICogY2FjaGluZyBhdHRlbXB0IGZhaWxzLCBzbyB3ZSBkb24ndCB3YW50IHRvCi0JCQkJICogZm9yY2UgcG1rc2FfY2FjaGVfZnJlZV9lbnRyeSgpIHRvIGRpc2Nvbm5lY3QKLQkJCQkgKiBhdCB0aGlzIHBvaW50LiBMZXQncyBqdXN0IG1ha2Ugc3VyZSB0aGUgb2xkCi0JCQkJICogUE1LU0EgY2FjaGUgZW50cnkgd2lsbCBub3QgYmUgdXNlZCBpbiB0aGUKLQkJCQkgKiBmdXR1cmUuCi0JCQkJICovCi0JCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IHJlcGxhY2luZyBjdXJyZW50ICIKLQkJCQkJICAgIlBNS1NBIGVudHJ5Iik7Ci0JCQkJcG1rc2EtPnNtLT5jdXJfcG1rc2EgPSBOVUxMOwotCQkJfQogCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSU046IFJlcGxhY2UgUE1LU0EgZW50cnkgZm9yICIKIAkJCQkgICAidGhlIGN1cnJlbnQgQVAiKTsKLQkJCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIHBvcywgMSk7CisJCQlwbWtzYV9jYWNoZV9mcmVlX2VudHJ5KHBta3NhLCBwb3MsIFBNS1NBX1JFUExBQ0UpOwogCiAJCQkvKgogCQkJICogSWYgT0tDIGlzIHVzZWQsIHRoZXJlIG1heSBiZSBvdGhlciBQTUtTQSBjYWNoZQpAQCAtMjE0LDcgKzIwMSw3IEBACiAJCQkJICAgIlBNS1NBIGNhY2hlIGVudHJ5IChmb3IgIiBNQUNTVFIgIikgdG8gIgogCQkJCSAgICJtYWtlIHJvb20gZm9yIG5ldyBvbmUiLAogCQkJCSAgIE1BQzJTVFIocG9zLT5hYSkpOwotCQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgcG9zLCAwKTsKKwkJCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIHBvcywgUE1LU0FfRlJFRSk7CiAJCX0KIAl9CiAKQEAgLTI2NSw3ICsyNTIsNyBAQAogCQkJCXBta3NhLT5wbWtzYSA9IGVudHJ5LT5uZXh0OwogCQkJdG1wID0gZW50cnk7CiAJCQllbnRyeSA9IGVudHJ5LT5uZXh0OwotCQkJcG1rc2FfY2FjaGVfZnJlZV9lbnRyeShwbWtzYSwgdG1wLCAwKTsKKwkJCXBta3NhX2NhY2hlX2ZyZWVfZW50cnkocG1rc2EsIHRtcCwgUE1LU0FfRlJFRSk7CiAJCQlyZW1vdmVkKys7CiAJCX0gZWxzZSB7CiAJCQlwcmV2ID0gZW50cnk7CkBAIC01MDcsNyArNDk0LDcgQEAKICAqLwogc3RydWN0IHJzbl9wbWtzYV9jYWNoZSAqCiBwbWtzYV9jYWNoZV9pbml0KHZvaWQgKCpmcmVlX2NiKShzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSwKLQkJCQkgdm9pZCAqY3R4LCBpbnQgcmVwbGFjZSksCisJCQkJIHZvaWQgKmN0eCwgZW51bSBwbWtzYV9mcmVlX3JlYXNvbiByZWFzb24pLAogCQkgdm9pZCAqY3R4LCBzdHJ1Y3Qgd3BhX3NtICpzbSkKIHsKIAlzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlICpwbWtzYTsKZGlmZiAtLWdpdCBhL3NyYy9yc25fc3VwcC9wbWtzYV9jYWNoZS5oIGIvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmgKaW5kZXggOTI0NWFhYi4uZjMxOGM1MiAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmgKKysrIGIvc3JjL3Jzbl9zdXBwL3Bta3NhX2NhY2hlLmgKQEAgLTM4LDExICszOCwxNyBAQAogCiBzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlOwogCitlbnVtIHBta3NhX2ZyZWVfcmVhc29uIHsKKwlQTUtTQV9GUkVFLAorCVBNS1NBX1JFUExBQ0UsCisJUE1LU0FfRVhQSVJFLAorfTsKKwogI2lmIGRlZmluZWQoSUVFRTgwMjFYX0VBUE9MKSAmJiAhZGVmaW5lZChDT05GSUdfTk9fV1BBMikKIAogc3RydWN0IHJzbl9wbWtzYV9jYWNoZSAqCiBwbWtzYV9jYWNoZV9pbml0KHZvaWQgKCpmcmVlX2NiKShzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSwKLQkJCQkgdm9pZCAqY3R4LCBpbnQgcmVwbGFjZSksCisJCQkJIHZvaWQgKmN0eCwgZW51bSBwbWtzYV9mcmVlX3JlYXNvbiByZWFzb24pLAogCQkgdm9pZCAqY3R4LCBzdHJ1Y3Qgd3BhX3NtICpzbSk7CiB2b2lkIHBta3NhX2NhY2hlX2RlaW5pdChzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlICpwbWtzYSk7CiBzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICogcG1rc2FfY2FjaGVfZ2V0KHN0cnVjdCByc25fcG1rc2FfY2FjaGUgKnBta3NhLApAQCAtNjYsNyArNzIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCByc25fcG1rc2FfY2FjaGUgKgogcG1rc2FfY2FjaGVfaW5pdCh2b2lkICgqZnJlZV9jYikoc3RydWN0IHJzbl9wbWtzYV9jYWNoZV9lbnRyeSAqZW50cnksCi0JCQkJIHZvaWQgKmN0eCwgaW50IHJlcGxhY2UpLAorCQkJCSB2b2lkICpjdHgsIGludCByZWFzb24pLAogCQkgdm9pZCAqY3R4LCBzdHJ1Y3Qgd3BhX3NtICpzbSkKIHsKIAlyZXR1cm4gKHZvaWQgKikgLTE7CmRpZmYgLS1naXQgYS9zcmMvcnNuX3N1cHAvdGRscy5jIGIvc3JjL3Jzbl9zdXBwL3RkbHMuYwppbmRleCA3NjQ2Y2E4Li5jMzhmYWRhIDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvdGRscy5jCisrKyBiL3NyYy9yc25fc3VwcC90ZGxzLmMKQEAgLTEzMDksMjEgKzEzMDksMTAgQEAKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiBObyBzdXBwb3J0ZWQgcmF0ZXMgcmVjZWl2ZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQotCXBlZXItPnN1cHBfcmF0ZXNfbGVuID0ga2RlLT5zdXBwX3JhdGVzX2xlbiAtIDI7Ci0JaWYgKHBlZXItPnN1cHBfcmF0ZXNfbGVuID4gSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTKQotCQlwZWVyLT5zdXBwX3JhdGVzX2xlbiA9IElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUzsKLQlvc19tZW1jcHkocGVlci0+c3VwcF9yYXRlcywga2RlLT5zdXBwX3JhdGVzICsgMiwgcGVlci0+c3VwcF9yYXRlc19sZW4pOwotCi0JaWYgKGtkZS0+ZXh0X3N1cHBfcmF0ZXMpIHsKLQkJaW50IGNsZW4gPSBrZGUtPmV4dF9zdXBwX3JhdGVzX2xlbiAtIDI7Ci0JCWlmIChwZWVyLT5zdXBwX3JhdGVzX2xlbiArIGNsZW4gPiBJRUVFODAyMTFfTUFYX1NVUFBfUkFURVMpCi0JCQljbGVuID0gSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTIC0gcGVlci0+c3VwcF9yYXRlc19sZW47Ci0JCW9zX21lbWNweShwZWVyLT5zdXBwX3JhdGVzICsgcGVlci0+c3VwcF9yYXRlc19sZW4sCi0JCQkgIGtkZS0+ZXh0X3N1cHBfcmF0ZXMgKyAyLCBjbGVuKTsKLQkJcGVlci0+c3VwcF9yYXRlc19sZW4gKz0gY2xlbjsKLQl9Ci0KKwlwZWVyLT5zdXBwX3JhdGVzX2xlbiA9IG1lcmdlX2J5dGVfYXJyYXlzKAorCQlwZWVyLT5zdXBwX3JhdGVzLCBzaXplb2YocGVlci0+c3VwcF9yYXRlcyksCisJCWtkZS0+c3VwcF9yYXRlcyArIDIsIGtkZS0+c3VwcF9yYXRlc19sZW4gLSAyLAorCQlrZGUtPmV4dF9zdXBwX3JhdGVzICsgMiwga2RlLT5leHRfc3VwcF9yYXRlc19sZW4gLSAyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Jzbl9zdXBwL3dwYS5jIGIvc3JjL3Jzbl9zdXBwL3dwYS5jCmluZGV4IDVjZjMyZGYuLmU1MDQwNGMgMTAwNjQ0Ci0tLSBhL3NyYy9yc25fc3VwcC93cGEuYworKysgYi9zcmMvcnNuX3N1cHAvd3BhLmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCQkJICAgIHJzbl9pZSwgcnNuX2llX2xlbik7CiAJfQogCi0Jd3BhX3NtX2Rpc2Fzc29jaWF0ZShzbSwgV0xBTl9SRUFTT05fSUVfSU5fNFdBWV9ESUZGRVJTKTsKKwl3cGFfc21fZGVhdXRoZW50aWNhdGUoc20sIFdMQU5fUkVBU09OX0lFX0lOXzRXQVlfRElGRkVSUyk7CiB9CiAKIApAQCAtMTgzNiw2ICsxODM2LDEwIEBACiAJY2FzZSBXUEFfS0VZX01HTVRfUFNLX1NIQTI1NjoKIAkJcmV0dXJuIFJTTl9BVVRIX0tFWV9NR01UX1BTS19TSEEyNTY7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKwljYXNlIFdQQV9LRVlfTUdNVF9DQ0tNOgorCQlyZXR1cm4gKHNtLT5wcm90byA9PSBXUEFfUFJPVE9fUlNOID8KKwkJCVJTTl9BVVRIX0tFWV9NR01UX0NDS006CisJCQlXUEFfQVVUSF9LRVlfTUdNVF9DQ0tNKTsKIAljYXNlIFdQQV9LRVlfTUdNVF9XUEFfTk9ORToKIAkJcmV0dXJuIFdQQV9BVVRIX0tFWV9NR01UX05PTkU7CiAJZGVmYXVsdDoKQEAgLTE5MzEsMjUgKzE5MzUsNDAgQEAKIAogCiBzdGF0aWMgdm9pZCB3cGFfc21fcG1rc2FfZnJlZV9jYihzdHJ1Y3QgcnNuX3Bta3NhX2NhY2hlX2VudHJ5ICplbnRyeSwKLQkJCQkgdm9pZCAqY3R4LCBpbnQgcmVwbGFjZSkKKwkJCQkgdm9pZCAqY3R4LCBlbnVtIHBta3NhX2ZyZWVfcmVhc29uIHJlYXNvbikKIHsKIAlzdHJ1Y3Qgd3BhX3NtICpzbSA9IGN0eDsKKwlpbnQgZGVhdXRoID0gMDsKIAotCWlmIChzbS0+Y3VyX3Bta3NhID09IGVudHJ5IHx8CisJd3BhX2RiZyhzbS0+Y3R4LT5tc2dfY3R4LCBNU0dfREVCVUcsICJSU046IFBNS1NBIGNhY2hlIGVudHJ5IGZyZWVfY2I6ICIKKwkJTUFDU1RSICIgcmVhc29uPSVkIiwgTUFDMlNUUihlbnRyeS0+YWEpLCByZWFzb24pOworCisJaWYgKHNtLT5jdXJfcG1rc2EgPT0gZW50cnkpIHsKKwkJd3BhX2RiZyhzbS0+Y3R4LT5tc2dfY3R4LCBNU0dfREVCVUcsCisJCQkiUlNOOiAlcyBjdXJyZW50IFBNS1NBIGVudHJ5IiwKKwkJCXJlYXNvbiA9PSBQTUtTQV9SRVBMQUNFID8gInJlcGxhY2VkIiA6ICJyZW1vdmVkIik7CisJCXBta3NhX2NhY2hlX2NsZWFyX2N1cnJlbnQoc20pOworCisJCS8qCisJCSAqIElmIGFuIGVudHJ5IGlzIHNpbXBseSBiZWluZyByZXBsYWNlZCwgdGhlcmUncyBubyBuZWVkIHRvCisJCSAqIGRlYXV0aGVudGljYXRlIGJlY2F1c2UgaXQgd2lsbCBiZSBpbW1lZGlhdGVseSByZS1hZGRlZC4KKwkJICogVGhpcyBoYXBwZW5zIHdoZW4gRUFQIGF1dGhlbnRpY2F0aW9uIGlzIGNvbXBsZXRlZCBhZ2FpbgorCQkgKiAocmVhdXRoIG9yIGZhaWxlZCBQTUtTQSBjYWNoaW5nIGF0dGVtcHQpLgorCQkgKi8KKwkJaWYgKHJlYXNvbiAhPSBQTUtTQV9SRVBMQUNFKQorCQkJZGVhdXRoID0gMTsKKwl9CisKKwlpZiAocmVhc29uID09IFBNS1NBX0VYUElSRSAmJgogCSAgICAoc20tPnBta19sZW4gPT0gZW50cnktPnBta19sZW4gJiYKIAkgICAgIG9zX21lbWNtcChzbS0+cG1rLCBlbnRyeS0+cG1rLCBzbS0+cG1rX2xlbikgPT0gMCkpIHsKIAkJd3BhX2RiZyhzbS0+Y3R4LT5tc2dfY3R4LCBNU0dfREVCVUcsCi0JCQkiUlNOOiByZW1vdmVkIGN1cnJlbnQgUE1LU0EgZW50cnkiKTsKLQkJc20tPmN1cl9wbWtzYSA9IE5VTEw7CisJCQkiUlNOOiBkZWF1dGhlbnRpY2F0aW5nIGR1ZSB0byBleHBpcmVkIFBNSyIpOworCQlwbWtzYV9jYWNoZV9jbGVhcl9jdXJyZW50KHNtKTsKKwkJZGVhdXRoID0gMTsKKwl9CiAKLQkJaWYgKHJlcGxhY2UpIHsKLQkJCS8qIEEgbmV3IGVudHJ5IGlzIGJlaW5nIGFkZGVkLCBzbyBubyBuZWVkIHRvCi0JCQkgKiBkZWF1dGhlbnRpY2F0ZSBpbiB0aGlzIGNhc2UuIFRoaXMgaGFwcGVucyB3aGVuIEVBUAotCQkJICogYXV0aGVudGljYXRpb24gaXMgY29tcGxldGVkIGFnYWluIChyZWF1dGggb3IgZmFpbGVkCi0JCQkgKiBQTUtTQSBjYWNoaW5nIGF0dGVtcHQpLiAqLwotCQkJcmV0dXJuOwotCQl9Ci0KKwlpZiAoZGVhdXRoKSB7CiAJCW9zX21lbXNldChzbS0+cG1rLCAwLCBzaXplb2Yoc20tPnBtaykpOwogCQl3cGFfc21fZGVhdXRoZW50aWNhdGUoc20sIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEKTsKIAl9CkBAIC0yMDgwLDYgKzIwOTksNyBAQAogdm9pZCB3cGFfc21fbm90aWZ5X2Rpc2Fzc29jKHN0cnVjdCB3cGFfc20gKnNtKQogewogCXJzbl9wcmVhdXRoX2RlaW5pdChzbSk7CisJcG1rc2FfY2FjaGVfY2xlYXJfY3VycmVudChzbSk7CiAJaWYgKHdwYV9zbV9nZXRfc3RhdGUoc20pID09IFdQQV80V0FZX0hBTkRTSEFLRSkKIAkJc20tPmRvdDExUlNOQTRXYXlIYW5kc2hha2VGYWlsdXJlcysrOwogI2lmZGVmIENPTkZJR19URExTCkBAIC0yMzcyLDYgKzIzOTIsMjIgQEAKIAlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQogCQlyZXR1cm4gcG9zIC0gYnVmOwogCXBvcyArPSByZXQ7CisKKwlpZiAoc20tPm1mcCAhPSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04gJiYgc20tPmFwX3Jzbl9pZSkgeworCQlzdHJ1Y3Qgd3BhX2llX2RhdGEgcnNuOworCQlpZiAod3BhX3BhcnNlX3dwYV9pZV9yc24oc20tPmFwX3Jzbl9pZSwgc20tPmFwX3Jzbl9pZV9sZW4sICZyc24pCisJCSAgICA+PSAwICYmCisJCSAgICByc24uY2FwYWJpbGl0aWVzICYgKFdQQV9DQVBBQklMSVRZX01GUFIgfAorCQkJCQlXUEFfQ0FQQUJJTElUWV9NRlBDKSkgeworCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJwbWY9JWRcbiIsCisJCQkJCSAgKHJzbi5jYXBhYmlsaXRpZXMgJgorCQkJCQkgICBXUEFfQ0FQQUJJTElUWV9NRlBSKSA/IDIgOiAxKTsKKwkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJCXBvcyArPSByZXQ7CisJCX0KKwl9CisKIAlyZXR1cm4gcG9zIC0gYnVmOwogfQogCkBAIC0yNTkxLDcgKzI2MjcsNyBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorI2lmZGVmIENPTkZJR19XTk0KIGludCB3cGFfd25tc2xlZXBfaW5zdGFsbF9rZXkoc3RydWN0IHdwYV9zbSAqc20sIHU4IHN1YmVsZW1faWQsIHU4ICpidWYpCiB7CiAJc3RydWN0IHdwYV9ndGtfZGF0YSBnZDsKQEAgLTI2MDEsNyArMjYzNyw2IEBACiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAl1MTYga2V5aW5mbzsKIAl1OCBrZXlsZW47ICAvKiBwbGFpbnRleHQga2V5IGxlbiAqLwotCXU4IGtleWRhdGFsZW47CiAJdTggKmtleV9yc2M7CiAKIAlvc19tZW1zZXQoJmdkLCAwLCBzaXplb2YoZ2QpKTsKQEAgLTI2MTksOCArMjY1NCw3IEBACiAKIAlpZiAoc3ViZWxlbV9pZCA9PSBXTk1fU0xFRVBfU1VCRUxFTV9HVEspIHsKIAkJa2V5X3JzYyA9IGJ1ZiArIDU7Ci0JCWtleWluZm8gPSBXUEFfR0VUX0xFMTYoYnVmKzIpOwotCQlrZXlkYXRhbGVuID0gYnVmWzFdIC0gMTEgLSA4OworCQlrZXlpbmZvID0gV1BBX0dFVF9MRTE2KGJ1ZiArIDIpOwogCQlnZC5ndGtfbGVuID0ga2V5bGVuOwogCQlpZiAoZ2QuZ3RrX2xlbiAhPSBidWZbNF0pIHsKIAkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiR1RLIGxlbiBtaXNtYXRjaCBsZW4gJWQgdnMgJWQiLApAQCAtMjYzMSwxOCArMjY2NSw3IEBACiAJCWdkLnR4ID0gd3BhX3N1cHBsaWNhbnRfZ3RrX3R4X2JpdF93b3JrYXJvdW5kKAogCQkgICAgICAgICBzbSwgISEoa2V5aW5mbyAmIFdQQV9LRVlfSU5GT19UWFJYKSk7CiAKLQkJaWYgKGtleWRhdGFsZW4gJSA4KSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQQTogVW5zdXBwb3J0ZWQgQUVTLVdSQVAgbGVuICIKLQkJCQkgICAiJWQiLCBrZXlkYXRhbGVuKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChhZXNfdW53cmFwKHNtLT5wdGsua2VrLCBrZXlkYXRhbGVuIC8gOCwgYnVmICsgMTMsIGdkLmd0aykpCi0JCXsKLQkJCXdwYV9wcmludGYoTVNHX1dBUk5JTkcsICJXTk06IEFFUyB1bndyYXAgZmFpbGVkIC0gIgotCQkJCSAgICJjb3VsZCBub3QgZGVjcnlwdCBHVEsiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorCQlvc19tZW1jcHkoZ2QuZ3RrLCBidWYgKyAxMywgZ2QuZ3RrX2xlbik7CiAKIAkJd3BhX2hleGR1bXBfa2V5KE1TR19ERUJVRywgIkluc3RhbGwgR1RLIChXTk0gU0xFRVApIiwKIAkJCQlnZC5ndGssIGdkLmd0a19sZW4pOwpAQCAtMjY1MywyMiArMjY3NiwxMSBAQAogCQl9CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIAl9IGVsc2UgaWYgKHN1YmVsZW1faWQgPT0gV05NX1NMRUVQX1NVQkVMRU1fSUdUSykgewotCQlpZiAoYnVmWzFdICE9IDIgKyA2ICsgV1BBX0lHVEtfTEVOICsgOCkgewotCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUEE6IFVuc3VwcG9ydGVkIEFFUy1XUkFQIGxlbiAiCi0JCQkJICAgIiVkIiwgYnVmWzFdIC0gMiAtIDYgLSA4KTsKLQkJCXJldHVybiAtMTsKLQkJfQogCQlvc19tZW1jcHkoaWdkLmtleWlkLCBidWYgKyAyLCAyKTsKIAkJb3NfbWVtY3B5KGlnZC5wbiwgYnVmICsgNCwgNik7CiAKIAkJa2V5aWR4ID0gV1BBX0dFVF9MRTE2KGlnZC5rZXlpZCk7Ci0KLQkJaWYgKGFlc191bndyYXAoc20tPnB0ay5rZWssIFdQQV9JR1RLX0xFTiAvIDgsIGJ1ZiArIDEwLAotCQkJICAgICAgIGlnZC5pZ3RrKSkgewotCQkJd3BhX3ByaW50ZihNU0dfV0FSTklORywgIldOTTogQUVTIHVud3JhcCBmYWlsZWQgLSAiCi0JCQkJICAgImNvdWxkIG5vdCBkZWNyeXByIElHVEsiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorCQlvc19tZW1jcHkoaWdkLmlndGssIGJ1ZiArIDEwLCBXUEFfSUdUS19MRU4pOwogCiAJCXdwYV9oZXhkdW1wX2tleShNU0dfREVCVUcsICJJbnN0YWxsIElHVEsgKFdOTSBTTEVFUCkiLAogCQkJCWlnZC5pZ3RrLCBXUEFfSUdUS19MRU4pOwpAQCAtMjY4Nyw0ICsyNjk5LDQgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jzbl9zdXBwL3dwYS5oIGIvc3JjL3Jzbl9zdXBwL3dwYS5oCmluZGV4IDEwNzdiNWEuLjc5MTk3NGMgMTAwNjQ0Ci0tLSBhL3NyYy9yc25fc3VwcC93cGEuaAorKysgYi9zcmMvcnNuX3N1cHAvd3BhLmgKQEAgLTI0LDcgKzI0LDYgQEAKIAl2b2lkICgqc2V0X3N0YXRlKSh2b2lkICpjdHgsIGVudW0gd3BhX3N0YXRlcyBzdGF0ZSk7CiAJZW51bSB3cGFfc3RhdGVzICgqZ2V0X3N0YXRlKSh2b2lkICpjdHgpOwogCXZvaWQgKCpkZWF1dGhlbnRpY2F0ZSkodm9pZCAqIGN0eCwgaW50IHJlYXNvbl9jb2RlKTsgCi0Jdm9pZCAoKmRpc2Fzc29jaWF0ZSkodm9pZCAqY3R4LCBpbnQgcmVhc29uX2NvZGUpOwogCWludCAoKnNldF9rZXkpKHZvaWQgKmN0eCwgZW51bSB3cGFfYWxnIGFsZywKIAkJICAgICAgIGNvbnN0IHU4ICphZGRyLCBpbnQga2V5X2lkeCwgaW50IHNldF90eCwKIAkJICAgICAgIGNvbnN0IHU4ICpzZXEsIHNpemVfdCBzZXFfbGVuLApAQCAtMzY2LDggKzM2NSw2IEBACiB2b2lkIHdwYV90ZGxzX2Rpc2FibGVfbGluayhzdHJ1Y3Qgd3BhX3NtICpzbSwgY29uc3QgdTggKmFkZHIpOwogaW50IHdwYV90ZGxzX2lzX2V4dGVybmFsX3NldHVwKHN0cnVjdCB3cGFfc20gKnNtKTsKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCiBpbnQgd3BhX3dubXNsZWVwX2luc3RhbGxfa2V5KHN0cnVjdCB3cGFfc20gKnNtLCB1OCBzdWJlbGVtX2lkLCB1OCAqYnVmKTsKLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLwogCiAjZW5kaWYgLyogV1BBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9yc25fc3VwcC93cGFfaS5oIGIvc3JjL3Jzbl9zdXBwL3dwYV9pLmgKaW5kZXggYzMwZDA5ZS4uOWY5ZTY0MSAxMDA2NDQKLS0tIGEvc3JjL3Jzbl9zdXBwL3dwYV9pLmgKKysrIGIvc3JjL3Jzbl9zdXBwL3dwYV9pLmgKQEAgLTE0MywxMiArMTQzLDYgQEAKIAlzbS0+Y3R4LT5kZWF1dGhlbnRpY2F0ZShzbS0+Y3R4LT5jdHgsIHJlYXNvbl9jb2RlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdwYV9zbV9kaXNhc3NvY2lhdGUoc3RydWN0IHdwYV9zbSAqc20sIGludCByZWFzb25fY29kZSkKLXsKLQlXUEFfQVNTRVJUKHNtLT5jdHgtPmRpc2Fzc29jaWF0ZSk7Ci0Jc20tPmN0eC0+ZGlzYXNzb2NpYXRlKHNtLT5jdHgtPmN0eCwgcmVhc29uX2NvZGUpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB3cGFfc21fc2V0X2tleShzdHJ1Y3Qgd3BhX3NtICpzbSwgZW51bSB3cGFfYWxnIGFsZywKIAkJCQkgY29uc3QgdTggKmFkZHIsIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LAogCQkJCSBjb25zdCB1OCAqc2VxLCBzaXplX3Qgc2VxX2xlbiwKZGlmZiAtLWdpdCBhL3NyYy9yc25fc3VwcC93cGFfaWUuYyBiL3NyYy9yc25fc3VwcC93cGFfaWUuYwppbmRleCA2YThmOWYxLi4zZDc1MzY1IDEwMDY0NAotLS0gYS9zcmMvcnNuX3N1cHAvd3BhX2llLmMKKysrIGIvc3JjL3Jzbl9zdXBwL3dwYV9pZS5jCkBAIC04Myw2ICs4Myw4IEBACiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgpOwogCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1dQQV9OT05FKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FKTsKKwl9IGVsc2UgaWYgKGtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9DQ0tNKSB7CisJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBXUEFfQVVUSF9LRVlfTUdNVF9DQ0tNKTsKIAl9IGVsc2UgewogCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAiSW52YWxpZCBrZXkgbWFuYWdlbWVudCB0eXBlICglZCkuIiwKIAkJCSAgIGtleV9tZ210KTsKQEAgLTE1Miw2ICsxNTQsOCBAQAogCQlSU05fU0VMRUNUT1JfUFVUKHBvcywgUlNOX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWCk7CiAJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfUFNLKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgpOworCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX0NDS00pIHsKKwkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX0NDS00pOwogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiAJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfRlRfSUVFRTgwMjFYKSB7CiAJCVJTTl9TRUxFQ1RPUl9QVVQocG9zLCBSU05fQVVUSF9LRVlfTUdNVF9GVF84MDJfMVgpOwpAQCAtMTY0LDYgKzE2OCwxMiBAQAogCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1BTS19TSEEyNTYpIHsKIAkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX1BTS19TSEEyNTYpOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCisjaWZkZWYgQ09ORklHX1NBRQorCX0gZWxzZSBpZiAoa2V5X21nbXQgPT0gV1BBX0tFWV9NR01UX1NBRSkgeworCQlSU05fU0VMRUNUT1JfUFVUKHBvcywgUlNOX0FVVEhfS0VZX01HTVRfU0FFKTsKKwl9IGVsc2UgaWYgKGtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9GVF9TQUUpIHsKKwkJUlNOX1NFTEVDVE9SX1BVVChwb3MsIFJTTl9BVVRIX0tFWV9NR01UX0ZUX1NBRSk7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCX0gZWxzZSB7CiAJCXdwYV9wcmludGYoTVNHX1dBUk5JTkcsICJJbnZhbGlkIGtleSBtYW5hZ2VtZW50IHR5cGUgKCVkKS4iLAogCQkJICAga2V5X21nbXQpOwpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzL2NvbW1vbi5oIGIvc3JjL3V0aWxzL2NvbW1vbi5oCmluZGV4IDVmYzkxNmMuLmE4NTkwNDIgMTAwNjQ0Ci0tLSBhL3NyYy91dGlscy9jb21tb24uaAorKysgYi9zcmMvdXRpbHMvY29tbW9uLmgKQEAgLTIyNCw2OSArMjI0LDEwNSBAQAogCiAvKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgKi8KIAotI2RlZmluZSBXUEFfR0VUX0JFMTYoYSkgKCh1MTYpICgoKGEpWzBdIDw8IDgpIHwgKGEpWzFdKSkKLSNkZWZpbmUgV1BBX1BVVF9CRTE2KGEsIHZhbCkJCQlcCi0JZG8gewkJCQkJXAotCQkoYSlbMF0gPSAoKHUxNikgKHZhbCkpID4+IDg7CVwKLQkJKGEpWzFdID0gKCh1MTYpICh2YWwpKSAmIDB4ZmY7CVwKLQl9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB1MTYgV1BBX0dFVF9CRTE2KGNvbnN0IHU4ICphKQoreworCXJldHVybiAoYVswXSA8PCA4KSB8IGFbMV07Cit9CiAKLSNkZWZpbmUgV1BBX0dFVF9MRTE2KGEpICgodTE2KSAoKChhKVsxXSA8PCA4KSB8IChhKVswXSkpCi0jZGVmaW5lIFdQQV9QVVRfTEUxNihhLCB2YWwpCQkJXAotCWRvIHsJCQkJCVwKLQkJKGEpWzFdID0gKCh1MTYpICh2YWwpKSA+PiA4OwlcCi0JCShhKVswXSA9ICgodTE2KSAodmFsKSkgJiAweGZmOwlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUEFfUFVUX0JFMTYodTggKmEsIHUxNiB2YWwpCit7CisJYVswXSA9IHZhbCA+PiA4OworCWFbMV0gPSB2YWwgJiAweGZmOworfQogCi0jZGVmaW5lIFdQQV9HRVRfQkUyNChhKSAoKCgodTMyKSAoYSlbMF0pIDw8IDE2KSB8ICgoKHUzMikgKGEpWzFdKSA8PCA4KSB8IFwKLQkJCSAoKHUzMikgKGEpWzJdKSkKLSNkZWZpbmUgV1BBX1BVVF9CRTI0KGEsIHZhbCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAotCQkoYSlbMl0gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CQlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdTE2IFdQQV9HRVRfTEUxNihjb25zdCB1OCAqYSkKK3sKKwlyZXR1cm4gKGFbMV0gPDwgOCkgfCBhWzBdOworfQogCi0jZGVmaW5lIFdQQV9HRVRfQkUzMihhKSAoKCgodTMyKSAoYSlbMF0pIDw8IDI0KSB8ICgoKHUzMikgKGEpWzFdKSA8PCAxNikgfCBcCi0JCQkgKCgodTMyKSAoYSlbMl0pIDw8IDgpIHwgKCh1MzIpIChhKVszXSkpCi0jZGVmaW5lIFdQQV9QVVRfQkUzMihhLCB2YWwpCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCShhKVswXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDI0KSAmIDB4ZmYpOwlcCi0JCShhKVsxXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDE2KSAmIDB4ZmYpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDgpICYgMHhmZik7CVwKLQkJKGEpWzNdID0gKHU4KSAoKCh1MzIpICh2YWwpKSAmIDB4ZmYpOwkJXAotCX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgV1BBX1BVVF9MRTE2KHU4ICphLCB1MTYgdmFsKQoreworCWFbMV0gPSB2YWwgPj4gODsKKwlhWzBdID0gdmFsICYgMHhmZjsKK30KIAotI2RlZmluZSBXUEFfR0VUX0xFMzIoYSkgKCgoKHUzMikgKGEpWzNdKSA8PCAyNCkgfCAoKCh1MzIpIChhKVsyXSkgPDwgMTYpIHwgXAotCQkJICgoKHUzMikgKGEpWzFdKSA8PCA4KSB8ICgodTMyKSAoYSlbMF0pKQotI2RlZmluZSBXUEFfUFVUX0xFMzIoYSwgdmFsKQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQkoYSlbM10gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiAyNCkgJiAweGZmKTsJXAotCQkoYSlbMl0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiAxNikgJiAweGZmKTsJXAotCQkoYSlbMV0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiA4KSAmIDB4ZmYpOwlcCi0JCShhKVswXSA9ICh1OCkgKCgodTMyKSAodmFsKSkgJiAweGZmKTsJCVwKLQl9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB1MzIgV1BBX0dFVF9CRTI0KGNvbnN0IHU4ICphKQoreworCXJldHVybiAoYVswXSA8PCAxNikgfCAoYVsxXSA8PCA4KSB8IGFbMl07Cit9CiAKLSNkZWZpbmUgV1BBX0dFVF9CRTY0KGEpICgoKCh1NjQpIChhKVswXSkgPDwgNTYpIHwgKCgodTY0KSAoYSlbMV0pIDw8IDQ4KSB8IFwKLQkJCSAoKCh1NjQpIChhKVsyXSkgPDwgNDApIHwgKCgodTY0KSAoYSlbM10pIDw8IDMyKSB8IFwKLQkJCSAoKCh1NjQpIChhKVs0XSkgPDwgMjQpIHwgKCgodTY0KSAoYSlbNV0pIDw8IDE2KSB8IFwKLQkJCSAoKCh1NjQpIChhKVs2XSkgPDwgOCkgfCAoKHU2NCkgKGEpWzddKSkKLSNkZWZpbmUgV1BBX1BVVF9CRTY0KGEsIHZhbCkJCQkJXAotCWRvIHsJCQkJCQlcCi0JCShhKVswXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNTYpOwlcCi0JCShhKVsxXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDgpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDApOwlcCi0JCShhKVszXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMzIpOwlcCi0JCShhKVs0XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMjQpOwlcCi0JCShhKVs1XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMTYpOwlcCi0JCShhKVs2XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gOCk7CVwKLQkJKGEpWzddID0gKHU4KSAoKCh1NjQpICh2YWwpKSAmIDB4ZmYpOwlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUEFfUFVUX0JFMjQodTggKmEsIHUzMiB2YWwpCit7CisJYVswXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKwlhWzFdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJYVsyXSA9IHZhbCAmIDB4ZmY7Cit9CiAKLSNkZWZpbmUgV1BBX0dFVF9MRTY0KGEpICgoKCh1NjQpIChhKVs3XSkgPDwgNTYpIHwgKCgodTY0KSAoYSlbNl0pIDw8IDQ4KSB8IFwKLQkJCSAoKCh1NjQpIChhKVs1XSkgPDwgNDApIHwgKCgodTY0KSAoYSlbNF0pIDw8IDMyKSB8IFwKLQkJCSAoKCh1NjQpIChhKVszXSkgPDwgMjQpIHwgKCgodTY0KSAoYSlbMl0pIDw8IDE2KSB8IFwKLQkJCSAoKCh1NjQpIChhKVsxXSkgPDwgOCkgfCAoKHU2NCkgKGEpWzBdKSkKK3N0YXRpYyBpbmxpbmUgdTMyIFdQQV9HRVRfQkUzMihjb25zdCB1OCAqYSkKK3sKKwlyZXR1cm4gKGFbMF0gPDwgMjQpIHwgKGFbMV0gPDwgMTYpIHwgKGFbMl0gPDwgOCkgfCBhWzNdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1BBX1BVVF9CRTMyKHU4ICphLCB1MzIgdmFsKQoreworCWFbMF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisJYVsxXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKwlhWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJYVszXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIFdQQV9HRVRfTEUzMihjb25zdCB1OCAqYSkKK3sKKwlyZXR1cm4gKGFbM10gPDwgMjQpIHwgKGFbMl0gPDwgMTYpIHwgKGFbMV0gPDwgOCkgfCBhWzBdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1BBX1BVVF9MRTMyKHU4ICphLCB1MzIgdmFsKQoreworCWFbM10gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisJYVsyXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKwlhWzFdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJYVswXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IFdQQV9HRVRfQkU2NChjb25zdCB1OCAqYSkKK3sKKwlyZXR1cm4gKCgodTY0KSBhWzBdKSA8PCA1NikgfCAoKCh1NjQpIGFbMV0pIDw8IDQ4KSB8CisJCSgoKHU2NCkgYVsyXSkgPDwgNDApIHwgKCgodTY0KSBhWzNdKSA8PCAzMikgfAorCQkoKCh1NjQpIGFbNF0pIDw8IDI0KSB8ICgoKHU2NCkgYVs1XSkgPDwgMTYpIHwKKwkJKCgodTY0KSBhWzZdKSA8PCA4KSB8ICgodTY0KSBhWzddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFdQQV9QVVRfQkU2NCh1OCAqYSwgdTY0IHZhbCkKK3sKKwlhWzBdID0gdmFsID4+IDU2OworCWFbMV0gPSB2YWwgPj4gNDg7CisJYVsyXSA9IHZhbCA+PiA0MDsKKwlhWzNdID0gdmFsID4+IDMyOworCWFbNF0gPSB2YWwgPj4gMjQ7CisJYVs1XSA9IHZhbCA+PiAxNjsKKwlhWzZdID0gdmFsID4+IDg7CisJYVs3XSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IFdQQV9HRVRfTEU2NChjb25zdCB1OCAqYSkKK3sKKwlyZXR1cm4gKCgodTY0KSBhWzddKSA8PCA1NikgfCAoKCh1NjQpIGFbNl0pIDw8IDQ4KSB8CisJCSgoKHU2NCkgYVs1XSkgPDwgNDApIHwgKCgodTY0KSBhWzRdKSA8PCAzMikgfAorCQkoKCh1NjQpIGFbM10pIDw8IDI0KSB8ICgoKHU2NCkgYVsyXSkgPDwgMTYpIHwKKwkJKCgodTY0KSBhWzFdKSA8PCA4KSB8ICgodTY0KSBhWzBdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFdQQV9QVVRfTEU2NCh1OCAqYSwgdTY0IHZhbCkKK3sKKwlhWzddID0gdmFsID4+IDU2OworCWFbNl0gPSB2YWwgPj4gNDg7CisJYVs1XSA9IHZhbCA+PiA0MDsKKwlhWzRdID0gdmFsID4+IDMyOworCWFbM10gPSB2YWwgPj4gMjQ7CisJYVsyXSA9IHZhbCA+PiAxNjsKKwlhWzFdID0gdmFsID4+IDg7CisJYVswXSA9IHZhbCAmIDB4ZmY7Cit9CiAKIAogI2lmbmRlZiBFVEhfQUxFTgpkaWZmIC0tZ2l0IGEvc3JjL3dwcy9uZGVmLmMgYi9zcmMvd3BzL25kZWYuYwppbmRleCA3NjMwZWNiLi5hNDhhMmQ3IDEwMDY0NAotLS0gYS9zcmMvd3BzL25kZWYuYworKysgYi9zcmMvd3BzL25kZWYuYwpAQCAtMTAsMTMgKzEwLDEzIEBACiAjaW5jbHVkZSAiaW5jbHVkZXMuaCIKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJ3cHMvd3BzLmgiCi0jaW5jbHVkZSAid3BzL3dwc19pLmgiCiAKICNkZWZpbmUgRkxBR19NRVNTQUdFX0JFR0lOICgxIDw8IDcpCiAjZGVmaW5lIEZMQUdfTUVTU0FHRV9FTkQgKDEgPDwgNikKICNkZWZpbmUgRkxBR19DSFVOSyAoMSA8PCA1KQogI2RlZmluZSBGTEFHX1NIT1JUX1JFQ09SRCAoMSA8PCA0KQogI2RlZmluZSBGTEFHX0lEX0xFTkdUSF9QUkVTRU5UICgxIDw8IDMpCisjZGVmaW5lIEZMQUdfVE5GX05GQ19GT1JVTSAoMHgwMSkKICNkZWZpbmUgRkxBR19UTkZfUkZDMjA0NiAoMHgwMikKIAogc3RydWN0IG5kZWZfcmVjb3JkIHsKQEAgLTE2OCwzICsxNjgsNzggQEAKIAkJCQkgRkxBR19UTkZfUkZDMjA0Niwgd2lmaV9oYW5kb3Zlcl90eXBlLAogCQkJCSBvc19zdHJsZW4od2lmaV9oYW5kb3Zlcl90eXBlKSwgTlVMTCwgMCwgYnVmKTsKIH0KKworCitzdHJ1Y3Qgd3BhYnVmICogbmRlZl9idWlsZF93aWZpX2hyKHZvaWQpCit7CisJc3RydWN0IHdwYWJ1ZiAqcm4sICpjciwgKmFjX3BheWxvYWQsICphYywgKmhyX3BheWxvYWQsICpocjsKKwlzdHJ1Y3Qgd3BhYnVmICpjYXJyaWVyLCAqaGM7CisKKwlybiA9IHdwYWJ1Zl9hbGxvYygyKTsKKwlpZiAocm4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJd3BhYnVmX3B1dF9iZTE2KHJuLCBvc19yYW5kb20oKSAmIDB4ZmZmZik7CisKKwljciA9IG5kZWZfYnVpbGRfcmVjb3JkKEZMQUdfTUVTU0FHRV9CRUdJTiB8IEZMQUdfVE5GX05GQ19GT1JVTSwgImNyIiwgMiwKKwkJCSAgICAgICBOVUxMLCAwLCBybik7CisJd3BhYnVmX2ZyZWUocm4pOworCisJaWYgKGNyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJYWNfcGF5bG9hZCA9IHdwYWJ1Zl9hbGxvYyg0KTsKKwlpZiAoYWNfcGF5bG9hZCA9PSBOVUxMKSB7CisJCXdwYWJ1Zl9mcmVlKGNyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXdwYWJ1Zl9wdXRfdTgoYWNfcGF5bG9hZCwgMHgwMSk7IC8qIENhcnJpZXIgRmxhZ3M6IENSUz0xICJhY3RpdmUiICovCisJd3BhYnVmX3B1dF91OChhY19wYXlsb2FkLCAweDAxKTsgLyogQ2FycmllciBEYXRhIFJlZmVyZW5jZSBMZW5ndGggKi8KKwl3cGFidWZfcHV0X3U4KGFjX3BheWxvYWQsICcwJyk7IC8qIENhcnJpZXIgRGF0YSBSZWZlcmVuY2U6ICIwIiAqLworCXdwYWJ1Zl9wdXRfdTgoYWNfcGF5bG9hZCwgMCk7IC8qIEF1eCBEYXRhIFJlZmVyZW5jZSBDb3VudCAqLworCisJYWMgPSBuZGVmX2J1aWxkX3JlY29yZChGTEFHX01FU1NBR0VfRU5EIHwgRkxBR19UTkZfTkZDX0ZPUlVNLCAiYWMiLCAyLAorCQkJICAgICAgIE5VTEwsIDAsIGFjX3BheWxvYWQpOworCXdwYWJ1Zl9mcmVlKGFjX3BheWxvYWQpOworCWlmIChhYyA9PSBOVUxMKSB7CisJCXdwYWJ1Zl9mcmVlKGNyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaHJfcGF5bG9hZCA9IHdwYWJ1Zl9hbGxvYygxICsgd3BhYnVmX2xlbihjcikgKyB3cGFidWZfbGVuKGFjKSk7CisJaWYgKGhyX3BheWxvYWQgPT0gTlVMTCkgeworCQl3cGFidWZfZnJlZShjcik7CisJCXdwYWJ1Zl9mcmVlKGFjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd3BhYnVmX3B1dF91OChocl9wYXlsb2FkLCAweDEyKTsgLyogQ29ubmVjdGlvbiBIYW5kb3ZlciBWZXJzaW9uIDEuMiAqLworCXdwYWJ1Zl9wdXRfYnVmKGhyX3BheWxvYWQsIGNyKTsKKwl3cGFidWZfcHV0X2J1Zihocl9wYXlsb2FkLCBhYyk7CisJd3BhYnVmX2ZyZWUoY3IpOworCXdwYWJ1Zl9mcmVlKGFjKTsKKworCWhyID0gbmRlZl9idWlsZF9yZWNvcmQoRkxBR19NRVNTQUdFX0JFR0lOIHwgRkxBR19UTkZfTkZDX0ZPUlVNLCAiSHIiLCAyLAorCQkJICAgICAgIE5VTEwsIDAsIGhyX3BheWxvYWQpOworCXdwYWJ1Zl9mcmVlKGhyX3BheWxvYWQpOworCWlmIChociA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNhcnJpZXIgPSB3cGFidWZfYWxsb2MoMiArIG9zX3N0cmxlbih3aWZpX2hhbmRvdmVyX3R5cGUpKTsKKwlpZiAoY2FycmllciA9PSBOVUxMKSB7CisJCXdwYWJ1Zl9mcmVlKGhyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXdwYWJ1Zl9wdXRfdTgoY2FycmllciwgMHgwMik7IC8qIENhcnJpZXIgVHlwZSBGb3JtYXQgKi8KKwl3cGFidWZfcHV0X3U4KGNhcnJpZXIsIG9zX3N0cmxlbih3aWZpX2hhbmRvdmVyX3R5cGUpKTsKKwl3cGFidWZfcHV0X3N0cihjYXJyaWVyLCB3aWZpX2hhbmRvdmVyX3R5cGUpOworCisJaGMgPSBuZGVmX2J1aWxkX3JlY29yZChGTEFHX01FU1NBR0VfRU5EIHwgRkxBR19UTkZfTkZDX0ZPUlVNLCAiSGMiLCAyLAorCQkJICAgICAgICIwIiwgMSwgY2Fycmllcik7CisJd3BhYnVmX2ZyZWUoY2Fycmllcik7CisJaWYgKGhjID09IE5VTEwpIHsKKwkJd3BhYnVmX2ZyZWUoaHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gd3BhYnVmX2NvbmNhdChociwgaGMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHMuYyBiL3NyYy93cHMvd3BzLmMKaW5kZXggNGMyMzIyZC4uMjU3NTcwNSAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHMuYworKysgYi9zcmMvd3BzL3dwcy5jCkBAIC00NSw4ICs0NSw3IEBACiAJCW9zX21lbWNweShkYXRhLT51dWlkX2UsIGNmZy0+d3BzLT51dWlkLCBXUFNfVVVJRF9MRU4pOwogCX0KIAlpZiAoY2ZnLT5waW4pIHsKLQkJZGF0YS0+ZGV2X3B3X2lkID0gZGF0YS0+d3BzLT5vb2JfZGV2X3B3X2lkID09IDAgPwotCQkJY2ZnLT5kZXZfcHdfaWQgOiBkYXRhLT53cHMtPm9vYl9kZXZfcHdfaWQ7CisJCWRhdGEtPmRldl9wd19pZCA9IGNmZy0+ZGV2X3B3X2lkOwogCQlkYXRhLT5kZXZfcGFzc3dvcmQgPSBvc19tYWxsb2MoY2ZnLT5waW5fbGVuKTsKIAkJaWYgKGRhdGEtPmRldl9wYXNzd29yZCA9PSBOVUxMKSB7CiAJCQlvc19mcmVlKGRhdGEpOwpAQCAtMTEwLDYgKzEwOSw3IEBACiAJCWRhdGEtPm5ld19hcF9zZXR0aW5ncyA9CiAJCQlvc19tYWxsb2Moc2l6ZW9mKCpkYXRhLT5uZXdfYXBfc2V0dGluZ3MpKTsKIAkJaWYgKGRhdGEtPm5ld19hcF9zZXR0aW5ncyA9PSBOVUxMKSB7CisJCQlvc19mcmVlKGRhdGEtPmRldl9wYXNzd29yZCk7CiAJCQlvc19mcmVlKGRhdGEpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzLmggYi9zcmMvd3BzL3dwcy5oCmluZGV4IGM0NWI2OGMuLmM2YjcwOTkgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzLmgKKysrIGIvc3JjL3dwcy93cHMuaApAQCAtNDIsNiArNDIsNyBAQAogICogQGNyZWRfYXR0cjogVW5wYXJzZWQgQ3JlZGVudGlhbCBhdHRyaWJ1dGUgZGF0YSAodXNlZCBvbmx5IGluIGNyZWRfY2IoKSk7CiAgKgl0aGlzIG1heSBiZSAlTlVMTCwgaWYgbm90IHVzZWQKICAqIEBjcmVkX2F0dHJfbGVuOiBMZW5ndGggb2YgY3JlZF9hdHRyIGluIG9jdGV0cworICogQGFwX2NoYW5uZWw6IEFQIGNoYW5uZWwKICAqLwogc3RydWN0IHdwc19jcmVkZW50aWFsIHsKIAl1OCBzc2lkWzMyXTsKQEAgLTU0LDYgKzU1LDcgQEAKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CiAJY29uc3QgdTggKmNyZWRfYXR0cjsKIAlzaXplX3QgY3JlZF9hdHRyX2xlbjsKKwl1MTYgYXBfY2hhbm5lbDsKIH07CiAKICNkZWZpbmUgV1BTX0RFVl9UWVBFX0xFTiA4CkBAIC0xMDEsMTcgKzEwMyw2IEBACiAJaW50IHAycDsKIH07CiAKLXN0cnVjdCBvb2JfY29uZl9kYXRhIHsKLQllbnVtIHsKLQkJT09CX01FVEhPRF9VTktOT1dOID0gMCwKLQkJT09CX01FVEhPRF9ERVZfUFdEX0UsCi0JCU9PQl9NRVRIT0RfREVWX1BXRF9SLAotCQlPT0JfTUVUSE9EX0NSRUQsCi0JfSBvb2JfbWV0aG9kOwotCXN0cnVjdCB3cGFidWYgKmRldl9wYXNzd29yZDsKLQlzdHJ1Y3Qgd3BhYnVmICpwdWJrZXlfaGFzaDsKLX07Ci0KIC8qKgogICogc3RydWN0IHdwc19jb25maWcgLSBXUFMgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgcmVnaXN0cmF0aW9uIHByb3RvY29sIHJ1bgogICovCkBAIC02MTcsMTYgKzYwOCw2IEBACiAJc3RydWN0IHdwc19kZXZpY2VfZGF0YSBkZXY7CiAKIAkvKioKLQkgKiBvb2JfY29uZiAtIE9PQiBDb25maWcgZGF0YQotCSAqLwotCXN0cnVjdCBvb2JfY29uZl9kYXRhIG9vYl9jb25mOwotCi0JLyoqCi0JICogb29iX2Rldl9wd19pZCAtIE9PQiBEZXZpY2UgcGFzc3dvcmQgaWQKLQkgKi8KLQl1MTYgb29iX2Rldl9wd19pZDsKLQotCS8qKgogCSAqIGRoX2N0eCAtIENvbnRleHQgZGF0YSBmb3IgRGlmZmllLUhlbGxtYW4gb3BlcmF0aW9uCiAJICovCiAJdm9pZCAqZGhfY3R4OwpAQCAtNzY0LDIzICs3NDUsNiBAQAogCXN0cnVjdCB3cGFidWYgKmFwX25mY19kZXZfcHc7CiB9OwogCi1zdHJ1Y3Qgb29iX2RldmljZV9kYXRhIHsKLQljaGFyICpkZXZpY2VfbmFtZTsKLQljaGFyICpkZXZpY2VfcGF0aDsKLQl2b2lkICogKCppbml0X2Z1bmMpKHN0cnVjdCB3cHNfY29udGV4dCAqLCBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICosCi0JCQkgICAgaW50KTsKLQlzdHJ1Y3Qgd3BhYnVmICogKCpyZWFkX2Z1bmMpKHZvaWQgKik7Ci0JaW50ICgqd3JpdGVfZnVuYykodm9pZCAqLCBzdHJ1Y3Qgd3BhYnVmICopOwotCXZvaWQgKCpkZWluaXRfZnVuYykodm9pZCAqKTsKLX07Ci0KLXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhIHsKLQlpbnQgKCppbml0X2Z1bmMpKGNoYXIgKik7Ci0Jdm9pZCAqICgqcmVhZF9mdW5jKShzaXplX3QgKik7Ci0JaW50ICgqd3JpdGVfZnVuYykodm9pZCAqLCBzaXplX3QpOwotCXZvaWQgKCpkZWluaXRfZnVuYykodm9pZCk7Ci19OwotCiBzdHJ1Y3Qgd3BzX3JlZ2lzdHJhciAqCiB3cHNfcmVnaXN0cmFyX2luaXQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsCiAJCSAgIGNvbnN0IHN0cnVjdCB3cHNfcmVnaXN0cmFyX2NvbmZpZyAqY2ZnKTsKQEAgLTgxOSwxMSArNzgzLDYgQEAKIGludCB3cHNfcGluX3N0cl92YWxpZChjb25zdCBjaGFyICpwaW4pOwogdm9pZCB3cHNfZnJlZV9wZW5kaW5nX21zZ3Moc3RydWN0IHVwbnBfcGVuZGluZ19tZXNzYWdlICptc2dzKTsKIAotc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqIHdwc19nZXRfb29iX2RldmljZShjaGFyICpkZXZpY2VfdHlwZSk7Ci1zdHJ1Y3Qgb29iX25mY19kZXZpY2VfZGF0YSAqIHdwc19nZXRfb29iX25mY19kZXZpY2UoY2hhciAqZGV2aWNlX25hbWUpOwotaW50IHdwc19nZXRfb29iX21ldGhvZChjaGFyICptZXRob2QpOwotaW50IHdwc19wcm9jZXNzX29vYihzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcywgc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldiwKLQkJICAgIGludCByZWdpc3RyYXIpOwogc3RydWN0IHdwYWJ1ZiAqIHdwc19nZXRfb29iX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMpOwogaW50IHdwc19vb2JfdXNlX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cHNfcGFyc2VfYXR0ciAqYXR0cik7CiBpbnQgd3BzX2F0dHJfdGV4dChzdHJ1Y3Qgd3BhYnVmICpkYXRhLCBjaGFyICpidWYsIGNoYXIgKmVuZCk7CkBAIC04NTgsNiArODE3LDcgQEAKIC8qIG5kZWYuYyAqLwogc3RydWN0IHdwYWJ1ZiAqIG5kZWZfcGFyc2Vfd2lmaShjb25zdCBzdHJ1Y3Qgd3BhYnVmICpidWYpOwogc3RydWN0IHdwYWJ1ZiAqIG5kZWZfYnVpbGRfd2lmaShjb25zdCBzdHJ1Y3Qgd3BhYnVmICpidWYpOworc3RydWN0IHdwYWJ1ZiAqIG5kZWZfYnVpbGRfd2lmaV9ocih2b2lkKTsKIAogI2lmZGVmIENPTkZJR19XUFNfU1RSSUNUCiBpbnQgd3BzX3ZhbGlkYXRlX2JlYWNvbihjb25zdCBzdHJ1Y3Qgd3BhYnVmICp3cHNfaWUpOwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfYXR0cl9idWlsZC5jIGIvc3JjL3dwcy93cHNfYXR0cl9idWlsZC5jCmluZGV4IDliZTMwYjkuLjI5YWVlOGUgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzX2F0dHJfYnVpbGQuYworKysgYi9zcmMvd3BzL3dwc19hdHRyX2J1aWxkLmMKQEAgLTM2OCwzOCArMzY4LDYgQEAKIAogCXJldHVybiAwOwogfQotCi0KLWludCB3cHNfYnVpbGRfb29iX2Rldl9wYXNzd29yZChzdHJ1Y3Qgd3BhYnVmICptc2csIHN0cnVjdCB3cHNfY29udGV4dCAqd3BzKQotewotCXU4IGRldl9wYXNzd29yZF9iaW5bV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOXTsKLQotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiAgKiBPT0IgRGV2aWNlIFBhc3N3b3JkIik7Ci0KLQlpZiAob3NfZ2V0X3JhbmRvbSgodTggKikgJndwcy0+b29iX2Rldl9wd19pZCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogZGV2aWNlIHBhc3N3b3JkIGlkICIKLQkJCSAgICJnZW5lcmF0aW9uIGVycm9yIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jd3BzLT5vb2JfZGV2X3B3X2lkIHw9IDB4MDAxMDsKLQotCWlmIChyYW5kb21fZ2V0X2J5dGVzKGRldl9wYXNzd29yZF9iaW4sIFdQU19PT0JfREVWSUNFX1BBU1NXT1JEX0xFTikgPAotCSAgICAwKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBPT0IgZGV2aWNlIHBhc3N3b3JkICIKLQkJCSAgICJnZW5lcmF0aW9uIGVycm9yIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZSgKLQkJd3BhYnVmX3B1dCh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCwKLQkJCSAgIHdwYWJ1Zl9zaXplKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSksCi0JCXdwYWJ1Zl9zaXplKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSwKLQkJZGV2X3Bhc3N3b3JkX2JpbiwgV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOKTsKLQotCXJldHVybiB3cHNfYnVpbGRfb29iX2Rldl9wdyhtc2csIHdwcy0+b29iX2Rldl9wd19pZCwgd3BzLT5kaF9wdWJrZXksCi0JCQkJICAgIGRldl9wYXNzd29yZF9iaW4sCi0JCQkJICAgIFdQU19PT0JfREVWSUNFX1BBU1NXT1JEX0xFTik7Ci19CiAjZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KIAogCmRpZmYgLS1naXQgYS9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmMgYi9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmMKaW5kZXggNWFhOWIwMC4uMzk5OWIxYiAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wYXJzZS5jCisrKyBiL3NyYy93cHMvd3BzX2F0dHJfcGFyc2UuYwpAQCAtNTQyLDYgKzU0MiwxNCBAQAogCQlpZiAod3BzX3BhcnNlX3ZlbmRvcl9leHQoYXR0ciwgcG9zLCBsZW4pIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJYnJlYWs7CisJY2FzZSBBVFRSX0FQX0NIQU5ORUw6CisJCWlmIChsZW4gIT0gMikgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEludmFsaWQgQVAgQ2hhbm5lbCAiCisJCQkJICAgImxlbmd0aCAldSIsIGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXR0ci0+YXBfY2hhbm5lbCA9IHBvczsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlIDB4JXggIgogCQkJICAgImxlbj0ldSIsIHR5cGUsIGxlbik7CmRpZmYgLS1naXQgYS9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmggYi9zcmMvd3BzL3dwc19hdHRyX3BhcnNlLmgKaW5kZXggMzMyZTk2Ni4uODhlNTFhNCAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wYXJzZS5oCisrKyBiL3NyYy93cHMvd3BzX2F0dHJfcGFyc2UuaApAQCAtNTYsNiArNTYsNyBAQAogCWNvbnN0IHU4ICpzZXR0aW5nc19kZWxheV90aW1lOyAvKiAxIG9jdGV0ICovCiAJY29uc3QgdTggKm5ldHdvcmtfa2V5X3NoYXJlYWJsZTsgLyogMSBvY3RldCAoQm9vbCkgKi8KIAljb25zdCB1OCAqcmVxdWVzdF90b19lbnJvbGw7IC8qIDEgb2N0ZXQgKEJvb2wpICovCisJY29uc3QgdTggKmFwX2NoYW5uZWw7IC8qIDIgb2N0ZXRzICovCiAKIAkvKiB2YXJpYWJsZSBsZW5ndGggZmllbGRzICovCiAJY29uc3QgdTggKm1hbnVmYWN0dXJlcjsKZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzX2F0dHJfcHJvY2Vzcy5jIGIvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKaW5kZXggZDRjNmU4OC4uYjgxZjEwNiAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKKysrIGIvc3JjL3dwcy93cHNfYXR0cl9wcm9jZXNzLmMKQEAgLTI1OCw2ICsyNTgsMTkgQEAKIH0KIAogCitzdGF0aWMgaW50IHdwc19wcm9jZXNzX2NyZWRfYXBfY2hhbm5lbChzdHJ1Y3Qgd3BzX2NyZWRlbnRpYWwgKmNyZWQsCisJCQkJICAgICAgIGNvbnN0IHU4ICphcF9jaGFubmVsKQoreworCWlmIChhcF9jaGFubmVsID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBvcHRpb25hbCBhdHRyaWJ1dGUgKi8KKworCWNyZWQtPmFwX2NoYW5uZWwgPSBXUEFfR0VUX0JFMTYoYXBfY2hhbm5lbCk7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEFQIENoYW5uZWw6ICV1IiwgY3JlZC0+YXBfY2hhbm5lbCk7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IHdwc193b3JrYXJvdW5kX2NyZWRfa2V5KHN0cnVjdCB3cHNfY3JlZGVudGlhbCAqY3JlZCkKIHsKIAlpZiAoY3JlZC0+YXV0aF90eXBlICYgKFdQU19BVVRIX1dQQVBTSyB8IFdQU19BVVRIX1dQQTJQU0spICYmCkBAIC0zMDMsNyArMzE2LDggQEAKIAkgICAgd3BzX3Byb2Nlc3NfY3JlZF9lYXBfaWRlbnRpdHkoY3JlZCwgYXR0ci0+ZWFwX2lkZW50aXR5LAogCQkJCQkgIGF0dHItPmVhcF9pZGVudGl0eV9sZW4pIHx8CiAJICAgIHdwc19wcm9jZXNzX2NyZWRfa2V5X3Byb3ZfYXV0byhjcmVkLCBhdHRyLT5rZXlfcHJvdl9hdXRvKSB8fAotCSAgICB3cHNfcHJvY2Vzc19jcmVkXzgwMl8xeF9lbmFibGVkKGNyZWQsIGF0dHItPmRvdDF4X2VuYWJsZWQpKQorCSAgICB3cHNfcHJvY2Vzc19jcmVkXzgwMl8xeF9lbmFibGVkKGNyZWQsIGF0dHItPmRvdDF4X2VuYWJsZWQpIHx8CisJICAgIHdwc19wcm9jZXNzX2NyZWRfYXBfY2hhbm5lbChjcmVkLCBhdHRyLT5hcF9jaGFubmVsKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIHdwc193b3JrYXJvdW5kX2NyZWRfa2V5KGNyZWQpOwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfY29tbW9uLmMgYi9zcmMvd3BzL3dwc19jb21tb24uYwppbmRleCA1YTg4MTdmLi42OGQ5ZjBhIDEwMDY0NAotLS0gYS9zcmMvd3BzL3dwc19jb21tb24uYworKysgYi9zcmMvd3BzL3dwc19jb21tb24uYwpAQCAtMzc1LDg0ICszNzUsNiBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogd3BzX2dldF9vb2JfZGV2X3B3ZChzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcykKLXsKLQlzdHJ1Y3Qgd3BhYnVmICpkYXRhOwotCi0JZGF0YSA9IHdwYWJ1Zl9hbGxvYygyMDApOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE9PQiAiCi0JCQkgICAiZGV2aWNlIHBhc3N3b3JkIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl3cGFidWZfZnJlZSh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCk7Ci0Jd3BzLT5vb2JfY29uZi5kZXZfcGFzc3dvcmQgPQotCQl3cGFidWZfYWxsb2MoV1BTX09PQl9ERVZJQ0VfUEFTU1dPUkRfTEVOICogMiArIDEpOwotCWlmICh3cHMtPm9vYl9jb25mLmRldl9wYXNzd29yZCA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBPT0IgIgotCQkJICAgImRldmljZSBwYXNzd29yZCIpOwotCQl3cGFidWZfZnJlZShkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHdwc19idWlsZF92ZXJzaW9uKGRhdGEpIHx8Ci0JICAgIHdwc19idWlsZF9vb2JfZGV2X3Bhc3N3b3JkKGRhdGEsIHdwcykgfHwKLQkgICAgd3BzX2J1aWxkX3dmYV9leHQoZGF0YSwgMCwgTlVMTCwgMCkpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEJ1aWxkIE9PQiBkZXZpY2UgcGFzc3dvcmQgIgotCQkJICAgImF0dHJpYnV0ZSBlcnJvciIpOwotCQl3cGFidWZfZnJlZShkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLQotc3RhdGljIGludCB3cHNfcGFyc2Vfb29iX2Rldl9wd2Qoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsCi0JCQkJIHN0cnVjdCB3cGFidWYgKmRhdGEpCi17Ci0Jc3RydWN0IG9vYl9jb25mX2RhdGEgKm9vYl9jb25mID0gJndwcy0+b29iX2NvbmY7Ci0Jc3RydWN0IHdwc19wYXJzZV9hdHRyIGF0dHI7Ci0JY29uc3QgdTggKnBvczsKLQlzaXplX3QgcHdfbGVuOwotCi0JaWYgKHdwc19wYXJzZV9tc2coZGF0YSwgJmF0dHIpIDwgMCB8fAotCSAgICBhdHRyLm9vYl9kZXZfcGFzc3dvcmQgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGRldmljZSBwYXNzd29yZCBub3QgZm91bmQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXBvcyA9IGF0dHIub29iX2Rldl9wYXNzd29yZDsKLQotCXdwYWJ1Zl9mcmVlKG9vYl9jb25mLT5wdWJrZXlfaGFzaCk7Ci0Jb29iX2NvbmYtPnB1YmtleV9oYXNoID0KLQkJd3BhYnVmX2FsbG9jX2NvcHkocG9zLCBXUFNfT09CX1BVQktFWV9IQVNIX0xFTik7Ci0JaWYgKG9vYl9jb25mLT5wdWJrZXlfaGFzaCA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBPT0IgIgotCQkJICAgInB1YmxpYyBrZXkgaGFzaCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBvcyArPSBXUFNfT09CX1BVQktFWV9IQVNIX0xFTjsKLQotCXdwcy0+b29iX2Rldl9wd19pZCA9IFdQQV9HRVRfQkUxNihwb3MpOwotCXBvcyArPSBzaXplb2Yod3BzLT5vb2JfZGV2X3B3X2lkKTsKLQotCXB3X2xlbiA9IGF0dHIub29iX2Rldl9wYXNzd29yZF9sZW4gLSBXUFNfT09CX1BVQktFWV9IQVNIX0xFTiAtIDI7Ci0Jb29iX2NvbmYtPmRldl9wYXNzd29yZCA9IHdwYWJ1Zl9hbGxvYyhwd19sZW4gKiAyICsgMSk7Ci0JaWYgKG9vYl9jb25mLT5kZXZfcGFzc3dvcmQgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgT09CICIKLQkJCSAgICJkZXZpY2UgcGFzc3dvcmQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZSh3cGFidWZfcHV0KG9vYl9jb25mLT5kZXZfcGFzc3dvcmQsCi0JCQkJCSAgICAgIHB3X2xlbiAqIDIgKyAxKSwKLQkJCQkgICBwd19sZW4gKiAyICsgMSwgcG9zLCBwd19sZW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQogaW50IHdwc19vb2JfdXNlX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cHNfcGFyc2VfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3Qgd3BhYnVmIG1zZzsKQEAgLTQ3NywxMDcgKzM5OSw2IEBACiB9CiAKIAotc3RhdGljIGludCB3cHNfcGFyc2Vfb29iX2NyZWQoc3RydWN0IHdwc19jb250ZXh0ICp3cHMsIHN0cnVjdCB3cGFidWYgKmRhdGEpCi17Ci0Jc3RydWN0IHdwc19wYXJzZV9hdHRyIGF0dHI7Ci0KLQlpZiAod3BzX3BhcnNlX21zZyhkYXRhLCAmYXR0cikgPCAwIHx8IGF0dHIubnVtX2NyZWQgPD0gMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGNyZWRlbnRpYWwgbm90IGZvdW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gd3BzX29vYl91c2VfY3JlZCh3cHMsICZhdHRyKTsKLX0KLQotCi1pbnQgd3BzX3Byb2Nlc3Nfb29iKHN0cnVjdCB3cHNfY29udGV4dCAqd3BzLCBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhICpvb2JfZGV2LAotCQkgICAgaW50IHJlZ2lzdHJhcikKLXsKLQlzdHJ1Y3Qgd3BhYnVmICpkYXRhOwotCWludCByZXQsIHdyaXRlX2YsIG9vYl9tZXRob2QgPSB3cHMtPm9vYl9jb25mLm9vYl9tZXRob2Q7Ci0Jdm9pZCAqb29iX3ByaXY7Ci0KLQl3cml0ZV9mID0gb29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0RFVl9QV0RfRSA/ICFyZWdpc3RyYXIgOiByZWdpc3RyYXI7Ci0KLQlvb2JfcHJpdiA9IG9vYl9kZXYtPmluaXRfZnVuYyh3cHMsIG9vYl9kZXYsIHJlZ2lzdHJhcik7Ci0JaWYgKG9vYl9wcml2ID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEZhaWxlZCB0byBpbml0aWFsaXplIE9PQiBkZXZpY2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICh3cml0ZV9mKSB7Ci0JCWlmIChvb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfQ1JFRCkKLQkJCWRhdGEgPSB3cHNfZ2V0X29vYl9jcmVkKHdwcyk7Ci0JCWVsc2UKLQkJCWRhdGEgPSB3cHNfZ2V0X29vYl9kZXZfcHdkKHdwcyk7Ci0KLQkJcmV0ID0gMDsKLQkJaWYgKGRhdGEgPT0gTlVMTCB8fCBvb2JfZGV2LT53cml0ZV9mdW5jKG9vYl9wcml2LCBkYXRhKSA8IDApCi0JCQlyZXQgPSAtMTsKLQl9IGVsc2UgewotCQlkYXRhID0gb29iX2Rldi0+cmVhZF9mdW5jKG9vYl9wcml2KTsKLQkJaWYgKGRhdGEgPT0gTlVMTCkKLQkJCXJldCA9IC0xOwotCQllbHNlIHsKLQkJCWlmIChvb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfQ1JFRCkKLQkJCQlyZXQgPSB3cHNfcGFyc2Vfb29iX2NyZWQod3BzLCBkYXRhKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSB3cHNfcGFyc2Vfb29iX2Rldl9wd2Qod3BzLCBkYXRhKTsKLQkJfQotCX0KLQl3cGFidWZfZnJlZShkYXRhKTsKLQlvb2JfZGV2LT5kZWluaXRfZnVuYyhvb2JfcHJpdik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogRmFpbGVkIHRvIHByb2Nlc3MgT09CIGRhdGEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgKiB3cHNfZ2V0X29vYl9kZXZpY2UoY2hhciAqZGV2aWNlX3R5cGUpCi17Ci0jaWZkZWYgQ09ORklHX1dQU19VRkQKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV90eXBlLCAidWZkIikgIT0gTlVMTCkKLQkJcmV0dXJuICZvb2JfdWZkX2RldmljZV9kYXRhOwotI2VuZGlmIC8qIENPTkZJR19XUFNfVUZEICovCi0jaWZkZWYgQ09ORklHX1dQU19ORkMKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV90eXBlLCAibmZjIikgIT0gTlVMTCkKLQkJcmV0dXJuICZvb2JfbmZjX2RldmljZV9kYXRhOwotI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCi0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1dQU19ORkMKLXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhICogd3BzX2dldF9vb2JfbmZjX2RldmljZShjaGFyICpkZXZpY2VfbmFtZSkKLXsKLQlpZiAoZGV2aWNlX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0jaWZkZWYgQ09ORklHX1dQU19ORkNfUE41MzEKLQlpZiAob3Nfc3Ryc3RyKGRldmljZV9uYW1lLCAicG41MzEiKSAhPSBOVUxMKQotCQlyZXR1cm4gJm9vYl9uZmNfcG41MzFfZGV2aWNlX2RhdGE7Ci0jZW5kaWYgLyogQ09ORklHX1dQU19ORkNfUE41MzEgKi8KLQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCi0KLQotaW50IHdwc19nZXRfb29iX21ldGhvZChjaGFyICptZXRob2QpCi17Ci0JaWYgKG9zX3N0cnN0cihtZXRob2QsICJwaW4tZSIpICE9IE5VTEwpCi0JCXJldHVybiBPT0JfTUVUSE9EX0RFVl9QV0RfRTsKLQlpZiAob3Nfc3Ryc3RyKG1ldGhvZCwgInBpbi1yIikgIT0gTlVMTCkKLQkJcmV0dXJuIE9PQl9NRVRIT0RfREVWX1BXRF9SOwotCWlmIChvc19zdHJzdHIobWV0aG9kLCAiY3JlZCIpICE9IE5VTEwpCi0JCXJldHVybiBPT0JfTUVUSE9EX0NSRUQ7Ci0JcmV0dXJuIE9PQl9NRVRIT0RfVU5LTk9XTjsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCiAKIApAQCAtNjU3LDE1ICs0NzgsMTAgQEAKICNpZmRlZiBDT05GSUdfV1BTMgogCQltZXRob2RzIHw9IFdQU19DT05GSUdfVklSVF9ESVNQTEFZOwogI2VuZGlmIC8qIENPTkZJR19XUFMyICovCi0jaWZkZWYgQ09ORklHX1dQU19VRkQKLQkJbWV0aG9kcyB8PSBXUFNfQ09ORklHX1VTQkE7Ci0jZW5kaWYgLyogQ09ORklHX1dQU19VRkQgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogCQltZXRob2RzIHw9IFdQU19DT05GSUdfTkZDX0lOVEVSRkFDRTsKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCX0gZWxzZSB7Ci0JCWlmIChvc19zdHJzdHIoc3RyLCAidXNiYSIpKQotCQkJbWV0aG9kcyB8PSBXUFNfQ09ORklHX1VTQkE7CiAJCWlmIChvc19zdHJzdHIoc3RyLCAiZXRoZXJuZXQiKSkKIAkJCW1ldGhvZHMgfD0gV1BTX0NPTkZJR19FVEhFUk5FVDsKIAkJaWYgKG9zX3N0cnN0cihzdHIsICJsYWJlbCIpKQpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfZW5yb2xsZWUuYyBiL3NyYy93cHMvd3BzX2Vucm9sbGVlLmMKaW5kZXggMzg5YWE4NC4uODM3Yjk0MSAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfZW5yb2xsZWUuYworKysgYi9zcmMvd3BzL3dwc19lbnJvbGxlZS5jCkBAIC01MjMsMjMgKzUyMyw2IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotCWlmICh3cHMtPmRldl9wd19pZCAhPSBERVZfUFdfREVGQVVMVCAmJgotCSAgICB3cHMtPndwcy0+b29iX2NvbmYucHVia2V5X2hhc2gpIHsKLQkJY29uc3QgdTggKmFkZHJbMV07Ci0JCXU4IGhhc2hbV1BTX0hBU0hfTEVOXTsKLQotCQlhZGRyWzBdID0gcGs7Ci0JCXNoYTI1Nl92ZWN0b3IoMSwgYWRkciwgJnBrX2xlbiwgaGFzaCk7Ci0JCWlmIChvc19tZW1jbXAoaGFzaCwKLQkJCSAgICAgIHdwYWJ1Zl9oZWFkKHdwcy0+d3BzLT5vb2JfY29uZi5wdWJrZXlfaGFzaCksCi0JCQkgICAgICBXUFNfT09CX1BVQktFWV9IQVNIX0xFTikgIT0gMCkgewotCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IFB1YmxpYyBLZXkgaGFzaCBlcnJvciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotI2VuZGlmIC8qIENPTkZJR19XUFNfT09CICovCi0KIAl3cGFidWZfZnJlZSh3cHMtPmRoX3B1YmtleV9yKTsKIAl3cHMtPmRoX3B1YmtleV9yID0gd3BhYnVmX2FsbG9jX2NvcHkocGssIHBrX2xlbik7CiAJaWYgKHdwcy0+ZGhfcHVia2V5X3IgPT0gTlVMTCkKQEAgLTY2NSw2ICs2NDgsNyBAQAogewogCXN0cnVjdCB3cHNfcGFyc2VfYXR0ciBhdHRyOwogCXN0cnVjdCB3cGFidWYgbXNnOworCWludCByZXQgPSAwOwogCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFJlY2VpdmVkIENyZWRlbnRpYWwiKTsKIAlvc19tZW1zZXQoJndwcy0+Y3JlZCwgMCwgc2l6ZW9mKHdwcy0+Y3JlZCkpOwpAQCAtNzE0LDEyICs2OTgsMTIgQEAKIAlpZiAod3BzLT53cHMtPmNyZWRfY2IpIHsKIAkJd3BzLT5jcmVkLmNyZWRfYXR0ciA9IGNyZWQgLSA0OwogCQl3cHMtPmNyZWQuY3JlZF9hdHRyX2xlbiA9IGNyZWRfbGVuICsgNDsKLQkJd3BzLT53cHMtPmNyZWRfY2Iod3BzLT53cHMtPmNiX2N0eCwgJndwcy0+Y3JlZCk7CisJCXJldCA9IHdwcy0+d3BzLT5jcmVkX2NiKHdwcy0+d3BzLT5jYl9jdHgsICZ3cHMtPmNyZWQpOwogCQl3cHMtPmNyZWQuY3JlZF9hdHRyID0gTlVMTDsKIAkJd3BzLT5jcmVkLmNyZWRfYXR0cl9sZW4gPSAwOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfaS5oIGIvc3JjL3dwcy93cHNfaS5oCmluZGV4IDg2YWQyNDguLjgxMTA4OTQgMTAwNjQ0Ci0tLSBhL3NyYy93cHMvd3BzX2kuaAorKysgYi9zcmMvd3BzL3dwc19pLmgKQEAgLTEzNywxMCArMTM3LDYgQEAKIHZvaWQgd3BzX3BiY19vdmVybGFwX2V2ZW50KHN0cnVjdCB3cHNfY29udGV4dCAqd3BzKTsKIHZvaWQgd3BzX3BiY190aW1lb3V0X2V2ZW50KHN0cnVjdCB3cHNfY29udGV4dCAqd3BzKTsKIAotZXh0ZXJuIHN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgb29iX3VmZF9kZXZpY2VfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb29iX2RldmljZV9kYXRhIG9vYl9uZmNfZGV2aWNlX2RhdGE7Ci1leHRlcm4gc3RydWN0IG9vYl9uZmNfZGV2aWNlX2RhdGEgb29iX25mY19wbjUzMV9kZXZpY2VfZGF0YTsKLQogc3RydWN0IHdwYWJ1ZiAqIHdwc19idWlsZF93c2NfYWNrKHN0cnVjdCB3cHNfZGF0YSAqd3BzKTsKIHN0cnVjdCB3cGFidWYgKiB3cHNfYnVpbGRfd3NjX25hY2soc3RydWN0IHdwc19kYXRhICp3cHMpOwogCkBAIC0xNjksNyArMTY1LDYgQEAKIGludCB3cHNfYnVpbGRfb29iX2Rldl9wdyhzdHJ1Y3Qgd3BhYnVmICptc2csIHUxNiBkZXZfcHdfaWQsCiAJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqcHVia2V5LCBjb25zdCB1OCAqZGV2X3B3LAogCQkJIHNpemVfdCBkZXZfcHdfbGVuKTsKLWludCB3cHNfYnVpbGRfb29iX2Rldl9wYXNzd29yZChzdHJ1Y3Qgd3BhYnVmICptc2csIHN0cnVjdCB3cHNfY29udGV4dCAqd3BzKTsKIHN0cnVjdCB3cGFidWYgKiB3cHNfaWVfZW5jYXBzdWxhdGUoc3RydWN0IHdwYWJ1ZiAqZGF0YSk7CiAKIC8qIHdwc19hdHRyX3Byb2Nlc3MuYyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfbmZjLmMgYi9zcmMvd3BzL3dwc19uZmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNDM1MC4uMDAwMDAwMAotLS0gYS9zcmMvd3BzL3dwc19uZmMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTkZDIHJvdXRpbmVzIGZvciBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBNYXNhc2hpIEhvbm1hIDxtYXNhc2hpLmhvbm1hQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgotICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0jaW5jbHVkZSAid3BzL3dwcy5oIgotI2luY2x1ZGUgIndwc19pLmgiCi0KLQotc3RydWN0IHdwc19uZmNfZGF0YSB7Ci0Jc3RydWN0IG9vYl9uZmNfZGV2aWNlX2RhdGEgKm9vYl9uZmNfZGV2OwotfTsKLQotCi1zdGF0aWMgdm9pZCAqIGluaXRfbmZjKHN0cnVjdCB3cHNfY29udGV4dCAqd3BzLAotCQkgICAgICAgc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldiwgaW50IHJlZ2lzdHJhcikKLXsKLQlzdHJ1Y3Qgb29iX25mY19kZXZpY2VfZGF0YSAqb29iX25mY19kZXY7Ci0Jc3RydWN0IHdwc19uZmNfZGF0YSAqZGF0YTsKLQotCW9vYl9uZmNfZGV2ID0gd3BzX2dldF9vb2JfbmZjX2RldmljZShvb2JfZGV2LT5kZXZpY2VfbmFtZSk7Ci0JaWYgKG9vYl9uZmNfZGV2ID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKE5GQyk6IFVua25vd24gTkZDIGRldmljZSAoJXMpIiwKLQkJCSAgIG9vYl9kZXYtPmRldmljZV9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKG9vYl9uZmNfZGV2LT5pbml0X2Z1bmMob29iX2Rldi0+ZGV2aWNlX3BhdGgpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkYXRhID0gb3NfemFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKE5GQyk6IEZhaWxlZCB0byBhbGxvY2F0ZSAiCi0JCQkgICAibmZjIGRhdGEgYXJlYSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGF0YS0+b29iX25mY19kZXYgPSBvb2JfbmZjX2RldjsKLQlyZXR1cm4gZGF0YTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHJlYWRfbmZjKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHdwc19uZmNfZGF0YSAqZGF0YSA9IHByaXY7Ci0Jc3RydWN0IHdwYWJ1ZiAqd2lmaSwgKmJ1ZjsKLQljaGFyICpyYXdfZGF0YTsKLQlzaXplX3QgbGVuOwotCi0JcmF3X2RhdGEgPSBkYXRhLT5vb2JfbmZjX2Rldi0+cmVhZF9mdW5jKCZsZW4pOwotCWlmIChyYXdfZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXdpZmkgPSB3cGFidWZfYWxsb2NfY29weShyYXdfZGF0YSwgbGVuKTsKLQlvc19mcmVlKHJhd19kYXRhKTsKLQlpZiAod2lmaSA9PSBOVUxMKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChORkMpOiBGYWlsZWQgdG8gYWxsb2NhdGUgIgotCQkJICAgIm5mYyByZWFkIGFyZWEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYnVmID0gbmRlZl9wYXJzZV93aWZpKHdpZmkpOwotCXdwYWJ1Zl9mcmVlKHdpZmkpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKE5GQyk6IEZhaWxlZCB0byB1bndyYXAiKTsKLQlyZXR1cm4gYnVmOwotfQotCi0KLXN0YXRpYyBpbnQgd3JpdGVfbmZjKHZvaWQgKnByaXYsIHN0cnVjdCB3cGFidWYgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd3BzX25mY19kYXRhICpkYXRhID0gcHJpdjsKLQlzdHJ1Y3Qgd3BhYnVmICp3aWZpOwotCWludCByZXQ7Ci0KLQl3aWZpID0gbmRlZl9idWlsZF93aWZpKGJ1Zik7Ci0JaWYgKHdpZmkgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoTkZDKTogRmFpbGVkIHRvIHdyYXAiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IGRhdGEtPm9vYl9uZmNfZGV2LT53cml0ZV9mdW5jKHdwYWJ1Zl9taGVhZCh3aWZpKSwKLQkJCQkJICAgIHdwYWJ1Zl9sZW4od2lmaSkpOwotCXdwYWJ1Zl9mcmVlKHdpZmkpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVpbml0X25mYyh2b2lkICpwcml2KQotewotCXN0cnVjdCB3cHNfbmZjX2RhdGEgKmRhdGEgPSBwcml2OwotCi0JZGF0YS0+b29iX25mY19kZXYtPmRlaW5pdF9mdW5jKCk7Ci0KLQlvc19mcmVlKGRhdGEpOwotfQotCi0KLXN0cnVjdCBvb2JfZGV2aWNlX2RhdGEgb29iX25mY19kZXZpY2VfZGF0YSA9IHsKLQkuZGV2aWNlX25hbWUJPSBOVUxMLAotCS5kZXZpY2VfcGF0aAk9IE5VTEwsCi0JLmluaXRfZnVuYwk9IGluaXRfbmZjLAotCS5yZWFkX2Z1bmMJPSByZWFkX25mYywKLQkud3JpdGVfZnVuYwk9IHdyaXRlX25mYywKLQkuZGVpbml0X2Z1bmMJPSBkZWluaXRfbmZjLAotfTsKZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzX25mY19wbjUzMS5jIGIvc3JjL3dwcy93cHNfbmZjX3BuNTMxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmY0NTcuLjAwMDAwMDAKLS0tIGEvc3JjL3dwcy93cHNfbmZjX3BuNTMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIE5GQyBQTjUzMSByb3V0aW5lcyBmb3IgV2ktRmkgUHJvdGVjdGVkIFNldHVwCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgTWFzYXNoaSBIb25tYSA8bWFzYXNoaS5ob25tYUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KLSAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKLQotI2luY2x1ZGUgIndwcy93cHMuaCIKLSNpbmNsdWRlICJ3cHNfaS5oIgotCi0jaW5jbHVkZSAiV3BzTmZjVHlwZS5oIgotI2luY2x1ZGUgIldwc05mYy5oIgotCi0KLXN0YXRpYyBpbnQgaW5pdF9uZmNfcG41MzEoY2hhciAqcGF0aCkKLXsKLQl1MzIgcmV0OwotCi0JcmV0ID0gV3BzTmZjSW5pdCgpOwotCWlmIChyZXQgIT0gV1BTX05GQ0xJQl9FUlJfU1VDQ0VTUykgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoUE41MzEpOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgICAiTkZDIExpYnJhcnk6IDB4JTA4eCIsIHJldCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXQgPSBXcHNOZmNPcGVuRGV2aWNlKChpbnQ4ICopIHBhdGgpOwotCWlmIChyZXQgIT0gV1BTX05GQ0xJQl9FUlJfU1VDQ0VTUykgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoUE41MzEpOiBGYWlsZWQgdG8gb3BlbiAiCi0JCQkgICAiTkZDIERldmljZSglcyk6IDB4JTA4eCIsIHBhdGgsIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSBXcHNOZmNUb2tlbkRpc2NvdmVyeSgpOwotCWlmIChyZXQgIT0gV1BTX05GQ0xJQl9FUlJfU1VDQ0VTUykgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoUE41MzEpOiBGYWlsZWQgdG8gZGlzY292ZXIgIgotCQkJICAgInRva2VuOiAweCUwOHgiLCByZXQpOwotCQlXcHNOZmNDbG9zZURldmljZSgpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JV3BzTmZjRGVpbml0KCk7Ci0JcmV0dXJuIC0xOwotfQotCi0KLXN0YXRpYyB2b2lkICogcmVhZF9uZmNfcG41MzEoc2l6ZV90ICpzaXplKQotewotCXVpbnQzMiBsZW47Ci0JdTMyIHJldDsKLQlpbnQ4ICpkYXRhOwotCi0JcmV0ID0gV3BzTmZjUmF3UmVhZFRva2VuKCZkYXRhLCAmbGVuKTsKLQlpZiAocmV0ICE9IFdQU19ORkNMSUJfRVJSX1NVQ0NFU1MpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFBONTMxKTogRmFpbGVkIHRvIHJlYWQ6IDB4JTA4eCIsCi0JCQkgICByZXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkqc2l6ZSA9IGxlbjsKLQlyZXR1cm4gZGF0YTsKLX0KLQotCi1zdGF0aWMgaW50IHdyaXRlX25mY19wbjUzMSh2b2lkICpkYXRhLCBzaXplX3QgbGVuKQotewotCXUzMiByZXQ7Ci0KLQlyZXQgPSBXcHNOZmNSYXdXcml0ZVRva2VuKGRhdGEsIGxlbik7Ci0JaWYgKHJldCAhPSBXUFNfTkZDTElCX0VSUl9TVUNDRVNTKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byB3cml0ZTogMHglMDh4IiwKLQkJCSAgIHJldCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZWluaXRfbmZjX3BuNTMxKHZvaWQpCi17Ci0JdTMyIHJldDsKLQotCXJldCA9IFdwc05mY0Nsb3NlRGV2aWNlKCk7Ci0JaWYgKHJldCAhPSBXUFNfTkZDTElCX0VSUl9TVUNDRVNTKQotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoUE41MzEpOiBGYWlsZWQgdG8gY2xvc2UgIgotCQkJICAgIk5GQyBEZXZpY2U6IDB4JTA4eCIsIHJldCk7Ci0KLQlyZXQgPSBXcHNOZmNEZWluaXQoKTsKLQlpZiAocmV0ICE9IFdQU19ORkNMSUJfRVJSX1NVQ0NFU1MpCi0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChQTjUzMSk6IEZhaWxlZCB0byBkZWluaXRpYWxpemUgIgotCQkJICAgIk5GQyBMaWJyYXJ5OiAweCUwOHgiLCByZXQpOwotfQotCi0KLXN0cnVjdCBvb2JfbmZjX2RldmljZV9kYXRhIG9vYl9uZmNfcG41MzFfZGV2aWNlX2RhdGEgPSB7Ci0JLmluaXRfZnVuYwk9IGluaXRfbmZjX3BuNTMxLAotCS5yZWFkX2Z1bmMJPSByZWFkX25mY19wbjUzMSwKLQkud3JpdGVfZnVuYwk9IHdyaXRlX25mY19wbjUzMSwKLQkuZGVpbml0X2Z1bmMJPSBkZWluaXRfbmZjX3BuNTMxLAotfTsKZGlmZiAtLWdpdCBhL3NyYy93cHMvd3BzX3JlZ2lzdHJhci5jIGIvc3JjL3dwcy93cHNfcmVnaXN0cmFyLmMKaW5kZXggNTM2ODRkNi4uMTFlN2U4NCAxMDA2NDQKLS0tIGEvc3JjL3dwcy93cHNfcmVnaXN0cmFyLmMKKysrIGIvc3JjL3dwcy93cHNfcmVnaXN0cmFyLmMKQEAgLTE4MCw2ICsxODAsOSBAQAogCXU4IGF1dGhvcml6ZWRfbWFjc191bmlvbltXUFNfTUFYX0FVVEhPUklaRURfTUFDU11bRVRIX0FMRU5dOwogCiAJdTggcDJwX2Rldl9hZGRyW0VUSF9BTEVOXTsKKworCXU4IHBiY19pZ25vcmVfdXVpZFtXUFNfVVVJRF9MRU5dOworCXN0cnVjdCBvc190aW1lIHBiY19pZ25vcmVfc3RhcnQ7CiB9OwogCiAKQEAgLTE4Nyw2ICsxOTAsOCBAQAogc3RhdGljIHZvaWQgd3BzX3JlZ2lzdHJhcl9wYmNfdGltZW91dCh2b2lkICplbG9vcF9jdHgsIHZvaWQgKnRpbWVvdXRfY3R4KTsKIHN0YXRpYyB2b2lkIHdwc19yZWdpc3RyYXJfc2V0X3NlbGVjdGVkX3RpbWVvdXQodm9pZCAqZWxvb3BfY3R4LAogCQkJCQkgICAgICAgdm9pZCAqdGltZW91dF9jdHgpOworc3RhdGljIHZvaWQgd3BzX3JlZ2lzdHJhcl9yZW1vdmVfcGluKHN0cnVjdCB3cHNfcmVnaXN0cmFyICpyZWcsCisJCQkJICAgICBzdHJ1Y3Qgd3BzX3V1aWRfcGluICpwaW4pOwogCiAKIHN0YXRpYyB2b2lkIHdwc19yZWdpc3RyYXJfYWRkX2F1dGhvcml6ZWRfbWFjKHN0cnVjdCB3cHNfcmVnaXN0cmFyICpyZWcsCkBAIC02OTYsNiArNzAxLDIxIEBACiB9CiAKIAorc3RhdGljIHZvaWQgd3BzX3JlZ2lzdHJhcl9pbnZhbGlkYXRlX3VudXNlZChzdHJ1Y3Qgd3BzX3JlZ2lzdHJhciAqcmVnKQoreworCXN0cnVjdCB3cHNfdXVpZF9waW4gKnBpbjsKKworCWRsX2xpc3RfZm9yX2VhY2gocGluLCAmcmVnLT5waW5zLCBzdHJ1Y3Qgd3BzX3V1aWRfcGluLCBsaXN0KSB7CisJCWlmIChwaW4tPndpbGRjYXJkX3V1aWQgPT0gMSAmJiAhKHBpbi0+ZmxhZ3MgJiBQSU5fTE9DS0VEKSkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEludmFsaWRhdGUgcHJldmlvdXNseSAiCisJCQkJICAgImNvbmZpZ3VyZWQgd2lsZGNhcmQgUElOIik7CisJCQl3cHNfcmVnaXN0cmFyX3JlbW92ZV9waW4ocmVnLCBwaW4pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwogLyoqCiAgKiB3cHNfcmVnaXN0cmFyX2FkZF9waW4gLSBDb25maWd1cmUgYSBuZXcgUElOIGZvciBSZWdpc3RyYXIKICAqIEByZWc6IFJlZ2lzdHJhciBkYXRhIGZyb20gd3BzX3JlZ2lzdHJhcl9pbml0KCkKQEAgLTczNSw2ICs3NTUsOSBAQAogCQlwLT5leHBpcmF0aW9uLnNlYyArPSB0aW1lb3V0OwogCX0KIAorCWlmIChwLT53aWxkY2FyZF91dWlkKQorCQl3cHNfcmVnaXN0cmFyX2ludmFsaWRhdGVfdW51c2VkKHJlZyk7CisKIAlkbF9saXN0X2FkZCgmcmVnLT5waW5zLCAmcC0+bGlzdCk7CiAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogQSBuZXcgUElOIGNvbmZpZ3VyZWQgKHRpbWVvdXQ9JWQpIiwKQEAgLTEwMTUsNiArMTAzOCw4IEBACiAJCXdwc19yZWdpc3RyYXJfcmVtb3ZlX3BiY19zZXNzaW9uKHJlZ2lzdHJhciwKIAkJCQkJCSB1dWlkX2UsIE5VTEwpOwogCQl3cHNfcmVnaXN0cmFyX3BiY19jb21wbGV0ZWQocmVnaXN0cmFyKTsKKwkJb3NfZ2V0X3RpbWUoJnJlZ2lzdHJhci0+cGJjX2lnbm9yZV9zdGFydCk7CisJCW9zX21lbWNweShyZWdpc3RyYXItPnBiY19pZ25vcmVfdXVpZCwgdXVpZF9lLCBXUFNfVVVJRF9MRU4pOwogCX0gZWxzZSB7CiAJCXdwc19yZWdpc3RyYXJfcGluX2NvbXBsZXRlZChyZWdpc3RyYXIpOwogCX0KQEAgLTEwNjEsNiArMTA4Niw3IEBACiAJCQkJaW50IHAycF93aWxkY2FyZCkKIHsKIAlzdHJ1Y3Qgd3BzX3BhcnNlX2F0dHIgYXR0cjsKKwlpbnQgc2tpcF9hZGQgPSAwOwogCiAJd3BhX2hleGR1bXBfYnVmKE1TR19NU0dEVU1QLAogCQkJIldQUzogUHJvYmUgUmVxdWVzdCB3aXRoIFdQUyBkYXRhIHJlY2VpdmVkIiwKQEAgLTExMTIsNyArMTEzOCwyNCBAQAogCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldQUzogVVVJRC1FIGZyb20gUHJvYmUgUmVxdWVzdCIsIGF0dHIudXVpZF9lLAogCQkgICAgV1BTX1VVSURfTEVOKTsKIAotCXdwc19yZWdpc3RyYXJfYWRkX3BiY19zZXNzaW9uKHJlZywgYWRkciwgYXR0ci51dWlkX2UpOworI2lmZGVmIFdQU19XT1JLQVJPVU5EUworCWlmIChyZWctPnBiY19pZ25vcmVfc3RhcnQuc2VjICYmCisJICAgIG9zX21lbWNtcChhdHRyLnV1aWRfZSwgcmVnLT5wYmNfaWdub3JlX3V1aWQsIFdQU19VVUlEX0xFTikgPT0gMCkgeworCQlzdHJ1Y3Qgb3NfdGltZSBub3csIGR1cjsKKwkJb3NfZ2V0X3RpbWUoJm5vdyk7CisJCW9zX3RpbWVfc3ViKCZub3csICZyZWctPnBiY19pZ25vcmVfc3RhcnQsICZkdXIpOworCQlpZiAoZHVyLnNlYyA+PSAwICYmIGR1ci5zZWMgPCA1KSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogSWdub3JlIFBCQyBhY3RpdmF0aW9uICIKKwkJCQkgICAiYmFzZWQgb24gUHJvYmUgUmVxdWVzdCBmcm9tIHRoZSBFbnJvbGxlZSAiCisJCQkJICAgInRoYXQganVzdCBjb21wbGV0ZWQgUEJDIHByb3Zpc2lvbmluZyIpOworCQkJc2tpcF9hZGQgPSAxOworCQl9IGVsc2UKKwkJCXJlZy0+cGJjX2lnbm9yZV9zdGFydC5zZWMgPSAwOworCX0KKyNlbmRpZiAvKiBXUFNfV09SS0FST1VORFMgKi8KKworCWlmICghc2tpcF9hZGQpCisJCXdwc19yZWdpc3RyYXJfYWRkX3BiY19zZXNzaW9uKHJlZywgYWRkciwgYXR0ci51dWlkX2UpOwogCWlmICh3cHNfcmVnaXN0cmFyX3BiY19vdmVybGFwKHJlZywgYWRkciwgYXR0ci51dWlkX2UpKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBQQkMgc2Vzc2lvbiBvdmVybGFwIGRldGVjdGVkIik7CiAJCXJlZy0+Zm9yY2VfcGJjX292ZXJsYXAgPSAxOwpAQCAtMTI1NSw3ICsxMjk4LDcgQEAKIAkgICAgd3BzX2J1aWxkX3V1aWRfZShwcm9iZSwgcmVnLT53cHMtPnV1aWQpIHx8CiAJICAgIHdwc19idWlsZF9kZXZpY2VfYXR0cnMoJnJlZy0+d3BzLT5kZXYsIHByb2JlKSB8fAogCSAgICB3cHNfYnVpbGRfcHJvYmVfY29uZmlnX21ldGhvZHMocmVnLCBwcm9iZSkgfHwKLQkgICAgd3BzX2J1aWxkX3JmX2JhbmRzKCZyZWctPndwcy0+ZGV2LCBwcm9iZSkgfHwKKwkgICAgKHJlZy0+ZHVhbGJhbmQgJiYgd3BzX2J1aWxkX3JmX2JhbmRzKCZyZWctPndwcy0+ZGV2LCBwcm9iZSkpIHx8CiAJICAgIHdwc19idWlsZF93ZmFfZXh0KHByb2JlLCAwLCBhdXRoX21hY3MsIGNvdW50KSB8fAogCSAgICB3cHNfYnVpbGRfdmVuZG9yX2V4dCgmcmVnLT53cHMtPmRldiwgcHJvYmUpKSB7CiAJCXdwYWJ1Zl9mcmVlKGJlYWNvbik7CkBAIC0yMjE4LDIyICsyMjYxLDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotI2lmZGVmIENPTkZJR19XUFNfT09CCi0JaWYgKHdwcy0+d3BzLT5vb2JfY29uZi5wdWJrZXlfaGFzaCAhPSBOVUxMKSB7Ci0JCWNvbnN0IHU4ICphZGRyWzFdOwotCQl1OCBoYXNoW1dQU19IQVNIX0xFTl07Ci0KLQkJYWRkclswXSA9IHBrOwotCQlzaGEyNTZfdmVjdG9yKDEsIGFkZHIsICZwa19sZW4sIGhhc2gpOwotCQlpZiAob3NfbWVtY21wKGhhc2gsCi0JCQkgICAgICB3cGFidWZfaGVhZCh3cHMtPndwcy0+b29iX2NvbmYucHVia2V5X2hhc2gpLAotCQkJICAgICAgV1BTX09PQl9QVUJLRVlfSEFTSF9MRU4pICE9IDApIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTOiBQdWJsaWMgS2V5IGhhc2ggZXJyb3IiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLSNlbmRpZiAvKiBDT05GSUdfV1BTX09PQiAqLwotCiAJd3BhYnVmX2ZyZWUod3BzLT5kaF9wdWJrZXlfZSk7CiAJd3BzLT5kaF9wdWJrZXlfZSA9IHdwYWJ1Zl9hbGxvY19jb3B5KHBrLCBwa19sZW4pOwogCWlmICh3cHMtPmRoX3B1YmtleV9lID09IE5VTEwpCkBAIC0yNTI5LDE2ICsyNTU2LDYgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAotI2lmZGVmIENPTkZJR19XUFNfT09CCi0JaWYgKHdwcy0+ZGV2X3B3X2lkID49IDB4MTAgJiYgd3BzLT5uZmNfcHdfdG9rZW4gPT0gTlVMTCAmJgotCSAgICB3cHMtPmRldl9wd19pZCAhPSB3cHMtPndwcy0+b29iX2Rldl9wd19pZCkgewotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldQUzogT09CIERldmljZSBQYXNzd29yZCBJRCAiCi0JCQkgICAiJWQgbWlzbWF0Y2giLCB3cHMtPmRldl9wd19pZCk7Ci0JCXdwcy0+c3RhdGUgPSBTRU5EX00yRDsKLQkJcmV0dXJuIFdQU19DT05USU5VRTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQogCWlmICh3cHMtPmRldl9wd19pZCA9PSBERVZfUFdfUFVTSEJVVFRPTikgewogCQlpZiAoKHdwcy0+d3BzLT5yZWdpc3RyYXItPmZvcmNlX3BiY19vdmVybGFwIHx8CiAJCSAgICAgd3BzX3JlZ2lzdHJhcl9wYmNfb3ZlcmxhcCh3cHMtPndwcy0+cmVnaXN0cmFyLApAQCAtMzE2OCw2ICszMTg1LDkgQEAKIAkJCQkJCSB3cHMtPnV1aWRfZSwKIAkJCQkJCSB3cHMtPnAycF9kZXZfYWRkcik7CiAJCXdwc19yZWdpc3RyYXJfcGJjX2NvbXBsZXRlZCh3cHMtPndwcy0+cmVnaXN0cmFyKTsKKwkJb3NfZ2V0X3RpbWUoJndwcy0+d3BzLT5yZWdpc3RyYXItPnBiY19pZ25vcmVfc3RhcnQpOworCQlvc19tZW1jcHkod3BzLT53cHMtPnJlZ2lzdHJhci0+cGJjX2lnbm9yZV91dWlkLCB3cHMtPnV1aWRfZSwKKwkJCSAgV1BTX1VVSURfTEVOKTsKIAl9IGVsc2UgewogCQl3cHNfcmVnaXN0cmFyX3Bpbl9jb21wbGV0ZWQod3BzLT53cHMtPnJlZ2lzdHJhcik7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL3dwcy93cHNfdWZkLmMgYi9zcmMvd3BzL3dwc191ZmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzYmRmNC4uMDAwMDAwMAotLS0gYS9zcmMvd3BzL3dwc191ZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogVUZEIHJvdXRpbmVzIGZvciBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBNYXNhc2hpIEhvbm1hIDxtYXNhc2hpLmhvbm1hQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgotICogU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLQotI2luY2x1ZGUgIndwcy93cHMuaCIKLSNpbmNsdWRlICJ3cHMvd3BzX2kuaCIKLQotI2lmZGVmIENPTkZJR19OQVRJVkVfV0lORE9XUwotI2RlZmluZSBVRkRfRElSMSAiJXNcXFNNUlROVEtZIgotI2RlZmluZSBVRkRfRElSMiBVRkRfRElSMSAiXFxXRkFXU0MiCi0jZGVmaW5lIFVGRF9GSUxFIFVGRF9ESVIyICJcXCVzIgotI2Vsc2UgLyogQ09ORklHX05BVElWRV9XSU5ET1dTICovCi0jZGVmaW5lIFVGRF9ESVIxICIlcy9TTVJUTlRLWSIKLSNkZWZpbmUgVUZEX0RJUjIgVUZEX0RJUjEgIi9XRkFXU0MiCi0jZGVmaW5lIFVGRF9GSUxFIFVGRF9ESVIyICIvJXMiCi0jZW5kaWYgLyogQ09ORklHX05BVElWRV9XSU5ET1dTICovCi0KLQotc3RydWN0IHdwc191ZmRfZGF0YSB7Ci0JaW50IHVmZF9mZDsKLX07Ci0KLQotc3RhdGljIGludCBkZXZfcHdkX2VfZmlsZV9maWx0ZXIoY29uc3Qgc3RydWN0IGRpcmVudCAqZW50cnkpCi17Ci0JdW5zaWduZWQgaW50IHByZWZpeDsKLQljaGFyIGV4dFs1XTsKLQotCWlmIChzc2NhbmYoZW50cnktPmRfbmFtZSwgIiU4eC4lNHMiLCAmcHJlZml4LCBleHQpICE9IDIpCi0JCXJldHVybiAwOwotCWlmIChwcmVmaXggPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKG9zX3N0cmNhc2VjbXAoZXh0LCAiV0ZBIikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50IHdwc19nZXRfZGV2X3B3ZF9lX2ZpbGVfbmFtZShjaGFyICpwYXRoLCBjaGFyICpmaWxlX25hbWUpCi17Ci0Jc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0OwotCWludCBpLCBmaWxlX251bTsKLQotCWZpbGVfbnVtID0gc2NhbmRpcihwYXRoLCAmbmFtZWxpc3QsICZkZXZfcHdkX2VfZmlsZV9maWx0ZXIsCi0JCQkgICBhbHBoYXNvcnQpOwotCWlmIChmaWxlX251bSA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IE9PQiBmaWxlIG5vdCBmb3VuZDogJWQgKCVzKSIsCi0JCQkgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZmlsZV9udW0gPT0gMCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogT09CIGZpbGUgbm90IGZvdW5kIik7Ci0JCW9zX2ZyZWUobmFtZWxpc3QpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9zX3N0cmxjcHkoZmlsZV9uYW1lLCBuYW1lbGlzdFswXS0+ZF9uYW1lLCAxMyk7Ci0JZm9yIChpID0gMDsgaSA8IGZpbGVfbnVtOyBpKyspCi0JCW9zX2ZyZWUobmFtZWxpc3RbaV0pOwotCW9zX2ZyZWUobmFtZWxpc3QpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgZ2V0X2ZpbGVfbmFtZShzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcywgaW50IHJlZ2lzdHJhciwKLQkJCSBjb25zdCBjaGFyICpwYXRoLCBjaGFyICpmaWxlX25hbWUpCi17Ci0Jc3dpdGNoICh3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QpIHsKLQljYXNlIE9PQl9NRVRIT0RfQ1JFRDoKLQkJb3Nfc25wcmludGYoZmlsZV9uYW1lLCAxMywgIjAwMDAwMDAwLldTQyIpOwotCQlicmVhazsKLQljYXNlIE9PQl9NRVRIT0RfREVWX1BXRF9FOgotCQlpZiAocmVnaXN0cmFyKSB7Ci0JCQljaGFyIHRlbXBbMTI4XTsKLQkJCW9zX3NucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSwgVUZEX0RJUjIsIHBhdGgpOwotCQkJaWYgKHdwc19nZXRfZGV2X3B3ZF9lX2ZpbGVfbmFtZSh0ZW1wLCBmaWxlX25hbWUpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSB7Ci0JCQl1OCAqbWFjX2FkZHIgPSB3cHMtPmRldi5tYWNfYWRkcjsKLQotCQkJb3Nfc25wcmludGYoZmlsZV9uYW1lLCAxMywgIiUwMlglMDJYJTAyWCUwMlguV0ZBIiwKLQkJCQkgICAgbWFjX2FkZHJbMl0sIG1hY19hZGRyWzNdLCBtYWNfYWRkcls0XSwKLQkJCQkgICAgbWFjX2FkZHJbNV0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgT09CX01FVEhPRF9ERVZfUFdEX1I6Ci0JCW9zX3NucHJpbnRmKGZpbGVfbmFtZSwgMTMsICIwMDAwMDAwMC5XRkEiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEludmFsaWQgVVNCQSBPT0IgbWV0aG9kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCB1ZmRfbWtkaXIoY29uc3QgY2hhciAqcGF0aCkKLXsKLQlpZiAobWtkaXIocGF0aCwgU19JUldYVSkgPCAwICYmIGVycm5vICE9IEVFWElTVCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoVUZEKTogRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIgotCQkJICAgIiclcyc6ICVkICglcykiLCBwYXRoLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCAqIGluaXRfdWZkKHN0cnVjdCB3cHNfY29udGV4dCAqd3BzLAotCQkgICAgICAgc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldiwgaW50IHJlZ2lzdHJhcikKLXsKLQlpbnQgd3JpdGVfZjsKLQljaGFyIHRlbXBbMTI4XTsKLQljaGFyICpwYXRoID0gb29iX2Rldi0+ZGV2aWNlX3BhdGg7Ci0JY2hhciBmaWxlbmFtZVsxM107Ci0Jc3RydWN0IHdwc191ZmRfZGF0YSAqZGF0YTsKLQlpbnQgdWZkX2ZkOwotCi0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3cml0ZV9mID0gd3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfREVWX1BXRF9FID8KLQkJIXJlZ2lzdHJhciA6IHJlZ2lzdHJhcjsKLQotCWlmIChnZXRfZmlsZV9uYW1lKHdwcywgcmVnaXN0cmFyLCBwYXRoLCBmaWxlbmFtZSkgPCAwKSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiV1BTIChVRkQpOiBGYWlsZWQgdG8gZ2V0IGZpbGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAod3JpdGVfZikgewotCQlvc19zbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksIFVGRF9ESVIxLCBwYXRoKTsKLQkJaWYgKHVmZF9ta2Rpcih0ZW1wKSkKLQkJCXJldHVybiBOVUxMOwotCQlvc19zbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksIFVGRF9ESVIyLCBwYXRoKTsKLQkJaWYgKHVmZF9ta2Rpcih0ZW1wKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCW9zX3NucHJpbnRmKHRlbXAsIHNpemVvZih0ZW1wKSwgVUZEX0ZJTEUsIHBhdGgsIGZpbGVuYW1lKTsKLQlpZiAod3JpdGVfZikKLQkJdWZkX2ZkID0gb3Blbih0ZW1wLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotCQkJICAgICAgU19JUlVTUiB8IFNfSVdVU1IpOwotCWVsc2UKLQkJdWZkX2ZkID0gb3Blbih0ZW1wLCBPX1JET05MWSk7Ci0JaWYgKHVmZF9mZCA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBvcGVuICVzOiAlcyIsCi0JCQkgICB0ZW1wLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkYXRhID0gb3NfemFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJY2xvc2UodWZkX2ZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRhdGEtPnVmZF9mZCA9IHVmZF9mZDsKLQlyZXR1cm4gZGF0YTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHJlYWRfdWZkKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHdwc191ZmRfZGF0YSAqZGF0YSA9IHByaXY7Ci0Jc3RydWN0IHdwYWJ1ZiAqYnVmOwotCXN0cnVjdCBzdGF0IHM7Ci0Jc2l6ZV90IGZpbGVfc2l6ZTsKLQotCWlmIChmc3RhdChkYXRhLT51ZmRfZmQsICZzKSA8IDApIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBnZXQgZmlsZSBzaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWZpbGVfc2l6ZSA9IHMuc3Rfc2l6ZTsKLQlidWYgPSB3cGFidWZfYWxsb2MoZmlsZV9zaXplKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byBhbGxvYyByZWFkICIKLQkJCSAgICJidWZmZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHJlYWQoZGF0YS0+dWZkX2ZkLCB3cGFidWZfbWhlYWQoYnVmKSwgZmlsZV9zaXplKSAhPQotCSAgICAoaW50KSBmaWxlX3NpemUpIHsKLQkJd3BhYnVmX2ZyZWUoYnVmKTsKLQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFMgKFVGRCk6IEZhaWxlZCB0byByZWFkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3cGFidWZfcHV0KGJ1ZiwgZmlsZV9zaXplKTsKLQlyZXR1cm4gYnVmOwotfQotCi0KLXN0YXRpYyBpbnQgd3JpdGVfdWZkKHZvaWQgKnByaXYsIHN0cnVjdCB3cGFidWYgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd3BzX3VmZF9kYXRhICpkYXRhID0gcHJpdjsKLQotCWlmICh3cml0ZShkYXRhLT51ZmRfZmQsIHdwYWJ1Zl9taGVhZChidWYpLCB3cGFidWZfbGVuKGJ1ZikpICE9Ci0JICAgIChpbnQpIHdwYWJ1Zl9sZW4oYnVmKSkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUyAoVUZEKTogRmFpbGVkIHRvIHdyaXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVpbml0X3VmZCh2b2lkICpwcml2KQotewotCXN0cnVjdCB3cHNfdWZkX2RhdGEgKmRhdGEgPSBwcml2OwotCWNsb3NlKGRhdGEtPnVmZF9mZCk7Ci0Jb3NfZnJlZShkYXRhKTsKLX0KLQotCi1zdHJ1Y3Qgb29iX2RldmljZV9kYXRhIG9vYl91ZmRfZGV2aWNlX2RhdGEgPSB7Ci0JLmRldmljZV9uYW1lCT0gTlVMTCwKLQkuZGV2aWNlX3BhdGgJPSBOVUxMLAotCS5pbml0X2Z1bmMJPSBpbml0X3VmZCwKLQkucmVhZF9mdW5jCT0gcmVhZF91ZmQsCi0JLndyaXRlX2Z1bmMJPSB3cml0ZV91ZmQsCi0JLmRlaW5pdF9mdW5jCT0gZGVpbml0X3VmZCwKLX07CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9BbmRyb2lkLm1rIGIvd3BhX3N1cHBsaWNhbnQvQW5kcm9pZC5tawppbmRleCAzM2U0NTc5Li43NTQ1YWIyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9BbmRyb2lkLm1rCisrKyBiL3dwYV9zdXBwbGljYW50L0FuZHJvaWQubWsKQEAgLTMxLDEwICszMSwxMCBAQAogCiBpZmVxICgkKEJPQVJEX1dMQU5fREVWSUNFKSwgYmNtZGhkKQogTF9DRkxBR1MgKz0gLURBTkRST0lEX1AyUAorTF9DRkxBR1MgKz0gLURQMlBfQ09OQ1VSUkVOVF9TRUFSQ0hfREVMQVk9MAogZW5kaWYKIAogaWZlcSAoJChCT0FSRF9XTEFOX0RFVklDRSksIHFjd2NuKQotTF9DRkxBR1MgKz0gLURBTkRST0lEX1FDT01fV0NOCiBMX0NGTEFHUyArPSAtREFORFJPSURfUDJQCiBlbmRpZgogCkBAIC0xOTMsOCArMTkzLDE1IEBACiBORUVEX0FFU19PTUFDMT15CiBlbmRpZgogCi1pZmRlZiBDT05GSUdfSUVFRTgwMjExVgotTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgoraWZkZWYgQ09ORklHX1NBRQorTF9DRkxBR1MgKz0gLURDT05GSUdfU0FFCitPQkpTICs9IHNyYy9jb21tb24vc2FlLmMKK05FRURfRUNDPXkKK05FRURfREhfR1JPVVBTPXkKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XTk0KK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1dOTQogT0JKUyArPSB3bm1fc3RhLmMKIGVuZGlmCiAKQEAgLTMzMyw2ICszNDAsMTcgQEAKIENPTkZJR19JRUVFODAyMVhfRUFQT0w9eQogZW5kaWYKIAoraWZkZWYgQ09ORklHX0VBUF9VTkFVVEhfVExTCisjIEVBUC1VTkFVVEgtVExTCitMX0NGTEFHUyArPSAtREVBUF9VTkFVVEhfVExTCitpZm5kZWYgQ09ORklHX0VBUF9VTkFVVEhfVExTCitPQkpTICs9IHNyYy9lYXBfcGVlci9lYXBfdGxzLmMKK09CSlNfaCArPSBzcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rscy5jCitUTFNfRlVOQ1M9eQorZW5kaWYKK0NPTkZJR19JRUVFODAyMVhfRUFQT0w9eQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0VBUF9QRUFQCiAjIEVBUC1QRUFQCiBpZmVxICgkKENPTkZJR19FQVBfUEVBUCksIGR5bikKQEAgLTU2Nyw3ICs1ODUsNyBAQAogaWZkZWYgQ09ORklHX0VBUF9QV0QKIExfQ0ZMQUdTICs9IC1ERUFQX1BXRAogT0JKUyArPSBzcmMvZWFwX3BlZXIvZWFwX3B3ZC5jIHNyYy9lYXBfY29tbW9uL2VhcF9wd2RfY29tbW9uLmMKLU9CSlNfaCArPSBzcmMvZWFwX3NlcnZlci9lYXBfcHdkLmMKK09CSlNfaCArPSBzcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3B3ZC5jCiBDT05GSUdfSUVFRTgwMjFYX0VBUE9MPXkKIE5FRURfU0hBMjU2PXkKIGVuZGlmCkBAIC01OTksMjUgKzYxNywxMCBAQAogTkVFRF9BRVNfQ0JDPXkKIE5FRURfTU9ERVhQPXkKIAotaWZkZWYgQ09ORklHX1dQU19VRkQKLUxfQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19VRkQKLU9CSlMgKz0gc3JjL3dwcy93cHNfdWZkLmMKLU5FRURfV1BTX09PQj15Ci1lbmRpZgotCiBpZmRlZiBDT05GSUdfV1BTX05GQwogTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQwogT0JKUyArPSBzcmMvd3BzL25kZWYuYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmMuYwogTkVFRF9XUFNfT09CPXkKLWlmZGVmIENPTkZJR19XUFNfTkZDX1BONTMxCi1QTjUzMV9QQVRIID89IC91c3IvbG9jYWwvc3JjL25mYwotTF9DRkxBR1MgKz0gLURDT05GSUdfV1BTX05GQ19QTjUzMQotTF9DRkxBR1MgKz0gLUkke1BONTMxX1BBVEh9L2luYwotT0JKUyArPSBzcmMvd3BzL3dwc19uZmNfcG41MzEuYwotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi93cHNuZmMuZGxsCi1MSUJTICs9ICR7UE41MzFfUEFUSH0vbGliL2xpYm5mY19tYXBwaW5nX3BuNTN4LmRsbAotZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE5FRURfV1BTX09PQgpAQCAtNzQzLDkgKzc0NiwxMyBAQAogT0JKUyArPSBzcmMvYXAvZHJ2X2NhbGxiYWNrcy5jCiBPQkpTICs9IHNyYy9hcC9hcF9kcnZfb3BzLmMKIE9CSlMgKz0gc3JjL2FwL2JlYWNvbi5jCitPQkpTICs9IHNyYy9hcC9lYXBfdXNlcl9kYi5jCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExTgogT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xMV9odC5jCiBlbmRpZgoraWZkZWYgQ09ORklHX1dOTQorT0JKUyArPSBzcmMvYXAvd25tX2FwLmMKK2VuZGlmCiBpZmRlZiBDT05GSUdfQ1RSTF9JRkFDRQogT0JKUyArPSBzcmMvYXAvY3RybF9pZmFjZV9hcC5jCiBlbmRpZgpAQCAtNzU5LDEwICs3NjYsNiBAQAogTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExTgogZW5kaWYKIAotaWZkZWYgQ09ORklHX1dOTQotTF9DRkxBR1MgKz0gLURDT05GSUdfV05NCi1lbmRpZgotCiBpZmRlZiBORUVEX0FQX01MTUUKIE9CSlMgKz0gc3JjL2FwL3dtbS5jCiBPQkpTICs9IHNyYy9hcC9hcF9saXN0LmMKQEAgLTg4MSw2ICs4ODQsOCBAQAogT0JKU19oICs9IHNyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfdGxzX2NvbW1vbi5jCiBpZm5kZWYgQ09ORklHX0ZJUFMKIE5FRURfVExTX1BSRj15CitORUVEX1NIQTE9eQorTkVFRF9NRDU9eQogZW5kaWYKIGVuZGlmCiAKQEAgLTkxMCw2ICs5MTUsMTAgQEAKIGVuZGlmCiBMSUJTICs9IC1sY3J5cHRvCiBMSUJTX3AgKz0gLWxjcnlwdG8KK2lmZGVmIENPTkZJR19UTFNfQUREX0RMCitMSUJTICs9IC1sZGwKK0xJQlNfcCArPSAtbGRsCitlbmRpZgogZW5kaWYKIAogaWZlcSAoJChDT05GSUdfVExTKSwgZ251dGxzKQpAQCAtMTEzOSwxMCArMTE0OCw3IEBACiBlbmRpZgogZW5kaWYKIAotTUQ1T0JKUyA9Ci1pZm5kZWYgQ09ORklHX0ZJUFMKLU1ENU9CSlMgKz0gc3JjL2NyeXB0by9tZDUuYwotZW5kaWYKK01ENU9CSlMgPSBzcmMvY3J5cHRvL21kNS5jCiBpZmRlZiBORUVEX01ENQogaWZkZWYgQ09ORklHX0lOVEVSTkFMX01ENQogTUQ1T0JKUyArPSBzcmMvY3J5cHRvL21kNS1pbnRlcm5hbC5jCkBAIC0xMTk4LDYgKzEyMDQsMTAgQEAKIGVuZGlmCiBlbmRpZgogCitpZmRlZiBORUVEX0VDQworTF9DRkxBR1MgKz0gLURDT05GSUdfRUNDCitlbmRpZgorCiBpZmRlZiBDT05GSUdfTk9fUkFORE9NX1BPT0wKIExfQ0ZMQUdTICs9IC1EQ09ORklHX05PX1JBTkRPTV9QT09MCiBlbHNlCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9DaGFuZ2VMb2cgYi93cGFfc3VwcGxpY2FudC9DaGFuZ2VMb2cKaW5kZXggNjUwYjhhMC4uM2YxMGUxMSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvQ2hhbmdlTG9nCisrKyBiL3dwYV9zdXBwbGljYW50L0NoYW5nZUxvZwpAQCAtMSw1ICsxLDIzOSBAQAogQ2hhbmdlTG9nIGZvciB3cGFfc3VwcGxpY2FudAogCis/Pz8/LT8/LT8/IC0gdjIuMQorCSogYWRkZWQgc3VwcG9ydCBmb3Igc2ltdWxhdGFuZW91cyBhdXRoZW50aWNhdGlvbiBvZiBlcXVhbHMgKFNBRSkgZm9yCisJICBzdHJvbmdlciBwYXNzd29yZC1iYXNlZCBhdXRoZW50aWNhdGlvbiB3aXRoIFdQQTItUGVyc29uYWwKKworMjAxMy0wMS0xMiAtIHYyLjAKKwkqIHJlbW92ZWQgUXQzLWJhc2VkIHdwYV9ndWkgKG9ic29sZXRlZCBieSB3cGFfcXVpLXF0NCkKKwkqIHJlbW92ZWQgdW5tYWludGFpbmVkIGRyaXZlciB3cmFwcGVycyBicm9hZGNvbSwgaXBob25lLCBvc3gsIHJhbGluaywKKwkgIGhvc3RhcCwgbWFkd2lmaSAoaG9zdGFwIGFuZCBtYWR3aWZpIHJlbWFpbiBhdmFpbGFibGUgZm9yIGhvc3RhcGQ7CisJICB0aGVpciB3cGFfc3VwcGxpY2FudCBmdW5jdGlvbmFsaXR5IGlzIG9ic29sZXRlZCBieSB3ZXh0KQorCSogaW1wcm92ZWQgZGVidWcgbG9nZ2luZyAoaHVtYW4gcmVhZGFibGUgZXZlbnQgbmFtZXMsIGludGVyZmFjZSBuYW1lCisJICBpbmNsdWRlZCBpbiBtb3JlIGVudHJpZXMpCisJKiBjaGFuZ2VkIEFQIG1vZGUgYmVoYXZpb3IgdG8gZW5hYmxlIFdQUyBvbmx5IGZvciBvcGVuIGFuZAorCSAgV1BBL1dQQTItUGVyc29uYWwgY29uZmlndXJhdGlvbgorCSogaW1wcm92ZWQgUDJQIGNvbmN1cnJlbmN5IG9wZXJhdGlvbnMKKwkgIC0gYmV0dGVyIGNvb3JkaW5hdGlvbiBvZiBjb25jdXJyZW50IHNjYW4gYW5kIFAyUCBzZWFyY2ggb3BlcmF0aW9ucworCSAgLSBhdm9pZCBjb25jdXJyZW50IHJlbWFpbi1vbi1jaGFubmVsIG9wZXJhdGlvbiByZXF1ZXN0cyBieSBjYW5jZWxpbmcKKwkgICAgcHJldmlvdXMgb3BlcmF0aW9ucyBwcmlvciB0byBzdGFydGluZyBhIG5ldyBvbmUKKwkgIC0gcmVqZWN0IG9wZXJhdGlvbnMgdGhhdCB3b3VsZCByZXF1aXJlIG11bHRpLWNoYW5uZWwgY29uY3VycmVuY3kgaWYKKwkgICAgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGl0CisJICAtIGFkZCBwYXJhbWV0ZXIgdG8gc2VsZWN0IHdoZXRoZXIgU1RBIG9yIFAyUCBjb25uZWN0aW9uIGlzIHByZWZlcnJlZAorCSAgICBpZiB0aGUgZHJpdmVyIGNhbm5vdCBzdXBwb3J0IGJvdGggYXQgdGhlIHNhbWUgdGltZQorCSAgLSBhbGxvdyBkcml2ZXIgdG8gaW5kaWNhdGUgY2hhbm5lbCBjaGFuZ2VzCisJICAtIGFkZGVkIG9wdGlvbmFsIGRlbGF5PTxzZWFyY2ggZGVsYXkgaW4gbWlsbGlzZWNvbmRzPiBwYXJhbWV0ZXIgZm9yCisJICAgIHAycF9maW5kIHRvIGF2b2lkIHRha2luZyBhbGwgcmFkaW8gcmVzb3VyY2VzCisJICAtIHVzZSA1MDAgbXMgcDJwX2ZpbmQgc2VhcmNoIGRlbGF5IGJ5IGRlZmF1bHQgZHVyaW5nIGNvbmN1cnJlbnQKKwkgICAgb3BlcmF0aW9ucworCSAgLSBhbGxvdyBhbGwgY2hhbm5lbHMgaW4gR08gTmVnb3RpYXRpb24gaWYgdGhlIGRyaXZlciBzdXBwb3J0cworCSAgICBtdWx0aS1jaGFubmVsIGNvbmN1cnJlbmN5CisJKiBhZGRlZCBudW1iZXIgb2Ygc21hbGwgY2hhbmdlcyB0byBtYWtlIGl0IGVhc2llciBmb3Igc3RhdGljIGFuYWx5emVycworCSAgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKwkqIGZpeGVkIG51bWJlciBvZiBzbWFsbCBidWdzIChzZWUgZ2l0IGxvZ3MgZm9yIG1vcmUgZGV0YWlscykKKwkqIG5sODAyMTE6IG51bWJlciBvZiB1cGRhdGVzIHRvIHVzZSBuZXcgY2ZnODAyMTEvbmw4MDIxMSBmdW5jdGlvbmFsaXR5CisJICAtIHJlcGxhY2UgbW9uaXRvciBpbnRlcmZhY2Ugd2l0aCBubDgwMjExIGNvbW1hbmRzIGZvciBBUCBtb2RlCisJICAtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGRyaXZlci1iYXNlZCBBUCBTTUUKKwkgIC0gU1RBIGVudHJ5IGF1dGhvcml6YXRpb24gaW4gUlNOIElCU1MKKwkqIEVBUC1wd2Q6CisJICAtIGZpeGVkIEtERiBmb3IgZ3JvdXAgMjEgYW5kIHplcm8tcGFkZGluZworCSAgLSBhZGRlZCBzdXBwb3J0IGZvciBmcmFnbWVudGF0aW9uCisJICAtIGluY3JlYXNlZCBtYXhpbXVtIG51bWJlciBvZiBodW50aW5nLWFuZC1wZWNraW5nIGl0ZXJhdGlvbnMKKwkqIGF2b2lkIGV4Y2Vzc2l2ZSBQcm9iZSBSZXNwb25zZSByZXRyaWVzIGZvciBicm9hZGNhc3QgUHJvYmUgUmVxdWVzdAorCSAgZnJhbWVzIChvbmx5IHdpdGggZHJpdmVycyB1c2luZyB3cGFfc3VwcGxpY2FudCBBUCBtb2RlIFNNRS9NTE1FKQorCSogYWRkZWQgIkdFVCBjb3VudHJ5IiBjdHJsX2lmYWNlIGNvbW1hbmQKKwkqIGRvIG5vdCBzYXZlIGFuIGludmFsaWQgbmV0d29yayBibG9jayBpbiB3cGFfc3VwcGxpY2FudC5jb25mIHRvIGF2b2lkCisJICBwcm9ibGVtcyByZWFkaW5nIHRoZSBmaWxlIG9uIG5leHQgc3RhcnQKKwkqIHNlbmQgU1RBIGNvbm5lY3RlZC9kaXNjb25uZWN0ZWQgY3RybF9pZmFjZSBldmVudHMgdG8gYm90aCB0aGUgUDJQCisJICBncm91cCBhbmQgcGFyZW50IGludGVyZmFjZXMKKwkqIGFkZGVkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHVzaW5nIFRMUyB2MS4yIChDT05GSUdfVExTVjEyPXkpCisJKiBhZGRlZCAiU0VUIHBubyA8MS8wPiIgY3RybF9pZmFjZSBjb21tYW5kIHRvIHN0YXJ0L3N0b3AgcHJlZmVycmVkCisJICBuZXR3b3JrIG9mZmxvYWQgd2l0aCBzY2hlZF9zY2FuIGRyaXZlciBjb21tYW5kCisJKiBtZXJnZWQgaW4gbnVtYmVyIG9mIGNoYW5nZXMgZnJvbSBBbmRyb2lkIHJlcG9zaXRvcnkgZm9yIFAyUCwgbmw4MDIxMSwKKwkgIGFuZCBidWlsZCBwYXJhbWV0ZXJzCisJKiBjaGFuZ2VkIFAyUCBHTyBtb2RlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGRyaXZlciBjYXBhYmlsaXRpZXMgdG8KKwkgIGF1dG9tYXRpY2FsbHkgZW5hYmxlIEhUIG9wZXJhdGlvbnMgd2hlbiBzdXBwb3J0ZWQKKwkqIGFkZGVkICJ3cGFfY2xpIHN0YXR1cyB3cHMiIGNvbW1hbmQgdG8gZmV0Y2ggV1BBMi1QZXJzb25hbCBwYXNzaHJhc2UKKwkgIGZvciBXUFMgdXNlIGNhc2VzIGluIEFQIG1vZGUKKwkqIEVBUC1BS0E6IGtlZXAgcHNldWRvbnltIGlkZW50aXR5IGFjcm9zcyBFQVAgZXhjaGFuZ2VzIHRvIG1hdGNoIEVBUC1TSU0KKwkgIGJlaGF2aW9yCisJKiBpbXByb3ZlZCByZWFzc29jaWF0aW9uIGJlaGF2aW9yIGluIGNhc2VzIHdoZXJlIGFzc29jaWF0aW9uIGlzIHJlamVjdGVkCisJICBvciB3aGVuIGFuIEFQIGRpc2Nvbm5lY3RzIHVzIHRvIGhhbmRsZSBjb21tb24gbG9hZCBiYWxhbmNpbmcKKwkgIG1lY2hhbmlzbXMKKwkgIC0gdHJ5IHRvIGF2b2lkIGV4dHJhIHNjYW5zIHdoZW4gdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkqIGFkZGVkIG9wdGlvbmFsICJqb2luIiBhcmd1bWVudCBmb3IgcDJwX3Byb3ZfZGlzYyBjdHJsX2lmYWNlIGNvbW1hbmQKKwkqIGFkZGVkIGdyb3VwIGlmbmFtZSB0byBQMlAtUFJPVi1ESVNDLSogZXZlbnRzCisJKiBhZGRlZCBQMlAgRGV2aWNlIEFkZHJlc3MgdG8gQVAtU1RBLURJU0NPTk5FQ1RFRCBldmVudCBhbmQgdXNlCisJICBwMnBfZGV2X2FkZHIgcGFyYW1ldGVyIG5hbWUgd2l0aCBBUC1TVEEtQ09OTkVDVEVECisJKiBhZGRlZCB3b3JrYXJvdW5kcyBmb3IgV1BTIFBCQyBvdmVybGFwIGRldGVjdGlvbiBmb3Igc29tZSBQMlAgdXNlIGNhc2VzCisJICB3aGVyZSBkZXBsb3llZCBzdGF0aW9ucyB3b3JrIGluY29ycmVjdGx5CisJKiBvcHRpbWl6ZSBXUFMgY29ubmVjdGlvbiBzcGVlZCBieSBkaXNjb25uZWN0aW5nIHByaW9yIHRvIFdQUyBzY2FuIGFuZAorCSAgYnkgdXNpbmcgc2luZ2xlIGNoYW5uZWwgc2NhbnMgd2hlbiBBUCBjaGFubmVsIGlzIGtub3duCisJKiBQQ1NDIGFuZCBTSU0vVVNJTSBpbXByb3ZlbWVudHM6CisJICAtIGFjY2VwdCAweDY3IChXcm9uZyBsZW5ndGgpIGFzIGEgcmVzcG9uc2UgdG8gUkVBRCBSRUNPUkQgdG8gZml4CisJICAgIGlzc3VlcyB3aXRoIHNvbWUgVVNJTSBjYXJkcworCSAgLSB0cnkgdG8gcmVhZCBNTkMgbGVuZ3RoIGZyb20gU0lNL1VTSU0KKwkgIC0gYnVpbGQgcmVhbG0gYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzIHdpdGggaWRlbnRpdHkgZnJvbSB0aGUgU0lNCisJICAtIGFsbG93IFQxIHByb3RvY29sIHRvIGJlIGVuYWJsZWQKKwkqIGFkZGVkIG1vcmUgV1BTIGFuZCBQMlAgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRocm91Z2ggRC1CdXMKKwkqIGltcHJvdmUgUDJQIG5lZ290aWF0aW9uIHJvYnVzdG5lc3MKKwkgIC0gZXh0cmEgd2FpdHMgdG8gZ2V0IEFDSyBmcmFtZXMgdGhyb3VnaAorCSAgLSBsb25nZXIgdGltZW91dHMgZm9yIGNhc2VzIHdoZXJlIGRlcGxveWVkIGRldmljZXMgaGF2ZSBiZWVuCisJICAgIGlkZW50aWZpZWQgaGF2ZSBpc3N1ZXMgbWVldGluZyB0aGUgc3BlY2lmaWNhdGlvbiByZXF1aXJlbWVudHMKKwkgIC0gbW9yZSByZXRyaWVzIGZvciBzb21lIFAyUCBmcmFtZXMKKwkgIC0gaGFuZGxlIHJhY2UgY29uZGl0aW9ucyBpbiBHTyBOZWdvdGlhdGlvbiBzdGFydCBieSBib3RoIGRldmljZXMKKwkgIC0gaWdub3JlIHVuZXhwZWN0ZWQgR08gTmVnb3RpYXRpb24gUmVzcG9uc2UgZnJhbWUKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGxpYm5sIDMuMiBhbmQgbmV3ZXIKKwkqIGFkZGVkIFAyUCBwZXJzaXN0ZW50IGdyb3VwIGluZm8gdG8gUDJQX1BFRVIgZGF0YQorCSogbWFpbnRhaW4gYSBsaXN0IG9mIFAyUCBDbGllbnRzIGZvciBwZXJzaXN0ZW50IGdyb3VwIG9uIEdPCisJKiBBUDogaW5jcmVhc2VkIGluaXRpYWwgZ3JvdXAga2V5IGhhbmRzaGFrZSByZXRyYW5zbWl0IHRpbWVvdXQgdG8gNTAwIG1zCisJKiBhZGRlZCBvcHRpb25hbCBkZXZfaWQgcGFyYW1ldGVyIGZvciBwMnBfZmluZAorCSogYWRkZWQgUDJQLUZJTkQtU1RPUFBFRCBjdHJsX2lmYWNlIGV2ZW50CisJKiBmaXhlZCBpc3N1ZXMgaW4gV1BBL1JTTiBlbGVtZW50IHZhbGlkYXRpb24gd2hlbiByb2FtaW5nIHdpdGggYXBfc2Nhbj0xCisJICBhbmQgZHJpdmVyLWJhc2VkIEJTUyBzZWxlY3Rpb24KKwkqIGRvIG5vdCBleHBpcmUgUDJQIHBlZXIgZW50cmllcyB3aGlsZSBjb25uZWN0ZWQgd2l0aCB0aGUgcGVlciBpbiBhCisJICBncm91cAorCSogZml4ZWQgV1NDIGVsZW1lbnQgaW5jbHVzaW9uIGluIGNhc2VzIHdoZXJlIFAyUCBpcyBkaXNhYmxlZAorCSogQVA6IGFkZGVkIGEgV1BTIHdvcmthcm91bmQgZm9yIG1peGVkIG1vZGUgQVAgU2V0dGluZ3Mgd2l0aCBXaW5kb3dzIDcKKwkqIEVBUC1TSU06IGZpeGVkIEFUX0NPVU5URVJfVE9PX1NNQUxMIHVzZQorCSogRUFQLVNJTS9BS0E6IGFwcGVuZCByZWFsbSB0byBwc2V1ZG9ueW0gaWRlbnRpdHkKKwkqIEVBUC1TSU0vQUtBOiBzdG9yZSBwc2V1ZG9ueW0gaWRlbnRpdHkgaW4gbmV0d29yayBjb25maWd1cmF0aW9uIHRvCisJICBhbGxvdyBpdCB0byBwZXJzaXN0IG92ZXIgbXVsdGlwbGUgRUFQIHNlc3Npb25zIGFuZCB3cGFfc3VwcGxpY2FudAorCSAgcmVzdGFydHMKKwkqIEVBUC1BS0EnOiB1cGRhdGVkIHRvIFJGQyA1NDQ4ICh1c2VybmFtZSBwcmVmaXhlcyBjaGFuZ2VkKTsgbm90ZTogdGhpcworCSAgYnJlYWtzIGludGVyb3BlcmFiaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucworCSogYWRkZWQgc3VwcG9ydCBmb3IgV0ZBIEhvdHNwb3QgMi4wCisJICAtIEdBUy9BTlFQIHRvIGZldGNoIG5ldHdvcmsgaW5mb3JtYXRpb24KKwkgIC0gY3JlZGVudGlhbCBjb25maWd1cmF0aW9uIGFuZCBhdXRvbWF0aWMgbmV0d29yayBzZWxlY3Rpb25zIGJhc2VkIG9uCisJICAgIGNyZWRlbnRpYWwgbWF0Y2ggd2l0aCBBTlFQIGluZm9ybWF0aW9uCisJKiBsaW1pdGVkIFBNS1NBIGNhY2hlIGVudHJpZXMgdG8gYmUgdXNlZCBvbmx5IHdpdGggdGhlIG5ldHdvcmsgY29udGV4dAorCSAgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlbQorCSogaW1wcm92ZWQgUE1LU0EgY2FjaGUgZXhwaXJhdGlvbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkaXNjb25uZWN0aW9ucworCSogYWRqdXN0ZWQgYmdzY2FuX3NpbXBsZSBmYXN0LXNjYW4gYmFja29mZiB0byBhdm9pZCB0b28gZnJlcXVlbnQKKwkgIGJhY2tncm91bmQgc2NhbnMKKwkqIHJlbW92ZWQgY3RybF9pZmFjZSBldmVudCBvbiBQMlAgUEQgUmVzcG9uc2UgaW4gam9pbi1ncm91cCBjYXNlCisJKiBhZGRlZCBvcHRpb24gdG8gZmV0Y2ggQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIFAyUCBEZXZpY2UgQWRkcmVzcworCSAgKCJCU1MgcDJwX2Rldl9hZGRyPTxQMlAgRGV2aWNlIEFkZHJlc3M+IikKKwkqIGFkZGVkIEJTUyBlbnRyeSBhZ2UgdG8gY3RybF9pZmFjZSBCU1MgY29tbWFuZCBvdXRwdXQKKwkqIGFkZGVkIG9wdGlvbmFsIE1BU0s9MHhIIG9wdGlvbiBmb3IgY3RybF9pZmFjZSBCU1MgY29tbWFuZCB0byBzZWxlY3QKKwkgIHdoaWNoIGZpZWxkcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlCisJKiBhZGRlZCBvcHRpb25hbCBSQU5HRT1BTEx8TjEtTjIgb3B0aW9uIGZvciBjdHJsX2lmYWNlIEJTUyBjb21tYW5kIHRvCisJICBmZXRjaCBpbmZvcm1hdGlvbiBhYm91dCBzZXZlcmFsIEJTU2VzIGluIG9uZSBjYWxsCisJKiBzaW1wbGlmaWVkIGxpY2Vuc2luZyB0ZXJtcyBieSBzZWxlY3RpbmcgdGhlIEJTRCBsaWNlbnNlIGFzIHRoZSBvbmx5CisJICBhbHRlcm5hdGl2ZQorCSogYWRkZWQgIlAyUF9TRVQgZGlzYWxsb3dfZnJlcSA8ZnJlcSBsaXN0PiIgY3RybF9pZmFjZSBjb21tYW5kIHRvCisJICBkaXNhYmxlIGNoYW5uZWxzIGZyb20gUDJQIHVzZQorCSogYWRkZWQgcDJwX3ByZWZfY2hhbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBhbGxvdyBwcmVmZXJyZWQgUDJQCisJICBjaGFubmVscyB0byBiZSBzcGVjaWZpZWQKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGFkdmVydGlzaW5nIGltbWVkaWF0ZSBhdmFpbGFiaWxpdHkgb2YgYSBXUFMKKwkgIGNyZWRlbnRpYWwgZm9yIFAyUCB1c2UgY2FzZXMKKwkqIG9wdGltaXplZCBzY2FuIG9wZXJhdGlvbnMgZm9yIFAyUCB1c2UgY2FzZXMgKHVzZSBzaW5nbGUgY2hhbm5lbCBzY2FuCisJICBmb3IgYSBzcGVjaWZpYyBTU0lEIHdoZW4gcG9zc2libGUpCisJKiBFQVAtVFRMUzogZml4ZWQgcGVlciBjaGFsbGVuZ2UgZ2VuZXJhdGlvbiBmb3IgTVNDSEFQdjIKKwkqIFNNRTogZG8gbm90IHVzZSByZWFzc29jaWF0aW9uIGFmdGVyIGV4cGxpY2l0IGRpc2Nvbm5lY3Rpb24gcmVxdWVzdAorCSAgKGxvY2FsIG9yIGEgbm90aWZpY2F0aW9uIGZyb20gYW4gQVApCisJKiBhZGRlZCBzdXBwb3J0IGZvciBzZW5kaW5nIGRlYnVnIGluZm8gdG8gTGludXggdHJhY2luZyAoLVQgb24gY29tbWFuZAorCSAgbGluZSkKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIHVzaW5nIERlYXV0aGVudGljYXRpb24gcmVhc29uIGNvZGUgMyBhcyBhbgorCSAgaW5kaWNhdGlvbiBvZiBQMlAgZ3JvdXAgdGVybWluYXRpb24KKwkqIGFkZGVkIHdwc192ZW5kb3JfZXh0X20xIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHRvIGFsbG93IHZlbmRvcgorCSAgc3BlY2lmaWMgYXR0cmlidXRlcyB0byBiZSBhZGRlZCB0byBXUFMgTTEKKwkqIHN0YXJ0ZWQgdXNpbmcgc2VwYXJhdGUgVExTIGxpYnJhcnkgY29udGV4dCBmb3IgdHVubmVsZWQgVExTCisJICAoRUFQLVBFQVAvVExTLCBFQVAtVFRMUy9UTFMsIEVBUC1GQVNUL1RMUykgdG8gc3VwcG9ydCBkaWZmZXJlbnQgQ0EKKwkgIGNlcnRpZmljYXRlIGNvbmZpZ3VyYXRpb24gYmV0d2VlbiBQaGFzZSAxIGFuZCBQaGFzZSAyCisJKiBhZGRlZCBvcHRpb25hbCAiYXV0byIgcGFyYW1ldGVyIGZvciBwMnBfY29ubmVjdCB0byByZXF1ZXN0IGF1dG9tYXRpYworCSAgR08gTmVnb3RpYXRpb24gdnMuIGpvaW4tYS1ncm91cCBzZWxlY3Rpb24KKwkqIGFkZGVkIGRpc2FibGVkX3NjYW5fb2ZmbG9hZCBwYXJhbWV0ZXIgdG8gZGlzYWJsZSBhdXRvbWF0aWMgc2NhbgorCSAgb2ZmbG9hZGluZyAoc2NoZWRfc2NhbikKKwkqIGFkZGVkIG9wdGlvbmFsIHBlcnNpc3RlbnQ9PG5ldHdvcmsgaWQ+IHBhcmFtZXRlciBmb3IgcDJwX2Nvbm5lY3QgdG8KKwkgIGFsbG93IGZvcmNpbmcgb2YgYSBzcGVjaWZpYyBTU0lEL3Bhc3NwaHJhc2UgZm9yIEdPIE5lZ290aWF0aW9uCisJKiBhZGRlZCBzdXBwb3J0IGZvciBPQlNTIHNjYW4gcmVxdWVzdHMgYW5kIDIwLzQwIEJTUyBjb2V4aXN0ZW5jZSByZXBvcnRzCisJKiByZWplY3QgUEQgUmVxdWVzdCBmb3IgdW5rbm93biBncm91cAorCSogcmVtb3ZlZCBzY3JpcHRzIGFuZCBub3RlcyByZWxhdGVkIHRvIFdpbmRvd3MgYmluYXJ5IHJlbGVhc2VzICh3aGljaAorCSAgaGF2ZSBub3QgYmVlbiB1c2VkIHN0YXJ0aW5nIGZyb20gMS54KQorCSogYWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciBXTk0gb3BlcmF0aW9ucworCSAgLSBLZWVwLWFsaXZlIGJhc2VkIG9uIEJTUyBtYXggaWRsZSBwZXJpb2QKKwkgIC0gV05NLVNsZWVwIE1vZGUKKwkgIC0gbWluaW1hbCBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50IHByb2Nlc3NpbmcKKwkqIGFkZGVkIGF1dG9zY2FuIG1vZHVsZSB0byBjb250cm9sIHNjYW5uaW5nIGJlaGF2aW9yIHdoaWxlIG5vdCBjb25uZWN0ZWQKKwkgIC0gYXV0b3NjYW5fcGVyaW9kaWMgYW5kIGF1dG9zY2FuX2V4cG9uZW50aWFsIG1vZHVsZXMKKwkqIGFkZGVkIG5ldyBXUFMgTkZDIGN0cmxfaWZhY2UgbWVjaGFuaXNtCisJICAtIGFkZGVkIGluaXRpYWwgc3VwcG9ydCBORkMgY29ubmVjdGlvbiBoYW5kb3ZlcgorCSAgLSByZW1vdmVkIG9ic29sZXRlZCBXUFNfT09CIGNvbW1hbmQgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBkZXByZWNhdGVkCisJICAgIFVGRCBjb25maWdfbWV0aG9kKQorCSogYWRkZWQgb3B0aW9uYWwgZnJhbWV3b3JrIGZvciBleHRlcm5hbCBwYXNzd29yZCBzdG9yYWdlICgiZXh0OjxuYW1lPiIpCisJKiB3cGFfY2xpOiBhZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciBjb250cm9sbGluZyB3cGFfc3VwcGxpY2FudAorCSAgcmVtb3RlbHkgb3ZlciBVRFAgKENPTkZJR19DVFJMX0lGQUNFPXVkcC1yZW1vdGUpIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisJKiB3cGFfY2xpOiBleHRlbmRlZCB0YWIgY29tcGxldGlvbiB0byBtb3JlIGNvbW1hbmRzCisJKiBjaGFuZ2VkIFNTSUQgb3V0cHV0IHRvIHVzZSBwcmludGYtZXNjYXBlZCBzdHJpbmdzIGluc3RlYWQgb2YgbWFza2luZworCSAgb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKwkgIC0gU1NJRCBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHNhbWUgZm9ybWF0OiBzc2lkPVAiYWJjXHgwMHRlc3QiCisJKiByZW1vdmVkIGRlZmF1bHQgQUNNPTEgZnJvbSBBQ19WTyBhbmQgQUNfVkkKKwkqIGFkZGVkIG9wdGlvbmFsICJodDQwIiBhcmd1bWVudCBmb3IgUDJQIGN0cmxfaWZhY2UgY29tbWFuZHMgdG8gYWxsb3cKKwkgIDQwIE1IeiBjaGFubmVscyB0byBiZSByZXF1ZXN0ZWQgb24gdGhlIDUgR0h6IGJhbmQKKwkqIGFkZGVkIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHAycF9pbnZpdGUgY29tbWFuZCB0byBzcGVjaWZ5IGNoYW5uZWwKKwkgIHdoZW4gcmVpbnZva2luZyBhIHBlcnNpc3RlbnQgZ3JvdXAgYXMgdGhlIEdPCisJKiBpbXByb3ZlZCBGSVBTIG1vZGUgYnVpbGRzIHdpdGggT3BlblNTTAorCSAgLSAibWFrZSBmaXBzIiB3aXRoIENPTkZJR19GSVBTPXkgdG8gYnVpbGQgd3BhX3N1cHBsaWNhbnQgd2l0aCB0aGUKKwkgICAgT3BlblNTTCBGSVBTIG9iamVjdCBtb2R1bGUKKwkgIC0gcmVwbGFjZSBsb3cgbGV2ZWwgT3BlblNTTCBBRVMgQVBJIGNhbGxzIHRvIHVzZSBFVlAKKwkgIC0gdXNlIE9wZW5TU0wga2V5aW5nIG1hdGVyaWFsIGV4cG9ydGVyIHdoZW4gcG9zc2libGUKKwkgIC0gZG8gbm90IGV4cG9ydCBUTFMga2V5cyBpbiBGSVBTIG1vZGUKKwkgIC0gcmVtb3ZlIE1ENSBmcm9tIENPTkZJR19GSVBTPXkgYnVpbGRzCisJICAtIHVzZSBPcGVuU1NMIGZ1bmN0aW9uIGZvciBQS0JERjIgcGFzc3BocmFzZS10by1QU0sKKwkgIC0gdXNlIE9wZW5TU0wgSE1BQyBpbXBsZW1lbnRhdGlvbgorCSAgLSBtaXggUkFORF9ieXRlcygpIG91dHB1dCBpbnRvIHJhbmRvbV9nZXRfYnl0ZXMoKSB0byBmb3JjZSBPcGVuU1NMCisJICAgIERSQkcgdG8gYmUgdXNlZCBpbiBGSVBTIG1vZGUKKwkgIC0gdXNlIE9wZW5TU0wgQ01BQyBpbXBsZW1lbnRhdGlvbgorCSogYWRkZWQgbWVjaGFuaXNtIHRvIGRpc2FibGUgVExTIFNlc3Npb24gVGlja2V0IGV4dGVuc2lvbgorCSAgLSBhIHdvcmthcm91bmQgZm9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBUTFMgZXh0ZW5zaW9ucyB0aGF0CisJICAgIHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gcmVjZW50IE9wZW5TU0wgdmVyc2lvbnMKKwkgIC0gdGxzX2Rpc2FibGVfc2Vzc2lvbl90aWNrZXQ9MQorCSAgLSBhdXRvbWF0aWNhbGx5IGRpc2FibGUgVExTIFNlc3Npb24gVGlja2V0IGV4dGVuc2lvbiBieSBkZWZhdWx0IHdoZW4KKwkgICAgdXNpbmcgRUFQLVRMUy9QRUFQL1RUTFMgKGkuZS4sIG9ubHkgdXNlIGl0IHdpdGggRUFQLUZBU1QpCisJKiBjaGFuZ2VkIFZFTkRPUi1URVNUIEVBUCBtZXRob2QgdG8gdXNlIHByb3BlciBwcml2YXRlIGVudGVycHJpc2UgbnVtYmVyCisJICAodGhpcyB3aWxsIG5vdCBpbnRlcm9wZXJhdGUgd2l0aCBvbGRlciB2ZXJzaW9ucykKKwkqIGRpc2FibGUgbmV0d29yayBibG9jayB0ZW1wb3JhcmlseSBvbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlcworCSogaW1wcm92ZWQgV1BTIEFQIHNlbGVjdGlvbiBkdXJpbmcgV1BTIFBJTiBpdGVyYXRpb24KKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIEdDTVAgY2lwaGVyIGZvciBJRUVFIDgwMi4xMWFkCisJKiBhZGRlZCBzdXBwb3J0IGZvciBXaS1GaSBEaXNwbGF5IGV4dGVuc2lvbnMKKwkgIC0gV0ZEX1NVQkVMRU1FTlRfU0VUIGN0cmxfaWZhY2UgY29tbWFuZCB0byBjb25maWd1cmUgV0ZEIHN1YmVsZW1lbnRzCisJICAtIFNFVCB3aWZpX2Rpc3BsYXkgPDAvMT4gdG8gZGlzYWJsZS9lbmFibGUgV0ZEIHN1cHBvcnQKKwkgIC0gV0ZEIHNlcnZpY2UgZGlzY292ZXJ5CisJICAtIGFuIGV4dGVybmFsIHByb2dyYW0gaXMgbmVlZGVkIHRvIG1hbmFnZSB0aGUgYXVkaW8vdmlkZW8gc3RyZWFtaW5nCisJICAgIGFuZCBjb2RlY3MKKwkqIG9wdGltaXplZCBzY2FuIHJlc3VsdCB1c2UgZm9yIG5ldHdvcmsgc2VsZWN0aW9uCisJICAtIHVzZSB0aGUgaW50ZXJuYWwgQlNTIHRhYmxlIGluc3RlYWQgb2YgcmF3IHNjYW4gcmVzdWx0cworCSAgLSBhbGxvdyB1bm5lY2Vzc2FyeSBzY2FucyB0byBiZSBza2lwcGVkIGlmIGZyZXNoIGluZm9ybWF0aW9uIGlzCisJICAgIGF2YWlsYWJsZSAoZS5nLiwgYWZ0ZXIgR0FTL0FOUVAgcm91bmQgZm9yIEludGVyd29ya2luZykKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIDI1Ni1iaXQgQUVTIHdpdGggaW50ZXJuYWwgVExTIGltcGxlbWVudGF0aW9uCisJKiBhbGxvdyBwZWVyIHRvIHByb3Bvc2UgY2hhbm5lbCBpbiBQMlAgaW52aXRhdGlvbiBwcm9jZXNzIGZvciBhCisJICBwZXJzaXN0ZW50IGdyb3VwCisJKiBhZGRlZCBkaXNhbGxvd19hcHMgcGFyYW1ldGVyIHRvIGFsbG93IEJTU0lEcy9TU0lEcyB0byBiZSBkaXNhbGxvd2VkCisJICBmcm9tIG5ldHdvcmsgc2VsZWN0aW9uCisJKiByZS1lbmFibGUgdGhlIG5ldHdvcmtzIGRpc2FibGVkIGR1cmluZyBXUFMgb3BlcmF0aW9ucworCSogYWxsb3cgUDJQIGZ1bmN0aW9uYWxpdHkgdG8gYmUgZGlzYWJsZWQgcGVyIGludGVyZmFjZSAocDJwX2Rpc2FibGVkPTEpCisJKiBhZGRlZCBzZWNvbmRhcnkgZGV2aWNlIHR5cGVzIGludG8gUDJQX1BFRVIgb3V0cHV0CisJKiBhZGRlZCBhbiBvcHRpb24gdG8gZGlzYWJsZSB1c2Ugb2YgYSBzZXBhcmF0ZSBQMlAgZ3JvdXAgaW50ZXJmYWNlCisJICAocDJwX25vX2dyb3VwX2lmYWNlPTEpCisJKiBmaXhlZCBQMlAgQm9uam91ciBTRCB0byBtYXRjaCBlbnRyaWVzIHdpdGggYm90aCBjb21wcmVzc2VkIGFuZCBub3QKKwkgIGNvbXByZXNzZWQgZG9tYWluIG5hbWUgZm9ybWF0IGFuZCBzdXBwb3J0IG11bHRpcGxlIEJvbmpvdXIgUFRSIG1hdGNoZXMKKwkgIGZvciB0aGUgc2FtZSBrZXkKKwkqIHVzZSBkZWF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZGlzYXNzb2NpYXRpb24gZm9yIGFsbCBkaXNjb25uZWN0aW9uCisJICBvcGVyYXRpb25zOyB0aGlzIHJlbW92ZXMgdGhlIG5vdyB1bnVzZWQgZGlzYXNzb2NpYXRlKCkgd3BhX2RyaXZlcl9vcHMKKwkgIGNhbGxiYWNrCisJKiBvcHRpbWl6ZWQgUFNLIGdlbmVyYXRpb24gb24gUDJQIEdPIGJ5IGNhY2hpbmcgcmVzdWx0cyB0byBhdm9pZAorCSAgbXVsdGlwbGUgUEJLREYyIG9wZXJhdGlvbnMKKwkqIGFkZGVkIG9rYz0xIGdsb2JhbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBhbGxvdyBPS0MgdG8gYmUgZW5hYmxlZAorCSAgYnkgZGVmYXVsdCBmb3IgYWxsIG5ldHdvcmsgYmxvY2tzCisJKiBhZGRlZCBhIHdvcmthcm91bmQgZm9yIFdQUyBQQkMgc2Vzc2lvbiBvdmVybGFwIGRldGVjdGlvbiB0byBhdm9pZAorCSAgaW50ZXJvcCBpc3N1ZXMgd2l0aCBkZXBsb3llZCBzdGF0aW9uIGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdAorCSAgcmVtb3ZlIGFjdGl2ZSBQQkMgaW5kaWNhdGlvbiBmcm9tIFByb2JlIFJlcXVlc3QgZnJhbWVzIHByb3Blcmx5CisJKiBhZGRlZCBiYXNpYyBzdXBwb3J0IGZvciA2MCBHSHogYmFuZAorCSogZXh0ZW5kIEVBUE9MIGZyYW1lcyBwcm9jZXNzaW5nIHdvcmthcm91bmQgZm9yIHJvYW1pbmcgY2FzZXMKKwkgIChwb3N0cG9uZSBwcm9jZXNzaW5nIG9mIHVuZXhwZWN0ZWQgRUFQT0wgZnJhbWUgdW50aWwgYXNzb2NpYXRpb24KKwkgIGV2ZW50IHRvIGhhbmRsZSByZW9yZGVyZWQgZXZlbnRzKQorCiAyMDEyLTA1LTEwIC0gdjEuMAogCSogYnNkOiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBIVCB2YWx1ZXMgaW4gSUZNX01NQVNLLgogCSogRGVsYXkgU1RBIGVudHJ5IHJlbW92YWwgdW50aWwgRGVhdXRoL0Rpc2Fzc29jIFRYIHN0YXR1cyBpbiBBUCBtb2RlLgpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvTWFrZWZpbGUgYi93cGFfc3VwcGxpY2FudC9NYWtlZmlsZQppbmRleCAyMjdmYjRmLi5mMzlhM2Q3IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9NYWtlZmlsZQorKysgYi93cGFfc3VwcGxpY2FudC9NYWtlZmlsZQpAQCAtMTcyLDggKzE3MiwxNSBAQAogTkVFRF9BRVNfT01BQzE9eQogZW5kaWYKIAotaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKLUNGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFWCitpZmRlZiBDT05GSUdfU0FFCitDRkxBR1MgKz0gLURDT05GSUdfU0FFCitPQkpTICs9IC4uL3NyYy9jb21tb24vc2FlLm8KK05FRURfRUNDPXkKK05FRURfREhfR1JPVVBTPXkKK2VuZGlmCisKK2lmZGVmIENPTkZJR19XTk0KK0NGTEFHUyArPSAtRENPTkZJR19XTk0KIE9CSlMgKz0gd25tX3N0YS5vCiBlbmRpZgogCkBAIC01NTYsNyArNTYzLDcgQEAKIGlmZGVmIENPTkZJR19FQVBfUFdECiBDRkxBR1MgKz0gLURFQVBfUFdECiBPQkpTICs9IC4uL3NyYy9lYXBfcGVlci9lYXBfcHdkLm8gLi4vc3JjL2VhcF9jb21tb24vZWFwX3B3ZF9jb21tb24ubwotT0JKU19oICs9IC4uL3NyYy9lYXBfc2VydmVyL2VhcF9wd2QubworT0JKU19oICs9IC4uL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfcHdkLm8KIENPTkZJR19JRUVFODAyMVhfRUFQT0w9eQogTkVFRF9TSEEyNTY9eQogZW5kaWYKQEAgLTU4OCwyNSArNTk1LDEwIEBACiBORUVEX0FFU19DQkM9eQogTkVFRF9NT0RFWFA9eQogCi1pZmRlZiBDT05GSUdfV1BTX1VGRAotQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19VRkQKLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfdWZkLm8KLU5FRURfV1BTX09PQj15Ci1lbmRpZgotCiBpZmRlZiBDT05GSUdfV1BTX05GQwogQ0ZMQUdTICs9IC1EQ09ORklHX1dQU19ORkMKIE9CSlMgKz0gLi4vc3JjL3dwcy9uZGVmLm8KLU9CSlMgKz0gLi4vc3JjL3dwcy93cHNfbmZjLm8KIE5FRURfV1BTX09PQj15Ci1pZmRlZiBDT05GSUdfV1BTX05GQ19QTjUzMQotUE41MzFfUEFUSCA/PSAvdXNyL2xvY2FsL3NyYy9uZmMKLUNGTEFHUyArPSAtRENPTkZJR19XUFNfTkZDX1BONTMxCi1DRkxBR1MgKz0gLUkke1BONTMxX1BBVEh9L2luYwotT0JKUyArPSAuLi9zcmMvd3BzL3dwc19uZmNfcG41MzEubwotTElCUyArPSAke1BONTMxX1BBVEh9L2xpYi93cHNuZmMuZGxsCi1MSUJTICs9ICR7UE41MzFfUEFUSH0vbGliL2xpYm5mY19tYXBwaW5nX3BuNTN4LmRsbAotZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE5FRURfV1BTX09PQgpAQCAtNzMyLDkgKzcyNCwxMyBAQAogT0JKUyArPSAuLi9zcmMvYXAvZHJ2X2NhbGxiYWNrcy5vCiBPQkpTICs9IC4uL3NyYy9hcC9hcF9kcnZfb3BzLm8KIE9CSlMgKz0gLi4vc3JjL2FwL2JlYWNvbi5vCitPQkpTICs9IC4uL3NyYy9hcC9lYXBfdXNlcl9kYi5vCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExTgogT0JKUyArPSAuLi9zcmMvYXAvaWVlZTgwMl8xMV9odC5vCiBlbmRpZgoraWZkZWYgQ09ORklHX1dOTQorT0JKUyArPSAuLi9zcmMvYXAvd25tX2FwLm8KK2VuZGlmCiBpZmRlZiBDT05GSUdfQ1RSTF9JRkFDRQogT0JKUyArPSAuLi9zcmMvYXAvY3RybF9pZmFjZV9hcC5vCiBlbmRpZgpAQCAtNzQ4LDEwICs3NDQsNiBAQAogQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19XTk0KLUNGTEFHUyArPSAtRENPTkZJR19XTk0KLWVuZGlmCi0KIGlmZGVmIE5FRURfQVBfTUxNRQogT0JKUyArPSAuLi9zcmMvYXAvd21tLm8KIE9CSlMgKz0gLi4vc3JjL2FwL2FwX2xpc3QubwpAQCAtODcwLDYgKzg2Miw4IEBACiBPQkpTX2ggKz0gLi4vc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl90bHNfY29tbW9uLm8KIGlmbmRlZiBDT05GSUdfRklQUwogTkVFRF9UTFNfUFJGPXkKK05FRURfU0hBMT15CitORUVEX01ENT15CiBlbmRpZgogZW5kaWYKIApAQCAtMTE4OSw2ICsxMTgzLDEwIEBACiBlbmRpZgogZW5kaWYKIAoraWZkZWYgTkVFRF9FQ0MKK0NGTEFHUyArPSAtRENPTkZJR19FQ0MKK2VuZGlmCisKIGlmZGVmIENPTkZJR19OT19SQU5ET01fUE9PTAogQ0ZMQUdTICs9IC1EQ09ORklHX05PX1JBTkRPTV9QT09MCiBlbHNlCkBAIC0xNDE2LDYgKzE0MTQsNyBAQAogZW5kaWYKIAogT0JKUyArPSAuLi9zcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLm8KK09CSlNfcHJpdiArPSAuLi9zcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLm8KIAogT0JKU193cGFfcm0gOj0gY3RybF9pZmFjZS5vIGN0cmxfaWZhY2VfdW5peC5vCiBPQkpTX3dwYSA6PSAkKGZpbHRlci1vdXQgJChPQkpTX3dwYV9ybSksJChPQkpTKSkgJChPQkpTX2gpIHRlc3RzL3Rlc3Rfd3BhLm8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L1JFQURNRSBiL3dwYV9zdXBwbGljYW50L1JFQURNRQppbmRleCBhMDZlNWMxLi5kODRlNjFlIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUKKysrIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FCkBAIC0xLDcgKzEsNyBAQAogV1BBIFN1cHBsaWNhbnQKID09PT09PT09PT09PT09CiAKLUNvcHlyaWdodCAoYykgMjAwMy0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiBhbmQgY29udHJpYnV0b3JzCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycwogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgbGljZW5zZSAodGhlIG9uZSB3aXRoCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtSFMyMCBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCmluZGV4IGZlYjkwNDkuLjU2NjljNTUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1IUzIwCkBAIC0xOTAsNiArMTkwLDExIEBACiAjIHBoYXNlMjogUHJlLWNvbmZpZ3VyZSBQaGFzZSAyIChpbm5lciBhdXRoZW50aWNhdGlvbikgcGFyYW1ldGVycwogIwlUaGlzIG9wdGlvbmFsIGZpZWxkIGlzIHVzZWQgd2l0aCBsaWtlIHRoZSAnZWFwJyBwYXJhbWV0ZXIuCiAjCisjIGV4Y2x1ZGVkX3NzaWQ6IEV4Y2x1ZGVkIFNTSUQKKyMJVGhpcyBvcHRpb25hbCBmaWVsZCBjYW4gYmUgdXNlZCB0byBleGNsdWRlZCBzcGVjaWZpYyBTU0lEKHMpIGZyb20KKyMJbWF0Y2hpbmcgd2l0aCB0aGUgbmV0d29yay4gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG1vcmUKKyMJdGhhbiBvbmUgU1NJRC4KKyMKICMgZm9yIGV4YW1wbGU6CiAjCiAjY3JlZD17CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtUDJQIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FLVAyUAppbmRleCA0YWJjMmYyLi5mYjk5YzdiIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUtUDJQCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1QMlAKQEAgLTE5MSw3ICsxOTEsMTMgQEAKIAogcDJwX2NhbmNlbAogCi1DYW5jZWwgYW4gb25nb2luZyBQMlAgZ3JvdXAgZm9ybWF0aW9uIHJlbGF0ZWQgb3BlcmF0aW9uLgorQ2FuY2VsIGFuIG9uZ29pbmcgUDJQIGdyb3VwIGZvcm1hdGlvbiBhbmQgam9pbmluZy1hLWdyb3VwIHJlbGF0ZWQKK29wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb25zIHVuYXV0aG9yaXplcyB0aGUgc3BlY2lmaWMgcGVlciBkZXZpY2UgKGlmIGFueQoraGFkIGJlZW4gYXV0aG9yaXplZCB0byBzdGFydCBncm91cCBmb3JtYXRpb24pLCBzdG9wcyBQMlAgZmluZCAoaWYgaW4KK3Byb2dyZXNzKSwgc3RvcHMgcGVuZGluZyBvcGVyYXRpb25zIGZvciBqb2luLWEtZ3JvdXAsIGFuZCByZW1vdmVzIHRoZQorUDJQIGdyb3VwIGludGVyZmFjZSAoaWYgb25lIHdhcyB1c2VkKSB0aGF0IGlzIGluIHRoZSBXUFMgcHJvdmlzaW9uaW5nCitzdGVwLiBJZiB0aGUgV1BTIHByb3Zpc2lvbmluZyBzdGVwIGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhlIGdyb3VwIGlzIG5vdAordGVybWluYXRlZC4KIAogU2VydmljZSBEaXNjb3ZlcnkKIApAQCAtMjE5LDYgKzIyNSwxOSBAQAogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHBlZXIgaGFzIHJlcGxpZWQgdG8KIGl0LgogCitTZXJ2aWNlIFF1ZXJ5IFRMViBoYXMgZm9sbG93aW5nIGZvcm1hdDoKK0xlbmd0aCAoMiBvY3RldHMsIGxpdHRsZSBlbmRpYW4pIC0gbGVuZ3RoIG9mIGZvbGxvd2luZyBkYXRhCitTZXJ2aWNlIFByb3RvY29sIFR5cGUgKDEgb2N0ZXQpIC0gc2VlIHRoZSB0YWJsZSBiZWxvdworU2VydmljZSBUcmFuc2FjdGlvbiBJRCAoMSBvY3RldCkgLSBub256ZXJvIGlkZW50aWZpZXIgZm9yIHRoZSBUTFYKK1F1ZXJ5IERhdGEgKExlbmd0aCAtIDIgb2N0ZXRzIG9mIGRhdGEpIC0gc2VydmljZSBwcm90b2NvbCBzcGVjaWZpYyBkYXRhCisKK1NlcnZpY2UgUHJvdG9jb2wgVHlwZXM6CiswID0gQWxsIHNlcnZpY2UgcHJvdG9jb2xzCisxID0gQm9uam91cgorMiA9IFVQblAKKzMgPSBXUy1EaXNjb3ZlcnkKKzQgPSBXaS1GaSBEaXNwbGF5CisKIEZvciBVUG5QLCBhbiBhbHRlcm5hdGl2ZSBjb21tYW5kIGZvcm1hdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEKIHNpbmdsZSBxdWVyeSBUTFYgKGkuZS4sIGEgc2VydmljZSBkaXNjb3ZlcnkgZm9yIGEgc3BlY2lmaWMgVVBuUAogc2VydmljZSk6CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9SRUFETUUtV1BTIGIvd3BhX3N1cHBsaWNhbnQvUkVBRE1FLVdQUwppbmRleCA2OTJkNWY1Li4xZWE5ODQzIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9SRUFETUUtV1BTCisrKyBiL3dwYV9zdXBwbGljYW50L1JFQURNRS1XUFMKQEAgLTEzMCw2ICsxMzAsMTIgQEAKIFRoaXMgc3RhcnRzIHRoZSBXUFMgbmVnb3RpYXRpb24gaW4gdGhlIHNhbWUgd2F5IGFzIGFib3ZlIHdpdGggdGhlCiBnZW5lcmF0ZWQgUElOLgogCitXaGVuIHRoZSB3cHNfcGluIGNvbW1hbmQgaXMgaXNzdWVkIGZvciBhbiBBUCAoaW5jbHVkaW5nIFAyUCBHTykgbW9kZQoraW50ZXJmYWNlLCBhbiBvcHRpb25hbCB0aW1lb3V0IHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CitleHBpcmF0aW9uIHRpbWVvdXQgZm9yIHRoZSBQSU4gaW4gc2Vjb25kcy4gRm9yIGV4YW1wbGU6CisKK3dwYV9jbGkgd3BzX3BpbiBhbnkgMTIzNDU2NzAgMzAwCisKIAogSWYgYSByYW5kb20gUElOIGlzIG5lZWRlZCBmb3IgYSB1c2VyIGludGVyZmFjZSwgIndwYV9jbGkgd3BzX3BpbiBnZXQiCiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBQSU4gd2l0aG91dCBzdGFydGluZyBXUFMgbmVnb3RpYXRpb24uCkBAIC0zNDUsMyArMzUxLDI3IEBACiB0aGUgRVIgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBzdGFydGVkICh3cHNfZXJfc3RhcnQpLCB0aGUgTkZDIHBhc3N3b3JkCiB0b2tlbiBpcyB1c2VkIHRvIGVuYWJsZSBlbnJvbGxtZW50IG9mIGEgbmV3IHN0YXRpb24gKHRoYXQgd2FzIHRoZSBzb3VyY2UKIG9mIHRoZSBORkMgcGFzc3dvcmQgdG9rZW4pLgorCisibmZjX2dldF9oYW5kb3Zlcl9yZXEgPE5ERUY+IDxXUFM+IiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHRoZQorY29udGVudHMgb2YgYSBIYW5kb3ZlciBSZXF1ZXN0IE1lc3NhZ2UgZm9yIGNvbm5lY3Rpb24gaGFuZG92ZXIuIFRoZQorZmlyc3QgYXJndW1lbnQgc2VsZWN0cyB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZGF0YSBhbmQgdGhlIHNlY29uZAorYXJndW1lbnQgc2VsZWN0cyB3aGljaCB0eXBlIG9mIGNvbm5lY3Rpb24gaGFuZG92ZXIgaXMgcmVxdWVzdGVkIChXUFMgPQorV2ktRmkgaGFuZG92ZXIgYXMgc3BlY2lmaWVkIGluIFdTQyAyLjApLgorCisibmZjX2dldF9oYW5kb3Zlcl9zZWwgPE5ERUY+IDxXUFM+IiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHRoZQorY29udGVudHMgb2YgYSBIYW5kb3ZlciBTZWxlY3QgTWVzc2FnZSBmb3IgY29ubmVjdGlvbiBoYW5kb3ZlciB3aGVuIHRoaXMKK2RvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIEhhbmRvdmVyIFJlcXVlc3QgTWVzc2FnZS4gVGhlCitmaXJzdCBhcmd1bWVudCBzZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgc2Vjb25kCithcmd1bWVudCBzZWxlY3RzIHdoaWNoIHR5cGUgb2YgY29ubmVjdGlvbiBoYW5kb3ZlciBpcyByZXF1ZXN0ZWQgKFdQUyA9CitXaS1GaSBoYW5kb3ZlciBhcyBzcGVjaWZpZWQgaW4gV1NDIDIuMCkuCisKKyJuZmNfcnhfaGFuZG92ZXJfcmVxIDxoZXhkdW1wIG9mIHBheWxvYWQ+IiBpcyB1c2VkIHRvIGluZGljYXRlIHJlY2VpcHQKK29mIE5GQyBjb25uZWN0aW9uIGhhbmRvdmVyIHJlcXVlc3QuIFRoZSBwYXlsb2FkIG1heSBpbmNsdWRlIG11bHRpcGxlCitjYXJyaWVycyB0aGUgdGhlIGFwcGxpY2FibGUgb25lcyBhcmUgbWF0Y2hlZCBiYXNlZCBvbiB0aGUgbWVkaWEKK3R5cGUuIFRoZSByZXBseSBkYXRhIGlzIGNvbnRlbnRzIGZvciB0aGUgSGFuZG92ZXIgU2VsZWN0IE1lc3NhZ2UKKyhoZXhkdW1wKS4KKworIm5mY19yeF9oYW5kb3Zlcl9zZWwgPGhleGR1bXAgb2YgcGF5bG9hZD4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgcmVjZWlwdAorb2YgTkZDIGNvbm5lY3Rpb24gaGFuZG92ZXIgc2VsZWN0LiBUaGUgcGF5bG9hZCBtYXkgaW5jbHVkZSBtdWx0aXBsZQorY2FycmllcnMgdGhlIHRoZSBhcHBsaWNhYmxlIG9uZXMgYXJlIG1hdGNoZWQgYmFzZWQgb24gdGhlIG1lZGlhCit0eXBlLgpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvYXAuYyBiL3dwYV9zdXBwbGljYW50L2FwLmMKaW5kZXggMzc5OGY1YS4uODVlZTZjYiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvYXAuYworKysgYi93cGFfc3VwcGxpY2FudC9hcC5jCkBAIC00Niw3ICs0Niw2IEBACiAJCQkJICBzdHJ1Y3QgaG9zdGFwZF9jb25maWcgKmNvbmYpCiB7CiAJc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqYnNzID0gJmNvbmYtPmJzc1swXTsKLQlpbnQgcGFpcndpc2U7CiAKIAljb25mLT5kcml2ZXIgPSB3cGFfcy0+ZHJpdmVyOwogCkBAIC02Myw2ICs2MiwxMCBAQAogCQkgICAoc3NpZC0+ZnJlcXVlbmN5ID49IDU3NDUgJiYgc3NpZC0+ZnJlcXVlbmN5IDw9IDU4MjUpKSB7CiAJCWNvbmYtPmh3X21vZGUgPSBIT1NUQVBEX01PREVfSUVFRTgwMjExQTsKIAkJY29uZi0+Y2hhbm5lbCA9IChzc2lkLT5mcmVxdWVuY3kgLSA1MDAwKSAvIDU7CisJfSBlbHNlIGlmIChzc2lkLT5mcmVxdWVuY3kgPj0gNTYxNjAgKyAyMTYwICogMSAmJgorCQkgICBzc2lkLT5mcmVxdWVuY3kgPD0gNTYxNjAgKyAyMTYwICogNCkgeworCQljb25mLT5od19tb2RlID0gSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFEOworCQljb25mLT5jaGFubmVsID0gKHNzaWQtPmZyZXF1ZW5jeSAtIDU2MTYwKSAvIDIxNjA7CiAJfSBlbHNlIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJVbnN1cHBvcnRlZCBBUCBtb2RlIGZyZXF1ZW5jeTogJWQgTUh6IiwKIAkJCSAgIHNzaWQtPmZyZXF1ZW5jeSk7CkBAIC0xNzQsMTUgKzE3NywxNSBAQAogCQlic3MtPndwYSA9IHNzaWQtPnByb3RvOwogCWJzcy0+d3BhX2tleV9tZ210ID0gc3NpZC0+a2V5X21nbXQ7CiAJYnNzLT53cGFfcGFpcndpc2UgPSBzc2lkLT5wYWlyd2lzZV9jaXBoZXI7Ci0JaWYgKHNzaWQtPnBhc3NwaHJhc2UpIHsKLQkJYnNzLT5zc2lkLndwYV9wYXNzcGhyYXNlID0gb3Nfc3RyZHVwKHNzaWQtPnBhc3NwaHJhc2UpOwotCX0gZWxzZSBpZiAoc3NpZC0+cHNrX3NldCkgeworCWlmIChzc2lkLT5wc2tfc2V0KSB7CiAJCW9zX2ZyZWUoYnNzLT5zc2lkLndwYV9wc2spOwogCQlic3MtPnNzaWQud3BhX3BzayA9IG9zX3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RhcGRfd3BhX3BzaykpOwogCQlpZiAoYnNzLT5zc2lkLndwYV9wc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJb3NfbWVtY3B5KGJzcy0+c3NpZC53cGFfcHNrLT5wc2ssIHNzaWQtPnBzaywgUE1LX0xFTik7CiAJCWJzcy0+c3NpZC53cGFfcHNrLT5ncm91cCA9IDE7CisJfSBlbHNlIGlmIChzc2lkLT5wYXNzcGhyYXNlKSB7CisJCWJzcy0+c3NpZC53cGFfcGFzc3BocmFzZSA9IG9zX3N0cmR1cChzc2lkLT5wYXNzcGhyYXNlKTsKIAl9IGVsc2UgaWYgKHNzaWQtPndlcF9rZXlfbGVuWzBdIHx8IHNzaWQtPndlcF9rZXlfbGVuWzFdIHx8CiAJCSAgIHNzaWQtPndlcF9rZXlfbGVuWzJdIHx8IHNzaWQtPndlcF9rZXlfbGVuWzNdKSB7CiAJCXN0cnVjdCBob3N0YXBkX3dlcF9rZXlzICp3ZXAgPSAmYnNzLT5zc2lkLndlcDsKQEAgLTIwNywyMiArMjEwLDEwIEBACiAJaWYgKHNzaWQtPmR0aW1fcGVyaW9kKQogCQlic3MtPmR0aW1fcGVyaW9kID0gc3NpZC0+ZHRpbV9wZXJpb2Q7CiAKLQkvKiBTZWxlY3QgZ3JvdXAgY2lwaGVyIGJhc2VkIG9uIHRoZSBlbmFibGVkIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZXMgKi8KLQlwYWlyd2lzZSA9IDA7Ci0JaWYgKGJzcy0+d3BhICYgMSkKLQkJcGFpcndpc2UgfD0gYnNzLT53cGFfcGFpcndpc2U7Ci0JaWYgKGJzcy0+d3BhICYgMikgewotCQlpZiAoYnNzLT5yc25fcGFpcndpc2UgPT0gMCkKLQkJCWJzcy0+cnNuX3BhaXJ3aXNlID0gYnNzLT53cGFfcGFpcndpc2U7Ci0JCXBhaXJ3aXNlIHw9IGJzcy0+cnNuX3BhaXJ3aXNlOwotCX0KLQlpZiAocGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9US0lQOwotCWVsc2UgaWYgKChwYWlyd2lzZSAmIChXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVApKSA9PQotCQkgV1BBX0NJUEhFUl9HQ01QKQotCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfR0NNUDsKLQllbHNlCi0JCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9DQ01QOworCWlmICgoYnNzLT53cGEgJiAyKSAmJiBic3MtPnJzbl9wYWlyd2lzZSA9PSAwKQorCQlic3MtPnJzbl9wYWlyd2lzZSA9IGJzcy0+d3BhX3BhaXJ3aXNlOworCWJzcy0+d3BhX2dyb3VwID0gd3BhX3NlbGVjdF9hcF9ncm91cF9jaXBoZXIoYnNzLT53cGEsIGJzcy0+d3BhX3BhaXJ3aXNlLAorCQkJCQkJICAgIGJzcy0+cnNuX3BhaXJ3aXNlKTsKIAogCWlmIChic3MtPndwYSAmJiBic3MtPmllZWU4MDJfMXgpCiAJCWJzcy0+c3NpZC5zZWN1cml0eV9wb2xpY3kgPSBTRUNVUklUWV9XUEE7CkBAIC0yNjQsNyArMjU1LDcgQEAKIAkJZ290byBub193cHM7CiAjaWZkZWYgQ09ORklHX1dQUzIKIAlpZiAoYnNzLT5zc2lkLnNlY3VyaXR5X3BvbGljeSA9PSBTRUNVUklUWV9XUEFfUFNLICYmCi0JICAgICghKHBhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSB8fCAhKGJzcy0+d3BhICYgMikpKQorCSAgICAoIShic3MtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfQ0NNUCkgfHwgIShic3MtPndwYSAmIDIpKSkKIAkJZ290byBub193cHM7IC8qIFdQUzIgZG9lcyBub3QgYWxsb3cgV1BBL1RLSVAtb25seQogCQkJICAgICAgKiBjb25maWd1cmF0aW9uICovCiAjZW5kaWYgLyogQ09ORklHX1dQUzIgKi8KQEAgLTQ2MiwyMCArNDUzLDE1IEBACiAJCXdwYV9zLT5rZXlfbWdtdCA9IFdQQV9LRVlfTUdNVF9OT05FOwogCXBhcmFtcy5rZXlfbWdtdF9zdWl0ZSA9IGtleV9tZ210MmRyaXZlcih3cGFfcy0+a2V5X21nbXQpOwogCi0JaWYgKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQllbHNlIGlmIChzc2lkLT5wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0dDTVApCi0JCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JZWxzZSBpZiAoc3NpZC0+cGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKQotCQl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gV1BBX0NJUEhFUl9US0lQOwotCWVsc2UgaWYgKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfTk9ORSkKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfTk9ORTsKLQllbHNlIHsKKwl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gd3BhX3BpY2tfcGFpcndpc2VfY2lwaGVyKHNzaWQtPnBhaXJ3aXNlX2NpcGhlciwKKwkJCQkJCQkgIDEpOworCWlmICh3cGFfcy0+cGFpcndpc2VfY2lwaGVyIDwgMCkgewogCQl3cGFfcHJpbnRmKE1TR19XQVJOSU5HLCAiV1BBOiBGYWlsZWQgdG8gc2VsZWN0IHBhaXJ3aXNlICIKIAkJCSAgICJjaXBoZXIuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JcGFyYW1zLnBhaXJ3aXNlX3N1aXRlID0gY2lwaGVyX3N1aXRlMmRyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKKwlwYXJhbXMucGFpcndpc2Vfc3VpdGUgPQorCQl3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKIAlwYXJhbXMuZ3JvdXBfc3VpdGUgPSBwYXJhbXMucGFpcndpc2Vfc3VpdGU7CiAKICNpZmRlZiBDT05GSUdfUDJQCkBAIC01OTksNyArNTg1LDYgQEAKIAogCXdwYV9zLT5jdXJyZW50X3NzaWQgPSBOVUxMOwogCXdwYV9zLT5hc3NvY19mcmVxID0gMDsKLQl3cGFfcy0+cmVhc3NvY2lhdGVkX2Nvbm5lY3Rpb24gPSAwOwogI2lmZGVmIENPTkZJR19QMlAKIAlpZiAod3BhX3MtPmFwX2lmYWNlLT5ic3MpCiAJCXdwYV9zLT5hcF9pZmFjZS0+YnNzWzBdLT5wMnBfZ3JvdXAgPSBOVUxMOwpAQCAtNzI0LDcgKzcwOSw4IEBACiAKIAogaW50IHdwYV9zdXBwbGljYW50X2FwX3dwc19waW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkLAotCQkJICAgICAgY29uc3QgY2hhciAqcGluLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCisJCQkgICAgICBjb25zdCBjaGFyICpwaW4sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwKKwkJCSAgICAgIGludCB0aW1lb3V0KQogewogCWludCByZXQsIHJldF9sZW4gPSAwOwogCkBAIC03MzksNyArNzI1LDcgQEAKIAkJcmV0X2xlbiA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBwaW4pOwogCiAJcmV0ID0gaG9zdGFwZF93cHNfYWRkX3Bpbih3cGFfcy0+YXBfaWZhY2UtPmJzc1swXSwgYnNzaWQsICJhbnkiLCBwaW4sCi0JCQkJICAwKTsKKwkJCQkgIHRpbWVvdXQpOwogCWlmIChyZXQpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gcmV0X2xlbjsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2FwLmggYi93cGFfc3VwcGxpY2FudC9hcC5oCmluZGV4IGJjOTUzZDkuLjUzNjA2NGYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2FwLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvYXAuaApAQCAtMTgsNyArMTgsOCBAQAogaW50IHdwYV9zdXBwbGljYW50X2FwX3dwc19wYmMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkLAogCQkJICAgICAgY29uc3QgdTggKnAycF9kZXZfYWRkcik7CiBpbnQgd3BhX3N1cHBsaWNhbnRfYXBfd3BzX3BpbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQsCi0JCQkgICAgICBjb25zdCBjaGFyICpwaW4sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CisJCQkgICAgICBjb25zdCBjaGFyICpwaW4sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwKKwkJCSAgICAgIGludCB0aW1lb3V0KTsKIGludCB3cGFfc3VwcGxpY2FudF9hcF93cHNfY2FuY2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogdm9pZCB3cGFzX3dwc19hcF9waW5fZGlzYWJsZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIGNvbnN0IGNoYXIgKiB3cGFzX3dwc19hcF9waW5fcmFuZG9tKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCB0aW1lb3V0KTsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2F1dG9zY2FuLmMgYi93cGFfc3VwcGxpY2FudC9hdXRvc2Nhbi5jCmluZGV4IGQwYzA0MGEuLmEyY2Y3YTUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2F1dG9zY2FuLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvYXV0b3NjYW4uYwpAQCAtMzYsNyArMzYsNyBAQAogCiBzdGF0aWMgdm9pZCByZXF1ZXN0X3NjYW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKLQl3cGFfcy0+c2Nhbl9yZXEgPSAyOworCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKIAogCWlmICh3cGFfc3VwcGxpY2FudF9yZXFfc2NoZWRfc2Nhbih3cGFfcykpCiAJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCB3cGFfcy0+c2Nhbl9pbnRlcnZhbCwgMCk7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9iZ3NjYW5fbGVhcm4uYyBiL3dwYV9zdXBwbGljYW50L2Jnc2Nhbl9sZWFybi5jCmluZGV4IGFkZjgyZDguLjA3ZDMxZTQgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2Jnc2Nhbl9sZWFybi5jCisrKyBiL3dwYV9zdXBwbGljYW50L2Jnc2Nhbl9sZWFybi5jCkBAIC0yNDIsOCArMjQyLDExIEBACiAKIAlpZHggPSBkYXRhLT5wcm9iZV9pZHggKyAxOwogCXdoaWxlIChpZHggIT0gZGF0YS0+cHJvYmVfaWR4KSB7Ci0JCWlmIChkYXRhLT5zdXBwX2ZyZXFzW2lkeF0gPT0gMCkKKwkJaWYgKGRhdGEtPnN1cHBfZnJlcXNbaWR4XSA9PSAwKSB7CisJCQlpZiAoZGF0YS0+cHJvYmVfaWR4ID09IDApCisJCQkJYnJlYWs7CiAJCQlpZHggPSAwOworCQl9CiAJCWlmICghaW5fYXJyYXkoZnJlcXMsIGRhdGEtPnN1cHBfZnJlcXNbaWR4XSkpIHsKIAkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiYmdzY2FuIGxlYXJuOiBQcm9iZSBuZXcgZnJlcSAiCiAJCQkJICAgIiV1IiwgZGF0YS0+c3VwcF9mcmVxc1tpZHhdKTsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2JsYWNrbGlzdC5jIGIvd3BhX3N1cHBsaWNhbnQvYmxhY2tsaXN0LmMKaW5kZXggMmUwMWU3Zi4uZTUzZGMzOCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvYmxhY2tsaXN0LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvYmxhY2tsaXN0LmMKQEAgLTEyMywxNCArMTIzLDE5IEBACiB2b2lkIHdwYV9ibGFja2xpc3RfY2xlYXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlzdHJ1Y3Qgd3BhX2JsYWNrbGlzdCAqZSwgKnByZXY7CisJaW50IG1heF9jb3VudCA9IDA7CiAKIAllID0gd3BhX3MtPmJsYWNrbGlzdDsKIAl3cGFfcy0+YmxhY2tsaXN0ID0gTlVMTDsKIAl3aGlsZSAoZSkgeworCQlpZiAoZS0+Y291bnQgPiBtYXhfY291bnQpCisJCQltYXhfY291bnQgPSBlLT5jb3VudDsKIAkJcHJldiA9IGU7CiAJCWUgPSBlLT5uZXh0OwogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJlbW92ZWQgQlNTSUQgIiBNQUNTVFIgIiBmcm9tICIKIAkJCSAgICJibGFja2xpc3QgKGNsZWFyKSIsIE1BQzJTVFIocHJldi0+YnNzaWQpKTsKIAkJb3NfZnJlZShwcmV2KTsKIAl9CisKKwl3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50ICs9IG1heF9jb3VudDsKIH0KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2Jzcy5jIGIvd3BhX3N1cHBsaWNhbnQvYnNzLmMKaW5kZXggNjIyM2JlYi4uODdiN2RiOCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvYnNzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvYnNzLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQlNTIHRhYmxlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC01MSw2ICs1MSwxNCBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19hbnFwX2FsbG9jIC0gQWxsb2NhdGUgQU5RUCBkYXRhIHN0cnVjdHVyZSBmb3IgYSBCU1MgZW50cnkKKyAqIFJldHVybnM6IEFsbG9jYXRlZCBBTlFQIGRhdGEgc3RydWN0dXJlIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqCisgKiBUaGUgYWxsb2NhdGVkIEFOUVAgZGF0YSBzdHJ1Y3R1cmUgaGFzIGl0cyB1c2VycyBjb3VudCBzZXQgdG8gMS4gSXQgbWF5IGJlCisgKiBzaGFyZWQgYnkgbXVsdGlwbGUgQlNTIGVudHJpZXMgYW5kIGVhY2ggc2hhcmVkIGVudHJ5IGlzIGZyZWVkIHdpdGgKKyAqIHdwYV9ic3NfYW5xcF9mcmVlKCkuCisgKi8KIHN0cnVjdCB3cGFfYnNzX2FucXAgKiB3cGFfYnNzX2FucXBfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3Qgd3BhX2Jzc19hbnFwICphbnFwOwpAQCAtNjIsNiArNzAsNzcgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfYW5xcF9jbG9uZSAtIENsb25lIGFuIEFOUVAgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBhbnFwOiBBTlFQIGRhdGEgc3RydWN0dXJlIGZyb20gd3BhX2Jzc19hbnFwX2FsbG9jKCkKKyAqIFJldHVybnM6IENsb25lZCBBTlFQIGRhdGEgc3RydWN0dXJlIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIHN0cnVjdCB3cGFfYnNzX2FucXAgKiB3cGFfYnNzX2FucXBfY2xvbmUoc3RydWN0IHdwYV9ic3NfYW5xcCAqYW5xcCkKK3sKKwlzdHJ1Y3Qgd3BhX2Jzc19hbnFwICpuOworCisJbiA9IG9zX3phbGxvYyhzaXplb2YoKm4pKTsKKwlpZiAobiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworI2RlZmluZSBBTlFQX0RVUChmKSBpZiAoYW5xcC0+Zikgbi0+ZiA9IHdwYWJ1Zl9kdXAoYW5xcC0+ZikKKyNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCisJQU5RUF9EVVAodmVudWVfbmFtZSk7CisJQU5RUF9EVVAobmV0d29ya19hdXRoX3R5cGUpOworCUFOUVBfRFVQKHJvYW1pbmdfY29uc29ydGl1bSk7CisJQU5RUF9EVVAoaXBfYWRkcl90eXBlX2F2YWlsYWJpbGl0eSk7CisJQU5RUF9EVVAobmFpX3JlYWxtKTsKKwlBTlFQX0RVUChhbnFwXzNncHApOworCUFOUVBfRFVQKGRvbWFpbl9uYW1lKTsKKyNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisjaWZkZWYgQ09ORklHX0hTMjAKKwlBTlFQX0RVUChoczIwX29wZXJhdG9yX2ZyaWVuZGx5X25hbWUpOworCUFOUVBfRFVQKGhzMjBfd2FuX21ldHJpY3MpOworCUFOUVBfRFVQKGhzMjBfY29ubmVjdGlvbl9jYXBhYmlsaXR5KTsKKwlBTlFQX0RVUChoczIwX29wZXJhdGluZ19jbGFzcyk7CisjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KKyN1bmRlZiBBTlFQX0RVUAorCisJcmV0dXJuIG47Cit9CisKKworLyoqCisgKiB3cGFfYnNzX2FucXBfdW5zaGFyZV9hbGxvYyAtIFVuc2hhcmUgQU5RUCBkYXRhIChpZiBzaGFyZWQpIGluIGEgQlNTIGVudHJ5CisgKiBAYnNzOiBCU1MgZW50cnkKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgc3BlY2lmaWMgQlNTIGVudHJ5IGhhcyBhbiBBTlFQIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAqIGlzIG5vdCBzaGFyZWQgd2l0aCBhbnkgb3RoZXIgQlNTIGVudHJ5LgorICovCitpbnQgd3BhX2Jzc19hbnFwX3Vuc2hhcmVfYWxsb2Moc3RydWN0IHdwYV9ic3MgKmJzcykKK3sKKwlzdHJ1Y3Qgd3BhX2Jzc19hbnFwICphbnFwOworCisJaWYgKGJzcy0+YW5xcCAmJiBic3MtPmFucXAtPnVzZXJzID4gMSkgeworCQkvKiBhbGxvY2F0ZWQsIGJ1dCBzaGFyZWQgLSBjbG9uZSBhbiB1bnNoYXJlZCBjb3B5ICovCisJCWFucXAgPSB3cGFfYnNzX2FucXBfY2xvbmUoYnNzLT5hbnFwKTsKKwkJaWYgKGFucXAgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJYW5xcC0+dXNlcnMgPSAxOworCQlic3MtPmFucXAtPnVzZXJzLS07CisJCWJzcy0+YW5xcCA9IGFucXA7CisJCXJldHVybiAwOworCX0KKworCWlmIChic3MtPmFucXApCisJCXJldHVybiAwOyAvKiBhbHJlYWR5IGFsbG9jYXRlZCBhbmQgbm90IHNoYXJlZCAqLworCisJLyogbm90IGFsbG9jYXRlZCAtIGFsbG9jYXRlIGEgbmV3IHN0b3JhZ2UgYXJlYSAqLworCWJzcy0+YW5xcCA9IHdwYV9ic3NfYW5xcF9hbGxvYygpOworCXJldHVybiBic3MtPmFucXAgPyAwIDogLTE7Cit9CisKKworLyoqCisgKiB3cGFfYnNzX2FucXBfZnJlZSAtIEZyZWUgYW4gQU5RUCBkYXRhIHN0cnVjdHVyZQorICogQGFucXA6IEFOUVAgZGF0YSBzdHJ1Y3R1cmUgZnJvbSB3cGFfYnNzX2FucXBfYWxsb2MoKSBvciB3cGFfYnNzX2FucXBfY2xvbmUoKQorICovCiBzdGF0aWMgdm9pZCB3cGFfYnNzX2FucXBfZnJlZShzdHJ1Y3Qgd3BhX2Jzc19hbnFwICphbnFwKQogewogCWlmIChhbnFwID09IE5VTEwpCkBAIC0xMjEsNiArMjAwLDE0IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2dldCAtIEZldGNoIGEgQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIEJTU0lEIGFuZCBTU0lECisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGJzc2lkOiBCU1NJRAorICogQHNzaWQ6IFNTSUQKKyAqIEBzc2lkX2xlbjogTGVuZ3RoIG9mIEBzc2lkCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBCU1MgZW50cnkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKi8KIHN0cnVjdCB3cGFfYnNzICogd3BhX2Jzc19nZXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkLAogCQkJICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQogewpAQCAtNDQyLDYgKzUyOSwxNSBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc191cGRhdGVfc3RhcnQgLSBTdGFydCBhIEJTUyB0YWJsZSB1cGRhdGUgZnJvbSBzY2FuIHJlc3VsdHMKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggQlNTIHRhYmxlIHVwZGF0ZSByb3VuZCBmb3IgbmV3CisgKiBzY2FuIHJlc3VsdHMuIFRoZSBhY3R1YWwgc2NhbiByZXN1bHQgZW50cmllcyBhcmUgaW5kaWNhdGVkIHdpdGggY2FsbHMgdG8KKyAqIHdwYV9ic3NfdXBkYXRlX3NjYW5fcmVzKCkgYW5kIHRoZSB1cGRhdGUgcm91bmQgaXMgZmluaXNoZWQgd2l0aCBhIGNhbGwgdG8KKyAqIHdwYV9ic3NfdXBkYXRlX2VuZCgpLgorICovCiB2b2lkIHdwYV9ic3NfdXBkYXRlX3N0YXJ0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJd3BhX3MtPmJzc191cGRhdGVfaWR4Kys7CkBAIC00NTEsNiArNTQ3LDE1IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX3VwZGF0ZV9zY2FuX3JlcyAtIFVwZGF0ZSBhIEJTUyB0YWJsZSBlbnRyeSBiYXNlZCBvbiBhIHNjYW4gcmVzdWx0CisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQHJlczogU2NhbiByZXN1bHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgYSBCU1MgdGFibGUgZW50cnkgKG9yIGFkZHMgb25lKSBiYXNlZCBvbiBhIHNjYW4gcmVzdWx0LgorICogVGhpcyBpcyBjYWxsZWQgc2VwYXJhdGVseSBmb3IgZWFjaCBzY2FuIHJlc3VsdCBiZXR3ZWVuIHRoZSBjYWxscyB0bworICogd3BhX2Jzc191cGRhdGVfc3RhcnQoKSBhbmQgd3BhX2Jzc191cGRhdGVfZW5kKCkuCisgKi8KIHZvaWQgd3BhX2Jzc191cGRhdGVfc2Nhbl9yZXMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgc3RydWN0IHdwYV9zY2FuX3JlcyAqcmVzKQogewpAQCAtNTU2LDYgKzY2MSwxNiBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc191cGRhdGVfZW5kIC0gRW5kIGEgQlNTIHRhYmxlIHVwZGF0ZSBmcm9tIHNjYW4gcmVzdWx0cworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBpbmZvOiBJbmZvcm1hdGlvbiBhYm91dCBzY2FuIHBhcmFtZXRlcnMKKyAqIEBuZXdfc2NhbjogV2hldGhlciB0aGlzIHVwZGF0ZSByb3VuZCB3YXMgYmFzZWQgb24gYSBuZXcgc2NhbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBCU1MgdGFibGUgdXBkYXRlIHJvdW5kIGZvciBuZXcKKyAqIHNjYW4gcmVzdWx0cy4gVGhlIHN0YXJ0IG9mIHRoZSB1cGRhdGUgd2FzIGluZGljYXRlZCB3aXRoIGEgY2FsbCB0bworICogd3BhX2Jzc191cGRhdGVfc3RhcnQoKS4KKyAqLwogdm9pZCB3cGFfYnNzX3VwZGF0ZV9lbmQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHNjYW5faW5mbyAqaW5mbywKIAkJCWludCBuZXdfc2NhbikKIHsKQEAgLTYwMSw2ICs3MTYsMTMgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZmx1c2hfYnlfYWdlIC0gRmx1c2ggb2xkIEJTUyBlbnRyaWVzCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGFnZTogTWF4aW11bSBlbnRyeSBhZ2UgaW4gc2Vjb25kcworICoKKyAqIFJlbW92ZSBCU1MgZW50cmllcyB0aGF0IGhhdmUgbm90IGJlZW4gdXBkYXRlZCBkdXJpbmcgdGhlIGxhc3QgQGFnZSBzZWNvbmRzLgorICovCiB2b2lkIHdwYV9ic3NfZmx1c2hfYnlfYWdlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGludCBhZ2UpCiB7CiAJc3RydWN0IHdwYV9ic3MgKmJzcywgKm47CkBAIC02MzQsNiArNzU2LDE0IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2luaXQgLSBJbml0aWFsaXplIEJTUyB0YWJsZQorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICoKKyAqIFRoaXMgcHJlcGFyZXMgQlNTIHRhYmxlIGxpc3RzIGFuZCB0aW1lciBmb3IgcGVyaW9kaWMgdXBkYXRlcy4gVGhlIEJTUyB0YWJsZQorICogaXMgZGVpbml0aWFsaXplZCB3aXRoIHdwYV9ic3NfZGVpbml0KCkgb25jZSBub3QgbmVlZGVkIGFueW1vcmUuCisgKi8KIGludCB3cGFfYnNzX2luaXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlkbF9saXN0X2luaXQoJndwYV9zLT5ic3MpOwpAQCAtNjQ0LDYgKzc3NCwxMCBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19mbHVzaCAtIEZsdXNoIGFsbCB1bnVzZWQgQlNTIGVudHJpZXMKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKi8KIHZvaWQgd3BhX2Jzc19mbHVzaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXN0cnVjdCB3cGFfYnNzICpic3MsICpuOwpAQCAtNjU5LDYgKzc5MywxMCBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19kZWluaXQgLSBEZWluaXRpYWxpemUgQlNTIHRhYmxlCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICovCiB2b2lkIHdwYV9ic3NfZGVpbml0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3BhX2Jzc190aW1lb3V0LCB3cGFfcywgTlVMTCk7CkBAIC02NjYsNiArODA0LDEyIEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2dldF9ic3NpZCAtIEZldGNoIGEgQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIEJTU0lECisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGJzc2lkOiBCU1NJRAorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgQlNTIGVudHJ5IG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICovCiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X2Jzc2lkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgY29uc3QgdTggKmJzc2lkKQogewpAQCAtNjgxLDYgKzgyNSwxMiBAQAogCiAKICNpZmRlZiBDT05GSUdfUDJQCisvKioKKyAqIHdwYV9ic3NfZ2V0X3AycF9kZXZfYWRkciAtIEZldGNoIGEgQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIFAyUCBEZXZpY2UgQWRkcgorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBkZXZfYWRkcjogUDJQIERldmljZSBBZGRyZXNzIG9mIHRoZSBHTworICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgQlNTIGVudHJ5IG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICovCiBzdHJ1Y3Qgd3BhX2JzcyAqIHdwYV9ic3NfZ2V0X3AycF9kZXZfYWRkcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkgIGNvbnN0IHU4ICpkZXZfYWRkcikKIHsKQEAgLTY5Nyw2ICs4NDcsMTIgQEAKICNlbmRpZiAvKiBDT05GSUdfUDJQICovCiAKIAorLyoqCisgKiB3cGFfYnNzX2dldF9pZCAtIEZldGNoIGEgQlNTIHRhYmxlIGVudHJ5IGJhc2VkIG9uIGlkZW50aWZpZXIKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBAaWQ6IFVuaXF1ZSBpZGVudGlmaWVyIChzdHJ1Y3Qgd3BhX2Jzczo6aWQpIGFzc2lnbmVkIGZvciB0aGUgZW50cnkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gdGhlIEJTUyBlbnRyeSBvciAlTlVMTCBpZiBub3QgZm91bmQKKyAqLwogc3RydWN0IHdwYV9ic3MgKiB3cGFfYnNzX2dldF9pZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJc3RydWN0IHdwYV9ic3MgKmJzczsKQEAgLTcwOCw2ICs4NjQsMTUgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X2llIC0gRmV0Y2ggYSBzcGVjaWZpZWQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIGEgQlNTIGVudHJ5CisgKiBAYnNzOiBCU1MgdGFibGUgZW50cnkKKyAqIEBpZTogSW5mb3JtYXRpb24gZWxlbWVudCBpZGVudGl0aWZpZXIgKFdMQU5fRUlEXyopCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IChpZCBmaWVsZCkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBpbmZvcm1hdGlvbiBlbGVtZW50IGluIHRoZSBCU1MKKyAqIGVudHJ5LgorICovCiBjb25zdCB1OCAqIHdwYV9ic3NfZ2V0X2llKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsIHU4IGllKQogewogCWNvbnN0IHU4ICplbmQsICpwb3M7CkBAIC03MjcsNiArODkyLDE1IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2dldF92ZW5kb3JfaWUgLSBGZXRjaCBhIHZlbmRvciBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gYSBCU1MgZW50cnkKKyAqIEBic3M6IEJTUyB0YWJsZSBlbnRyeQorICogQHZlbmRvcl90eXBlOiBWZW5kb3IgdHlwZSAoZm91ciBvY3RldHMgc3RhcnRpbmcgdGhlIElFIHBheWxvYWQpCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IChpZCBmaWVsZCkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBpbmZvcm1hdGlvbiBlbGVtZW50IGluIHRoZSBCU1MKKyAqIGVudHJ5LgorICovCiBjb25zdCB1OCAqIHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZShjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCB1MzIgdmVuZG9yX3R5cGUpCiB7CiAJY29uc3QgdTggKmVuZCwgKnBvczsKQEAgLTc0Nyw2ICs5MjEsMTYgQEAKIH0KIAogCisvKioKKyAqIHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZV9tdWx0aSAtIEZldGNoIHZlbmRvciBJRSBkYXRhIGZyb20gYSBCU1MgZW50cnkKKyAqIEBic3M6IEJTUyB0YWJsZSBlbnRyeQorICogQHZlbmRvcl90eXBlOiBWZW5kb3IgdHlwZSAoZm91ciBvY3RldHMgc3RhcnRpbmcgdGhlIElFIHBheWxvYWQpCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IHBheWxvYWQgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbmNhdGVuYXRlZCBwYXlsb2FkIG9mIHBvc3NpYmx5IGZyYWdtZW50ZWQgdmVuZG9yCisgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGVtZW50cyBpbiB0aGUgQlNTIGVudHJ5LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZnJlZWluZyB0aGUgcmV0dXJuZWQgYnVmZmVyLgorICovCiBzdHJ1Y3Qgd3BhYnVmICogd3BhX2Jzc19nZXRfdmVuZG9yX2llX211bHRpKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsCiAJCQkJCSAgICB1MzIgdmVuZG9yX3R5cGUpCiB7CkBAIC03NzgsNiArOTYyLDE5IEBACiB9CiAKIAorLyoqCisgKiB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGlfYmVhY29uIC0gRmV0Y2ggdmVuZG9yIElFIGRhdGEgZnJvbSBhIEJTUyBlbnRyeQorICogQGJzczogQlNTIHRhYmxlIGVudHJ5CisgKiBAdmVuZG9yX3R5cGU6IFZlbmRvciB0eXBlIChmb3VyIG9jdGV0cyBzdGFydGluZyB0aGUgSUUgcGF5bG9hZCkKKyAqIFJldHVybnM6IFBvaW50ZXIgdG8gdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgcGF5bG9hZCBvciAlTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY29uY2F0ZW5hdGVkIHBheWxvYWQgb2YgcG9zc2libHkgZnJhZ21lbnRlZCB2ZW5kb3IKKyAqIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnRzIGluIHRoZSBCU1MgZW50cnkuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBmcmVlaW5nIHRoZSByZXR1cm5lZCBidWZmZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZV9tdWx0aSgpLCBidXQgdXNlcyBJRSBidWZmZXIgb25seQorICogZnJvbSBCZWFjb24gZnJhbWVzIGluc3RlYWQgb2YgZWl0aGVyIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZSBmcmFtZXMuCisgKi8KIHN0cnVjdCB3cGFidWYgKiB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGlfYmVhY29uKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsCiAJCQkJCQkgICB1MzIgdmVuZG9yX3R5cGUpCiB7CkBAIC04MTAsNiArMTAwNywxMSBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXRfbWF4X3JhdGUgLSBHZXQgbWF4aW11bSBsZWdhY3kgVFggcmF0ZSBzdXBwb3J0ZWQgaW4gYSBCU1MKKyAqIEBic3M6IEJTUyB0YWJsZSBlbnRyeQorICogUmV0dXJuczogTWF4aW11bSBsZWdhY3kgcmF0ZSBpbiB1bml0cyBvZiA1MDAga2JwcworICovCiBpbnQgd3BhX2Jzc19nZXRfbWF4X3JhdGUoY29uc3Qgc3RydWN0IHdwYV9ic3MgKmJzcykKIHsKIAlpbnQgcmF0ZSA9IDA7CkBAIC04MzIsNiArMTAzNCwxNSBAQAogfQogCiAKKy8qKgorICogd3BhX2Jzc19nZXRfYml0X3JhdGVzIC0gR2V0IGxlZ2FjeSBUWCByYXRlcyBzdXBwb3J0ZWQgaW4gYSBCU1MKKyAqIEBic3M6IEJTUyB0YWJsZSBlbnRyeQorICogQHJhdGVzOiBCdWZmZXIgZm9yIHJldHVybmluZyBhIHBvaW50ZXIgdG8gdGhlIHJhdGVzIGxpc3QgKHVuaXRzIG9mIDUwMCBrYnBzKQorICogUmV0dXJuczogbnVtYmVyIG9mIGxlZ2FjeSBUWCByYXRlcyBvciAtMSBvbiBmYWlsdXJlCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgcmV0dXJuZWQgYnVmZmVyIHdpdGggb3NfZnJlZSgpIGluCisgKiBjYXNlIG9mIHN1Y2Nlc3MuCisgKi8KIGludCB3cGFfYnNzX2dldF9iaXRfcmF0ZXMoY29uc3Qgc3RydWN0IHdwYV9ic3MgKmJzcywgdTggKipyYXRlcykKIHsKIAljb25zdCB1OCAqaWUsICppZTI7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9ic3MuaCBiL3dwYV9zdXBwbGljYW50L2Jzcy5oCmluZGV4IDRhMzg2YjYuLjAxZjZjNTkgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2Jzcy5oCisrKyBiL3dwYV9zdXBwbGljYW50L2Jzcy5oCkBAIC0xOSw3ICsxOSwxMSBAQAogI2RlZmluZSBXUEFfQlNTX0FTU09DSUFURUQJCUJJVCg1KQogI2RlZmluZSBXUEFfQlNTX0FOUVBfRkVUQ0hfVFJJRUQJQklUKDYpCiAKKy8qKgorICogc3RydWN0IHdwYV9ic3NfYW5xcCAtIEFOUVAgZGF0YSBmb3IgYSBCU1MgZW50cnkgKHN0cnVjdCB3cGFfYnNzKQorICovCiBzdHJ1Y3Qgd3BhX2Jzc19hbnFwIHsKKwkvKiogTnVtYmVyIG9mIEJTUyBlbnRyaWVzIHJlZmVycmluZyB0byB0aGlzIEFOUVAgZGF0YSBpbnN0YW5jZSAqLwogCXVuc2lnbmVkIGludCB1c2VyczsKICNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCiAJc3RydWN0IHdwYWJ1ZiAqdmVudWVfbmFtZTsKQEAgLTQwLDQ5ICs0NCw1MiBAQAogCiAvKioKICAqIHN0cnVjdCB3cGFfYnNzIC0gQlNTIHRhYmxlCi0gKiBAbGlzdDogTGlzdCBlbnRyeSBmb3Igc3RydWN0IHdwYV9zdXBwbGljYW50Ojpic3MKLSAqIEBsaXN0X2lkOiBMaXN0IGVudHJ5IGZvciBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQ6OmJzc19pZAotICogQGlkOiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBCU1MgZW50cnkKLSAqIEBzY2FuX21pc3NfY291bnQ6IE51bWJlciBvZiBjb3VudHMgd2l0aG91dCBzZWVpbmcgdGhpcyBCU1MKLSAqIEBmbGFnczogaW5mb3JtYXRpb24gZmxhZ3MgYWJvdXQgdGhlIEJTUy9JQlNTIChXUEFfQlNTXyopCi0gKiBAbGFzdF91cGRhdGVfaWR4OiBJbmRleCBvZiB0aGUgbGFzdCBzY2FuIHVwZGF0ZQotICogQGJzc2lkOiBCU1NJRAotICogQGhlc3NpZDogSEVTU0lECi0gKiBAZnJlcTogZnJlcXVlbmN5IG9mIHRoZSBjaGFubmVsIGluIE1IeiAoZS5nLiwgMjQxMiA9IGNoYW5uZWwgMSkKLSAqIEBiZWFjb25faW50OiBiZWFjb24gaW50ZXJ2YWwgaW4gVFVzIChob3N0IGJ5dGUgb3JkZXIpCi0gKiBAY2FwczogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBmaWVsZCBpbiBob3N0IGJ5dGUgb3JkZXIKLSAqIEBxdWFsOiBzaWduYWwgcXVhbGl0eQotICogQG5vaXNlOiBub2lzZSBsZXZlbAotICogQGxldmVsOiBzaWduYWwgbGV2ZWwKLSAqIEB0c2Y6IFRpbWVzdGFtcCBvZiBsYXN0IEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcmFtZQotICogQGxhc3RfdXBkYXRlOiBUaW1lIG9mIHRoZSBsYXN0IHVwZGF0ZSAoaS5lLiwgQmVhY29uIG9yIFByb2JlIFJlc3BvbnNlIFJYKQotICogQGllX2xlbjogbGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgSUUgZmllbGQgaW4gb2N0ZXRzIChmcm9tIFByb2JlIFJlc3BvbnNlKQotICogQGJlYWNvbl9pZV9sZW46IGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIEJlYWNvbiBJRSBmaWVsZCBpbiBvY3RldHMKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IG5laWdoYm9yaW5nIEJTU2VzIGluCiAgKiBnZW5lcmljIGZvcm1hdC4gSXQgaXMgbWFpbmx5IHVwZGF0ZWQgYmFzZWQgb24gc2NhbiByZXN1bHRzIGZyb20gdGhlIGRyaXZlci4KICAqLwogc3RydWN0IHdwYV9ic3MgeworCS8qKiBMaXN0IGVudHJ5IGZvciBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQ6OmJzcyAqLwogCXN0cnVjdCBkbF9saXN0IGxpc3Q7CisJLyoqIExpc3QgZW50cnkgZm9yIHN0cnVjdCB3cGFfc3VwcGxpY2FudDo6YnNzX2lkICovCiAJc3RydWN0IGRsX2xpc3QgbGlzdF9pZDsKKwkvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgQlNTIGVudHJ5ICovCiAJdW5zaWduZWQgaW50IGlkOworCS8qKiBOdW1iZXIgb2YgY291bnRzIHdpdGhvdXQgc2VlaW5nIHRoaXMgQlNTICovCiAJdW5zaWduZWQgaW50IHNjYW5fbWlzc19jb3VudDsKKwkvKiogSW5kZXggb2YgdGhlIGxhc3Qgc2NhbiB1cGRhdGUgKi8KIAl1bnNpZ25lZCBpbnQgbGFzdF91cGRhdGVfaWR4OworCS8qKiBJbmZvcm1hdGlvbiBmbGFncyBhYm91dCB0aGUgQlNTL0lCU1MgKFdQQV9CU1NfKikgKi8KIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJLyoqIEJTU0lEICovCiAJdTggYnNzaWRbRVRIX0FMRU5dOworCS8qKiBIRVNTSUQgKi8KIAl1OCBoZXNzaWRbRVRIX0FMRU5dOworCS8qKiBTU0lEICovCiAJdTggc3NpZFszMl07CisJLyoqIExlbmd0aCBvZiBTU0lEICovCiAJc2l6ZV90IHNzaWRfbGVuOworCS8qKiBGcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgaW4gTUh6IChlLmcuLCAyNDEyID0gY2hhbm5lbCAxKSAqLwogCWludCBmcmVxOworCS8qKiBCZWFjb24gaW50ZXJ2YWwgaW4gVFVzIChob3N0IGJ5dGUgb3JkZXIpICovCiAJdTE2IGJlYWNvbl9pbnQ7CisJLyoqIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gZmllbGQgaW4gaG9zdCBieXRlIG9yZGVyICovCiAJdTE2IGNhcHM7CisJLyoqIFNpZ25hbCBxdWFsaXR5ICovCiAJaW50IHF1YWw7CisJLyoqIE5vaXNlIGxldmVsICovCiAJaW50IG5vaXNlOworCS8qKiBTaWduYWwgbGV2ZWwgKi8KIAlpbnQgbGV2ZWw7CisJLyoqIFRpbWVzdGFtcCBvZiBsYXN0IEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcmFtZSAqLwogCXU2NCB0c2Y7CisJLyoqIFRpbWUgb2YgdGhlIGxhc3QgdXBkYXRlIChpLmUuLCBCZWFjb24gb3IgUHJvYmUgUmVzcG9uc2UgUlgpICovCiAJc3RydWN0IG9zX3RpbWUgbGFzdF91cGRhdGU7CisJLyoqIEFOUVAgZGF0YSAqLwogCXN0cnVjdCB3cGFfYnNzX2FucXAgKmFucXA7CisJLyoqIExlbmd0aCBvZiB0aGUgZm9sbG93aW5nIElFIGZpZWxkIGluIG9jdGV0cyAoZnJvbSBQcm9iZSBSZXNwb25zZSkgKi8KIAlzaXplX3QgaWVfbGVuOworCS8qKiBMZW5ndGggb2YgdGhlIGZvbGxvd2luZyBCZWFjb24gSUUgZmllbGQgaW4gb2N0ZXRzICovCiAJc2l6ZV90IGJlYWNvbl9pZV9sZW47CiAJLyogZm9sbG93ZWQgYnkgaWVfbGVuIG9jdGV0cyBvZiBJRXMgKi8KIAkvKiBmb2xsb3dlZCBieSBiZWFjb25faWVfbGVuIG9jdGV0cyBvZiBJRXMgKi8KQEAgLTExMyw1ICsxMjAsNiBAQAogaW50IHdwYV9ic3NfZ2V0X21heF9yYXRlKGNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MpOwogaW50IHdwYV9ic3NfZ2V0X2JpdF9yYXRlcyhjb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzLCB1OCAqKnJhdGVzKTsKIHN0cnVjdCB3cGFfYnNzX2FucXAgKiB3cGFfYnNzX2FucXBfYWxsb2Modm9pZCk7CitpbnQgd3BhX2Jzc19hbnFwX3Vuc2hhcmVfYWxsb2Moc3RydWN0IHdwYV9ic3MgKmJzcyk7CiAKICNlbmRpZiAvKiBCU1NfSCAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmMgYi93cGFfc3VwcGxpY2FudC9jb25maWcuYwppbmRleCBiZTIxMDI5Li4yYzUyYzY4IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9jb25maWcuYworKysgYi93cGFfc3VwcGxpY2FudC9jb25maWcuYwpAQCAtNTA0LDYgKzUwNCwxMiBAQAogCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJXUFMiKSA9PSAwKQogCQkJdmFsIHw9IFdQQV9LRVlfTUdNVF9XUFM7CiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLworI2lmZGVmIENPTkZJR19TQUUKKwkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiU0FFIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfS0VZX01HTVRfU0FFOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJGVC1TQUUiKSA9PSAwKQorCQkJdmFsIHw9IFdQQV9LRVlfTUdNVF9GVF9TQUU7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCQllbHNlIHsKIAkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogaW52YWxpZCBrZXlfbWdtdCAnJXMnIiwKIAkJCQkgICBsaW5lLCBzdGFydCk7CkBAIC02MjMsNDkgKzYyOSwxMiBAQAogCiBzdGF0aWMgaW50IHdwYV9jb25maWdfcGFyc2VfY2lwaGVyKGludCBsaW5lLCBjb25zdCBjaGFyICp2YWx1ZSkKIHsKLQlpbnQgdmFsID0gMCwgbGFzdDsKLQljaGFyICpzdGFydCwgKmVuZCwgKmJ1ZjsKLQotCWJ1ZiA9IG9zX3N0cmR1cCh2YWx1ZSk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQorCWludCB2YWwgPSB3cGFfcGFyc2VfY2lwaGVyKHZhbHVlKTsKKwlpZiAodmFsIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQgY2lwaGVyICclcycuIiwKKwkJCSAgIGxpbmUsIHZhbHVlKTsKIAkJcmV0dXJuIC0xOwotCXN0YXJ0ID0gYnVmOwotCi0Jd2hpbGUgKCpzdGFydCAhPSAnXDAnKSB7Ci0JCXdoaWxlICgqc3RhcnQgPT0gJyAnIHx8ICpzdGFydCA9PSAnXHQnKQotCQkJc3RhcnQrKzsKLQkJaWYgKCpzdGFydCA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JCWVuZCA9IHN0YXJ0OwotCQl3aGlsZSAoKmVuZCAhPSAnICcgJiYgKmVuZCAhPSAnXHQnICYmICplbmQgIT0gJ1wwJykKLQkJCWVuZCsrOwotCQlsYXN0ID0gKmVuZCA9PSAnXDAnOwotCQkqZW5kID0gJ1wwJzsKLQkJaWYgKG9zX3N0cmNtcChzdGFydCwgIkNDTVAiKSA9PSAwKQotCQkJdmFsIHw9IFdQQV9DSVBIRVJfQ0NNUDsKLQkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiR0NNUCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9HQ01QOwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJUS0lQIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX1RLSVA7Ci0JCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldFUDEwNCIpID09IDApCi0JCQl2YWwgfD0gV1BBX0NJUEhFUl9XRVAxMDQ7Ci0JCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIldFUDQwIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX1dFUDQwOwotCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJOT05FIikgPT0gMCkKLQkJCXZhbCB8PSBXUEFfQ0lQSEVSX05PTkU7Ci0JCWVsc2UgewotCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIGNpcGhlciAnJXMnLiIsCi0JCQkJICAgbGluZSwgc3RhcnQpOwotCQkJb3NfZnJlZShidWYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKGxhc3QpCi0JCQlicmVhazsKLQkJc3RhcnQgPSBlbmQgKyAxOwogCX0KLQlvc19mcmVlKGJ1Zik7Ci0KIAlpZiAodmFsID09IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBubyBjaXBoZXIgdmFsdWVzIGNvbmZpZ3VyZWQuIiwKIAkJCSAgIGxpbmUpOwpAQCAtNjc4LDcyICs2NDcsMTMgQEAKICNpZm5kZWYgTk9fQ09ORklHX1dSSVRFCiBzdGF0aWMgY2hhciAqIHdwYV9jb25maWdfd3JpdGVfY2lwaGVyKGludCBjaXBoZXIpCiB7Ci0JY2hhciAqYnVmLCAqcG9zLCAqZW5kOwotCWludCByZXQ7Ci0KLQlwb3MgPSBidWYgPSBvc196YWxsb2MoNTApOworCWNoYXIgKmJ1ZiA9IG9zX3phbGxvYyg1MCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQllbmQgPSBidWYgKyA1MDsKIAotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0NDTVAiLAotCQkJCSAgcG9zID09IGJ1ZiA/ICIiIDogIiAiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykgewotCQkJZW5kWy0xXSA9ICdcMCc7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCXBvcyArPSByZXQ7Ci0JfQotCi0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzR0NNUCIsCi0JCQkJICBwb3MgPT0gYnVmID8gIiIgOiAiICIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKSB7Ci0JCQllbmRbLTFdID0gJ1wwJzsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcG9zICs9IHJldDsKLQl9Ci0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNUS0lQIiwKLQkJCQkgIHBvcyA9PSBidWYgPyAiIiA6ICIgIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpIHsKLQkJCWVuZFstMV0gPSAnXDAnOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwb3MgKz0gcmV0OwotCX0KLQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX1dFUDEwNCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzV0VQMTA0IiwKLQkJCQkgIHBvcyA9PSBidWYgPyAiIiA6ICIgIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpIHsKLQkJCWVuZFstMV0gPSAnXDAnOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwb3MgKz0gcmV0OwotCX0KLQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX1dFUDQwKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNXRVA0MCIsCi0JCQkJICBwb3MgPT0gYnVmID8gIiIgOiAiICIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKSB7Ci0JCQllbmRbLTFdID0gJ1wwJzsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcG9zICs9IHJldDsKLQl9Ci0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9OT05FKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNOT05FIiwKLQkJCQkgIHBvcyA9PSBidWYgPyAiIiA6ICIgIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpIHsKLQkJCWVuZFstMV0gPSAnXDAnOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwb3MgKz0gcmV0OworCWlmICh3cGFfd3JpdGVfY2lwaGVycyhidWYsIGJ1ZiArIDUwLCBjaXBoZXIsICIgIikgPCAwKSB7CisJCW9zX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcmV0dXJuIGJ1ZjsKQEAgLTc1OSw4ICs2NjksNyBAQAogCXZhbCA9IHdwYV9jb25maWdfcGFyc2VfY2lwaGVyKGxpbmUsIHZhbHVlKTsKIAlpZiAodmFsID09IC0xKQogCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbCAmIH4oV1BBX0NJUEhFUl9DQ01QIHwgV1BBX0NJUEhFUl9HQ01QIHwgV1BBX0NJUEhFUl9US0lQIHwKLQkJICAgIFdQQV9DSVBIRVJfTk9ORSkpIHsKKwlpZiAodmFsICYgfldQQV9BTExPV0VEX1BBSVJXSVNFX0NJUEhFUlMpIHsKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBub3QgYWxsb3dlZCBwYWlyd2lzZSBjaXBoZXIgIgogCQkJICAgIigweCV4KS4iLCBsaW5lLCB2YWwpOwogCQlyZXR1cm4gLTE7CkBAIC03ODksOCArNjk4LDcgQEAKIAl2YWwgPSB3cGFfY29uZmlnX3BhcnNlX2NpcGhlcihsaW5lLCB2YWx1ZSk7CiAJaWYgKHZhbCA9PSAtMSkKIAkJcmV0dXJuIC0xOwotCWlmICh2YWwgJiB+KFdQQV9DSVBIRVJfQ0NNUCB8IFdQQV9DSVBIRVJfR0NNUCB8IFdQQV9DSVBIRVJfVEtJUCB8Ci0JCSAgICBXUEFfQ0lQSEVSX1dFUDEwNCB8IFdQQV9DSVBIRVJfV0VQNDApKSB7CisJaWYgKHZhbCAmIH5XUEFfQUxMT1dFRF9HUk9VUF9DSVBIRVJTKSB7CiAJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogbm90IGFsbG93ZWQgZ3JvdXAgY2lwaGVyICIKIAkJCSAgICIoMHgleCkuIiwgbGluZSwgdmFsKTsKIAkJcmV0dXJuIC0xOwpAQCAtOTEwLDkgKzgxOCw3IEBACiAjZW5kaWYgLyogTk9fQ09ORklHX1dSSVRFICovCiAKIAotc3RhdGljIGludCAqIHdwYV9jb25maWdfcGFyc2VfZnJlcXMoY29uc3Qgc3RydWN0IHBhcnNlX2RhdGEgKmRhdGEsCi0JCQkJICAgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCwgaW50IGxpbmUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnZhbHVlKQorc3RhdGljIGludCAqIHdwYV9jb25maWdfcGFyc2VfaW50X2FycmF5KGNvbnN0IGNoYXIgKnZhbHVlKQogewogCWludCAqZnJlcXM7CiAJc2l6ZV90IHVzZWQsIGxlbjsKQEAgLTk1OSw3ICs4NjUsNyBAQAogewogCWludCAqZnJlcXM7CiAKLQlmcmVxcyA9IHdwYV9jb25maWdfcGFyc2VfZnJlcXMoZGF0YSwgc3NpZCwgbGluZSwgdmFsdWUpOworCWZyZXFzID0gd3BhX2NvbmZpZ19wYXJzZV9pbnRfYXJyYXkodmFsdWUpOwogCWlmIChmcmVxcyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAJb3NfZnJlZShzc2lkLT5zY2FuX2ZyZXEpOwpAQCAtOTc1LDcgKzg4MSw3IEBACiB7CiAJaW50ICpmcmVxczsKIAotCWZyZXFzID0gd3BhX2NvbmZpZ19wYXJzZV9mcmVxcyhkYXRhLCBzc2lkLCBsaW5lLCB2YWx1ZSk7CisJZnJlcXMgPSB3cGFfY29uZmlnX3BhcnNlX2ludF9hcnJheSh2YWx1ZSk7CiAJaWYgKGZyZXFzID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlvc19mcmVlKHNzaWQtPmZyZXFfbGlzdCk7CkBAIC0xNjIxLDcgKzE1MjcsNyBAQAogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCiAJeyBJTlRfUkFOR0UocGVlcmtleSwgMCwgMSkgfSwKIAl7IElOVF9SQU5HRShtaXhlZF9jZWxsLCAwLCAxKSB9LAotCXsgSU5UX1JBTkdFKGZyZXF1ZW5jeSwgMCwgMTAwMDApIH0sCisJeyBJTlRfUkFOR0UoZnJlcXVlbmN5LCAwLCA2NTAwMCkgfSwKIAl7IElOVCh3cGFfcHRrX3Jla2V5KSB9LAogCXsgU1RSKGJnc2NhbikgfSwKIAl7IElOVF9SQU5HRShpZ25vcmVfYnJvYWRjYXN0X3NzaWQsIDAsIDIpIH0sCkBAIC0xNjMxLDYgKzE1MzcsNyBAQAogI2lmZGVmIENPTkZJR19IVF9PVkVSUklERVMKIAl7IElOVF9SQU5HRShkaXNhYmxlX2h0LCAwLCAxKSB9LAogCXsgSU5UX1JBTkdFKGRpc2FibGVfaHQ0MCwgLTEsIDEpIH0sCisJeyBJTlRfUkFOR0UoZGlzYWJsZV9zZ2ksIDAsIDEpIH0sCiAJeyBJTlRfUkFOR0UoZGlzYWJsZV9tYXhfYW1zZHUsIC0xLCAxKSB9LAogCXsgSU5UX1JBTkdFKGFtcGR1X2ZhY3RvciwgLTEsIDMpIH0sCiAJeyBJTlRfUkFOR0UoYW1wZHVfZGVuc2l0eSwgLTEsIDcpIH0sCkBAIC0xODI5LDYgKzE3MzYsNyBAQAogCW9zX2ZyZWUoY3JlZC0+ZWFwX21ldGhvZCk7CiAJb3NfZnJlZShjcmVkLT5waGFzZTEpOwogCW9zX2ZyZWUoY3JlZC0+cGhhc2UyKTsKKwlvc19mcmVlKGNyZWQtPmV4Y2x1ZGVkX3NzaWQpOwogCW9zX2ZyZWUoY3JlZCk7CiB9CiAKQEAgLTE4OTUsNiArMTgwMyw3IEBACiAJd3BhYnVmX2ZyZWUoY29uZmlnLT53cHNfbmZjX2RoX3ByaXZrZXkpOwogCXdwYWJ1Zl9mcmVlKGNvbmZpZy0+d3BzX25mY19kZXZfcHcpOwogCW9zX2ZyZWUoY29uZmlnLT5leHRfcGFzc3dvcmRfYmFja2VuZCk7CisJb3NfZnJlZShjb25maWctPnNhZV9ncm91cHMpOwogCW9zX2ZyZWUoY29uZmlnKTsKIH0KIApAQCAtMjAzMSwxMCArMTk0MCwxNSBAQAogI2lmZGVmIENPTkZJR19IVF9PVkVSUklERVMKIAlzc2lkLT5kaXNhYmxlX2h0ID0gREVGQVVMVF9ESVNBQkxFX0hUOwogCXNzaWQtPmRpc2FibGVfaHQ0MCA9IERFRkFVTFRfRElTQUJMRV9IVDQwOworCXNzaWQtPmRpc2FibGVfc2dpID0gREVGQVVMVF9ESVNBQkxFX1NHSTsKIAlzc2lkLT5kaXNhYmxlX21heF9hbXNkdSA9IERFRkFVTFRfRElTQUJMRV9NQVhfQU1TRFU7CiAJc3NpZC0+YW1wZHVfZmFjdG9yID0gREVGQVVMVF9BTVBEVV9GQUNUT1I7CiAJc3NpZC0+YW1wZHVfZGVuc2l0eSA9IERFRkFVTFRfQU1QRFVfREVOU0lUWTsKICNlbmRpZiAvKiBDT05GSUdfSFRfT1ZFUlJJREVTICovCisJc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nID0gLTE7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKKwlzc2lkLT5pZWVlODAyMTF3ID0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQ7CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIH0KIAogCkBAIC0yNDAxLDYgKzIzMTUsMzQgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKG9zX3N0cmNtcCh2YXIsICJleGNsdWRlZF9zc2lkIikgPT0gMCkgeworCQlzdHJ1Y3QgZXhjbHVkZWRfc3NpZCAqZTsKKworCQlpZiAobGVuID4gTUFYX1NTSURfTEVOKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQgIgorCQkJCSAgICJleGNsdWRlZF9zc2lkIGxlbmd0aCAlZCIsIGxpbmUsIChpbnQpIGxlbik7CisJCQlvc19mcmVlKHZhbCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQllID0gb3NfcmVhbGxvY19hcnJheShjcmVkLT5leGNsdWRlZF9zc2lkLAorCQkJCSAgICAgY3JlZC0+bnVtX2V4Y2x1ZGVkX3NzaWQgKyAxLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBleGNsdWRlZF9zc2lkKSk7CisJCWlmIChlID09IE5VTEwpIHsKKwkJCW9zX2ZyZWUodmFsKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljcmVkLT5leGNsdWRlZF9zc2lkID0gZTsKKworCQllID0gJmNyZWQtPmV4Y2x1ZGVkX3NzaWRbY3JlZC0+bnVtX2V4Y2x1ZGVkX3NzaWQrK107CisJCW9zX21lbWNweShlLT5zc2lkLCB2YWwsIGxlbik7CisJCWUtPnNzaWRfbGVuID0gbGVuOworCisJCW9zX2ZyZWUodmFsKTsKKworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAobGluZSkgewogCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IHVua25vd24gY3JlZCBmaWVsZCAnJXMnLiIsCiAJCQkgICBsaW5lLCB2YXIpOwpAQCAtMjkzNyw2ICsyODc5LDI0IEBACiB9CiAKIAorc3RhdGljIGludCB3cGFfY29uZmlnX3Byb2Nlc3Nfc2FlX2dyb3VwcygKKwljb25zdCBzdHJ1Y3QgZ2xvYmFsX3BhcnNlX2RhdGEgKmRhdGEsCisJc3RydWN0IHdwYV9jb25maWcgKmNvbmZpZywgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnBvcykKK3sKKwlpbnQgKmdyb3VwcyA9IHdwYV9jb25maWdfcGFyc2VfaW50X2FycmF5KHBvcyk7CisJaWYgKGdyb3VwcyA9PSBOVUxMKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogSW52YWxpZCBzYWVfZ3JvdXBzICclcyciLAorCQkJICAgbGluZSwgcG9zKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9zX2ZyZWUoY29uZmlnLT5zYWVfZ3JvdXBzKTsKKwljb25maWctPnNhZV9ncm91cHMgPSBncm91cHM7CisKKwlyZXR1cm4gMDsKK30KKworCiAjaWZkZWYgT0ZGU0VUCiAjdW5kZWYgT0ZGU0VUCiAjZW5kaWYgLyogT0ZGU0VUICovCkBAIC0zMDAwLDYgKzI5NjAsOSBAQAogCXsgSU5UX1JBTkdFKHAycF9pbnRyYV9ic3MsIDAsIDEpLCBDRkdfQ0hBTkdFRF9QMlBfSU5UUkFfQlNTIH0sCiAJeyBJTlQocDJwX2dyb3VwX2lkbGUpLCAwIH0sCiAJeyBGVU5DKHAycF9wcmVmX2NoYW4pLCBDRkdfQ0hBTkdFRF9QMlBfUFJFRl9DSEFOIH0sCisJeyBJTlQocDJwX2dvX2h0NDApLCAwIH0sCisJeyBJTlQocDJwX2Rpc2FibGVkKSwgMCB9LAorCXsgSU5UKHAycF9ub19ncm91cF9pZmFjZSksIDAgfSwKICNlbmRpZiAvKiBDT05GSUdfUDJQICovCiAJeyBGVU5DKGNvdW50cnkpLCBDRkdfQ0hBTkdFRF9DT1VOVFJZIH0sCiAJeyBJTlQoYnNzX21heF9jb3VudCksIDAgfSwKQEAgLTMwMjQsNiArMjk4Nyw5IEBACiAJeyBTVFIoZXh0X3Bhc3N3b3JkX2JhY2tlbmQpLCBDRkdfQ0hBTkdFRF9FWFRfUFdfQkFDS0VORCB9LAogCXsgSU5UKHAycF9nb19tYXhfaW5hY3Rpdml0eSksIDAgfSwKIAl7IElOVF9SQU5HRShhdXRvX2ludGVyd29ya2luZywgMCwgMSksIDAgfSwKKwl7IElOVChva2MpLCAwIH0sCisJeyBJTlQocG1mKSwgMCB9LAorCXsgRlVOQyhzYWVfZ3JvdXBzKSwgMCB9LAogfTsKIAogI3VuZGVmIEZVTkMKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2NvbmZpZy5oIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmgKaW5kZXggYjg4OWFiOC4uMGMzY2I5YSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnLmgKQEAgLTE5Niw2ICsxOTYsMTIgQEAKIAkgKiBQcmUtY29uZmlndXJlZCBFQVAgcGFyYW1ldGVycyBvciAlTlVMTC4KIAkgKi8KIAljaGFyICpwaGFzZTI7CisKKwlzdHJ1Y3QgZXhjbHVkZWRfc3NpZCB7CisJCXU4IHNzaWRbTUFYX1NTSURfTEVOXTsKKwkJc2l6ZV90IHNzaWRfbGVuOworCX0gKmV4Y2x1ZGVkX3NzaWQ7CisJc2l6ZV90IG51bV9leGNsdWRlZF9zc2lkOwogfTsKIAogCkBAIC03MTAsMTIgKzcxNiwxMiBAQAogCXN0cnVjdCB3cGFidWYgKndwc19uZmNfZGhfcHVia2V5OwogCiAJLyoqCi0JICogd3BzX25mY19kaF9wdWJrZXkgLSBORkMgREggUHJpdmF0ZSBLZXkgZm9yIHBhc3N3b3JkIHRva2VuCisJICogd3BzX25mY19kaF9wcml2a2V5IC0gTkZDIERIIFByaXZhdGUgS2V5IGZvciBwYXNzd29yZCB0b2tlbgogCSAqLwogCXN0cnVjdCB3cGFidWYgKndwc19uZmNfZGhfcHJpdmtleTsKIAogCS8qKgotCSAqIHdwc19uZmNfZGhfcHVia2V5IC0gTkZDIERldmljZSBQYXNzd29yZCBmb3IgcGFzc3dvcmQgdG9rZW4KKwkgKiB3cHNfbmZjX2Rldl9wdyAtIE5GQyBEZXZpY2UgUGFzc3dvcmQgZm9yIHBhc3N3b3JkIHRva2VuCiAJICovCiAJc3RydWN0IHdwYWJ1ZiAqd3BzX25mY19kZXZfcHc7CiAKQEAgLTc0Nyw2ICs3NTMsNjAgQEAKIAkgKiAgICAgbWF0Y2hpbmcgbmV0d29yayBibG9jawogCSAqLwogCWludCBhdXRvX2ludGVyd29ya2luZzsKKworCS8qKgorCSAqIHAycF9nb19odDQwIC0gRGVmYXVsdCBtb2RlIGZvciBIVDQwIGVuYWJsZSB3aGVuIG9wZXJhdGluZyBhcyBHTy4KKwkgKgorCSAqIFRoaXMgd2lsbCB0YWtlIGVmZmVjdCBmb3IgcDJwX2dyb3VwX2FkZCwgcDJwX2Nvbm5lY3QsIGFuZCBwMnBfaW52aXRlLgorCSAqIE5vdGUgdGhhdCByZWd1bGF0b3J5IGNvbnN0cmFpbnRzIGFuZCBkcml2ZXIgY2FwYWJpbGl0aWVzIGFyZQorCSAqIGNvbnN1bHRlZCBhbnl3YXksIHNvIHNldHRpbmcgaXQgdG8gMSBjYW4ndCBkbyByZWFsIGhhcm0uCisJICogQnkgZGVmYXVsdDogMCAoZGlzYWJsZWQpCisJICovCisJaW50IHAycF9nb19odDQwOworCisJLyoqCisJICogcDJwX2Rpc2FibGVkIC0gV2hldGhlciBQMlAgb3BlcmF0aW9ucyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgaW50ZXJmYWNlCisJICovCisJaW50IHAycF9kaXNhYmxlZDsKKworCS8qKgorCSAqIHAycF9ub19ncm91cF9pZmFjZSAtIFdoZXRoZXIgZ3JvdXAgaW50ZXJmYWNlcyBjYW4gYmUgdXNlZAorCSAqCisJICogQnkgZGVmYXVsdCwgd3BhX3N1cHBsaWNhbnQgd2lsbCBjcmVhdGUgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZm9yIFAyUAorCSAqIGdyb3VwIG9wZXJhdGlvbnMgaWYgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGlzLiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuCisJICogYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAxLiBJbiB0aGF0IGNhc2UsIHRoZSBzYW1lCisJICogaW50ZXJmYWNlIHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBQMlAgbWFuYWdlbWVudCBvcGVyYXRpb25zIGlzIHVzZWQKKwkgKiBhbHNvIGZvciB0aGUgZ3JvdXAgb3BlcmF0aW9uLgorCSAqLworCWludCBwMnBfbm9fZ3JvdXBfaWZhY2U7CisKKwkvKioKKwkgKiBva2MgLSBXaGV0aGVyIHRvIGVuYWJsZSBvcHBvcnR1bmlzdGljIGtleSBjYWNoaW5nIGJ5IGRlZmF1bHQKKwkgKgorCSAqIEJ5IGRlZmF1bHQsIE9LQyBpcyBkaXNhYmxlZCB1bmxlc3MgZW5hYmxlZCBieSB0aGUgcGVyLW5ldHdvcmsKKwkgKiBwcm9hY3RpdmVfa2V5X2NhY2hpbmc9MSBwYXJhbWV0ZXIuIG9rYz0xIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGlzCisJICogZGVmYXVsdCBiZWhhdmlvci4KKwkgKi8KKwlpbnQgb2tjOworCisJLyoqCisJICogcG1mIC0gV2hldGhlciB0byBlbmFibGUvcmVxdWlyZSBQTUYgYnkgZGVmYXVsdAorCSAqCisJICogQnkgZGVmYXVsdCwgUE1GIGlzIGRpc2FibGVkIHVubGVzcyBlbmFibGVkIGJ5IHRoZSBwZXItbmV0d29yaworCSAqIGllZWU4MDIxMXc9MSBvciBpZWVlODAyMTF3PTIgcGFyYW1ldGVyLiBwbWY9MS8yIGNhbiBiZSB1c2VkIHRvIGNoYW5nZQorCSAqIHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KKwkgKi8KKwllbnVtIG1mcF9vcHRpb25zIHBtZjsKKworCS8qKgorCSAqIHNhZV9ncm91cHMgLSBQcmVmZXJlbmNlIGxpc3Qgb2YgZW5hYmxlZCBncm91cHMgZm9yIFNBRQorCSAqCisJICogQnkgZGVmYXVsdCAoaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCksIHRoZSBtYW5kYXRvcnkgZ3JvdXAgMTkKKwkgKiAoRUNDIGdyb3VwIGRlZmluZWQgb3ZlciBhIDI1Ni1iaXQgcHJpbWUgb3JkZXIgZmllbGQpIGlzIHByZWZlcnJlZCwKKwkgKiBidXQgb3RoZXIgZ3JvdXBzIGFyZSBhbHNvIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCwgdGhlCisJICogZ3JvdXBzIHdpbGwgYmUgdHJpZWQgaW4gdGhlIGluZGljYXRlZCBvcmRlci4KKwkgKi8KKwlpbnQgKnNhZV9ncm91cHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19maWxlLmMgYi93cGFfc3VwcGxpY2FudC9jb25maWdfZmlsZS5jCmluZGV4IDUzMTk1N2EuLjUwYzM1MzMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2NvbmZpZ19maWxlLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvY29uZmlnX2ZpbGUuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgImJhc2U2NC5oIgogI2luY2x1ZGUgInV1aWQuaCIKICNpbmNsdWRlICJwMnAvcDJwLmgiCisjaW5jbHVkZSAiZWFwX3BlZXIvZWFwX21ldGhvZHMuaCIKKyNpbmNsdWRlICJlYXBfcGVlci9lYXAuaCIKIAogCiBzdGF0aWMgaW50IG5ld2xpbmVfdGVybWluYXRlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCkBAIC02NzYsMTEgKzY3OCwxMyBAQAogCUlOVF9ERUZlKGZyYWdtZW50X3NpemUsIERFRkFVTFRfRlJBR01FTlRfU0laRSk7CiAjZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCiAJSU5UKG1vZGUpOwotCUlOVChwcm9hY3RpdmVfa2V5X2NhY2hpbmcpOworCUlOVChmcmVxdWVuY3kpOworCXdyaXRlX2ludChmLCAicHJvYWN0aXZlX2tleV9jYWNoaW5nIiwgc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nLCAtMSk7CiAJSU5UKGRpc2FibGVkKTsKIAlJTlQocGVlcmtleSk7CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKLQlJTlQoaWVlZTgwMjExdyk7CisJd3JpdGVfaW50KGYsICJpZWVlODAyMTF3Iiwgc3NpZC0+aWVlZTgwMjExdywKKwkJICBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAlTVFIoaWRfc3RyKTsKICNpZmRlZiBDT05GSUdfUDJQCkBAIC03MDMsMTYgKzcwNyw1MiBAQAogCQlmcHJpbnRmKGYsICJcdHJlYWxtPVwiJXNcIlxuIiwgY3JlZC0+cmVhbG0pOwogCWlmIChjcmVkLT51c2VybmFtZSkKIAkJZnByaW50ZihmLCAiXHR1c2VybmFtZT1cIiVzXCJcbiIsIGNyZWQtPnVzZXJuYW1lKTsKLQlpZiAoY3JlZC0+cGFzc3dvcmQpCisJaWYgKGNyZWQtPnBhc3N3b3JkICYmIGNyZWQtPmV4dF9wYXNzd29yZCkKKwkJZnByaW50ZihmLCAiXHRwYXNzd29yZD1leHQ6JXNcbiIsIGNyZWQtPnBhc3N3b3JkKTsKKwllbHNlIGlmIChjcmVkLT5wYXNzd29yZCkKIAkJZnByaW50ZihmLCAiXHRwYXNzd29yZD1cIiVzXCJcbiIsIGNyZWQtPnBhc3N3b3JkKTsKIAlpZiAoY3JlZC0+Y2FfY2VydCkKIAkJZnByaW50ZihmLCAiXHRjYV9jZXJ0PVwiJXNcIlxuIiwgY3JlZC0+Y2FfY2VydCk7CisJaWYgKGNyZWQtPmNsaWVudF9jZXJ0KQorCQlmcHJpbnRmKGYsICJcdGNsaWVudF9jZXJ0PVwiJXNcIlxuIiwgY3JlZC0+Y2xpZW50X2NlcnQpOworCWlmIChjcmVkLT5wcml2YXRlX2tleSkKKwkJZnByaW50ZihmLCAiXHRwcml2YXRlX2tleT1cIiVzXCJcbiIsIGNyZWQtPnByaXZhdGVfa2V5KTsKKwlpZiAoY3JlZC0+cHJpdmF0ZV9rZXlfcGFzc3dkKQorCQlmcHJpbnRmKGYsICJcdHByaXZhdGVfa2V5X3Bhc3N3ZD1cIiVzXCJcbiIsCisJCQljcmVkLT5wcml2YXRlX2tleV9wYXNzd2QpOwogCWlmIChjcmVkLT5pbXNpKQogCQlmcHJpbnRmKGYsICJcdGltc2k9XCIlc1wiXG4iLCBjcmVkLT5pbXNpKTsKIAlpZiAoY3JlZC0+bWlsZW5hZ2UpCiAJCWZwcmludGYoZiwgIlx0bWlsZW5hZ2U9XCIlc1wiXG4iLCBjcmVkLT5taWxlbmFnZSk7CiAJaWYgKGNyZWQtPmRvbWFpbikKIAkJZnByaW50ZihmLCAiXHRkb21haW49XCIlc1wiXG4iLCBjcmVkLT5kb21haW4pOworCWlmIChjcmVkLT5yb2FtaW5nX2NvbnNvcnRpdW1fbGVuKSB7CisJCXNpemVfdCBpOworCQlmcHJpbnRmKGYsICJcdHJvYW1pbmdfY29uc29ydGl1bT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IGNyZWQtPnJvYW1pbmdfY29uc29ydGl1bV9sZW47IGkrKykKKwkJCWZwcmludGYoZiwgIiUwMngiLCBjcmVkLT5yb2FtaW5nX2NvbnNvcnRpdW1baV0pOworCQlmcHJpbnRmKGYsICJcbiIpOworCX0KKwlpZiAoY3JlZC0+ZWFwX21ldGhvZCkgeworCQljb25zdCBjaGFyICpuYW1lOworCQluYW1lID0gZWFwX2dldF9uYW1lKGNyZWQtPmVhcF9tZXRob2RbMF0udmVuZG9yLAorCQkJCSAgICBjcmVkLT5lYXBfbWV0aG9kWzBdLm1ldGhvZCk7CisJCWZwcmludGYoZiwgIlx0ZWFwPSVzXG4iLCBuYW1lKTsKKwl9CisJaWYgKGNyZWQtPnBoYXNlMSkKKwkJZnByaW50ZihmLCAiXHRwaGFzZTE9XCIlc1wiXG4iLCBjcmVkLT5waGFzZTEpOworCWlmIChjcmVkLT5waGFzZTIpCisJCWZwcmludGYoZiwgIlx0cGhhc2UyPVwiJXNcIlxuIiwgY3JlZC0+cGhhc2UyKTsKKwlpZiAoY3JlZC0+ZXhjbHVkZWRfc3NpZCkgeworCQlzaXplX3QgaSwgajsKKwkJZm9yIChpID0gMDsgaSA8IGNyZWQtPm51bV9leGNsdWRlZF9zc2lkOyBpKyspIHsKKwkJCXN0cnVjdCBleGNsdWRlZF9zc2lkICplID0gJmNyZWQtPmV4Y2x1ZGVkX3NzaWRbaV07CisJCQlmcHJpbnRmKGYsICJcdGV4Y2x1ZGVkX3NzaWQ9Iik7CisJCQlmb3IgKGogPSAwOyBqIDwgZS0+c3NpZF9sZW47IGorKykKKwkJCQlmcHJpbnRmKGYsICIlMDJ4IiwgZS0+c3NpZFtqXSk7CisJCQlmcHJpbnRmKGYsICJcbiIpOworCQl9CisJfQogfQogCiAKQEAgLTg2OCw2ICs5MDgsMTMgQEAKIAkJfQogCQlmcHJpbnRmKGYsICJcbiIpOwogCX0KKwlpZiAoY29uZmlnLT5wMnBfZ29faHQ0MCkKKwkJZnByaW50ZihmLCAicDJwX2dvX2h0NDA9JXVcbiIsIGNvbmZpZy0+cDJwX2dvX2h0NDApOworCWlmIChjb25maWctPnAycF9kaXNhYmxlZCkKKwkJZnByaW50ZihmLCAicDJwX2Rpc2FibGVkPSV1XG4iLCBjb25maWctPnAycF9kaXNhYmxlZCk7CisJaWYgKGNvbmZpZy0+cDJwX25vX2dyb3VwX2lmYWNlKQorCQlmcHJpbnRmKGYsICJwMnBfbm9fZ3JvdXBfaWZhY2U9JXVcbiIsCisJCQljb25maWctPnAycF9ub19ncm91cF9pZmFjZSk7CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwogCWlmIChjb25maWctPmNvdW50cnlbMF0gJiYgY29uZmlnLT5jb3VudHJ5WzFdKSB7CiAJCWZwcmludGYoZiwgImNvdW50cnk9JWMlY1xuIiwKQEAgLTkxOSw2ICs5NjYsMjAgQEAKIAlpZiAoY29uZmlnLT5hdXRvX2ludGVyd29ya2luZykKIAkJZnByaW50ZihmLCAiYXV0b19pbnRlcndvcmtpbmc9JWRcbiIsCiAJCQljb25maWctPmF1dG9faW50ZXJ3b3JraW5nKTsKKwlpZiAoY29uZmlnLT5va2MpCisJCWZwcmludGYoZiwgIm9rYz0lZFxuIiwgY29uZmlnLT5va2MpOworCWlmIChjb25maWctPnBtZikKKwkJZnByaW50ZihmLCAicG1mPSVkXG4iLCBjb25maWctPnBtZik7CisKKwlpZiAoY29uZmlnLT5zYWVfZ3JvdXBzKSB7CisJCWludCBpOworCQlmcHJpbnRmKGYsICJzYWVfZ3JvdXBzPSIpOworCQlmb3IgKGkgPSAwOyBjb25maWctPnNhZV9ncm91cHNbaV0gPj0gMDsgaSsrKSB7CisJCQlmcHJpbnRmKGYsICIlcyVkIiwgaSA+IDAgPyAiICIgOiAiIiwKKwkJCQljb25maWctPnNhZV9ncm91cHNbaV0pOworCQl9CisJCWZwcmludGYoZiwgIlxuIik7CisJfQogfQogCiAjZW5kaWYgLyogQ09ORklHX05PX0NPTkZJR19XUklURSAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3NzaWQuaCBiL3dwYV9zdXBwbGljYW50L2NvbmZpZ19zc2lkLmgKaW5kZXggZmY5NzM3OS4uZDA3OTg2MyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3NzaWQuaAorKysgYi93cGFfc3VwcGxpY2FudC9jb25maWdfc3NpZC5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIERFRkFVTFRfQkdfU0NBTl9QRVJJT0QgLTEKICNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0hUIDAKICNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0hUNDAgMAorI2RlZmluZSBERUZBVUxUX0RJU0FCTEVfU0dJIDAKICNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX01BWF9BTVNEVSAtMSAvKiBubyBjaGFuZ2UgKi8KICNkZWZpbmUgREVGQVVMVF9BTVBEVV9GQUNUT1IgLTEgLyogbm8gY2hhbmdlICovCiAjZGVmaW5lIERFRkFVTFRfQU1QRFVfREVOU0lUWSAtMSAvKiBubyBjaGFuZ2UgKi8KQEAgLTIyOCwxMyArMjI5LDE4IEBACiAJICoKIAkgKiBUaGlzIGZpZWxkIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBwcm9hY3RpdmUga2V5IGNhY2hpbmcgd2hpY2ggaXMgYWxzbwogCSAqIGtub3duIGFzIG9wcG9ydHVuaXN0aWMgUE1LU0EgY2FjaGluZyBmb3IgV1BBMi4gVGhpcyBpcyBkaXNhYmxlZCAoMCkKLQkgKiBieSBkZWZhdWx0LiBFbmFibGUgYnkgc2V0dGluZyB0aGlzIHRvIDEuCisJICogYnkgZGVmYXVsdCB1bmxlc3MgZGVmYXVsdCB2YWx1ZSBpcyBjaGFuZ2VkIHdpdGggdGhlIGdsb2JhbCBva2M9MQorCSAqIHBhcmFtZXRlci4gRW5hYmxlIGJ5IHNldHRpbmcgdGhpcyB0byAxLgogCSAqCiAJICogUHJvYWN0aXZlIGtleSBjYWNoaW5nIGlzIHVzZWQgdG8gbWFrZSBzdXBwbGljYW50IGFzc3VtZSB0aGF0IHRoZSBBUHMKIAkgKiBhcmUgdXNpbmcgdGhlIHNhbWUgUE1LIGFuZCBnZW5lcmF0ZSBQTUtTQSBjYWNoZSBlbnRyaWVzIHdpdGhvdXQKIAkgKiBkb2luZyBSU04gcHJlLWF1dGhlbnRpY2F0aW9uLiBUaGlzIHJlcXVpcmVzIHN1cHBvcnQgZnJvbSB0aGUgQVAgc2lkZQogCSAqIGFuZCBpcyBub3JtYWxseSB1c2VkIHdpdGggd2lyZWxlc3Mgc3dpdGNoZXMgdGhhdCBjby1sb2NhdGUgdGhlCiAJICogYXV0aGVudGljYXRvci4KKwkgKgorCSAqIEludGVybmFsbHksIHNwZWNpYWwgdmFsdWUgLTEgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYXJhbWV0ZXIKKwkgKiB3YXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiAoaS5lLiwgZGVmYXVsdCBiZWhhdmlvciBpcworCSAqIGZvbGxvd2VkKS4KIAkgKi8KIAlpbnQgcHJvYWN0aXZlX2tleV9jYWNoaW5nOwogCkBAIC0zMjMsNiArMzI5LDE0IEBACiAJaW50IGRpc2FibGVkOwogCiAJLyoqCisJICogZGlzYWJsZWRfZm9yX2Nvbm5lY3QgLSBXaGV0aGVyIHRoaXMgbmV0d29yayB3YXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQKKwkgKgorCSAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHJlZW5hYmxlIGFsbCB0aGUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgbmV0d29ya3MKKwkgKiBhZnRlciBlaXRoZXIgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIFdQUyBjb25uZWN0aW9uLgorCSAqLworCWludCBkaXNhYmxlZF9mb3JfY29ubmVjdDsKKworCS8qKgogCSAqIHBlZXJrZXkgLSAgV2hldGhlciBQZWVyS2V5IGhhbmRzaGFrZSBmb3IgZGlyZWN0IGxpbmtzIGlzIGFsbG93ZWQKIAkgKgogCSAqIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gYm90aCBSU04vV1BBMiBhbmQgSUVFRSA4MDIuMTFlIChRb1MpIGFyZQpAQCAtMzQ4LDYgKzM2MiwxMiBAQAogCSAqCiAJICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBwb2xpY3kgZm9yIG1hbmFnZW1lbnQgZnJhbWUKIAkgKiBwcm90ZWN0aW9uIChJRUVFIDgwMi4xMXcpLiAwID0gZGlzYWJsZWQsIDEgPSBvcHRpb25hbCwgMiA9IHJlcXVpcmVkLgorCSAqIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCB1bmxlc3MgdGhlIGRlZmF1bHQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZAorCSAqIHdpdGggdGhlIGdsb2JhbCBwbWY9MS8yIHBhcmFtZXRlci4KKwkgKgorCSAqIEludGVybmFsbHksIHNwZWNpYWwgdmFsdWUgMyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhcmFtZXRlcgorCSAqIHdhcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIChpLmUuLCBkZWZhdWx0IGJlaGF2aW9yIGlzCisJICogZm9sbG93ZWQpLgogCSAqLwogCWVudW0gbWZwX29wdGlvbnMgaWVlZTgwMjExdzsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwpAQCAtNDgzLDYgKzUwMywxNCBAQAogCWludCBkaXNhYmxlX2h0NDA7CiAKIAkvKioKKwkgKiBkaXNhYmxlX3NnaSAtIERpc2FibGUgU0dJIChTaG9ydCBHdWFyZCBJbnRlcnZhbCkgZm9yIHRoaXMgbmV0d29yaworCSAqCisJICogQnkgZGVmYXVsdCwgdXNlIGl0IGlmIGl0IGlzIGF2YWlsYWJsZSwgYnV0IHRoaXMgY2FuIGJlIGNvbmZpZ3VyZWQKKwkgKiB0byAxIHRvIGhhdmUgaXQgZGlzYWJsZWQuCisJICovCisJaW50IGRpc2FibGVfc2dpOworCisJLyoqCiAJICogZGlzYWJsZV9tYXhfYW1zZHUgLSBEaXNhYmxlIE1BWCBBLU1TRFUKIAkgKgogCSAqIEEtTURTVSB3aWxsIGJlIDM4MzkgYnl0ZXMgd2hlbiBkaXNhYmxlZCwgb3IgNzkzNQpAQCAtNTM2LDYgKzU2NCwxNSBAQAogCSAqIGRpc2FibGVkX3VudGlsIC0gTmV0d29yayBibG9jayBkaXNhYmxlZCB1bnRpbCB0aGlzIHRpbWUgaWYgbm9uLXplcm8KIAkgKi8KIAlzdHJ1Y3Qgb3NfdGltZSBkaXNhYmxlZF91bnRpbDsKKworCS8qKgorCSAqIHBhcmVudF9jcmVkIC0gUG9pbnRlciB0byBwYXJlbnQgd3BhX2NyZWQgZW50cnkKKwkgKgorCSAqIFRoaXMgcG9pbnRlciBjYW4gYmUgdXNlZCB0byBkZWxldGUgdGVtcG9yYXJ5IG5ldHdvcmtzIHdoZW4gYSB3cGFfY3JlZAorCSAqIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZW0gaXMgcmVtb3ZlZC4gVGhpcyBwb2ludGVyIHNob3VsZCBub3QgYmUKKwkgKiBkZXJlZmVyZW5jZXMgc2luY2UgaXQgbWF5IG5vdCBiZSB1cGRhdGVkIGluIGFsbCBjYXNlcy4KKwkgKi8KKwl2b2lkICpwYXJlbnRfY3JlZDsKIH07CiAKICNlbmRpZiAvKiBDT05GSUdfU1NJRF9IICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9jb25maWdfd2lucmVnLmMgYi93cGFfc3VwcGxpY2FudC9jb25maWdfd2lucmVnLmMKaW5kZXggNmQ5ODc2Yy4uMjc1MGI2MyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY29uZmlnX3dpbnJlZy5jCisrKyBiL3dwYV9zdXBwbGljYW50L2NvbmZpZ193aW5yZWcuYwpAQCAtMjAyLDYgKzIwMiw3IEBACiBzdGF0aWMgaW50IHdwYV9jb25maWdfcmVhZF9nbG9iYWwoc3RydWN0IHdwYV9jb25maWcgKmNvbmZpZywgSEtFWSBoaykKIHsKIAlpbnQgZXJyb3JzID0gMDsKKwlpbnQgdmFsOwogCiAJd3BhX2NvbmZpZ19yZWFkX3JlZ19kd29yZChoaywgVEVYVCgiYXBfc2NhbiIpLCAmY29uZmlnLT5hcF9zY2FuKTsKIAl3cGFfY29uZmlnX3JlYWRfcmVnX2R3b3JkKGhrLCBURVhUKCJmYXN0X3JlYXV0aCIpLApAQCAtMjcxLDYgKzI3MiwxMCBAQAogCXdwYV9jb25maWdfcmVhZF9yZWdfZHdvcmQoaGssIFRFWFQoImRpc2Fzc29jX2xvd19hY2siKSwKIAkJCQkgIChpbnQgKikgJmNvbmZpZy0+ZGlzYXNzb2NfbG93X2Fjayk7CiAKKwl3cGFfY29uZmlnX3JlYWRfcmVnX2R3b3JkKGhrLCBURVhUKCJva2MiKSwgJmNvbmZpZy0+b2tjKTsKKwl3cGFfY29uZmlnX3JlYWRfcmVnX2R3b3JkKGhrLCBURVhUKCJwbWYiKSwgJnZhbCk7CisJY29uZmlnLT5wbWYgPSB2YWw7CisKIAlyZXR1cm4gZXJyb3JzID8gLTEgOiAwOwogfQogCkBAIC02MDksNiArNjE0LDkgQEAKIAl3cGFfY29uZmlnX3dyaXRlX3JlZ19kd29yZChoaywgVEVYVCgiZGlzYXNzb2NfbG93X2FjayIpLAogCQkJCSAgIGNvbmZpZy0+ZGlzYXNzb2NfbG93X2FjaywgMCk7CiAKKwl3cGFfY29uZmlnX3dyaXRlX3JlZ19kd29yZChoaywgVEVYVCgib2tjIiksIGNvbmZpZy0+b2tjLCAwKTsKKwl3cGFfY29uZmlnX3dyaXRlX3JlZ19kd29yZChoaywgVEVYVCgicG1mIiksIGNvbmZpZy0+cG1mLCAwKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05MDQsMTEgKzkxMiwxMyBAQAogCUlOVF9ERUZlKGZyYWdtZW50X3NpemUsIERFRkFVTFRfRlJBR01FTlRfU0laRSk7CiAjZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCiAJSU5UKG1vZGUpOwotCUlOVChwcm9hY3RpdmVfa2V5X2NhY2hpbmcpOworCXdyaXRlX2ludChuZXR3LCAicHJvYWN0aXZlX2tleV9jYWNoaW5nIiwgc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nLAorCQkgIC0xKTsKIAlJTlQoZGlzYWJsZWQpOwogCUlOVChwZWVya2V5KTsKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwotCUlOVChpZWVlODAyMTF3KTsKKwl3cml0ZV9pbnQobmV0dywgImllZWU4MDIxMXciLCBzc2lkLT5pZWVlODAyMTF3LAorCQkgIE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCVNUUihpZF9zdHIpOwogCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9jdHJsX2lmYWNlLmMgYi93cGFfc3VwcGxpY2FudC9jdHJsX2lmYWNlLmMKaW5kZXggYmNmMjdiZS4uMzQwOGE4NSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZS5jCisrKyBiL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2UuYwpAQCAtMzcsOCArMzcsOCBAQAogI2luY2x1ZGUgImN0cmxfaWZhY2UuaCIKICNpbmNsdWRlICJpbnRlcndvcmtpbmcuaCIKICNpbmNsdWRlICJibGFja2xpc3QuaCIKLSNpbmNsdWRlICJ3cGFzX2dsdWUuaCIKICNpbmNsdWRlICJhdXRvc2Nhbi5oIgorI2luY2x1ZGUgIndubV9zdGEuaCIKIAogZXh0ZXJuIHN0cnVjdCB3cGFfZHJpdmVyX29wcyAqd3BhX2RyaXZlcnNbXTsKIApAQCAtNTgsNiArNTgsMTEgQEAKIAlpZiAod3BhX3MtPnBubykKIAkJcmV0dXJuIDA7CiAKKwlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfU0NBTk5JTkcpIHsKKwkJd3BhX3N1cHBsaWNhbnRfY2FuY2VsX3NjaGVkX3NjYW4od3BhX3MpOworCQl3cGFfc3VwcGxpY2FudF9jYW5jZWxfc2Nhbih3cGFfcyk7CisJfQorCiAJb3NfbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAogCW51bV9zc2lkID0gMDsKQEAgLTExMywxMSArMTE4LDE3IEBACiAKIHN0YXRpYyBpbnQgcG5vX3N0b3Aoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKKwlpbnQgcmV0ID0gMDsKKwogCWlmICh3cGFfcy0+cG5vKSB7CiAJCXdwYV9zLT5wbm8gPSAwOwotCQlyZXR1cm4gd3BhX2Rydl9zdG9wX3NjaGVkX3NjYW4od3BhX3MpOworCQlyZXQgPSB3cGFfZHJ2X3N0b3Bfc2NoZWRfc2Nhbih3cGFfcyk7CiAJfQotCXJldHVybiAwOworCisJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX1NDQU5OSU5HKQorCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTE1OCw2ICsxNjksMTI4IEBACiB9CiAKIAorc3RhdGljIGludCBzZXRfZGlzYWxsb3dfYXBzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKnZhbCkKK3sKKwljaGFyICpwb3M7CisJdTggYWRkcltFVEhfQUxFTl0sICpic3NpZCA9IE5VTEwsICpuOworCXN0cnVjdCB3cGFfc3NpZF92YWx1ZSAqc3NpZCA9IE5VTEwsICpuczsKKwlzaXplX3QgY291bnQgPSAwLCBzc2lkX2NvdW50ID0gMDsKKwlzdHJ1Y3Qgd3BhX3NzaWQgKmM7CisKKwkvKgorCSAqIGRpc2FsbG93X2xpc3QgOjo9IDxzc2lkX3NwZWM+IHwgPGJzc2lkX3NwZWM+IHwgPGRpc2FsbG93X2xpc3Q+IHwgk5QKKwkgKiBTU0lEX1NQRUMgOjo9IHNzaWQgPFNTSURfSEVYPgorCSAqIEJTU0lEX1NQRUMgOjo9IGJzc2lkIDxCU1NJRF9IRVg+CisJICovCisKKwlwb3MgPSB2YWw7CisJd2hpbGUgKHBvcykgeworCQlpZiAoKnBvcyA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmIChvc19zdHJuY21wKHBvcywgImJzc2lkICIsIDYpID09IDApIHsKKwkJCWludCByZXM7CisJCQlwb3MgKz0gNjsKKwkJCXJlcyA9IGh3YWRkcl9hdG9uMihwb3MsIGFkZHIpOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlvc19mcmVlKHNzaWQpOworCQkJCW9zX2ZyZWUoYnNzaWQpOworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW52YWxpZCBkaXNhbGxvd19hcHMgIgorCQkJCQkgICAiQlNTSUQgdmFsdWUgJyVzJyIsIHBvcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcG9zICs9IHJlczsKKwkJCW4gPSBvc19yZWFsbG9jX2FycmF5KGJzc2lkLCBjb3VudCArIDEsIEVUSF9BTEVOKTsKKwkJCWlmIChuID09IE5VTEwpIHsKKwkJCQlvc19mcmVlKHNzaWQpOworCQkJCW9zX2ZyZWUoYnNzaWQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJzc2lkID0gbjsKKwkJCW9zX21lbWNweShic3NpZCArIGNvdW50ICogRVRIX0FMRU4sIGFkZHIsIEVUSF9BTEVOKTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJzc2lkICIsIDUpID09IDApIHsKKwkJCWNoYXIgKmVuZDsKKwkJCXBvcyArPSA1OworCisJCQllbmQgPSBwb3M7CisJCQl3aGlsZSAoKmVuZCkgeworCQkJCWlmICgqZW5kID09ICdcMCcgfHwgKmVuZCA9PSAnICcpCisJCQkJCWJyZWFrOworCQkJCWVuZCsrOworCQkJfQorCisJCQlucyA9IG9zX3JlYWxsb2NfYXJyYXkoc3NpZCwgc3NpZF9jb3VudCArIDEsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUpKTsKKwkJCWlmIChucyA9PSBOVUxMKSB7CisJCQkJb3NfZnJlZShzc2lkKTsKKwkJCQlvc19mcmVlKGJzc2lkKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzc2lkID0gbnM7CisKKwkJCWlmICgoZW5kIC0gcG9zKSAmIDB4MDEgfHwgZW5kIC0gcG9zID4gMiAqIDMyIHx8CisJCQkgICAgaGV4c3RyMmJpbihwb3MsIHNzaWRbc3NpZF9jb3VudF0uc3NpZCwKKwkJCQkgICAgICAgKGVuZCAtIHBvcykgLyAyKSA8IDApIHsKKwkJCQlvc19mcmVlKHNzaWQpOworCQkJCW9zX2ZyZWUoYnNzaWQpOworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW52YWxpZCBkaXNhbGxvd19hcHMgIgorCQkJCQkgICAiU1NJRCB2YWx1ZSAnJXMnIiwgcG9zKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzc2lkW3NzaWRfY291bnRdLnNzaWRfbGVuID0gKGVuZCAtIHBvcykgLyAyOworCQkJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiZGlzYWxsb3dfYXBzIFNTSUQiLAorCQkJCQkgIHNzaWRbc3NpZF9jb3VudF0uc3NpZCwKKwkJCQkJICBzc2lkW3NzaWRfY291bnRdLnNzaWRfbGVuKTsKKwkJCXNzaWRfY291bnQrKzsKKwkJCXBvcyA9IGVuZDsKKwkJfSBlbHNlIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVW5leHBlY3RlZCBkaXNhbGxvd19hcHMgdmFsdWUgIgorCQkJCSAgICInJXMnIiwgcG9zKTsKKwkJCW9zX2ZyZWUoc3NpZCk7CisJCQlvc19mcmVlKGJzc2lkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CisJCWlmIChwb3MpCisJCQlwb3MrKzsKKwl9CisKKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJkaXNhbGxvd19hcHNfYnNzaWQiLCBic3NpZCwgY291bnQgKiBFVEhfQUxFTik7CisJb3NfZnJlZSh3cGFfcy0+ZGlzYWxsb3dfYXBzX2Jzc2lkKTsKKwl3cGFfcy0+ZGlzYWxsb3dfYXBzX2Jzc2lkID0gYnNzaWQ7CisJd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZF9jb3VudCA9IGNvdW50OworCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJkaXNhbGxvd19hcHNfc3NpZF9jb3VudCAlZCIsIChpbnQpIHNzaWRfY291bnQpOworCW9zX2ZyZWUod3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkKTsKKwl3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWQgPSBzc2lkOworCXdwYV9zLT5kaXNhbGxvd19hcHNfc3NpZF9jb3VudCA9IHNzaWRfY291bnQ7CisKKwlpZiAoIXdwYV9zLT5jdXJyZW50X3NzaWQgfHwgd3BhX3MtPndwYV9zdGF0ZSA8IFdQQV9BVVRIRU5USUNBVElORykKKwkJcmV0dXJuIDA7CisKKwljID0gd3BhX3MtPmN1cnJlbnRfc3NpZDsKKwlpZiAoYy0+bW9kZSAhPSBXUEFTX01PREVfSU5GUkEgJiYgYy0+bW9kZSAhPSBXUEFTX01PREVfSUJTUykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRpc2FsbG93ZWRfYnNzaWQod3BhX3MsIHdwYV9zLT5ic3NpZCkgJiYKKwkgICAgIWRpc2FsbG93ZWRfc3NpZCh3cGFfcywgYy0+c3NpZCwgYy0+c3NpZF9sZW4pKQorCQlyZXR1cm4gMDsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRGlzY29ubmVjdCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBuZXR3b3JrICIKKwkJICAgImJlY2F1c2UgY3VycmVudCBBUCB3YXMgbWFya2VkIGRpc2FsbG93ZWQiKTsKKworI2lmZGVmIENPTkZJR19TTUUKKwl3cGFfcy0+c21lLnByZXZfYnNzaWRfc2V0ID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfU01FICovCisJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKKwl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zZXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkJIGNoYXIgKmNtZCkKIHsKQEAgLTI5MSw2ICs0MjQsMTAgQEAKICNlbmRpZiAvKiBDT05GSUdfV0lGSV9ESVNQTEFZICovCiAJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgImJzc2lkX2ZpbHRlciIpID09IDApIHsKIAkJcmV0ID0gc2V0X2Jzc2lkX2ZpbHRlcih3cGFfcywgdmFsdWUpOworCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJkaXNhbGxvd19hcHMiKSA9PSAwKSB7CisJCXJldCA9IHNldF9kaXNhbGxvd19hcHMod3BhX3MsIHZhbHVlKTsKKwl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAibm9fa2VlcF9hbGl2ZSIpID09IDApIHsKKwkJd3BhX3MtPm5vX2tlZXBfYWxpdmUgPSAhIWF0b2kodmFsdWUpOwogCX0gZWxzZSB7CiAJCXZhbHVlWy0xXSA9ICc9JzsKIAkJcmV0ID0gd3BhX2NvbmZpZ19wcm9jZXNzX2dsb2JhbCh3cGFfcy0+Y29uZiwgY21kLCAtMSk7CkBAIC01NDAsOSArNjc3LDIxIEBACiAJfQogCiAjaWZkZWYgQ09ORklHX0FQCi0JaWYgKHdwYV9zLT5hcF9pZmFjZSkKKwlpZiAod3BhX3MtPmFwX2lmYWNlKSB7CisJCWludCB0aW1lb3V0ID0gMDsKKwkJY2hhciAqcG9zOworCisJCWlmIChwaW4pIHsKKwkJCXBvcyA9IG9zX3N0cmNocihwaW4sICcgJyk7CisJCQlpZiAocG9zKSB7CisJCQkJKnBvcysrID0gJ1wwJzsKKwkJCQl0aW1lb3V0ID0gYXRvaShwb3MpOworCQkJfQorCQl9CisKIAkJcmV0dXJuIHdwYV9zdXBwbGljYW50X2FwX3dwc19waW4od3BhX3MsIF9ic3NpZCwgcGluLAotCQkJCQkJIGJ1ZiwgYnVmbGVuKTsKKwkJCQkJCSBidWYsIGJ1ZmxlbiwgdGltZW91dCk7CisJfQogI2VuZGlmIC8qIENPTkZJR19BUCAqLwogCiAJaWYgKHBpbikgewpAQCAtNjE0LDMxICs3NjMsNiBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19vb2Ioc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKLQkJCQkJICAgICBjaGFyICpjbWQpCi17Ci0JY2hhciAqcGF0aCwgKm1ldGhvZCwgKm5hbWU7Ci0KLQlwYXRoID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKLQlpZiAocGF0aCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JKnBhdGgrKyA9ICdcMCc7Ci0KLQltZXRob2QgPSBvc19zdHJjaHIocGF0aCwgJyAnKTsKLQlpZiAobWV0aG9kID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkqbWV0aG9kKysgPSAnXDAnOwotCi0JbmFtZSA9IG9zX3N0cmNocihtZXRob2QsICcgJyk7Ci0JaWYgKG5hbWUgIT0gTlVMTCkKLQkJKm5hbWUrKyA9ICdcMCc7Ci0KLQlyZXR1cm4gd3Bhc193cHNfc3RhcnRfb29iKHdwYV9zLCBjbWQsIHBhdGgsIG1ldGhvZCwgbmFtZSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQotCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAogc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKQEAgLTcxMCw2ICs4MzQsMTQ5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorCitzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3JlcV93cHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICAgICAgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlpbnQgcmVzOworCisJYnVmID0gd3Bhc193cHNfbmZjX2hhbmRvdmVyX3JlcSh3cGFfcyk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlyZXMgPSB3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZShyZXBseSwgbWF4X2xlbiwgd3BhYnVmX2hlYWQoYnVmKSwKKwkJCQkJIHdwYWJ1Zl9sZW4oYnVmKSk7CisJcmVwbHlbcmVzKytdID0gJ1xuJzsKKwlyZXBseVtyZXNdID0gJ1wwJzsKKworCXdwYWJ1Zl9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSAgY2hhciAqY21kLCBjaGFyICpyZXBseSwKKwkJCQkJICBzaXplX3QgbWF4X2xlbikKK3sKKwljaGFyICpwb3M7CisKKwlwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCSpwb3MrKyA9ICdcMCc7CisKKwlpZiAob3Nfc3RyY21wKGNtZCwgIk5ERUYiKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAob3Nfc3RyY21wKHBvcywgIldQUyIpID09IDApIHsKKwkJcmV0dXJuIHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3JlcV93cHMod3BhX3MsIHJlcGx5LAorCQkJCQkJCSAgbWF4X2xlbik7CisJfQorCisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfc2VsX3dwcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgICAgICBjaGFyICpyZXBseSwgc2l6ZV90IG1heF9sZW4pCit7CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCWludCByZXM7CisKKwlidWYgPSB3cGFzX3dwc19uZmNfaGFuZG92ZXJfc2VsKHdwYV9zKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXJlcyA9IHdwYV9zbnByaW50Zl9oZXhfdXBwZXJjYXNlKHJlcGx5LCBtYXhfbGVuLCB3cGFidWZfaGVhZChidWYpLAorCQkJCQkgd3BhYnVmX2xlbihidWYpKTsKKwlyZXBseVtyZXMrK10gPSAnXG4nOworCXJlcGx5W3Jlc10gPSAnXDAnOworCisJd3BhYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICBjaGFyICpjbWQsIGNoYXIgKnJlcGx5LAorCQkJCQkgIHNpemVfdCBtYXhfbGVuKQoreworCWNoYXIgKnBvczsKKworCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnBvcysrID0gJ1wwJzsKKworCWlmIChvc19zdHJjbXAoY21kLCAiTkRFRiIpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChvc19zdHJjbXAocG9zLCAiV1BTIikgPT0gMCkgeworCQlyZXR1cm4gd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfc2VsX3dwcyh3cGFfcywgcmVwbHksCisJCQkJCQkJICBtYXhfbGVuKTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX3J4X2hhbmRvdmVyX3JlcShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgY2hhciAqY21kLCBjaGFyICpyZXBseSwKKwkJCQkJIHNpemVfdCBtYXhfbGVuKQoreworCXNpemVfdCBsZW47CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCWludCByZXQ7CisKKwlsZW4gPSBvc19zdHJsZW4oY21kKTsKKwlpZiAobGVuICYgMHgwMSkKKwkJcmV0dXJuIC0xOworCWxlbiAvPSAyOworCisJYnVmID0gd3BhYnVmX2FsbG9jKGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKGhleHN0cjJiaW4oY21kLCB3cGFidWZfcHV0KGJ1ZiwgbGVuKSwgbGVuKSA8IDApIHsKKwkJd3BhYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9yZXEod3BhX3MsIGJ1Zik7CisJd3BhYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX3J4X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCQkgY2hhciAqY21kKQoreworCXNpemVfdCBsZW47CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCWludCByZXQ7CisKKwlsZW4gPSBvc19zdHJsZW4oY21kKTsKKwlpZiAobGVuICYgMHgwMSkKKwkJcmV0dXJuIC0xOworCWxlbiAvPSAyOworCisJYnVmID0gd3BhYnVmX2FsbG9jKGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKGhleHN0cjJiaW4oY21kLCB3cGFidWZfcHV0KGJ1ZiwgbGVuKSwgbGVuKSA8IDApIHsKKwkJd3BhYnVmX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9zZWwod3BhX3MsIGJ1Zik7CisJd3BhYnVmX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwogCiAKQEAgLTExMDYsNiArMTM3MywxNiBAQAogI2VuZGlmIC8qIENPTkZJR19BUCAqLwogCQlwb3MgKz0gd3BhX3NtX2dldF9zdGF0dXMod3BhX3MtPndwYSwgcG9zLCBlbmQgLSBwb3MsIHZlcmJvc2UpOwogCX0KKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKHdwYV9zLT53cGFfc3RhdGUgPj0gV1BBX0FTU09DSUFURUQgJiYKKwkgICAgd3BhX3MtPnNtZS5zYWUuc3RhdGUgPT0gU0FFX0FDQ0VQVEVEICYmICF3cGFfcy0+YXBfaWZhY2UpIHsKKwkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzYWVfZ3JvdXA9JWRcbiIsCisJCQkJICB3cGFfcy0+c21lLnNhZS5ncm91cCk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm4gcG9zIC0gYnVmOworCQlwb3MgKz0gcmV0OworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJ3cGFfc3RhdGU9JXNcbiIsCiAJCQkgIHdwYV9zdXBwbGljYW50X3N0YXRlX3R4dCh3cGFfcy0+d3BhX3N0YXRlKSk7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKQEAgLTExNDYsNiArMTQyMyw0NSBAQAogCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAkJcG9zICs9IHJldDsKIAl9CisKKwlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCkgeworCQlzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQ7CisJCWNoYXIgKnR5cGU7CisKKwkJZm9yIChjcmVkID0gd3BhX3MtPmNvbmYtPmNyZWQ7IGNyZWQ7IGNyZWQgPSBjcmVkLT5uZXh0KSB7CisJCQlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZC0+cGFyZW50X2NyZWQgIT0gY3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY3JlZC0+ZG9tYWluKQorCQkJCWNvbnRpbnVlOworCisJCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImhvbWVfc3A9JXNcbiIsCisJCQkJCSAgY3JlZC0+ZG9tYWluKTsKKwkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJCXBvcyArPSByZXQ7CisKKwkJCWlmICh3cGFfcy0+Y3VycmVudF9ic3MgPT0gTlVMTCB8fAorCQkJICAgIHdwYV9zLT5jdXJyZW50X2Jzcy0+YW5xcCA9PSBOVUxMKQorCQkJCXJlcyA9IC0xOworCQkJZWxzZQorCQkJCXJlcyA9IGludGVyd29ya2luZ19ob21lX3NwX2NyZWQoCisJCQkJCXdwYV9zLCBjcmVkLAorCQkJCQl3cGFfcy0+Y3VycmVudF9ic3MtPmFucXAtPmRvbWFpbl9uYW1lKTsKKwkJCWlmIChyZXMgPiAwKQorCQkJCXR5cGUgPSAiaG9tZSI7CisJCQllbHNlIGlmIChyZXMgPT0gMCkKKwkJCQl0eXBlID0gInJvYW1pbmciOworCQkJZWxzZQorCQkJCXR5cGUgPSAidW5rbm93biI7CisKKwkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAic3BfdHlwZT0lc1xuIiwgdHlwZSk7CisJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJCXJldHVybiBwb3MgLSBidWY7CisJCQlwb3MgKz0gcmV0OworCisJCQlicmVhazsKKwkJfQorCX0KICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCiAJaWYgKHdwYV9rZXlfbWdtdF93cGFfaWVlZTgwMjF4KHdwYV9zLT5rZXlfbWdtdCkgfHwKQEAgLTExNzMsOCArMTQ4OSw3IEBACiAJCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CiAJCXdwYV9tc2dfY3RybCh3cGFfcywgTVNHX0lORk8sIFdQQV9FVkVOVF9DT05ORUNURUQgIi0gY29ubmVjdGlvbiB0byAiCiAJCQlNQUNTVFIgIiBjb21wbGV0ZWQgJXMgW2lkPSVkIGlkX3N0cj0lc10iLAotCQkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLCB3cGFfcy0+cmVhc3NvY2lhdGVkX2Nvbm5lY3Rpb24gPwotCQkJIihyZWF1dGgpIiA6ICIoYXV0aCkiLAorCQkJTUFDMlNUUih3cGFfcy0+YnNzaWQpLCAiKGF1dGgpIiwKIAkJCXNzaWQgPyBzc2lkLT5pZCA6IC0xLAogCQkJc3NpZCAmJiBzc2lkLT5pZF9zdHIgPyBzc2lkLT5pZF9zdHIgOiAiIik7CiAJfQpAQCAtMTQyMSw1NCArMTczNiwxNSBAQAogCiBzdGF0aWMgY2hhciAqIHdwYV9zdXBwbGljYW50X2NpcGhlcl90eHQoY2hhciAqcG9zLCBjaGFyICplbmQsIGludCBjaXBoZXIpCiB7Ci0JaW50IGZpcnN0ID0gMSwgcmV0OworCWludCByZXQ7CiAJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICItIik7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKIAkJcmV0dXJuIHBvczsKIAlwb3MgKz0gcmV0OwotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX05PTkUpIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc05PTkUiLCBmaXJzdCA/ICIiIDogIisiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCXJldHVybiBwb3M7Ci0JCXBvcyArPSByZXQ7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfV0VQNDApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1dFUDQwIiwgZmlyc3QgPyAiIiA6ICIrIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQlyZXR1cm4gcG9zOwotCQlwb3MgKz0gcmV0OwotCQlmaXJzdCA9IDA7Ci0JfQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX1dFUDEwNCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzV0VQMTA0IiwKLQkJCQkgIGZpcnN0ID8gIiIgOiAiKyIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvczsKLQkJcG9zICs9IHJldDsKLQkJZmlyc3QgPSAwOwotCX0KLQlpZiAoY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSB7Ci0JCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNUS0lQIiwgZmlyc3QgPyAiIiA6ICIrIik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCi0JCQlyZXR1cm4gcG9zOwotCQlwb3MgKz0gcmV0OwotCQlmaXJzdCA9IDA7Ci0JfQotCWlmIChjaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0NDTVAiLCBmaXJzdCA/ICIiIDogIisiKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKLQkJCXJldHVybiBwb3M7Ci0JCXBvcyArPSByZXQ7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JaWYgKGNpcGhlciAmIFdQQV9DSVBIRVJfR0NNUCkgewotCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzR0NNUCIsIGZpcnN0ID8gIiIgOiAiKyIpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQotCQkJcmV0dXJuIHBvczsKLQkJcG9zICs9IHJldDsKLQkJZmlyc3QgPSAwOwotCX0KKwlyZXQgPSB3cGFfd3JpdGVfY2lwaGVycyhwb3MsIGVuZCwgY2lwaGVyLCAiKyIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcG9zOworCXBvcyArPSByZXQ7CiAJcmV0dXJuIHBvczsKIH0KIApAQCAtMTg2OSw4ICsyMTQ1LDggQEAKICNlbmRpZiAvKiBDT05GSUdfU01FICovCiAJCQl3cGFfc21fc2V0X2NvbmZpZyh3cGFfcy0+d3BhLCBOVUxMKTsKIAkJCWVhcG9sX3NtX25vdGlmeV9jb25maWcod3BhX3MtPmVhcG9sLCBOVUxMLCBOVUxMKTsKLQkJCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSh3cGFfcywKLQkJCQkgICAgICAgICAgICAgICAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKKwkJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKAorCQkJCXdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTkwMiw3ICsyMTc4LDggQEAKIAkJd3BhX3NtX3NldF9jb25maWcod3BhX3MtPndwYSwgTlVMTCk7CiAJCWVhcG9sX3NtX25vdGlmeV9jb25maWcod3BhX3MtPmVhcG9sLCBOVUxMLCBOVUxMKTsKIAotCQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUod3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKKwkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUod3BhX3MsCisJCQkJCSAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAl9CiAKIAlpZiAod3BhX2NvbmZpZ19yZW1vdmVfbmV0d29yayh3cGFfcy0+Y29uZiwgaWQpIDwgMCkgewpAQCAtMTk1Miw3ICsyMjI5LDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXdwYV9zbV9wbWtzYV9jYWNoZV9mbHVzaCh3cGFfcy0+d3BhLCBzc2lkKTsKKwlpZiAob3Nfc3RyY21wKG5hbWUsICJic3NpZCIpICE9IDAgJiYKKwkgICAgb3Nfc3RyY21wKG5hbWUsICJwcmlvcml0eSIpICE9IDApCisJCXdwYV9zbV9wbWtzYV9jYWNoZV9mbHVzaCh3cGFfcy0+d3BhLCBzc2lkKTsKIAogCWlmICh3cGFfcy0+Y3VycmVudF9zc2lkID09IHNzaWQgfHwgd3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKSB7CiAJCS8qCkBAIC0yMDY5LDIwICsyMzQ4LDYyIEBACiB9CiAKIAorc3RhdGljIGludCB3cGFzX2N0cmxfcmVtb3ZlX2NyZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgc3RydWN0IHdwYV9jcmVkICpjcmVkKQoreworCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKKwljaGFyIHN0clsyMF07CisKKwlpZiAoY3JlZCA9PSBOVUxMIHx8IHdwYV9jb25maWdfcmVtb3ZlX2NyZWQod3BhX3MtPmNvbmYsIGNyZWQtPmlkKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDb3VsZCBub3QgZmluZCBjcmVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSZW1vdmUgYW55IG5ldHdvcmsgZW50cnkgY3JlYXRlZCBiYXNlZCBvbiB0aGUgcmVtb3ZlZCBjcmVkZW50aWFsICovCisJc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOworCXdoaWxlIChzc2lkKSB7CisJCWlmIChzc2lkLT5wYXJlbnRfY3JlZCA9PSBjcmVkKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJlbW92ZSBuZXR3b3JrIGlkICVkIHNpbmNlIGl0ICIKKwkJCQkgICAidXNlZCB0aGUgcmVtb3ZlZCBjcmVkZW50aWFsIiwgc3NpZC0+aWQpOworCQkJb3Nfc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVkIiwgc3NpZC0+aWQpOworCQkJc3NpZCA9IHNzaWQtPm5leHQ7CisJCQl3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3JlbW92ZV9uZXR3b3JrKHdwYV9zLCBzdHIpOworCQl9IGVsc2UKKwkJCXNzaWQgPSBzc2lkLT5uZXh0OworCX0KKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9yZW1vdmVfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkJIGNoYXIgKmNtZCkKIHsKIAlpbnQgaWQ7Ci0Jc3RydWN0IHdwYV9jcmVkICpjcmVkOworCXN0cnVjdCB3cGFfY3JlZCAqY3JlZCwgKnByZXY7CiAKLQkvKiBjbWQ6ICI8Y3JlZCBpZD4iIG9yICJhbGwiICovCisJLyogY21kOiAiPGNyZWQgaWQ+IiwgImFsbCIsIG9yICJzcF9mcWRuPTxGUUROPiIgKi8KIAlpZiAob3Nfc3RyY21wKGNtZCwgImFsbCIpID09IDApIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBSRU1PVkVfQ1JFRCBhbGwiKTsKIAkJY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOwogCQl3aGlsZSAoY3JlZCkgewotCQkJaWQgPSBjcmVkLT5pZDsKKwkJCXByZXYgPSBjcmVkOwogCQkJY3JlZCA9IGNyZWQtPm5leHQ7Ci0JCQl3cGFfY29uZmlnX3JlbW92ZV9jcmVkKHdwYV9zLT5jb25mLCBpZCk7CisJCQl3cGFzX2N0cmxfcmVtb3ZlX2NyZWQod3BhX3MsIHByZXYpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChvc19zdHJuY21wKGNtZCwgInNwX2ZxZG49IiwgOCkgPT0gMCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9DUkVEIFNQIEZRRE4gJyVzJyIsCisJCQkgICBjbWQgKyA4KTsKKwkJY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOworCQl3aGlsZSAoY3JlZCkgeworCQkJcHJldiA9IGNyZWQ7CisJCQljcmVkID0gY3JlZC0+bmV4dDsKKwkJCWlmIChwcmV2LT5kb21haW4gJiYKKwkJCSAgICBvc19zdHJjbXAocHJldi0+ZG9tYWluLCBjbWQgKyA4KSA9PSAwKQorCQkJCXdwYXNfY3RybF9yZW1vdmVfY3JlZCh3cGFfcywgcHJldik7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjA5MSwxNCArMjQxMiw3IEBACiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBSRU1PVkVfQ1JFRCBpZD0lZCIsIGlkKTsKIAogCWNyZWQgPSB3cGFfY29uZmlnX2dldF9jcmVkKHdwYV9zLT5jb25mLCBpZCk7Ci0JaWYgKGNyZWQgPT0gTlVMTCB8fAotCSAgICB3cGFfY29uZmlnX3JlbW92ZV9jcmVkKHdwYV9zLT5jb25mLCBpZCkgPCAwKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQ291bGQgbm90IGZpbmQgY3JlZCBpZD0lZCIsCi0JCQkgICBpZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gd3Bhc19jdHJsX3JlbW92ZV9jcmVkKHdwYV9zLCBjcmVkKTsKIH0KIAogCkBAIC0yNDU0LDYgKzI3NjgsOSBAQAogCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFBOgogCQkJaG1vZGUgPSAiQSI7CiAJCQlicmVhazsKKwkJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQUQ6CisJCQlobW9kZSA9ICJBRCI7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0zMTQ0LDcgKzM0NjEsNyBAQAogCWF1dGggPSBvc19zdHJzdHIocG9zLCAiIGF1dGgiKSAhPSBOVUxMOwogCWF1dG9tYXRpYyA9IG9zX3N0cnN0cihwb3MsICIgYXV0byIpICE9IE5VTEw7CiAJcGQgPSBvc19zdHJzdHIocG9zLCAiIHByb3ZkaXNjIikgIT0gTlVMTDsKLQlodDQwID0gb3Nfc3Ryc3RyKHBvcywgIiBodDQwIikgIT0gTlVMTDsKKwlodDQwID0gKG9zX3N0cnN0cihjbWQsICIgaHQ0MCIpICE9IE5VTEwpIHx8IHdwYV9zLT5jb25mLT5wMnBfZ29faHQ0MDsKIAogCXBvczIgPSBvc19zdHJzdHIocG9zLCAiIGdvX2ludGVudD0iKTsKIAlpZiAocG9zMikgewpAQCAtMzU3NSw3ICszODkyLDcgQEAKIAkJCXJldHVybiAtMTsKIAl9CiAKLQlodDQwID0gb3Nfc3Ryc3RyKGNtZCwgIiBodDQwIikgIT0gTlVMTDsKKwlodDQwID0gKG9zX3N0cnN0cihjbWQsICIgaHQ0MCIpICE9IE5VTEwpIHx8IHdwYV9zLT5jb25mLT5wMnBfZ29faHQ0MDsKIAogCXJldHVybiB3cGFzX3AycF9pbnZpdGUod3BhX3MsIF9wZWVyLCBzc2lkLCBOVUxMLCBmcmVxLCBodDQwKTsKIH0KQEAgLTM2NTEsNyArMzk2OCw3IEBACiAJaWYgKHBvcykKIAkJZnJlcSA9IGF0b2kocG9zICsgNSk7CiAKLQlodDQwID0gb3Nfc3Ryc3RyKGNtZCwgImh0NDAiKSAhPSBOVUxMOworCWh0NDAgPSAob3Nfc3Ryc3RyKGNtZCwgImh0NDAiKSAhPSBOVUxMKSB8fCB3cGFfcy0+Y29uZi0+cDJwX2dvX2h0NDA7CiAKIAlpZiAob3Nfc3RybmNtcChjbWQsICJwZXJzaXN0ZW50PSIsIDExKSA9PSAwKQogCQlyZXR1cm4gcDJwX2N0cmxfZ3JvdXBfYWRkX3BlcnNpc3RlbnQod3BhX3MsIGNtZCArIDExLCBmcmVxLApAQCAtMzY3OSw2ICszOTk2LDcgQEAKIAljaGFyICpwb3MsICplbmQ7CiAJY2hhciBkZXZ0eXBlW1dQU19ERVZfVFlQRV9CVUZTSVpFXTsKIAlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CisJc2l6ZV90IGk7CiAKIAlpZiAoIXdwYV9zLT5nbG9iYWwtPnAycCkKIAkJcmV0dXJuIC0xOwpAQCAtMzczMiw2ICs0MDUwLDE4IEBACiAJCXJldHVybiBwb3MgLSBidWY7CiAJcG9zICs9IHJlczsKIAorCWZvciAoaSA9IDA7IGkgPCBpbmZvLT53cHNfc2VjX2Rldl90eXBlX2xpc3RfbGVuIC8gV1BTX0RFVl9UWVBFX0xFTjsgaSsrKQorCXsKKwkJY29uc3QgdTggKnQ7CisJCXQgPSAmaW5mby0+d3BzX3NlY19kZXZfdHlwZV9saXN0W2kgKiBXUFNfREVWX1RZUEVfTEVOXTsKKwkJcmVzID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzZWNfZGV2X3R5cGU9JXNcbiIsCisJCQkJICB3cHNfZGV2X3R5cGVfYmluMnN0cih0LCBkZXZ0eXBlLAorCQkJCQkJICAgICAgIHNpemVvZihkZXZ0eXBlKSkpOworCQlpZiAocmVzIDwgMCB8fCByZXMgPj0gZW5kIC0gcG9zKQorCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJcG9zICs9IHJlczsKKwl9CisKIAlzc2lkID0gd3Bhc19wMnBfZ2V0X3BlcnNpc3RlbnQod3BhX3MsIGluZm8tPnAycF9kZXZpY2VfYWRkciwgTlVMTCwgMCk7CiAJaWYgKHNzaWQpIHsKIAkJcmVzID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJwZXJzaXN0ZW50PSVkXG4iLCBzc2lkLT5pZCk7CkBAIC0zOTYwLDYgKzQyOTAsMzAgQEAKIAlpZiAob3Nfc3RyY21wKGNtZCwgImRpc2FsbG93X2ZyZXEiKSA9PSAwKQogCQlyZXR1cm4gcDJwX2N0cmxfZGlzYWxsb3dfZnJlcSh3cGFfcywgcGFyYW0pOwogCisJaWYgKG9zX3N0cmNtcChjbWQsICJkaXNjX2ludCIpID09IDApIHsKKwkJaW50IG1pbl9kaXNjX2ludCwgbWF4X2Rpc2NfaW50LCBtYXhfZGlzY190dTsKKwkJY2hhciAqcG9zOworCisJCXBvcyA9IHBhcmFtOworCisJCW1pbl9kaXNjX2ludCA9IGF0b2kocG9zKTsKKwkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJyAnKTsKKwkJaWYgKHBvcyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQkqcG9zKysgPSAnXDAnOworCisJCW1heF9kaXNjX2ludCA9IGF0b2kocG9zKTsKKwkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJyAnKTsKKwkJaWYgKHBvcyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQkqcG9zKysgPSAnXDAnOworCisJCW1heF9kaXNjX3R1ID0gYXRvaShwb3MpOworCisJCXJldHVybiBwMnBfc2V0X2Rpc2NfaW50KHdwYV9zLT5nbG9iYWwtPnAycCwgbWluX2Rpc2NfaW50LAorCQkJCQltYXhfZGlzY19pbnQsIG1heF9kaXNjX3R1KTsKKwl9CisKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFVua25vd24gUDJQX1NFVCBmaWVsZCB2YWx1ZSAnJXMnIiwKIAkJICAgY21kKTsKIApAQCAtNDMzMSw2ICs0Njg1LDYwIEBACiAjZW5kaWYgLyogQ09ORklHX0FVVE9TQ0FOICovCiAKIAorI2lmZGVmIENPTkZJR19XTk0KKworc3RhdGljIGludCB3cGFzX2N0cmxfaWZhY2Vfd25tX3NsZWVwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKK3sKKwlpbnQgZW50ZXI7CisJaW50IGludHZhbCA9IDA7CisJY2hhciAqcG9zOworCWludCByZXQ7CisJc3RydWN0IHdwYWJ1ZiAqdGZzX3JlcSA9IE5VTEw7CisKKwlpZiAob3Nfc3RybmNtcChjbWQsICJlbnRlciIsIDUpID09IDApCisJCWVudGVyID0gMTsKKwllbHNlIGlmIChvc19zdHJuY21wKGNtZCwgImV4aXQiLCA0KSA9PSAwKQorCQllbnRlciA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlwb3MgPSBvc19zdHJzdHIoY21kLCAiIGludGVydmFsPSIpOworCWlmIChwb3MpCisJCWludHZhbCA9IGF0b2kocG9zICsgMTApOworCisJcG9zID0gb3Nfc3Ryc3RyKGNtZCwgIiB0ZnNfcmVxPSIpOworCWlmIChwb3MpIHsKKwkJY2hhciAqZW5kOworCQlzaXplX3QgbGVuOworCQlwb3MgKz0gOTsKKwkJZW5kID0gb3Nfc3RyY2hyKHBvcywgJyAnKTsKKwkJaWYgKGVuZCkKKwkJCWxlbiA9IGVuZCAtIHBvczsKKwkJZWxzZQorCQkJbGVuID0gb3Nfc3RybGVuKHBvcyk7CisJCWlmIChsZW4gJiAxKQorCQkJcmV0dXJuIC0xOworCQlsZW4gLz0gMjsKKwkJdGZzX3JlcSA9IHdwYWJ1Zl9hbGxvYyhsZW4pOworCQlpZiAodGZzX3JlcSA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQodGZzX3JlcSwgbGVuKSwgbGVuKSA8IDApIHsKKwkJCXdwYWJ1Zl9mcmVlKHRmc19yZXEpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0ID0gaWVlZTgwMl8xMV9zZW5kX3dubXNsZWVwX3JlcSh3cGFfcywgZW50ZXIgPyBXTk1fU0xFRVBfTU9ERV9FTlRFUiA6CisJCQkJCSAgIFdOTV9TTEVFUF9NT0RFX0VYSVQsIGludHZhbCwKKwkJCQkJICAgdGZzX3JlcSk7CisJd3BhYnVmX2ZyZWUodGZzX3JlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLworCisKIHN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfc2lnbmFsX3BvbGwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqYnVmLAogCQkJCSAgICAgIHNpemVfdCBidWZsZW4pCiB7CkBAIC00MzkyLDcgKzQ4MDAsOSBAQAogCWludCByZXBseV9sZW47CiAKIAlpZiAob3Nfc3RybmNtcChidWYsIFdQQV9DVFJMX1JTUCwgb3Nfc3RybGVuKFdQQV9DVFJMX1JTUCkpID09IDAgfHwKLQkgICAgb3Nfc3RybmNtcChidWYsICJTRVRfTkVUV09SSyAiLCAxMikgPT0gMCkgeworCSAgICBvc19zdHJuY21wKGJ1ZiwgIlNFVF9ORVRXT1JLICIsIDEyKSA9PSAwIHx8CisJICAgIG9zX3N0cm5jbXAoYnVmLCAiV1BTX05GQ19UQUdfUkVBRCIsIDE2KSA9PSAwIHx8CisJICAgIG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JYX0hBTkRPVkVSX1NFTCIsIDE5KSA9PSAwKSB7CiAJCXdwYV9oZXhkdW1wX2FzY2lpX2tleShNU0dfREVCVUcsICJSWCBjdHJsX2lmYWNlIiwKIAkJCQkgICAgICAoY29uc3QgdTggKikgYnVmLCBvc19zdHJsZW4oYnVmKSk7CiAJfSBlbHNlIHsKQEAgLTQ0NTIsMjUgKzQ4NjIsMTUgQEAKIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJMT0dPRkYiKSA9PSAwKSB7CiAJCWVhcG9sX3NtX25vdGlmeV9sb2dvZmYod3BhX3MtPmVhcG9sLCBUUlVFKTsKIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJSRUFTU09DSUFURSIpID09IDApIHsKLQkJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7Ci0JCXdwYV9zdXBwbGljYW50X3JlaW5pdF9hdXRvc2Nhbih3cGFfcyk7CiAJCWlmICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9JTlRFUkZBQ0VfRElTQUJMRUQpCiAJCQlyZXBseV9sZW4gPSAtMTsKLQkJZWxzZSB7Ci0JCQl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMDsKLQkJCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7Ci0JCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7Ci0JCX0KKwkJZWxzZQorCQkJd3Bhc19yZXF1ZXN0X2Nvbm5lY3Rpb24od3BhX3MpOwogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlJFQ09OTkVDVCIpID09IDApIHsKLQkJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7Ci0JCXdwYV9zdXBwbGljYW50X3JlaW5pdF9hdXRvc2Nhbih3cGFfcyk7CiAJCWlmICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9JTlRFUkZBQ0VfRElTQUJMRUQpCiAJCQlyZXBseV9sZW4gPSAtMTsKLQkJZWxzZSBpZiAod3BhX3MtPmRpc2Nvbm5lY3RlZCkgewotCQkJd3BhX3MtPmRpc2Nvbm5lY3RlZCA9IDA7Ci0JCQl3cGFfcy0+cmVhc3NvY2lhdGUgPSAxOwotCQkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwotCQl9CisJCWVsc2UgaWYgKHdwYV9zLT5kaXNjb25uZWN0ZWQpCisJCQl3cGFzX3JlcXVlc3RfY29ubmVjdGlvbih3cGFfcyk7CiAjaWZkZWYgSUVFRTgwMjFYX0VBUE9MCiAJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlBSRUFVVEggIiwgOCkgPT0gMCkgewogCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9wcmVhdXRoKHdwYV9zLCBidWYgKyA4KSkKQEAgLTQ1MTEsMTEgKzQ5MTEsNiBAQAogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIldQU19DQU5DRUwiKSA9PSAwKSB7CiAJCWlmICh3cGFzX3dwc19jYW5jZWwod3BhX3MpKQogCQkJcmVwbHlfbGVuID0gLTE7Ci0jaWZkZWYgQ09ORklHX1dQU19PT0IKLQl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX09PQiAiLCA4KSA9PSAwKSB7Ci0JCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19vb2Iod3BhX3MsIGJ1ZiArIDgpKQotCQkJcmVwbHlfbGVuID0gLTE7Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIldQU19ORkMiKSA9PSAwKSB7CiAJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmMod3BhX3MsIE5VTEwpKQpAQCAtNDUzMCw2ICs0OTI1LDE4IEBACiAJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfdGFnX3JlYWQod3BhX3MsCiAJCQkJCQkJICAgICAgIGJ1ZiArIDE3KSkKIAkJCXJlcGx5X2xlbiA9IC0xOworCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJORkNfR0VUX0hBTkRPVkVSX1JFUSAiLCAyMSkgPT0gMCkgeworCQlyZXBseV9sZW4gPSB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9yZXEoCisJCQl3cGFfcywgYnVmICsgMjEsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwgIiwgMjEpID09IDApIHsKKwkJcmVwbHlfbGVuID0gd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfc2VsKAorCQkJd3BhX3MsIGJ1ZiArIDIxLCByZXBseSwgcmVwbHlfc2l6ZSk7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIk5GQ19SWF9IQU5ET1ZFUl9SRVEgIiwgMjApID09IDApIHsKKwkJcmVwbHlfbGVuID0gd3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9yZXEoCisJCQl3cGFfcywgYnVmICsgMjAsIHJlcGx5LCByZXBseV9zaXplKTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JYX0hBTkRPVkVSX1NFTCAiLCAyMCkgPT0gMCkgeworCQlpZiAod3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9zZWwod3BhX3MsIGJ1ZiArIDIwKSkKKwkJCXJlcGx5X2xlbiA9IC0xOwogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19SRUcgIiwgOCkgPT0gMCkgewogCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfcmVnKHdwYV9zLCBidWYgKyA4KSkKQEAgLTQ3NTgsMTggKzUxNjUsMTggQEAKIAkJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0lOVEVSRkFDRV9ESVNBQkxFRCkKIAkJCXJlcGx5X2xlbiA9IC0xOwogCQllbHNlIHsKLQkJCWlmICghd3BhX3MtPnNjYW5uaW5nICYmCisJCQlpZiAoIXdwYV9zLT5zY2hlZF9zY2FubmluZyAmJiAhd3BhX3MtPnNjYW5uaW5nICYmCiAJCQkgICAgKCh3cGFfcy0+d3BhX3N0YXRlIDw9IFdQQV9TQ0FOTklORykgfHwKIAkJCSAgICAgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0NPTVBMRVRFRCkpKSB7CiAJCQkJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7Ci0JCQkJd3BhX3MtPnNjYW5fcmVxID0gMjsKKwkJCQl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAJCQkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwogCQkJfSBlbHNlIGlmICh3cGFfcy0+c2NoZWRfc2Nhbm5pbmcpIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlN0b3Agb25nb2luZyAiCiAJCQkJCSAgICJzY2hlZF9zY2FuIHRvIGFsbG93IHJlcXVlc3RlZCAiCiAJCQkJCSAgICJmdWxsIHNjYW4gdG8gcHJvY2VlZCIpOwogCQkJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKLQkJCQl3cGFfcy0+c2Nhbl9yZXEgPSAyOworCQkJCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKIAkJCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CiAJCQl9IGVsc2UgewogCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiT25nb2luZyBzY2FuIGFjdGlvbiAtICIKQEAgLTQ5MDMsNyArNTMxMCwxMyBAQAogCQkJCQkJICAgICAgcmVwbHlfc2l6ZSk7CiAjZW5kaWYKIAl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJSRUFVVEhFTlRJQ0FURSIpID09IDApIHsKKwkJcG1rc2FfY2FjaGVfY2xlYXJfY3VycmVudCh3cGFfcy0+d3BhKTsKIAkJZWFwb2xfc21fcmVxdWVzdF9yZWF1dGgod3BhX3MtPmVhcG9sKTsKKyNpZmRlZiBDT05GSUdfV05NCisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldOTV9TTEVFUCAiLCAxMCkgPT0gMCkgeworCQlpZiAod3Bhc19jdHJsX2lmYWNlX3dubV9zbGVlcCh3cGFfcywgYnVmICsgMTApKQorCQkJcmVwbHlfbGVuID0gLTE7CisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogCX0gZWxzZSB7CiAJCW9zX21lbWNweShyZXBseSwgIlVOS05PV04gQ09NTUFORFxuIiwgMTYpOwogCQlyZXBseV9sZW4gPSAxNjsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2N0cmxfaWZhY2VfdW5peC5jIGIvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZV91bml4LmMKaW5kZXggODBkYjI3ZS4uNGRmYWJjOCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZV91bml4LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvY3RybF9pZmFjZV91bml4LmMKQEAgLTMyOSw2ICszMjksMjIgQEAKIAkJfQogCX0KIAorI2lmZGVmIEFORFJPSUQKKwkvKgorCSAqIHdwYV9zdXBwbGljYW50IGlzIHN0YXJ0ZWQgZnJvbSAvaW5pdC4qLnJjIG9uIEFuZHJvaWQgYW5kIHRoYXQgc2VlbXMKKwkgKiB0byBiZSB1c2luZyB1bWFzayAwMDc3IHdoaWNoIHdvdWxkIGxlYXZlIHRoZSBjb250cm9sIGludGVyZmFjZQorCSAqIGRpcmVjdG9yeSB3aXRob3V0IGdyb3VwIGFjY2Vzcy4gVGhpcyBicmVha3MgdGhpbmdzIHNpbmNlIFdpLUZpCisJICogZnJhbWV3b3JrIGFzc3VtZXMgdGhhdCB0aGlzIGRpcmVjdG9yeSBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIKKwkgKiBhcHBsaWNhdGlvbnMgaW4gdGhlIHdpZmkgZ3JvdXAuIEZpeCB0aGlzIGJ5IGFkZGluZyBncm91cCBhY2Nlc3MgZXZlbgorCSAqIGlmIHVtYXNrIHZhbHVlIHdvdWxkIHByZXZlbnQgdGhpcy4KKwkgKi8KKwlpZiAoY2htb2QoZGlyLCBTX0lSV1hVIHwgU19JUldYRykgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiQ1RSTDogQ291bGQgbm90IGNobW9kIGRpcmVjdG9yeTogJXMiLAorCQkJICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogVHJ5IHRvIGNvbnRpbnVlIGFueXdheSAqLworCX0KKyNlbmRpZiAvKiBBTkRST0lEICovCisKIAlpZiAoZ2lkX3N0cikgewogCQlncnAgPSBnZXRncm5hbShnaWRfc3RyKTsKIAkJaWYgKGdycCkgewpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5jIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5jCmluZGV4IDRlZWI5M2EuLjhiYzY2MTggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuYworKysgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3LmMKQEAgLTE5NTAsNiArMTk1MCwxMCBAQAogCSAgd3Bhc19kYnVzX2dldHRlcl9lYXBfbWV0aG9kcywKIAkgIE5VTEwKIAl9LAorCXsgIkNhcGFiaWxpdGllcyIsIFdQQVNfREJVU19ORVdfSU5URVJGQUNFLCAiYXMiLAorCSAgd3Bhc19kYnVzX2dldHRlcl9nbG9iYWxfY2FwYWJpbGl0aWVzLAorCSAgTlVMTAorCX0sCiAJeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KIH07CiAKQEAgLTIyMzIsNiArMjIzNiwxMCBAQAogCSAgd3Bhc19kYnVzX2dldHRlcl9ic3NfcnNuLAogCSAgTlVMTAogCX0sCisJeyAiV1BTIiwgV1BBU19EQlVTX05FV19JRkFDRV9CU1MsICJhe3N2fSIsCisJICB3cGFzX2RidXNfZ2V0dGVyX2Jzc193cHMsCisJICBOVUxMCisJfSwKIAl7ICJJRXMiLCBXUEFTX0RCVVNfTkVXX0lGQUNFX0JTUywgImF5IiwKIAkgIHdwYXNfZGJ1c19nZXR0ZXJfYnNzX2llcywKIAkgIE5VTEwKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuaCBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXcuaAppbmRleCA0NGNkZTQyLi4zNjNhN2U1IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3LmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ldy5oCkBAIC0zOSw2ICszOSw3IEBACiAJV1BBU19EQlVTX0JTU19QUk9QX1JBVEVTLAogCVdQQVNfREJVU19CU1NfUFJPUF9XUEEsCiAJV1BBU19EQlVTX0JTU19QUk9QX1JTTiwKKwlXUEFTX0RCVVNfQlNTX1BST1BfV1BTLAogCVdQQVNfREJVU19CU1NfUFJPUF9JRVMsCiB9OwogCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmMgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmMKaW5kZXggNTY2OGUxYS4uNWUwNjkzMiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVycy5jCisrKyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgIi4uL25vdGlmeS5oIgogI2luY2x1ZGUgIi4uL2Jzcy5oIgogI2luY2x1ZGUgIi4uL3NjYW4uaCIKLSNpbmNsdWRlICIuLi9jdHJsX2lmYWNlLmgiCiAjaW5jbHVkZSAiLi4vYXV0b3NjYW4uaCIKICNpbmNsdWRlICJkYnVzX25ld19oZWxwZXJzLmgiCiAjaW5jbHVkZSAiZGJ1c19uZXcuaCIKQEAgLTEyNCw3ICsxMjMsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmRvbnRfcXVvdGVbXSA9IHsKIAkia2V5X21nbXQiLCAicHJvdG8iLCAicGFpcndpc2UiLCAiYXV0aF9hbGciLCAiZ3JvdXAiLCAiZWFwIiwKIAkib3BlbnNjX2VuZ2luZV9wYXRoIiwgInBrY3MxMV9lbmdpbmVfcGF0aCIsICJwa2NzMTFfbW9kdWxlX3BhdGgiLAotCSJic3NpZCIsIE5VTEwKKwkiYnNzaWQiLCAic2Nhbl9mcmVxIiwgImZyZXFfbGlzdCIsIE5VTEwKIH07CiAKIHN0YXRpYyBkYnVzX2Jvb2xfdCBzaG91bGRfcXVvdGVfb3B0KGNvbnN0IGNoYXIgKmtleSkKQEAgLTkyNCw2ICs5MjMsNDQgQEAKIH0KIAogCisvKioKKyAqIHdwYXNfZGJ1c19nZXR0ZXJfZ2xvYmFsX2NhcGFiaWxpdGllcyAtIFJlcXVlc3Qgc3VwcG9ydGVkIGdsb2JhbCBjYXBhYmlsaXRpZXMKKyAqIEBpdGVyOiBQb2ludGVyIHRvIGluY29taW5nIGRidXMgbWVzc2FnZSBpdGVyCisgKiBAZXJyb3I6IExvY2F0aW9uIHRvIHN0b3JlIGVycm9yIG9uIGZhaWx1cmUKKyAqIEB1c2VyX2RhdGE6IEZ1bmN0aW9uIHNwZWNpZmljIGRhdGEKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQorICoKKyAqIEdldHRlciBmb3IgIkNhcGFiaWxpdGllcyIgcHJvcGVydHkuIEhhbmRsZXMgcmVxdWVzdHMgYnkgZGJ1cyBjbGllbnRzIHRvCisgKiByZXR1cm4gYSBsaXN0IG9mIHN0cmluZ3Mgd2l0aCBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIGxpa2UgQVAsIFJTTiBJQlNTLAorICogYW5kIFAyUCB0aGF0IGFyZSBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS4KKyAqLworZGJ1c19ib29sX3Qgd3Bhc19kYnVzX2dldHRlcl9nbG9iYWxfY2FwYWJpbGl0aWVzKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKwkJCQkJICAgICAgICAgREJ1c0Vycm9yICplcnJvciwKKwkJCQkJICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworCWNvbnN0IGNoYXIgKmNhcGFiaWxpdGllc1s1XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworCXNpemVfdCBudW1faXRlbXMgPSAwOworCisjaWZkZWYgQ09ORklHX0FQCisJY2FwYWJpbGl0aWVzW251bV9pdGVtcysrXSA9ICJhcCI7CisjZW5kaWYgLyogQ09ORklHX0FQICovCisjaWZkZWYgQ09ORklHX0lCU1NfUlNOCisJY2FwYWJpbGl0aWVzW251bV9pdGVtcysrXSA9ICJpYnNzLXJzbiI7CisjZW5kaWYgLyogQ09ORklHX0lCU1NfUlNOICovCisjaWZkZWYgQ09ORklHX1AyUAorCWNhcGFiaWxpdGllc1tudW1faXRlbXMrK10gPSAicDJwIjsKKyNlbmRpZiAvKiBDT05GSUdfUDJQICovCisjaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORworCWNhcGFiaWxpdGllc1tudW1faXRlbXMrK10gPSAiaW50ZXJ3b3JraW5nIjsKKyNlbmRpZiAvKiBDT05GSUdfSU5URVJXT1JLSU5HICovCisKKwlyZXR1cm4gd3Bhc19kYnVzX3NpbXBsZV9hcnJheV9wcm9wZXJ0eV9nZXR0ZXIoaXRlciwKKwkJCQkJCSAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisJCQkJCQkgICAgICBjYXBhYmlsaXRpZXMsCisJCQkJCQkgICAgICBudW1faXRlbXMsIGVycm9yKTsKK30KKworCiBzdGF0aWMgaW50IHdwYXNfZGJ1c19nZXRfc2Nhbl90eXBlKERCdXNNZXNzYWdlICptZXNzYWdlLCBEQnVzTWVzc2FnZUl0ZXIgKnZhciwKIAkJCQkgICBjaGFyICoqdHlwZSwgREJ1c01lc3NhZ2UgKipyZXBseSkKIHsKQEAgLTEyNzUsNyArMTMxMiw3IEBACiAJCX0gZWxzZSBpZiAocGFyYW1zLmZyZXFzICYmIHBhcmFtcy5mcmVxc1swXSkgewogCQkJd3BhX3N1cHBsaWNhbnRfdHJpZ2dlcl9zY2FuKHdwYV9zLCAmcGFyYW1zKTsKIAkJfSBlbHNlIHsKLQkJCXdwYV9zLT5zY2FuX3JlcSA9IDI7CisJCQl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAJCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CiAJCX0KIAl9IGVsc2UgaWYgKCFvc19zdHJjbXAodHlwZSwgImFjdGl2ZSIpKSB7CkBAIC0xNDE3LDEyICsxNDU0LDcgQEAKIAkJCQkJICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJaWYgKHdwYV9zLT5jdXJyZW50X3NzaWQgIT0gTlVMTCkgewotCQl3cGFfcy0+bm9ybWFsX3NjYW5zID0gMDsKLQkJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKLQkJd3BhX3MtPmRpc2Nvbm5lY3RlZCA9IDA7Ci0JCXdwYV9zLT5yZWFzc29jaWF0ZSA9IDE7Ci0JCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKLQorCQl3cGFzX3JlcXVlc3RfY29ubmVjdGlvbih3cGFfcyk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTQ1NCwxMyArMTQ4NiwxNSBAQAogCS8qIEV4dHJhY3QgdGhlIG5ldHdvcmsgSUQgYW5kIGVuc3VyZSB0aGUgbmV0d29yayAqLwogCS8qIGlzIGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBpbnRlcmZhY2UgKi8KIAlpZmFjZSA9IHdwYXNfZGJ1c19uZXdfZGVjb21wb3NlX29iamVjdF9wYXRoKG9wLCAwLCAmbmV0X2lkLCBOVUxMKTsKLQlpZiAoaWZhY2UgPT0gTlVMTCB8fCBvc19zdHJjbXAoaWZhY2UsIHdwYV9zLT5kYnVzX25ld19wYXRoKSAhPSAwKSB7CisJaWYgKGlmYWNlID09IE5VTEwgfHwgbmV0X2lkID09IE5VTEwgfHwKKwkgICAgb3Nfc3RyY21wKGlmYWNlLCB3cGFfcy0+ZGJ1c19uZXdfcGF0aCkgIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgb3ApOwogCQlnb3RvIG91dDsKIAl9CiAKKwllcnJubyA9IDA7CiAJaWQgPSBzdHJ0b3VsKG5ldF9pZCwgTlVMTCwgMTApOwotCWlmIChlcnJubyA9PSBFSU5WQUwpIHsKKwlpZiAoZXJybm8gIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgb3ApOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNTA5LDcgKzE1NDMsOCBAQAogCX0KIAogCWlmIChzc2lkID09IHdwYV9zLT5jdXJyZW50X3NzaWQpCi0JCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSh3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywKKwkJCQkJICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogfQogCiAKQEAgLTE1NTMsMTMgKzE1ODgsMTUgQEAKIAkvKiBFeHRyYWN0IHRoZSBuZXR3b3JrIElEIGFuZCBlbnN1cmUgdGhlIG5ldHdvcmsgKi8KIAkvKiBpcyBhY3R1YWxseSBhIGNoaWxkIG9mIHRoaXMgaW50ZXJmYWNlICovCiAJaWZhY2UgPSB3cGFzX2RidXNfbmV3X2RlY29tcG9zZV9vYmplY3RfcGF0aChvcCwgMCwgJm5ldF9pZCwgTlVMTCk7Ci0JaWYgKGlmYWNlID09IE5VTEwgfHwgb3Nfc3RyY21wKGlmYWNlLCB3cGFfcy0+ZGJ1c19uZXdfcGF0aCkgIT0gMCkgeworCWlmIChpZmFjZSA9PSBOVUxMIHx8IG5ldF9pZCA9PSBOVUxMIHx8CisJICAgIG9zX3N0cmNtcChpZmFjZSwgd3BhX3MtPmRidXNfbmV3X3BhdGgpICE9IDApIHsKIAkJcmVwbHkgPSB3cGFzX2RidXNfZXJyb3JfaW52YWxpZF9hcmdzKG1lc3NhZ2UsIG9wKTsKIAkJZ290byBvdXQ7CiAJfQogCisJZXJybm8gPSAwOwogCWlkID0gc3RydG91bChuZXRfaWQsIE5VTEwsIDEwKTsKLQlpZiAoZXJybm8gPT0gRUlOVkFMKSB7CisJaWYgKGVycm5vICE9IDApIHsKIAkJcmVwbHkgPSB3cGFzX2RidXNfZXJyb3JfaW52YWxpZF9hcmdzKG1lc3NhZ2UsIG9wKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTYwOCwxMyArMTY0NSwxNSBAQAogCS8qIEV4dHJhY3QgdGhlIG5ldHdvcmsgSUQgYW5kIGVuc3VyZSB0aGUgbmV0d29yayAqLwogCS8qIGlzIGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBpbnRlcmZhY2UgKi8KIAlpZmFjZSA9IHdwYXNfZGJ1c19uZXdfZGVjb21wb3NlX29iamVjdF9wYXRoKG9wLCAwLCAmbmV0X2lkLCBOVUxMKTsKLQlpZiAoaWZhY2UgPT0gTlVMTCB8fCBvc19zdHJjbXAoaWZhY2UsIHdwYV9zLT5kYnVzX25ld19wYXRoKSAhPSAwKSB7CisJaWYgKGlmYWNlID09IE5VTEwgfHwgbmV0X2lkID09IE5VTEwgfHwKKwkgICAgb3Nfc3RyY21wKGlmYWNlLCB3cGFfcy0+ZGJ1c19uZXdfcGF0aCkgIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgb3ApOwogCQlnb3RvIG91dDsKIAl9CiAKKwllcnJubyA9IDA7CiAJaWQgPSBzdHJ0b3VsKG5ldF9pZCwgTlVMTCwgMTApOwotCWlmIChlcnJubyA9PSBFSU5WQUwpIHsKKwlpZiAoZXJybm8gIT0gMCkgewogCQlyZXBseSA9IHdwYXNfZGJ1c19lcnJvcl9pbnZhbGlkX2FyZ3MobWVzc2FnZSwgbmV0X2lkKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzM2Niw2ICszNDA1LDYzIEBACiAKIAogLyoqCisgKiB3cGFzX2RidXNfZ2V0dGVyX2Jzc193cHMgLSBSZXR1cm4gdGhlIFdQUyBvcHRpb25zIG9mIGEgQlNTCisgKiBAaXRlcjogUG9pbnRlciB0byBpbmNvbWluZyBkYnVzIG1lc3NhZ2UgaXRlcgorICogQGVycm9yOiBMb2NhdGlvbiB0byBzdG9yZSBlcnJvciBvbiBmYWlsdXJlCisgKiBAdXNlcl9kYXRhOiBGdW5jdGlvbiBzcGVjaWZpYyBkYXRhCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUKKyAqCisgKiBHZXR0ZXIgZm9yICJXUFMiIHByb3BlcnR5LgorICovCitkYnVzX2Jvb2xfdCB3cGFzX2RidXNfZ2V0dGVyX2Jzc193cHMoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBEQnVzRXJyb3IgKmVycm9yLAorCQkJCSAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworCXN0cnVjdCBic3NfaGFuZGxlcl9hcmdzICphcmdzID0gdXNlcl9kYXRhOworCXN0cnVjdCB3cGFfYnNzICpyZXM7CisjaWZkZWYgQ09ORklHX1dQUworCXN0cnVjdCB3cGFidWYgKndwc19pZTsKKyNlbmRpZiAvKiBDT05GSUdfV1BTICovCisJREJ1c01lc3NhZ2VJdGVyIGl0ZXJfZGljdCwgdmFyaWFudF9pdGVyOworCWNvbnN0IGNoYXIgKnR5cGUgPSAiIjsKKworCXJlcyA9IGdldF9ic3NfaGVscGVyKGFyZ3MsIGVycm9yLCBfX2Z1bmNfXyk7CisJaWYgKCFyZXMpCisJCXJldHVybiBGQUxTRTsKKworCWlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIoaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisJCQkJCSAgICAgICJhe3N2fSIsICZ2YXJpYW50X2l0ZXIpKQorCQlnb3RvIG5vbWVtOworCisJaWYgKCF3cGFfZGJ1c19kaWN0X29wZW5fd3JpdGUoJnZhcmlhbnRfaXRlciwgJml0ZXJfZGljdCkpCisJCWdvdG8gbm9tZW07CisKKyNpZmRlZiBDT05GSUdfV1BTCisJd3BzX2llID0gd3BhX2Jzc19nZXRfdmVuZG9yX2llX211bHRpKHJlcywgV1BTX0lFX1ZFTkRPUl9UWVBFKTsKKwlpZiAod3BzX2llKSB7CisJCWlmICh3cHNfaXNfc2VsZWN0ZWRfcGJjX3JlZ2lzdHJhcih3cHNfaWUpKQorCQkJdHlwZSA9ICJwYmMiOworCQllbHNlIGlmICh3cHNfaXNfc2VsZWN0ZWRfcGluX3JlZ2lzdHJhcih3cHNfaWUpKQorCQkJdHlwZSA9ICJwaW4iOworCX0KKyNlbmRpZiAvKiBDT05GSUdfV1BTICovCisKKwlpZiAoIXdwYV9kYnVzX2RpY3RfYXBwZW5kX3N0cmluZygmaXRlcl9kaWN0LCAiVHlwZSIsIHR5cGUpKQorCQlnb3RvIG5vbWVtOworCisJaWYgKCF3cGFfZGJ1c19kaWN0X2Nsb3NlX3dyaXRlKCZ2YXJpYW50X2l0ZXIsICZpdGVyX2RpY3QpKQorCQlnb3RvIG5vbWVtOworCWlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKGl0ZXIsICZ2YXJpYW50X2l0ZXIpKQorCQlnb3RvIG5vbWVtOworCisJcmV0dXJuIFRSVUU7CisKK25vbWVtOgorCWRidXNfc2V0X2Vycm9yX2NvbnN0KGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgIm5vIG1lbW9yeSIpOworCXJldHVybiBGQUxTRTsKK30KKworCisvKioKICAqIHdwYXNfZGJ1c19nZXR0ZXJfYnNzX2llcyAtIFJldHVybiBhbGwgSUVzIG9mIGEgQlNTCiAgKiBAaXRlcjogUG9pbnRlciB0byBpbmNvbWluZyBkYnVzIG1lc3NhZ2UgaXRlcgogICogQGVycm9yOiBMb2NhdGlvbiB0byBzdG9yZSBlcnJvciBvbiBmYWlsdXJlCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmggYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzLmgKaW5kZXggMTc4YTc2Yi4uYWE1NjU1MCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVycy5oCisrKyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnMuaApAQCAtODAsNiArODAsMTAgQEAKIGRidXNfYm9vbF90IHdwYXNfZGJ1c19nZXR0ZXJfZWFwX21ldGhvZHMoREJ1c01lc3NhZ2VJdGVyICppdGVyLAogCQkJCQkgREJ1c0Vycm9yICplcnJvciwgdm9pZCAqdXNlcl9kYXRhKTsKIAorZGJ1c19ib29sX3Qgd3Bhc19kYnVzX2dldHRlcl9nbG9iYWxfY2FwYWJpbGl0aWVzKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKwkJCQkJCSBEQnVzRXJyb3IgKmVycm9yLAorCQkJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKIERCdXNNZXNzYWdlICogd3Bhc19kYnVzX2hhbmRsZXJfc2NhbihEQnVzTWVzc2FnZSAqbWVzc2FnZSwKIAkJCQkgICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogCkBAIC0yMzgsNiArMjQyLDkgQEAKIGRidXNfYm9vbF90IHdwYXNfZGJ1c19nZXR0ZXJfYnNzX3JzbihEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIERCdXNFcnJvciAqZXJyb3IsCiAJCQkJICAgICB2b2lkICp1c2VyX2RhdGEpOwogCitkYnVzX2Jvb2xfdCB3cGFzX2RidXNfZ2V0dGVyX2Jzc193cHMoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBEQnVzRXJyb3IgKmVycm9yLAorCQkJCSAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKwogZGJ1c19ib29sX3Qgd3Bhc19kYnVzX2dldHRlcl9ic3NfaWVzKERCdXNNZXNzYWdlSXRlciAqaXRlciwgREJ1c0Vycm9yICplcnJvciwKIAkJCQkgICAgIHZvaWQgKnVzZXJfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnNfd3BzLmMgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfbmV3X2hhbmRsZXJzX3dwcy5jCmluZGV4IDg0ODljZTcuLjRhZDVlN2UgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19uZXdfaGFuZGxlcnNfd3BzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX25ld19oYW5kbGVyc193cHMuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQlyZXQgPSB3cGFfc3VwcGxpY2FudF9hcF93cHNfcGluKHdwYV9zLAogCQkJCQkJCXBhcmFtcy5ic3NpZCwKIAkJCQkJCQlwYXJhbXMucGluLAotCQkJCQkJCW5waW4sIHNpemVvZihucGluKSk7CisJCQkJCQkJbnBpbiwgc2l6ZW9mKG5waW4pLCAwKTsKIAkJZWxzZQogI2VuZGlmIC8qIENPTkZJR19BUCAqLwogCQl7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfb2xkX2hhbmRsZXJzLmMgYi93cGFfc3VwcGxpY2FudC9kYnVzL2RidXNfb2xkX2hhbmRsZXJzLmMKaW5kZXggZTIxN2E3Mi4uNjhlNTUxNSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZGJ1cy9kYnVzX29sZF9oYW5kbGVycy5jCisrKyBiL3dwYV9zdXBwbGljYW50L2RidXMvZGJ1c19vbGRfaGFuZGxlcnMuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiBEQnVzTWVzc2FnZSAqIHdwYXNfZGJ1c19pZmFjZV9zY2FuKERCdXNNZXNzYWdlICptZXNzYWdlLAogCQkJCSAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7Ci0Jd3BhX3MtPnNjYW5fcmVxID0gMjsKKwl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CiAJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwogCXJldHVybiB3cGFzX2RidXNfbmV3X3N1Y2Nlc3NfcmVwbHkobWVzc2FnZSk7CiB9CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9kcml2ZXJfaS5oIGIvd3BhX3N1cHBsaWNhbnQvZHJpdmVyX2kuaAppbmRleCBiYzE0OGNhLi42YmFiMTljIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9kcml2ZXJfaS5oCisrKyBiL3dwYV9zdXBwbGljYW50L2RyaXZlcl9pLmgKQEAgLTEzOSwxNiArMTM5LDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHdwYV9kcnZfZGlzYXNzb2NpYXRlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCQkJICAgICAgIGNvbnN0IHU4ICphZGRyLCBpbnQgcmVhc29uX2NvZGUpCi17Ci0JaWYgKHdwYV9zLT5kcml2ZXItPmRpc2Fzc29jaWF0ZSkgewotCQlyZXR1cm4gd3BhX3MtPmRyaXZlci0+ZGlzYXNzb2NpYXRlKHdwYV9zLT5kcnZfcHJpdiwgYWRkciwKLQkJCQkJCSAgIHJlYXNvbl9jb2RlKTsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB3cGFfZHJ2X2FkZF9wbWtpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwbWtpZCkKIHsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2VhcG9sX3Rlc3QuYyBiL3dwYV9zdXBwbGljYW50L2VhcG9sX3Rlc3QuYwppbmRleCAwM2I4YzdlLi44N2UzOTljIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9lYXBvbF90ZXN0LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZWFwb2xfdGVzdC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiZWxvb3AuaCIKICNpbmNsdWRlICJ1dGlscy9iYXNlNjQuaCIKICNpbmNsdWRlICJyc25fc3VwcC93cGEuaCIKLSNpbmNsdWRlICJlYXBfcGVlci9lYXBfaS5oIgogI2luY2x1ZGUgIndwYV9zdXBwbGljYW50X2kuaCIKICNpbmNsdWRlICJyYWRpdXMvcmFkaXVzLmgiCiAjaW5jbHVkZSAicmFkaXVzL3JhZGl1c19jbGllbnQuaCIKQEAgLTk4LDcgKzk3LDcgQEAKIAlzaXplX3QgbGVuOwogCWNoYXIgKnBvczsKIAl1MzIgdmFsOwotCWNoYXIgYnVmWzEyOF07CisJY2hhciBidWZbUkFESVVTX01BWF9BVFRSX0xFTiArIDFdOwogCiAJc3dpdGNoIChhdHRyLT5zeW50YXgpIHsKIAljYXNlICdzJzoKQEAgLTExNCw3ICsxMTMsNyBAQAogCQlpZiAocG9zWzBdID09ICcwJyAmJiBwb3NbMV0gPT0gJ3gnKQogCQkJcG9zICs9IDI7CiAJCWxlbiA9IG9zX3N0cmxlbihwb3MpOwotCQlpZiAoKGxlbiAmIDEpIHx8IChsZW4gLyAyKSA+IHNpemVvZihidWYpKSB7CisJCWlmICgobGVuICYgMSkgfHwgKGxlbiAvIDIpID4gUkFESVVTX01BWF9BVFRSX0xFTikgewogCQkJcHJpbnRmKCJJbnZhbGlkIGV4dHJhIGF0dHJpYnV0ZSBoZXhzdHJpbmdcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xNzEsNyArMTcwLDcgQEAKIAkJCQkJICBjb25zdCB1OCAqZWFwLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCByYWRpdXNfbXNnICptc2c7Ci0JY2hhciBidWZbMTI4XTsKKwljaGFyIGJ1ZltSQURJVVNfTUFYX0FUVFJfTEVOICsgMV07CiAJY29uc3Qgc3RydWN0IGVhcF9oZHIgKmhkcjsKIAljb25zdCB1OCAqcG9zOwogCkBAIC0xMTczLDcgKzExNzIsNyBAQAogCQkJd2FpdF9mb3JfbW9uaXRvcisrOwogCQkJYnJlYWs7CiAJCWNhc2UgJ04nOgotCQkJcDEgPSBvc196YWxsb2Moc2l6ZW9mKHAxKSk7CisJCQlwMSA9IG9zX3phbGxvYyhzaXplb2YoKnAxKSk7CiAJCQlpZiAocDEgPT0gTlVMTCkKIAkJCQlicmVhazsKIAkJCWlmICghcCkKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2V2ZW50cy5jIGIvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKaW5kZXggNGIxZDk5Mi4uM2ZlZmI0OCAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvZXZlbnRzLmMKQEAgLTg0LDYgKzg0LDEyIEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlpZiAoZGlzYWxsb3dlZF9ic3NpZCh3cGFfcywgd3BhX3MtPmJzc2lkKSB8fAorCSAgICBkaXNhbGxvd2VkX3NzaWQod3BhX3MsIHNzaWQtPnNzaWQsIHNzaWQtPnNzaWRfbGVuKSkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTZWxlY3RlZCBCU1MgaXMgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCiAJcmVzID0gd3Bhc190ZW1wX2Rpc2FibGVkKHdwYV9zLCBzc2lkKTsKIAlpZiAocmVzID4gMCkgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTZWxlY3RlZCBuZXR3b3JrIGlzIHRlbXBvcmFyaWx5ICIKQEAgLTk2LDggKzEwMiw5IEBACiAJaWYgKHdwYV9rZXlfbWdtdF93cGFfYW55KHNzaWQtPmtleV9tZ210KSkgewogCQl1OCB3cGFfaWVbODBdOwogCQlzaXplX3Qgd3BhX2llX2xlbiA9IHNpemVvZih3cGFfaWUpOwotCQl3cGFfc3VwcGxpY2FudF9zZXRfc3VpdGVzKHdwYV9zLCBOVUxMLCBzc2lkLAotCQkJCQkgIHdwYV9pZSwgJndwYV9pZV9sZW4pOworCQlpZiAod3BhX3N1cHBsaWNhbnRfc2V0X3N1aXRlcyh3cGFfcywgTlVMTCwgc3NpZCwKKwkJCQkJICAgICAgd3BhX2llLCAmd3BhX2llX2xlbikgPCAwKQorCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiQ291bGQgbm90IHNldCBXUEEgc3VpdGVzIik7CiAJfSBlbHNlIHsKIAkJd3BhX3N1cHBsaWNhbnRfc2V0X25vbl93cGFfcG9saWN5KHdwYV9zLCBzc2lkKTsKIAl9CkBAIC00MjMsNyArNDMwLDkgQEAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCiAJCWlmICghKGllLmNhcGFiaWxpdGllcyAmIFdQQV9DQVBBQklMSVRZX01GUEMpICYmCi0JCSAgICBzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9SRVFVSVJFRCkgeworCQkgICAgKHNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgPworCQkgICAgIHdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3KSA9PQorCQkgICAgTUdNVF9GUkFNRV9QUk9URUNUSU9OX1JFUVVJUkVEKSB7CiAJCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICIgICBza2lwIFJTTiBJRSAtIG5vIG1nbXQgIgogCQkJCSJmcmFtZSBwcm90ZWN0aW9uIik7CiAJCQlicmVhazsKQEAgLTY3NSw2ICs2ODQsMTYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJaWYgKGRpc2FsbG93ZWRfYnNzaWQod3BhX3MsIGJzcy0+YnNzaWQpKSB7CisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIiAgIHNraXAgLSBCU1NJRCBkaXNhbGxvd2VkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkaXNhbGxvd2VkX3NzaWQod3BhX3MsIGJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbikpIHsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiICAgc2tpcCAtIFNTSUQgZGlzYWxsb3dlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAl3cGEgPSB3cGFfaWVfbGVuID4gMCB8fCByc25faWVfbGVuID4gMDsKIAogCWZvciAoc3NpZCA9IGdyb3VwOyBzc2lkOyBzc2lkID0gc3NpZC0+cG5leHQpIHsKQEAgLTg2Miw2ICs4ODEsOCBAQAogI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KIAkJcmV0dXJuOwogCX0KKworCXdwYV9zLT5zY2FuX2Zvcl9jb25uZWN0aW9uID0gMTsKIAl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgdGltZW91dF9zZWMsIHRpbWVvdXRfdXNlYyk7CiB9CiAKQEAgLTEwMTIsNiArMTAzMywxMiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgMCAmJiBjdXJyZW50X2Jzcy0+bGV2ZWwgPiBzZWxlY3RlZC0+bGV2ZWwpIHsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU2tpcCByb2FtIC0gQ3VycmVudCBCU1MgaGFzIGJldHRlciAiCisJCQkic2lnbmFsIGxldmVsIik7CisJCXJldHVybiAwOworCX0KKwogCW1pbl9kaWZmID0gMjsKIAlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgMCkgewogCQlpZiAoY3VycmVudF9ic3MtPmxldmVsIDwgLTg1KQpAQCAtMTMyOSwxMiArMTM1NiwxNiBAQAogCWlmICh3cGFfcy0+d3BhX3N0YXRlIDwgV1BBX0FTU09DSUFURUQpCiAJCXJldHVybjsKIAotCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBTZW5kIGtlZXAtYWxpdmUgdG8gQVAgIiBNQUNTVFIsCi0JCSAgIE1BQzJTVFIod3BhX3MtPmJzc2lkKSk7Ci0JLyogVE9ETzogY291bGQgc2tpcCB0aGlzIGlmIG5vcm1hbCBkYXRhIHRyYWZmaWMgaGFzIGJlZW4gc2VudCAqLwotCS8qIFRPRE86IENvbnNpZGVyIHVzaW5nIHNvbWUgbW9yZSBhcHByb3ByaWF0ZSBkYXRhIGZyYW1lIGZvciB0aGlzICovCi0JaWYgKHdwYV9zLT5sMikKLQkJbDJfcGFja2V0X3NlbmQod3BhX3MtPmwyLCB3cGFfcy0+YnNzaWQsIDB4MDgwMCwgKHU4ICopICIiLCAwKTsKKwlpZiAoIXdwYV9zLT5ub19rZWVwX2FsaXZlKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBTZW5kIGtlZXAtYWxpdmUgdG8gQVAgIiBNQUNTVFIsCisJCQkgICBNQUMyU1RSKHdwYV9zLT5ic3NpZCkpOworCQkvKiBUT0RPOiBjb3VsZCBza2lwIHRoaXMgaWYgbm9ybWFsIGRhdGEgdHJhZmZpYyBoYXMgYmVlbiBzZW50ICovCisJCS8qIFRPRE86IENvbnNpZGVyIHVzaW5nIHNvbWUgbW9yZSBhcHByb3ByaWF0ZSBkYXRhIGZyYW1lIGZvcgorCQkgKiB0aGlzICovCisJCWlmICh3cGFfcy0+bDIpCisJCQlsMl9wYWNrZXRfc2VuZCh3cGFfcy0+bDIsIHdwYV9zLT5ic3NpZCwgMHgwODAwLAorCQkJCSAgICAgICAodTggKikgIiIsIDApOworCX0KIAogI2lmZGVmIENPTkZJR19TTUUKIAlpZiAod3BhX3MtPnNtZS5ic3NfbWF4X2lkbGVfcGVyaW9kKSB7CkBAIC0xNjMyLDcgKzE2NjMsNyBAQAogCiAJaWYgKHdwYV9kcnZfZ2V0X2Jzc2lkKHdwYV9zLCBic3NpZCkgPCAwKSB7CiAJCXdwYV9kYmcod3BhX3MsIE1TR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgQlNTSUQiKTsKLQkJd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKAorCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSgKIAkJCXdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCXJldHVybjsKIAl9CkBAIC0xNjUwLDcgKzE2ODEsNyBAQAogCQkJd3BhX2NsZWFyX2tleXMod3BhX3MsIGJzc2lkKTsKIAkJfQogCQlpZiAod3BhX3N1cHBsaWNhbnRfc2VsZWN0X2NvbmZpZyh3cGFfcykgPCAwKSB7Ci0JCQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoCisJCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSgKIAkJCQl3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xNzUyLDYgKzE3ODMsOCBAQAogCQllYXBvbF9zbV9ub3RpZnlfZWFwX3N1Y2Nlc3Mod3BhX3MtPmVhcG9sLCBUUlVFKTsKIAl9CiAKKwl3cGFfcy0+bGFzdF9lYXBvbF9tYXRjaGVzX2Jzc2lkID0gMDsKKwogCWlmICh3cGFfcy0+cGVuZGluZ19lYXBvbF9yeCkgewogCQlzdHJ1Y3Qgb3NfdGltZSBub3csIGFnZTsKIAkJb3NfZ2V0X3RpbWUoJm5vdyk7CkBAIC0xODM4LDYgKzE4NzEsMjggQEAKIH0KIAogCitzdGF0aWMgaW50IGNvdWxkX2JlX3Bza19taXNtYXRjaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1MTYgcmVhc29uX2NvZGUsCisJCQkJIGludCBsb2NhbGx5X2dlbmVyYXRlZCkKK3sKKwlpZiAod3BhX3MtPndwYV9zdGF0ZSAhPSBXUEFfNFdBWV9IQU5EU0hBS0UgfHwKKwkgICAgIXdwYV9rZXlfbWdtdF93cGFfcHNrKHdwYV9zLT5rZXlfbWdtdCkpCisJCXJldHVybiAwOyAvKiBOb3QgaW4gNC13YXkgaGFuZHNoYWtlIHdpdGggUFNLICovCisKKwkvKgorCSAqIEl0IGxvb2tzIGxpa2UgY29ubmVjdGlvbiB3YXMgbG9zdCB3aGlsZSB0cnlpbmcgdG8gZ28gdGhyb3VnaCBQU0sKKwkgKiA0LXdheSBoYW5kc2hha2UuIEZpbHRlciBvdXQga25vd24gZGlzY29ubmVjdGlvbiBjYXNlcyB0aGF0IGFyZSBjYXVzZWQKKwkgKiBieSBzb21ldGhpbmcgZWxzZSB0aGFuIFBTSyBtaXNtYXRjaCB0byBhdm9pZCBjb25mdXNpbmcgcmVwb3J0cy4KKwkgKi8KKworCWlmIChsb2NhbGx5X2dlbmVyYXRlZCkgeworCQlpZiAocmVhc29uX2NvZGUgPT0gV0xBTl9SRUFTT05fSUVfSU5fNFdBWV9ESUZGRVJTKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKwogc3RhdGljIHZvaWQgd3BhX3N1cHBsaWNhbnRfZXZlbnRfZGlzYXNzb2NfZmluaXNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCQkgdTE2IHJlYXNvbl9jb2RlLAogCQkJCQkJIGludCBsb2NhbGx5X2dlbmVyYXRlZCkKQEAgLTE4NjMsOCArMTkxOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfNFdBWV9IQU5EU0hBS0UgJiYKLQkgICAgd3BhX2tleV9tZ210X3dwYV9wc2sod3BhX3MtPmtleV9tZ210KSkgeworCWlmIChjb3VsZF9iZV9wc2tfbWlzbWF0Y2god3BhX3MsIHJlYXNvbl9jb2RlLCBsb2NhbGx5X2dlbmVyYXRlZCkpIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sICJXUEE6IDQtV2F5IEhhbmRzaGFrZSBmYWlsZWQgLSAiCiAJCQkicHJlLXNoYXJlZCBrZXkgbWF5IGJlIGluY29ycmVjdCIpOwogCQl3cGFzX2F1dGhfZmFpbGVkKHdwYV9zKTsKQEAgLTIxMzQsNyArMjE4OCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1RETFMgKi8KIAogCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKKyNpZmRlZiBDT05GSUdfV05NCiBzdGF0aWMgdm9pZCB3cGFfc3VwcGxpY2FudF9ldmVudF93bm0oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICAgIHVuaW9uIHdwYV9ldmVudF9kYXRhICpkYXRhKQogewpAQCAtMjE0NiwxMSArMjIwMCwxMSBAQAogCQkJICAgIihhY3Rpb249JWQsIGludHZhbD0lZCkiLAogCQkJICAgZGF0YS0+d25tLnNsZWVwX2FjdGlvbiwgZGF0YS0+d25tLnNsZWVwX2ludHZhbCk7CiAJCWllZWU4MDJfMTFfc2VuZF93bm1zbGVlcF9yZXEod3BhX3MsIGRhdGEtPndubS5zbGVlcF9hY3Rpb24sCi0JCQkJCSAgICAgZGF0YS0+d25tLnNsZWVwX2ludHZhbCk7CisJCQkJCSAgICAgZGF0YS0+d25tLnNsZWVwX2ludHZhbCwgTlVMTCk7CiAJCWJyZWFrOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKQEAgLTIyNzMsNTAgKzIzMjcsNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHdubV9hY3Rpb25fcngoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHJ4X2FjdGlvbiAqcngpCi17Ci0JdTggYWN0aW9uLCBtb2RlOwotCWNvbnN0IHU4ICpwb3MsICplbmQ7Ci0KLQlpZiAocngtPmRhdGEgPT0gTlVMTCB8fCByeC0+bGVuID09IDApCi0JCXJldHVybjsKLQotCXBvcyA9IHJ4LT5kYXRhOwotCWVuZCA9IHBvcyArIHJ4LT5sZW47Ci0JYWN0aW9uID0gKnBvcysrOwotCi0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFJYIGFjdGlvbiAldSBmcm9tICIgTUFDU1RSLAotCQkgICBhY3Rpb24sIE1BQzJTVFIocngtPnNhKSk7Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFdOTV9CU1NfVFJBTlNfTUdNVF9SRVE6Ci0JCWlmIChwb3MgKyA1ID4gZW5kKQotCQkJYnJlYWs7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50ICIKLQkJCSAgICJSZXF1ZXN0OiBkaWFsb2dfdG9rZW49JXUgcmVxdWVzdF9tb2RlPTB4JXggIgotCQkJICAgImRpc2Fzc29jX3RpbWVyPSV1IHZhbGlkaXR5X2ludGVydmFsPSV1IiwKLQkJCSAgIHBvc1swXSwgcG9zWzFdLCBXUEFfR0VUX0xFMTYocG9zICsgMiksIHBvc1s0XSk7Ci0JCW1vZGUgPSBwb3NbMV07Ci0JCXBvcyArPSA1OwotCQlpZiAobW9kZSAmIDB4MDgpCi0JCQlwb3MgKz0gMTI7IC8qIEJTUyBUZXJtaW5hdGlvbiBEdXJhdGlvbiAqLwotCQlpZiAobW9kZSAmIDB4MTApIHsKLQkJCWNoYXIgdXJsWzI1Nl07Ci0JCQlpZiAocG9zICsgMSA+IGVuZCB8fCBwb3MgKyAxICsgcG9zWzBdID4gZW5kKSB7Ci0JCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEludmFsaWQgQlNTICIKLQkJCQkJICAgIlRyYW5zaXRpb24gTWFuYWdlbWVudCBSZXF1ZXN0ICIKLQkJCQkJICAgIihVUkwpIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvc19tZW1jcHkodXJsLCBwb3MgKyAxLCBwb3NbMF0pOwotCQkJdXJsW3Bvc1swXV0gPSAnXDAnOwotCQkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sICJXTk06IEVTUyBEaXNhc3NvY2lhdGlvbiAiCi0JCQkJIkltbWluZW50IC0gc2Vzc2lvbl9pbmZvX3VybD0lcyIsIHVybCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCi0KIHZvaWQgd3BhX3N1cHBsaWNhbnRfZXZlbnQodm9pZCAqY3R4LCBlbnVtIHdwYV9ldmVudF90eXBlIGV2ZW50LAogCQkJICB1bmlvbiB3cGFfZXZlbnRfZGF0YSAqZGF0YSkKIHsKQEAgLTI1MDMsMTEgKzI1MTMsMTEgQEAKIAkJd3BhX3N1cHBsaWNhbnRfZXZlbnRfdGRscyh3cGFfcywgZGF0YSk7CiAJCWJyZWFrOwogI2VuZGlmIC8qIENPTkZJR19URExTICovCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKKyNpZmRlZiBDT05GSUdfV05NCiAJY2FzZSBFVkVOVF9XTk06CiAJCXdwYV9zdXBwbGljYW50X2V2ZW50X3dubSh3cGFfcywgZGF0YSk7CiAJCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFWICovCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLwogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiAJY2FzZSBFVkVOVF9GVF9SRVNQT05TRToKIAkJd3BhX3N1cHBsaWNhbnRfZXZlbnRfZnRfcmVzcG9uc2Uod3BhX3MsIGRhdGEpOwpAQCAtMjUzMCw5ICsyNTQwLDggQEAKIAkJCQlkYXRhLT5hc3NvY19yZWplY3Quc3RhdHVzX2NvZGUpOwogCQlpZiAod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU01FKQogCQkJc21lX2V2ZW50X2Fzc29jX3JlamVjdCh3cGFfcywgZGF0YSk7Ci0jaWZkZWYgQU5EUk9JRF9QMlAKLSNpZmRlZiBDT05GSUdfUDJQCiAJCWVsc2UgeworI2lmZGVmIEFORFJPSURfUDJQCiAJCQlpZighd3BhX3MtPmN1cnJlbnRfc3NpZCkgewogCQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiY3VycmVudF9zc2lkID09IE5VTEwiKTsKIAkJCQlicmVhazsKQEAgLTI1NzEsOSArMjU4MCwxNCBAQAogCQkJCXdwYV9zdXBwbGljYW50X2Rpc2FibGVfbmV0d29yayh3cGFfcywgd3BhX3MtPmN1cnJlbnRfc3NpZCk7CiAJCQkJd3Bhc19wMnBfZ3JvdXBfcmVtb3ZlKHdwYV9zLCB3cGFfcy0+aWZuYW1lKTsKIAkJCX0KLQkJfQotI2VuZGlmCisjZWxzZQorCQkJY29uc3QgdTggKmJzc2lkID0gZGF0YS0+YXNzb2NfcmVqZWN0LmJzc2lkOworCQkJaWYgKGJzc2lkID09IE5VTEwgfHwgaXNfemVyb19ldGhlcl9hZGRyKGJzc2lkKSkKKwkJCQlic3NpZCA9IHdwYV9zLT5wZW5kaW5nX2Jzc2lkOworCQkJd3Bhc19jb25uZWN0aW9uX2ZhaWxlZCh3cGFfcywgYnNzaWQpOworCQkJd3BhX3N1cHBsaWNhbnRfbWFya19kaXNhc3NvYyh3cGFfcyk7CiAjZW5kaWYgLyogQU5EUk9JRF9QMlAgKi8KKwkJfQogCQlicmVhazsKIAljYXNlIEVWRU5UX0FVVEhfVElNRURfT1VUOgogCQlpZiAod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfU01FKQpAQCAtMjc0MiwxMiArMjc1NiwxMiBAQAogCQl9CiAjZW5kaWYgLyogQ09ORklHX1NNRSAqLwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMVYKKyNpZmRlZiBDT05GSUdfV05NCiAJCWlmIChkYXRhLT5yeF9hY3Rpb24uY2F0ZWdvcnkgPT0gV0xBTl9BQ1RJT05fV05NKSB7CiAJCQlpZWVlODAyXzExX3J4X3dubV9hY3Rpb24od3BhX3MsICZkYXRhLT5yeF9hY3Rpb24pOwogCQkJYnJlYWs7CiAJCX0KLSNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExViAqLworI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KICNpZmRlZiBDT05GSUdfR0FTCiAJCWlmIChkYXRhLT5yeF9hY3Rpb24uY2F0ZWdvcnkgPT0gV0xBTl9BQ1RJT05fUFVCTElDICYmCiAJCSAgICBnYXNfcXVlcnlfcngod3BhX3MtPmdhcywgZGF0YS0+cnhfYWN0aW9uLmRhLApAQCAtMjc1NiwxMCArMjc3MCw2IEBACiAJCQkJIGRhdGEtPnJ4X2FjdGlvbi5mcmVxKSA9PSAwKQogCQkJYnJlYWs7CiAjZW5kaWYgLyogQ09ORklHX0dBUyAqLwotCQlpZiAoZGF0YS0+cnhfYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQUNUSU9OX1dOTSkgewotCQkJd25tX2FjdGlvbl9yeCh3cGFfcywgJmRhdGEtPnJ4X2FjdGlvbik7Ci0JCQlicmVhazsKLQkJfQogI2lmZGVmIENPTkZJR19URExTCiAJCWlmIChkYXRhLT5yeF9hY3Rpb24uY2F0ZWdvcnkgPT0gV0xBTl9BQ1RJT05fUFVCTElDICYmCiAJCSAgICBkYXRhLT5yeF9hY3Rpb24ubGVuID49IDQgJiYKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2V4YW1wbGVzL3dwcy1uZmMucHkgYi93cGFfc3VwcGxpY2FudC9leGFtcGxlcy93cHMtbmZjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjZmMxZjYKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9leGFtcGxlcy93cHMtbmZjLnB5CkBAIC0wLDAgKzEsMTYyIEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBFeGFtcGxlIG5mY3B5IHRvIHdwYV9zdXBwbGljYW50IHdyYXBwZXIgZm9yIFdQUyBORkMgb3BlcmF0aW9ucworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitpbXBvcnQgbmZjCitpbXBvcnQgbmZjLm5kZWYKK2ltcG9ydCBuZmMubGxjcAoraW1wb3J0IG5mYy5oYW5kb3ZlcgorCitpbXBvcnQgd3BhY3RybAorCit3cGFzX2N0cmwgPSAnL3Zhci9ydW4vd3BhX3N1cHBsaWNhbnQnCisKK2RlZiB3cGFzX2Nvbm5lY3QoKToKKyAgICBpZmFjZXMgPSBbXQorICAgIGlmIG9zLnBhdGguaXNkaXIod3Bhc19jdHJsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWZhY2VzID0gW29zLnBhdGguam9pbih3cGFzX2N0cmwsIGkpIGZvciBpIGluIG9zLmxpc3RkaXIod3Bhc19jdHJsKV0KKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGVycm9yOgorICAgICAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBmaW5kIHdwYV9zdXBwbGljYW50OiAiLCBlcnJvcgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGlmIGxlbihpZmFjZXMpIDwgMToKKyAgICAgICAgcHJpbnQgIk5vIHdwYV9zdXBwbGljYW50IGNvbnRyb2wgaW50ZXJmYWNlIGZvdW5kIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZm9yIGN0cmwgaW4gaWZhY2VzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cGFzID0gd3BhY3RybC5XUEFDdHJsKGN0cmwpCisgICAgICAgICAgICByZXR1cm4gd3BhcworICAgICAgICBleGNlcHQgd3BhY3RybC5lcnJvciwgZXJyb3I6CisgICAgICAgICAgICBwcmludCAiRXJyb3I6ICIsIGVycm9yCisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgd3Bhc190YWdfcmVhZChtZXNzYWdlKToKKyAgICB3cGFzID0gd3Bhc19jb25uZWN0KCkKKyAgICBpZiAod3BhcyA9PSBOb25lKToKKyAgICAgICAgcmV0dXJuCisgICAgcHJpbnQgd3Bhcy5yZXF1ZXN0KCJXUFNfTkZDX1RBR19SRUFEICIgKyBtZXNzYWdlLmVuY29kZSgiaGV4IikpCisKKworZGVmIHdwYXNfZ2V0X2hhbmRvdmVyX3JlcSgpOgorICAgIHdwYXMgPSB3cGFzX2Nvbm5lY3QoKQorICAgIGlmICh3cGFzID09IE5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiB3cGFzLnJlcXVlc3QoIk5GQ19HRVRfSEFORE9WRVJfUkVRIE5ERUYgV1BTIikucnN0cmlwKCkuZGVjb2RlKCJoZXgiKQorCisKK2RlZiB3cGFzX3B1dF9oYW5kb3Zlcl9zZWwobWVzc2FnZSk6CisgICAgd3BhcyA9IHdwYXNfY29ubmVjdCgpCisgICAgaWYgKHdwYXMgPT0gTm9uZSk6CisgICAgICAgIHJldHVybgorICAgIHByaW50IHdwYXMucmVxdWVzdCgiTkZDX1JYX0hBTkRPVkVSX1NFTCAiICsgc3RyKG1lc3NhZ2UpLmVuY29kZSgiaGV4IikpCisKKworZGVmIHdwc19oYW5kb3Zlcl9pbml0KHBlZXIpOgorICAgIHByaW50ICJUcnlpbmcgdG8gaW5pdGlhdGUgV1BTIGhhbmRvdmVyIgorCisgICAgZGF0YSA9IHdwYXNfZ2V0X2hhbmRvdmVyX3JlcSgpCisgICAgaWYgKGRhdGEgPT0gTm9uZSk6CisgICAgICAgIHByaW50ICJDb3VsZCBub3QgZ2V0IGhhbmRvdmVyIHJlcXVlc3QgbWVzc2FnZSBmcm9tIHdwYV9zdXBwbGljYW50IgorICAgICAgICByZXR1cm4KKyAgICBwcmludCAiSGFuZG92ZXIgcmVxdWVzdCBmcm9tIHdwYV9zdXBwbGljYW50OiAiICsgZGF0YS5lbmNvZGUoImhleCIpCisgICAgbWVzc2FnZSA9IG5mYy5uZGVmLk1lc3NhZ2UoZGF0YSkKKyAgICBwcmludCAiUGFyc2VkIGhhbmRvdmVyIHJlcXVlc3Q6ICIgKyBtZXNzYWdlLnByZXR0eSgpCisKKyAgICBuZmMubGxjcC5hY3RpdmF0ZShwZWVyKTsKKyAgICB0aW1lLnNsZWVwKDAuNSkKKworICAgIGNsaWVudCA9IG5mYy5oYW5kb3Zlci5IYW5kb3ZlckNsaWVudCgpCisgICAgdHJ5OgorICAgICAgICBwcmludCAiVHJ5aW5nIGhhbmRvdmVyIjsKKyAgICAgICAgY2xpZW50LmNvbm5lY3QoKQorICAgICAgICBwcmludCAiQ29ubmVjdGVkIGZvciBoYW5kb3ZlciIKKyAgICBleGNlcHQgbmZjLmxsY3AuQ29ubmVjdFJlZnVzZWQ6CisgICAgICAgIHByaW50ICJIYW5kb3ZlciBjb25uZWN0aW9uIHJlZnVzZWQiCisgICAgICAgIG5mYy5sbGNwLnNodXRkb3duKCkKKyAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBwcmludCAiU2VuZGluZyBoYW5kb3ZlciByZXF1ZXN0IgorCisgICAgaWYgbm90IGNsaWVudC5zZW5kKG1lc3NhZ2UpOgorICAgICAgICBwcmludCAiRmFpbGVkIHRvIHNlbmQgaGFuZG92ZXIgcmVxdWVzdCIKKworICAgIHByaW50ICJSZWNlaXZpbmcgaGFuZG92ZXIgcmVzcG9uc2UiCisgICAgbWVzc2FnZSA9IGNsaWVudC5fcmVjdigpCisgICAgcHJpbnQgIkhhbmRvdmVyIHNlbGVjdCByZWNlaXZlZCIKKyAgICBwcmludCBtZXNzYWdlLnByZXR0eSgpCisgICAgd3Bhc19wdXRfaGFuZG92ZXJfc2VsKG1lc3NhZ2UpCisKKyAgICBwcmludCAiUmVtb3ZlIHBlZXIiCisgICAgbmZjLmxsY3Auc2h1dGRvd24oKQorICAgIGNsaWVudC5jbG9zZSgpCisgICAgcHJpbnQgIkRvbmUgd2l0aCBoYW5kb3ZlciIKKworCitkZWYgd3BzX3RhZ19yZWFkKHRhZyk6CisgICAgaWYgbGVuKHRhZy5uZGVmLm1lc3NhZ2UpOgorICAgICAgICBtZXNzYWdlID0gbmZjLm5kZWYuTWVzc2FnZSh0YWcubmRlZi5tZXNzYWdlKQorICAgICAgICBwcmludCAibWVzc2FnZSB0eXBlICIgKyBtZXNzYWdlLnR5cGUKKworICAgICAgICBmb3IgcmVjb3JkIGluIG1lc3NhZ2U6CisgICAgICAgICAgICBwcmludCAicmVjb3JkIHR5cGUgIiArIHJlY29yZC50eXBlCisgICAgICAgICAgICBpZiByZWNvcmQudHlwZSA9PSAiYXBwbGljYXRpb24vdm5kLndmYS53c2MiOgorICAgICAgICAgICAgICAgIHByaW50ICJXUFMgdGFnIC0gc2VuZCB0byB3cGFfc3VwcGxpY2FudCIKKyAgICAgICAgICAgICAgICB3cGFzX3RhZ19yZWFkKHRhZy5uZGVmLm1lc3NhZ2UpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiRW1wdHkgdGFnIgorCisgICAgcHJpbnQgIlJlbW92ZSB0YWciCisgICAgd2hpbGUgdGFnLmlzX3ByZXNlbnQ6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2RlZiBtYWluKCk6CisgICAgY2xmID0gbmZjLkNvbnRhY3RsZXNzRnJvbnRlbmQoKQorCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcHJpbnQgIldhaXRpbmcgZm9yIGEgdGFnIG9yIHBlZXIgdG8gYmUgdG91Y2hlZCIKKworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBnZW5lcmFsX2J5dGVzID0gbmZjLmxsY3Auc3RhcnR1cCh7fSkKKyAgICAgICAgICAgICAgICB0YWcgPSBjbGYucG9sbChnZW5lcmFsX2J5dGVzKQorICAgICAgICAgICAgICAgIGlmIHRhZyA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0YWcsIG5mYy5ERVApOgorICAgICAgICAgICAgICAgICAgICB3cHNfaGFuZG92ZXJfaW5pdCh0YWcpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICBpZiB0YWcubmRlZjoKKyAgICAgICAgICAgICAgICAgICAgd3BzX3RhZ19yZWFkKHRhZykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIGlmIHRhZzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIk5vdCBhbiBOREVGIHRhZyAtIHJlbW92ZSB0YWciCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHRhZy5pc19wcmVzZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICBmaW5hbGx5OgorICAgICAgICBjbGYuY2xvc2UoKQorCisgICAgcmFpc2UgU3lzdGVtRXhpdAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmMgYi93cGFfc3VwcGxpY2FudC9nYXNfcXVlcnkuYwppbmRleCBlZmE5YmU4Li4yN2JjYzdhIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9nYXNfcXVlcnkuYworKysgYi93cGFfc3VwcGxpY2FudC9nYXNfcXVlcnkuYwpAQCAtMTksOSArMTksMTMgQEAKICNpbmNsdWRlICJnYXNfcXVlcnkuaCIKIAogCisvKiogR0FTIHF1ZXJ5IHRpbWVvdXQgaW4gc2Vjb25kcyAqLwogI2RlZmluZSBHQVNfUVVFUllfVElNRU9VVF9QRVJJT0QgNQogCiAKKy8qKgorICogc3RydWN0IGdhc19xdWVyeV9wZW5kaW5nIC0gUGVuZGluZyBHQVMgcXVlcnkKKyAqLwogc3RydWN0IGdhc19xdWVyeV9wZW5kaW5nIHsKIAlzdHJ1Y3QgZGxfbGlzdCBsaXN0OwogCXU4IGFkZHJbRVRIX0FMRU5dOwpAQCAtNDAsNiArNDQsOSBAQAogCXZvaWQgKmN0eDsKIH07CiAKKy8qKgorICogc3RydWN0IGdhc19xdWVyeSAtIEludGVybmFsIEdBUyBxdWVyeSBkYXRhCisgKi8KIHN0cnVjdCBnYXNfcXVlcnkgewogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3M7CiAJc3RydWN0IGRsX2xpc3QgcGVuZGluZzsgLyogc3RydWN0IGdhc19xdWVyeV9wZW5kaW5nICovCkBAIC01MCw2ICs1NywxMSBAQAogc3RhdGljIHZvaWQgZ2FzX3F1ZXJ5X3RpbWVvdXQodm9pZCAqZWxvb3BfZGF0YSwgdm9pZCAqdXNlcl9jdHgpOwogCiAKKy8qKgorICogZ2FzX3F1ZXJ5X2luaXQgLSBJbml0aWFsaXplIEdBUyBxdWVyeSBjb21wb25lbnQKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIEdBUyBxdWVyeSBkYXRhIG9yICVOVUxMIG9uIGZhaWx1cmUKKyAqLwogc3RydWN0IGdhc19xdWVyeSAqIGdhc19xdWVyeV9pbml0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CiAJc3RydWN0IGdhc19xdWVyeSAqZ2FzOwpAQCAtODIsNiArOTQsMTAgQEAKIH0KIAogCisvKioKKyAqIGdhc19xdWVyeV9kZWluaXQgLSBEZWluaXRpYWxpemUgR0FTIHF1ZXJ5IGNvbXBvbmVudAorICogQGdhczogR0FTIHF1ZXJ5IGRhdGEgZnJvbSBnYXNfcXVlcnlfaW5pdCgpCisgKi8KIHZvaWQgZ2FzX3F1ZXJ5X2RlaW5pdChzdHJ1Y3QgZ2FzX3F1ZXJ5ICpnYXMpCiB7CiAJc3RydWN0IGdhc19xdWVyeV9wZW5kaW5nICpxdWVyeSwgKm5leHQ7CkBAIC0yNzQsNiArMjkwLDE3IEBACiB9CiAKIAorLyoqCisgKiBnYXNfcXVlcnlfcnggLSBJbmRpY2F0ZSByZWNlcHRpb24gb2YgYSBQdWJsaWMgQWN0aW9uIGZyYW1lCisgKiBAZ2FzOiBHQVMgcXVlcnkgZGF0YSBmcm9tIGdhc19xdWVyeV9pbml0KCkKKyAqIEBkYTogRGVzdGluYXRpb24gTUFDIGFkZHJlc3Mgb2YgdGhlIEFjdGlvbiBmcmFtZQorICogQHNhOiBTb3VyY2UgTUFDIGFkZHJlc3Mgb2YgdGhlIEFjdGlvbiBmcmFtZQorICogQGJzc2lkOiBCU1NJRCBvZiB0aGUgQWN0aW9uIGZyYW1lCisgKiBAZGF0YTogUGF5bG9hZCBvZiB0aGUgQWN0aW9uIGZyYW1lCisgKiBAbGVuOiBMZW5ndGggb2YgQGRhdGEKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1Ieikgb24gd2hpY2ggdGhlIGZyYW1lIHdhcyByZWNlaXZlZAorICogUmV0dXJuczogMCBpZiB0aGUgUHVibGljIEFjdGlvbiBmcmFtZSB3YXMgYSBHQVMgZnJhbWUgb3IgLTEgaWYgbm90CisgKi8KIGludCBnYXNfcXVlcnlfcngoc3RydWN0IGdhc19xdWVyeSAqZ2FzLCBjb25zdCB1OCAqZGEsIGNvbnN0IHU4ICpzYSwKIAkJIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sIGludCBmcmVxKQogewpAQCAtNDE0LDYgKzQ0MSwxNiBAQAogfQogCiAKKy8qKgorICogZ2FzX3F1ZXJ5X3JlcSAtIFJlcXVlc3QgYSBHQVMgcXVlcnkKKyAqIEBnYXM6IEdBUyBxdWVyeSBkYXRhIGZyb20gZ2FzX3F1ZXJ5X2luaXQoKQorICogQGRzdDogRGVzdGluYXRpb24gTUFDIGFkZHJlc3MgZm9yIHRoZSBxdWVyeQorICogQGZyZXE6IEZyZXF1ZW5jeSAoaW4gTUh6KSBmb3IgdGhlIGNoYW5uZWwgb24gd2hpY2ggdG8gc2VuZCB0aGUgcXVlcnkKKyAqIEByZXE6IEdBUyBxdWVyeSBwYXlsb2FkCisgKiBAY2I6IENhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgR0FTIHF1ZXJ5IHJlc3VsdCBhbmQgcmVzcG9uc2UKKyAqIEBjdHg6IENvbnRleHQgcG9pbnRlciB0byB1c2Ugd2l0aCB0aGUgQGNiIGNhbGwKKyAqIFJldHVybnM6IGRpYWxvZyB0b2tlbiAoPj0gMCkgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlCisgKi8KIGludCBnYXNfcXVlcnlfcmVxKHN0cnVjdCBnYXNfcXVlcnkgKmdhcywgY29uc3QgdTggKmRzdCwgaW50IGZyZXEsCiAJCSAgc3RydWN0IHdwYWJ1ZiAqcmVxLAogCQkgIHZvaWQgKCpjYikodm9pZCAqY3R4LCBjb25zdCB1OCAqZHN0LCB1OCBkaWFsb2dfdG9rZW4sCkBAIC00NTMsNiArNDkwLDcgQEAKIAlpZiAoZ2FzX3F1ZXJ5X3R4KGdhcywgcXVlcnksIHJlcSkgPCAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiR0FTOiBGYWlsZWQgdG8gc2VuZCBBY3Rpb24gZnJhbWUgdG8gIgogCQkJICAgTUFDU1RSLCBNQUMyU1RSKHF1ZXJ5LT5hZGRyKSk7CisJCWRsX2xpc3RfZGVsKCZxdWVyeS0+bGlzdCk7CiAJCW9zX2ZyZWUocXVlcnkpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNDY0LDYgKzUwMiwxMiBAQAogfQogCiAKKy8qKgorICogZ2FzX3F1ZXJ5X2NhbmNlbCAtIENhbmNlbCBhIHBlbmRpbmcgR0FTIHF1ZXJ5CisgKiBAZ2FzOiBHQVMgcXVlcnkgZGF0YSBmcm9tIGdhc19xdWVyeV9pbml0KCkKKyAqIEBkc3Q6IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIGZvciB0aGUgcXVlcnkKKyAqIEBkaWFsb2dfdG9rZW46IERpYWxvZyB0b2tlbiBmcm9tIGdhc19xdWVyeV9yZXEoKQorICovCiB2b2lkIGdhc19xdWVyeV9jYW5jZWwoc3RydWN0IGdhc19xdWVyeSAqZ2FzLCBjb25zdCB1OCAqZHN0LCB1OCBkaWFsb2dfdG9rZW4pCiB7CiAJc3RydWN0IGdhc19xdWVyeV9wZW5kaW5nICpxdWVyeTsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L2dhc19xdWVyeS5oIGIvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmgKaW5kZXggMDFhYmE2ZS4uNWMzZDE2MSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvZ2FzX3F1ZXJ5LmgKQEAgLTE5LDYgKzE5LDkgQEAKIGludCBnYXNfcXVlcnlfcngoc3RydWN0IGdhc19xdWVyeSAqZ2FzLCBjb25zdCB1OCAqZGEsIGNvbnN0IHU4ICpzYSwKIAkJIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBsZW4sIGludCBmcmVxKTsKIAorLyoqCisgKiBlbnVtIGdhc19xdWVyeV9yZXN1bHQgLSBHQVMgcXVlcnkgcmVzdWx0CisgKi8KIGVudW0gZ2FzX3F1ZXJ5X3Jlc3VsdCB7CiAJR0FTX1FVRVJZX1NVQ0NFU1MsCiAJR0FTX1FVRVJZX0ZBSUxVUkUsCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9oczIwX3N1cHBsaWNhbnQuYyBiL3dwYV9zdXBwbGljYW50L2hzMjBfc3VwcGxpY2FudC5jCmluZGV4IDBlYjYxMTkuLjE0MDQyNDEgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2hzMjBfc3VwcGxpY2FudC5jCisrKyBiL3dwYV9zdXBwbGljYW50L2hzMjBfc3VwcGxpY2FudC5jCkBAIC03OSw4ICs3OSwxMCBAQAogCiAJZnJlcSA9IHdwYV9zLT5hc3NvY19mcmVxOwogCWJzcyA9IHdwYV9ic3NfZ2V0X2Jzc2lkKHdwYV9zLCBkc3QpOwotCWlmIChic3MpCisJaWYgKGJzcykgeworCQl3cGFfYnNzX2FucXBfdW5zaGFyZV9hbGxvYyhic3MpOwogCQlmcmVxID0gYnNzLT5mcmVxOworCX0KIAlpZiAoZnJlcSA8PSAwKQogCQlyZXR1cm4gLTE7CiAKQEAgLTE0MSw5ICsxNDMsMTYgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEhTMjBfU1RZUEVfV0FOX01FVFJJQ1M6CisJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldBTiBNZXRyaWNzIiwgcG9zLCBzbGVuKTsKKwkJaWYgKHNsZW4gPCAxMykgeworCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiSFMgMi4wOiBUb28gc2hvcnQgV0FOICIKKwkJCQkiTWV0cmljcyB2YWx1ZSBmcm9tICIgTUFDU1RSLCBNQUMyU1RSKHNhKSk7CisJCQlicmVhazsKKwkJfQogCQl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgIlJYLUhTMjAtQU5RUCAiIE1BQ1NUUgotCQkJIiBXQU4gTWV0cmljcyIsIE1BQzJTVFIoc2EpKTsKLQkJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiV0FOIE1ldHJpY3MiLCBwb3MsIHNsZW4pOworCQkJIiBXQU4gTWV0cmljcyAlMDJ4OiV1OiV1OiV1OiV1OiV1IiwgTUFDMlNUUihzYSksCisJCQlwb3NbMF0sIFdQQV9HRVRfTEUzMihwb3MgKyAxKSwgV1BBX0dFVF9MRTMyKHBvcyArIDUpLAorCQkJcG9zWzldLCBwb3NbMTBdLCBXUEFfR0VUX0xFMTYocG9zICsgMTEpKTsKIAkJaWYgKGFucXApIHsKIAkJCXdwYWJ1Zl9mcmVlKGFucXAtPmhzMjBfd2FuX21ldHJpY3MpOwogCQkJYW5xcC0+aHMyMF93YW5fbWV0cmljcyA9IHdwYWJ1Zl9hbGxvY19jb3B5KHBvcywgc2xlbik7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuYyBiL3dwYV9zdXBwbGljYW50L2ludGVyd29ya2luZy5jCmluZGV4IDIyZjcwOWYuLmI4YThiYjIgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L2ludGVyd29ya2luZy5jCisrKyBiL3dwYV9zdXBwbGljYW50L2ludGVyd29ya2luZy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiY29tbW9uL2dhcy5oIgogI2luY2x1ZGUgImNvbW1vbi93cGFfY3RybC5oIgogI2luY2x1ZGUgInV0aWxzL3Bjc2NfZnVuY3MuaCIKKyNpbmNsdWRlICJ1dGlscy9lbG9vcC5oIgogI2luY2x1ZGUgImRyaXZlcnMvZHJpdmVyLmgiCiAjaW5jbHVkZSAiZWFwX2NvbW1vbi9lYXBfZGVmcy5oIgogI2luY2x1ZGUgImVhcF9wZWVyL2VhcC5oIgpAQCAtMTcwLDYgKzE3MSwxMyBAQAogfQogCiAKK3N0YXRpYyB2b2lkIGludGVyd29ya2luZ19jb250aW51ZV9hbnFwKHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqc29ja19jdHgpCit7CisJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IGVsb29wX2N0eDsKKwlpbnRlcndvcmtpbmdfbmV4dF9hbnFwX2ZldGNoKHdwYV9zKTsKK30KKworCiBzdGF0aWMgaW50IGludGVyd29ya2luZ19hbnFwX3NlbmRfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgICAgc3RydWN0IHdwYV9ic3MgKmJzcykKIHsKQEAgLTIzOCw2ICsyNDYsOCBAQAogCWlmIChyZXMgPCAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQU5RUDogRmFpbGVkIHRvIHNlbmQgUXVlcnkgUmVxdWVzdCIpOwogCQlyZXQgPSAtMTsKKwkJZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgwLCAwLCBpbnRlcndvcmtpbmdfY29udGludWVfYW5xcCwgd3BhX3MsCisJCQkJICAgICAgIE5VTEwpOwogCX0gZWxzZQogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkFOUVA6IFF1ZXJ5IHN0YXJ0ZWQgd2l0aCBkaWFsb2cgdG9rZW4gIgogCQkJICAgIiV1IiwgcmVzKTsKQEAgLTUxNiwxMyArNTI2LDE4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChlYXAtPm1ldGhvZCA9PSBFQVBfVFlQRV9QRUFQICYmCi0JICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIGVhcC0+aW5uZXJfbWV0aG9kKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwlpZiAoZWFwLT5tZXRob2QgPT0gRUFQX1RZUEVfUEVBUCkgeworCQlpZiAoZWFwLT5pbm5lcl9tZXRob2QgJiYKKwkJICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIGVhcC0+aW5uZXJfbWV0aG9kKSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghZWFwLT5pbm5lcl9tZXRob2QgJiYKKwkJICAgIGVhcF9nZXRfbmFtZShFQVBfVkVORE9SX0lFVEYsIEVBUF9UWVBFX01TQ0hBUFYyKSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQogCiAJaWYgKGVhcC0+bWV0aG9kID09IEVBUF9UWVBFX1RUTFMpIHsKIAkJaWYgKGVhcC0+aW5uZXJfbWV0aG9kID09IDAgJiYgZWFwLT5pbm5lcl9ub25fZWFwID09IDApCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOyAvKiBBc3N1bWUgVFRMUy9NU0NIQVB2MiBpcyB1c2VkICovCiAJCWlmIChlYXAtPmlubmVyX21ldGhvZCAmJgogCQkgICAgZWFwX2dldF9uYW1lKEVBUF9WRU5ET1JfSUVURiwgZWFwLT5pbm5lcl9tZXRob2QpID09IE5VTEwpCiAJCQlyZXR1cm4gMDsKQEAgLTcxNyw5ICs3MzIsMTIgQEAKICNlbmRpZiAvKiBJTlRFUldPUktJTkdfM0dQUCAqLwogCiAKLXN0YXRpYyBpbnQgaW50ZXJ3b3JraW5nX3NldF9oczIwX3BhcmFtcyhzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQpCitzdGF0aWMgaW50IGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJc3RydWN0IHdwYV9zc2lkICpzc2lkKQogewotCWlmICh3cGFfY29uZmlnX3NldChzc2lkLCAia2V5X21nbXQiLCAiV1BBLUVBUCIsIDApIDwgMCkKKwlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgImtleV9tZ210IiwKKwkJCSAgIHdwYV9zLT5jb25mLT5wbWYgIT0gTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OID8KKwkJCSAgICJXUEEtRUFQIFdQQS1FQVAtU0hBMjU2IiA6ICJXUEEtRUFQIiwgMCkgPCAwKQogCQlyZXR1cm4gLTE7CiAJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwcm90byIsICJSU04iLCAwKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTc4Niw2ICs4MDQsNyBAQAogCXNzaWQgPSB3cGFfY29uZmlnX2FkZF9uZXR3b3JrKHdwYV9zLT5jb25mKTsKIAlpZiAoc3NpZCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CisJc3NpZC0+cGFyZW50X2NyZWQgPSBjcmVkOwogCiAJd3Bhc19ub3RpZnlfbmV0d29ya19hZGRlZCh3cGFfcywgc3NpZCk7CiAJd3BhX2NvbmZpZ19zZXRfbmV0d29ya19kZWZhdWx0cyhzc2lkKTsKQEAgLTc5Nyw3ICs4MTYsNyBAQAogCW9zX21lbWNweShzc2lkLT5zc2lkLCBpZSArIDIsIGllWzFdKTsKIAlzc2lkLT5zc2lkX2xlbiA9IGllWzFdOwogCi0JaWYgKGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMoc3NpZCkgPCAwKQorCWlmIChpbnRlcndvcmtpbmdfc2V0X2hzMjBfcGFyYW1zKHdwYV9zLCBzc2lkKSA8IDApCiAJCWdvdG8gZmFpbDsKIAogCWVhcF90eXBlID0gRUFQX1RZUEVfU0lNOwpAQCAtOTQ0LDYgKzk2MywyNCBAQAogfQogCiAKK3N0YXRpYyBpbnQgY3JlZF9leGNsdWRlZF9zc2lkKHN0cnVjdCB3cGFfY3JlZCAqY3JlZCwgc3RydWN0IHdwYV9ic3MgKmJzcykKK3sKKwlzaXplX3QgaTsKKworCWlmICghY3JlZC0+ZXhjbHVkZWRfc3NpZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3JlZC0+bnVtX2V4Y2x1ZGVkX3NzaWQ7IGkrKykgeworCQlzdHJ1Y3QgZXhjbHVkZWRfc3NpZCAqZSA9ICZjcmVkLT5leGNsdWRlZF9zc2lkW2ldOworCQlpZiAoYnNzLT5zc2lkX2xlbiA9PSBlLT5zc2lkX2xlbiAmJgorCQkgICAgb3NfbWVtY21wKGJzcy0+c3NpZCwgZS0+c3NpZCwgZS0+c3NpZF9sZW4pID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgc3RydWN0IHdwYV9jcmVkICogaW50ZXJ3b3JraW5nX2NyZWRlbnRpYWxzX2F2YWlsYWJsZV9yb2FtaW5nX2NvbnNvcnRpdW0oCiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHdwYV9ic3MgKmJzcykKIHsKQEAgLTk3MSw2ICsxMDA4LDkgQEAKIAkJCQkJICAgICAgY3JlZC0+cm9hbWluZ19jb25zb3J0aXVtX2xlbikpCiAJCQljb250aW51ZTsKIAorCQlpZiAoY3JlZF9leGNsdWRlZF9zc2lkKGNyZWQsIGJzcykpCisJCQljb250aW51ZTsKKwogCQlpZiAoc2VsZWN0ZWQgPT0gTlVMTCB8fAogCQkgICAgc2VsZWN0ZWQtPnByaW9yaXR5IDwgY3JlZC0+cHJpb3JpdHkpCiAJCQlzZWxlY3RlZCA9IGNyZWQ7CkBAIC0xMDQ2LDYgKzEwODYsMTcgQEAKIAkgICAgd3BhX2NvbmZpZ19zZXRfcXVvdGVkKHNzaWQsICJjbGllbnRfY2VydCIsIGNyZWQtPmNsaWVudF9jZXJ0KSA8IDApCiAJCXJldHVybiAtMTsKIAorI2lmZGVmIEFORFJPSUQKKwlpZiAoY3JlZC0+cHJpdmF0ZV9rZXkgJiYKKwkgICAgb3Nfc3RybmNtcChjcmVkLT5wcml2YXRlX2tleSwgImtleXN0b3JlOi8vIiwgMTEpID09IDApIHsKKwkJLyogVXNlIE9wZW5TU0wgZW5naW5lIGNvbmZpZ3VyYXRpb24gZm9yIEFuZHJvaWQga2V5c3RvcmUgKi8KKwkJaWYgKHdwYV9jb25maWdfc2V0X3F1b3RlZChzc2lkLCAiZW5naW5lX2lkIiwgImtleXN0b3JlIikgPCAwIHx8CisJCSAgICB3cGFfY29uZmlnX3NldF9xdW90ZWQoc3NpZCwgImtleV9pZCIsCisJCQkJCSAgY3JlZC0+cHJpdmF0ZV9rZXkgKyAxMSkgPCAwIHx8CisJCSAgICB3cGFfY29uZmlnX3NldChzc2lkLCAiZW5naW5lIiwgIjEiLCAwKSA8IDApCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlCisjZW5kaWYgLyogQU5EUk9JRCAqLwogCWlmIChjcmVkLT5wcml2YXRlX2tleSAmJiBjcmVkLT5wcml2YXRlX2tleVswXSAmJgogCSAgICB3cGFfY29uZmlnX3NldF9xdW90ZWQoc3NpZCwgInByaXZhdGVfa2V5IiwgY3JlZC0+cHJpdmF0ZV9rZXkpIDwgMCkKIAkJcmV0dXJuIC0xOwpAQCAtMTA4NCw2ICsxMTM1LDcgQEAKIAlzc2lkID0gd3BhX2NvbmZpZ19hZGRfbmV0d29yayh3cGFfcy0+Y29uZik7CiAJaWYgKHNzaWQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOworCXNzaWQtPnBhcmVudF9jcmVkID0gY3JlZDsKIAl3cGFzX25vdGlmeV9uZXR3b3JrX2FkZGVkKHdwYV9zLCBzc2lkKTsKIAl3cGFfY29uZmlnX3NldF9uZXR3b3JrX2RlZmF1bHRzKHNzaWQpOwogCXNzaWQtPnByaW9yaXR5ID0gY3JlZC0+cHJpb3JpdHk7CkBAIC0xMDk0LDcgKzExNDYsNyBAQAogCW9zX21lbWNweShzc2lkLT5zc2lkLCBzc2lkX2llICsgMiwgc3NpZF9pZVsxXSk7CiAJc3NpZC0+c3NpZF9sZW4gPSBzc2lkX2llWzFdOwogCi0JaWYgKGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMoc3NpZCkgPCAwKQorCWlmIChpbnRlcndvcmtpbmdfc2V0X2hzMjBfcGFyYW1zKHdwYV9zLCBzc2lkKSA8IDApCiAJCWdvdG8gZmFpbDsKIAogCWlmIChjcmVkLT5lYXBfbWV0aG9kID09IE5VTEwpIHsKQEAgLTExOTgsNiArMTI1MCw3IEBACiAJCW5haV9yZWFsbV9mcmVlKHJlYWxtLCBjb3VudCk7CiAJCXJldHVybiAtMTsKIAl9CisJc3NpZC0+cGFyZW50X2NyZWQgPSBjcmVkOwogCXdwYXNfbm90aWZ5X25ldHdvcmtfYWRkZWQod3BhX3MsIHNzaWQpOwogCXdwYV9jb25maWdfc2V0X25ldHdvcmtfZGVmYXVsdHMoc3NpZCk7CiAJc3NpZC0+cHJpb3JpdHkgPSBjcmVkLT5wcmlvcml0eTsKQEAgLTEyMDgsNyArMTI2MSw3IEBACiAJb3NfbWVtY3B5KHNzaWQtPnNzaWQsIGllICsgMiwgaWVbMV0pOwogCXNzaWQtPnNzaWRfbGVuID0gaWVbMV07CiAKLQlpZiAoaW50ZXJ3b3JraW5nX3NldF9oczIwX3BhcmFtcyhzc2lkKSA8IDApCisJaWYgKGludGVyd29ya2luZ19zZXRfaHMyMF9wYXJhbXMod3BhX3MsIHNzaWQpIDwgMCkKIAkJZ290byBmYWlsOwogCiAJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJlYXAiLCBlYXBfZ2V0X25hbWUoRUFQX1ZFTkRPUl9JRVRGLApAQCAtMTI0NiwxMSArMTI5OSwyMCBAQAogCQkJCQkgICAwKSA8IDApCiAJCQkJZ290byBmYWlsOwogCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBFQVAgcGFyYW1zIHdlcmUgbm90IHNldCAtIGFzc3VtZSBUVExTL01TQ0hBUHYyICovCisJCQlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMiIsICJcImF1dGg9TVNDSEFQVjJcIiIsCisJCQkJCSAgIDApIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIEVBUF9UWVBFX1BFQVA6CiAJCW9zX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcImF1dGg9JXNcIiIsCi0JCQkgICAgZWFwX2dldF9uYW1lKEVBUF9WRU5ET1JfSUVURiwgZWFwLT5pbm5lcl9tZXRob2QpKTsKKwkJCSAgICBlYXBfZ2V0X25hbWUoRUFQX1ZFTkRPUl9JRVRGLAorCQkJCQkgZWFwLT5pbm5lcl9tZXRob2QgPworCQkJCQkgZWFwLT5pbm5lcl9tZXRob2QgOgorCQkJCQkgRUFQX1RZUEVfTVNDSEFQVjIpKTsKIAkJaWYgKHdwYV9jb25maWdfc2V0KHNzaWQsICJwaGFzZTIiLCBidWYsIDApIDwgMCkKIAkJCWdvdG8gZmFpbDsKIAkJYnJlYWs7CkBAIC0xMzIwLDYgKzEzODIsOCBAQAogCQlyZXQgPSBwbG1uX2lkX21hdGNoKGJzcy0+YW5xcC0+YW5xcF8zZ3BwLCBpbXNpLCBtbmNfbGVuKTsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQTE1OIG1hdGNoICVzZm91bmQiLCByZXQgPyAiIiA6ICJub3QgIik7CiAJCWlmIChyZXQpIHsKKwkJCWlmIChjcmVkX2V4Y2x1ZGVkX3NzaWQoY3JlZCwgYnNzKSkKKwkJCQljb250aW51ZTsKIAkJCWlmIChzZWxlY3RlZCA9PSBOVUxMIHx8CiAJCQkgICAgc2VsZWN0ZWQtPnByaW9yaXR5IDwgY3JlZC0+cHJpb3JpdHkpCiAJCQkJc2VsZWN0ZWQgPSBjcmVkOwpAQCAtMTM2MCw2ICsxNDI0LDggQEAKIAkJCWlmICghbmFpX3JlYWxtX21hdGNoKCZyZWFsbVtpXSwgY3JlZC0+cmVhbG0pKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKG5haV9yZWFsbV9maW5kX2VhcChjcmVkLCAmcmVhbG1baV0pKSB7CisJCQkJaWYgKGNyZWRfZXhjbHVkZWRfc3NpZChjcmVkLCBic3MpKQorCQkJCQljb250aW51ZTsKIAkJCQlpZiAoc2VsZWN0ZWQgPT0gTlVMTCB8fAogCQkJCSAgICBzZWxlY3RlZC0+cHJpb3JpdHkgPCBjcmVkLT5wcmlvcml0eSkKIAkJCQkJc2VsZWN0ZWQgPSBjcmVkOwpAQCAtMTQyNCw1MCArMTQ5MCw2MSBAQAogfQogCiAKK2ludCBpbnRlcndvcmtpbmdfaG9tZV9zcF9jcmVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkgICAgICBzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQsCisJCQkgICAgICBzdHJ1Y3Qgd3BhYnVmICpkb21haW5fbmFtZXMpCit7CisjaWZkZWYgSU5URVJXT1JLSU5HXzNHUFAKKwljaGFyIG5haVsxMDBdLCAqcmVhbG07CisKKwljaGFyICppbXNpID0gTlVMTDsKKwlpbnQgbW5jX2xlbiA9IDA7CisJaWYgKGNyZWQtPmltc2kpCisJCWltc2kgPSBjcmVkLT5pbXNpOworI2lmZGVmIENPTkZJR19QQ1NDCisJZWxzZSBpZiAoY3JlZC0+cGNzYyAmJiB3cGFfcy0+Y29uZi0+cGNzY19yZWFkZXIgJiYKKwkJIHdwYV9zLT5zY2FyZCAmJiB3cGFfcy0+aW1zaVswXSkgeworCQlpbXNpID0gd3BhX3MtPmltc2k7CisJCW1uY19sZW4gPSB3cGFfcy0+bW5jX2xlbjsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BDU0MgKi8KKwlpZiAoZG9tYWluX25hbWVzICYmCisJICAgIGltc2kgJiYgYnVpbGRfcm9vdF9uYWkobmFpLCBzaXplb2YobmFpKSwgaW1zaSwgbW5jX2xlbiwgMCkgPT0gMCkgeworCQlyZWFsbSA9IG9zX3N0cmNocihuYWksICdAJyk7CisJCWlmIChyZWFsbSkKKwkJCXJlYWxtKys7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBTZWFyY2ggZm9yIG1hdGNoICIKKwkJCSAgICJ3aXRoIFNJTS9VU0lNIGRvbWFpbiAlcyIsIHJlYWxtKTsKKwkJaWYgKHJlYWxtICYmCisJCSAgICBkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgcmVhbG0pKQorCQkJcmV0dXJuIDE7CisJfQorI2VuZGlmIC8qIElOVEVSV09SS0lOR18zR1BQICovCisKKwlpZiAoZG9tYWluX25hbWVzID09IE5VTEwgfHwgY3JlZC0+ZG9tYWluID09IE5VTEwpCisJCXJldHVybiAwOworCisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnRlcndvcmtpbmc6IFNlYXJjaCBmb3IgbWF0Y2ggd2l0aCAiCisJCSAgICJob21lIFNQIEZRRE4gJXMiLCBjcmVkLT5kb21haW4pOworCWlmIChkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgY3JlZC0+ZG9tYWluKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IGludGVyd29ya2luZ19ob21lX3NwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJc3RydWN0IHdwYWJ1ZiAqZG9tYWluX25hbWVzKQogewogCXN0cnVjdCB3cGFfY3JlZCAqY3JlZDsKLSNpZmRlZiBJTlRFUldPUktJTkdfM0dQUAotCWNoYXIgbmFpWzEwMF0sICpyZWFsbTsKLSNlbmRpZiAvKiBJTlRFUldPUktJTkdfM0dQUCAqLwogCiAJaWYgKGRvbWFpbl9uYW1lcyA9PSBOVUxMIHx8IHdwYV9zLT5jb25mLT5jcmVkID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAogCWZvciAoY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOyBjcmVkOyBjcmVkID0gY3JlZC0+bmV4dCkgewotI2lmZGVmIElOVEVSV09SS0lOR18zR1BQCi0JCWNoYXIgKmltc2kgPSBOVUxMOwotCQlpbnQgbW5jX2xlbiA9IDA7Ci0JCWlmIChjcmVkLT5pbXNpKQotCQkJaW1zaSA9IGNyZWQtPmltc2k7Ci0jaWZkZWYgQ09ORklHX1BDU0MKLQkJZWxzZSBpZiAoY3JlZC0+cGNzYyAmJiB3cGFfcy0+Y29uZi0+cGNzY19yZWFkZXIgJiYKLQkJCSB3cGFfcy0+c2NhcmQgJiYgd3BhX3MtPmltc2lbMF0pIHsKLQkJCWltc2kgPSB3cGFfcy0+aW1zaTsKLQkJCW1uY19sZW4gPSB3cGFfcy0+bW5jX2xlbjsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19QQ1NDICovCi0JCWlmIChpbXNpICYmIGJ1aWxkX3Jvb3RfbmFpKG5haSwgc2l6ZW9mKG5haSksIGltc2ksIG1uY19sZW4sIDApCi0JCSAgICA9PSAwKSB7Ci0JCQlyZWFsbSA9IG9zX3N0cmNocihuYWksICdAJyk7Ci0JCQlpZiAocmVhbG0pCi0JCQkJcmVhbG0rKzsKLQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiSW50ZXJ3b3JraW5nOiBTZWFyY2ggZm9yIG1hdGNoICIKLQkJCQkgICAid2l0aCBTSU0vVVNJTSBkb21haW4gJXMiLCByZWFsbSk7Ci0JCQlpZiAocmVhbG0gJiYKLQkJCSAgICBkb21haW5fbmFtZV9saXN0X2NvbnRhaW5zKGRvbWFpbl9uYW1lcywgcmVhbG0pKQotCQkJCXJldHVybiAxOwotCQl9Ci0jZW5kaWYgLyogSU5URVJXT1JLSU5HXzNHUFAgKi8KLQotCQlpZiAoY3JlZC0+ZG9tYWluID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogU2VhcmNoIGZvciBtYXRjaCB3aXRoICIKLQkJCSAgICJob21lIFNQIEZRRE4gJXMiLCBjcmVkLT5kb21haW4pOwotCQlpZiAoZG9tYWluX25hbWVfbGlzdF9jb250YWlucyhkb21haW5fbmFtZXMsIGNyZWQtPmRvbWFpbikpCi0JCQlyZXR1cm4gMTsKKwkJaW50IHJlcyA9IGludGVyd29ya2luZ19ob21lX3NwX2NyZWQod3BhX3MsIGNyZWQsIGRvbWFpbl9uYW1lcyk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTYwMyw2ICsxNjgwLDExIEBACiAJCQljb250aW51ZTsKIAkJaWYgKG90aGVyLT5hbnFwID09IE5VTEwpCiAJCQljb250aW51ZTsKKwkJaWYgKG90aGVyLT5hbnFwLT5yb2FtaW5nX2NvbnNvcnRpdW0gPT0gTlVMTCAmJgorCQkgICAgb3RoZXItPmFucXAtPm5haV9yZWFsbSA9PSBOVUxMICYmCisJCSAgICBvdGhlci0+YW5xcC0+YW5xcF8zZ3BwID09IE5VTEwgJiYKKwkJICAgIG90aGVyLT5hbnFwLT5kb21haW5fbmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CiAJCWlmICghKG90aGVyLT5mbGFncyAmIFdQQV9CU1NfQU5RUF9GRVRDSF9UUklFRCkpCiAJCQljb250aW51ZTsKIAkJaWYgKG9zX21lbWNtcChic3MtPmhlc3NpZCwgb3RoZXItPmhlc3NpZCwgRVRIX0FMRU4pICE9IDApCkBAIC0xNjI4LDcgKzE3MTAsNyBAQAogCWludCBmb3VuZCA9IDA7CiAJY29uc3QgdTggKmllOwogCi0JaWYgKCF3cGFfcy0+ZmV0Y2hfYW5xcF9pbl9wcm9ncmVzcykKKwlpZiAoZWxvb3BfdGVybWluYXRlZCgpIHx8ICF3cGFfcy0+ZmV0Y2hfYW5xcF9pbl9wcm9ncmVzcykKIAkJcmV0dXJuOwogCiAJZGxfbGlzdF9mb3JfZWFjaChic3MsICZ3cGFfcy0+YnNzLCBzdHJ1Y3Qgd3BhX2JzcywgbGlzdCkgewpAQCAtMTcxNCw4ICsxNzk2LDEwIEBACiAKIAlmcmVxID0gd3BhX3MtPmFzc29jX2ZyZXE7CiAJYnNzID0gd3BhX2Jzc19nZXRfYnNzaWQod3BhX3MsIGRzdCk7Ci0JaWYgKGJzcykKKwlpZiAoYnNzKSB7CisJCXdwYV9ic3NfYW5xcF91bnNoYXJlX2FsbG9jKGJzcyk7CiAJCWZyZXEgPSBic3MtPmZyZXE7CisJfQogCWlmIChmcmVxIDw9IDApCiAJCXJldHVybiAtMTsKIApAQCAtMTkzNSw3ICsyMDE5LDcgQEAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkludGVyd29ya2luZzogU3RhcnQgc2NhbiBmb3IgbmV0d29yayAiCiAJCSAgICJzZWxlY3Rpb24iKTsKIAl3cGFfcy0+c2Nhbl9yZXNfaGFuZGxlciA9IGludGVyd29ya2luZ19zY2FuX3Jlc19oYW5kbGVyOwotCXdwYV9zLT5zY2FuX3JlcSA9IDI7CisJd3BhX3MtPnNjYW5fcmVxID0gTUFOVUFMX1NDQU5fUkVROwogCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvaW50ZXJ3b3JraW5nLmggYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaAppbmRleCBjYjg0MzhlLi40YTRhZjgyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaAorKysgYi93cGFfc3VwcGxpY2FudC9pbnRlcndvcmtpbmcuaApAQCAtMjUsNSArMjUsOCBAQAogaW50IGludGVyd29ya2luZ19zZWxlY3Qoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IGF1dG9fc2VsZWN0KTsKIGludCBpbnRlcndvcmtpbmdfY29ubmVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKTsKIHZvaWQgaW50ZXJ3b3JraW5nX3N0YXJ0X2ZldGNoX2FucXAoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CitpbnQgaW50ZXJ3b3JraW5nX2hvbWVfc3BfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJICAgICAgc3RydWN0IHdwYV9jcmVkICpjcmVkLAorCQkJICAgICAgc3RydWN0IHdwYWJ1ZiAqZG9tYWluX25hbWVzKTsKIAogI2VuZGlmIC8qIElOVEVSV09SS0lOR19IICovCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9ub3RpZnkuYyBiL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCmluZGV4IDc3MDkwN2MuLjQ0NzljMDkgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCisrKyBiL3dwYV9zdXBwbGljYW50L25vdGlmeS5jCkBAIC0zMjcsNiArMzI3LDkgQEAKIHZvaWQgd3Bhc19ub3RpZnlfYnNzX3dwc19jaGFuZ2VkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJIHVuc2lnbmVkIGludCBpZCkKIHsKKyNpZmRlZiBDT05GSUdfV1BTCisJd3Bhc19kYnVzX2Jzc19zaWduYWxfcHJvcF9jaGFuZ2VkKHdwYV9zLCBXUEFTX0RCVVNfQlNTX1BST1BfV1BTLCBpZCk7CisjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogfQogCiAKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuYyBiL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuYwppbmRleCBiODhlYWIxLi44NTZlY2E3IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9vZmZjaGFubmVsLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5jCkBAIC0xMzIsNiArMTMyLDE3IEBACiB9CiAKIAorLyoqCisgKiBvZmZjaGFubmVsX3NlbmRfYWN0aW9uX3R4X3N0YXR1cyAtIFRYIHN0YXR1cyBjYWxsYmFjaworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBkc3Q6IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIG9mIHRoZSB0cmFuc21pdHRlZCBBY3Rpb24gZnJhbWUKKyAqIEBkYXRhOiBUcmFuc21pdHRlZCBmcmFtZSBwYXlsb2FkCisgKiBAZGF0YV9sZW46IExlbmd0aCBvZiBAZGF0YSBpbiBieXRlcworICogQHJlc3VsdDogVFggc3RhdHVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRyaXZlciBpbmRpY2F0ZXMgYSBUWCBzdGF0dXMgZXZlbnQgZm9yCisgKiBhIGZyYW1lIHNlbnQgYnkgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbigpIHVzaW5nIHdwYV9kcnZfc2VuZF9hY3Rpb24oKS4KKyAqLwogdm9pZCBvZmZjaGFubmVsX3NlbmRfYWN0aW9uX3R4X3N0YXR1cygKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqZGF0YSwKIAlzaXplX3QgZGF0YV9sZW4sIGVudW0gb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl9yZXN1bHQgcmVzdWx0KQpAQCAtMTY0LDYgKzE3NSwyNyBAQAogfQogCiAKKy8qKgorICogb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbiAtIFJlcXVlc3Qgb2ZmLWNoYW5uZWwgQWN0aW9uIGZyYW1lIFRYCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQGZyZXE6IFRoZSBmcmVxdWVuY3kgaW4gTUh6IGluZGljYXRpbmcgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIGZyYW1lIGlzIHRvCisgKgl0cmFuc21pdHRlZCBvciAwIGZvciB0aGUgY3VycmVudCBjaGFubmVsIChvbmx5IGlmIGFzc29jaWF0ZWQpCisgKiBAZHN0OiBBY3Rpb24gZnJhbWUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKyAqIEBzcmM6IEFjdGlvbiBmcmFtZSBzb3VyY2UgTUFDIGFkZHJlc3MKKyAqIEBic3NpZDogQWN0aW9uIGZyYW1lIEJTU0lECisgKiBAYnVmOiBGcmFtZSB0byB0cmFuc21pdCBzdGFydGluZyBmcm9tIHRoZSBDYXRlZ29yeSBmaWVsZAorICogQGxlbjogTGVuZ3RoIG9mIEBidWYgaW4gYnl0ZXMKKyAqIEB3YWl0X3RpbWU6IFdhaXQgdGltZSBmb3IgcmVzcG9uc2UgaW4gbWlsbGlzZWNvbmRzCisgKiBAdHhfY2I6IENhbGxiYWNrIGZ1bmN0aW9uIGZvciBpbmRpY2F0aW5nIFRYIHN0YXR1cyBvciAlTlVMTCBmb3Igbm93IGNhbGxiYWNrCisgKiBAbm9fY2NrOiBXaGV0aGVyIENDSyByYXRlcyBhcmUgdG8gYmUgZGlzYWxsb3dlZCBmb3IgVFggcmF0ZSBzZWxlY3Rpb24KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgYW4gQWN0aW9uIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIG9uIHRoZQorICogY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCBvciBvbiBhbm90aGVyIGNoYW5uZWwgKG9mZi1jaGFubmVsKS4gVGhlIGFjdHVhbAorICogZnJhbWUgdHJhbnNtaXNzaW9uIHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHJlYWR5IG9uIHRoZSBzcGVjaWZpZWQKKyAqIGNoYW5uZWwuIFRoZSBAd2FpdF90aW1lIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IHRoZSBkcml2ZXIgdG8gcmVtYWluCisgKiBhd2FrZSBvbiB0aGUgY2hhbm5lbCB0byB3YWl0IGZvciBhIHJlc3BvbnNlLgorICovCiBpbnQgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCB1bnNpZ25lZCBpbnQgZnJlcSwKIAkJCSAgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCB3YWl0X3RpbWUsCkBAIC0yNjYsNiArMjk4LDEzIEBACiB9CiAKIAorLyoqCisgKiBvZmZjaGFubmVsX3NlbmRfc2VuZF9hY3Rpb25fZG9uZSAtIE5vdGlmeSBjb21wbGV0aW9uIG9mIEFjdGlvbiBmcmFtZSBzZXF1ZW5jZQorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNhbmNlbCBhIHdhaXQgZm9yIGFkZGl0aW9uYWwgcmVzcG9uc2UgZnJhbWVzIG9uCisgKiB0aGUgY2hhbm5lbCB0aGF0IHdhcyB1c2VkIHdpdGggb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbigpLgorICovCiB2b2lkIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fZG9uZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiT2ZmLWNoYW5uZWw6IEFjdGlvbiBmcmFtZSBzZXF1ZW5jZSBkb25lICIKQEAgLTI4NCw2ICszMjMsMTUgQEAKIH0KIAogCisvKioKKyAqIG9mZmNoYW5uZWxfcmVtYWluX29uX2NoYW5uZWxfY2IgLSBSZW1haW4tb24tY2hhbm5lbCBjYWxsYmFjayBmdW5jdGlvbgorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1Ieikgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqIEBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIHJlbWFpbi1vbi1jaGFubmVsIG9wZXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZHJpdmVyIG5vdGlmaWVzIGJlZ2lubmluZyBvZiBhCisgKiByZW1haW4tb24tY2hhbm5lbCBvcGVyYXRpb24uCisgKi8KIHZvaWQgb2ZmY2hhbm5lbF9yZW1haW5fb25fY2hhbm5lbF9jYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGZyZXEsIHVuc2lnbmVkIGludCBkdXJhdGlvbikKIHsKQEAgLTI5Myw2ICszNDEsMTQgQEAKIH0KIAogCisvKioKKyAqIG9mZmNoYW5uZWxfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsX2NiIC0gUmVtYWluLW9uLWNoYW5uZWwgc3RvcHBlZCBjYWxsYmFjaworICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBmcmVxOiBGcmVxdWVuY3kgKGluIE1Ieikgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZHJpdmVyIG5vdGlmaWVzIHRlcm1pbmF0aW9uIG9mIGEKKyAqIHJlbWFpbi1vbi1jaGFubmVsIG9wZXJhdGlvbi4KKyAqLwogdm9pZCBvZmZjaGFubmVsX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbF9jYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQkgICAgdW5zaWduZWQgaW50IGZyZXEpCiB7CkBAIC0zMDAsOSArMzU2LDQyIEBACiB9CiAKIAotdm9pZCBvZmZjaGFubmVsX2RlaW5pdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQorLyoqCisgKiBvZmZjaGFubmVsX3BlbmRpbmdfYWN0aW9uX3R4IC0gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHBlbmRpbmcgQWN0aW9uIFRYCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogUmV0dXJuczogUG9pbnRlciB0byBwZW5kaW5nIGZyYW1lIG9yICVOVUxMIGlmIG5vIHBlbmRpbmcgb3BlcmF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcGVuZGluZyBBY3Rpb24gZnJhbWUgVFgKKyAqIG9wZXJhdGlvbi4gVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY2hlY2tpbmcgd2hldGhlciBpdAorICogaXMgJU5VTEwgKG5vIHBlbmRpbmcgZnJhbWUpIG9yIHRvIHByaW50IHRoZSBwb2ludGVyIHZhbHVlIGluIGRlYnVnCisgKiBpbmZvcm1hdGlvbiAoaS5lLiwgdGhlIHBvaW50ZXIgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQpLgorICovCitjb25zdCB2b2lkICogb2ZmY2hhbm5lbF9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCXJldHVybiB3cGFfcy0+cGVuZGluZ19hY3Rpb25fdHg7Cit9CisKKworLyoqCisgKiBvZmZjaGFubmVsX2NsZWFyX3BlbmRpbmdfYWN0aW9uX3R4IC0gQ2xlYXIgcGVuZGluZyBBY3Rpb24gZnJhbWUgVFgKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKi8KK3ZvaWQgb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXdwYWJ1Zl9mcmVlKHdwYV9zLT5wZW5kaW5nX2FjdGlvbl90eCk7CiAJd3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4ID0gTlVMTDsKK30KKworCisvKioKKyAqIG9mZmNoYW5uZWxfZGVpbml0IC0gRGVpbml0IG9mZi1jaGFubmVsIG9wZXJhdGlvbnMKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdXAgYW55IGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIG9mZi1jaGFubmVsCisgKiBvcGVyYXRpb25zLgorICovCit2b2lkIG9mZmNoYW5uZWxfZGVpbml0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eCh3cGFfcyk7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19zZW5kX2FjdGlvbl9jYiwgd3BhX3MsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5oIGIvd3BhX3N1cHBsaWNhbnQvb2ZmY2hhbm5lbC5oCmluZGV4IDFkMzk0OGMuLjBhZDdlMTggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L29mZmNoYW5uZWwuaAorKysgYi93cGFfc3VwcGxpY2FudC9vZmZjaGFubmVsLmgKQEAgLTI5LDUgKzI5LDcgQEAKIHZvaWQgb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl90eF9zdGF0dXMoCiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKmRhdGEsCiAJc2l6ZV90IGRhdGFfbGVuLCBlbnVtIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fcmVzdWx0IHJlc3VsdCk7Citjb25zdCB2b2lkICogb2ZmY2hhbm5lbF9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK3ZvaWQgb2ZmY2hhbm5lbF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIAogI2VuZGlmIC8qIE9GRkNIQU5ORUxfSCAqLwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuYyBiL3dwYV9zdXBwbGljYW50L3AycF9zdXBwbGljYW50LmMKaW5kZXggZTZiMDEyOC4uNTIzMTc4ZiAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuYworKysgYi93cGFfc3VwcGxpY2FudC9wMnBfc3VwcGxpY2FudC5jCkBAIC04OSwxNCArODksMTMgQEAKIHN0YXRpYyBpbnQgd3Bhc19wMnBfam9pbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqaWZhY2VfYWRkciwKIAkJCSBjb25zdCB1OCAqZGV2X2FkZHIsIGVudW0gcDJwX3dwc19tZXRob2Qgd3BzX21ldGhvZCwKIAkJCSBpbnQgYXV0b19qb2luKTsKLXN0YXRpYyB2b2lkIHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQodm9pZCAqZWxvb3BfY3R4LAotCQkJCQkgICAgdm9pZCAqdGltZW91dF9jdHgpOwogc3RhdGljIGludCB3cGFzX3AycF9jcmVhdGVfaWZhY2Uoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiBzdGF0aWMgdm9pZCB3cGFzX3AycF9jcm9zc19jb25uZWN0X3NldHVwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogc3RhdGljIHZvaWQgd3Bhc19wMnBfZ3JvdXBfaWRsZV90aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpOwogc3RhdGljIHZvaWQgd3Bhc19wMnBfc2V0X2dyb3VwX2lkbGVfdGltZW91dChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHN0YXRpYyB2b2lkIHdwYXNfcDJwX2ZhbGxiYWNrX3RvX2dvX25lZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCQlpbnQgZ3JvdXBfYWRkZWQpOworc3RhdGljIGludCB3cGFzX3AycF9zdG9wX2ZpbmRfb3BlcihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIAogCiBzdGF0aWMgdm9pZCB3cGFzX3AycF9zY2FuX3Jlc19oYW5kbGVyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCkBAIC0xMTMsNyArMTEyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2Nhbl9yZXMtPm51bTsgaSsrKSB7CiAJCXN0cnVjdCB3cGFfc2Nhbl9yZXMgKmJzcyA9IHNjYW5fcmVzLT5yZXNbaV07CiAJCWlmIChwMnBfc2Nhbl9yZXNfaGFuZGxlcih3cGFfcy0+Z2xvYmFsLT5wMnAsIGJzcy0+YnNzaWQsCi0JCQkJCSBic3MtPmZyZXEsIGJzcy0+bGV2ZWwsCisJCQkJCSBic3MtPmZyZXEsIGJzcy0+YWdlLCBic3MtPmxldmVsLAogCQkJCQkgKGNvbnN0IHU4ICopIChic3MgKyAxKSwKIAkJCQkJIGJzcy0+aWVfbGVuKSA+IDApCiAJCQlicmVhazsKQEAgLTc0NiwxOSArNzQ1LDEzIEBACiAJaWYgKHJlc3VsdCAhPSBPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX1NVQ0NFU1MgJiYKIAkgICAgd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gJiYKIAkgICAgKG9zX21lbWNtcChkc3QsIHdwYV9zLT5wZW5kaW5nX2pvaW5fZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwIHx8Ci0JICAgICBvc19tZW1jbXAoZHN0LCB3cGFfcy0+cGVuZGluZ19qb2luX2lmYWNlX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSkgeworCSAgICAgb3NfbWVtY21wKGRzdCwgd3BhX3MtPnBlbmRpbmdfam9pbl9pZmFjZV9hZGRyLCBFVEhfQUxFTikgPT0gMCkgJiYKKwkgICAgd3BhX3MtPnAycF9mYWxsYmFja190b19nb19uZWcpIHsKIAkJd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gPSAwOwotCQlpZiAod3BhX3MtPnAycF9mYWxsYmFja190b19nb19uZWcpIHsKLQkJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlAyUDogTm8gQUNLIGZvciBQRCBSZXEgIgotCQkJCSJkdXJpbmcgcDJwX2Nvbm5lY3QtYXV0byIpOwotCQkJd3Bhc19wMnBfZmFsbGJhY2tfdG9fZ29fbmVnKHdwYV9zLCAwKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBTdGFydGluZyBwZW5kaW5nICIKLQkJCSAgICJqb2luLWV4aXN0aW5nLWdyb3VwIG9wZXJhdGlvbiAobm8gQUNLIGZvciBQRCAiCi0JCQkgICAiUmVxKSIpOwotCQl3cGFzX3AycF9qb2luX3N0YXJ0KHdwYV9zKTsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUDJQOiBObyBBQ0sgZm9yIFBEIFJlcSAiCisJCQkiZHVyaW5nIHAycF9jb25uZWN0LWF1dG8iKTsKKwkJd3Bhc19wMnBfZmFsbGJhY2tfdG9fZ29fbmVnKHdwYV9zLCAwKTsKKwkJcmV0dXJuOwogCX0KIH0KIApAQCAtODI3LDE1ICs4MjAsMjggQEAKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IEdyb3VwIHNldHVwIHdpdGhvdXQgcHJvdmlzaW9uaW5nIik7CiAJCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnBfZ3JvdXBfZm9ybWF0aW9uID09IHdwYV9zKQogCQkJd3BhX3MtPmdsb2JhbC0+cDJwX2dyb3VwX2Zvcm1hdGlvbiA9IE5VTEw7Ci0JCXdwYV9tc2cod3BhX3MtPnBhcmVudCwgTVNHX0lORk8sIFAyUF9FVkVOVF9HUk9VUF9TVEFSVEVECi0JCQkiJXMgR08gc3NpZD1cIiVzXCIgZnJlcT0lZCBwYXNzcGhyYXNlPVwiJXNcIiAiCi0JCQkiZ29fZGV2X2FkZHI9IiBNQUNTVFIgIiVzIiwKLQkJCXdwYV9zLT5pZm5hbWUsCi0JCQl3cGFfc3NpZF90eHQoc3NpZC0+c3NpZCwgc3NpZC0+c3NpZF9sZW4pLAotCQkJc3NpZC0+ZnJlcXVlbmN5LAotCQkJcGFyYW1zLT5wYXNzcGhyYXNlID8gcGFyYW1zLT5wYXNzcGhyYXNlIDogIiIsCi0JCQlNQUMyU1RSKHdwYV9zLT5nbG9iYWwtPnAycF9kZXZfYWRkciksCi0JCQlwYXJhbXMtPnBlcnNpc3RlbnRfZ3JvdXAgPyAiIFtQRVJTSVNURU5UXSIgOiAiIik7CisJCWlmIChvc19zdHJsZW4ocGFyYW1zLT5wYXNzcGhyYXNlKSA+IDApIHsKKwkJCXdwYV9tc2cod3BhX3MtPnBhcmVudCwgTVNHX0lORk8sIFAyUF9FVkVOVF9HUk9VUF9TVEFSVEVECisJCQkJIiVzIEdPIHNzaWQ9XCIlc1wiIGZyZXE9JWQgcGFzc3BocmFzZT1cIiVzXCIgIgorCQkJCSJnb19kZXZfYWRkcj0iIE1BQ1NUUiAiJXMiLCB3cGFfcy0+aWZuYW1lLAorCQkJCXdwYV9zc2lkX3R4dChzc2lkLT5zc2lkLCBzc2lkLT5zc2lkX2xlbiksCisJCQkJc3NpZC0+ZnJlcXVlbmN5LCBwYXJhbXMtPnBhc3NwaHJhc2UsCisJCQkJTUFDMlNUUih3cGFfcy0+Z2xvYmFsLT5wMnBfZGV2X2FkZHIpLAorCQkJCXBhcmFtcy0+cGVyc2lzdGVudF9ncm91cCA/ICIgW1BFUlNJU1RFTlRdIiA6CisJCQkJIiIpOworCQl9IGVsc2UgeworCQkJY2hhciBwc2tbNjVdOworCQkJd3BhX3NucHJpbnRmX2hleChwc2ssIHNpemVvZihwc2spLCBwYXJhbXMtPnBzaywKKwkJCQkJIHNpemVvZihwYXJhbXMtPnBzaykpOworCQkJd3BhX21zZyh3cGFfcy0+cGFyZW50LCBNU0dfSU5GTywgUDJQX0VWRU5UX0dST1VQX1NUQVJURUQKKwkJCQkiJXMgR08gc3NpZD1cIiVzXCIgZnJlcT0lZCBwc2s9JXMgIgorCQkJCSJnb19kZXZfYWRkcj0iIE1BQ1NUUiAiJXMiLCB3cGFfcy0+aWZuYW1lLAorCQkJCXdwYV9zc2lkX3R4dChzc2lkLT5zc2lkLCBzc2lkLT5zc2lkX2xlbiksCisJCQkJc3NpZC0+ZnJlcXVlbmN5LCBwc2ssCisJCQkJTUFDMlNUUih3cGFfcy0+Z2xvYmFsLT5wMnBfZGV2X2FkZHIpLAorCQkJCXBhcmFtcy0+cGVyc2lzdGVudF9ncm91cCA/ICIgW1BFUlNJU1RFTlRdIiA6CisJCQkJIiIpOworCQl9CiAKIAkJaWYgKHBhcmFtcy0+cGVyc2lzdGVudF9ncm91cCkKIAkJCW5ldHdvcmtfaWQgPSB3cGFzX3AycF9zdG9yZV9wZXJzaXN0ZW50X2dyb3VwKApAQCAtODYxLDcgKzg2Nyw3IEBACiAJCQkJCSAgcGFyYW1zLT5wZWVyX2RldmljZV9hZGRyKTsKIAllbHNlIGlmICh3cGFfcy0+cDJwX3BpblswXSkKIAkJd3BhX3N1cHBsaWNhbnRfYXBfd3BzX3Bpbih3cGFfcywgcGFyYW1zLT5wZWVyX2ludGVyZmFjZV9hZGRyLAotCQkJCQkgIHdwYV9zLT5wMnBfcGluLCBOVUxMLCAwKTsKKwkJCQkJICB3cGFfcy0+cDJwX3BpbiwgTlVMTCwgMCwgMCk7CiAJb3NfZnJlZSh3cGFfcy0+Z29fcGFyYW1zKTsKIAl3cGFfcy0+Z29fcGFyYW1zID0gTlVMTDsKIH0KQEAgLTkwNSwxNCArOTExLDIxIEBACiAJc3NpZC0+a2V5X21nbXQgPSBXUEFfS0VZX01HTVRfUFNLOwogCXNzaWQtPnByb3RvID0gV1BBX1BST1RPX1JTTjsKIAlzc2lkLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX0NDTVA7Ci0Jc3NpZC0+cGFzc3BocmFzZSA9IG9zX3N0cmR1cChwYXJhbXMtPnBhc3NwaHJhc2UpOwotCWlmIChzc2lkLT5wYXNzcGhyYXNlID09IE5VTEwpIHsKLQkJd3BhX21zZyh3cGFfcywgTVNHX0VSUk9SLCAiUDJQOiBGYWlsZWQgdG8gY29weSBwYXNzcGhyYXNlIGZvciAiCi0JCQkiR08iKTsKLQkJd3BhX2NvbmZpZ19yZW1vdmVfbmV0d29yayh3cGFfcy0+Y29uZiwgc3NpZC0+aWQpOwotCQlyZXR1cm47Ci0JfQotCXdwYV9jb25maWdfdXBkYXRlX3Bzayhzc2lkKTsKKwlpZiAob3Nfc3RybGVuKHBhcmFtcy0+cGFzc3BocmFzZSkgPiAwKSB7CisJCXNzaWQtPnBhc3NwaHJhc2UgPSBvc19zdHJkdXAocGFyYW1zLT5wYXNzcGhyYXNlKTsKKwkJaWYgKHNzaWQtPnBhc3NwaHJhc2UgPT0gTlVMTCkgeworCQkJd3BhX21zZyh3cGFfcywgTVNHX0VSUk9SLCAiUDJQOiBGYWlsZWQgdG8gY29weSAiCisJCQkJInBhc3NwaHJhc2UgZm9yIEdPIik7CisJCQl3cGFfY29uZmlnX3JlbW92ZV9uZXR3b3JrKHdwYV9zLT5jb25mLCBzc2lkLT5pZCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwkJc3NpZC0+cGFzc3BocmFzZSA9IE5VTEw7CisJc3NpZC0+cHNrX3NldCA9IHBhcmFtcy0+cHNrX3NldDsKKwlpZiAoc3NpZC0+cHNrX3NldCkKKwkJb3NfbWVtY3B5KHNzaWQtPnBzaywgcGFyYW1zLT5wc2ssIHNpemVvZihzc2lkLT5wc2spKTsKKwllbHNlIGlmIChzc2lkLT5wYXNzcGhyYXNlKQorCQl3cGFfY29uZmlnX3VwZGF0ZV9wc2soc3NpZCk7CiAJc3NpZC0+YXBfbWF4X2luYWN0aXZpdHkgPSB3cGFfcy0+cGFyZW50LT5jb25mLT5wMnBfZ29fbWF4X2luYWN0aXZpdHk7CiAKIAl3cGFfcy0+YXBfY29uZmlndXJlZF9jYiA9IHAycF9nb19jb25maWd1cmVkOwpAQCAtMTI2OCw2ICsxMjgxLDEzNSBAQAogfQogCiAKKy8qCisgKiBETlMgSGVhZGVyIHNlY3Rpb24gaXMgdXNlZCBvbmx5IHRvIGNhbGN1bGF0ZSBjb21wcmVzc2lvbiBwb2ludGVycywgc28gdGhlCisgKiBjb250ZW50cyBvZiB0aGlzIGRhdGEgZG9lcyBub3QgbWF0dGVyLCBidXQgdGhlIGxlbmd0aCBuZWVkcyB0byBiZSByZXNlcnZlZAorICogaW4gdGhlIHZpcnR1YWwgcGFja2V0LgorICovCisjZGVmaW5lIEROU19IRUFERVJfTEVOIDEyCisKKy8qCisgKiAyNy1vY3RldCBpbi1tZW1vcnkgcGFja2V0IGZyb20gUDJQIHNwZWNpZmljYXRpb24gY29udGFpbmluZyB0d28gaW1wbGllZAorICogcXVlcmllcyBmb3IgX3RjcC5sY29hbC4gUFRSIElOIGFuZCBfdWRwLmxvY2FsLiBQVFIgSU4KKyAqLworI2RlZmluZSBQMlBfU0RfSU5fTUVNT1JZX0xFTiAyNworCitzdGF0aWMgaW50IHAycF9zZF9kbnNfdW5jb21wcmVzc19sYWJlbChjaGFyICoqdXBvcywgY2hhciAqdWVuZCwgdTggKnN0YXJ0LAorCQkJCSAgICAgICB1OCAqKnNwb3MsIGNvbnN0IHU4ICplbmQpCit7CisJd2hpbGUgKCpzcG9zIDwgZW5kKSB7CisJCXU4IHZhbCA9ICgoKnNwb3MpWzBdICYgMHhjMCkgPj4gNjsKKwkJaW50IGxlbjsKKworCQlpZiAodmFsID09IDEgfHwgdmFsID09IDIpIHsKKwkJCS8qIFRoZXNlIGFyZSByZXNlcnZlZCB2YWx1ZXMgaW4gUkZDIDEwMzUgKi8KKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBJbnZhbGlkIGRvbWFpbiBuYW1lICIKKwkJCQkgICAic2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAweCV4IiwgdmFsKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICh2YWwgPT0gMykgeworCQkJdTE2IG9mZnNldDsKKwkJCXU4ICpzcG9zX3RtcDsKKworCQkJLyogT2Zmc2V0ICovCisJCQlpZiAoKnNwb3MgKyAyID4gZW5kKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IE5vIHJvb20gZm9yIGZ1bGwgIgorCQkJCQkgICAiRE5TIG9mZnNldCBmaWVsZCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJb2Zmc2V0ID0gKCgoKnNwb3MpWzBdICYgMHgzZikgPDwgOCkgfCAoKnNwb3MpWzFdOworCQkJaWYgKG9mZnNldCA+PSAqc3BvcyAtIHN0YXJ0KSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IEludmFsaWQgRE5TICIKKwkJCQkJICAgInBvaW50ZXIgb2Zmc2V0ICV1Iiwgb2Zmc2V0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCSgqc3BvcykgKz0gMjsKKwkJCXNwb3NfdG1wID0gc3RhcnQgKyBvZmZzZXQ7CisJCQlyZXR1cm4gcDJwX3NkX2Ruc191bmNvbXByZXNzX2xhYmVsKHVwb3MsIHVlbmQsIHN0YXJ0LAorCQkJCQkJCSAgICZzcG9zX3RtcCwKKwkJCQkJCQkgICAqc3BvcyAtIDIpOworCQl9CisKKwkJLyogTGFiZWwgKi8KKwkJbGVuID0gKCpzcG9zKVswXSAmIDB4M2Y7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCisJCSgqc3BvcykrKzsKKwkJaWYgKCpzcG9zICsgbGVuID4gZW5kKSB7CisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogSW52YWxpZCBkb21haW4gbmFtZSAiCisJCQkJICAgInNlcXVlbmNlIC0gbm8gcm9vbSBmb3IgbGFiZWwgd2l0aCBsZW5ndGggIgorCQkJCSAgICIldSIsIGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoKnVwb3MgKyBsZW4gKyAyID4gdWVuZCkKKwkJCXJldHVybiAtMjsKKworCQlvc19tZW1jcHkoKnVwb3MsICpzcG9zLCBsZW4pOworCQkqc3BvcyArPSBsZW47CisJCSp1cG9zICs9IGxlbjsKKwkJKCp1cG9zKVswXSA9ICcuJzsKKwkJKCp1cG9zKSsrOworCQkoKnVwb3MpWzBdID0gJ1wwJzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBVbmNvbXByZXNzIGRvbWFpbiBuYW1lcyBwZXIgUkZDIDEwMzUgdXNpbmcgdGhlIFAyUCBTRCBpbi1tZW1vcnkgcGFja2V0LgorICogUmV0dXJucyAtMSBvbiBwYXJzaW5nIGVycm9yIChpbnZhbGlkIGlucHV0IHNlcXVlbmNlKSwgLTIgaWYgb3V0cHV0IGJ1ZmZlciBpcworICogbm90IGxhcmdlIGVub3VnaCAqLworc3RhdGljIGludCBwMnBfc2RfZG5zX3VuY29tcHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgY29uc3QgdTggKm1zZywKKwkJCQkgc2l6ZV90IG1zZ19sZW4sIHNpemVfdCBvZmZzZXQpCit7CisJLyogMjctb2N0ZXQgaW4tbWVtb3J5IHBhY2tldCBmcm9tIFAyUCBzcGVjaWZpY2F0aW9uICovCisJY29uc3QgY2hhciAqcHJlZml4ID0gIlx4MDRfdGNwXHgwNWxvY2FsXHgwMFx4MDBceDBDXHgwMFx4MDEiCisJCSJceDA0X3VkcFx4QzBceDExXHgwMFx4MENceDAwXHgwMSI7CisJdTggKnRtcCwgKmVuZCwgKnNwb3M7CisJY2hhciAqdXBvcywgKnVlbmQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYnVmX2xlbiA8IDIpCisJCXJldHVybiAtMTsKKwlpZiAob2Zmc2V0ID4gbXNnX2xlbikKKwkJcmV0dXJuIC0xOworCisJdG1wID0gb3NfbWFsbG9jKEROU19IRUFERVJfTEVOICsgUDJQX1NEX0lOX01FTU9SWV9MRU4gKyBtc2dfbGVuKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlzcG9zID0gdG1wICsgRE5TX0hFQURFUl9MRU4gKyBQMlBfU0RfSU5fTUVNT1JZX0xFTjsKKwllbmQgPSBzcG9zICsgbXNnX2xlbjsKKwlzcG9zICs9IG9mZnNldDsKKworCW9zX21lbXNldCh0bXAsIDAsIEROU19IRUFERVJfTEVOKTsKKwlvc19tZW1jcHkodG1wICsgRE5TX0hFQURFUl9MRU4sIHByZWZpeCwgUDJQX1NEX0lOX01FTU9SWV9MRU4pOworCW9zX21lbWNweSh0bXAgKyBETlNfSEVBREVSX0xFTiArIFAyUF9TRF9JTl9NRU1PUllfTEVOLCBtc2csIG1zZ19sZW4pOworCisJdXBvcyA9IGJ1ZjsKKwl1ZW5kID0gYnVmICsgYnVmX2xlbjsKKworCXJldCA9IHAycF9zZF9kbnNfdW5jb21wcmVzc19sYWJlbCgmdXBvcywgdWVuZCwgdG1wLCAmc3BvcywgZW5kKTsKKwlpZiAocmV0KSB7CisJCW9zX2ZyZWUodG1wKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAodXBvcyA9PSBidWYpIHsKKwkJdXBvc1swXSA9ICcuJzsKKwkJdXBvc1sxXSA9ICdcMCc7CisJfSBlbHNlIGlmICh1cG9zWy0xXSA9PSAnLicpCisJCXVwb3NbLTFdID0gJ1wwJzsKKworCW9zX2ZyZWUodG1wKTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgc3RydWN0IHAycF9zcnZfYm9uam91ciAqCiB3cGFzX3AycF9zZXJ2aWNlX2dldF9ib25qb3VyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCB3cGFidWYgKnF1ZXJ5KQpAQCAtMTM1OCwxMyArMTUwMCw0MCBAQAogfQogCiAKK3N0YXRpYyBpbnQgbWF0Y2hfYm9uam91cl9xdWVyeShzdHJ1Y3QgcDJwX3Nydl9ib25qb3VyICpic3J2LCBjb25zdCB1OCAqcXVlcnksCisJCQkgICAgICAgc2l6ZV90IHF1ZXJ5X2xlbikKK3sKKwljaGFyIHN0cl9yeFsyNTZdLCBzdHJfc3J2WzI1Nl07CisKKwlpZiAocXVlcnlfbGVuIDwgMyB8fCB3cGFidWZfbGVuKGJzcnYtPnF1ZXJ5KSA8IDMpCisJCXJldHVybiAwOyAvKiBUb28gc2hvcnQgdG8gaW5jbHVkZSBETlMgVHlwZSBhbmQgVmVyc2lvbiAqLworCWlmIChvc19tZW1jbXAocXVlcnkgKyBxdWVyeV9sZW4gLSAzLAorCQkgICAgICB3cGFidWZfaGVhZF91OChic3J2LT5xdWVyeSkgKyB3cGFidWZfbGVuKGJzcnYtPnF1ZXJ5KSAtIDMsCisJCSAgICAgIDMpICE9IDApCisJCXJldHVybiAwOyAvKiBNaXNtYXRjaCBpbiBETlMgVHlwZSBvciBWZXJzaW9uICovCisJaWYgKHF1ZXJ5X2xlbiA9PSB3cGFidWZfbGVuKGJzcnYtPnF1ZXJ5KSAmJgorCSAgICBvc19tZW1jbXAocXVlcnksIHdwYWJ1Zl9oZWFkKGJzcnYtPnF1ZXJ5KSwgcXVlcnlfbGVuIC0gMykgPT0gMCkKKwkJcmV0dXJuIDE7IC8qIEJpbmFyeSBtYXRjaCAqLworCisJaWYgKHAycF9zZF9kbnNfdW5jb21wcmVzcyhzdHJfcngsIHNpemVvZihzdHJfcngpLCBxdWVyeSwgcXVlcnlfbGVuIC0gMywKKwkJCQkgIDApKQorCQlyZXR1cm4gMDsgLyogRmFpbGVkIHRvIHVuY29tcHJlc3MgcXVlcnkgKi8KKwlpZiAocDJwX3NkX2Ruc191bmNvbXByZXNzKHN0cl9zcnYsIHNpemVvZihzdHJfc3J2KSwKKwkJCQkgIHdwYWJ1Zl9oZWFkKGJzcnYtPnF1ZXJ5KSwKKwkJCQkgIHdwYWJ1Zl9sZW4oYnNydi0+cXVlcnkpIC0gMywgMCkpCisJCXJldHVybiAwOyAvKiBGYWlsZWQgdG8gdW5jb21wcmVzcyBzZXJ2aWNlICovCisKKwlyZXR1cm4gb3Nfc3RyY21wKHN0cl9yeCwgc3RyX3NydikgPT0gMDsKK30KKworCiBzdGF0aWMgdm9pZCB3cGFzX3NkX3JlcV9ib25qb3VyKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJc3RydWN0IHdwYWJ1ZiAqcmVzcCwgdTggc3J2X3RyYW5zX2lkLAogCQkJCWNvbnN0IHU4ICpxdWVyeSwgc2l6ZV90IHF1ZXJ5X2xlbikKIHsKIAlzdHJ1Y3QgcDJwX3Nydl9ib25qb3VyICpic3J2OwotCXN0cnVjdCB3cGFidWYgYnVmOwogCXU4ICpsZW5fcG9zOworCWludCBtYXRjaGVzID0gMDsKIAogCXdwYV9oZXhkdW1wX2FzY2lpKE1TR19ERUJVRywgIlAyUDogU0QgUmVxdWVzdCBmb3IgQm9uam91ciIsCiAJCQkgIHF1ZXJ5LCBxdWVyeV9sZW4pOwpAQCAtMTM4MCwzOSArMTU0OSw1MiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHdwYWJ1Zl90YWlscm9vbShyZXNwKSA8IDUpCi0JCXJldHVybjsKLQkvKiBMZW5ndGggKHRvIGJlIGZpbGxlZCkgKi8KLQlsZW5fcG9zID0gd3BhYnVmX3B1dChyZXNwLCAyKTsKLQl3cGFidWZfcHV0X3U4KHJlc3AsIFAyUF9TRVJWX0JPTkpPVVIpOwotCXdwYWJ1Zl9wdXRfdTgocmVzcCwgc3J2X3RyYW5zX2lkKTsKKwlkbF9saXN0X2Zvcl9lYWNoKGJzcnYsICZ3cGFfcy0+Z2xvYmFsLT5wMnBfc3J2X2JvbmpvdXIsCisJCQkgc3RydWN0IHAycF9zcnZfYm9uam91ciwgbGlzdCkgeworCQlpZiAoIW1hdGNoX2JvbmpvdXJfcXVlcnkoYnNydiwgcXVlcnksIHF1ZXJ5X2xlbikpCisJCQljb250aW51ZTsKIAotCXdwYWJ1Zl9zZXQoJmJ1ZiwgcXVlcnksIHF1ZXJ5X2xlbik7Ci0JYnNydiA9IHdwYXNfcDJwX3NlcnZpY2VfZ2V0X2JvbmpvdXIod3BhX3MsICZidWYpOwotCWlmIChic3J2ID09IE5VTEwpIHsKKwkJaWYgKHdwYWJ1Zl90YWlscm9vbShyZXNwKSA8CisJCSAgICA1ICsgcXVlcnlfbGVuICsgd3BhYnVmX2xlbihic3J2LT5yZXNwKSkKKwkJCXJldHVybjsKKworCQltYXRjaGVzKys7CisKKwkJLyogTGVuZ3RoICh0byBiZSBmaWxsZWQpICovCisJCWxlbl9wb3MgPSB3cGFidWZfcHV0KHJlc3AsIDIpOworCQl3cGFidWZfcHV0X3U4KHJlc3AsIFAyUF9TRVJWX0JPTkpPVVIpOworCQl3cGFidWZfcHV0X3U4KHJlc3AsIHNydl90cmFuc19pZCk7CisKKwkJLyogU3RhdHVzIENvZGUgKi8KKwkJd3BhYnVmX3B1dF91OChyZXNwLCBQMlBfU0RfU1VDQ0VTUyk7CisJCXdwYV9oZXhkdW1wX2FzY2lpKE1TR19ERUJVRywgIlAyUDogTWF0Y2hpbmcgQm9uam91ciBzZXJ2aWNlIiwKKwkJCQkgIHdwYWJ1Zl9oZWFkKGJzcnYtPnJlc3ApLAorCQkJCSAgd3BhYnVmX2xlbihic3J2LT5yZXNwKSk7CisKKwkJLyogUmVzcG9uc2UgRGF0YSAqLworCQl3cGFidWZfcHV0X2RhdGEocmVzcCwgcXVlcnksIHF1ZXJ5X2xlbik7IC8qIEtleSAqLworCQl3cGFidWZfcHV0X2J1ZihyZXNwLCBic3J2LT5yZXNwKTsgLyogVmFsdWUgKi8KKworCQlXUEFfUFVUX0xFMTYobGVuX3BvcywgKHU4ICopIHdwYWJ1Zl9wdXQocmVzcCwgMCkgLSBsZW5fcG9zIC0gMik7CisJfQorCisJaWYgKG1hdGNoZXMgPT0gMCkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogUmVxdWVzdGVkIEJvbmpvdXIgc2VydmljZSBub3QgIgogCQkJICAgImF2YWlsYWJsZSIpOworCQlpZiAod3BhYnVmX3RhaWxyb29tKHJlc3ApIDwgNSkKKwkJCXJldHVybjsKKworCQkvKiBMZW5ndGggKHRvIGJlIGZpbGxlZCkgKi8KKwkJbGVuX3BvcyA9IHdwYWJ1Zl9wdXQocmVzcCwgMik7CisJCXdwYWJ1Zl9wdXRfdTgocmVzcCwgUDJQX1NFUlZfQk9OSk9VUik7CisJCXdwYWJ1Zl9wdXRfdTgocmVzcCwgc3J2X3RyYW5zX2lkKTsKIAogCQkvKiBTdGF0dXMgQ29kZSAqLwogCQl3cGFidWZfcHV0X3U4KHJlc3AsIFAyUF9TRF9SRVFVRVNURURfSU5GT19OT1RfQVZBSUxBQkxFKTsKIAkJLyogUmVzcG9uc2UgRGF0YTogZW1wdHkgKi8KIAkJV1BBX1BVVF9MRTE2KGxlbl9wb3MsICh1OCAqKSB3cGFidWZfcHV0KHJlc3AsIDApIC0gbGVuX3BvcyAtCiAJCQkgICAgIDIpOwotCQlyZXR1cm47CiAJfQotCi0JLyogU3RhdHVzIENvZGUgKi8KLQl3cGFidWZfcHV0X3U4KHJlc3AsIFAyUF9TRF9TVUNDRVNTKTsKLQl3cGFfaGV4ZHVtcF9hc2NpaShNU0dfREVCVUcsICJQMlA6IE1hdGNoaW5nIEJvbmpvdXIgc2VydmljZSIsCi0JCQkgIHdwYWJ1Zl9oZWFkKGJzcnYtPnJlc3ApLCB3cGFidWZfbGVuKGJzcnYtPnJlc3ApKTsKLQotCWlmICh3cGFidWZfdGFpbHJvb20ocmVzcCkgPj0KLQkgICAgd3BhYnVmX2xlbihic3J2LT5xdWVyeSkgKyB3cGFidWZfbGVuKGJzcnYtPnJlc3ApKSB7Ci0JCS8qIFJlc3BvbnNlIERhdGEgKi8KLQkJd3BhYnVmX3B1dF9idWYocmVzcCwgYnNydi0+cXVlcnkpOyAvKiBLZXkgKi8KLQkJd3BhYnVmX3B1dF9idWYocmVzcCwgYnNydi0+cmVzcCk7IC8qIFZhbHVlICovCi0JfQotCVdQQV9QVVRfTEUxNihsZW5fcG9zLCAodTggKikgd3BhYnVmX3B1dChyZXNwLCAwKSAtIGxlbl9wb3MgLSAyKTsKIH0KIAogCkBAIC0xOTczLDE0ICsyMTU1LDYgQEAKIHsKIAlzdHJ1Y3QgcDJwX3Nydl9ib25qb3VyICpic3J2OwogCi0JYnNydiA9IHdwYXNfcDJwX3NlcnZpY2VfZ2V0X2JvbmpvdXIod3BhX3MsIHF1ZXJ5KTsKLQlpZiAoYnNydikgewotCQl3cGFidWZfZnJlZShxdWVyeSk7Ci0JCXdwYWJ1Zl9mcmVlKGJzcnYtPnJlc3ApOwotCQlic3J2LT5yZXNwID0gcmVzcDsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJYnNydiA9IG9zX3phbGxvYyhzaXplb2YoKmJzcnYpKTsKIAlpZiAoYnNydiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CkBAIC0yMTg1LDE4ICsyMzU5LDE1IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZmRlZiBBTkRST0lEX1AyUAotCS8qIElmIHByb3Zpc2lvbiBkaXNjb3ZlcnkgZmFpbGVkIGl0IGlzIHNhZmUgdG8gY2FuY2VsIHRoZSB0aW1lciBoZXJlIGFuZAotCSAqIGFsc28gZG8gbm90IHN0YXJ0IHRoZSBqb2luICovCi0JaWYgKHdwYV9zLT5wZW5kaW5nX3BkX2JlZm9yZV9qb2luICYmCi0JICAgIChvc19tZW1jbXAocGVlciwgd3BhX3MtPnBlbmRpbmdfam9pbl9kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgfHwKLQkgICAgIG9zX21lbWNtcChwZWVyLCB3cGFfcy0+cGVuZGluZ19qb2luX2lmYWNlX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSkgeworCWlmIChzdGF0dXMgPT0gUDJQX1BST1ZfRElTQ19USU1FT1VUX0pPSU4pIHsKIAkJd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gPSAwOwotCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogRG8gbm90IFN0YXJ0IHBlbmRpbmcgIgotCQkJICAgImpvaW4tZXhpc3RpbmctZ3JvdXAgb3BlcmF0aW9uIik7Ci0JCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0YXJ0aW5nIHBlbmRpbmcgIgorCQkJICAgImpvaW4tZXhpc3RpbmctZ3JvdXAgb3BlcmF0aW9uIChubyBBQ0sgZm9yIFBEICIKKwkJCSAgICJSZXEgYXR0ZW1wdHMpIik7CisJCXdwYXNfcDJwX2pvaW5fc3RhcnQod3BhX3MpOworCQlyZXR1cm47CiAJfQotI2VuZGlmIC8qIEFORFJPSURfUDJQICovCisKIAl3cGFfbXNnKHdwYV9zLCBNU0dfSU5GTywgUDJQX0VWRU5UX1BST1ZfRElTQ19GQUlMVVJFCiAJCSIgcDJwX2Rldl9hZGRyPSIgTUFDU1RSICIgc3RhdHVzPSVkIiwKIAkJTUFDMlNUUihwZWVyKSwgc3RhdHVzKTsKQEAgLTIzMjcsNiArMjQ5OCw3IEBACiAJCQl3cGFzX3AycF9ncm91cF9hZGRfcGVyc2lzdGVudCgKIAkJCQl3cGFfcywgcywgZ28sIGdvID8gb3BfZnJlcSA6IDAsIDApOwogCQl9IGVsc2UgaWYgKGJzc2lkKSB7CisJCQl3cGFfcy0+dXNlcl9pbml0aWF0ZWRfcGQgPSAwOwogCQkJd3Bhc19wMnBfam9pbih3cGFfcywgYnNzaWQsIGdvX2Rldl9hZGRyLAogCQkJCSAgICAgIHdwYV9zLT5wMnBfd3BzX21ldGhvZCwgMCk7CiAJCX0KQEAgLTI4MzksNiArMzAxMSw4IEBACiAKIAlwMnAucDJwX2ludHJhX2JzcyA9IHdwYV9zLT5jb25mLT5wMnBfaW50cmFfYnNzOwogCisJcDJwLm1heF9saXN0ZW4gPSB3cGFfcy0+bWF4X3JlbWFpbl9vbl9jaGFuOworCiAjaWZkZWYgQU5EUk9JRF9QMlAKIAlpZih3cGFfcy0+ZHJ2X2ZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19NVUxUSV9DSEFOTkVMX0NPTkNVUlJFTlQpIHsKIAkJcDJwLnAycF9jb25jdXJyZW5jeSA9IFAyUF9NVUxUSV9DSEFOTkVMX0NPTkNVUlJFTlQ7CkBAIC0yODg4LDcgKzMwNjIsNiBAQAogCXdwYV9zLT5nb19wYXJhbXMgPSBOVUxMOwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX2dyb3VwX2Zvcm1hdGlvbl90aW1lb3V0LCB3cGFfcywgTlVMTCk7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfam9pbl9zY2FuLCB3cGFfcywgTlVMTCk7Ci0JZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfcGRfYmVmb3JlX2pvaW5fdGltZW91dCwgd3BhX3MsIE5VTEwpOwogCXdwYV9zLT5wMnBfbG9uZ19saXN0ZW4gPSAwOwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX2xvbmdfbGlzdGVuX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKIAllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3AycF9ncm91cF9pZGxlX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKQEAgLTI5NDksNiArMzEyMiw4IEBACiAKIHN0YXRpYyBpbnQgd3Bhc19wMnBfY3JlYXRlX2lmYWNlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7CisJaWYgKHdwYV9zLT5jb25mLT5wMnBfbm9fZ3JvdXBfaWZhY2UpCisJCXJldHVybiAwOyAvKiBzZXBhcmF0ZSBpbnRlcmZhY2UgZGlzYWJsZWQgcGVyIGNvbmZpZ3VyYXRpb24gKi8KIAlpZiAod3BhX3MtPmRydl9mbGFncyAmCiAJICAgIChXUEFfRFJJVkVSX0ZMQUdTX1AyUF9ERURJQ0FURURfSU5URVJGQUNFIHwKIAkgICAgIFdQQV9EUklWRVJfRkxBR1NfUDJQX01HTVRfQU5EX05PTl9QMlApKQpAQCAtMjk2OSw3ICszMTQ0LDcgQEAKIAkJCQkgZW51bSBwMnBfd3BzX21ldGhvZCB3cHNfbWV0aG9kLAogCQkJCSBpbnQgZ29faW50ZW50LCBjb25zdCB1OCAqb3duX2ludGVyZmFjZV9hZGRyLAogCQkJCSB1bnNpZ25lZCBpbnQgZm9yY2VfZnJlcSwgaW50IHBlcnNpc3RlbnRfZ3JvdXAsCi0JCQkJIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCkKKwkJCQkgc3RydWN0IHdwYV9zc2lkICpzc2lkLCB1bnNpZ25lZCBpbnQgcHJlZl9mcmVxKQogewogCWlmIChwZXJzaXN0ZW50X2dyb3VwICYmIHdwYV9zLT5jb25mLT5wZXJzaXN0ZW50X3JlY29ubmVjdCkKIAkJcGVyc2lzdGVudF9ncm91cCA9IDI7CkBAIC0yOTkxLDcgKzMxNjYsNyBAQAogCQkJICAgZ29faW50ZW50LCBvd25faW50ZXJmYWNlX2FkZHIsIGZvcmNlX2ZyZXEsCiAJCQkgICBwZXJzaXN0ZW50X2dyb3VwLCBzc2lkID8gc3NpZC0+c3NpZCA6IE5VTEwsCiAJCQkgICBzc2lkID8gc3NpZC0+c3NpZF9sZW4gOiAwLAotCQkJICAgd3BhX3MtPnAycF9wZF9iZWZvcmVfZ29fbmVnKTsKKwkJCSAgIHdwYV9zLT5wMnBfcGRfYmVmb3JlX2dvX25lZywgcHJlZl9mcmVxKTsKIH0KIAogCkBAIC0zMDAwLDcgKzMxNzUsNyBAQAogCQkJCWVudW0gcDJwX3dwc19tZXRob2Qgd3BzX21ldGhvZCwKIAkJCQlpbnQgZ29faW50ZW50LCBjb25zdCB1OCAqb3duX2ludGVyZmFjZV9hZGRyLAogCQkJCXVuc2lnbmVkIGludCBmb3JjZV9mcmVxLCBpbnQgcGVyc2lzdGVudF9ncm91cCwKLQkJCQlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQpCisJCQkJc3RydWN0IHdwYV9zc2lkICpzc2lkLCB1bnNpZ25lZCBpbnQgcHJlZl9mcmVxKQogewogCWlmIChwZXJzaXN0ZW50X2dyb3VwICYmIHdwYV9zLT5jb25mLT5wZXJzaXN0ZW50X3JlY29ubmVjdCkKIAkJcGVyc2lzdGVudF9ncm91cCA9IDI7CkBAIC0zMDExLDcgKzMxODYsNyBAQAogCXJldHVybiBwMnBfYXV0aG9yaXplKHdwYV9zLT5nbG9iYWwtPnAycCwgcGVlcl9hZGRyLCB3cHNfbWV0aG9kLAogCQkJICAgICBnb19pbnRlbnQsIG93bl9pbnRlcmZhY2VfYWRkciwgZm9yY2VfZnJlcSwKIAkJCSAgICAgcGVyc2lzdGVudF9ncm91cCwgc3NpZCA/IHNzaWQtPnNzaWQgOiBOVUxMLAotCQkJICAgICBzc2lkID8gc3NpZC0+c3NpZF9sZW4gOiAwKTsKKwkJCSAgICAgc3NpZCA/IHNzaWQtPnNzaWRfbGVuIDogMCwgcHJlZl9mcmVxKTsKIH0KIAogCkBAIC0zMDM4LDIxICszMjEzLDYgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB3cGFzX3AycF9wZF9iZWZvcmVfam9pbl90aW1lb3V0KHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpCi17Ci0Jc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IGVsb29wX2N0eDsKLQlpZiAoIXdwYV9zLT5wZW5kaW5nX3BkX2JlZm9yZV9qb2luKQotCQlyZXR1cm47Ci0JLyoKLQkgKiBQcm92aXNpb24gRGlzY292ZXJ5IFJlc3BvbnNlIG1heSBoYXZlIGJlZW4gbG9zdCAtIHRyeSB0byBjb25uZWN0Ci0JICogYW55d2F5IHNpbmNlIHdlIGRvIG5vdCBuZWVkIGFueSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgUEQuCi0JICovCi0Jd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFBEIHRpbWVvdXQgZm9yIGpvaW4tZXhpc3RpbmctZ3JvdXAgLSAiCi0JCSAgICJ0cnkgdG8gY29ubmVjdCBhbnl3YXkiKTsKLQl3cGFzX3AycF9qb2luX3N0YXJ0KHdwYV9zKTsKLX0KLQotCiBzdGF0aWMgaW50IHdwYXNfY2hlY2tfZnJlcV9jb25mbGljdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBpbnQgZnJlcSkKIHsKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKmlmYWNlOwpAQCAtMzE3MCw3ICszMzMwLDcgQEAKIAkJaWYgKHAycF9wcm92X2Rpc2NfcmVxKHdwYV9zLT5nbG9iYWwtPnAycCwKIAkJCQkgICAgICB3cGFfcy0+cGVuZGluZ19qb2luX2Rldl9hZGRyLAogCQkJCSAgICAgIHdwYV9zLT5wZW5kaW5nX3BkX2NvbmZpZ19tZXRob2RzLCBqb2luLAotCQkJCSAgICAgIDApIDwgMCkgeworCQkJCSAgICAgIDAsIHdwYV9zLT51c2VyX2luaXRpYXRlZF9wZCkgPCAwKSB7CiAJCQl3cGFfcy0+cDJwX2F1dG9fcGQgPSAwOwogCQkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sIFAyUF9FVkVOVF9QUk9WX0RJU0NfRkFJTFVSRQogCQkJCSIgcDJwX2Rldl9hZGRyPSIgTUFDU1RSICIgc3RhdHVzPU4vQSIsCkBAIC0zMjgwLDI1ICszNDQwLDEzIEBACiAKIAkJaWYgKHAycF9wcm92X2Rpc2NfcmVxKHdwYV9zLT5nbG9iYWwtPnAycCwKIAkJCQkgICAgICB3cGFfcy0+cGVuZGluZ19qb2luX2Rldl9hZGRyLCBtZXRob2QsIDEsCi0JCQkJICAgICAgZnJlcSkgPCAwKSB7CisJCQkJICAgICAgZnJlcSwgd3BhX3MtPnVzZXJfaW5pdGlhdGVkX3BkKSA8IDApIHsKIAkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBGYWlsZWQgdG8gc2VuZCBQcm92aXNpb24gIgogCQkJCSAgICJEaXNjb3ZlcnkgUmVxdWVzdCBiZWZvcmUgam9pbmluZyBhbiAiCiAJCQkJICAgImV4aXN0aW5nIGdyb3VwIik7CiAJCQl3cGFfcy0+cGVuZGluZ19wZF9iZWZvcmVfam9pbiA9IDA7CiAJCQlnb3RvIHN0YXJ0OwogCQl9Ci0KLQkJLyoKLQkJICogQWN0dWFsIGpvaW4gb3BlcmF0aW9uIHdpbGwgYmUgc3RhcnRlZCBmcm9tIHRoZSBBY3Rpb24gZnJhbWUKLQkJICogVFggc3RhdHVzIGNhbGxiYWNrIChpZiBubyBBQ0sgaXMgcmVjZWl2ZWQpIG9yIHdoZW4gdGhlCi0JCSAqIFByb3Zpc2lvbiBEaXNjb3ZlcnkgUmVzcG9uc2UgaXMgcmVjZWl2ZWQuIFVzZSBhIHNob3J0Ci0JCSAqIHRpbWVvdXQgYXMgYSBiYWNrdXAgbWVjaGFuaXNtIHNob3VsZCB0aGUgUHJvdmlzaW9uIERpc2NvdmVyeQotCQkgKiBSZXNwb25zZSBiZSBsb3N0IGZvciBhbnkgcmVhc29uLgotCQkgKi8KLQkJZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfcGRfYmVmb3JlX2pvaW5fdGltZW91dCwgd3BhX3MsCi0JCQkJICAgICBOVUxMKTsKLQkJZWxvb3BfcmVnaXN0ZXJfdGltZW91dCgyLCAwLCB3cGFzX3AycF9wZF9iZWZvcmVfam9pbl90aW1lb3V0LAotCQkJCSAgICAgICB3cGFfcywgTlVMTCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM0MjUsNyArMzU3Myw2IEBACiAJc3RydWN0IHAycF9nb19uZWdfcmVzdWx0cyByZXM7CiAJc3RydWN0IHdwYV9ic3MgKmJzczsKIAotCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfcDJwX3BkX2JlZm9yZV9qb2luX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKIAlncm91cCA9IHdwYXNfcDJwX2dldF9ncm91cF9pZmFjZSh3cGFfcywgMCwgMCk7CiAJaWYgKGdyb3VwID09IE5VTEwpCiAJCXJldHVybiAtMTsKQEAgLTM0MzYsNiArMzU4Myw3IEBACiAJfQogCiAJZ3JvdXAtPnAycF9pbl9wcm92aXNpb25pbmcgPSAxOworCXdwYV9zLT5nbG9iYWwtPnAycF9ncm91cF9mb3JtYXRpb24gPSB3cGFfczsKIAlncm91cC0+cDJwX2ZhbGxiYWNrX3RvX2dvX25lZyA9IHdwYV9zLT5wMnBfZmFsbGJhY2tfdG9fZ29fbmVnOwogCiAJb3NfbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKQEAgLTM0OTksNyArMzY0Nyw3IEBACiAJCSAgICAgaW50IGdvX2ludGVudCwgaW50IGZyZXEsIGludCBwZXJzaXN0ZW50X2lkLCBpbnQgcGQsCiAJCSAgICAgaW50IGh0NDApCiB7Ci0JaW50IGZvcmNlX2ZyZXEgPSAwLCBvcGVyX2ZyZXEgPSAwOworCWludCBmb3JjZV9mcmVxID0gMCwgcHJlZl9mcmVxID0gMCwgb3Blcl9mcmVxID0gMDsKIAl1OCBic3NpZFtFVEhfQUxFTl07CiAJaW50IHJldCA9IDA7CiAJZW51bSB3cGFfZHJpdmVyX2lmX3R5cGUgaWZ0eXBlOwpAQCAtMzU2NSw2ICszNzEzLDcgQEAKIAkJCQkgICB3cGFfcy0+cDJwX2F1dG9fc3RhcnRlZC5zZWMsCiAJCQkJICAgd3BhX3MtPnAycF9hdXRvX3N0YXJ0ZWQudXNlYyk7CiAJCX0KKwkJd3BhX3MtPnVzZXJfaW5pdGlhdGVkX3BkID0gMTsKIAkJaWYgKHdwYXNfcDJwX2pvaW4od3BhX3MsIGlmYWNlX2FkZHIsIGRldl9hZGRyLCB3cHNfbWV0aG9kLAogCQkJCSAgYXV0b19qb2luKSA8IDApCiAJCQlyZXR1cm4gLTE7CkBAIC0zNjEyLDYgKzM3NjEsMTMgQEAKIAkJCSAgICIoJXUgTUh6KSBub3QgYXZhaWxhYmxlIGZvciBQMlAgLSB0cnkgdG8gdXNlICIKIAkJCSAgICJhbm90aGVyIGNoYW5uZWwiLCBvcGVyX2ZyZXEpOwogCQlmb3JjZV9mcmVxID0gMDsKKwl9IGVsc2UgaWYgKG9wZXJfZnJlcSA+IDAgJiYKKwkJICAgKHdwYV9zLT5kcnZfZmxhZ3MgJgorCQkgICAgV1BBX0RSSVZFUl9GTEFHU19NVUxUSV9DSEFOTkVMX0NPTkNVUlJFTlQpKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBUcnlpbmcgdG8gcHJlZmVyIHRoZSBjaGFubmVsIHdlICIKKwkJCSAgICJhcmUgYWxyZWFkeSB1c2luZyAoJXUgTUh6KSBvbiBhbm90aGVyIGludGVyZmFjZSIsCisJCQkgICBvcGVyX2ZyZXEpOworCQlwcmVmX2ZyZXEgPSBvcGVyX2ZyZXE7CiAJfSBlbHNlIGlmIChvcGVyX2ZyZXEgPiAwKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBUcnlpbmcgdG8gZm9yY2UgdXMgdG8gdXNlIHRoZSAiCiAJCQkgICAiY2hhbm5lbCB3ZSBhcmUgYWxyZWFkeSB1c2luZyAoJXUgTUh6KSBvbiBhbm90aGVyICIKQEAgLTM2MzksMTUgKzM3OTUsMTUgQEAKIAlpZiAoYXV0aCkgewogCQlpZiAod3Bhc19wMnBfYXV0aF9nb19uZWcod3BhX3MsIHBlZXJfYWRkciwgd3BzX21ldGhvZCwKIAkJCQkJIGdvX2ludGVudCwgaWZfYWRkciwKLQkJCQkJIGZvcmNlX2ZyZXEsIHBlcnNpc3RlbnRfZ3JvdXAsIHNzaWQpIDwKLQkJICAgIDApCisJCQkJCSBmb3JjZV9mcmVxLCBwZXJzaXN0ZW50X2dyb3VwLCBzc2lkLAorCQkJCQkgcHJlZl9mcmVxKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKHdwYXNfcDJwX3N0YXJ0X2dvX25lZyh3cGFfcywgcGVlcl9hZGRyLCB3cHNfbWV0aG9kLAogCQkJCSAgZ29faW50ZW50LCBpZl9hZGRyLCBmb3JjZV9mcmVxLAotCQkJCSAgcGVyc2lzdGVudF9ncm91cCwgc3NpZCkgPCAwKSB7CisJCQkJICBwZXJzaXN0ZW50X2dyb3VwLCBzc2lkLCBwcmVmX2ZyZXEpIDwgMCkgewogCQlpZiAod3BhX3MtPmNyZWF0ZV9wMnBfaWZhY2UpCiAJCQl3cGFzX3AycF9yZW1vdmVfcGVuZGluZ19ncm91cF9pbnRlcmZhY2Uod3BhX3MpOwogCQlyZXR1cm4gLTE7CkBAIC0zNzA2LDEyICszODYyLDEyIEBACiB7CiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IENhbmNlbCByZW1haW4tb24tY2hhbm5lbCBjYWxsYmFjayAiCiAJCSAgICIocDJwX2xvbmdfbGlzdGVuPSVkIG1zIHBlbmRpbmdfYWN0aW9uX3R4PSVwKSIsCi0JCSAgIHdwYV9zLT5wMnBfbG9uZ19saXN0ZW4sIHdwYV9zLT5wZW5kaW5nX2FjdGlvbl90eCk7CisJCSAgIHdwYV9zLT5wMnBfbG9uZ19saXN0ZW4sIG9mZmNoYW5uZWxfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpKTsKIAlpZiAod3BhX3MtPmdsb2JhbC0+cDJwX2Rpc2FibGVkIHx8IHdwYV9zLT5nbG9iYWwtPnAycCA9PSBOVUxMKQogCQlyZXR1cm47CiAJaWYgKHAycF9saXN0ZW5fZW5kKHdwYV9zLT5nbG9iYWwtPnAycCwgZnJlcSkgPiAwKQogCQlyZXR1cm47IC8qIFAyUCBtb2R1bGUgc3RhcnRlZCBhIG5ldyBvcGVyYXRpb24gKi8KLQlpZiAod3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4KQorCWlmIChvZmZjaGFubmVsX3BlbmRpbmdfYWN0aW9uX3R4KHdwYV9zKSkKIAkJcmV0dXJuOwogCWlmICh3cGFfcy0+cDJwX2xvbmdfbGlzdGVuID4gMCkKIAkJd3BhX3MtPnAycF9sb25nX2xpc3RlbiAtPSB3cGFfcy0+bWF4X3JlbWFpbl9vbl9jaGFuOwpAQCAtMzg5OSw3ICs0MDU1LDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IHJ1bm5pbmcgZmluZCBkdXJpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50ICovCiAJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0b3AgYW55IG9uLWdvaW5nIFAyUCBGSU5EIik7Ci0Jd3Bhc19wMnBfc3RvcF9maW5kKHdwYV9zKTsKKwl3cGFzX3AycF9zdG9wX2ZpbmRfb3Blcih3cGFfcyk7CiAKIAlpZiAoZnJlcSA9PSAyKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBSZXF1ZXN0IHRvIHN0YXJ0IEdPIG9uIDIuNCBHSHogIgpAQCAtNDAzMCw3ICs0MTg2LDcgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBydW5uaW5nIGZpbmQgZHVyaW5nIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLwotCXdwYXNfcDJwX3N0b3BfZmluZCh3cGFfcyk7CisJd3Bhc19wMnBfc3RvcF9maW5kX29wZXIod3BhX3MpOwogCiAJd3BhX3MtPnAycF9mYWxsYmFja190b19nb19uZWcgPSAwOwogCkBAIC00MDQ0LDE0ICs0MjAwLDE4IEBACiAJCXJldHVybiAtMTsKIAogCXBhcmFtcy5yb2xlX2dvID0gMTsKLQlpZiAoc3NpZC0+cGFzc3BocmFzZSA9PSBOVUxMIHx8Ci0JICAgIG9zX3N0cmxlbihzc2lkLT5wYXNzcGhyYXNlKSA+PSBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKSB7Ci0JCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBJbnZhbGlkIHBhc3NwaHJhc2UgaW4gcGVyc2lzdGVudCAiCi0JCQkgICAiZ3JvdXAiKTsKLQkJcmV0dXJuIC0xOworCXBhcmFtcy5wc2tfc2V0ID0gc3NpZC0+cHNrX3NldDsKKwlpZiAocGFyYW1zLnBza19zZXQpCisJCW9zX21lbWNweShwYXJhbXMucHNrLCBzc2lkLT5wc2ssIHNpemVvZihwYXJhbXMucHNrKSk7CisJaWYgKHNzaWQtPnBhc3NwaHJhc2UpIHsKKwkJaWYgKG9zX3N0cmxlbihzc2lkLT5wYXNzcGhyYXNlKSA+PSBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlAyUDogSW52YWxpZCBwYXNzcGhyYXNlIGluICIKKwkJCQkgICAicGVyc2lzdGVudCBncm91cCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW9zX3N0cmxjcHkocGFyYW1zLnBhc3NwaHJhc2UsIHNzaWQtPnBhc3NwaHJhc2UsCisJCQkgICBzaXplb2YocGFyYW1zLnBhc3NwaHJhc2UpKTsKIAl9Ci0Jb3Nfc3RybGNweShwYXJhbXMucGFzc3BocmFzZSwgc3NpZC0+cGFzc3BocmFzZSwKLQkJICAgc2l6ZW9mKHBhcmFtcy5wYXNzcGhyYXNlKSk7CiAJb3NfbWVtY3B5KHBhcmFtcy5zc2lkLCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkX2xlbik7CiAJcGFyYW1zLnNzaWRfbGVuID0gc3NpZC0+c3NpZF9sZW47CiAJcGFyYW1zLnBlcnNpc3RlbnRfZ3JvdXAgPSAxOwpAQCAtNDI1Myw3ICs0NDEzLDcgQEAKIAogCXJldHVybiBwMnBfcHJvdl9kaXNjX3JlcSh3cGFfcy0+Z2xvYmFsLT5wMnAsIHBlZXJfYWRkciwKIAkJCQkgY29uZmlnX21ldGhvZHMsIHVzZSA9PSBXUEFTX1AyUF9QRF9GT1JfSk9JTiwKLQkJCQkgMCk7CisJCQkJIDAsIDEpOwogfQogCiAKQEAgLTQyNjYsMTMgKzQ0MjYsMTIgQEAKIAogc3RhdGljIHZvaWQgd3Bhc19wMnBfY2xlYXJfcGVuZGluZ19hY3Rpb25fdHgoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKLQlpZiAoIXdwYV9zLT5wZW5kaW5nX2FjdGlvbl90eCkKKwlpZiAoIW9mZmNoYW5uZWxfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpKQogCQlyZXR1cm47CiAKIAl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogRHJvcCBwZW5kaW5nIEFjdGlvbiBUWCBkdWUgdG8gbmV3ICIKIAkJICAgIm9wZXJhdGlvbiByZXF1ZXN0Iik7Ci0Jd3BhYnVmX2ZyZWUod3BhX3MtPnBlbmRpbmdfYWN0aW9uX3R4KTsKLQl3cGFfcy0+cGVuZGluZ19hY3Rpb25fdHggPSBOVUxMOworCW9mZmNoYW5uZWxfY2xlYXJfcGVuZGluZ19hY3Rpb25fdHgod3BhX3MpOwogfQogCiAKQEAgLTQyOTksNyArNDQ1OCw3IEBACiB9CiAKIAotdm9pZCB3cGFzX3AycF9zdG9wX2ZpbmQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKK3N0YXRpYyBpbnQgd3Bhc19wMnBfc3RvcF9maW5kX29wZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAl3cGFzX3AycF9jbGVhcl9wZW5kaW5nX2FjdGlvbl90eCh3cGFfcyk7CiAJd3BhX3MtPnAycF9sb25nX2xpc3RlbiA9IDA7CkBAIC00MzA5LDEyICs0NDY4LDIwIEBACiAKIAlpZiAod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfUDJQX01HTVQpIHsKIAkJd3BhX2Rydl9wMnBfc3RvcF9maW5kKHdwYV9zKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAod3BhX3MtPmdsb2JhbC0+cDJwKQogCQlwMnBfc3RvcF9maW5kKHdwYV9zLT5nbG9iYWwtPnAycCk7CiAKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHdwYXNfcDJwX3N0b3BfZmluZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCWlmICh3cGFzX3AycF9zdG9wX2ZpbmRfb3Blcih3cGFfcykgPiAwKQorCQlyZXR1cm47CiAJd3Bhc19wMnBfcmVtb3ZlX3BlbmRpbmdfZ3JvdXBfaW50ZXJmYWNlKHdwYV9zKTsKIH0KIApAQCAtNDc0Myw4ICs0OTEwLDE1IEBACiAKIHN0YXRpYyBpbnQgd3Bhc19wMnBfaXNfY2xpZW50KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCiB7Ci0JcmV0dXJuIHdwYV9zLT5jdXJyZW50X3NzaWQgIT0gTlVMTCAmJgotCQl3cGFfcy0+Y3VycmVudF9zc2lkLT5wMnBfZ3JvdXAgJiYKKwlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIGN1cnJlbnRfc3NpZCBjYW4gYmUgY2xlYXJlZCB3aGVuIFAyUCBjbGllbnQgaW50ZXJmYWNlIGdldHMKKwkJICogZGlzY29ubmVjdGVkLCBzbyBhc3N1bWUgdGhpcyBpbnRlcmZhY2Ugd2FzIHVzZWQgYXMgUDJQCisJCSAqIGNsaWVudC4KKwkJICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gd3BhX3MtPmN1cnJlbnRfc3NpZC0+cDJwX2dyb3VwICYmCiAJCXdwYV9zLT5jdXJyZW50X3NzaWQtPm1vZGUgPT0gV1BBU19NT0RFX0lORlJBOwogfQogCkBAIC01MTc5LDYgKzUzNTMsMTMgQEAKIH0KIAogCitzdGF0aWMgdm9pZCB3cGFzX3AycF9zY2FuX3Jlc19pZ25vcmUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHRzICpzY2FuX3JlcykKK3sKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogSWdub3JlIHNjYW4gcmVzdWx0cyIpOworfQorCisKIGludCB3cGFzX3AycF9jYW5jZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlzdHJ1Y3Qgd3BhX2dsb2JhbCAqZ2xvYmFsID0gd3BhX3MtPmdsb2JhbDsKQEAgLTUyMDIsNiArNTM4MywxOCBAQAogCQlmb3VuZCA9IDE7CiAJfQogCisJaWYgKHdwYV9zLT5zY2FuX3Jlc19oYW5kbGVyID09IHdwYXNfcDJwX3NjYW5fcmVzX2pvaW4pIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IFN0b3AgcGVuZGluZyBzY2FuIGZvciBqb2luIik7CisJCXdwYV9zLT5zY2FuX3Jlc19oYW5kbGVyID0gd3Bhc19wMnBfc2Nhbl9yZXNfaWdub3JlOworCQlmb3VuZCA9IDE7CisJfQorCisJaWYgKHdwYV9zLT5wZW5kaW5nX3BkX2JlZm9yZV9qb2luKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBTdG9wIHBlbmRpbmcgUEQgYmVmb3JlIGpvaW4iKTsKKwkJd3BhX3MtPnBlbmRpbmdfcGRfYmVmb3JlX2pvaW4gPSAwOworCQlmb3VuZCA9IDE7CisJfQorCiAJd3Bhc19wMnBfc3RvcF9maW5kKHdwYV9zKTsKIAogCWZvciAod3BhX3MgPSBnbG9iYWwtPmlmYWNlczsgd3BhX3M7IHdwYV9zID0gd3BhX3MtPm5leHQpIHsKQEAgLTUzNjYsNyArNTU1OSw2IEBACiAJCQkJCWludCBncm91cF9hZGRlZCkKIHsKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKmdyb3VwID0gd3BhX3M7Ci0JZWxvb3BfY2FuY2VsX3RpbWVvdXQod3Bhc19wMnBfcGRfYmVmb3JlX2pvaW5fdGltZW91dCwgd3BhX3MsIE5VTEwpOwogCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnBfZ3JvdXBfZm9ybWF0aW9uKQogCQlncm91cCA9IHdwYV9zLT5nbG9iYWwtPnAycF9ncm91cF9mb3JtYXRpb247CiAJd3BhX3MgPSB3cGFfcy0+cGFyZW50OwpAQCAtNTQzOCw3ICs1NjMwLDggQEAKIH0KIAogI2lmZGVmIEFORFJPSURfUDJQCi1pbnQgd3Bhc19wMnBfaGFuZGxlX2ZyZXF1ZW5jeV9jb25mbGljdHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IGZyZXEpCitpbnQgd3Bhc19wMnBfaGFuZGxlX2ZyZXF1ZW5jeV9jb25mbGljdHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IGZyZXEsCisJc3RydWN0IHdwYV9zc2lkICpzc2lkKQogewogCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqaWZhY2UgPSBOVUxMOwogCXN0cnVjdCBwMnBfZGF0YSAqcDJwID0gd3BhX3MtPmdsb2JhbC0+cDJwOwpAQCAtNTQ2NCwxNyArNTY1NywzMiBAQAogCQkJLyogSWYgR08gY2Fubm90IGJlIG1vdmVkIG9yIGlmIHRoZSBjb25mbGljdGluZyBpbnRlcmZhY2UgaXMgYQogCQkJICogUDJQIENsaWVudCwgcmVtb3ZlIHRoZSBpbnRlcmZhY2UgZGVwZW5kaW5nIHVwIG9uIHRoZSBjb25uZWN0aW9uCiAJCQkgKiBwcmlvcml0eSAqLwotCQkJaWYgKCF3cGFzX2lzX3AycF9wcmlvcml0aXplZCh3cGFfcykpIHsKKwkJCWlmKCF3cGFzX2lzX3AycF9wcmlvcml0aXplZChpZmFjZSkpIHsKIAkJCQkvKiBTVEEgY29ubmVjdGlvbiBoYXMgcHJpb3JpdHkgb3ZlciBleGlzdGluZwogCQkJCSAqIFAyUCBjb25uZWN0aW9uLiBTbyByZW1vdmUgdGhlIGludGVyZmFjZSAqLwotCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBSZW1vdmluZyBQMlAgY29ubmVjdGlvbiBkdWUgdG8gU2luZ2xlIGNoYW5uZWwgIgorCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBSZW1vdmluZyBQMlAgY29ubmVjdGlvbiBkdWUgdG8gU2luZ2xlIGNoYW5uZWwiCiAJCQkJCQkiY29uY3VycmVudCBtb2RlIGZyZXF1ZW5jeSBjb25mbGljdCIpOwogCQkJCXdwYXNfcDJwX2dyb3VwX2RlbGV0ZShpZmFjZSwgUDJQX0dST1VQX1JFTU9WQUxfRlJFUV9DT05GTElDVCk7CisJCQkJLyogSWYgY29ubmVjdGlvbiBpbiBwcm9ncmVzcyBpcyBwMnAgY29ubmVjdGlvbiwgZG8gbm90IHByb2NlZWQgZm9yIHRoZSBjb25uZWN0aW9uICovCisJCQkJaWYgKHdwYV9zID09IGlmYWNlKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJZWxzZQorCQkJCQkvKiBJZiBjb25uZWN0aW9uIGluIHByb2dyZXNzIGlzIFNUQSBjb25uZWN0aW9uLCBwcm9jZWVkIGZvciB0aGUgY29ubmVjdGlvbiAqLworCQkJCQlyZXR1cm4gMDsKIAkJCX0gZWxzZSB7Ci0JCQkJLyogRXhpc3RpbmcgY29ubmVjdGlvbiBoYXMgdGhlIHByaW9yaXR5LiBEaXNhYmxlIHRoZSBuZXdseQotCQkJCSAqIHNlbGVjdGVkIG5ldHdvcmsgYW5kIGxldCB0aGUgYXBwbGljYXRpb24ga25vdyBhYm91dCBpdC4KLSAJCQkJICovCi0JCQkJcmV0dXJuIC0xOworCQkJCS8qIFAycCBjb25uZWN0aW9uIGhhcyBwcmlvcml0eSwgZGlzYWJsZSB0aGUgU1RBIG5ldHdvcmsqLworCQkJCXdwYV9zdXBwbGljYW50X2Rpc2FibGVfbmV0d29yayh3cGFfcy0+Z2xvYmFsLT5pZmFjZXMsIHNzaWQpOworCQkJCXdwYV9tc2cod3BhX3MtPmdsb2JhbC0+aWZhY2VzLCBNU0dfSU5GTywgV1BBX0VWRU5UX0ZSRVFfQ09ORkxJQ1QKKwkJCQkJIiBpZD0lZCIsIHNzaWQtPmlkKTsKKwkJCQlvc19tZW1zZXQod3BhX3MtPmdsb2JhbC0+aWZhY2VzLT5wZW5kaW5nX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisJCQkJaWYgKHdwYV9zID09IGlmYWNlKSB7CisJCQkJCS8qIHAycCBjb25uZWN0aW9uIGlzIGluIHByb2dyZXNzLCBjb250aW51ZSBjb25uZWN0aW5nLi4uKi8KKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBTVEEgY29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcywgZG8gbm90IGFsbG93IHRvIGNvbnRpbnVlICovCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9wMnBfc3VwcGxpY2FudC5oIGIvd3BhX3N1cHBsaWNhbnQvcDJwX3N1cHBsaWNhbnQuaAppbmRleCA2ZTRjYzFkLi5hMjdjMWI2IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9wMnBfc3VwcGxpY2FudC5oCisrKyBiL3dwYV9zdXBwbGljYW50L3AycF9zdXBwbGljYW50LmgKQEAgLTI4LDcgKzI4LDcgQEAKIAkJCQkJICB1bnNpZ25lZCBpbnQgZnJlcSk7CiAjaWZkZWYgQU5EUk9JRF9QMlAKIGludCB3cGFzX3AycF9oYW5kbGVfZnJlcXVlbmN5X2NvbmZsaWN0cyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyZXEsIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCk7CiAjZW5kaWYKIGludCB3cGFzX3AycF9ncm91cF9yZW1vdmUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgY2hhciAqaWZuYW1lKTsKIGludCB3cGFzX3AycF9ncm91cF9hZGQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgaW50IHBlcnNpc3RlbnRfZ3JvdXAsCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9wcmVhdXRoX3Rlc3QuYyBiL3dwYV9zdXBwbGljYW50L3ByZWF1dGhfdGVzdC5jCmluZGV4IDYyYjc1MzguLjM1MDNlNjUgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3ByZWF1dGhfdGVzdC5jCisrKyBiL3dwYV9zdXBwbGljYW50L3ByZWF1dGhfdGVzdC5jCkBAIC0zOCwxMiArMzgsNiBAQAogfTsKIAogCi1zdGF0aWMgdm9pZCBfd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHZvaWQgKndwYV9zLCBpbnQgcmVhc29uX2NvZGUpCi17Ci0Jd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHdwYV9zLCByZWFzb25fY29kZSk7Ci19Ci0KLQogc3RhdGljIHZvaWQgX3dwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHZvaWQgKndwYV9zLCBpbnQgcmVhc29uX2NvZGUpCiB7CiAJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUod3BhX3MsIHJlYXNvbl9jb2RlKTsKQEAgLTIzOCw3ICsyMzIsNiBAQAogCWN0eC0+c2V0X3N0YXRlID0gX3dwYV9zdXBwbGljYW50X3NldF9zdGF0ZTsKIAljdHgtPmdldF9zdGF0ZSA9IF93cGFfc3VwcGxpY2FudF9nZXRfc3RhdGU7CiAJY3R4LT5kZWF1dGhlbnRpY2F0ZSA9IF93cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZTsKLQljdHgtPmRpc2Fzc29jaWF0ZSA9IF93cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGU7CiAJY3R4LT5zZXRfa2V5ID0gd3BhX3N1cHBsaWNhbnRfc2V0X2tleTsKIAljdHgtPmdldF9uZXR3b3JrX2N0eCA9IHdwYV9zdXBwbGljYW50X2dldF9uZXR3b3JrX2N0eDsKIAljdHgtPmdldF9ic3NpZCA9IHdwYV9zdXBwbGljYW50X2dldF9ic3NpZDsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3NjYW4uYyBiL3dwYV9zdXBwbGljYW50L3NjYW4uYwppbmRleCAwZjY0MzNiLi5jNTliOGJhIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC9zY2FuLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvc2Nhbi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFdQQSBTdXBwbGljYW50IC0gU2Nhbm5pbmcKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDEwLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTY2LDcgKzY2LDggQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfUDJQCi0JaWYgKCF3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWJsZWQgJiYgd3BhX3MtPmdsb2JhbC0+cDJwKSB7CisJaWYgKCF3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWJsZWQgJiYgd3BhX3MtPmdsb2JhbC0+cDJwICYmCisJICAgICF3cGFfcy0+Y29uZi0+cDJwX2Rpc2FibGVkKSB7CiAJCXdwYV9zLT53cHMtPmRldi5wMnAgPSAxOwogCQlpZiAoIXdwcykgewogCQkJd3BzID0gMTsKQEAgLTgwLDYgKzgxLDE1IEBACiAjZW5kaWYgLyogQ09ORklHX1dQUyAqLwogCiAKKy8qKgorICogd3BhX3N1cHBsaWNhbnRfZW5hYmxlZF9uZXR3b3JrcyAtIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGVuYWJsZWQgbmV0d29ya3MKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBSZXR1cm5zOiAwIGlmIG5vIG5ldHdvcmtzIGFyZSBlbmFibGVkLCA+MCBpZiBuZXR3b3JrcyBhcmUgZW5hYmxlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgYW55IG5ldHdvcmtzIChvciBJbnRlcndvcmtpbmcKKyAqIHdpdGggZW5hYmxlZCBjcmVkZW50aWFscyBhbmQgYXV0b19pbnRlcndvcmtpbmcpIGFyZSBwcmVzZW50IGluIHRoZSBjdXJyZW50CisgKiBjb25maWd1cmF0aW9uLgorICovCiBpbnQgd3BhX3N1cHBsaWNhbnRfZW5hYmxlZF9uZXR3b3JrcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOwpAQCAtMTk4LDYgKzIwOCwxMiBAQAogfQogCiAKKy8qKgorICogd3BhX3N1cHBsaWNhbnRfdHJpZ2dlcl9zY2FuIC0gUmVxdWVzdCBkcml2ZXIgdG8gc3RhcnQgYSBzY2FuCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQHBhcmFtczogU2NhbiBwYXJhbWV0ZXJzCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLwogaW50IHdwYV9zdXBwbGljYW50X3RyaWdnZXJfc2NhbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCXN0cnVjdCB3cGFfZHJpdmVyX3NjYW5fcGFyYW1zICpwYXJhbXMpCiB7CkBAIC00MzksMTEgKzQ1NSw3OCBAQAogfQogCiAKKyNpZmRlZiBDT05GSUdfUDJQCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgZW5hYmxlZCBuZXR3b3JrcyBvciBjcmVkZW50aWFscyB0aGF0IGNvdWxkIGJlCisgKiB1c2VkIGZvciBhIG5vbi1QMlAgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIGludCBub25fcDJwX25ldHdvcmtfZW5hYmxlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKKworCWZvciAoc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOyBzc2lkOyBzc2lkID0gc3NpZC0+bmV4dCkgeworCQlpZiAod3Bhc19uZXR3b3JrX2Rpc2FibGVkKHdwYV9zLCBzc2lkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNzaWQtPnAycF9ncm91cCkKKwkJCXJldHVybiAxOworCX0KKworCWlmICh3cGFfcy0+Y29uZi0+Y3JlZCAmJiB3cGFfcy0+Y29uZi0+aW50ZXJ3b3JraW5nICYmCisJICAgIHdwYV9zLT5jb25mLT5hdXRvX2ludGVyd29ya2luZykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRmluZCB0aGUgb3BlcmF0aW5nIGZyZXF1ZW5jeSBvZiBhbnkgb3RoZXIgdmlydHVhbCBpbnRlcmZhY2UgdGhhdCBpcyB1c2luZworICogdGhlIHNhbWUgcmFkaW8gY29uY3VycmVudGx5LgorICovCitzdGF0aWMgaW50IHNoYXJlZF92aWZfb3Blcl9mcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJY29uc3QgY2hhciAqcm4sICpybjI7CisJc3RydWN0IHdwYV9zdXBwbGljYW50ICppZnM7CisJdTggYnNzaWRbRVRIX0FMRU5dOworCisJaWYgKCF3cGFfcy0+ZHJpdmVyLT5nZXRfcmFkaW9fbmFtZSkKKwkJcmV0dXJuIC0xOworCisJcm4gPSB3cGFfcy0+ZHJpdmVyLT5nZXRfcmFkaW9fbmFtZSh3cGFfcy0+ZHJ2X3ByaXYpOworCWlmIChybiA9PSBOVUxMIHx8IHJuWzBdID09ICdcMCcpCisJCXJldHVybiAtMTsKKworCWZvciAoaWZzID0gd3BhX3MtPmdsb2JhbC0+aWZhY2VzOyBpZnM7IGlmcyA9IGlmcy0+bmV4dCkgeworCQlpZiAoaWZzID09IHdwYV9zIHx8ICFpZnMtPmRyaXZlci0+Z2V0X3JhZGlvX25hbWUpCisJCQljb250aW51ZTsKKworCQlybjIgPSBpZnMtPmRyaXZlci0+Z2V0X3JhZGlvX25hbWUoaWZzLT5kcnZfcHJpdik7CisJCWlmICghcm4yIHx8IG9zX3N0cmNtcChybiwgcm4yKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGlmcy0+Y3VycmVudF9zc2lkID09IE5VTEwgfHwgaWZzLT5hc3NvY19mcmVxID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAoaWZzLT5jdXJyZW50X3NzaWQtPm1vZGUgPT0gV1BBU19NT0RFX0FQIHx8CisJCSAgICBpZnMtPmN1cnJlbnRfc3NpZC0+bW9kZSA9PSBXUEFTX01PREVfUDJQX0dPKQorCQkJcmV0dXJuIGlmcy0+Y3VycmVudF9zc2lkLT5mcmVxdWVuY3k7CisJCWlmICh3cGFfZHJ2X2dldF9ic3NpZChpZnMsIGJzc2lkKSA9PSAwKQorCQkJcmV0dXJuIGlmcy0+YXNzb2NfZnJlcTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KKworCiBzdGF0aWMgdm9pZCB3cGFfc3VwcGxpY2FudF9zY2FuKHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpCiB7CiAJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IGVsb29wX2N0eDsKIAlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7Ci0JaW50IHNjYW5fcmVxID0gMCwgcmV0OworCWVudW0gc2Nhbl9yZXFfdHlwZSBzY2FuX3JlcSA9IE5PUk1BTF9TQ0FOX1JFUTsKKwlpbnQgcmV0OwogCXN0cnVjdCB3cGFidWYgKmV4dHJhX2llID0gTlVMTDsKIAlzdHJ1Y3Qgd3BhX2RyaXZlcl9zY2FuX3BhcmFtcyBwYXJhbXM7CiAJc3RydWN0IHdwYV9kcml2ZXJfc2Nhbl9wYXJhbXMgKnNjYW5fcGFyYW1zOwpAQCAtNDU1LDcgKzUzOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAod3BhX3MtPmRpc2Nvbm5lY3RlZCAmJiAhd3BhX3MtPnNjYW5fcmVxKSB7CisJaWYgKHdwYV9zLT5kaXNjb25uZWN0ZWQgJiYgd3BhX3MtPnNjYW5fcmVxID09IE5PUk1BTF9TQ0FOX1JFUSkgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJEaXNjb25uZWN0ZWQgLSBkbyBub3Qgc2NhbiIpOwogCQl3cGFfc3VwcGxpY2FudF9zZXRfc3RhdGUod3BhX3MsIFdQQV9ESVNDT05ORUNURUQpOwogCQlyZXR1cm47CkBAIC00NjgsNyArNTUxLDcgQEAKIAl9CiAjZW5kaWYKIAlpZiAoIXdwYV9zdXBwbGljYW50X2VuYWJsZWRfbmV0d29ya3Mod3BhX3MpICYmCi0JICAgICF3cGFfcy0+c2Nhbl9yZXEpIHsKKwkgICAgd3BhX3MtPnNjYW5fcmVxID09IE5PUk1BTF9TQ0FOX1JFUSkgewogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJObyBlbmFibGVkIG5ldHdvcmtzIC0gZG8gbm90IHNjYW4iKTsKIAkJd3BhX3N1cHBsaWNhbnRfc2V0X3N0YXRlKHdwYV9zLCBXUEFfSU5BQ1RJVkUpOwogI2lmZGVmIENPTkZJR19QMlAKQEAgLTUxNiw3ICs1OTksNyBAQAogCX0KIAogCXNjYW5fcmVxID0gd3BhX3MtPnNjYW5fcmVxOwotCXdwYV9zLT5zY2FuX3JlcSA9IDA7CisJd3BhX3MtPnNjYW5fcmVxID0gTk9STUFMX1NDQU5fUkVROwogCiAJb3NfbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIApAQCAtNTMzLDcgKzYxNiw3IEBACiAJCWdvdG8gc2NhbjsKIAl9CiAKLQlpZiAoc2Nhbl9yZXEgIT0gMiAmJiB3cGFfcy0+Y29ubmVjdF93aXRob3V0X3NjYW4pIHsKKwlpZiAoc2Nhbl9yZXEgIT0gTUFOVUFMX1NDQU5fUkVRICYmIHdwYV9zLT5jb25uZWN0X3dpdGhvdXRfc2NhbikgewogCQlmb3IgKHNzaWQgPSB3cGFfcy0+Y29uZi0+c3NpZDsgc3NpZDsgc3NpZCA9IHNzaWQtPm5leHQpIHsKIAkJCWlmIChzc2lkID09IHdwYV9zLT5jb25uZWN0X3dpdGhvdXRfc2NhbikKIAkJCQlicmVhazsKQEAgLTU3MSw3ICs2NTQsNyBAQAogCQl9CiAJfQogCi0JaWYgKHNjYW5fcmVxICE9IDIgJiYgd3BhX3MtPmNvbmYtPmFwX3NjYW4gPT0gMikgeworCWlmIChzY2FuX3JlcSAhPSBNQU5VQUxfU0NBTl9SRVEgJiYgd3BhX3MtPmNvbmYtPmFwX3NjYW4gPT0gMikgewogCQl3cGFfcy0+Y29ubmVjdF93aXRob3V0X3NjYW4gPSBOVUxMOwogCQl3cGFfcy0+cHJldl9zY2FuX3dpbGRjYXJkID0gMDsKIAkJd3BhX3N1cHBsaWNhbnRfYXNzb2NfdHJ5KHdwYV9zLCBzc2lkKTsKQEAgLTY5OCw2ICs3ODEsMzUgQEAKIAlzY2FuX3BhcmFtcyA9ICZwYXJhbXM7CiAKIHNjYW46CisjaWZkZWYgQ09ORklHX1AyUAorCS8qCisJICogSWYgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLWNoYW5uZWwgY29uY3VycmVuY3kgYW5kIGEKKwkgKiB2aXJ0dWFsIGludGVyZmFjZSB0aGF0IHNoYXJlcyB0aGUgc2FtZSByYWRpbyB3aXRoIHRoZSB3cGFfcyBpbnRlcmZhY2UKKwkgKiBpcyBvcGVyYXRpbmcgdGhlcmUgbWF5IG5vdCBiZSBuZWVkIHRvIHNjYW4gb3RoZXIgY2hhbm5lbHMgYXBhcnQgZnJvbQorCSAqIHRoZSBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIG9uIHRoZSBvdGhlciB2aXJ0dWFsIGludGVyZmFjZS4gRmlsdGVyCisJICogb3V0IG90aGVyIGNoYW5uZWxzIGluIGNhc2Ugd2UgYXJlIHRyeWluZyB0byBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYQorCSAqIHN0YXRpb24gaW50ZXJmYWNlIHdoZW4gd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIHByZWZlciBzdGF0aW9uCisJICogY29ubmVjdGlvbiBhbmQgYSBjb25jdXJyZW50IG9wZXJhdGlvbiBpcyBhbHJlYWR5IGluIHByb2Nlc3MuCisJICovCisJaWYgKHdwYV9zLT5zY2FuX2Zvcl9jb25uZWN0aW9uICYmIHNjYW5fcmVxID09IE5PUk1BTF9TQ0FOX1JFUSAmJgorCSAgICAhc2Nhbl9wYXJhbXMtPmZyZXFzICYmICFwYXJhbXMuZnJlcXMgJiYKKwkgICAgd3Bhc19pc19wMnBfcHJpb3JpdGl6ZWQod3BhX3MpICYmCisJICAgICEod3BhX3MtPmRydl9mbGFncyAmIFdQQV9EUklWRVJfRkxBR1NfTVVMVElfQ0hBTk5FTF9DT05DVVJSRU5UKSAmJgorCSAgICB3cGFfcy0+cDJwX2dyb3VwX2ludGVyZmFjZSA9PSBOT1RfUDJQX0dST1VQX0lOVEVSRkFDRSAmJgorCSAgICBub25fcDJwX25ldHdvcmtfZW5hYmxlZCh3cGFfcykpIHsKKwkJaW50IGZyZXEgPSBzaGFyZWRfdmlmX29wZXJfZnJlcSh3cGFfcyk7CisJCWlmIChmcmVxID4gMCkgeworCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiUDJQOiBTY2FuIG9ubHkgdGhlIGN1cnJlbnQgIgorCQkJCSJvcGVyYXRpbmcgY2hhbm5lbCAoJWQgTUh6KSBzaW5jZSBkcml2ZXIgZG9lcyAiCisJCQkJIm5vdCBzdXBwb3J0IG11bHRpLWNoYW5uZWwgY29uY3VycmVuY3kiLCBmcmVxKTsKKwkJCXBhcmFtcy5mcmVxcyA9IG9zX3phbGxvYyhzaXplb2YoaW50KSAqIDIpOworCQkJaWYgKHBhcmFtcy5mcmVxcykKKwkJCQlwYXJhbXMuZnJlcXNbMF0gPSBmcmVxOworCQkJc2Nhbl9wYXJhbXMtPmZyZXFzID0gcGFyYW1zLmZyZXFzOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KKwogCXJldCA9IHdwYV9zdXBwbGljYW50X3RyaWdnZXJfc2Nhbih3cGFfcywgc2Nhbl9wYXJhbXMpOwogCiAJd3BhYnVmX2ZyZWUoZXh0cmFfaWUpOwpAQCAtNzA2LDE1ICs4MTgsMTMgQEAKIAogCWlmIChyZXQpIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX1dBUk5JTkcsICJGYWlsZWQgdG8gaW5pdGlhdGUgQVAgc2NhbiIpOwotI2lmZGVmIEFORFJPSURfUDJQCi0JCS8qIFJlc3RvcmUgYmFjayB0aGUgd3BhX3MtPnNjYW5fcmVxIGlmIHdlIGZhaWxlZCB0aGUgc2NhbiBiZWNhdXNlIG9mIGFueSByZWFzb24gKi8KLQkJd3BhX21zZyh3cGFfcywgTVNHX0RFQlVHLCAiUmVzdG9yaW5nIGJhY2sgdGhlIHdwYV9zLT5zY2FuX3JlcSAiCi0JCQkidG8gdGhlIG9yaWdpbmFsIHZhbHVlICVkIiwgc2Nhbl9yZXEpOwotCQl3cGFfcy0+c2Nhbl9yZXEgPSBzY2FuX3JlcTsKLSNlbmRpZgogCQlpZiAocHJldl9zdGF0ZSAhPSB3cGFfcy0+d3BhX3N0YXRlKQogCQkJd3BhX3N1cHBsaWNhbnRfc2V0X3N0YXRlKHdwYV9zLCBwcmV2X3N0YXRlKTsKKwkJLyogUmVzdG9yZSBzY2FuX3JlcSBzaW5jZSB3ZSB3aWxsIHRyeSB0byBzY2FuIGFnYWluICovCisJCXdwYV9zLT5zY2FuX3JlcSA9IHNjYW5fcmVxOwogCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMSwgMCk7CisJfSBlbHNlIHsKKwkJd3BhX3MtPnNjYW5fZm9yX2Nvbm5lY3Rpb24gPSAwOwogCX0KIH0KIApAQCAtNzY2LDYgKzg3Niw3IEBACiAgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQogICogQHNlYzogTnVtYmVyIG9mIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdG8gc2NhbgogICogQHVzZWM6IE51bWJlciBvZiBtaWNyb3NlY29uZHMgYWZ0ZXIgd2hpY2ggdG8gc2NhbgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzIG9yIC0xIG90aGVyd2lzZQogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzY2hlZHVsZSBwZXJpb2RpYyBzY2FucyBmb3IgbmVpZ2hib3JpbmcKICAqIGFjY2VzcyBwb2ludHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lLgpAQCAtNzg3LDYgKzg5OCw3IEBACiAvKioKICAqIHdwYV9zdXBwbGljYW50X3JlcV9zY2hlZF9zY2FuIC0gU3RhcnQgYSBwZXJpb2RpYyBzY2hlZHVsZWQgc2NhbgogICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIFJldHVybnM6IDAgaXMgc2NoZWRfc2NhbiB3YXMgc3RhcnRlZCBvciAtMSBvdGhlcndpc2UKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2NoZWR1bGUgcGVyaW9kaWMgc2NhbnMgZm9yIG5laWdoYm9yaW5nCiAgKiBhY2Nlc3MgcG9pbnRzIHJlcGVhdGluZyB0aGUgc2NhbiBjb250aW51b3VzbHkuCkBAIC0xMDQwLDYgKzExNTIsMTYgQEAKIH0KIAogCisvKioKKyAqIHdwYV9zdXBwbGljYW50X25vdGlmeV9zY2FubmluZyAtIEluZGljYXRlIHBvc3NpYmxlIHNjYW4gc3RhdGUgY2hhbmdlCisgKiBAd3BhX3M6IFBvaW50ZXIgdG8gd3BhX3N1cHBsaWNhbnQgZGF0YQorICogQHNjYW5uaW5nOiBXaGV0aGVyIHNjYW5uaW5nIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgc2Nhbm5pbmcgbm90aWZ5Y2F0aW9ucy4gSXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgKiB0aGVyZSBtYXkgaGF2ZSBiZWVuIGEgY2hhbmdlIGluIHNjYW5uaW5nIChzY2FuIHN0YXJ0ZWQsIGNvbXBsZXRlZCwgc3RvcHBlZCkuCisgKiB3cGFzX25vdGlmeV9zY2FubmluZygpIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc2Nhbm5pbmcgc3RhdGUgY2hhbmdlZCBmcm9tIHRoZQorICogcHJldmlvdXNseSBub3RpZmllZCBzdGF0ZS4KKyAqLwogdm9pZCB3cGFfc3VwcGxpY2FudF9ub3RpZnlfc2Nhbm5pbmcoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICAgaW50IHNjYW5uaW5nKQogewpAQCAtMTA3Nyw2ICsxMTk5LDE1IEBACiB9CiAKIAorLyoqCisgKiB3cGFfc2Nhbl9nZXRfaWUgLSBGZXRjaCBhIHNwZWNpZmllZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gYSBzY2FuIHJlc3VsdAorICogQHJlczogU2NhbiByZXN1bHQgZW50cnkKKyAqIEBpZTogSW5mb3JtYXRpb24gZWxlbWVudCBpZGVudGl0aWZpZXIgKFdMQU5fRUlEXyopCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IChpZCBmaWVsZCkgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBpbmZvcm1hdGlvbiBlbGVtZW50IGluIHRoZSBzY2FuCisgKiByZXN1bHQuCisgKi8KIGNvbnN0IHU4ICogd3BhX3NjYW5fZ2V0X2llKGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywgdTggaWUpCiB7CiAJY29uc3QgdTggKmVuZCwgKnBvczsKQEAgLTEwOTYsNiArMTIyNywxNSBAQAogfQogCiAKKy8qKgorICogd3BhX3NjYW5fZ2V0X3ZlbmRvcl9pZSAtIEZldGNoIHZlbmRvciBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gYSBzY2FuIHJlc3VsdAorICogQHJlczogU2NhbiByZXN1bHQgZW50cnkKKyAqIEB2ZW5kb3JfdHlwZTogVmVuZG9yIHR5cGUgKGZvdXIgb2N0ZXRzIHN0YXJ0aW5nIHRoZSBJRSBwYXlsb2FkKQorICogUmV0dXJuczogUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAoaWQgZmllbGQpIG9yICVOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgaW5mb3JtYXRpb24gZWxlbWVudCBpbiB0aGUgc2NhbgorICogcmVzdWx0LgorICovCiBjb25zdCB1OCAqIHdwYV9zY2FuX2dldF92ZW5kb3JfaWUoY29uc3Qgc3RydWN0IHdwYV9zY2FuX3JlcyAqcmVzLAogCQkJCSAgdTMyIHZlbmRvcl90eXBlKQogewpAQCAtMTExNyw2ICsxMjU3LDE2IEBACiB9CiAKIAorLyoqCisgKiB3cGFfc2Nhbl9nZXRfdmVuZG9yX2llX211bHRpIC0gRmV0Y2ggdmVuZG9yIElFIGRhdGEgZnJvbSBhIHNjYW4gcmVzdWx0CisgKiBAcmVzOiBTY2FuIHJlc3VsdCBlbnRyeQorICogQHZlbmRvcl90eXBlOiBWZW5kb3IgdHlwZSAoZm91ciBvY3RldHMgc3RhcnRpbmcgdGhlIElFIHBheWxvYWQpCisgKiBSZXR1cm5zOiBQb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IHBheWxvYWQgb3IgJU5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbmNhdGVuYXRlZCBwYXlsb2FkIG9mIHBvc3NpYmx5IGZyYWdtZW50ZWQgdmVuZG9yCisgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGVtZW50cyBpbiB0aGUgc2NhbiByZXN1bHQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAqIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBidWZmZXIuCisgKi8KIHN0cnVjdCB3cGFidWYgKiB3cGFfc2Nhbl9nZXRfdmVuZG9yX2llX211bHRpKGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKIAkJCQkJICAgICB1MzIgdmVuZG9yX3R5cGUpCiB7CkBAIC0xMTQ4LDQwICsxMjk4LDYgQEAKIH0KIAogCi1zdHJ1Y3Qgd3BhYnVmICogd3BhX3NjYW5fZ2V0X3ZlbmRvcl9pZV9tdWx0aV9iZWFjb24oCi0JY29uc3Qgc3RydWN0IHdwYV9zY2FuX3JlcyAqcmVzLCB1MzIgdmVuZG9yX3R5cGUpCi17Ci0Jc3RydWN0IHdwYWJ1ZiAqYnVmOwotCWNvbnN0IHU4ICplbmQsICpwb3M7Ci0KLQlpZiAocmVzLT5iZWFjb25faWVfbGVuID09IDApCi0JCXJldHVybiBOVUxMOwotCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhyZXMtPmJlYWNvbl9pZV9sZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwb3MgPSAoY29uc3QgdTggKikgKHJlcyArIDEpOwotCXBvcyArPSByZXMtPmllX2xlbjsKLQllbmQgPSBwb3MgKyByZXMtPmJlYWNvbl9pZV9sZW47Ci0KLQl3aGlsZSAocG9zICsgMSA8IGVuZCkgewotCQlpZiAocG9zICsgMiArIHBvc1sxXSA+IGVuZCkKLQkJCWJyZWFrOwotCQlpZiAocG9zWzBdID09IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQyAmJiBwb3NbMV0gPj0gNCAmJgotCQkgICAgdmVuZG9yX3R5cGUgPT0gV1BBX0dFVF9CRTMyKCZwb3NbMl0pKQotCQkJd3BhYnVmX3B1dF9kYXRhKGJ1ZiwgcG9zICsgMiArIDQsIHBvc1sxXSAtIDQpOwotCQlwb3MgKz0gMiArIHBvc1sxXTsKLQl9Ci0KLQlpZiAod3BhYnVmX2xlbihidWYpID09IDApIHsKLQkJd3BhYnVmX2ZyZWUoYnVmKTsKLQkJYnVmID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gYnVmOwotfQotCi0KIC8qCiAgKiBDaGFubmVscyB3aXRoIGEgZ3JlYXQgU05SIGNhbiBvcGVyYXRlIGF0IGZ1bGwgcmF0ZS4gV2hhdCBpcyBhIGdyZWF0IFNOUj8KICAqIFRoaXMgZG9jIGh0dHBzOi8vc3VwcG9ydGZvcnVtcy5jaXNjby5jb20vZG9jcy9ET0MtMTI5NTQgc2F5cywgInRoZSBnZW5lcmFsCkBAIC0xMzQ1LDYgKzE0NjEsMTUgQEAKIH0KIAogCisvKioKKyAqIHdwYV9zdXBwbGljYW50X2ZpbHRlcl9ic3NpZF9tYXRjaCAtIElzIHRoZSBzcGVjaWZpZWQgQlNTSUQgYWxsb3dlZAorICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKKyAqIEBic3NpZDogQlNTSUQgdG8gY2hlY2sKKyAqIFJldHVybnM6IDAgaWYgdGhlIEJTU0lEIGlzIGZpbHRlcmVkIG9yIDEgaWYgbm90CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpbHRlciBvdXQgc3BlY2lmaWMgQlNTSURzIGZyb20gc2NhbiByZXNsdHMgbWFpbmx5CisgKiBmb3IgdGVzdGluZyBwdXJwb3NlcyAoU0VUIGJzc2lkX2ZpbHRlciBjdHJsX2lmYWNlIGNvbW1hbmQpLgorICovCiBpbnQgd3BhX3N1cHBsaWNhbnRfZmlsdGVyX2Jzc2lkX21hdGNoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJICAgICAgY29uc3QgdTggKmJzc2lkKQogewpAQCAtMTQzNiw2ICsxNTYxLDE4IEBACiB9CiAKIAorLyoqCisgKiB3cGFfc3VwcGxpY2FudF91cGRhdGVfc2Nhbl9yZXN1bHRzIC0gVXBkYXRlIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBkcml2ZXIKKyAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIEJTUyB0YWJsZSB3aXRoaW4gd3BhX3N1cHBsaWNhbnQgYmFzZWQgb24gdGhlCisgKiBjdXJyZW50bHkgYXZhaWxhYmxlIHNjYW4gcmVzdWx0cyBmcm9tIHRoZSBkcml2ZXIgd2l0aG91dCByZXF1ZXN0aW5nIGEgbmV3CisgKiBzY2FuLiBUaGlzIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIGRyaXZlciBpbmRpY2F0ZXMgYW4gYXNzb2NpYXRpb24KKyAqIChpbmNsdWRpbmcgcm9hbWluZyB3aXRoaW4gRVNTKSBhbmQgd3BhX3N1cHBsaWNhbnQgZG9lcyBub3QgeWV0IGhhdmUgdGhlCisgKiBuZWVkZWQgaW5mb3JtYXRpb24gdG8gY29tcGxldGUgdGhlIGNvbm5lY3Rpb24gKGUuZy4sIHRvIHBlcmZvcm0gdmFsaWRhdGlvbgorICogc3RlcHMgaW4gNC13YXkgaGFuZHNoYWtlKS4KKyAqLwogaW50IHdwYV9zdXBwbGljYW50X3VwZGF0ZV9zY2FuX3Jlc3VsdHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKIHsKIAlzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0cyAqc2Nhbl9yZXM7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9zY2FuLmggYi93cGFfc3VwcGxpY2FudC9zY2FuLmgKaW5kZXggYjBkZGY5Ny4uNTA5NjI4NyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvc2Nhbi5oCisrKyBiL3dwYV9zdXBwbGljYW50L3NjYW4uaApAQCAtMzAsOCArMzAsNiBAQAogCQkJCSAgdTMyIHZlbmRvcl90eXBlKTsKIHN0cnVjdCB3cGFidWYgKiB3cGFfc2Nhbl9nZXRfdmVuZG9yX2llX211bHRpKGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywKIAkJCQkJICAgICB1MzIgdmVuZG9yX3R5cGUpOwotc3RydWN0IHdwYWJ1ZiAqIHdwYV9zY2FuX2dldF92ZW5kb3JfaWVfbXVsdGlfYmVhY29uKAotCWNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXMgKnJlcywgdTMyIHZlbmRvcl90eXBlKTsKIGludCB3cGFfc3VwcGxpY2FudF9maWx0ZXJfYnNzaWRfbWF0Y2goc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICAgICBjb25zdCB1OCAqYnNzaWQpOwogCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC9zbWUuYyBiL3dwYV9zdXBwbGljYW50L3NtZS5jCmluZGV4IGIwOWU1ZjEuLjMwZjk3NzkgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3NtZS5jCisrKyBiL3dwYV9zdXBwbGljYW50L3NtZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIHdwYV9zdXBwbGljYW50IC0gU01FCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAgKiBTZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgiCiAjaW5jbHVkZSAiZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmgiCiAjaW5jbHVkZSAiY29tbW9uL3dwYV9jb21tb24uaCIKKyNpbmNsdWRlICJjb21tb24vc2FlLmgiCiAjaW5jbHVkZSAicnNuX3N1cHAvd3BhLmgiCiAjaW5jbHVkZSAicnNuX3N1cHAvcG1rc2FfY2FjaGUuaCIKICNpbmNsdWRlICJjb25maWcuaCIKQEAgLTM5LDggKzQwLDEwNiBAQAogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFXICovCiAKIAotdm9pZCBzbWVfYXV0aGVudGljYXRlKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCSAgICAgIHN0cnVjdCB3cGFfYnNzICpic3MsIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCkKKyNpZmRlZiBDT05GSUdfU0FFCisKK3N0YXRpYyBpbnQgaW5kZXhfd2l0aGluX2FycmF5KGNvbnN0IGludCAqYXJyYXksIGludCBpZHgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKSB7CisJCWlmIChhcnJheVtpXSA9PSAtMSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHNtZV9zZXRfc2FlX2dyb3VwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJaW50ICpncm91cHMgPSB3cGFfcy0+Y29uZi0+c2FlX2dyb3VwczsKKwlpbnQgZGVmYXVsdF9ncm91cHNbXSA9IHsgMTksIDIwLCAyMSwgMjUsIDI2IH07CisKKwlpZiAoIWdyb3VwcykKKwkJZ3JvdXBzID0gZGVmYXVsdF9ncm91cHM7CisKKwkvKiBDb25maWd1cmF0aW9uIG1heSBoYXZlIGNoYW5nZWQsIHNvIHZhbGlkYXRlIGN1cnJlbnQgaW5kZXggKi8KKwlpZiAoIWluZGV4X3dpdGhpbl9hcnJheShncm91cHMsIHdwYV9zLT5zbWUuc2FlX2dyb3VwX2luZGV4KSkKKwkJcmV0dXJuIC0xOworCisJZm9yICg7OykgeworCQlpbnQgZ3JvdXAgPSBncm91cHNbd3BhX3MtPnNtZS5zYWVfZ3JvdXBfaW5kZXhdOworCQlpZiAoZ3JvdXAgPCAwKQorCQkJYnJlYWs7CisJCWlmIChzYWVfc2V0X2dyb3VwKCZ3cGFfcy0+c21lLnNhZSwgZ3JvdXApID09IDApIHsKKwkJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRTogU2VsZWN0ZWQgU0FFIGdyb3VwICVkIiwKKwkJCQl3cGFfcy0+c21lLnNhZS5ncm91cCk7CisJCSAgICAgICByZXR1cm4gMDsKKwkJfQorCQl3cGFfcy0+c21lLnNhZV9ncm91cF9pbmRleCsrOworCX0KKworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHNtZV9hdXRoX2J1aWxkX3NhZV9jb21taXQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJCSBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCisJCQkJCQkgY29uc3QgdTggKmJzc2lkKQoreworCXN0cnVjdCB3cGFidWYgKmJ1ZjsKKwlzaXplX3QgbGVuOworCisJaWYgKHNzaWQtPnBhc3NwaHJhc2UgPT0gTlVMTCkgeworCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlNBRTogTm8gcGFzc3dvcmQgYXZhaWxhYmxlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzbWVfc2V0X3NhZV9ncm91cCh3cGFfcykgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiU0FFOiBGYWlsZWQgdG8gc2VsZWN0IGdyb3VwIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzYWVfcHJlcGFyZV9jb21taXQod3BhX3MtPm93bl9hZGRyLCBic3NpZCwKKwkJCSAgICAgICAodTggKikgc3NpZC0+cGFzc3BocmFzZSwKKwkJCSAgICAgICBvc19zdHJsZW4oc3NpZC0+cGFzc3BocmFzZSksCisJCQkgICAgICAgJndwYV9zLT5zbWUuc2FlKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IENvdWxkIG5vdCBwaWNrIFBXRSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsZW4gPSB3cGFfcy0+c21lLnNhZV90b2tlbiA/IHdwYWJ1Zl9sZW4od3BhX3MtPnNtZS5zYWVfdG9rZW4pIDogMDsKKwlidWYgPSB3cGFidWZfYWxsb2MoNCArIFNBRV9DT01NSVRfTUFYX0xFTiArIGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXdwYWJ1Zl9wdXRfbGUxNihidWYsIDEpOyAvKiBUcmFuc2FjdGlvbiBzZXEjICovCisJd3BhYnVmX3B1dF9sZTE2KGJ1ZiwgV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisJc2FlX3dyaXRlX2NvbW1pdCgmd3BhX3MtPnNtZS5zYWUsIGJ1Ziwgd3BhX3MtPnNtZS5zYWVfdG9rZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworCitzdGF0aWMgc3RydWN0IHdwYWJ1ZiAqIHNtZV9hdXRoX2J1aWxkX3NhZV9jb25maXJtKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJc3RydWN0IHdwYWJ1ZiAqYnVmOworCisJYnVmID0gd3BhYnVmX2FsbG9jKDQgKyBTQUVfQ09ORklSTV9NQVhfTEVOKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJd3BhYnVmX3B1dF9sZTE2KGJ1ZiwgMik7IC8qIFRyYW5zYWN0aW9uIHNlcSMgKi8KKwl3cGFidWZfcHV0X2xlMTYoYnVmLCBXTEFOX1NUQVRVU19TVUNDRVNTKTsKKwlzYWVfd3JpdGVfY29uZmlybSgmd3BhX3MtPnNtZS5zYWUsIGJ1Zik7CisKKwlyZXR1cm4gYnVmOworfQorCisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCisKK3N0YXRpYyB2b2lkIHNtZV9zZW5kX2F1dGhlbnRpY2F0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJICAgIHN0cnVjdCB3cGFfYnNzICpic3MsIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCwKKwkJCQkgICAgaW50IHN0YXJ0KQogewogCXN0cnVjdCB3cGFfZHJpdmVyX2F1dGhfcGFyYW1zIHBhcmFtczsKIAlzdHJ1Y3Qgd3BhX3NzaWQgKm9sZF9zc2lkOwpAQCAtNTEsNiArMTUwLDkgQEAKIAljb25zdCB1OCAqbWQgPSBOVUxMOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiAJaW50IGksIGJzc2lkX2NoYW5nZWQ7CisJc3RydWN0IHdwYWJ1ZiAqcmVzcCA9IE5VTEw7CisJdTggZXh0X2NhcGFiWzEwXTsKKwlpbnQgZXh0X2NhcGFiX2xlbjsKIAogCWlmIChic3MgPT0gTlVMTCkgewogCQl3cGFfbXNnKHdwYV9zLCBNU0dfRVJST1IsICJTTUU6IE5vIHNjYW4gcmVzdWx0IGF2YWlsYWJsZSBmb3IgIgpAQCAtOTUsNiArMTk3LDIxIEBACiAJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIk92ZXJyaWRpbmcgYXV0aF9hbGcgc2VsZWN0aW9uOiAiCiAJCQkiMHgleCIsIHBhcmFtcy5hdXRoX2FsZyk7CiAJfQorI2lmZGVmIENPTkZJR19TQUUKKwlpZiAod3BhX2tleV9tZ210X3NhZShzc2lkLT5rZXlfbWdtdCkpIHsKKwkJY29uc3QgdTggKnJzbjsKKwkJc3RydWN0IHdwYV9pZV9kYXRhIGllZDsKKworCQlyc24gPSB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1JTTik7CisJCWlmIChyc24gJiYKKwkJICAgIHdwYV9wYXJzZV93cGFfaWUocnNuLCAyICsgcnNuWzFdLCAmaWVkKSA9PSAwKSB7CisJCQlpZiAod3BhX2tleV9tZ210X3NhZShpZWQua2V5X21nbXQpKSB7CisJCQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiVXNpbmcgU0FFIGF1dGhfYWxnIik7CisJCQkJcGFyYW1zLmF1dGhfYWxnID0gV1BBX0FVVEhfQUxHX1NBRTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1dFUF9LRVlTOyBpKyspIHsKIAkJaWYgKHNzaWQtPndlcF9rZXlfbGVuW2ldKQpAQCAtMTEzLDcgKzIzMCw5IEBACiAJICAgICB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1JTTikpICYmCiAJICAgIHdwYV9rZXlfbWdtdF93cGEoc3NpZC0+a2V5X21nbXQpKSB7CiAJCWludCB0cnlfb3Bwb3J0dW5pc3RpYzsKLQkJdHJ5X29wcG9ydHVuaXN0aWMgPSBzc2lkLT5wcm9hY3RpdmVfa2V5X2NhY2hpbmcgJiYKKwkJdHJ5X29wcG9ydHVuaXN0aWMgPSAoc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nIDwgMCA/CisJCQkJICAgICB3cGFfcy0+Y29uZi0+b2tjIDoKKwkJCQkgICAgIHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZykgJiYKIAkJCShzc2lkLT5wcm90byAmIFdQQV9QUk9UT19SU04pOwogCQlpZiAocG1rc2FfY2FjaGVfc2V0X2N1cnJlbnQod3BhX3MtPndwYSwgTlVMTCwgYnNzLT5ic3NpZCwKIAkJCQkJICAgIHdwYV9zLT5jdXJyZW50X3NzaWQsCkBAIC0yMDMsOCArMzIyLDkgQEAKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKLQl3cGFfcy0+c21lLm1mcCA9IHNzaWQtPmllZWU4MDIxMXc7Ci0JaWYgKHNzaWQtPmllZWU4MDIxMXcgIT0gTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OKSB7CisJd3BhX3MtPnNtZS5tZnAgPSBzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUID8KKwkJd3BhX3MtPmNvbmYtPnBtZiA6IHNzaWQtPmllZWU4MDIxMXc7CisJaWYgKHdwYV9zLT5zbWUubWZwICE9IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTikgewogCQljb25zdCB1OCAqcnNuID0gd3BhX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9SU04pOwogCQlzdHJ1Y3Qgd3BhX2llX2RhdGEgX2llOwogCQlpZiAocnNuICYmIHdwYV9wYXJzZV93cGFfaWUocnNuLCAyICsgcnNuWzFdLCAmX2llKSA9PSAwICYmCkBAIC0yNDcsMjMgKzM2NywzMiBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCi0jaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwotCWlmICh3cGFfcy0+Y29uZi0+aW50ZXJ3b3JraW5nKSB7CisJZXh0X2NhcGFiX2xlbiA9IHdwYXNfYnVpbGRfZXh0X2NhcGFiKHdwYV9zLCBleHRfY2FwYWIpOworCWlmIChleHRfY2FwYWJfbGVuID4gMCkgewogCQl1OCAqcG9zID0gd3BhX3MtPnNtZS5hc3NvY19yZXFfaWU7CiAJCWlmICh3cGFfcy0+c21lLmFzc29jX3JlcV9pZV9sZW4gPiAwICYmIHBvc1swXSA9PSBXTEFOX0VJRF9SU04pCiAJCQlwb3MgKz0gMiArIHBvc1sxXTsKLQkJb3NfbWVtbW92ZShwb3MgKyA2LCBwb3MsCisJCW9zX21lbW1vdmUocG9zICsgZXh0X2NhcGFiX2xlbiwgcG9zLAogCQkJICAgd3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuIC0KIAkJCSAgIChwb3MgLSB3cGFfcy0+c21lLmFzc29jX3JlcV9pZSkpOwotCQl3cGFfcy0+c21lLmFzc29jX3JlcV9pZV9sZW4gKz0gNjsKLQkJKnBvcysrID0gV0xBTl9FSURfRVhUX0NBUEFCOwotCQkqcG9zKysgPSA0OwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDAwOwotCQkqcG9zKysgPSAweDgwOyAvKiBCaXQgMzEgLSBJbnRlcndvcmtpbmcgKi8KKwkJd3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuICs9IGV4dF9jYXBhYl9sZW47CisJCW9zX21lbWNweShwb3MsIGV4dF9jYXBhYiwgZXh0X2NhcGFiX2xlbik7CiAJfQotI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KKworI2lmZGVmIENPTkZJR19TQUUKKwlpZiAocGFyYW1zLmF1dGhfYWxnID09IFdQQV9BVVRIX0FMR19TQUUpIHsKKwkJaWYgKHN0YXJ0KQorCQkJcmVzcCA9IHNtZV9hdXRoX2J1aWxkX3NhZV9jb21taXQod3BhX3MsIHNzaWQsCisJCQkJCQkJIGJzcy0+YnNzaWQpOworCQllbHNlCisJCQlyZXNwID0gc21lX2F1dGhfYnVpbGRfc2FlX2NvbmZpcm0od3BhX3MpOworCQlpZiAocmVzcCA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlwYXJhbXMuc2FlX2RhdGEgPSB3cGFidWZfaGVhZChyZXNwKTsKKwkJcGFyYW1zLnNhZV9kYXRhX2xlbiA9IHdwYWJ1Zl9sZW4ocmVzcCk7CisJCXdwYV9zLT5zbWUuc2FlLnN0YXRlID0gc3RhcnQgPyBTQUVfQ09NTUlUVEVEIDogU0FFX0NPTkZJUk1FRDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCiAJd3BhX3N1cHBsaWNhbnRfY2FuY2VsX3NjaGVkX3NjYW4od3BhX3MpOwogCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2FuKHdwYV9zKTsKQEAgLTI4Nyw2ICs0MTYsNyBAQAogCQkJImRyaXZlciBmYWlsZWQiKTsKIAkJd3Bhc19jb25uZWN0aW9uX2ZhaWxlZCh3cGFfcywgYnNzLT5ic3NpZCk7CiAJCXdwYV9zdXBwbGljYW50X21hcmtfZGlzYXNzb2Mod3BhX3MpOworCQl3cGFidWZfZnJlZShyZXNwKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjk3LDkgKzQyNyw5OSBAQAogCSAqIEFzc29jaWF0aW9uIHdpbGwgYmUgc3RhcnRlZCBiYXNlZCBvbiB0aGUgYXV0aGVudGljYXRpb24gZXZlbnQgZnJvbQogCSAqIHRoZSBkcml2ZXIuCiAJICovCisKKwl3cGFidWZfZnJlZShyZXNwKTsKIH0KIAogCit2b2lkIHNtZV9hdXRoZW50aWNhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJICAgICAgc3RydWN0IHdwYV9ic3MgKmJzcywgc3RydWN0IHdwYV9zc2lkICpzc2lkKQoreworI2lmZGVmIENPTkZJR19TQUUKKwl3cGFfcy0+c21lLnNhZS5zdGF0ZSA9IFNBRV9OT1RISU5HOworCXdwYV9zLT5zbWUuc2FlLnNlbmRfY29uZmlybSA9IDA7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLworCXNtZV9zZW5kX2F1dGhlbnRpY2F0aW9uKHdwYV9zLCBic3MsIHNzaWQsIDEpOworfQorCisKKyNpZmRlZiBDT05GSUdfU0FFCisKK3N0YXRpYyBpbnQgc21lX3NhZV9hdXRoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHUxNiBhdXRoX3RyYW5zYWN0aW9uLAorCQkJdTE2IHN0YXR1c19jb2RlLCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IFNBRSBhdXRoZW50aWNhdGlvbiB0cmFuc2FjdGlvbiAldSAiCisJCSJzdGF0dXMgY29kZSAldSIsIGF1dGhfdHJhbnNhY3Rpb24sIHN0YXR1c19jb2RlKTsKKworCWlmIChhdXRoX3RyYW5zYWN0aW9uID09IDEgJiYKKwkgICAgc3RhdHVzX2NvZGUgPT0gV0xBTl9TVEFUVVNfQU5USV9DTE9HR0lOR19UT0tFTl9SRVEgJiYKKwkgICAgd3BhX3MtPnNtZS5zYWUuc3RhdGUgPT0gU0FFX0NPTU1JVFRFRCAmJgorCSAgICB3cGFfcy0+Y3VycmVudF9ic3MgJiYgd3BhX3MtPmN1cnJlbnRfc3NpZCkgeworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJTTUU6IFNBRSBhbnRpLWNsb2dnaW5nIHRva2VuICIKKwkJCSJyZXF1ZXN0ZWQiKTsKKwkJd3BhYnVmX2ZyZWUod3BhX3MtPnNtZS5zYWVfdG9rZW4pOworCQl3cGFfcy0+c21lLnNhZV90b2tlbiA9IHdwYWJ1Zl9hbGxvY19jb3B5KGRhdGEsIGxlbik7CisJCXNtZV9zZW5kX2F1dGhlbnRpY2F0aW9uKHdwYV9zLCB3cGFfcy0+Y3VycmVudF9ic3MsCisJCQkJCXdwYV9zLT5jdXJyZW50X3NzaWQsIDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAxICYmCisJICAgIHN0YXR1c19jb2RlID09IFdMQU5fU1RBVFVTX0ZJTklURV9DWUNMSUNfR1JPVVBfTk9UX1NVUFBPUlRFRCAmJgorCSAgICB3cGFfcy0+c21lLnNhZS5zdGF0ZSA9PSBTQUVfQ09NTUlUVEVEICYmCisJICAgIHdwYV9zLT5jdXJyZW50X2JzcyAmJiB3cGFfcy0+Y3VycmVudF9zc2lkKSB7CisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRTogU0FFIGdyb3VwIG5vdCBzdXBwb3J0ZWQiKTsKKwkJd3BhX3MtPnNtZS5zYWVfZ3JvdXBfaW5kZXgrKzsKKwkJaWYgKHNtZV9zZXRfc2FlX2dyb3VwKHdwYV9zKSA8IDApCisJCQlyZXR1cm4gLTE7IC8qIG5vIG90aGVyIGdyb3VwcyBlbmFibGVkICovCisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRTogVHJ5IG5leHQgZW5hYmxlZCBTQUUgZ3JvdXAiKTsKKwkJc21lX3NlbmRfYXV0aGVudGljYXRpb24od3BhX3MsIHdwYV9zLT5jdXJyZW50X2JzcywKKwkJCQkJd3BhX3MtPmN1cnJlbnRfc3NpZCwgMSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0dXNfY29kZSAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAxKSB7CisJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRSBTQUUgY29tbWl0Iik7CisJCWlmICh3cGFfcy0+Y3VycmVudF9ic3MgPT0gTlVMTCB8fAorCQkgICAgd3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlpZiAod3BhX3MtPnNtZS5zYWUuc3RhdGUgIT0gU0FFX0NPTU1JVFRFRCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHNhZV9wYXJzZV9jb21taXQoJndwYV9zLT5zbWUuc2FlLCBkYXRhLCBsZW4sIE5VTEwsIE5VTEwsCisJCQkJICAgICB3cGFfcy0+Y29uZi0+c2FlX2dyb3VwcykgIT0KKwkJICAgIFdMQU5fU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHNhZV9wcm9jZXNzX2NvbW1pdCgmd3BhX3MtPnNtZS5zYWUpIDwgMCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTQUU6IEZhaWxlZCB0byBwcm9jZXNzIHBlZXIgIgorCQkJCSAgICJjb21taXQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXdwYWJ1Zl9mcmVlKHdwYV9zLT5zbWUuc2FlX3Rva2VuKTsKKwkJd3BhX3MtPnNtZS5zYWVfdG9rZW4gPSBOVUxMOworCQlzbWVfc2VuZF9hdXRoZW50aWNhdGlvbih3cGFfcywgd3BhX3MtPmN1cnJlbnRfYnNzLAorCQkJCQl3cGFfcy0+Y3VycmVudF9zc2lkLCAwKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChhdXRoX3RyYW5zYWN0aW9uID09IDIpIHsKKwkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiU01FIFNBRSBjb25maXJtIik7CisJCWlmICh3cGFfcy0+c21lLnNhZS5zdGF0ZSAhPSBTQUVfQ09ORklSTUVEKQorCQkJcmV0dXJuIC0xOworCQlpZiAoc2FlX2NoZWNrX2NvbmZpcm0oJndwYV9zLT5zbWUuc2FlLCBkYXRhLCBsZW4pIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJd3BhX3MtPnNtZS5zYWUuc3RhdGUgPSBTQUVfQUNDRVBURUQ7CisJCXNhZV9jbGVhcl90ZW1wX2RhdGEoJndwYV9zLT5zbWUuc2FlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIC0xOworfQorI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KKworCiB2b2lkIHNtZV9ldmVudF9hdXRoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHVuaW9uIHdwYV9ldmVudF9kYXRhICpkYXRhKQogewogCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CkBAIC0zMjQsMTQgKzU0NCwzNCBAQAogCX0KIAogCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRTogQXV0aGVudGljYXRpb24gcmVzcG9uc2U6IHBlZXI9IiBNQUNTVFIKLQkJIiBhdXRoX3R5cGU9JWQgc3RhdHVzX2NvZGU9JWQiLAorCQkiIGF1dGhfdHlwZT0lZCBhdXRoX3RyYW5zYWN0aW9uPSVkIHN0YXR1c19jb2RlPSVkIiwKIAkJTUFDMlNUUihkYXRhLT5hdXRoLnBlZXIpLCBkYXRhLT5hdXRoLmF1dGhfdHlwZSwKLQkJZGF0YS0+YXV0aC5zdGF0dXNfY29kZSk7CisJCWRhdGEtPmF1dGguYXV0aF90cmFuc2FjdGlvbiwgZGF0YS0+YXV0aC5zdGF0dXNfY29kZSk7CiAJd3BhX2hleGR1bXAoTVNHX01TR0RVTVAsICJTTUU6IEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIElFcyIsCiAJCSAgICBkYXRhLT5hdXRoLmllcywgZGF0YS0+YXV0aC5pZXNfbGVuKTsKIAogCWVsb29wX2NhbmNlbF90aW1lb3V0KHNtZV9hdXRoX3RpbWVyLCB3cGFfcywgTlVMTCk7CiAKKyNpZmRlZiBDT05GSUdfU0FFCisJaWYgKGRhdGEtPmF1dGguYXV0aF90eXBlID09IFdMQU5fQVVUSF9TQUUpIHsKKwkJaW50IHJlczsKKwkJcmVzID0gc21lX3NhZV9hdXRoKHdwYV9zLCBkYXRhLT5hdXRoLmF1dGhfdHJhbnNhY3Rpb24sCisJCQkJICAgZGF0YS0+YXV0aC5zdGF0dXNfY29kZSwgZGF0YS0+YXV0aC5pZXMsCisJCQkJICAgZGF0YS0+YXV0aC5pZXNfbGVuKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCXdwYXNfY29ubmVjdGlvbl9mYWlsZWQod3BhX3MsIHdwYV9zLT5wZW5kaW5nX2Jzc2lkKTsKKwkJCXdwYV9zdXBwbGljYW50X3NldF9zdGF0ZSh3cGFfcywgV1BBX0RJU0NPTk5FQ1RFRCk7CisKKwkJfQorCQlpZiAocmVzICE9IDEpCisJCQlyZXR1cm47CisKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTTUU6IFNBRSBjb21wbGV0ZWQgLSBzZXR0aW5nIFBNSyBmb3IgIgorCQkJICAgIjQtd2F5IGhhbmRzaGFrZSIpOworCQl3cGFfc21fc2V0X3Btayh3cGFfcy0+d3BhLCB3cGFfcy0+c21lLnNhZS5wbWssIFBNS19MRU4pOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCisKIAlpZiAoZGF0YS0+YXV0aC5zdGF0dXNfY29kZSAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7CiAJCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlNNRTogQXV0aGVudGljYXRpb24gZmFpbGVkIChzdGF0dXMgIgogCQkJImNvZGUgJWQpIiwgZGF0YS0+YXV0aC5zdGF0dXNfY29kZSk7CkBAIC00MDMsOCArNjQzLDkgQEAKIAlwYXJhbXMud3BhX2llID0gd3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuID8KIAkJd3BhX3MtPnNtZS5hc3NvY19yZXFfaWUgOiBOVUxMOwogCXBhcmFtcy53cGFfaWVfbGVuID0gd3BhX3MtPnNtZS5hc3NvY19yZXFfaWVfbGVuOwotCXBhcmFtcy5wYWlyd2lzZV9zdWl0ZSA9IGNpcGhlcl9zdWl0ZTJkcml2ZXIod3BhX3MtPnBhaXJ3aXNlX2NpcGhlcik7Ci0JcGFyYW1zLmdyb3VwX3N1aXRlID0gY2lwaGVyX3N1aXRlMmRyaXZlcih3cGFfcy0+Z3JvdXBfY2lwaGVyKTsKKwlwYXJhbXMucGFpcndpc2Vfc3VpdGUgPQorCQl3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKKwlwYXJhbXMuZ3JvdXBfc3VpdGUgPSB3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+Z3JvdXBfY2lwaGVyKTsKICNpZmRlZiBDT05GSUdfSFRfT1ZFUlJJREVTCiAJb3NfbWVtc2V0KCZodGNhcHMsIDAsIHNpemVvZihodGNhcHMpKTsKIAlvc19tZW1zZXQoJmh0Y2Fwc19tYXNrLCAwLCBzaXplb2YoaHRjYXBzX21hc2spKTsKQEAgLTYzMSw2ICs4NzIsMTEgQEAKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogCXNtZV9zdG9wX3NhX3F1ZXJ5KHdwYV9zKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLworI2lmZGVmIENPTkZJR19TQUUKKwl3cGFidWZfZnJlZSh3cGFfcy0+c21lLnNhZV90b2tlbik7CisJd3BhX3MtPnNtZS5zYWVfdG9rZW4gPSBOVUxMOworCXNhZV9jbGVhcl9kYXRhKCZ3cGFfcy0+c21lLnNhZSk7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQoc21lX2Fzc29jX3RpbWVyLCB3cGFfcywgTlVMTCk7CiAJZWxvb3BfY2FuY2VsX3RpbWVvdXQoc21lX2F1dGhfdGltZXIsIHdwYV9zLCBOVUxMKTsKQEAgLTg2MCw5ICsxMTA2LDE0IEBACiAJaWYgKCFlbmFibGUpCiAJCXJldHVybjsKIAotCWlmICghKHdwYV9zLT5kcnZfZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX1NNRSkgfHwgc3NpZCA9PSBOVUxMIHx8Ci0JICAgIHNzaWQtPm1vZGUgIT0gSUVFRTgwMjExX01PREVfSU5GUkEpCi0JCXJldHVybjsgLyogTm90IHVzaW5nIHN0YXRpb24gU01FIGluIHdwYV9zdXBwbGljYW50ICovCisJLyoKKwkgKiBTY2hlZHVsZSBPQlNTIHNjYW4gaWYgZHJpdmVyIGlzIHVzaW5nIHN0YXRpb24gU01FIGluIHdwYV9zdXBwbGljYW50CisJICogb3IgaXQgZXhwZWN0cyBPQlNTIHNjYW4gdG8gYmUgcGVyZm9ybWVkIGJ5IHdwYV9zdXBwbGljYW50LgorCSAqLworCWlmICghKCh3cGFfcy0+ZHJ2X2ZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TTUUpIHx8CisJICAgICAgKHdwYV9zLT5kcnZfZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX09CU1NfU0NBTikpIHx8CisJICAgIHNzaWQgPT0gTlVMTCB8fCBzc2lkLT5tb2RlICE9IElFRUU4MDIxMV9NT0RFX0lORlJBKQorCQlyZXR1cm47CiAKIAlpZiAoIXdwYV9zLT5ody5tb2RlcykKIAkJcmV0dXJuOwpAQCAtMTAxMiw3ICsxMjYzLDkgQEAKIAlpZiAod3BhX3MtPndwYV9zdGF0ZSAhPSBXUEFfQ09NUExFVEVEKQogCQlyZXR1cm47CiAJc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7Ci0JaWYgKHNzaWQgPT0gTlVMTCB8fCBzc2lkLT5pZWVlODAyMTF3ID09IDApCisJaWYgKHNzaWQgPT0gTlVMTCB8fAorCSAgICAoc3NpZC0+aWVlZTgwMjExdyA9PSBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCA/CisJICAgICB3cGFfcy0+Y29uZi0+cG1mIDogc3NpZC0+aWVlZTgwMjExdykgPT0gTk9fTUdNVF9GUkFNRV9QUk9URUNUSU9OKQogCQlyZXR1cm47CiAJaWYgKG9zX21lbWNtcChzYSwgd3BhX3MtPmJzc2lkLCBFVEhfQUxFTikgIT0gMCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC1ubDgwMjExLnNlcnZpY2UuYXJnLmluIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC1ubDgwMjExLnNlcnZpY2UuYXJnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YWJhMTIKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LW5sODAyMTEuc2VydmljZS5hcmcuaW4KQEAgLTAsMCArMSwxMyBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1XUEEgc3VwcGxpY2FudCBkYWVtb24gKGludGVyZmFjZS0gYW5kIG5sODAyMTEgZHJpdmVyLXNwZWNpZmljIHZlcnNpb24pCitSZXF1aXJlcz1zeXMtc3Vic3lzdGVtLW5ldC1kZXZpY2VzLSVpLmRldmljZQorQWZ0ZXI9c3lzLXN1YnN5c3RlbS1uZXQtZGV2aWNlcy0laS5kZXZpY2UKKworIyBOZXR3b3JrTWFuYWdlciB1c2VycyB3aWxsIHByb2JhYmx5IHdhbnQgdGhlIGRidXMgdmVyc2lvbiBpbnN0ZWFkLgorCitbU2VydmljZV0KK1R5cGU9c2ltcGxlCitFeGVjU3RhcnQ9QEJJTkRJUkAvd3BhX3N1cHBsaWNhbnQgLWMvZXRjL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LW5sODAyMTEtJUkuY29uZiAtRG5sODAyMTEgLWklSQorCitbSW5zdGFsbF0KK0FsaWFzPW11bHRpLXVzZXIudGFyZ2V0LndhbnRzL3dwYV9zdXBwbGljYW50LW5sODAyMTFAd2xhbjAuc2VydmljZQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC13aXJlZC5zZXJ2aWNlLmFyZy5pbiBiL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQtd2lyZWQuc2VydmljZS5hcmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzODRhZQotLS0gL2Rldi9udWxsCisrKyBiL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQtd2lyZWQuc2VydmljZS5hcmcuaW4KQEAgLTAsMCArMSwxMyBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1XUEEgc3VwcGxpY2FudCBkYWVtb24gKGludGVyZmFjZS0gYW5kIHdpcmVkIGRyaXZlci1zcGVjaWZpYyB2ZXJzaW9uKQorUmVxdWlyZXM9c3lzLXN1YnN5c3RlbS1uZXQtZGV2aWNlcy0laS5kZXZpY2UKK0FmdGVyPXN5cy1zdWJzeXN0ZW0tbmV0LWRldmljZXMtJWkuZGV2aWNlCisKKyMgTmV0d29ya01hbmFnZXIgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRoZSBkYnVzIHZlcnNpb24gaW5zdGVhZC4KKworW1NlcnZpY2VdCitUeXBlPXNpbXBsZQorRXhlY1N0YXJ0PUBCSU5ESVJAL3dwYV9zdXBwbGljYW50IC1jL2V0Yy93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC13aXJlZC0lSS5jb25mIC1Ed2lyZWQgLWklSQorCitbSW5zdGFsbF0KK0FsaWFzPW11bHRpLXVzZXIudGFyZ2V0LndhbnRzL3dwYV9zdXBwbGljYW50LXdpcmVkQHdsYW4wLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3N5c3RlbWQvd3BhX3N1cHBsaWNhbnQuc2VydmljZS5hcmcuaW4gYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LnNlcnZpY2UuYXJnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTU1NjcKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LnNlcnZpY2UuYXJnLmluCkBAIC0wLDAgKzEsMTMgQEAKK1tVbml0XQorRGVzY3JpcHRpb249V1BBIHN1cHBsaWNhbnQgZGFlbW9uIChpbnRlcmZhY2Utc3BlY2lmaWMgdmVyc2lvbikKK1JlcXVpcmVzPXN5cy1zdWJzeXN0ZW0tbmV0LWRldmljZXMtJWkuZGV2aWNlCitBZnRlcj1zeXMtc3Vic3lzdGVtLW5ldC1kZXZpY2VzLSVpLmRldmljZQorCisjIE5ldHdvcmtNYW5hZ2VyIHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0aGUgZGJ1cyB2ZXJzaW9uIGluc3RlYWQuCisKK1tTZXJ2aWNlXQorVHlwZT1zaW1wbGUKK0V4ZWNTdGFydD1AQklORElSQC93cGFfc3VwcGxpY2FudCAtYy9ldGMvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQtJUkuY29uZiAtaSVJCisKK1tJbnN0YWxsXQorQWxpYXM9bXVsdGktdXNlci50YXJnZXQud2FudHMvd3BhX3N1cHBsaWNhbnRAd2xhbjAuc2VydmljZQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC5zZXJ2aWNlLmluIGIvd3BhX3N1cHBsaWNhbnQvc3lzdGVtZC93cGFfc3VwcGxpY2FudC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTFhZDgKLS0tIC9kZXYvbnVsbAorKysgYi93cGFfc3VwcGxpY2FudC9zeXN0ZW1kL3dwYV9zdXBwbGljYW50LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxMSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1XUEEgc3VwcGxpY2FudAorCitbU2VydmljZV0KK1R5cGU9ZGJ1cworQnVzTmFtZT1maS5lcGl0ZXN0Lmhvc3RhcC5XUEFTdXBwbGljYW50CitFeGVjU3RhcnQ9QEJJTkRJUkAvd3BhX3N1cHBsaWNhbnQgLXUKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAorQWxpYXM9ZGJ1cy1maS5lcGl0ZXN0Lmhvc3RhcC5XUEFTdXBwbGljYW50LnNlcnZpY2UKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3Rlc3RzL3Rlc3Rfd3BhLmMgYi93cGFfc3VwcGxpY2FudC90ZXN0cy90ZXN0X3dwYS5jCmluZGV4IDBkNjU5YWQuLmJhMmJlNmYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3Rlc3RzL3Rlc3Rfd3BhLmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvdGVzdHMvdGVzdF93cGEuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgIi4uL2NvbmZpZy5oIgogI2luY2x1ZGUgInJzbl9zdXBwL3dwYS5oIgogI2luY2x1ZGUgInJzbl9zdXBwL3dwYV9pZS5oIgotI2luY2x1ZGUgIi4uL2hvc3RhcGQvd3BhLmgiCisjaW5jbHVkZSAiYXAvd3BhX2F1dGguaCIKIAogCiBleHRlcm4gaW50IHdwYV9kZWJ1Z19sZXZlbDsKZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3V0aWxzL2xvZzJwY2FwLnB5IGIvd3BhX3N1cHBsaWNhbnQvdXRpbHMvbG9nMnBjYXAucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjVlMmZhMQotLS0gL2Rldi9udWxsCisrKyBiL3dwYV9zdXBwbGljYW50L3V0aWxzL2xvZzJwY2FwLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcjogSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgU2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgorCitpbXBvcnQgc3lzLCBzdHJ1Y3QsIHJlCisKK2RlZiB3cml0ZV9wY2FwX2hlYWRlcihwY2FwX2ZpbGUpOgorICAgIHBjYXBfZmlsZS53cml0ZSgKKyAgICAgICAgc3RydWN0LnBhY2soJzxJSEhJSUlJJywKKyAgICAgICAgICAgICAgICAgICAgMHhhMWIyYzNkNCwgMiwgNCwgMCwgMCwgNjU1MzUsCisgICAgICAgICAgICAgICAgICAgIDEwNSAjIHJhdyA4MDIuMTEgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICkpCisKK2RlZiBwY2FwX2FkZHBhY2tldChwY2FwX2ZpbGUsIHRzLCBkYXRhKToKKyAgICAjIHRzIGluIHNlY29uZHMsIGZsb2F0CisgICAgcGNhcF9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8SUlJSScsCisgICAgICAgIGludCh0cyksIGludCgxMDAwMDAwICogdHMpICUgMTAwMDAwMCwKKyAgICAgICAgbGVuKGRhdGEpLCBsZW4oZGF0YSkpKQorICAgIHBjYXBfZmlsZS53cml0ZShkYXRhKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRyeToKKyAgICAgICAgaW5wdXQgPSBzeXMuYXJndlsxXQorICAgICAgICBwY2FwID0gc3lzLmFyZ3ZbMl0KKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcHJpbnQgIlVzYWdlOiAlcyA8bG9nIGZpbGU+IDxwY2FwIGZpbGU+IiAlIHN5cy5hcmd2WzBdCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBpbnB1dF9maWxlID0gb3BlbihpbnB1dCwgJ3InKQorICAgIHBjYXBfZmlsZSA9IG9wZW4ocGNhcCwgJ3cnKQorICAgIGZyYW1lX3JlID0gcmUuY29tcGlsZShyJygoWzAtOV0rLlswLTldezZ9KTpccyopP25sODAyMTE6IE1MTUUgZXZlbnQgZnJhbWUgLSBoZXhkdW1wXChsZW49WzAtOV0qXCk6KChccypbMC05YS1mQS1GXXsyfSkqKScpCisKKyAgICB3cml0ZV9wY2FwX2hlYWRlcihwY2FwX2ZpbGUpCisKKyAgICBmb3IgbGluZSBpbiBpbnB1dF9maWxlOgorICAgICAgICBtID0gZnJhbWVfcmUubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbS5ncm91cCgyKToKKyAgICAgICAgICAgIHRzID0gZmxvYXQobS5ncm91cCgyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRzID0gMAorICAgICAgICBoZXhkYXRhID0gbS5ncm91cCgzKQorICAgICAgICBoZXhkYXRhID0gaGV4ZGF0YS5zcGxpdCgpCisgICAgICAgIGRhdGEgPSAnJy5qb2luKFtjaHIoaW50KHgsIDE2KSkgZm9yIHggaW4gaGV4ZGF0YV0pCisgICAgICAgIHBjYXBfYWRkcGFja2V0KHBjYXBfZmlsZSwgdHMsIGRhdGEpCisKKyAgICBpbnB1dF9maWxlLmNsb3NlKCkKKyAgICBwY2FwX2ZpbGUuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd25tX3N0YS5jIGIvd3BhX3N1cHBsaWNhbnQvd25tX3N0YS5jCmluZGV4IDk4Y2U5NjYuLjRkOWU0NTMgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dubV9zdGEuYworKysgYi93cGFfc3VwcGxpY2FudC93bm1fc3RhLmMKQEAgLTExLDEyICsxMSwxMiBAQAogI2luY2x1ZGUgInV0aWxzL2NvbW1vbi5oIgogI2luY2x1ZGUgImNvbW1vbi9pZWVlODAyXzExX2RlZnMuaCIKICNpbmNsdWRlICJyc25fc3VwcC93cGEuaCIKLSNpbmNsdWRlICIuLi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudF9pLmgiCi0jaW5jbHVkZSAiLi4vd3BhX3N1cHBsaWNhbnQvZHJpdmVyX2kuaCIKKyNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudF9pLmgiCisjaW5jbHVkZSAiZHJpdmVyX2kuaCIKKyNpbmNsdWRlICJzY2FuLmgiCiAKICNkZWZpbmUgTUFYX1RGU19JRV9MRU4gIDEwMjQKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFWCiAKIC8qIGdldCB0aGUgVEZTIElFIGZyb20gZHJpdmVyICovCiBzdGF0aWMgaW50IGllZWU4MDIxMV8xMV9nZXRfdGZzX2llKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHU4ICpidWYsCkBAIC00MSw3ICs0MSw3IEBACiAKIC8qIE1MTUUtU0xFRVBNT0RFLnJlcXVlc3QgKi8KIGludCBpZWVlODAyXzExX3NlbmRfd25tc2xlZXBfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCQkJIHU4IGFjdGlvbiwgdTggaW50dmFsKQorCQkJCSB1OCBhY3Rpb24sIHUxNiBpbnR2YWwsIHN0cnVjdCB3cGFidWYgKnRmc19yZXEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCWludCByZXM7CkBAIC01Myw2ICs1MywxMSBAQAogCWVudW0gd25tX29wZXIgdGZzX29wZXIgPSBhY3Rpb24gPT0gMCA/IFdOTV9TTEVFUF9URlNfUkVRX0lFX0FERCA6CiAJCVdOTV9TTEVFUF9URlNfUkVRX0lFX05PTkU7CiAKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogUmVxdWVzdCB0byBzZW5kIFdOTS1TbGVlcCBNb2RlIFJlcXVlc3QgIgorCQkgICAiYWN0aW9uPSVzIHRvICIgTUFDU1RSLAorCQkgICBhY3Rpb24gPT0gMCA/ICJlbnRlciIgOiAiZXhpdCIsCisJCSAgIE1BQzJTVFIod3BhX3MtPmJzc2lkKSk7CisKIAkvKiBXTk0tU2xlZXAgTW9kZSBJRSAqLwogCXdubXNsZWVwX2llX2xlbiA9IHNpemVvZihzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQpOwogCXdubXNsZWVwX2llID0gb3NfemFsbG9jKHNpemVvZihzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQpKTsKQEAgLTYyLDI1ICs2Nyw0MSBAQAogCXdubXNsZWVwX2llLT5sZW4gPSB3bm1zbGVlcF9pZV9sZW4gLSAyOwogCXdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9IGFjdGlvbjsKIAl3bm1zbGVlcF9pZS0+c3RhdHVzID0gV05NX1NUQVRVU19TTEVFUF9BQ0NFUFQ7Ci0Jd25tc2xlZXBfaWUtPmludHZhbCA9IGludHZhbDsKKwl3bm1zbGVlcF9pZS0+aW50dmFsID0gaG9zdF90b19sZTE2KGludHZhbCk7CisJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV05NOiBXTk0tU2xlZXAgTW9kZSBlbGVtZW50IiwKKwkJICAgICh1OCAqKSB3bm1zbGVlcF9pZSwgd25tc2xlZXBfaWVfbGVuKTsKIAogCS8qIFRGUyBJRShzKSAqLwotCXdubXRmc19pZSA9IG9zX3phbGxvYyhNQVhfVEZTX0lFX0xFTik7Ci0JaWYgKHdubXRmc19pZSA9PSBOVUxMKSB7Ci0JCW9zX2ZyZWUod25tc2xlZXBfaWUpOwotCQlyZXR1cm4gLTE7CisJaWYgKHRmc19yZXEpIHsKKwkJd25tdGZzX2llX2xlbiA9IHdwYWJ1Zl9sZW4odGZzX3JlcSk7CisJCXdubXRmc19pZSA9IG9zX21hbGxvYyh3bm10ZnNfaWVfbGVuKTsKKwkJaWYgKHdubXRmc19pZSA9PSBOVUxMKSB7CisJCQlvc19mcmVlKHdubXNsZWVwX2llKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvc19tZW1jcHkod25tdGZzX2llLCB3cGFidWZfaGVhZCh0ZnNfcmVxKSwgd25tdGZzX2llX2xlbik7CisJfSBlbHNlIHsKKwkJd25tdGZzX2llID0gb3NfemFsbG9jKE1BWF9URlNfSUVfTEVOKTsKKwkJaWYgKHdubXRmc19pZSA9PSBOVUxMKSB7CisJCQlvc19mcmVlKHdubXNsZWVwX2llKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoaWVlZTgwMjExXzExX2dldF90ZnNfaWUod3BhX3MsIHdubXRmc19pZSwgJndubXRmc19pZV9sZW4sCisJCQkJCSAgICB0ZnNfb3BlcikpIHsKKwkJCXdubXRmc19pZV9sZW4gPSAwOworCQkJb3NfZnJlZSh3bm10ZnNfaWUpOworCQkJd25tdGZzX2llID0gTlVMTDsKKwkJfQogCX0KLQlpZiAoaWVlZTgwMjExXzExX2dldF90ZnNfaWUod3BhX3MsIHdubXRmc19pZSwgJndubXRmc19pZV9sZW4sCi0JCQkJICAgIHRmc19vcGVyKSkgewotCQl3bm10ZnNfaWVfbGVuID0gMDsKLQkJb3NfZnJlZSh3bm10ZnNfaWUpOwotCQl3bm10ZnNfaWUgPSBOVUxMOwotCX0KKwl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJXTk06IFRGUyBSZXF1ZXN0IGVsZW1lbnQiLAorCQkgICAgKHU4ICopIHdubXRmc19pZSwgd25tdGZzX2llX2xlbik7CiAKIAltZ210ID0gb3NfemFsbG9jKHNpemVvZigqbWdtdCkgKyB3bm1zbGVlcF9pZV9sZW4gKyB3bm10ZnNfaWVfbGVuKTsKIAlpZiAobWdtdCA9PSBOVUxMKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiTUxNRTogRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgIgogCQkJICAgIldOTS1TbGVlcCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSIpOworCQlvc19mcmVlKHdubXNsZWVwX2llKTsKKwkJb3NfZnJlZSh3bm10ZnNfaWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05MSw2ICsxMTIsNyBAQAogCQkJCQkgICBXTEFOX0ZDX1NUWVBFX0FDVElPTik7CiAJbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0FDVElPTl9XTk07CiAJbWdtdC0+dS5hY3Rpb24udS53bm1fc2xlZXBfcmVxLmFjdGlvbiA9IFdOTV9TTEVFUF9NT0RFX1JFUTsKKwltZ210LT51LmFjdGlvbi51LndubV9zbGVlcF9yZXEuZGlhbG9ndG9rZW4gPSAxOwogCW9zX21lbWNweShtZ210LT51LmFjdGlvbi51LndubV9zbGVlcF9yZXEudmFyaWFibGUsIHdubXNsZWVwX2llLAogCQkgIHdubXNsZWVwX2llX2xlbik7CiAJLyogY29weSBURlMgSUUgaGVyZSAqLwpAQCAtMTE3LDYgKzEzOSw5MiBAQAogfQogCiAKK3N0YXRpYyB2b2lkIHdubV9zbGVlcF9tb2RlX2VudGVyX3N1Y2Nlc3Moc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJIHU4ICp0ZnNyZXNwX2llX3N0YXJ0LAorCQkJCQkgdTggKnRmc3Jlc3BfaWVfZW5kKQoreworCXdwYV9kcnZfd25tX29wZXIod3BhX3MsIFdOTV9TTEVFUF9FTlRFUl9DT05GSVJNLAorCQkJIHdwYV9zLT5ic3NpZCwgTlVMTCwgTlVMTCk7CisJLyogcmVtb3ZlIEdUSy9JR1RLID8/ICovCisKKwkvKiBzZXQgdGhlIFRGUyBSZXNwIElFKHMpICovCisJaWYgKHRmc3Jlc3BfaWVfc3RhcnQgJiYgdGZzcmVzcF9pZV9lbmQgJiYKKwkgICAgdGZzcmVzcF9pZV9lbmQgLSB0ZnNyZXNwX2llX3N0YXJ0ID49IDApIHsKKwkJdTE2IHRmc3Jlc3BfaWVfbGVuOworCQl0ZnNyZXNwX2llX2xlbiA9ICh0ZnNyZXNwX2llX2VuZCArIHRmc3Jlc3BfaWVfZW5kWzFdICsgMikgLQorCQkJdGZzcmVzcF9pZV9zdGFydDsKKwkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURlMgUmVzcCBJRShzKSBmb3VuZCIpOworCQkvKiBwYXNzIHRoZSBURlMgUmVzcCBJRShzKSB0byBkcml2ZXIgZm9yIHByb2Nlc3NpbmcgKi8KKwkJaWYgKGllZWU4MDIxMV8xMV9zZXRfdGZzX2llKHdwYV9zLCB3cGFfcy0+YnNzaWQsCisJCQkJCSAgICB0ZnNyZXNwX2llX3N0YXJ0LAorCQkJCQkgICAgJnRmc3Jlc3BfaWVfbGVuLAorCQkJCQkgICAgV05NX1NMRUVQX1RGU19SRVNQX0lFX1NFVCkpCisJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogRmFpbCB0byBzZXQgVEZTIFJlc3AgSUUiKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgd25tX3NsZWVwX21vZGVfZXhpdF9zdWNjZXNzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCWNvbnN0IHU4ICpmcm0sIHUxNiBrZXlfbGVuX3RvdGFsKQoreworCXU4ICpwdHIsICplbmQ7CisJdTggZ3RrX2xlbjsKKworCXdwYV9kcnZfd25tX29wZXIod3BhX3MsIFdOTV9TTEVFUF9FWElUX0NPTkZJUk0sICB3cGFfcy0+YnNzaWQsCisJCQkgTlVMTCwgTlVMTCk7CisKKwkvKiBJbnN0YWxsIEdUSy9JR1RLICovCisKKwkvKiBwb2ludCB0byBrZXkgZGF0YSBmaWVsZCAqLworCXB0ciA9ICh1OCAqKSBmcm0gKyAxICsgMSArIDI7CisJZW5kID0gcHRyICsga2V5X2xlbl90b3RhbDsKKwl3cGFfaGV4ZHVtcF9rZXkoTVNHX0RFQlVHLCAiV05NOiBLZXkgRGF0YSIsIHB0ciwga2V5X2xlbl90b3RhbCk7CisKKwl3aGlsZSAocHRyICsgMSA8IGVuZCkgeworCQlpZiAocHRyICsgMiArIHB0clsxXSA+IGVuZCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEludmFsaWQgS2V5IERhdGEgZWxlbWVudCAiCisJCQkJICAgImxlbmd0aCIpOworCQkJaWYgKGVuZCA+IHB0cikgeworCQkJCXdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldOTTogUmVtYWluaW5nIGRhdGEiLAorCQkJCQkgICAgcHRyLCBlbmQgLSBwdHIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCpwdHIgPT0gV05NX1NMRUVQX1NVQkVMRU1fR1RLKSB7CisJCQlpZiAocHRyWzFdIDwgMTEgKyA1KSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFRvbyBzaG9ydCBHVEsgIgorCQkJCQkgICAic3ViZWxlbSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZ3RrX2xlbiA9ICoocHRyICsgNCk7CisJCQlpZiAocHRyWzFdIDwgMTEgKyBndGtfbGVuIHx8CisJCQkgICAgZ3RrX2xlbiA8IDUgfHwgZ3RrX2xlbiA+IDMyKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEludmFsaWQgR1RLICIKKwkJCQkJICAgInN1YmVsZW0iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXdwYV93bm1zbGVlcF9pbnN0YWxsX2tleSgKKwkJCQl3cGFfcy0+d3BhLAorCQkJCVdOTV9TTEVFUF9TVUJFTEVNX0dUSywKKwkJCQlwdHIpOworCQkJcHRyICs9IDEzICsgZ3RrX2xlbjsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExVworCQl9IGVsc2UgaWYgKCpwdHIgPT0gV05NX1NMRUVQX1NVQkVMRU1fSUdUSykgeworCQkJaWYgKHB0clsxXSA8IDIgKyA2ICsgV1BBX0lHVEtfTEVOKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IFRvbyBzaG9ydCBJR1RLICIKKwkJCQkJICAgInN1YmVsZW0iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXdwYV93bm1zbGVlcF9pbnN0YWxsX2tleSh3cGFfcy0+d3BhLAorCQkJCQkJIFdOTV9TTEVFUF9TVUJFTEVNX0lHVEssIHB0cik7CisJCQlwdHIgKz0gMTAgKyBXUEFfSUdUS19MRU47CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KKwkJfSBlbHNlCisJCQlicmVhazsgLyogc2tpcCB0aGUgbG9vcCAqLworCX0KK30KKworCiBzdGF0aWMgdm9pZCBpZWVlODAyXzExX3J4X3dubXNsZWVwX3Jlc3Aoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkJY29uc3QgdTggKmZybSwgaW50IGxlbikKIHsKQEAgLTEyNiwyMSArMjM0LDI1IEBACiAJICovCiAJdTggKnBvcyA9ICh1OCAqKSBmcm07IC8qIHBvaW50IHRvIGFjdGlvbiBmaWVsZCAqLwogCXUxNiBrZXlfbGVuX3RvdGFsID0gbGVfdG9faG9zdDE2KCooKHUxNiAqKShmcm0rMikpKTsKLQl1OCBndGtfbGVuOwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCi0JdTggaWd0a19sZW47Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KIAlzdHJ1Y3Qgd25tX3NsZWVwX2VsZW1lbnQgKndubXNsZWVwX2llID0gTlVMTDsKIAkvKiBtdWx0aXBsZSBURlMgUmVzcCBJRSAoYXNzdW1pbmcgY29uc2VjdXRpdmUpICovCiAJdTggKnRmc3Jlc3BfaWVfc3RhcnQgPSBOVUxMOwogCXU4ICp0ZnNyZXNwX2llX2VuZCA9IE5VTEw7Ci0JdTE2IHRmc3Jlc3BfaWVfbGVuID0gMDsKIAogCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWN0aW9uPSVkIHRva2VuID0gJWQga2V5X2xlbl90b3RhbCA9ICVkIiwKIAkJICAgZnJtWzBdLCBmcm1bMV0sIGtleV9sZW5fdG90YWwpOwogCXBvcyArPSA0ICsga2V5X2xlbl90b3RhbDsKKwlpZiAocG9zID4gZnJtICsgbGVuKSB7CisJCXdwYV9wcmludGYoTVNHX0lORk8sICJXTk06IFRvbyBzaG9ydCBmcmFtZSBmb3IgS2V5IERhdGEgZmllbGQiKTsKKwkJcmV0dXJuOworCX0KIAl3aGlsZSAocG9zIC0gZnJtIDwgbGVuKSB7CiAJCXU4IGllX2xlbiA9ICoocG9zICsgMSk7CisJCWlmIChwb3MgKyAyICsgaWVfbGVuID4gZnJtICsgbGVuKSB7CisJCQl3cGFfcHJpbnRmKE1TR19JTkZPLCAiV05NOiBJbnZhbGlkIElFIGxlbiAldSIsIGllX2xlbik7CisJCQlicmVhazsKKwkJfQorCQl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJXTk06IEVsZW1lbnQiLCBwb3MsIDIgKyBpZV9sZW4pOwogCQlpZiAoKnBvcyA9PSBXTEFOX0VJRF9XTk1TTEVFUCkKIAkJCXdubXNsZWVwX2llID0gKHN0cnVjdCB3bm1fc2xlZXBfZWxlbWVudCAqKSBwb3M7CiAJCWVsc2UgaWYgKCpwb3MgPT0gV0xBTl9FSURfVEZTX1JFU1ApIHsKQEAgLTE1Nyw4NiArMjY5LDE1MSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHdubXNsZWVwX2llLT5zdGF0dXMgPT0gV05NX1NUQVRVU19TTEVFUF9BQ0NFUFQpIHsKKwlpZiAod25tc2xlZXBfaWUtPnN0YXR1cyA9PSBXTk1fU1RBVFVTX1NMRUVQX0FDQ0VQVCB8fAorCSAgICB3bm1zbGVlcF9pZS0+c3RhdHVzID09IFdOTV9TVEFUVVNfU0xFRVBfRVhJVF9BQ0NFUFRfR1RLX1VQREFURSkgewogCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlN1Y2Nlc3NmdWxseSByZWN2IFdOTS1TbGVlcCBSZXNwb25zZSAiCiAJCQkgICAiZnJhbWUgKGFjdGlvbj0lZCwgaW50dmFsPSVkKSIsCiAJCQkgICB3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUsIHdubXNsZWVwX2llLT5pbnR2YWwpOwotCQlpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IDApIHsKLQkJCXdwYV9kcnZfd25tX29wZXIod3BhX3MsIFdOTV9TTEVFUF9FTlRFUl9DT05GSVJNLAotCQkJCQkgd3BhX3MtPmJzc2lkLCBOVUxMLCBOVUxMKTsKLQkJCS8qIHJlbW92ZSBHVEsvSUdUSyA/PyAqLwotCi0JCQkvKiBzZXQgdGhlIFRGUyBSZXNwIElFKHMpICovCi0JCQlpZiAodGZzcmVzcF9pZV9zdGFydCAmJiB0ZnNyZXNwX2llX2VuZCAmJgotCQkJICAgIHRmc3Jlc3BfaWVfZW5kIC0gdGZzcmVzcF9pZV9zdGFydCA+PSAwKSB7Ci0JCQkJdGZzcmVzcF9pZV9sZW4gPSAodGZzcmVzcF9pZV9lbmQgKwotCQkJCQkJICB0ZnNyZXNwX2llX2VuZFsxXSArIDIpIC0KLQkJCQkJdGZzcmVzcF9pZV9zdGFydDsKLQkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRGUyBSZXNwIElFKHMpIGZvdW5kIik7Ci0JCQkJLyoKLQkJCQkgKiBwYXNzIHRoZSBURlMgUmVzcCBJRShzKSB0byBkcml2ZXIgZm9yCi0JCQkJICogcHJvY2Vzc2luZwotCQkJCSAqLwotCQkJCWlmIChpZWVlODAyMTFfMTFfc2V0X3Rmc19pZSgKLQkJCQkJICAgIHdwYV9zLCB3cGFfcy0+YnNzaWQsCi0JCQkJCSAgICB0ZnNyZXNwX2llX3N0YXJ0LAotCQkJCQkgICAgJnRmc3Jlc3BfaWVfbGVuLAotCQkJCQkgICAgV05NX1NMRUVQX1RGU19SRVNQX0lFX1NFVCkpCi0JCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRmFpbCB0byBzZXQgIgotCQkJCQkJICAgIlRGUyBSZXNwIElFIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IDEpIHsKLQkJCXdwYV9kcnZfd25tX29wZXIod3BhX3MsIFdOTV9TTEVFUF9FWElUX0NPTkZJUk0sCi0JCQkJCSB3cGFfcy0+YnNzaWQsIE5VTEwsIE5VTEwpOwotCQkJLyogSW5zdGFsbCBHVEsvSUdUSyAqLwotCQkJZG8gewotCQkJCS8qIHBvaW50IHRvIGtleSBkYXRhIGZpZWxkICovCi0JCQkJdTggKnB0ciA9ICh1OCAqKSBmcm0gKyAxICsgMSArIDI7Ci0JCQkJd2hpbGUgKHB0ciA8ICh1OCAqKSBmcm0gKyA0ICsga2V5X2xlbl90b3RhbCkgewotCQkJCQlpZiAoKnB0ciA9PSBXTk1fU0xFRVBfU1VCRUxFTV9HVEspIHsKLQkJCQkJCWd0a19sZW4gPSAqKHB0ciArIDQpOwotCQkJCQkJd3BhX3dubXNsZWVwX2luc3RhbGxfa2V5KAotCQkJCQkJCXdwYV9zLT53cGEsCi0JCQkJCQkJV05NX1NMRUVQX1NVQkVMRU1fR1RLLAotCQkJCQkJCXB0cik7Ci0JCQkJCQlwdHIgKz0gMTMgKyBndGtfbGVuOwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCi0JCQkJCX0gZWxzZSBpZiAoKnB0ciA9PQotCQkJCQkJICAgV05NX1NMRUVQX1NVQkVMRU1fSUdUSykgewotCQkJCQkJaWd0a19sZW4gPSBXUEFfSUdUS19MRU47Ci0JCQkJCQl3cGFfd25tc2xlZXBfaW5zdGFsbF9rZXkoCi0JCQkJCQkJd3BhX3MtPndwYSwKLQkJCQkJCQlXTk1fU0xFRVBfU1VCRUxFTV9JR1RLLAotCQkJCQkJCXB0cik7Ci0JCQkJCQlwdHIgKz0gMTAgKyBXUEFfSUdUS19MRU47Ci0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KLQkJCQkJfSBlbHNlCi0JCQkJCQlicmVhazsgLyogc2tpcCB0aGUgbG9vcCAqLwotCQkJCX0KLQkJCX0gd2hpbGUoMCk7CisJCWlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRU5URVIpIHsKKwkJCXdubV9zbGVlcF9tb2RlX2VudGVyX3N1Y2Nlc3Mod3BhX3MsIHRmc3Jlc3BfaWVfc3RhcnQsCisJCQkJCQkgICAgIHRmc3Jlc3BfaWVfZW5kKTsKKwkJfSBlbHNlIGlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gV05NX1NMRUVQX01PREVfRVhJVCkgeworCQkJd25tX3NsZWVwX21vZGVfZXhpdF9zdWNjZXNzKHdwYV9zLCBmcm0sIGtleV9sZW5fdG90YWwpOwogCQl9CiAJfSBlbHNlIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJSZWplY3QgcmVjdiBXTk0tU2xlZXAgUmVzcG9uc2UgZnJhbWUgIgogCQkJICAgIihhY3Rpb249JWQsIGludHZhbD0lZCkiLAogCQkJICAgd25tc2xlZXBfaWUtPmFjdGlvbl90eXBlLCB3bm1zbGVlcF9pZS0+aW50dmFsKTsKLQkJaWYgKHdubXNsZWVwX2llLT5hY3Rpb25fdHlwZSA9PSAwKQorCQlpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VOVEVSKQogCQkJd3BhX2Rydl93bm1fb3Blcih3cGFfcywgV05NX1NMRUVQX0VOVEVSX0ZBSUwsCiAJCQkJCSB3cGFfcy0+YnNzaWQsIE5VTEwsIE5VTEwpOwotCQllbHNlIGlmICh3bm1zbGVlcF9pZS0+YWN0aW9uX3R5cGUgPT0gMSkKKwkJZWxzZSBpZiAod25tc2xlZXBfaWUtPmFjdGlvbl90eXBlID09IFdOTV9TTEVFUF9NT0RFX0VYSVQpCiAJCQl3cGFfZHJ2X3dubV9vcGVyKHdwYV9zLCBXTk1fU0xFRVBfRVhJVF9GQUlMLAogCQkJCQkgd3BhX3MtPmJzc2lkLCBOVUxMLCBOVUxMKTsKIAl9CiB9CiAKIAorc3RhdGljIHZvaWQgd25tX3NlbmRfYnNzX3RyYW5zaXRpb25fbWdtdF9yZXNwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJCSAgICAgIHU4IGRpYWxvZ190b2tlbiwgdTggc3RhdHVzLAorCQkJCQkgICAgICB1OCBkZWxheSwgY29uc3QgdTggKnRhcmdldF9ic3NpZCkKK3sKKwl1OCBidWZbMTAwMF0sICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXNpemVfdCBsZW47CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogU2VuZCBCU1MgVHJhbnNpdGlvbiBNYW5hZ2VtZW50IFJlc3BvbnNlICIKKwkJICAgInRvICIgTUFDU1RSICIgZGlhbG9nX3Rva2VuPSV1IHN0YXR1cz0ldSBkZWxheT0lZCIsCisJCSAgIE1BQzJTVFIod3BhX3MtPmJzc2lkKSwgZGlhbG9nX3Rva2VuLCBzdGF0dXMsIGRlbGF5KTsKKworCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIGJ1ZjsKKwlvc19tZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCW9zX21lbWNweShtZ210LT5kYSwgd3BhX3MtPmJzc2lkLCBFVEhfQUxFTik7CisJb3NfbWVtY3B5KG1nbXQtPnNhLCB3cGFfcy0+b3duX2FkZHIsIEVUSF9BTEVOKTsKKwlvc19tZW1jcHkobWdtdC0+YnNzaWQsIHdwYV9zLT5ic3NpZCwgRVRIX0FMRU4pOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoV0xBTl9GQ19UWVBFX01HTVQsCisJCQkJCSAgIFdMQU5fRkNfU1RZUEVfQUNUSU9OKTsKKwltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQUNUSU9OX1dOTTsKKwltZ210LT51LmFjdGlvbi51LmJzc190bV9yZXNwLmFjdGlvbiA9IFdOTV9CU1NfVFJBTlNfTUdNVF9SRVNQOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3Jlc3AuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOworCW1nbXQtPnUuYWN0aW9uLnUuYnNzX3RtX3Jlc3Auc3RhdHVzX2NvZGUgPSBzdGF0dXM7CisJbWdtdC0+dS5hY3Rpb24udS5ic3NfdG1fcmVzcC5ic3NfdGVybWluYXRpb25fZGVsYXkgPSBkZWxheTsKKwlwb3MgPSBtZ210LT51LmFjdGlvbi51LmJzc190bV9yZXNwLnZhcmlhYmxlOworCWlmICh0YXJnZXRfYnNzaWQpIHsKKwkJb3NfbWVtY3B5KHBvcywgdGFyZ2V0X2Jzc2lkLCBFVEhfQUxFTik7CisJCXBvcyArPSBFVEhfQUxFTjsKKwl9CisKKwlsZW4gPSBwb3MgLSAodTggKikgJm1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OworCisJd3BhX2Rydl9zZW5kX2FjdGlvbih3cGFfcywgd3BhX3MtPmFzc29jX2ZyZXEsIDAsIHdwYV9zLT5ic3NpZCwKKwkJCSAgICB3cGFfcy0+b3duX2FkZHIsIHdwYV9zLT5ic3NpZCwKKwkJCSAgICAmbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnksIGxlbiwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgaWVlZTgwMl8xMV9yeF9ic3NfdHJhbnNfbWdtdF9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkJICAgICBjb25zdCB1OCAqcG9zLCBjb25zdCB1OCAqZW5kLAorCQkJCQkgICAgIGludCByZXBseSkKK3sKKwl1OCBkaWFsb2dfdG9rZW47CisJdTggbW9kZTsKKwl1MTYgZGlzYXNzb2NfdGltZXI7CisKKwlpZiAocG9zICsgNSA+IGVuZCkKKwkJcmV0dXJuOworCisJZGlhbG9nX3Rva2VuID0gcG9zWzBdOworCW1vZGUgPSBwb3NbMV07CisJZGlzYXNzb2NfdGltZXIgPSBXUEFfR0VUX0xFMTYocG9zICsgMik7CisKKwl3cGFfcHJpbnRmKE1TR19ERUJVRywgIldOTTogQlNTIFRyYW5zaXRpb24gTWFuYWdlbWVudCBSZXF1ZXN0OiAiCisJCSAgICJkaWFsb2dfdG9rZW49JXUgcmVxdWVzdF9tb2RlPTB4JXggIgorCQkgICAiZGlzYXNzb2NfdGltZXI9JXUgdmFsaWRpdHlfaW50ZXJ2YWw9JXUiLAorCQkgICBkaWFsb2dfdG9rZW4sIG1vZGUsIGRpc2Fzc29jX3RpbWVyLCBwb3NbNF0pOworCXBvcyArPSA1OworCWlmIChtb2RlICYgMHgwOCkKKwkJcG9zICs9IDEyOyAvKiBCU1MgVGVybWluYXRpb24gRHVyYXRpb24gKi8KKwlpZiAobW9kZSAmIDB4MTApIHsKKwkJY2hhciB1cmxbMjU2XTsKKwkJaWYgKHBvcyArIDEgPiBlbmQgfHwgcG9zICsgMSArIHBvc1swXSA+IGVuZCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXTk06IEludmFsaWQgQlNTIFRyYW5zaXRpb24gIgorCQkJCSAgICJNYW5hZ2VtZW50IFJlcXVlc3QgKFVSTCkiKTsKKwkJCXJldHVybjsKKwkJfQorCQlvc19tZW1jcHkodXJsLCBwb3MgKyAxLCBwb3NbMF0pOworCQl1cmxbcG9zWzBdXSA9ICdcMCc7CisJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiV05NOiBFU1MgRGlzYXNzb2NpYXRpb24gSW1taW5lbnQgLSAiCisJCQkic2Vzc2lvbl9pbmZvX3VybD0lcyIsIHVybCk7CisJfQorCisJaWYgKG1vZGUgJiAweDA0KSB7CisJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCAiV05NOiBEaXNhc3NvY2lhdGlvbiBJbW1pbmVudCAtICIKKwkJCSJEaXNhc3NvY2lhdGlvbiBUaW1lciAldSIsIGRpc2Fzc29jX3RpbWVyKTsKKwkJaWYgKGRpc2Fzc29jX3RpbWVyICYmICF3cGFfcy0+c2Nhbm5pbmcpIHsKKwkJCS8qIFRPRE86IG1hcmsgY3VycmVudCBCU1MgbGVzcyBwcmVmZXJyZWQgZm9yCisJCQkgKiBzZWxlY3Rpb24gKi8KKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVHJ5aW5nIHRvIGZpbmQgYW5vdGhlciBCU1MiKTsKKwkJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKKwkJfQorCX0KKworCWlmIChyZXBseSkgeworCQkvKiBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgcmVwb3J0aW5nIEFjY2VwdCAqLworCQl3bm1fc2VuZF9ic3NfdHJhbnNpdGlvbl9tZ210X3Jlc3Aod3BhX3MsIGRpYWxvZ190b2tlbiwKKwkJCQkJCSAgMSAvKiBSZWplY3QgLSB1bnNwZWNpZmllZCAqLywKKwkJCQkJCSAgMCwgTlVMTCk7CisJfQorfQorCisKIHZvaWQgaWVlZTgwMl8xMV9yeF93bm1fYWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkgICAgICBzdHJ1Y3QgcnhfYWN0aW9uICphY3Rpb24pCiB7Ci0JdTggKnBvcyA9ICh1OCAqKSBhY3Rpb24tPmRhdGE7IC8qIHBvaW50IHRvIGFjdGlvbiBmaWVsZCAqLwotCXU4IGFjdCA9ICpwb3MrKzsKLQkvKiB1OCBkaWFsb2dfdG9rZW4gPSAqcG9zKys7ICovCisJY29uc3QgdTggKnBvcywgKmVuZDsKKwl1OCBhY3Q7CisKKwlpZiAoYWN0aW9uLT5kYXRhID09IE5VTEwgfHwgYWN0aW9uLT5sZW4gPT0gMCkKKwkJcmV0dXJuOworCisJcG9zID0gYWN0aW9uLT5kYXRhOworCWVuZCA9IHBvcyArIGFjdGlvbi0+bGVuOworCWFjdCA9ICpwb3MrKzsKKworCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBSWCBhY3Rpb24gJXUgZnJvbSAiIE1BQ1NUUiwKKwkJICAgYWN0LCBNQUMyU1RSKGFjdGlvbi0+c2EpKTsKKwlpZiAod3BhX3MtPndwYV9zdGF0ZSA8IFdQQV9BU1NPQ0lBVEVEIHx8CisJICAgIG9zX21lbWNtcChhY3Rpb24tPnNhLCB3cGFfcy0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV05NOiBJZ25vcmUgdW5leHBlY3RlZCBXTk0gQWN0aW9uICIKKwkJCSAgICJmcmFtZSIpOworCQlyZXR1cm47CisJfQogCiAJc3dpdGNoIChhY3QpIHsKKwljYXNlIFdOTV9CU1NfVFJBTlNfTUdNVF9SRVE6CisJCWllZWU4MDJfMTFfcnhfYnNzX3RyYW5zX21nbXRfcmVxKHdwYV9zLCBwb3MsIGVuZCwKKwkJCQkJCSAhKGFjdGlvbi0+ZGFbMF0gJiAweDAxKSk7CisJCWJyZWFrOwogCWNhc2UgV05NX1NMRUVQX01PREVfUkVTUDoKIAkJaWVlZTgwMl8xMV9yeF93bm1zbGVlcF9yZXNwKHdwYV9zLCBhY3Rpb24tPmRhdGEsIGFjdGlvbi0+bGVuKTsKIAkJYnJlYWs7CkBAIC0yNDQsNSArNDIxLDMgQEAKIAkJYnJlYWs7CiAJfQogfQotCi0jZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVYgKi8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dubV9zdGEuaCBiL3dwYV9zdXBwbGljYW50L3dubV9zdGEuaAppbmRleCBiYTI1MzViLi4zZjlkODhiIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93bm1fc3RhLmgKKysrIGIvd3BhX3N1cHBsaWNhbnQvd25tX3N0YS5oCkBAIC0xMyw3ICsxMyw3IEBACiBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQ7CiAKIGludCBpZWVlODAyXzExX3NlbmRfd25tc2xlZXBfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCi0JCQkJIHU4IGFjdGlvbiwgdTggaW50dmFsKTsKKwkJCQkgdTggYWN0aW9uLCB1MTYgaW50dmFsLCBzdHJ1Y3Qgd3BhYnVmICp0ZnNfcmVxKTsKIAogdm9pZCBpZWVlODAyXzExX3J4X3dubV9hY3Rpb24oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgIHN0cnVjdCByeF9hY3Rpb24gKmFjdGlvbik7CmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC93cGFfY2xpLmMgYi93cGFfc3VwcGxpY2FudC93cGFfY2xpLmMKaW5kZXggMzk4NmI5Yi4uY2MwODAwOSAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd3BhX2NsaS5jCisrKyBiL3dwYV9zdXBwbGljYW50L3dwYV9jbGkuYwpAQCAtMjgsNyArMjgsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqd3BhX2NsaV92ZXJzaW9uID0KICJ3cGFfY2xpIHYiIFZFUlNJT05fU1RSICJcbiIKLSJDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycyI7CisiQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+IGFuZCBjb250cmlidXRvcnMiOwogCiAKIHN0YXRpYyBjb25zdCBjaGFyICp3cGFfY2xpX2xpY2Vuc2UgPQpAQCAtNzYyLDI2ICs3NjIsNiBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfV1BTX09PQgotc3RhdGljIGludCB3cGFfY2xpX2NtZF93cHNfb29iKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpZiAoYXJnYyAhPSAzICYmIGFyZ2MgIT0gNCkgewotCQlwcmludGYoIkludmFsaWQgV1BTX09PQiBjb21tYW5kOiBuZWVkIHRocmVlIG9yIGZvdXIgIgotCQkgICAgICAgImFyZ3VtZW50czpcbiIKLQkJICAgICAgICItIERFVl9UWVBFOiB1c2UgJ3VmZCcgb3IgJ25mYydcbiIKLQkJICAgICAgICItIFBBVEg6IHBhdGggb2YgT09CIGRldmljZSBsaWtlICcvbW50J1xuIgotCQkgICAgICAgIi0gTUVUSE9EOiBPT0IgbWV0aG9kICdwaW4tZScgb3IgJ3Bpbi1yJywgIgotCQkgICAgICAgIidjcmVkJ1xuIgotCQkgICAgICAgIi0gREVWX05BTUU6IChvbmx5IGZvciBORkMpIGRldmljZSBuYW1lIGxpa2UgIgotCQkgICAgICAgIidwbjUzMSdcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHdwYV9jbGlfY21kKGN0cmwsICJXUFNfT09CIiwgMywgYXJnYywgYXJndik7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KLQotCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIAogc3RhdGljIGludCB3cGFfY2xpX2NtZF93cHNfbmZjKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKQEAgLTgyMiw2ICs4MDIsNzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3N0YXRpYyBpbnQgd3BhX2NsaV9jbWRfbmZjX2dldF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKKwkJCQkJICAgIGNoYXIgKmFyZ3ZbXSkKK3sKKwlyZXR1cm4gd3BhX2NsaV9jbWQoY3RybCwgIk5GQ19HRVRfSEFORE9WRVJfUkVRIiwgMiwgYXJnYywgYXJndik7Cit9CisKKworc3RhdGljIGludCB3cGFfY2xpX2NtZF9uZmNfZ2V0X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX2N0cmwgKmN0cmwsIGludCBhcmdjLAorCQkJCQkgICAgY2hhciAqYXJndltdKQoreworCXJldHVybiB3cGFfY2xpX2NtZChjdHJsLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwiLCAyLCBhcmdjLCBhcmd2KTsKK30KKworCitzdGF0aWMgaW50IHdwYV9jbGlfY21kX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9jdHJsICpjdHJsLCBpbnQgYXJnYywKKwkJCQkJICAgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisJY2hhciAqYnVmOworCXNpemVfdCBidWZsZW47CisKKwlpZiAoYXJnYyAhPSAxKSB7CisJCXByaW50ZigiSW52YWxpZCAnbmZjX3J4X2hhbmRvdmVyX3JlcScgY29tbWFuZCAtIG9uZSBhcmd1bWVudCAiCisJCSAgICAgICAiaXMgcmVxdWlyZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZmxlbiA9IDIxICsgb3Nfc3RybGVuKGFyZ3ZbMF0pOworCWJ1ZiA9IG9zX21hbGxvYyhidWZsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiTkZDX1JYX0hBTkRPVkVSX1JFUSAlcyIsIGFyZ3ZbMF0pOworCisJcmV0ID0gd3BhX2N0cmxfY29tbWFuZChjdHJsLCBidWYpOworCW9zX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3cGFfY2xpX2NtZF9uZmNfcnhfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsCisJCQkJCSAgIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgcmV0OworCWNoYXIgKmJ1ZjsKKwlzaXplX3QgYnVmbGVuOworCisJaWYgKGFyZ2MgIT0gMSkgeworCQlwcmludGYoIkludmFsaWQgJ25mY19yeF9oYW5kb3Zlcl9zZWwnIGNvbW1hbmQgLSBvbmUgYXJndW1lbnQgIgorCQkgICAgICAgImlzIHJlcXVpcmVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWZsZW4gPSAyMSArIG9zX3N0cmxlbihhcmd2WzBdKTsKKwlidWYgPSBvc19tYWxsb2MoYnVmbGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIk5GQ19SWF9IQU5ET1ZFUl9TRUwgJXMiLCBhcmd2WzBdKTsKKworCXJldCA9IHdwYV9jdHJsX2NvbW1hbmQoY3RybCwgYnVmKTsKKwlvc19mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAogCkBAIC0xMzMwLDcgKzEzNzYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoYXJnYyAhPSAzKSB7CisJaWYgKGFyZ2MgPCAzKSB7CiAJCXByaW50ZigiSW52YWxpZCBTRVRfTkVUV09SSyBjb21tYW5kOiBuZWVkcyB0aHJlZSBhcmd1bWVudHNcbiIKIAkJICAgICAgICIobmV0d29yayBpZCwgdmFyaWFibGUgbmFtZSwgYW5kIHZhbHVlKVxuIik7CiAJCXJldHVybiAtMTsKQEAgLTIyMjcsNiArMjI3MywxNiBAQAogI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLwogCiAKKyNpZmRlZiBDT05GSUdfV05NCisKK3N0YXRpYyBpbnQgd3BhX2NsaV9jbWRfd25tX3NsZWVwKHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlyZXR1cm4gd3BhX2NsaV9jbWQoY3RybCwgIldOTV9TTEVFUCIsIDAsIGFyZ2MsIGFyZ3YpOworfQorCisjZW5kaWYgLyogQ09ORklHX1dOTSAqLworCisKIHN0YXRpYyBpbnQgd3BhX2NsaV9jbWRfcmF3KHN0cnVjdCB3cGFfY3RybCAqY3RybCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpZiAoYXJnYyA9PSAwKQpAQCAtMjQ2OSwxMSArMjUyNSw2IEBACiAJICAiPFBJTj4gPSB2ZXJpZnkgUElOIGNoZWNrc3VtIiB9LAogCXsgIndwc19jYW5jZWwiLCB3cGFfY2xpX2NtZF93cHNfY2FuY2VsLCBOVUxMLCBjbGlfY21kX2ZsYWdfbm9uZSwKIAkgICJDYW5jZWxzIHRoZSBwZW5kaW5nIFdQUyBvcGVyYXRpb24iIH0sCi0jaWZkZWYgQ09ORklHX1dQU19PT0IKLQl7ICJ3cHNfb29iIiwgd3BhX2NsaV9jbWRfd3BzX29vYiwgTlVMTCwKLQkgIGNsaV9jbWRfZmxhZ19zZW5zaXRpdmUsCi0JICAiPERFVl9UWVBFPiA8UEFUSD4gPE1FVEhPRD4gW0RFVl9OQU1FXSA9IHN0YXJ0IFdQUyBPT0IiIH0sCi0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KICNpZmRlZiBDT05GSUdfV1BTX05GQwogCXsgIndwc19uZmMiLCB3cGFfY2xpX2NtZF93cHNfbmZjLCB3cGFfY2xpX2NvbXBsZXRlX2JzcywKIAkgIGNsaV9jbWRfZmxhZ19ub25lLApAQCAtMjQ4NCw2ICsyNTM1LDE4IEBACiAJeyAid3BzX25mY190YWdfcmVhZCIsIHdwYV9jbGlfY21kX3dwc19uZmNfdGFnX3JlYWQsIE5VTEwsCiAJICBjbGlfY21kX2ZsYWdfc2Vuc2l0aXZlLAogCSAgIjxoZXhkdW1wIG9mIHBheWxvYWQ+ID0gcmVwb3J0IHJlYWQgTkZDIHRhZyB3aXRoIFdQUyBkYXRhIiB9LAorCXsgIm5mY19nZXRfaGFuZG92ZXJfcmVxIiwgd3BhX2NsaV9jbWRfbmZjX2dldF9oYW5kb3Zlcl9yZXEsIE5VTEwsCisJICBjbGlfY21kX2ZsYWdfbm9uZSwKKwkgICI8TkRFRj4gPFdQUz4gPSBjcmVhdGUgTkZDIGhhbmRvdmVyIHJlcXVlc3QiIH0sCisJeyAibmZjX2dldF9oYW5kb3Zlcl9zZWwiLCB3cGFfY2xpX2NtZF9uZmNfZ2V0X2hhbmRvdmVyX3NlbCwgTlVMTCwKKwkgIGNsaV9jbWRfZmxhZ19ub25lLAorCSAgIjxOREVGPiA8V1BTPiA9IGNyZWF0ZSBORkMgaGFuZG92ZXIgc2VsZWN0IiB9LAorCXsgIm5mY19yeF9oYW5kb3Zlcl9yZXEiLCB3cGFfY2xpX2NtZF9uZmNfcnhfaGFuZG92ZXJfcmVxLCBOVUxMLAorCSAgY2xpX2NtZF9mbGFnX25vbmUsCisJICAiPGhleGR1bXAgb2YgcGF5bG9hZD4gPSByZXBvcnQgcmVjZWl2ZWQgTkZDIGhhbmRvdmVyIHJlcXVlc3QiIH0sCisJeyAibmZjX3J4X2hhbmRvdmVyX3NlbCIsIHdwYV9jbGlfY21kX25mY19yeF9oYW5kb3Zlcl9zZWwsIE5VTEwsCisJICBjbGlfY21kX2ZsYWdfbm9uZSwKKwkgICI8aGV4ZHVtcCBvZiBwYXlsb2FkPiA9IHJlcG9ydCByZWNlaXZlZCBORkMgaGFuZG92ZXIgc2VsZWN0IiB9LAogI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiAJeyAid3BzX3JlZyIsIHdwYV9jbGlfY21kX3dwc19yZWcsIHdwYV9jbGlfY29tcGxldGVfYnNzLAogCSAgY2xpX2NtZF9mbGFnX3NlbnNpdGl2ZSwKQEAgLTI2ODQsNiArMjc0NywxMCBAQAogCXsgImF1dG9zY2FuIiwgd3BhX2NsaV9jbWRfYXV0b3NjYW4sIE5VTEwsIGNsaV9jbWRfZmxhZ19ub25lLAogCSAgIltwYXJhbXNdID0gU2V0IG9yIHVuc2V0IChpZiBub25lKSBhdXRvc2NhbiBwYXJhbWV0ZXJzIiB9LAogI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLworI2lmZGVmIENPTkZJR19XTk0KKwl7ICJ3bm1fc2xlZXAiLCB3cGFfY2xpX2NtZF93bm1fc2xlZXAsIE5VTEwsIGNsaV9jbWRfZmxhZ19ub25lLAorCSAgIjxlbnRlci9leGl0PiBbaW50ZXJ2YWw9I10gPSBlbnRlci9leGl0IFdOTS1TbGVlcCBtb2RlIiB9LAorI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KIAl7ICJyYXciLCB3cGFfY2xpX2NtZF9yYXcsIE5VTEwsIGNsaV9jbWRfZmxhZ19zZW5zaXRpdmUsCiAJICAiPHBhcmFtcy4uPiA9IFNlbnQgdW5wcm9jZXNzZWQgY29tbWFuZCIgfSwKICNpZmRlZiBBTkRST0lECmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC93cGFfZ3VpLXF0NC93cGFndWkuY3BwIGIvd3BhX3N1cHBsaWNhbnQvd3BhX2d1aS1xdDQvd3BhZ3VpLmNwcAppbmRleCA0MmUxNGYwLi42YmJhOGQyIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93cGFfZ3VpLXF0NC93cGFndWkuY3BwCisrKyBiL3dwYV9zdXBwbGljYW50L3dwYV9ndWktcXQ0L3dwYWd1aS5jcHAKQEAgLTcwOSw3ICs3MDksNyBAQAogdm9pZCBXcGFHdWk6OmhlbHBBYm91dCgpCiB7CiAJUU1lc3NhZ2VCb3g6OmFib3V0KHRoaXMsICJ3cGFfZ3VpIGZvciB3cGFfc3VwcGxpY2FudCIsCi0JCQkgICAiQ29weXJpZ2h0IChjKSAyMDAzLTIwMTIsXG4iCisJCQkgICAiQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMsXG4iCiAJCQkgICAiSm91bmkgTWFsaW5lbiA8akB3MS5maT5cbiIKIAkJCSAgICJhbmQgY29udHJpYnV0b3JzLlxuIgogCQkJICAgIlxuIgpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQuYyBiL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmMKaW5kZXggZDhmM2M0NC4uZWUxYTA2YyAxMDA2NDQKLS0tIGEvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQuYworKysgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5jCkBAIC01Miw3ICs1Miw3IEBACiAKIGNvbnN0IGNoYXIgKndwYV9zdXBwbGljYW50X3ZlcnNpb24gPQogIndwYV9zdXBwbGljYW50IHYiIFZFUlNJT05fU1RSICJcbiIKLSJDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMiwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4gYW5kIGNvbnRyaWJ1dG9ycyI7CisiQ29weXJpZ2h0IChjKSAyMDAzLTIwMTMsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+IGFuZCBjb250cmlidXRvcnMiOwogCiBjb25zdCBjaGFyICp3cGFfc3VwcGxpY2FudF9saWNlbnNlID0KICJUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLlxuIgpAQCAtMTkwLDcgKzE5MCw3IEBACiAJCU1BQzJTVFIoYnNzaWQpKTsKIAl3cGFfYmxhY2tsaXN0X2FkZCh3cGFfcywgYnNzaWQpOwogCXdwYV9zbV9ub3RpZnlfZGlzYXNzb2Mod3BhX3MtPndwYSk7Ci0Jd3BhX3N1cHBsaWNhbnRfZGlzYXNzb2NpYXRlKHdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUod3BhX3MsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAl3cGFfcy0+cmVhc3NvY2lhdGUgPSAxOwogCiAJLyoKQEAgLTQ3MCw2ICs0NzAsMTEgQEAKIAlvc19mcmVlKHdwYV9zLT5ic3NpZF9maWx0ZXIpOwogCXdwYV9zLT5ic3NpZF9maWx0ZXIgPSBOVUxMOwogCisJb3NfZnJlZSh3cGFfcy0+ZGlzYWxsb3dfYXBzX2Jzc2lkKTsKKwl3cGFfcy0+ZGlzYWxsb3dfYXBzX2Jzc2lkID0gTlVMTDsKKwlvc19mcmVlKHdwYV9zLT5kaXNhbGxvd19hcHNfc3NpZCk7CisJd3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkID0gTlVMTDsKKwogCXdubV9ic3Nfa2VlcF9hbGl2ZV9kZWluaXQod3BhX3MpOwogCiAJZXh0X3Bhc3N3b3JkX2RlaW5pdCh3cGFfcy0+ZXh0X3B3KTsKQEAgLTY2MCwxNCArNjY1LDEzIEBACiAJCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CiAJCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfQ09OTkVDVEVEICItIENvbm5lY3Rpb24gdG8gIgogCQkJTUFDU1RSICIgY29tcGxldGVkICVzIFtpZD0lZCBpZF9zdHI9JXNdIiwKLQkJCU1BQzJTVFIod3BhX3MtPmJzc2lkKSwgd3BhX3MtPnJlYXNzb2NpYXRlZF9jb25uZWN0aW9uID8KLQkJCSIocmVhdXRoKSIgOiAiKGF1dGgpIiwKKwkJCU1BQzJTVFIod3BhX3MtPmJzc2lkKSwgIihhdXRoKSIsCiAJCQlzc2lkID8gc3NpZC0+aWQgOiAtMSwKIAkJCXNzaWQgJiYgc3NpZC0+aWRfc3RyID8gc3NpZC0+aWRfc3RyIDogIiIpOwogI2VuZGlmIC8qIENPTkZJR19DVFJMX0lGQUNFIHx8ICFDT05GSUdfTk9fU1RET1VUX0RFQlVHICovCiAJCXdwYXNfY2xlYXJfdGVtcF9kaXNhYmxlZCh3cGFfcywgc3NpZCwgMSk7CisJCXdwYV9zLT5leHRyYV9ibGFja2xpc3RfY291bnQgPSAwOwogCQl3cGFfcy0+bmV3X2Nvbm5lY3Rpb24gPSAwOwotCQl3cGFfcy0+cmVhc3NvY2lhdGVkX2Nvbm5lY3Rpb24gPSAxOwogCQl3cGFfZHJ2X3NldF9vcGVyc3RhdGUod3BhX3MsIDEpOwogI2lmbmRlZiBJRUVFODAyMVhfRUFQT0wKIAkJd3BhX2Rydl9zZXRfc3VwcF9wb3J0KHdwYV9zLCAxKTsKQEAgLTg0NywyNiArODUxLDYgQEAKIH0KIAogCi1lbnVtIHdwYV9jaXBoZXIgY2lwaGVyX3N1aXRlMmRyaXZlcihpbnQgY2lwaGVyKQotewotCXN3aXRjaCAoY2lwaGVyKSB7Ci0JY2FzZSBXUEFfQ0lQSEVSX05PTkU6Ci0JCXJldHVybiBDSVBIRVJfTk9ORTsKLQljYXNlIFdQQV9DSVBIRVJfV0VQNDA6Ci0JCXJldHVybiBDSVBIRVJfV0VQNDA7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDEwNDoKLQkJcmV0dXJuIENJUEhFUl9XRVAxMDQ7Ci0JY2FzZSBXUEFfQ0lQSEVSX0NDTVA6Ci0JCXJldHVybiBDSVBIRVJfQ0NNUDsKLQljYXNlIFdQQV9DSVBIRVJfR0NNUDoKLQkJcmV0dXJuIENJUEhFUl9HQ01QOwotCWNhc2UgV1BBX0NJUEhFUl9US0lQOgotCWRlZmF1bHQ6Ci0JCXJldHVybiBDSVBIRVJfVEtJUDsKLQl9Ci19Ci0KLQogZW51bSB3cGFfa2V5X21nbXQga2V5X21nbXQyZHJpdmVyKGludCBrZXlfbWdtdCkKIHsKIAlzd2l0Y2ggKGtleV9tZ210KSB7CkBAIC05MzEsNyArOTE1LDkgQEAKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFXCiAJaWYgKCEoaWUtPmNhcGFiaWxpdGllcyAmIFdQQV9DQVBBQklMSVRZX01GUEMpICYmCi0JICAgIHNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX1JFUVVJUkVEKSB7CisJICAgIChzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUID8KKwkgICAgIHdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3KSA9PQorCSAgICBNR01UX0ZSQU1FX1BST1RFQ1RJT05fUkVRVUlSRUQpIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sICJXUEE6IERyaXZlciBhc3NvY2lhdGVkIHdpdGggYW4gQVAgIgogCQkJInRoYXQgZG9lcyBub3Qgc3VwcG9ydCBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gLSAiCiAJCQkicmVqZWN0Iik7CkBAIC0xMDMzLDQ3ICsxMDE5LDMwIEBACiAJfQogCiAJc2VsID0gaWUuZ3JvdXBfY2lwaGVyICYgc3NpZC0+Z3JvdXBfY2lwaGVyOwotCWlmIChzZWwgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJd3BhX3MtPmdyb3VwX2NpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBHVEsgQ0NNUCIpOwotCX0gZWxzZSBpZiAoc2VsICYgV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCXdwYV9zLT5ncm91cF9jaXBoZXIgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgR1RLIEdDTVAiKTsKLQl9IGVsc2UgaWYgKHNlbCAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQl3cGFfcy0+Z3JvdXBfY2lwaGVyID0gV1BBX0NJUEhFUl9US0lQOwotCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIEdUSyBUS0lQIik7Ci0JfSBlbHNlIGlmIChzZWwgJiBXUEFfQ0lQSEVSX1dFUDEwNCkgewotCQl3cGFfcy0+Z3JvdXBfY2lwaGVyID0gV1BBX0NJUEhFUl9XRVAxMDQ7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgR1RLIFdFUDEwNCIpOwotCX0gZWxzZSBpZiAoc2VsICYgV1BBX0NJUEhFUl9XRVA0MCkgewotCQl3cGFfcy0+Z3JvdXBfY2lwaGVyID0gV1BBX0NJUEhFUl9XRVA0MDsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBHVEsgV0VQNDAiKTsKLQl9IGVsc2UgeworCXdwYV9zLT5ncm91cF9jaXBoZXIgPSB3cGFfcGlja19ncm91cF9jaXBoZXIoc2VsKTsKKwlpZiAod3BhX3MtPmdyb3VwX2NpcGhlciA8IDApIHsKIAkJd3BhX21zZyh3cGFfcywgTVNHX1dBUk5JTkcsICJXUEE6IEZhaWxlZCB0byBzZWxlY3QgZ3JvdXAgIgogCQkJImNpcGhlciIpOwogCQlyZXR1cm4gLTE7CiAJfQorCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgR1RLICVzIiwKKwkJd3BhX2NpcGhlcl90eHQod3BhX3MtPmdyb3VwX2NpcGhlcikpOwogCiAJc2VsID0gaWUucGFpcndpc2VfY2lwaGVyICYgc3NpZC0+cGFpcndpc2VfY2lwaGVyOwotCWlmIChzZWwgJiBXUEFfQ0lQSEVSX0NDTVApIHsKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfQ0NNUDsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBQVEsgQ0NNUCIpOwotCX0gZWxzZSBpZiAoc2VsICYgV1BBX0NJUEhFUl9HQ01QKSB7Ci0JCXdwYV9zLT5wYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX0dDTVA7Ci0JCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIldQQTogdXNpbmcgUFRLIEdDTVAiKTsKLQl9IGVsc2UgaWYgKHNlbCAmIFdQQV9DSVBIRVJfVEtJUCkgewotCQl3cGFfcy0+cGFpcndpc2VfY2lwaGVyID0gV1BBX0NJUEhFUl9US0lQOwotCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIFBUSyBUS0lQIik7Ci0JfSBlbHNlIGlmIChzZWwgJiBXUEFfQ0lQSEVSX05PTkUpIHsKLQkJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IFdQQV9DSVBIRVJfTk9ORTsKLQkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBQVEsgTk9ORSIpOwotCX0gZWxzZSB7CisJd3BhX3MtPnBhaXJ3aXNlX2NpcGhlciA9IHdwYV9waWNrX3BhaXJ3aXNlX2NpcGhlcihzZWwsIDEpOworCWlmICh3cGFfcy0+cGFpcndpc2VfY2lwaGVyIDwgMCkgewogCQl3cGFfbXNnKHdwYV9zLCBNU0dfV0FSTklORywgIldQQTogRmFpbGVkIHRvIHNlbGVjdCBwYWlyd2lzZSAiCiAJCQkiY2lwaGVyIik7CiAJCXJldHVybiAtMTsKIAl9CisJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiV1BBOiB1c2luZyBQVEsgJXMiLAorCQl3cGFfY2lwaGVyX3R4dCh3cGFfcy0+cGFpcndpc2VfY2lwaGVyKSk7CiAKIAlzZWwgPSBpZS5rZXlfbWdtdCAmIHNzaWQtPmtleV9tZ210OworI2lmZGVmIENPTkZJR19TQUUKKwlpZiAoISh3cGFfcy0+ZHJ2X2ZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19TQUUpKQorCQlzZWwgJj0gfihXUEFfS0VZX01HTVRfU0FFIHwgV1BBX0tFWV9NR01UX0ZUX1NBRSk7CisjZW5kaWYgLyogQ09ORklHX1NBRSAqLwogCWlmICgwKSB7CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKIAl9IGVsc2UgaWYgKHNlbCAmIFdQQV9LRVlfTUdNVF9GVF9JRUVFODAyMVgpIHsKQEAgLTEwODMsNiArMTA1MiwxNCBAQAogCQl3cGFfcy0+a2V5X21nbXQgPSBXUEFfS0VZX01HTVRfRlRfUFNLOwogCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJXUEE6IHVzaW5nIEtFWV9NR01UIEZUL1BTSyIpOwogI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCisjaWZkZWYgQ09ORklHX1NBRQorCX0gZWxzZSBpZiAoc2VsICYgV1BBX0tFWV9NR01UX1NBRSkgeworCQl3cGFfcy0+a2V5X21nbXQgPSBXUEFfS0VZX01HTVRfU0FFOworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJSU046IHVzaW5nIEtFWV9NR01UIFNBRSIpOworCX0gZWxzZSBpZiAoc2VsICYgV1BBX0tFWV9NR01UX0ZUX1NBRSkgeworCQl3cGFfcy0+a2V5X21nbXQgPSBXUEFfS0VZX01HTVRfRlRfU0FFOworCQl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJSU046IHVzaW5nIEtFWV9NR01UIEZUL1NBRSIpOworI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwogCX0gZWxzZSBpZiAoc2VsICYgV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9TSEEyNTYpIHsKIAkJd3BhX3MtPmtleV9tZ210ID0gV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9TSEEyNTY7CkBAIC0xMTE1LDcgKzEwOTIsOCBAQAogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKIAlzZWwgPSBpZS5tZ210X2dyb3VwX2NpcGhlcjsKLQlpZiAoc3NpZC0+aWVlZTgwMjExdyA9PSBOT19NR01UX0ZSQU1FX1BST1RFQ1RJT04gfHwKKwlpZiAoKHNzaWQtPmllZWU4MDIxMXcgPT0gTUdNVF9GUkFNRV9QUk9URUNUSU9OX0RFRkFVTFQgPworCSAgICAgd3BhX3MtPmNvbmYtPnBtZiA6IHNzaWQtPmllZWU4MDIxMXcpID09IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTiB8fAogCSAgICAhKGllLmNhcGFiaWxpdGllcyAmIFdQQV9DQVBBQklMSVRZX01GUEMpKQogCQlzZWwgPSAwOwogCWlmIChzZWwgJiBXUEFfQ0lQSEVSX0FFU18xMjhfQ01BQykgewpAQCAtMTEyOCw3ICsxMTA2LDkgQEAKIAl9CiAJd3BhX3NtX3NldF9wYXJhbSh3cGFfcy0+d3BhLCBXUEFfUEFSQU1fTUdNVF9HUk9VUCwKIAkJCSB3cGFfcy0+bWdtdF9ncm91cF9jaXBoZXIpOwotCXdwYV9zbV9zZXRfcGFyYW0od3BhX3MtPndwYSwgV1BBX1BBUkFNX01GUCwgc3NpZC0+aWVlZTgwMjExdyk7CisJd3BhX3NtX3NldF9wYXJhbSh3cGFfcy0+d3BhLCBXUEFfUEFSQU1fTUZQLAorCQkJIChzc2lkLT5pZWVlODAyMTF3ID09IE1HTVRfRlJBTUVfUFJPVEVDVElPTl9ERUZBVUxUID8KKwkJCSAgd3BhX3MtPmNvbmYtPnBtZiA6IHNzaWQtPmllZWU4MDIxMXcpKTsKICNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExVyAqLwogCiAJaWYgKHdwYV9zbV9zZXRfYXNzb2Nfd3BhX2llX2RlZmF1bHQod3BhX3MtPndwYSwgd3BhX2llLCB3cGFfaWVfbGVuKSkgewpAQCAtMTIxMyw2ICsxMTkzLDMzIEBACiB9CiAKIAoraW50IHdwYXNfYnVpbGRfZXh0X2NhcGFiKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHU4ICpidWYpCit7CisJdTMyIGV4dF9jYXBhYiA9IDA7CisJdTggKnBvcyA9IGJ1ZjsKKworI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKKwlpZiAod3BhX3MtPmNvbmYtPmludGVyd29ya2luZykKKwkJZXh0X2NhcGFiIHw9IEJJVCgzMSk7IC8qIEludGVyd29ya2luZyAqLworI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KKworI2lmZGVmIENPTkZJR19XTk0KKwlleHRfY2FwYWIgfD0gQklUKDE3KTsgLyogV05NLVNsZWVwIE1vZGUgKi8KKwlleHRfY2FwYWIgfD0gQklUKDE5KTsgLyogQlNTIFRyYW5zaXRpb24gKi8KKyNlbmRpZiAvKiBDT05GSUdfV05NICovCisKKwlpZiAoIWV4dF9jYXBhYikKKwkJcmV0dXJuIDA7CisKKwkqcG9zKysgPSBXTEFOX0VJRF9FWFRfQ0FQQUI7CisJKnBvcysrID0gNDsKKwlXUEFfUFVUX0xFMzIocG9zLCBleHRfY2FwYWIpOworCXBvcyArPSA0OworCisJcmV0dXJuIHBvcyAtIGJ1ZjsKK30KKworCiAvKioKICAqIHdwYV9zdXBwbGljYW50X2Fzc29jaWF0ZSAtIFJlcXVlc3QgYXNzb2NpYXRpb24KICAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCkBAIC0xMjM0LDYgKzEyNDEsOCBAQAogCXN0cnVjdCB3cGFfZHJpdmVyX2NhcGEgY2FwYTsKIAlpbnQgYXNzb2NfZmFpbGVkID0gMDsKIAlzdHJ1Y3Qgd3BhX3NzaWQgKm9sZF9zc2lkOworCXU4IGV4dF9jYXBhYlsxMF07CisJaW50IGV4dF9jYXBhYl9sZW47CiAjaWZkZWYgQ09ORklHX0hUX09WRVJSSURFUwogCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwYWJpbGl0aWVzIGh0Y2FwczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyBodGNhcHNfbWFzazsKQEAgLTEzMDksNyArMTMxOCw3IEBACiAJCSAgIChzc2lkLT5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9XUFMpKSB7CiAJCS8qIFVzZSBhcF9zY2FuPT0xIHN0eWxlIG5ldHdvcmsgc2VsZWN0aW9uIHRvIGZpbmQgdGhlIG5ldHdvcmsKIAkJICovCi0JCXdwYV9zLT5zY2FuX3JlcSA9IDI7CisJCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKIAkJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKIAkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwogCQlyZXR1cm47CkBAIC0xMzQ3LDcgKzEzNTYsOSBAQAogCQkgICAgd3BhX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9SU04pKSAmJgogCSAgICB3cGFfa2V5X21nbXRfd3BhKHNzaWQtPmtleV9tZ210KSkgewogCQlpbnQgdHJ5X29wcG9ydHVuaXN0aWM7Ci0JCXRyeV9vcHBvcnR1bmlzdGljID0gc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nICYmCisJCXRyeV9vcHBvcnR1bmlzdGljID0gKHNzaWQtPnByb2FjdGl2ZV9rZXlfY2FjaGluZyA8IDAgPworCQkJCSAgICAgd3BhX3MtPmNvbmYtPm9rYyA6CisJCQkJICAgICBzc2lkLT5wcm9hY3RpdmVfa2V5X2NhY2hpbmcpICYmCiAJCQkoc3NpZC0+cHJvdG8gJiBXUEFfUFJPVE9fUlNOKTsKIAkJaWYgKHBta3NhX2NhY2hlX3NldF9jdXJyZW50KHdwYV9zLT53cGEsIE5VTEwsIGJzcy0+YnNzaWQsCiAJCQkJCSAgICB3cGFfcy0+Y3VycmVudF9zc2lkLApAQCAtMTQ0NSwyNiArMTQ1NiwyMSBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwogCi0jaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwotCWlmICh3cGFfcy0+Y29uZi0+aW50ZXJ3b3JraW5nKSB7CisJZXh0X2NhcGFiX2xlbiA9IHdwYXNfYnVpbGRfZXh0X2NhcGFiKHdwYV9zLCBleHRfY2FwYWIpOworCWlmIChleHRfY2FwYWJfbGVuID4gMCkgewogCQl1OCAqcG9zID0gd3BhX2llOwogCQlpZiAod3BhX2llX2xlbiA+IDAgJiYgcG9zWzBdID09IFdMQU5fRUlEX1JTTikKIAkJCXBvcyArPSAyICsgcG9zWzFdOwotCQlvc19tZW1tb3ZlKHBvcyArIDYsIHBvcywgd3BhX2llX2xlbiAtIChwb3MgLSB3cGFfaWUpKTsKLQkJd3BhX2llX2xlbiArPSA2OwotCQkqcG9zKysgPSBXTEFOX0VJRF9FWFRfQ0FQQUI7Ci0JCSpwb3MrKyA9IDQ7Ci0JCSpwb3MrKyA9IDB4MDA7Ci0JCSpwb3MrKyA9IDB4MDA7Ci0JCSpwb3MrKyA9IDB4MDA7Ci0JCSpwb3MrKyA9IDB4ODA7IC8qIEJpdCAzMSAtIEludGVyd29ya2luZyAqLworCQlvc19tZW1tb3ZlKHBvcyArIGV4dF9jYXBhYl9sZW4sIHBvcywKKwkJCSAgIHdwYV9pZV9sZW4gLSAocG9zIC0gd3BhX2llKSk7CisJCXdwYV9pZV9sZW4gKz0gZXh0X2NhcGFiX2xlbjsKKwkJb3NfbWVtY3B5KHBvcywgZXh0X2NhcGFiLCBleHRfY2FwYWJfbGVuKTsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLwogCiAJd3BhX2NsZWFyX2tleXMod3BhX3MsIGJzcyA/IGJzcy0+YnNzaWQgOiBOVUxMKTsKIAl1c2VfY3J5cHQgPSAxOwotCWNpcGhlcl9wYWlyd2lzZSA9IGNpcGhlcl9zdWl0ZTJkcml2ZXIod3BhX3MtPnBhaXJ3aXNlX2NpcGhlcik7Ci0JY2lwaGVyX2dyb3VwID0gY2lwaGVyX3N1aXRlMmRyaXZlcih3cGFfcy0+Z3JvdXBfY2lwaGVyKTsKKwljaXBoZXJfcGFpcndpc2UgPSB3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+cGFpcndpc2VfY2lwaGVyKTsKKwljaXBoZXJfZ3JvdXAgPSB3cGFfY2lwaGVyX3RvX3N1aXRlX2RyaXZlcih3cGFfcy0+Z3JvdXBfY2lwaGVyKTsKIAlpZiAod3BhX3MtPmtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9OT05FIHx8CiAJICAgIHdwYV9zLT5rZXlfbWdtdCA9PSBXUEFfS0VZX01HTVRfSUVFRTgwMjFYX05PX1dQQSkgewogCQlpZiAod3BhX3MtPmtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9OT05FKQpAQCAtMTU1Miw4ICsxNTU4LDEwIEBACiAJcGFyYW1zLmRyb3BfdW5lbmNyeXB0ZWQgPSB1c2VfY3J5cHQ7CiAKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwotCXBhcmFtcy5tZ210X2ZyYW1lX3Byb3RlY3Rpb24gPSBzc2lkLT5pZWVlODAyMTF3OwotCWlmIChzc2lkLT5pZWVlODAyMTF3ICE9IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTiAmJiBic3MpIHsKKwlwYXJhbXMubWdtdF9mcmFtZV9wcm90ZWN0aW9uID0KKwkJc3NpZC0+aWVlZTgwMjExdyA9PSBNR01UX0ZSQU1FX1BST1RFQ1RJT05fREVGQVVMVCA/CisJCXdwYV9zLT5jb25mLT5wbWYgOiBzc2lkLT5pZWVlODAyMTF3OworCWlmIChwYXJhbXMubWdtdF9mcmFtZV9wcm90ZWN0aW9uICE9IE5PX01HTVRfRlJBTUVfUFJPVEVDVElPTiAmJiBic3MpIHsKIAkJY29uc3QgdTggKnJzbiA9IHdwYV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfUlNOKTsKIAkJc3RydWN0IHdwYV9pZV9kYXRhIGllOwogCQlpZiAocnNuICYmIHdwYV9wYXJzZV93cGFfaWUocnNuLCAyICsgcnNuWzFdLCAmaWUpID09IDAgJiYKQEAgLTE1OTAsMTYgKzE1OTgsOCBAQAogCQkoKGZyZXEgPSB3cGFfZHJ2X3NoYXJlZF9mcmVxKHdwYV9zKSkgPiAwKSAmJiAoZnJlcSAhPSBwYXJhbXMuZnJlcSkpIHsKIAkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTaGFyZWQgaW50ZXJmYWNlIHdpdGggY29uZmxpY3RpbmcgZnJlcXVlbmN5IGZvdW5kICglZCAhPSAlZCkiCiAJCQkJCQkJCQkJCQkJCQkJLCBmcmVxLCBwYXJhbXMuZnJlcSk7Ci0JCWlmICh3cGFzX3AycF9oYW5kbGVfZnJlcXVlbmN5X2NvbmZsaWN0cyh3cGFfcywgcGFyYW1zLmZyZXEpIDwgMCkgewotCQkJLyogSGFuZGxpbmcgY29uZmxpY3RzIGZhaWxlZC4gRGlzYWJsZSB0aGUgY3VycmVudCBjb25uZWN0IHJlcSBhbmQKLQkJCSAqIG5vdGlmeSB0aGUgdXNlcnNwYWNlIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uICovCi0JCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgInByb2lyaXRpemUgaXMgbm90IHNldC4gTm90aWZ5aW5nIHVzZXIgc3BhY2UgdG8gaGFuZGxlIHRoZSBjYXNlIik7Ci0JCQl3cGFfc3VwcGxpY2FudF9kaXNhYmxlX25ldHdvcmsod3BhX3MsIHNzaWQpOwotCQkJd3BhX21zZyh3cGFfcywgTVNHX0lORk8sIFdQQV9FVkVOVF9GUkVRX0NPTkZMSUNUCi0JCQkJIiBpZD0lZCIsIHNzaWQtPmlkKTsKLQkJCW9zX21lbXNldCh3cGFfcy0+cGVuZGluZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCQlpZiAod3Bhc19wMnBfaGFuZGxlX2ZyZXF1ZW5jeV9jb25mbGljdHMod3BhX3MsIHBhcmFtcy5mcmVxLCBzc2lkKSA8IDApIAogCQkJcmV0dXJuOwotCQl9CiAJfQogI2VuZGlmCiAJcmV0ID0gd3BhX2Rydl9hc3NvY2lhdGUod3BhX3MsICZwYXJhbXMpOwpAQCAtMTY5NCwzMyArMTY5NCw2IEBACiAKIAogLyoqCi0gKiB3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUgLSBEaXNhc3NvY2lhdGUgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgotICogQHdwYV9zOiBQb2ludGVyIHRvIHdwYV9zdXBwbGljYW50IGRhdGEKLSAqIEByZWFzb25fY29kZTogSUVFRSA4MDIuMTEgcmVhc29uIGNvZGUgZm9yIHRoZSBkaXNhc3NvY2lhdGUgZnJhbWUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCAld3BhX3N1cHBsaWNhbnQgdG8gZGlzYXNzb2NpYXRlIHdpdGggdGhlCi0gKiBjdXJyZW50IEFQLgotICovCi12b2lkIHdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAotCQkJCSBpbnQgcmVhc29uX2NvZGUpCi17Ci0JdTggKmFkZHIgPSBOVUxMOwotCXVuaW9uIHdwYV9ldmVudF9kYXRhIGV2ZW50OwotCi0JaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIod3BhX3MtPmJzc2lkKSkgewotCQl3cGFfZHJ2X2Rpc2Fzc29jaWF0ZSh3cGFfcywgd3BhX3MtPmJzc2lkLCByZWFzb25fY29kZSk7Ci0JCWFkZHIgPSB3cGFfcy0+YnNzaWQ7Ci0JCW9zX21lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwotCQlldmVudC5kaXNhc3NvY19pbmZvLnJlYXNvbl9jb2RlID0gKHUxNikgcmVhc29uX2NvZGU7Ci0JCWV2ZW50LmRpc2Fzc29jX2luZm8ubG9jYWxseV9nZW5lcmF0ZWQgPSAxOwotCQl3cGFfc3VwcGxpY2FudF9ldmVudCh3cGFfcywgRVZFTlRfRElTQVNTT0MsICZldmVudCk7Ci0JfQotCi0Jd3BhX3N1cHBsaWNhbnRfY2xlYXJfY29ubmVjdGlvbih3cGFfcywgYWRkcik7Ci19Ci0KLQotLyoqCiAgKiB3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSAtIERlYXV0aGVudGljYXRlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KICAqIEB3cGFfczogUG9pbnRlciB0byB3cGFfc3VwcGxpY2FudCBkYXRhCiAgKiBAcmVhc29uX2NvZGU6IElFRUUgODAyLjExIHJlYXNvbiBjb2RlIGZvciB0aGUgZGVhdXRoZW50aWNhdGUgZnJhbWUKQEAgLTE3MzMsMTQgKzE3MDYsMzggQEAKIHsKIAl1OCAqYWRkciA9IE5VTEw7CiAJdW5pb24gd3BhX2V2ZW50X2RhdGEgZXZlbnQ7CisJaW50IHplcm9fYWRkciA9IDA7CiAKLQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcih3cGFfcy0+YnNzaWQpKSB7Ci0JCXdwYV9kcnZfZGVhdXRoZW50aWNhdGUod3BhX3MsIHdwYV9zLT5ic3NpZCwgcmVhc29uX2NvZGUpOworCXdwYV9kYmcod3BhX3MsIE1TR19ERUJVRywgIlJlcXVlc3QgdG8gZGVhdXRoZW50aWNhdGUgLSBic3NpZD0iIE1BQ1NUUgorCQkiIHBlbmRpbmdfYnNzaWQ9IiBNQUNTVFIgIiByZWFzb249JWQgc3RhdGU9JXMiLAorCQlNQUMyU1RSKHdwYV9zLT5ic3NpZCksIE1BQzJTVFIod3BhX3MtPnBlbmRpbmdfYnNzaWQpLAorCQlyZWFzb25fY29kZSwgd3BhX3N1cHBsaWNhbnRfc3RhdGVfdHh0KHdwYV9zLT53cGFfc3RhdGUpKTsKKworCWlmICghaXNfemVyb19ldGhlcl9hZGRyKHdwYV9zLT5ic3NpZCkpCiAJCWFkZHIgPSB3cGFfcy0+YnNzaWQ7CisJZWxzZSBpZiAoIWlzX3plcm9fZXRoZXJfYWRkcih3cGFfcy0+cGVuZGluZ19ic3NpZCkgJiYKKwkJICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9BVVRIRU5USUNBVElORyB8fAorCQkgIHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0FTU09DSUFUSU5HKSkKKwkJYWRkciA9IHdwYV9zLT5wZW5kaW5nX2Jzc2lkOworCWVsc2UgaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX0FTU09DSUFUSU5HKSB7CisJCS8qCisJCSAqIFdoZW4gdXNpbmcgZHJpdmVyLWJhc2VkIEJTUyBzZWxlY3Rpb24sIHdlIG1heSBub3Qga25vdyB0aGUKKwkJICogQlNTSUQgd2l0aCB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHRyeWluZyB0byBhc3NvY2lhdGUuIFdlCisJCSAqIG5lZWQgdG8gbm90aWZ5IHRoZSBkcml2ZXIgb2YgdGhpcyBkaXNjb25uZWN0aW9uIGV2ZW4gaW4gc3VjaAorCQkgKiBhIGNhc2UsIHNvIHVzZSB0aGUgYWxsIHplcm9zIGFkZHJlc3MgaGVyZS4KKwkJICovCisJCWFkZHIgPSB3cGFfcy0+YnNzaWQ7CisJCXplcm9fYWRkciA9IDE7CisJfQorCisJaWYgKGFkZHIpIHsKKwkJd3BhX2Rydl9kZWF1dGhlbnRpY2F0ZSh3cGFfcywgYWRkciwgcmVhc29uX2NvZGUpOwogCQlvc19tZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKIAkJZXZlbnQuZGVhdXRoX2luZm8ucmVhc29uX2NvZGUgPSAodTE2KSByZWFzb25fY29kZTsKIAkJZXZlbnQuZGVhdXRoX2luZm8ubG9jYWxseV9nZW5lcmF0ZWQgPSAxOwogCQl3cGFfc3VwcGxpY2FudF9ldmVudCh3cGFfcywgRVZFTlRfREVBVVRILCAmZXZlbnQpOworCQlpZiAoemVyb19hZGRyKQorCQkJYWRkciA9IE5VTEw7CiAJfQogCiAJd3BhX3N1cHBsaWNhbnRfY2xlYXJfY29ubmVjdGlvbih3cGFfcywgYWRkcik7CkBAIC0xODMxLDExICsxODI4LDExIEBACiAJCQkJCXdwYV9zLCBvdGhlcl9zc2lkKTsKIAkJfQogCQlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZCkKLQkJCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSgKKwkJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKAogCQkJCXdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJfSBlbHNlIGlmIChzc2lkLT5kaXNhYmxlZCAhPSAyKSB7CiAJCWlmIChzc2lkID09IHdwYV9zLT5jdXJyZW50X3NzaWQpCi0JCQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoCisJCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSgKIAkJCQl3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCiAJCXdhc19kaXNhYmxlZCA9IHNzaWQtPmRpc2FibGVkOwpAQCAtMTg2MSw3ICsxODU4LDcgQEAKIAlpbnQgZGlzY29ubmVjdGVkID0gMDsKIAogCWlmIChzc2lkICYmIHNzaWQgIT0gd3BhX3MtPmN1cnJlbnRfc3NpZCAmJiB3cGFfcy0+Y3VycmVudF9zc2lkKSB7Ci0JCXdwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZSgKKwkJd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoCiAJCQl3cGFfcywgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQlkaXNjb25uZWN0ZWQgPSAxOwogCX0KQEAgLTIyMDAsMTcgKzIxOTcsMjggQEAKIAl3cGFfZGJnKHdwYV9zLCBNU0dfREVCVUcsICJSWCBFQVBPTCBmcm9tICIgTUFDU1RSLCBNQUMyU1RSKHNyY19hZGRyKSk7CiAJd3BhX2hleGR1bXAoTVNHX01TR0RVTVAsICJSWCBFQVBPTCIsIGJ1ZiwgbGVuKTsKIAotCWlmICh3cGFfcy0+d3BhX3N0YXRlIDwgV1BBX0FTU09DSUFURUQpIHsKKwlpZiAod3BhX3MtPndwYV9zdGF0ZSA8IFdQQV9BU1NPQ0lBVEVEIHx8CisJICAgICh3cGFfcy0+bGFzdF9lYXBvbF9tYXRjaGVzX2Jzc2lkICYmCisjaWZkZWYgQ09ORklHX0FQCisJICAgICAhd3BhX3MtPmFwX2lmYWNlICYmCisjZW5kaWYgLyogQ09ORklHX0FQICovCisJICAgICBvc19tZW1jbXAoc3JjX2FkZHIsIHdwYV9zLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gcmVjZWl2aW5nIHRoZQogCQkgKiBhc3NvY2lhdGlvbiBldmVudCBhbmQgdGhlIEVBUE9MIGZyYW1lIHNpbmNlIHRoZXkgYXJlIGNvbWluZwogCQkgKiB0aHJvdWdoIGRpZmZlcmVudCBwYXRocyBmcm9tIHRoZSBkcml2ZXIuIEluIG9yZGVyIHRvIGF2b2lkCiAJCSAqIGlzc3VlcyBpbiB0cnlpbmcgdG8gcHJvY2VzcyB0aGUgRUFQT0wgZnJhbWUgYmVmb3JlIHJlY2VpdmluZwogCQkgKiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiwgbGV0cyBxdWV1ZSBpdCBmb3IgcHJvY2Vzc2luZyB1bnRpbAotCQkgKiB0aGUgYXNzb2NpYXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQuCisJCSAqIHRoZSBhc3NvY2lhdGlvbiBldmVudCBpcyByZWNlaXZlZC4gVGhpcyBtYXkgYWxzbyBiZSBuZWVkZWQgaW4KKwkJICogZHJpdmVyLWJhc2VkIHJvYW1pbmcgY2FzZSwgc28gYWxzbyB1c2Ugc3JjX2FkZHIgIT0gQlNTSUQgYXMgYQorCQkgKiB0cmlnZ2VyIGlmIHdlIGhhdmUgcHJldmlvdXNseSBjb25maXJtZWQgdGhhdCB0aGUKKwkJICogQXV0aGVudGljYXRvciB1c2VzIEJTU0lEIGFzIHRoZSBzcmNfYWRkciAod2hpY2ggaXMgbm90IHRoZQorCQkgKiBjYXNlIHdpdGggd2lyZWQgSUVFRSA4MDIuMVgpLgogCQkgKi8KIAkJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiTm90IGFzc29jaWF0ZWQgLSBEZWxheSBwcm9jZXNzaW5nICIKLQkJCSJvZiByZWNlaXZlZCBFQVBPTCBmcmFtZSIpOworCQkJIm9mIHJlY2VpdmVkIEVBUE9MIGZyYW1lIChzdGF0ZT0lcyBic3NpZD0iIE1BQ1NUUiAiKSIsCisJCQl3cGFfc3VwcGxpY2FudF9zdGF0ZV90eHQod3BhX3MtPndwYV9zdGF0ZSksCisJCQlNQUMyU1RSKHdwYV9zLT5ic3NpZCkpOwogCQl3cGFidWZfZnJlZSh3cGFfcy0+cGVuZGluZ19lYXBvbF9yeCk7CiAJCXdwYV9zLT5wZW5kaW5nX2VhcG9sX3J4ID0gd3BhYnVmX2FsbG9jX2NvcHkoYnVmLCBsZW4pOwogCQlpZiAod3BhX3MtPnBlbmRpbmdfZWFwb2xfcngpIHsKQEAgLTIyMjEsNiArMjIyOSw5IEBACiAJCXJldHVybjsKIAl9CiAKKwl3cGFfcy0+bGFzdF9lYXBvbF9tYXRjaGVzX2Jzc2lkID0KKwkJb3NfbWVtY21wKHNyY19hZGRyLCB3cGFfcy0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwOworCiAjaWZkZWYgQ09ORklHX0FQCiAJaWYgKHdwYV9zLT5hcF9pZmFjZSkgewogCQl3cGFfc3VwcGxpY2FudF9hcF9yeF9lYXBvbCh3cGFfcywgc3JjX2FkZHIsIGJ1ZiwgbGVuKTsKQEAgLTI0MTksNyArMjQzMCw3IEBACiAJd3BhX3MgPSBvc196YWxsb2Moc2l6ZW9mKCp3cGFfcykpOwogCWlmICh3cGFfcyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl3cGFfcy0+c2Nhbl9yZXEgPSAxOworCXdwYV9zLT5zY2FuX3JlcSA9IElOSVRJQUxfU0NBTl9SRVE7CiAJd3BhX3MtPnNjYW5faW50ZXJ2YWwgPSA1OwogCXdwYV9zLT5uZXdfY29ubmVjdGlvbiA9IDE7CiAJd3BhX3MtPnBhcmVudCA9IHdwYV9zOwpAQCAtMjU3OSw2ICsyNTkwLDI4IEBACiB9CiAKIAorc3RhdGljIGludCB3cGFfc2V0X2Rpc2FibGVfc2dpKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9odF9jYXBhYmlsaXRpZXMgKmh0Y2FwcywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcGFiaWxpdGllcyAqaHRjYXBzX21hc2ssCisJCQkgICAgICAgaW50IGRpc2FibGVkKQoreworCS8qIE1hc2tpbmcgdGhlc2Ugb3V0IGRpc2FibGVzIFNHSSAqLworCXUxNiBtc2sgPSBob3N0X3RvX2xlMTYoSFRfQ0FQX0lORk9fU0hPUlRfR0kyME1IWiB8CisJCQkgICAgICAgSFRfQ0FQX0lORk9fU0hPUlRfR0k0ME1IWik7CisKKwl3cGFfbXNnKHdwYV9zLCBNU0dfREVCVUcsICJzZXRfZGlzYWJsZV9zZ2k6ICVkIiwgZGlzYWJsZWQpOworCisJaWYgKGRpc2FibGVkKQorCQlodGNhcHMtPmh0X2NhcGFiaWxpdGllc19pbmZvICY9IH5tc2s7CisJZWxzZQorCQlodGNhcHMtPmh0X2NhcGFiaWxpdGllc19pbmZvIHw9IG1zazsKKworCWh0Y2Fwc19tYXNrLT5odF9jYXBhYmlsaXRpZXNfaW5mbyB8PSBtc2s7CisKKwlyZXR1cm4gMDsKK30KKworCiB2b2lkIHdwYV9zdXBwbGljYW50X2FwcGx5X2h0X292ZXJyaWRlcygKIAlzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCiAJc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQpAQCAtMjYwMSw2ICsyNjM0LDcgQEAKIAl3cGFfc2V0X2FtcGR1X2ZhY3Rvcih3cGFfcywgaHRjYXBzLCBodGNhcHNfbWFzaywgc3NpZC0+YW1wZHVfZmFjdG9yKTsKIAl3cGFfc2V0X2FtcGR1X2RlbnNpdHkod3BhX3MsIGh0Y2FwcywgaHRjYXBzX21hc2ssIHNzaWQtPmFtcGR1X2RlbnNpdHkpOwogCXdwYV9zZXRfZGlzYWJsZV9odDQwKHdwYV9zLCBodGNhcHMsIGh0Y2Fwc19tYXNrLCBzc2lkLT5kaXNhYmxlX2h0NDApOworCXdwYV9zZXRfZGlzYWJsZV9zZ2kod3BhX3MsIGh0Y2FwcywgaHRjYXBzX21hc2ssIHNzaWQtPmRpc2FibGVfc2dpKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IVF9PVkVSUklERVMgKi8KQEAgLTM0NTIsNiArMzQ4NiwxMiBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBBZGQgcHJldmlvdXMgZmFpbHVyZSBjb3VudCBpbiBjYXNlIHRoZSB0ZW1wb3JhcnkgYmxhY2tsaXN0IHdhcworCSAqIGNsZWFyZWQgZHVlIHRvIG5vIG90aGVyIEJTU2VzIGJlaW5nIGF2YWlsYWJsZS4KKwkgKi8KKwljb3VudCArPSB3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50OworCiAJc3dpdGNoIChjb3VudCkgewogCWNhc2UgMToKIAkJdGltZW91dCA9IDEwMDsKQEAgLTM0NjIsMTAgKzM1MDIsMTcgQEAKIAljYXNlIDM6CiAJCXRpbWVvdXQgPSAxMDAwOwogCQlicmVhazsKLQlkZWZhdWx0OgorCWNhc2UgNDoKIAkJdGltZW91dCA9IDUwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRpbWVvdXQgPSAxMDAwMDsKKwkJYnJlYWs7CiAJfQogCisJd3BhX2RiZyh3cGFfcywgTVNHX0RFQlVHLCAiQmxhY2tsaXN0IGNvdW50ICVkIC0tPiByZXF1ZXN0IHNjYW4gaW4gJWQgIgorCQkibXMiLCBjb3VudCwgdGltZW91dCk7CisKIAkvKgogCSAqIFRPRE86IGlmIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgQVAgaXMgYXZhaWxhYmxlIGluIHNjYW4gcmVzdWx0cywKIAkgKiBjb3VsZCB0cnkgdGhlIG90aGVyIG9uZXMgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgc2Nhbi4KQEAgLTM2NzIsMyArMzcxOSw1OCBAQAogCWlmIChjbGVhcl9mYWlsdXJlcykKIAkJc3NpZC0+YXV0aF9mYWlsdXJlcyA9IDA7CiB9CisKKworaW50IGRpc2FsbG93ZWRfYnNzaWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkKQoreworCXNpemVfdCBpOworCisJaWYgKHdwYV9zLT5kaXNhbGxvd19hcHNfYnNzaWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZF9jb3VudDsgaSsrKSB7CisJCWlmIChvc19tZW1jbXAod3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCArIGkgKiBFVEhfQUxFTiwKKwkJCSAgICAgIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBkaXNhbGxvd2VkX3NzaWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKnNzaWQsCisJCSAgICBzaXplX3Qgc3NpZF9sZW4pCit7CisJc2l6ZV90IGk7CisKKwlpZiAod3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkID09IE5VTEwgfHwgc3NpZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWRfY291bnQ7IGkrKykgeworCQlzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgKnMgPSAmd3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkW2ldOworCQlpZiAoc3NpZF9sZW4gPT0gcy0+c3NpZF9sZW4gJiYKKwkJICAgIG9zX21lbWNtcChzc2lkLCBzLT5zc2lkLCBzc2lkX2xlbikgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogd3Bhc19yZXF1ZXN0X2Nvbm5lY3Rpb24gLSBSZXF1ZXN0IGEgbmV3IGNvbm5lY3Rpb24KKyAqIEB3cGFfczogUG9pbnRlciB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCBhIG5ldyBjb25uZWN0aW9uIHRvIGJlIGZvdW5kLiBJdCB3aWxsIG1hcmsKKyAqIHRoZSBpbnRlcmZhY2UgdG8gYWxsb3cgcmVhc3NvY2lhdGlvbiBhbmQgcmVxdWVzdCBhIG5ldyBzY2FuIHRvIGZpbmQgYQorICogc3VpdGFibGUgbmV0d29yayB0byBjb25uZWN0IHRvLgorICovCit2b2lkIHdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7CisJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKKwl3cGFfcy0+ZXh0cmFfYmxhY2tsaXN0X2NvdW50ID0gMDsKKwl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMDsKKwl3cGFfcy0+cmVhc3NvY2lhdGUgPSAxOworCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKK30KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmNvbmYgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5jb25mCmluZGV4IDBiMGVhODguLjE4NDYwYjggMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50LmNvbmYKKysrIGIvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQuY29uZgpAQCAtMjY1LDYgKzI2NSwyOSBAQAogIyBpbmFjdGl2ZSBzdGF0aW9ucy4KICNwMnBfZ29fbWF4X2luYWN0aXZpdHk9MzAwCiAKKyMgT3Bwb3J0dW5pc3RpYyBLZXkgQ2FjaGluZyAoYWxzbyBrbm93biBhcyBQcm9hY3RpdmUgS2V5IENhY2hpbmcpIGRlZmF1bHQKKyMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUKKyMgcHJvYWN0aXZlX2tleV9jYWNoaW5nIHBhcmFtZXRlci4gQnkgZGVmYXVsdCwgT0tDIGlzIGRpc2FibGVkIHVubGVzcyBlbmFibGVkCisjIHdpdGggdGhlIGdsb2JhbCBva2M9MSBwYXJhbWV0ZXIgb3Igd2l0aCB0aGUgcGVyLW5ldHdvcmsKKyMgcHJvYWN0aXZlX2tleV9jYWNoaW5nPTEgcGFyYW1ldGVyLiBXaXRoIG9rYz0xLCBPS0MgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBidXQKKyMgY2FuIGJlIGRpc2FibGVkIHdpdGggcGVyLW5ldHdvcmsgcHJvYWN0aXZlX2tleV9jYWNoaW5nPTAgcGFyYW1ldGVyLgorI29rYz0wCisKKyMgUHJvdGVjdGVkIE1hbmFnZW1lbnQgRnJhbWVzIGRlZmF1bHQKKyMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUgaWVlZTgwMjExdworIyBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQsIFBNRiBpcyBkaXNhYmxlZCB1bmxlc3MgZW5hYmxlZCB3aXRoIHRoZSBnbG9iYWwgcG1mPTEvMgorIyBwYXJhbWV0ZXIgb3Igd2l0aCB0aGUgcGVyLW5ldHdvcmsgaWVlZTgwMjExdz0xLzIgcGFyYW1ldGVyLiBXaXRoIHBtZj0xLzIsIFBNRgorIyBpcyBlbmFibGVkL3JlcXVpcmVkIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgcGVyLW5ldHdvcmsKKyMgaWVlZTgwMjExdyBwYXJhbWV0ZXIuCisjcG1mPTAKKworIyBFbmFibGVkIFNBRSBmaW5pdGUgY3ljbGljIGdyb3VwcyBpbiBwcmVmZXJlbmNlIG9yZGVyCisjIEJ5IGRlZmF1bHQgKGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzZXQpLCB0aGUgbWFuZGF0b3J5IGdyb3VwIDE5IChFQ0MgZ3JvdXAKKyMgZGVmaW5lZCBvdmVyIGEgMjU2LWJpdCBwcmltZSBvcmRlciBmaWVsZCkgaXMgcHJlZmVycmVkLCBidXQgb3RoZXIgZ3JvdXBzIGFyZQorIyBhbHNvIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCwgdGhlIGdyb3VwcyB3aWxsIGJlIHRyaWVkIGluIHRoZQorIyBpbmRpY2F0ZWQgb3JkZXIuIFRoZSBncm91cCB2YWx1ZXMgYXJlIGxpc3RlZCBpbiB0aGUgSUFOQSByZWdpc3RyeToKKyMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9pcHNlYy1yZWdpc3RyeS9pcHNlYy1yZWdpc3RyeS54bWwjaXBzZWMtcmVnaXN0cnktOQorI3NhZV9ncm91cHM9MjEgMjAgMTkgMjYgMjUKIAogIyBJbnRlcndvcmtpbmcgKElFRUUgODAyLjExdSkKIApAQCAtMzc0LDYgKzM5NywxMSBAQAogIyBwaGFzZTI6IFByZS1jb25maWd1cmUgUGhhc2UgMiAoaW5uZXIgYXV0aGVudGljYXRpb24pIHBhcmFtZXRlcnMKICMJVGhpcyBvcHRpb25hbCBmaWVsZCBpcyB1c2VkIHdpdGggbGlrZSB0aGUgJ2VhcCcgcGFyYW1ldGVyLgogIworIyBleGNsdWRlZF9zc2lkOiBFeGNsdWRlZCBTU0lECisjCVRoaXMgb3B0aW9uYWwgZmllbGQgY2FuIGJlIHVzZWQgdG8gZXhjbHVkZWQgc3BlY2lmaWMgU1NJRChzKSBmcm9tCisjCW1hdGNoaW5nIHdpdGggdGhlIG5ldHdvcmsuIE11bHRpcGxlIGVudHJpZXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBtb3JlCisjCXRoYW4gb25lIFNTSUQuCisjCiAjIGZvciBleGFtcGxlOgogIwogI2NyZWQ9ewpAQCAtNDc0LDYgKzUwMiwyMyBAQAogIyBzZXQsIHNjYW4gcmVzdWx0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHNwZWNpZmllZCBmcmVxdWVuY2llcyBhcmUgbm90CiAjIGNvbnNpZGVyZWQgd2hlbiBzZWxlY3RpbmcgYSBCU1MuCiAjCisjIGJnc2NhbjogQmFja2dyb3VuZCBzY2FubmluZworIyB3cGFfc3VwcGxpY2FudCBiZWhhdmlvciBmb3IgYmFja2dyb3VuZCBzY2FubmluZyBjYW4gYmUgc3BlY2lmaWVkIGJ5CisjIGNvbmZpZ3VyaW5nIGEgYmdzY2FuIG1vZHVsZS4gVGhlc2UgbW9kdWxlcyBhcmUgcmVzcG9uc2libGUgZm9yIHJlcXVlc3RpbmcKKyMgYmFja2dyb3VuZCBzY2FucyBmb3IgdGhlIHB1cnBvc2Ugb2Ygcm9hbWluZyB3aXRoaW4gYW4gRVNTIChpLmUuLCB3aXRoaW4gYQorIyBzaW5nbGUgbmV0d29yayBibG9jayB3aXRoIGFsbCB0aGUgQVBzIHVzaW5nIHRoZSBzYW1lIFNTSUQpLiBUaGUgYmdzY2FuCisjIHBhcmFtZXRlciB1c2VzIGZvbGxvd2luZyBmb3JtYXQ6ICI8YmdzY2FuIG1vZHVsZSBuYW1lPjo8bW9kdWxlIHBhcmFtZXRlcnM+IgorIyBGb2xsb3dpbmcgYmdzY2FuIG1vZHVsZXMgYXJlIGF2YWlsYWJsZToKKyMgc2ltcGxlIC0gUGVyaW9kaWMgYmFja2dyb3VuZCBzY2FucyBiYXNlZCBvbiBzaWduYWwgc3RyZW5ndGgKKyMgYmdzY2FuPSJzaW1wbGU6PHNob3J0IGJnc2NhbiBpbnRlcnZhbCBpbiBzZWNvbmRzPjo8c2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZD46CisjIDxsb25nIGludGVydmFsPiIKKyMgYmdzY2FuPSJzaW1wbGU6MzA6LTQ1OjMwMCIKKyMgbGVhcm4gLSBMZWFybiBjaGFubmVscyB1c2VkIGJ5IHRoZSBuZXR3b3JrIGFuZCB0cnkgdG8gYXZvaWQgYmdzY2FucyBvbiBvdGhlcgorIyBjaGFubmVscyAoZXhwZXJpbWVudGFsKQorIyBiZ3NjYW49ImxlYXJuOjxzaG9ydCBiZ3NjYW4gaW50ZXJ2YWwgaW4gc2Vjb25kcz46PHNpZ25hbCBzdHJlbmd0aCB0aHJlc2hvbGQ+OgorIyA8bG9uZyBpbnRlcnZhbD5bOjxkYXRhYmFzZSBmaWxlIG5hbWU+XSIKKyMgYmdzY2FuPSJsZWFybjozMDotNDU6MzAwOi9ldGMvd3BhX3N1cHBsaWNhbnQvbmV0d29yazEuYmdzY2FuIgorIwogIyBwcm90bzogbGlzdCBvZiBhY2NlcHRlZCBwcm90b2NvbHMKICMgV1BBID0gV1BBL0lFRUUgODAyLjExaS9EMy4wCiAjIFJTTiA9IFdQQTIvSUVFRSA4MDIuMTFpIChhbHNvIFdQQTIgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yIFJTTikKQEAgLTQ5MCw3ICs1MzUsNyBAQAogIyBJZiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvOiBXUEEtUFNLIFdQQS1FQVAKICMKICMgaWVlZTgwMjExdzogd2hldGhlciBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gaXMgZW5hYmxlZAotIyAwID0gZGlzYWJsZWQgKGRlZmF1bHQpCisjIDAgPSBkaXNhYmxlZCAoZGVmYXVsdCB1bmxlc3MgY2hhbmdlZCB3aXRoIHRoZSBnbG9iYWwgcG1mIHBhcmFtZXRlcikKICMgMSA9IG9wdGlvbmFsCiAjIDIgPSByZXF1aXJlZAogIyBUaGUgbW9zdCBjb21tb24gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIGJhc2VkIG9uIHRoZSBQTUYgKHByb3RlY3RlZApAQCAtNTQ4LDcgKzU5Myw3IEBACiAjCiAjIHByb2FjdGl2ZV9rZXlfY2FjaGluZzoKICMgRW5hYmxlL2Rpc2FibGUgb3Bwb3J0dW5pc3RpYyBQTUtTQSBjYWNoaW5nIGZvciBXUEEyLgotIyAwID0gZGlzYWJsZWQgKGRlZmF1bHQpCisjIDAgPSBkaXNhYmxlZCAoZGVmYXVsdCB1bmxlc3MgY2hhbmdlZCB3aXRoIHRoZSBnbG9iYWwgb2tjIHBhcmFtZXRlcikKICMgMSA9IGVuYWJsZWQKICMKICMgd2VwX2tleTAuLjM6IFN0YXRpYyBXRVAga2V5IChBU0NJSSBpbiBkb3VibGUgcXVvdGF0aW9uLCBlLmcuICJhYmNkZSIgb3IKQEAgLTc4Nyw2ICs4MzIsMzQgQEAKICMgRFRJTSBwZXJpb2QgaW4gQmVhY29uIGludGVydmFscyBmb3IgQVAgbW9kZSAoZGVmYXVsdDogMikKICNkdGltX3BlcmlvZD0yCiAKKyMgZGlzYWJsZV9odDogV2hldGhlciBIVCAoODAyLjExbikgc2hvdWxkIGJlIGRpc2FibGVkLgorIyAwID0gSFQgZW5hYmxlZCAoaWYgQVAgc3VwcG9ydHMgaXQpCisjIDEgPSBIVCBkaXNhYmxlZAorIworIyBkaXNhYmxlX2h0NDA6IFdoZXRoZXIgSFQtNDAgKDgwMi4xMW4pIHNob3VsZCBiZSBkaXNhYmxlZC4KKyMgMCA9IEhULTQwIGVuYWJsZWQgKGlmIEFQIHN1cHBvcnRzIGl0KQorIyAxID0gSFQtNDAgZGlzYWJsZWQKKyMKKyMgZGlzYWJsZV9zZ2k6IFdoZXRoZXIgU0dJIChzaG9ydCBndWFyZCBpbnRlcnZhbCkgc2hvdWxkIGJlIGRpc2FibGVkLgorIyAwID0gU0dJIGVuYWJsZWQgKGlmIEFQIHN1cHBvcnRzIGl0KQorIyAxID0gU0dJIGRpc2FibGVkCisjCisjIGh0X21jczogIENvbmZpZ3VyZSBhbGxvd2VkIE1DUyByYXRlcy4KKyMgIFBhcnNlZCBhcyBhbiBhcnJheSBvZiBieXRlcywgaW4gYmFzZS0xNiAoYXNjaWktaGV4KQorIyBodF9tY3M9IiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhbGwgYXZhaWxhYmxlIChkZWZhdWx0KQorIyBodF9tY3M9IjB4ZmYgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIiAgIC8vIFVzZSBNQ1MgMC03IG9ubHkKKyMgaHRfbWNzPSIweGZmIGZmIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICIgICAvLyBVc2UgTUNTIDAtMTUgb25seQorIworIyBkaXNhYmxlX21heF9hbXNkdTogIFdoZXRoZXIgTUFYX0FNU0RVIHNob3VsZCBiZSBkaXNhYmxlZC4KKyMgLTEgPSBEbyBub3QgbWFrZSBhbnkgY2hhbmdlcy4KKyMgMCAgPSBFbmFibGUgTUFYLUFNU0RVIGlmIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgorIyAxICA9IERpc2FibGUgQU1TRFUKKyMKKyMgYW1wZHVfZGVuc2l0eTogIEFsbG93IG92ZXJyaWRpbmcgQU1QRFUgZGVuc2l0eSBjb25maWd1cmF0aW9uLgorIyAgVHJlYXRlZCBhcyBoaW50IGJ5IHRoZSBrZXJuZWwuCisjIC0xID0gRG8gbm90IG1ha2UgYW55IGNoYW5nZXMuCisjIDAtMyA9IFNldCBBTVBEVSBkZW5zaXR5IChha2EgZmFjdG9yKSB0byBzcGVjaWZpZWQgdmFsdWUuCisKICMgRXhhbXBsZSBibG9ja3M6CiAKICMgU2ltcGxlIGNhc2U6IFdQQS1QU0ssIFBTSyBhcyBhbiBBU0NJSSBwYXNzcGhyYXNlLCBhbGxvdyBhbGwgdmFsaWQgY2lwaGVycwpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnRfaS5oIGIvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnRfaS5oCmluZGV4IDU1ZjNkODguLmVjYmRlZGYgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50X2kuaAorKysgYi93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudF9pLmgKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgInV0aWxzL2xpc3QuaCIKICNpbmNsdWRlICJjb21tb24vZGVmcy5oIgorI2luY2x1ZGUgImNvbW1vbi9zYWUuaCIKICNpbmNsdWRlICJjb25maWdfc3NpZC5oIgogCiBleHRlcm4gY29uc3QgY2hhciAqd3BhX3N1cHBsaWNhbnRfdmVyc2lvbjsKQEAgLTI0OSwxMSArMjUwLDE1IEBACiB9OwogCiAKKy8qKgorICogb2ZmY2hhbm5lbF9zZW5kX2FjdGlvbl9yZXN1bHQgLSBSZXN1bHQgb2Ygb2ZmY2hhbm5lbCBzZW5kIEFjdGlvbiBmcmFtZQorICovCiBlbnVtIG9mZmNoYW5uZWxfc2VuZF9hY3Rpb25fcmVzdWx0IHsKLQlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX1NVQ0NFU1MgLyogRnJhbWUgd2FzIHNlbmQgYW5kIGFja25vd2xlZGdlZCAqLywKLQlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX05PX0FDSyAvKiBGcmFtZSB3YXMgc2VudCwgYnV0IG5vdCBhY2tub3dsZWRnZWQKKwlPRkZDSEFOTkVMX1NFTkRfQUNUSU9OX1NVQ0NFU1MgLyoqPCBGcmFtZSB3YXMgc2VuZCBhbmQgYWNrbm93bGVkZ2VkICovLAorCU9GRkNIQU5ORUxfU0VORF9BQ1RJT05fTk9fQUNLIC8qKjwgRnJhbWUgd2FzIHNlbnQsIGJ1dCBub3QgYWNrbm93bGVkZ2VkCiAJCQkJICAgICAgICovLAotCU9GRkNIQU5ORUxfU0VORF9BQ1RJT05fRkFJTEVEIC8qIEZyYW1lIHdhcyBub3Qgc2VudCBkdWUgdG8gYSBmYWlsdXJlICovCisJT0ZGQ0hBTk5FTF9TRU5EX0FDVElPTl9GQUlMRUQgLyoqPCBGcmFtZSB3YXMgbm90IHNlbnQgZHVlIHRvIGEgZmFpbHVyZQorCQkJCSAgICAgICAqLwogfTsKIAogc3RydWN0IHdwc19hcF9pbmZvIHsKQEAgLTI2Nyw2ICsyNzIsMTEgQEAKIAlzdHJ1Y3Qgb3NfdGltZSBsYXN0X2F0dGVtcHQ7CiB9OwogCitzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgeworCXU4IHNzaWRbMzJdOworCXNpemVfdCBzc2lkX2xlbjsKK307CisKIC8qKgogICogc3RydWN0IHdwYV9zdXBwbGljYW50IC0gSW50ZXJuYWwgZGF0YSBmb3Igd3BhX3N1cHBsaWNhbnQgaW50ZXJmYWNlCiAgKgpAQCAtMzIzLDYgKzMzMywxMSBAQAogCXU4ICpic3NpZF9maWx0ZXI7CiAJc2l6ZV90IGJzc2lkX2ZpbHRlcl9jb3VudDsKIAorCXU4ICpkaXNhbGxvd19hcHNfYnNzaWQ7CisJc2l6ZV90IGRpc2FsbG93X2Fwc19ic3NpZF9jb3VudDsKKwlzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUgKmRpc2FsbG93X2Fwc19zc2lkOworCXNpemVfdCBkaXNhbGxvd19hcHNfc3NpZF9jb3VudDsKKwogCS8qIHByZXZpb3VzIHNjYW4gd2FzIHdpbGRjYXJkIHdoZW4gaW50ZXJsZWF2aW5nIGJldHdlZW4KIAkgKiB3aWxkY2FyZCBzY2FucyBhbmQgc3BlY2lmaWMgU1NJRCBzY2FuIHdoZW4gbWF4X3NzaWRzPTEgKi8KIAlpbnQgcHJldl9zY2FuX3dpbGRjYXJkOwpAQCAtMzcwLDcgKzM4NSw2IEBACiAJaW50IHNjYW5uaW5nOwogCWludCBzY2hlZF9zY2FubmluZzsKIAlpbnQgbmV3X2Nvbm5lY3Rpb247Ci0JaW50IHJlYXNzb2NpYXRlZF9jb25uZWN0aW9uOwogCiAJaW50IGVhcG9sX3JlY2VpdmVkOyAvKiBudW1iZXIgb2YgRUFQT0wgcGFja2V0cyByZWNlaXZlZCBhZnRlciB0aGUKIAkJCSAgICAgKiBwcmV2aW91cyBhc3NvY2lhdGlvbiBldmVudCAqLwpAQCAtMzg3LDEyICs0MDEsNTQgQEAKIAogCXN0cnVjdCB3cGFfYmxhY2tsaXN0ICpibGFja2xpc3Q7CiAKLQlpbnQgc2Nhbl9yZXE7IC8qIG1hbnVhbCBzY2FuIHJlcXVlc3Q7IHRoaXMgZm9yY2VzIGEgc2NhbiBldmVuIGlmIHRoZXJlCi0JCSAgICAgICAqIGFyZSBubyBlbmFibGVkIG5ldHdvcmtzIGluIHRoZSBjb25maWd1cmF0aW9uICovCisJLyoqCisJICogZXh0cmFfYmxhY2tsaXN0X2NvdW50IC0gU3VtIG9mIGJsYWNrbGlzdCBjb3VudHMgYWZ0ZXIgbGFzdCBjb25uZWN0aW9uCisJICoKKwkgKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBjb3VudCBvZiB0ZW1wb3JhcnkgYmxhY2tsaXN0aW5nCisJICogZmFpbHVyZXMgKG1heGltdW0gbnVtYmVyIGZvciBhbnkgQlNTKSBvdmVyIGJsYWNrbGlzdCBjbGVhcgorCSAqIG9wZXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGZvciBmaWd1cmluZyBvdXQgd2hldGhlciB0aGVyZSBoYXMgYmVlbgorCSAqIGZhaWx1cmVzIHByaW9yIHRvIHRoZSBsYXN0IGJsYWNrbGlzdCBjbGVhciBvcGVyYXRpb24gd2hpY2ggaGFwcGVucworCSAqIHdoZW5ldmVyIG5vIG90aGVyIG5vdC1ibGFja2xpc3RlZCBCU1MgY2FuZGlkYXRlcyBhcmUgYXZhaWxhYmxlLiBUaGlzCisJICogZ2V0cyBjbGVhcmVkIHdoZW5ldmVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCBzdWNjZXNzZnVsbHkuCisJICovCisJaW50IGV4dHJhX2JsYWNrbGlzdF9jb3VudDsKKworCS8qKgorCSAqIHNjYW5fcmVxIC0gVHlwZSBvZiB0aGUgc2NhbiByZXF1ZXN0CisJICovCisJZW51bSBzY2FuX3JlcV90eXBlIHsKKwkJLyoqCisJCSAqIE5PUk1BTF9TQ0FOX1JFUSAtIE5vcm1hbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciBzY2FucyBpbml0aWF0ZWQgYnkgd3BhX3N1cHBsaWNhbnQgdG8gZmluZCBhbgorCQkgKiBBUCBmb3IgYSBjb25uZWN0aW9uLgorCQkgKi8KKwkJTk9STUFMX1NDQU5fUkVRLAorCisJCS8qKgorCQkgKiBJTklUSUFMX1NDQU5fUkVRIC0gSW5pdGlhbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciB0aGUgZmlyc3Qgc2NhbiBvbiBhbiBpbnRlcmZhY2UgdG8gZm9yY2UgYXQKKwkJICogbGVhc3Qgb25lIHNjYW4gdG8gYmUgcnVuIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QKKwkJICogaW5jbHVkZSBhbnkgZW5hYmxlZCBuZXR3b3Jrcy4KKwkJICovCisJCUlOSVRJQUxfU0NBTl9SRVEsCisKKwkJLyoqCisJCSAqIE1BTlVBTF9TQ0FOX1JFUSAtIE1hbnVhbCBzY2FuIHJlcXVlc3QKKwkJICoKKwkJICogVGhpcyBpcyB1c2VkIGZvciBzY2FucyB3aGVyZSB0aGUgdXNlciByZXF1ZXN0IGEgc2NhbiBvcgorCQkgKiBhIHNwZWNpZmljIHdwYV9zdXBwbGljYW50IG9wZXJhdGlvbiAoZS5nLiwgV1BTKSByZXF1aXJlcyBzY2FuCisJCSAqIHRvIGJlIHJ1bi4KKwkJICovCisJCU1BTlVBTF9TQ0FOX1JFUQorCX0gc2Nhbl9yZXE7CiAJaW50IHNjYW5fcnVuczsgLyogbnVtYmVyIG9mIHNjYW4gcnVucyBzaW5jZSBXUFMgd2FzIHN0YXJ0ZWQgKi8KIAlpbnQgKm5leHRfc2Nhbl9mcmVxczsKIAlpbnQgc2Nhbl9pbnRlcnZhbDsgLyogdGltZSBpbiBzZWMgYmV0d2VlbiBzY2FucyB0byBmaW5kIHN1aXRhYmxlIEFQICovCiAJaW50IG5vcm1hbF9zY2FuczsgLyogbm9ybWFsIHNjYW5zIHJ1biBiZWZvcmUgc2NoZWRfc2NhbiAqLworCWludCBzY2FuX2Zvcl9jb25uZWN0aW9uOyAvKiB3aGV0aGVyIHRoZSBzY2FuIHJlcXVlc3Qgd2FzIHRyaWdnZXJlZCBmb3IKKwkJCQkgICogZmluZGluZyBhIGNvbm5lY3Rpb24gKi8KIAogCXVuc2lnbmVkIGludCBkcnZfZmxhZ3M7CiAJdW5zaWduZWQgaW50IGRydl9lbmM7CkBAIC00MjIsNiArNDc4LDcgQEAKIAlzdHJ1Y3Qgd3BhYnVmICpwZW5kaW5nX2VhcG9sX3J4OwogCXN0cnVjdCBvc190aW1lIHBlbmRpbmdfZWFwb2xfcnhfdGltZTsKIAl1OCBwZW5kaW5nX2VhcG9sX3J4X3NyY1tFVEhfQUxFTl07CisJdW5zaWduZWQgaW50IGxhc3RfZWFwb2xfbWF0Y2hlc19ic3NpZDoxOwogCiAJc3RydWN0IGlic3NfcnNuICppYnNzX3JzbjsKIApAQCAtNDU3LDYgKzUxNCwxMSBAQAogCQl1OCBzY2hlZF9vYnNzX3NjYW47CiAJCXUxNiBvYnNzX3NjYW5faW50OwogCQl1MTYgYnNzX21heF9pZGxlX3BlcmlvZDsKKyNpZmRlZiBDT05GSUdfU0FFCisJCXN0cnVjdCBzYWVfZGF0YSBzYWU7CisJCXN0cnVjdCB3cGFidWYgKnNhZV90b2tlbjsKKwkJaW50IHNhZV9ncm91cF9pbmRleDsKKyNlbmRpZiAvKiBDT05GSUdfU0FFICovCiAJfSBzbWU7CiAjZW5kaWYgLyogQ09ORklHX1NNRSAqLwogCkBAIC01NDksNiArNjExLDcgQEAKIAl1bnNpZ25lZCBpbnQgcDJwX2ZhbGxiYWNrX3RvX2dvX25lZzoxOwogCXVuc2lnbmVkIGludCBwMnBfcGRfYmVmb3JlX2dvX25lZzoxOwogCXVuc2lnbmVkIGludCBwMnBfZ29faHQ0MDoxOworCXVuc2lnbmVkIGludCB1c2VyX2luaXRpYXRlZF9wZDoxOwogCWludCBwMnBfcGVyc2lzdGVudF9nb19mcmVxOwogCWludCBwMnBfcGVyc2lzdGVudF9pZDsKIAlpbnQgcDJwX2dvX2ludGVudDsKQEAgLTU3Myw2ICs2MzYsNyBAQAogCWludCBhZnRlcl93cHM7CiAJaW50IGtub3duX3dwc19mcmVxOwogCXVuc2lnbmVkIGludCB3cHNfZnJlcTsKKwl1MTYgd3BzX2FwX2NoYW5uZWw7CiAJaW50IHdwc19mcmFnbWVudF9zaXplOwogCWludCBhdXRvX3JlY29ubmVjdF9kaXNhYmxlZDsKIApAQCAtNjA4LDYgKzY3Miw4IEBACiAJc3RydWN0IHdwYWJ1ZiAqbGFzdF9nYXNfcmVzcDsKIAl1OCBsYXN0X2dhc19hZGRyW0VUSF9BTEVOXTsKIAl1OCBsYXN0X2dhc19kaWFsb2dfdG9rZW47CisKKwl1bnNpZ25lZCBpbnQgbm9fa2VlcF9hbGl2ZToxOwogfTsKIAogCkBAIC02NDMsOCArNzA5LDYgQEAKIHZvaWQgd3BhX3N1cHBsaWNhbnRfY2FuY2VsX2F1dGhfdGltZW91dChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfZGVhdXRoZW50aWNhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkgICBpbnQgcmVhc29uX2NvZGUpOwotdm9pZCB3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKLQkJCQkgaW50IHJlYXNvbl9jb2RlKTsKIAogdm9pZCB3cGFfc3VwcGxpY2FudF9lbmFibGVfbmV0d29yayhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJCSAgIHN0cnVjdCB3cGFfc3NpZCAqc3NpZCk7CkBAIC02ODQsNyArNzQ4LDYgQEAKIHZvaWQgd3BhX3N1cHBsaWNhbnRfcnhfZWFwb2wodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjX2FkZHIsCiAJCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOwogZW51bSB3cGFfa2V5X21nbXQga2V5X21nbXQyZHJpdmVyKGludCBrZXlfbWdtdCk7Ci1lbnVtIHdwYV9jaXBoZXIgY2lwaGVyX3N1aXRlMmRyaXZlcihpbnQgY2lwaGVyKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfdXBkYXRlX2NvbmZpZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKIHZvaWQgd3BhX3N1cHBsaWNhbnRfY2xlYXJfc3RhdHVzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwogdm9pZCB3cGFzX2Nvbm5lY3Rpb25fZmFpbGVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCk7CkBAIC02OTMsNyArNzU2LDExIEBACiB2b2lkIHdwYXNfYXV0aF9mYWlsZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CiB2b2lkIHdwYXNfY2xlYXJfdGVtcF9kaXNhYmxlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAogCQkJICAgICAgc3RydWN0IHdwYV9zc2lkICpzc2lkLCBpbnQgY2xlYXJfZmFpbHVyZXMpOwotdm9pZCB3cGFfc3VwcGxpY2FudF9wcm9jXzQwbWh6X2ludG9sZXJhbnQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyk7CitpbnQgZGlzYWxsb3dlZF9ic3NpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqYnNzaWQpOworaW50IGRpc2FsbG93ZWRfc3NpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjb25zdCB1OCAqc3NpZCwKKwkJICAgIHNpemVfdCBzc2lkX2xlbik7Cit2b2lkIHdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOworaW50IHdwYXNfYnVpbGRfZXh0X2NhcGFiKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIHU4ICpidWYpOwogCiAvKioKICAqIHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfY3RybF9yc3BfaGFuZGxlIC0gSGFuZGxlIGEgY29udHJvbCByZXNwb25zZQpkaWZmIC0tZ2l0IGEvd3BhX3N1cHBsaWNhbnQvd3Bhc19nbHVlLmMgYi93cGFfc3VwcGxpY2FudC93cGFzX2dsdWUuYwppbmRleCA2YWE1MjA1Li40ODU5Nzc0IDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93cGFzX2dsdWUuYworKysgYi93cGFfc3VwcGxpY2FudC93cGFzX2dsdWUuYwpAQCAtNDA2LDE0ICs0MDYsNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF93cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUodm9pZCAqd3BhX3MsIGludCByZWFzb25fY29kZSkKLXsKLQl3cGFfc3VwcGxpY2FudF9kaXNhc3NvY2lhdGUod3BhX3MsIHJlYXNvbl9jb2RlKTsKLQkvKiBTY2hlZHVsZSBhIHNjYW4gdG8gbWFrZSBzdXJlIHdlIGNvbnRpbnVlIGxvb2tpbmcgZm9yIG5ldHdvcmtzICovCi0Jd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDUsIDApOwotfQotCi0KIHN0YXRpYyB2b2lkIF93cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh2b2lkICp3cGFfcywgaW50IHJlYXNvbl9jb2RlKQogewogCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLCByZWFzb25fY29kZSk7CkBAIC02NzAsNiArNjYyLDggQEAKIAkJcmV0dXJuOwogCX0KIAorCXdwYXNfbm90aWZ5X2VhcF9zdGF0dXMod3BhX3MsICJlYXAgcGFyYW1ldGVyIG5lZWRlZCIsIGZpZWxkX25hbWUpOworCiAJYnVmbGVuID0gMTAwICsgb3Nfc3RybGVuKHR4dCkgKyBzc2lkLT5zc2lkX2xlbjsKIAlidWYgPSBvc19tYWxsb2MoYnVmbGVuKTsKIAlpZiAoYnVmID09IE5VTEwpCkBAIC04MTQsNiArODA4LDcgQEAKIH0KIAogCisjaWZuZGVmIENPTkZJR19OT19XUEEKIHN0YXRpYyB2b2lkIHdwYV9zdXBwbGljYW50X3NldF9yZWtleV9vZmZsb2FkKHZvaWQgKmN0eCwgY29uc3QgdTggKmtlaywKIAkJCQkJICAgICBjb25zdCB1OCAqa2NrLAogCQkJCQkgICAgIGNvbnN0IHU4ICpyZXBsYXlfY3RyKQpAQCAtODIyLDYgKzgxNyw3IEBACiAKIAl3cGFfZHJ2X3NldF9yZWtleV9pbmZvKHdwYV9zLCBrZWssIGtjaywgcmVwbGF5X2N0cik7CiB9CisjZW5kaWYgLyogQ09ORklHX05PX1dQQSAqLwogCiAKIGludCB3cGFfc3VwcGxpY2FudF9pbml0X3dwYShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQpAQCAtODM5LDcgKzgzNSw2IEBACiAJY3R4LT5zZXRfc3RhdGUgPSBfd3BhX3N1cHBsaWNhbnRfc2V0X3N0YXRlOwogCWN0eC0+Z2V0X3N0YXRlID0gX3dwYV9zdXBwbGljYW50X2dldF9zdGF0ZTsKIAljdHgtPmRlYXV0aGVudGljYXRlID0gX3dwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlOwotCWN0eC0+ZGlzYXNzb2NpYXRlID0gX3dwYV9zdXBwbGljYW50X2Rpc2Fzc29jaWF0ZTsKIAljdHgtPnNldF9rZXkgPSB3cGFfc3VwcGxpY2FudF9zZXRfa2V5OwogCWN0eC0+Z2V0X25ldHdvcmtfY3R4ID0gd3BhX3N1cHBsaWNhbnRfZ2V0X25ldHdvcmtfY3R4OwogCWN0eC0+Z2V0X2Jzc2lkID0gd3BhX3N1cHBsaWNhbnRfZ2V0X2Jzc2lkOwpAQCAtODg5LDcgKzg4NCw4IEBACiAJCWNvbmYucGVlcmtleV9lbmFibGVkID0gc3NpZC0+cGVlcmtleTsKIAkJY29uZi5hbGxvd2VkX3BhaXJ3aXNlX2NpcGhlciA9IHNzaWQtPnBhaXJ3aXNlX2NpcGhlcjsKICNpZmRlZiBJRUVFODAyMVhfRUFQT0wKLQkJY29uZi5wcm9hY3RpdmVfa2V5X2NhY2hpbmcgPSBzc2lkLT5wcm9hY3RpdmVfa2V5X2NhY2hpbmc7CisJCWNvbmYucHJvYWN0aXZlX2tleV9jYWNoaW5nID0gc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nIDwgMCA/CisJCQl3cGFfcy0+Y29uZi0+b2tjIDogc3NpZC0+cHJvYWN0aXZlX2tleV9jYWNoaW5nOwogCQljb25mLmVhcF93b3JrYXJvdW5kID0gc3NpZC0+ZWFwX3dvcmthcm91bmQ7CiAJCWNvbmYuZWFwX2NvbmZfY3R4ID0gJnNzaWQtPmVhcDsKICNlbmRpZiAvKiBJRUVFODAyMVhfRUFQT0wgKi8KZGlmZiAtLWdpdCBhL3dwYV9zdXBwbGljYW50L3dwc19zdXBwbGljYW50LmMgYi93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5jCmluZGV4IDkxNWNhNTcuLjcxMWMzYzAgMTAwNjQ0Ci0tLSBhL3dwYV9zdXBwbGljYW50L3dwc19zdXBwbGljYW50LmMKKysrIGIvd3BhX3N1cHBsaWNhbnQvd3BzX3N1cHBsaWNhbnQuYwpAQCAtMjU2LDYgKzI1NiwxNSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoYXV0aF90eXBlID09IFdQU19BVVRIX1dQQVBTSyB8fCBhdXRoX3R5cGUgPT0gV1BTX0FVVEhfV1BBMlBTSykgeworCQlpZiAoY3JlZC0+a2V5X2xlbiA8IDggfHwgY3JlZC0+a2V5X2xlbiA+IDIgKiBQTUtfTEVOKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIldQUzogUmVqZWN0IFBTSyBjcmVkZW50aWFsIHdpdGggIgorCQkJCSAgICJpbnZhbGlkIE5ldHdvcmsgS2V5IGxlbmd0aCAlbHUiLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKSBjcmVkLT5rZXlfbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwogCWlmIChzc2lkICYmIChzc2lkLT5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9XUFMpKSB7CiAJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBSZXBsYWNlIFdQUyBuZXR3b3JrIGJsb2NrIGJhc2VkICIKIAkJCSAgICJvbiB0aGUgcmVjZWl2ZWQgY3JlZGVudGlhbCIpOwpAQCAtNDAzLDYgKzQxMiw5IEBACiAKIAl3cGFzX3dwc19zZWN1cml0eV93b3JrYXJvdW5kKHdwYV9zLCBzc2lkLCBjcmVkKTsKIAorCWlmIChjcmVkLT5hcF9jaGFubmVsKQorCQl3cGFfcy0+d3BzX2FwX2NoYW5uZWwgPSBjcmVkLT5hcF9jaGFubmVsOworCiAjaWZuZGVmIENPTkZJR19OT19DT05GSUdfV1JJVEUKIAlpZiAod3BhX3MtPmNvbmYtPnVwZGF0ZV9jb25maWcgJiYKIAkgICAgd3BhX2NvbmZpZ193cml0ZSh3cGFfcy0+Y29uZm5hbWUsIHdwYV9zLT5jb25mKSkgewpAQCAtNDExLDYgKzQyMywxMyBAQAogCX0KICNlbmRpZiAvKiBDT05GSUdfTk9fQ09ORklHX1dSSVRFICovCiAKKwkvKgorCSAqIE9wdGltaXplIHRoZSBwb3N0LVdQUyBzY2FuIGJhc2VkIG9uIHRoZSBjaGFubmVsIHVzZWQgZHVyaW5nCisJICogdGhlIHByb3Zpc2lvbmluZyBpbiBjYXNlIEVBUC1GYWlsdXJlIGlzIG5vdCByZWNlaXZlZC4KKwkgKi8KKwl3cGFfcy0+YWZ0ZXJfd3BzID0gNTsKKwl3cGFfcy0+d3BzX2ZyZXEgPSB3cGFfcy0+YXNzb2NfZnJlcTsKKwogCXJldHVybiAwOwogfQogCkBAIC00ODcsMTEgKzUwNiw1OCBAQAogfQogCiAKK3N0YXRpYyB2b2lkIHdwYXNfd3BzX3JlZW5hYmxlX25ldHdvcmtzX2NiKHZvaWQgKmVsb29wX2N0eCwgdm9pZCAqdGltZW91dF9jdHgpOworCitzdGF0aWMgdm9pZCB3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3JrcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQoreworCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrc19jYiwgd3BhX3MsIE5VTEwpOworCisJZm9yIChzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7IHNzaWQ7IHNzaWQgPSBzc2lkLT5uZXh0KSB7CisJCWlmIChzc2lkLT5kaXNhYmxlZF9mb3JfY29ubmVjdCAmJiBzc2lkLT5kaXNhYmxlZCkgeworCQkJc3NpZC0+ZGlzYWJsZWRfZm9yX2Nvbm5lY3QgPSAwOworCQkJc3NpZC0+ZGlzYWJsZWQgPSAwOworCQkJd3Bhc19ub3RpZnlfbmV0d29ya19lbmFibGVkX2NoYW5nZWQod3BhX3MsIHNzaWQpOworCQkJY2hhbmdlZCsrOworCQl9CisJfQorCisJaWYgKGNoYW5nZWQpIHsKKyNpZm5kZWYgQ09ORklHX05PX0NPTkZJR19XUklURQorCQlpZiAod3BhX3MtPmNvbmYtPnVwZGF0ZV9jb25maWcgJiYKKwkJICAgIHdwYV9jb25maWdfd3JpdGUod3BhX3MtPmNvbmZuYW1lLCB3cGFfcy0+Y29uZikpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBGYWlsZWQgdG8gdXBkYXRlICIKKwkJCQkgICAiY29uZmlndXJhdGlvbiIpOworCQl9CisjZW5kaWYgLyogQ09ORklHX05PX0NPTkZJR19XUklURSAqLworCX0KK30KKworCitzdGF0aWMgdm9pZCB3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrc19jYih2b2lkICplbG9vcF9jdHgsIHZvaWQgKnRpbWVvdXRfY3R4KQoreworCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSBlbG9vcF9jdHg7CisJLyogRW5hYmxlIHRoZSBuZXR3b3JrcyBkaXNhYmxlZCBkdXJpbmcgd3Bhc193cHNfcmVhc3NvYyAqLworCXdwYXNfd3BzX3JlZW5hYmxlX25ldHdvcmtzKHdwYV9zKTsKK30KKworCiBzdGF0aWMgdm9pZCB3cGFfc3VwcGxpY2FudF93cHNfZXZlbnRfc3VjY2VzcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCXdwYV9tc2cod3BhX3MsIE1TR19JTkZPLCBXUFNfRVZFTlRfU1VDQ0VTUyk7CiAJd3BhX3MtPndwc19zdWNjZXNzID0gMTsKIAl3cGFzX25vdGlmeV93cHNfZXZlbnRfc3VjY2Vzcyh3cGFfcyk7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgbmV0d29ya3MgZGlzYWJsZWQgZHVyaW5nIHdwYXNfd3BzX3JlYXNzb2MgYWZ0ZXIgMTAKKwkgKiBzZWNvbmRzLiBUaGUgMTAgc2Vjb25kcyB0aW1lciBpcyB0byBhbGxvdyB0aGUgZGF0YSBjb25uZWN0aW9uIHRvIGJlCisJICogZm9ybWVkIGJlZm9yZSBhbGxvd2luZyBvdGhlciBuZXR3b3JrcyB0byBiZSBzZWxlY3RlZC4KKwkgKi8KKwllbG9vcF9yZWdpc3Rlcl90aW1lb3V0KDEwLCAwLCB3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrc19jYiwgd3BhX3MsCisJCQkgICAgICAgTlVMTCk7CisKICNpZmRlZiBDT05GSUdfUDJQCiAJd3Bhc19wMnBfd3BzX3N1Y2Nlc3Mod3BhX3MsIHdwYV9zLT5ic3NpZCwgMCk7CiAjZW5kaWYgLyogQ09ORklHX1AyUCAqLwpAQCAtNjkwLDYgKzc1Niw5IEBACiAKIAlwcmV2X2N1cnJlbnQgPSB3cGFfcy0+Y3VycmVudF9zc2lkOwogCisJLyogRW5hYmxlIHRoZSBuZXR3b3JrcyBkaXNhYmxlZCBkdXJpbmcgd3Bhc193cHNfcmVhc3NvYyAqLworCXdwYXNfd3BzX3JlZW5hYmxlX25ldHdvcmtzKHdwYV9zKTsKKwogCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfd3BzX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKIAogCS8qIFJlbW92ZSBhbnkgZXhpc3RpbmcgV1BTIG5ldHdvcmsgZnJvbSBjb25maWd1cmF0aW9uICovCkBAIC04MTksNiArODg4LDcgQEAKIAlzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7CiAJd2hpbGUgKHNzaWQpIHsKIAkJaW50IHdhc19kaXNhYmxlZCA9IHNzaWQtPmRpc2FibGVkOworCQlzc2lkLT5kaXNhYmxlZF9mb3JfY29ubmVjdCA9IDA7CiAJCS8qCiAJCSAqIEluIGNhc2UgdGhlIG5ldHdvcmsgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIGEgcGVyc2lzdGVudCBncm91cAogCQkgKiB0aGVuIGRvIG5vdCBzZW5kIG91dCBuZXR3b3JrIGRpc2FibGVkIHNpZ25hbC4gSW4gYWRkaXRpb24sCkBAIC04MjcsOSArODk3LDEyIEBACiAJCSAqLwogCQlpZiAod2FzX2Rpc2FibGVkICE9IDIpIHsKIAkJCXNzaWQtPmRpc2FibGVkID0gc3NpZCAhPSBzZWxlY3RlZDsKLQkJCWlmICh3YXNfZGlzYWJsZWQgIT0gc3NpZC0+ZGlzYWJsZWQpCisJCQlpZiAod2FzX2Rpc2FibGVkICE9IHNzaWQtPmRpc2FibGVkKSB7CisJCQkJaWYgKHNzaWQtPmRpc2FibGVkKQorCQkJCQlzc2lkLT5kaXNhYmxlZF9mb3JfY29ubmVjdCA9IDE7CiAJCQkJd3Bhc19ub3RpZnlfbmV0d29ya19lbmFibGVkX2NoYW5nZWQod3BhX3MsCiAJCQkJCQkJCSAgICBzc2lkKTsKKwkJCX0KIAkJfQogCQlzc2lkID0gc3NpZC0+bmV4dDsKIAl9CkBAIC04NjUsNyArOTM4LDggQEAKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfUDJQICovCi0Jd3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsICJcInBiYz0xXCIiLCAwKTsKKwlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsICJcInBiYz0xXCIiLCAwKSA8IDApCisJCXJldHVybiAtMTsKIAlpZiAod3BhX3MtPndwc19mcmFnbWVudF9zaXplKQogCQlzc2lkLT5lYXAuZnJhZ21lbnRfc2l6ZSA9IHdwYV9zLT53cHNfZnJhZ21lbnRfc2l6ZTsKIAllbG9vcF9yZWdpc3Rlcl90aW1lb3V0KFdQU19QQkNfV0FMS19USU1FLCAwLCB3cGFzX3dwc190aW1lb3V0LApAQCAtOTA4LDcgKzk4Miw4IEBACiAJCW9zX3NucHJpbnRmKHZhbCwgc2l6ZW9mKHZhbCksICJcInBpbj0lMDhkIGRldl9wd19pZD0ldVwiIiwKIAkJCSAgICBycGluLCBkZXZfcHdfaWQpOwogCX0KLQl3cGFfY29uZmlnX3NldChzc2lkLCAicGhhc2UxIiwgdmFsLCAwKTsKKwlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsIHZhbCwgMCkgPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKHdwYV9zLT53cHNfZnJhZ21lbnRfc2l6ZSkKIAkJc3NpZC0+ZWFwLmZyYWdtZW50X3NpemUgPSB3cGFfcy0+d3BzX2ZyYWdtZW50X3NpemU7CiAJZWxvb3BfcmVnaXN0ZXJfdGltZW91dChXUFNfUEJDX1dBTEtfVElNRSwgMCwgd3Bhc193cHNfdGltZW91dCwKQEAgLTk0MCw2MiArMTAxNSwxMyBAQAogCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSh3cGFfcywKIAkJCQkJICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQl3cGFzX2NsZWFyX3dwcyh3cGFfcyk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJd3Bhc193cHNfcmVlbmFibGVfbmV0d29ya3Mod3BhX3MpOwogCQl3cGFzX3dwc19jbGVhcl9hcF9pbmZvKHdwYV9zKTsKLQotCXJldHVybiAwOwotfQotCi0KLSNpZmRlZiBDT05GSUdfV1BTX09PQgotaW50IHdwYXNfd3BzX3N0YXJ0X29vYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpkZXZpY2VfdHlwZSwKLQkJICAgICAgIGNoYXIgKnBhdGgsIGNoYXIgKm1ldGhvZCwgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3Qgd3BzX2NvbnRleHQgKndwcyA9IHdwYV9zLT53cHM7Ci0Jc3RydWN0IG9vYl9kZXZpY2VfZGF0YSAqb29iX2RldjsKLQotCW9vYl9kZXYgPSB3cHNfZ2V0X29vYl9kZXZpY2UoZGV2aWNlX3R5cGUpOwotCWlmIChvb2JfZGV2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlvb2JfZGV2LT5kZXZpY2VfcGF0aCA9IHBhdGg7Ci0Jb29iX2Rldi0+ZGV2aWNlX25hbWUgPSBuYW1lOwotCXdwcy0+b29iX2NvbmYub29iX21ldGhvZCA9IHdwc19nZXRfb29iX21ldGhvZChtZXRob2QpOwotCi0JaWYgKHdwcy0+b29iX2NvbmYub29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0RFVl9QV0RfRSkgewotCQkvKgotCQkgKiBVc2UgcHJlLWNvbmZpZ3VyZWQgREgga2V5cyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHdyaXRlIHRoZQotCQkgKiBrZXkgaGFzaCBpbnRvIHRoZSBPT0IgZmlsZS4KLQkJICovCi0JCXdwYWJ1Zl9mcmVlKHdwcy0+ZGhfcHVia2V5KTsKLQkJd3BhYnVmX2ZyZWUod3BzLT5kaF9wcml2a2V5KTsKLQkJd3BzLT5kaF9wcml2a2V5ID0gTlVMTDsKLQkJd3BzLT5kaF9wdWJrZXkgPSBOVUxMOwotCQlkaDVfZnJlZSh3cHMtPmRoX2N0eCk7Ci0JCXdwcy0+ZGhfY3R4ID0gZGg1X2luaXQoJndwcy0+ZGhfcHJpdmtleSwgJndwcy0+ZGhfcHVia2V5KTsKLQkJd3BzLT5kaF9wdWJrZXkgPSB3cGFidWZfemVyb3BhZCh3cHMtPmRoX3B1YmtleSwgMTkyKTsKLQkJaWYgKHdwcy0+ZGhfY3R4ID09IE5VTEwgfHwgd3BzLT5kaF9wdWJrZXkgPT0gTlVMTCkgewotCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJXUFM6IEZhaWxlZCB0byBpbml0aWFsaXplICIKLQkJCQkgICAiRGlmZmllLUhlbGxtYW4gaGFuZHNoYWtlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KIAl9CiAKLQlpZiAod3BzLT5vb2JfY29uZi5vb2JfbWV0aG9kID09IE9PQl9NRVRIT0RfQ1JFRCkKLQkJd3Bhc19jbGVhcl93cHMod3BhX3MpOwotCi0JaWYgKHdwc19wcm9jZXNzX29vYih3cHMsIG9vYl9kZXYsIDApIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCh3cHMtPm9vYl9jb25mLm9vYl9tZXRob2QgPT0gT09CX01FVEhPRF9ERVZfUFdEX0UgfHwKLQkgICAgIHdwcy0+b29iX2NvbmYub29iX21ldGhvZCA9PSBPT0JfTUVUSE9EX0RFVl9QV0RfUikgJiYKLQkgICAgd3Bhc193cHNfc3RhcnRfcGluKHdwYV9zLCBOVUxMLAotCQkJICAgICAgIHdwYWJ1Zl9oZWFkKHdwcy0+b29iX2NvbmYuZGV2X3Bhc3N3b3JkKSwgMCwKLQkJCSAgICAgICBERVZfUFdfREVGQVVMVCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KIAogCiBpbnQgd3Bhc193cHNfc3RhcnRfcmVnKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCwKQEAgLTEwMzEsNyArMTA1Nyw4IEBACiAJcmVzID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcIiIpOwogCWlmIChyZXMgPCAwIHx8IHJlcyA+PSBlbmQgLSBwb3MpCiAJCXJldHVybiAtMTsKLQl3cGFfY29uZmlnX3NldChzc2lkLCAicGhhc2UxIiwgdmFsLCAwKTsKKwlpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgInBoYXNlMSIsIHZhbCwgMCkgPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKHdwYV9zLT53cHNfZnJhZ21lbnRfc2l6ZSkKIAkJc3NpZC0+ZWFwLmZyYWdtZW50X3NpemUgPSB3cGFfcy0+d3BzX2ZyYWdtZW50X3NpemU7CiAJZWxvb3BfcmVnaXN0ZXJfdGltZW91dChXUFNfUEJDX1dBTEtfVElNRSwgMCwgd3Bhc193cHNfdGltZW91dCwKQEAgLTEyNDcsNiArMTI3NCw3IEBACiB2b2lkIHdwYXNfd3BzX2RlaW5pdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQogewogCWVsb29wX2NhbmNlbF90aW1lb3V0KHdwYXNfd3BzX3RpbWVvdXQsIHdwYV9zLCBOVUxMKTsKKwllbG9vcF9jYW5jZWxfdGltZW91dCh3cGFzX3dwc19yZWVuYWJsZV9uZXR3b3Jrc19jYiwgd3BhX3MsIE5VTEwpOwogCXdwYXNfd3BzX2NsZWFyX2FwX2luZm8od3BhX3MpOwogCiAJaWYgKHdwYV9zLT53cHMgPT0gTlVMTCkKQEAgLTEyNjAsOCArMTI4OCw2IEBACiAJd3BzX3JlZ2lzdHJhcl9kZWluaXQod3BhX3MtPndwcy0+cmVnaXN0cmFyKTsKIAl3cGFidWZfZnJlZSh3cGFfcy0+d3BzLT5kaF9wdWJrZXkpOwogCXdwYWJ1Zl9mcmVlKHdwYV9zLT53cHMtPmRoX3ByaXZrZXkpOwotCXdwYWJ1Zl9mcmVlKHdwYV9zLT53cHMtPm9vYl9jb25mLnB1YmtleV9oYXNoKTsKLQl3cGFidWZfZnJlZSh3cGFfcy0+d3BzLT5vb2JfY29uZi5kZXZfcGFzc3dvcmQpOwogCXdwYWJ1Zl9mcmVlKHdwYV9zLT53cHMtPmRldi52ZW5kb3JfZXh0X20xKTsKIAlvc19mcmVlKHdwYV9zLT53cHMtPm5ldHdvcmtfa2V5KTsKIAlvc19mcmVlKHdwYV9zLT53cHMpOwpAQCAtMTg1MSw2ICsxODc3LDggQEAKIHN0YXRpYyBpbnQgd3Bhc193cHNfdXNlX2NyZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgc3RydWN0IHdwc19wYXJzZV9hdHRyICphdHRyKQogeworCXdwYV9zLT53cHNfYXBfY2hhbm5lbCA9IDA7CisKIAlpZiAod3BzX29vYl91c2VfY3JlZCh3cGFfcy0+d3BzLCBhdHRyKSA8IDApCiAJCXJldHVybiAtMTsKIApAQCAtMTg2MSw2ICsxODg5LDI0IEBACiAJCSAgICJiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgY3JlZGVudGlhbCBhZGRlZCIpOwogCXdwYV9zLT5ub3JtYWxfc2NhbnMgPSAwOwogCXdwYV9zdXBwbGljYW50X3JlaW5pdF9hdXRvc2Nhbih3cGFfcyk7CisJaWYgKHdwYV9zLT53cHNfYXBfY2hhbm5lbCkgeworCQl1MTYgY2hhbiA9IHdwYV9zLT53cHNfYXBfY2hhbm5lbDsKKwkJaW50IGZyZXEgPSAwOworCisJCWlmIChjaGFuID49IDEgJiYgY2hhbiA8PSAxMykKKwkJCWZyZXEgPSAyNDA3ICsgNSAqIGNoYW47CisJCWVsc2UgaWYgKGNoYW4gPT0gMTQpCisJCQlmcmVxID0gMjQ4NDsKKwkJZWxzZSBpZiAoY2hhbiA+PSAzMCkKKwkJCWZyZXEgPSA1MDAwICsgNSAqIGNoYW47CisKKwkJaWYgKGZyZXEpIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBDcmVkZW50aWFsIGluZGljYXRlZCAiCisJCQkJICAgIkFQIGNoYW5uZWwgJXUgLT4gJXUgTUh6IiwgY2hhbiwgZnJlcSk7CisJCQl3cGFfcy0+YWZ0ZXJfd3BzID0gNTsKKwkJCXdwYV9zLT53cHNfZnJlcSA9IGZyZXE7CisJCX0KKwl9CiAJd3BhX3MtPmRpc2Nvbm5lY3RlZCA9IDA7CiAJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKIAl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CkBAIC0xOTMwLDYgKzE5NzYsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKK3N0cnVjdCB3cGFidWYgKiB3cGFzX3dwc19uZmNfaGFuZG92ZXJfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJcmV0dXJuIG5kZWZfYnVpbGRfd2lmaV9ocigpOworfQorCisKK3N0cnVjdCB3cGFidWYgKiB3cGFzX3dwc19uZmNfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSkKK3sKKwkvKiBUT0RPICovCisJcmV0dXJuIC0xOworfQorCisKK2ludCB3cGFzX3dwc19uZmNfcnhfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCisJCQkJIGNvbnN0IHN0cnVjdCB3cGFidWYgKmRhdGEpCit7CisJc3RydWN0IHdwYWJ1ZiAqd3BzOworCWludCByZXQ7CisKKwl3cHMgPSBuZGVmX3BhcnNlX3dpZmkoZGF0YSk7CisJaWYgKHdwcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFJlY2VpdmVkIGFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjICIKKwkJICAgInBheWxvYWQgZnJvbSBORkMgY29ubmVjdGlvbiBoYW5kb3ZlciIpOworCXdwYV9oZXhkdW1wX2J1Zl9rZXkoTVNHX0RFQlVHLCAiV1BTOiBORkMgcGF5bG9hZCIsIHdwcyk7CisJcmV0ID0gd3Bhc193cHNfbmZjX3RhZ19wcm9jZXNzKHdwYV9zLCB3cHMpOworCXdwYWJ1Zl9mcmVlKHdwcyk7CisKKwlyZXR1cm4gcmV0OworfQorCiAjZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KIAogCmRpZmYgLS1naXQgYS93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5oIGIvd3BhX3N1cHBsaWNhbnQvd3BzX3N1cHBsaWNhbnQuaAppbmRleCBkNWViM2I2Li5kZDBkYzYwIDEwMDY0NAotLS0gYS93cGFfc3VwcGxpY2FudC93cHNfc3VwcGxpY2FudC5oCisrKyBiL3dwYV9zdXBwbGljYW50L3dwc19zdXBwbGljYW50LmgKQEAgLTksNyArOSw2IEBACiAjaWZuZGVmIFdQU19TVVBQTElDQU5UX0gKICNkZWZpbmUgV1BTX1NVUFBMSUNBTlRfSAogCi1zdHJ1Y3Qgd3BhX3NjYW5fcmVzOwogc3RydWN0IHdwYV9zY2FuX3Jlc3VsdHM7CiAKICNpZmRlZiBDT05GSUdfV1BTCkBAIC0zNSw4ICszNCw2IEBACiBpbnQgd3Bhc193cHNfc3RhcnRfcGluKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKnBpbiwgaW50IHAycF9ncm91cCwgdTE2IGRldl9wd19pZCk7CiBpbnQgd3Bhc193cHNfY2FuY2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOwotaW50IHdwYXNfd3BzX3N0YXJ0X29vYihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpkZXZpY2VfdHlwZSwKLQkJICAgICAgIGNoYXIgKnBhdGgsIGNoYXIgKm1ldGhvZCwgY2hhciAqbmFtZSk7CiBpbnQgd3Bhc193cHNfc3RhcnRfcmVnKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKnBpbiwgc3RydWN0IHdwc19uZXdfYXBfc2V0dGluZ3MgKnNldHRpbmdzKTsKIGludCB3cGFzX3dwc19zc2lkX2Jzc19tYXRjaChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLApAQCAtNjksNiArNjYsMTIgQEAKIGludCB3cGFzX3dwc19zdGFydF9uZmMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgdTggKmJzc2lkKTsKIGludCB3cGFzX3dwc19uZmNfdGFnX3JlYWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSk7CitzdHJ1Y3Qgd3BhYnVmICogd3Bhc193cHNfbmZjX2hhbmRvdmVyX3JlcShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKTsKK3N0cnVjdCB3cGFidWYgKiB3cGFzX3dwc19uZmNfaGFuZG92ZXJfc2VsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpOworaW50IHdwYXNfd3BzX25mY19yeF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKKwkJCQkgY29uc3Qgc3RydWN0IHdwYWJ1ZiAqZGF0YSk7CitpbnQgd3Bhc193cHNfbmZjX3J4X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAorCQkJCSBjb25zdCBzdHJ1Y3Qgd3BhYnVmICpkYXRhKTsKIHZvaWQgd3Bhc193cHNfdXBkYXRlX2FwX2luZm8oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCSAgICAgc3RydWN0IHdwYV9zY2FuX3Jlc3VsdHMgKnNjYW5fcmVzKTsKIHZvaWQgd3Bhc193cHNfbm90aWZ5X2Fzc29jKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNvbnN0IHU4ICpic3NpZCk7CkBAIC05NiwxNCArOTksMTQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgd3Bhc193cHNfc3NpZF9ic3NfbWF0Y2goc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKIAkJCQkJICBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCi0JCQkJCSAgc3RydWN0IHdwYV9zY2FuX3JlcyAqYnNzKQorCQkJCQkgIHN0cnVjdCB3cGFfYnNzICpic3MpCiB7CiAJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB3cGFzX3dwc19zc2lkX3dpbGRjYXJkX29rKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCiAJCQkJCSAgICBzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQsCi0JCQkJCSAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzICpic3MpCisJCQkJCSAgICBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKQogewogCXJldHVybiAwOwogfQo=