ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IGFlMDhlNGMuLmE0ZTU1OTkwIDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTI1NzEsNiArMjU3MSwxNiBAQAogUzogUGVydGgsIFdlc3Rlcm4gQXVzdHJhbGlhCiBTOiBBdXN0cmFsaWEKIAorTjogTWlndWVsIE9qZWRhIFNhbmRvbmlzCitFOiBtYXhleHRyZW1lQGdtYWlsLmNvbQorRDogQXV0aG9yOiBBdXhpbGlhcnkgTENEIENvbnRyb2xsZXIgZHJpdmVyIChrczAxMDgpCitEOiBBdXRob3I6IEF1eGlsaWFyeSBMQ0QgZHJpdmVyIChjZmFnMTI4NjRiKQorRDogQXV0aG9yOiBBdXhpbGlhcnkgTENEIGZyYW1lYnVmZmVyIGRyaXZlciAoY2ZhZzEyODY0YmZiKQorRDogTWFpbnRhaW5lcjogQXV4aWxpYXJ5IGRpc3BsYXkgZHJpdmVycyB0cmVlIChkcml2ZXJzL2F1eGRpc3BsYXkvKikKK1M6IEMvIE1pZXNlcyAyMCwgOS1CCitTOiBWYWxsYWRvbGlkIDQ3MDA5CitTOiBTcGFpbgorCiBOOiBHcmVnIFBhZ2UKIEU6IGdwYWdlQHNvdmVyZWlnbi5vcmcKIEQ6IElQWCBkZXZlbG9wbWVudCBhbmQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGIgYi9Eb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTcyYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGIKQEAgLTAsMCArMSwxMDUgQEAKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCWNmYWcxMjg2NGIgTENEIERyaXZlciBEb2N1bWVudGF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZToJCUdQTHYyCitBdXRob3IgJiBNYWludGFpbmVyOglNaWd1ZWwgT2plZGEgU2FuZG9uaXMgPG1heGV4dHJlbWVAZ21haWwuY29tPgorRGF0ZToJCQkyMDA2LTEwLTI3CisKKworCistLS0tLS0tLQorMC4gSU5ERVgKKy0tLS0tLS0tCisKKwkxLiBEUklWRVIgSU5GT1JNQVRJT04KKwkyLiBERVZJQ0UgSU5GT1JNQVRJT04KKwkzLiBXSVJJTkcKKwk0LiBVU0VSU1BBQ0UgUFJPR1JBTU1JTkcKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuIERSSVZFUiBJTkZPUk1BVElPTgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIHN1cHBvcnQgb25lIGNmYWcxMjg2NGIgZGlzcGxheSBhdCB0aW1lLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMi4gREVWSUNFIElORk9STUFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFudWZhY3R1cmVyOglDcnlzdGFsZm9udHoKK0RldmljZSBOYW1lOglDcnlzdGFsZm9udHogMTI4NjRiIExDRCBTZXJpZXMKK0RldmljZSBDb2RlOgljZmFnMTI4NjRiCitXZWJwYWdlOglodHRwOi8vd3d3LmNyeXN0YWxmb250ei5jb20KK0RldmljZSBXZWJwYWdlOglodHRwOi8vd3d3LmNyeXN0YWxmb250ei5jb20vcHJvZHVjdHMvMTI4NjRiLworVHlwZToJCUxDRCAoTGlxdWlkIENyeXN0YWwgRGlzcGxheSkKK1dpZHRoOgkJMTI4CitIZWlnaHQ6CQk2NAorQ29sb3JzOgkJMiAoQi9OKQorQ29udHJvbGxlcjoJa3MwMTA4CitDb250cm9sbGVyczoJMgorUGFnZXM6CQk4IGVhY2ggY29udHJvbGxlcgorQWRkcmVzc2VzOgk2NCBlYWNoIHBhZ2UKK0RhdGEgc2l6ZToJMSBieXRlIGVhY2ggYWRkcmVzcworTWVtb3J5IHNpemU6CTIgKiA4ICogNjQgKiAxID0gMTAyNCBieXRlcyA9IDEgS2J5dGUKKworCistLS0tLS0tLS0KKzMuIFdJUklORworLS0tLS0tLS0tCisKK1RoZSBjZmFnMTI4NjRiIExDRCBTZXJpZXMgZG9uJ3QgaGF2ZSBvZmZpY2lhbCB3aXJpbmcuCisKK1RoZSBjb21tb24gd2lyaW5nIGlzIGRvbmUgdG8gdGhlIHBhcmFsbGVsIHBvcnQgYXMgc2hvd246CisKK1BhcmFsbGVsIFBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIGNmYWcxMjg2NGIKKworICBOYW1lIFBpbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIyBOYW1lCisKK1N0cm9iZSAoIDEpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKDE3KSBFbmFibGUKK0RhdGEgMCAoIDIpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA0KSBEYXRhIDAKK0RhdGEgMSAoIDMpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA1KSBEYXRhIDEKK0RhdGEgMiAoIDQpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA2KSBEYXRhIDIKK0RhdGEgMyAoIDUpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA3KSBEYXRhIDMKK0RhdGEgNCAoIDYpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA4KSBEYXRhIDQKK0RhdGEgNSAoIDcpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCA5KSBEYXRhIDUKK0RhdGEgNiAoIDgpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKDEwKSBEYXRhIDYKK0RhdGEgNyAoIDkpLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKDExKSBEYXRhIDcKKyAgICAgICAoMTApICAgICAgICAgICAgICAgICAgICAgIFsrNXZdLS0tKCAxKSBWZGQKKyAgICAgICAoMTEpICAgICAgICAgICAgICAgICAgICAgIFtHTkRdLS0tKCAyKSBHcm91bmQKKyAgICAgICAoMTIpICAgICAgICAgICAgICAgICAgICAgIFsrNXZdLS0tKDE0KSBSZXNldAorICAgICAgICgxMykgICAgICAgICAgICAgICAgICAgICAgW0dORF0tLS0oMTUpIFJlYWQgLyBXcml0ZQorICBMaW5lICgxNCktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oMTMpIENvbnRyb2xsZXIgU2VsZWN0IDEKKyAgICAgICAoMTUpCisgIEluaXQgKDE2KS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSgxMikgQ29udHJvbGxlciBTZWxlY3QgMgorU2VsZWN0ICgxNyktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oMTYpIERhdGEgLyBJbnN0cnVjdGlvbgorR3JvdW5kICgxOCktLS1bR05EXSAgICAgICAgICAgICAgWys1dl0tLS0oMTkpIExFRCArCitHcm91bmQgKDE5KS0tLVtHTkRdCitHcm91bmQgKDIwKS0tLVtHTkRdICAgICAgICAgICAgICBFICAgIEEgICAgICAgICAgICAgVmFsdWVzOgorR3JvdW5kICgyMSktLS1bR05EXSAgICAgICBbR05EXS0tLVtQMV0tLS0oMTgpIFZlZSAgICC3IFIgPSBSZXNpc3RvciA9IDIyIG9obQorR3JvdW5kICgyMiktLS1bR05EXSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICC3IFAxID0gUHJlc2V0ID0gMTAgS29obQorR3JvdW5kICgyMyktLS1bR05EXSAgICAgICAtLS0tICAgUyAtLS0tLS0oIDMpIFYwICAgICC3IFAyID0gUHJlc2V0ID0gMSBLb2htCitHcm91bmQgKDI0KS0tLVtHTkRdICAgICAgIHwgIHwKK0dyb3VuZCAoMjUpLS0tW0dORF0gW0dORF0tLS1bUDJdLS0tW1JdLS0tKDIwKSBMRUQgLQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNC4gVVNFUlNQQUNFIFBST0dSQU1NSU5HCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNmYWcxMjg2NGJmYiBkZXNjcmliZXMgYSBmcmFtZWJ1ZmZlciBkZXZpY2UgKC9kZXYvZmJYKS4KKworSXQgaGFzIGEgc2l6ZSBvZiAxMDI0IGJ5dGVzID0gMSBLYnl0ZS4KK0VhY2ggYml0IHJlcHJlc2VudHMgb25lIHBpeGVsLiBJZiB0aGUgYml0IGlzIGhpZ2gsIHRoZSBwaXhlbCB3aWxsCit0dXJuIG9uLiBJZiB0aGUgcGl4ZWwgaXMgbG93LCB0aGUgcGl4ZWwgd2lsbCB0dXJuIG9mZi4KKworWW91IGNhbiB1c2UgdGhlIGZyYW1lYnVmZmVyIGFzIGEgZmlsZTogZm9wZW4sIGZ3cml0ZSwgZmNsb3NlLi4uCitBbHRob3VnaCB0aGUgTENEIHdvbid0IGdldCB1cGRhdGVkIHVudGlsIHRoZSBuZXh0IHJlZnJlc2ggdGltZSBhcnJpdmVzLgorCitBbHNvLCB5b3UgY2FuIG1tYXAgdGhlIGZyYW1lYnVmZmVyOiBvcGVuICYgbW1hcCwgbXVubWFwICYgY2xvc2UuLi4KK3doaWNoIGlzIHRoZSBiZXN0IG9wdGlvbiBmb3IgbW9zdCB1c2VzLgorCitDaGVjayBEb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0Yi1leGFtcGxlLmMKK2ZvciBhIHJlYWwgd29ya2luZyB1c2Vyc3BhY2UgY29tcGxldGUgcHJvZ3JhbSB3aXRoIHVzYWdlIGV4YW1wbGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGItZXhhbXBsZS5jIGIvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGItZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmFjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0Yi1leGFtcGxlLmMKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiAgICBGaWxlbmFtZTogY2ZhZzEyODY0Yi1leGFtcGxlLmMKKyAqICAgICBWZXJzaW9uOiAwLjEuMAorICogRGVzY3JpcHRpb246IGNmYWcxMjg2NGIgTENEIHVzZXJzcGFjZSBleGFtcGxlIHByb2dyYW0KKyAqICAgICBMaWNlbnNlOiBHUEx2MgorICoKKyAqICAgICAgQXV0aG9yOiBDb3B5cmlnaHQgKEMpIE1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+CisgKiAgICAgICAgRGF0ZTogMjAwNi0xMC0zMQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN0YXJ0IG9mIGNmYWcxMjg2NGIgY29kZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjZGVmaW5lIENGQUcxMjg2NEJfV0lEVEgJCSgxMjgpCisjZGVmaW5lIENGQUcxMjg2NEJfSEVJR0hUCQkoNjQpCisjZGVmaW5lIENGQUcxMjg2NEJfU0laRQkJCSgxMjggKiA2NCAvIDgpCisjZGVmaW5lIENGQUcxMjg2NEJfQlBCCQkJKDgpCisjZGVmaW5lIENGQUcxMjg2NEJfQUREUkVTUyh4LCB5KQkoKHkpICogQ0ZBRzEyODY0Ql9XSURUSCAvIFwKKwkJCQkJQ0ZBRzEyODY0Ql9CUEIgKyAoeCkgLyBDRkFHMTI4NjRCX0JQQikKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9CSVQobikJCSgoKHVuc2lnbmVkIGNoYXIpIDEpIDw8IChuKSkKKworI3VuZGVmIENGQUcxMjg2NEJfRE9DSEVDSworI2lmZGVmIENGQUcxMjg2NEJfRE9DSEVDSworCSNkZWZpbmUgQ0ZBRzEyODY0Ql9DSEVDSyh4LCB5KQkJKCh4KSA8IENGQUcxMjg2NEJfV0lEVEggJiYgXAorCQkJCQkJKHkpIDwgQ0ZBRzEyODY0Ql9IRUlHSFQpCisjZWxzZQorCSNkZWZpbmUgQ0ZBRzEyODY0Ql9DSEVDSyh4LCB5KQkJKDEpCisjZW5kaWYKKworaW50IGNmYWcxMjg2NGJfZmQ7Cit1bnNpZ25lZCBjaGFyICogY2ZhZzEyODY0Yl9tZW07Cit1bnNpZ25lZCBjaGFyIGNmYWcxMjg2NGJfYnVmZmVyW0NGQUcxMjg2NEJfU0laRV07CisKKy8qCisgKiBpbml0IGEgY2ZhZzEyODY0YiBmcmFtZWJ1ZmZlciBkZXZpY2UKKyAqCisgKiBObyBlcnJvcjogICAgICAgcmV0dXJuID0gMAorICogVW5hYmxlIHRvIG9wZW46IHJldHVybiA9IC0xCisgKiBVbmFibGUgdG8gbW1hcDogcmV0dXJuID0gLTIKKyAqLworaW50IGNmYWcxMjg2NGJfaW5pdChjaGFyICpwYXRoKQoreworCWNmYWcxMjg2NGJfZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisJaWYgKGNmYWcxMjg2NGJfZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWNmYWcxMjg2NGJfbWVtID0gbW1hcCgwLCBDRkFHMTI4NjRCX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCU1BUF9TSEFSRUQsIGNmYWcxMjg2NGJfZmQsIDApOworCWlmIChjZmFnMTI4NjRiX21lbSA9PSBNQVBfRkFJTEVEKSB7CisJCWNsb3NlKGNmYWcxMjg2NGJfZmQpOworCQlyZXR1cm4gLTI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBleGl0IGEgY2ZhZzEyODY0YiBmcmFtZWJ1ZmZlciBkZXZpY2UKKyAqLwordm9pZCBjZmFnMTI4NjRiX2V4aXQodm9pZCkKK3sKKwltdW5tYXAoY2ZhZzEyODY0Yl9tZW0sIENGQUcxMjg2NEJfU0laRSk7CisJY2xvc2UoY2ZhZzEyODY0Yl9mZCk7Cit9CisKKy8qCisgKiBzZXQgKHgsIHkpIHBpeGVsCisgKi8KK3ZvaWQgY2ZhZzEyODY0Yl9zZXQodW5zaWduZWQgY2hhciB4LCB1bnNpZ25lZCBjaGFyIHkpCit7CisJaWYgKENGQUcxMjg2NEJfQ0hFQ0soeCwgeSkpCisJCWNmYWcxMjg2NGJfYnVmZmVyW0NGQUcxMjg2NEJfQUREUkVTUyh4LCB5KV0gfD0KKwkJCUNGQUcxMjg2NEJfQklUKHggJSBDRkFHMTI4NjRCX0JQQik7Cit9CisKKy8qCisgKiB1bnNldCAoeCwgeSkgcGl4ZWwKKyAqLwordm9pZCBjZmFnMTI4NjRiX3Vuc2V0KHVuc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciB5KQoreworCWlmIChDRkFHMTI4NjRCX0NIRUNLKHgsIHkpKQorCQljZmFnMTI4NjRiX2J1ZmZlcltDRkFHMTI4NjRCX0FERFJFU1MoeCwgeSldICY9CisJCQl+Q0ZBRzEyODY0Ql9CSVQoeCAlIENGQUcxMjg2NEJfQlBCKTsKK30KKworLyoKKyAqIGlzIHNldCAoeCwgeSkgcGl4ZWw/CisgKgorICogUGl4ZWwgb2ZmOiByZXR1cm4gPSAwCisgKiBQaXhlbCBvbjogIHJldHVybiA9IDEKKyAqLwordW5zaWduZWQgY2hhciBjZmFnMTI4NjRiX2lzc2V0KHVuc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciB5KQoreworCWlmIChDRkFHMTI4NjRCX0NIRUNLKHgsIHkpKQorCQlpZiAoY2ZhZzEyODY0Yl9idWZmZXJbQ0ZBRzEyODY0Ql9BRERSRVNTKHgsIHkpXSAmCisJCQlDRkFHMTI4NjRCX0JJVCh4ICUgQ0ZBRzEyODY0Ql9CUEIpKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5vdCAoeCwgeSkgcGl4ZWwKKyAqLwordm9pZCBjZmFnMTI4NjRiX25vdCh1bnNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIGNoYXIgeSkKK3sKKwlpZiAoY2ZhZzEyODY0Yl9pc3NldCh4LCB5KSkKKwkJY2ZhZzEyODY0Yl91bnNldCh4LCB5KTsKKwllbHNlCisJCWNmYWcxMjg2NGJfc2V0KHgsIHkpOworfQorCisvKgorICogZmlsbCAoc2V0IGFsbCBwaXhlbHMpCisgKi8KK3ZvaWQgY2ZhZzEyODY0Yl9maWxsKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDRkFHMTI4NjRCX1NJWkU7IGkrKykKKwkJY2ZhZzEyODY0Yl9idWZmZXJbaV0gPSAweEZGOworfQorCisvKgorICogY2xlYXIgKHVuc2V0IGFsbCBwaXhlbHMpCisgKi8KK3ZvaWQgY2ZhZzEyODY0Yl9jbGVhcih2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9TSVpFOyBpKyspCisJCWNmYWcxMjg2NGJfYnVmZmVyW2ldID0gMDsKK30KKworLyoKKyAqIGZvcm1hdCBhIFsxMjgqNjRdIG1hdHJpeAorICoKKyAqIFBpeGVsIG9mZjogc3JjW2ldID0gMAorICogUGl4ZWwgb246ICBzcmNbaV0gPiAwCisgKi8KK3ZvaWQgY2ZhZzEyODY0Yl9mb3JtYXQodW5zaWduZWQgY2hhciAqIG1hdHJpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIGksIGosIG47CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9IRUlHSFQ7IGkrKykKKwlmb3IgKGogPSAwOyBqIDwgQ0ZBRzEyODY0Ql9XSURUSCAvIENGQUcxMjg2NEJfQlBCOyBqKyspIHsKKwkJY2ZhZzEyODY0Yl9idWZmZXJbaSAqIENGQUcxMjg2NEJfV0lEVEggLyBDRkFHMTI4NjRCX0JQQiArCisJCQlqXSA9IDA7CisJCWZvciAobiA9IDA7IG4gPCBDRkFHMTI4NjRCX0JQQjsgbisrKQorCQkJaWYgKG1hdHJpeFtpICogQ0ZBRzEyODY0Ql9XSURUSCArCisJCQkJaiAqIENGQUcxMjg2NEJfQlBCICsgbl0pCisJCQkJY2ZhZzEyODY0Yl9idWZmZXJbaSAqIENGQUcxMjg2NEJfV0lEVEggLworCQkJCQlDRkFHMTI4NjRCX0JQQiArIGpdIHw9CisJCQkJCUNGQUcxMjg2NEJfQklUKG4pOworCX0KK30KKworLyoKKyAqIGJsaXQgYnVmZmVyIHRvIGxjZAorICovCit2b2lkIGNmYWcxMjg2NGJfYmxpdCh2b2lkKQoreworCW1lbWNweShjZmFnMTI4NjRiX21lbSwgY2ZhZzEyODY0Yl9idWZmZXIsIENGQUcxMjg2NEJfU0laRSk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBlbmQgb2YgY2ZhZzEyODY0YiBjb2RlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgRVhBTVBMRVMJNgorCit2b2lkIGV4YW1wbGUodW5zaWduZWQgY2hhciBuKQoreworCXVuc2lnbmVkIHNob3J0IGksIGo7CisJdW5zaWduZWQgY2hhciBtYXRyaXhbQ0ZBRzEyODY0Ql9XSURUSCAqIENGQUcxMjg2NEJfSEVJR0hUXTsKKworCWlmIChuID4gRVhBTVBMRVMpCisJCXJldHVybjsKKworCXByaW50ZigiRXhhbXBsZSAlaS8laSAtICIsIG4sIEVYQU1QTEVTKTsKKworCXN3aXRjaCAobikgeworCWNhc2UgMToKKwkJcHJpbnRmKCJEcmF3IHBvaW50cyBzZXR0aW5nIGJpdHMiKTsKKwkJY2ZhZzEyODY0Yl9jbGVhcigpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9XSURUSDsgaSArPSAyKQorCQkJZm9yIChqID0gMDsgaiA8IENGQUcxMjg2NEJfSEVJR0hUOyBqICs9IDIpCisJCQkJY2ZhZzEyODY0Yl9zZXQoaSwgaik7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlwcmludGYoIkNsZWFyIHRoZSBMQ0QiKTsKKwkJY2ZhZzEyODY0Yl9jbGVhcigpOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJcHJpbnRmKCJEcmF3IHJvd3MgZm9ybWF0dGluZyBhIFsxMjgqNjRdIG1hdHJpeCIpOworCQltZW1zZXQobWF0cml4LCAwLCBDRkFHMTI4NjRCX1dJRFRIICogQ0ZBRzEyODY0Ql9IRUlHSFQpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9XSURUSDsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IENGQUcxMjg2NEJfSEVJR0hUOyBqICs9IDIpCisJCQkJbWF0cml4W2ogKiBDRkFHMTI4NjRCX1dJRFRIICsgaV0gPSAxOworCQljZmFnMTI4NjRiX2Zvcm1hdChtYXRyaXgpOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJcHJpbnRmKCJGaWxsIHRoZSBsY2QiKTsKKwkJY2ZhZzEyODY0Yl9maWxsKCk7CisJCWJyZWFrOworCisJY2FzZSA1OgorCQlwcmludGYoIkRyYXcgY29sdW1ucyB1bnNldHRpbmcgYml0cyIpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9XSURUSDsgaSArPSAyKQorCQkJZm9yIChqID0gMDsgaiA8IENGQUcxMjg2NEJfSEVJR0hUOyBqKyspCisJCQkJY2ZhZzEyODY0Yl91bnNldChpLCBqKTsKKwkJYnJlYWs7CisKKwljYXNlIDY6CisJCXByaW50ZigiRG8gbmVnYXRpdmUgbm90LWluZyBhbGwgYml0cyIpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZBRzEyODY0Ql9XSURUSDsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IENGQUcxMjg2NEJfSEVJR0hUOyBqICsrKQorCQkJCWNmYWcxMjg2NGJfbm90KGksIGopOworCQlicmVhazsKKwl9CisKKwlwdXRzKCIgLSBbUHJlc3MgRW50ZXJdIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgY2hhciBuOworCisJaWYgKGFyZ2MgIT0gMikgeworCQlwcmludGYoCisJCQkiU2ludGF4OiAgJXMgZmJkZXZcbiIKKwkJCSJVc3VhbGx5OiAvZGV2L2ZiMCwgL2Rldi9mYjEuLi5cbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNmYWcxMjg2NGJfaW5pdChhcmd2WzFdKSkgeworCQlwcmludGYoIkNhbid0IGluaXQgJXMgZmJkZXZcbiIsIGFyZ3ZbMV0pOworCQlyZXR1cm4gLTI7CisJfQorCisJZm9yIChuID0gMTsgbiA8PSBFWEFNUExFUzsgbisrKSB7CisJCWV4YW1wbGUobik7CisJCWNmYWcxMjg2NGJfYmxpdCgpOworCQl3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOworCX0KKworCWNmYWcxMjg2NGJfZXhpdCgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkva3MwMTA4IGIvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2tzMDEwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIwM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2tzMDEwOApAQCAtMCwwICsxLDU1IEBACisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJa3MwMTA4IExDRCBDb250cm9sbGVyIERyaXZlciBEb2N1bWVudGF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpY2Vuc2U6CQlHUEx2MgorQXV0aG9yICYgTWFpbnRhaW5lcjoJTWlndWVsIE9qZWRhIFNhbmRvbmlzIDxtYXhleHRyZW1lQGdtYWlsLmNvbT4KK0RhdGU6CQkJMjAwNi0xMC0yNworCisKKworLS0tLS0tLS0KKzAuIElOREVYCistLS0tLS0tLQorCisJMS4gRFJJVkVSIElORk9STUFUSU9OCisJMi4gREVWSUNFIElORk9STUFUSU9OCisJMy4gV0lSSU5HCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxLiBEUklWRVIgSU5GT1JNQVRJT04KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBzdXBwb3J0IHRoZSBrczAxMDggTENEIGNvbnRyb2xsZXIuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyLiBERVZJQ0UgSU5GT1JNQVRJT04KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYW51ZmFjdHVyZXI6CVNhbXN1bmcKK0RldmljZSBOYW1lOglLUzAxMDggTENEIENvbnRyb2xsZXIKK0RldmljZSBDb2RlOglrczAxMDgKK1dlYnBhZ2U6CS0KK0RldmljZSBXZWJwYWdlOgktCitUeXBlOgkJTENEIENvbnRyb2xsZXIgKExpcXVpZCBDcnlzdGFsIERpc3BsYXkgQ29udHJvbGxlcikKK1dpZHRoOgkJNjQKK0hlaWdodDoJCTY0CitDb2xvcnM6CQkyIChCL04pCitQYWdlczoJCTgKK0FkZHJlc3NlczoJNjQgZWFjaCBwYWdlCitEYXRhIHNpemU6CTEgYnl0ZSBlYWNoIGFkZHJlc3MKK01lbW9yeSBzaXplOgk4ICogNjQgKiAxID0gNTEyIGJ5dGVzCisKKworLS0tLS0tLS0tCiszLiBXSVJJTkcKKy0tLS0tLS0tLQorCitUaGUgZHJpdmVyIHN1cHBvcnRzIGRhdGEgcGFyYWxsZWwgcG9ydCB3aXJpbmcuCisKK0lmIHlvdSBhcmVuJ3QgYnVpbGRpbmcgTENEIHJlbGF0ZWQgaGFyZHdhcmUsIHlvdSBzaG91bGQgY2hlY2sKK3lvdXIgTENEIHNwZWNpZmljIHdpcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUgc2FtZSBmb2xkZXIuCisKK0ZvciBleGFtcGxlLCBjaGVjayBEb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0Yi4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYTZjMWViZC4uOWVhOTU0YSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTYzNSw2ICs2MzUsMTIgQEAKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZHdtdzIvYXVkaXQtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCitBVVhJTElBUlkgRElTUExBWSBEUklWRVJTCitQOglNaWd1ZWwgT2plZGEgU2FuZG9uaXMKK006CW1heGV4dHJlbWVAZ21haWwuY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKIEFWUjMyIEFSQ0hJVEVDVFVSRQogUDoJSGFhdmFyZCBTa2lubmVtb2VuCiBNOgloc2tpbm5lbW9lbkBhdG1lbC5jb20KQEAgLTgzNiw2ICs4NDIsMTggQEAKIEw6CWRpc2N1c3NAeDg2LTY0Lm9yZwogUzoJTWFpbnRhaW5lZAogCitDRkFHMTI4NjRCIExDRCBEUklWRVIKK1A6CU1pZ3VlbCBPamVkYSBTYW5kb25pcworTToJbWF4ZXh0cmVtZUBnbWFpbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworQ0ZBRzEyODY0QkZCIExDRCBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CU1pZ3VlbCBPamVkYSBTYW5kb25pcworTToJbWF4ZXh0cmVtZUBnbWFpbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogQ09NTU9OIElOVEVSTkVUIEZJTEUgU1lTVEVNIChDSUZTKQogUDoJU3RldmUgRnJlbmNoCiBNOglzZnJlbmNoQHNhbWJhLm9yZwpAQCAtMTk3MSw2ICsxOTg5LDEyIEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0tTMDEwOCBMQ0QgQ09OVFJPTExFUiBEUklWRVIKK1A6CU1pZ3VlbCBPamVkYSBTYW5kb25pcworTToJbWF4ZXh0cmVtZUBnbWFpbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogTEFQQiBtb2R1bGUKIEw6CWxpbnV4LXgyNUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU9ycGhhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IGU3ZGE5ZmEuLjA1MDMyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTgwLDYgKzgwLDggQEAKIAogc291cmNlICJkcml2ZXJzL2RtYS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMva3ZtL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGYyOGRjYjQuLjNhNzE4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMzgsNiArMzgsNyBAQAogb2JqLSQoQ09ORklHX0ZVU0lPTikJCSs9IG1lc3NhZ2UvCiBvYmotJChDT05GSUdfSUVFRTEzOTQpCQkrPSBpZWVlMTM5NC8KIG9iai15CQkJCSs9IGNkcm9tLworb2JqLXkJCQkJKz0gYXV4ZGlzcGxheS8KIG9iai0kKENPTkZJR19NVEQpCQkrPSBtdGQvCiBvYmotJChDT05GSUdfU1BJKQkJKz0gc3BpLwogb2JqLSQoQ09ORklHX1BDQ0FSRCkJCSs9IHBjbWNpYS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnIGIvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMGU3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZwpAQCAtMCwwICsxLDEwOSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisjIEF1eGlsaWFyeSBkaXNwbGF5IGRyaXZlcnMgY29uZmlndXJhdGlvbi4KKyMKKworbWVudSAiQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydCIKKworY29uZmlnIEtTMDEwOAorCXRyaXN0YXRlICJLUzAxMDggTENEIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBQQVJQT1JUX1BDCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBMQ0QgY29udHJvbGxlZCBieSBvbmUgb3IgbW9yZSBLUzAxMDgKKwkgIGNvbnRyb2xsZXJzLCBzYXkgWS4gWW91IHdpbGwgbmVlZCBhbHNvIGFub3RoZXIgbW9yZSBzcGVjaWZpYworCSAgZHJpdmVyIGZvciB5b3VyIExDRC4KKworCSAgRGVwZW5kcyBvbiBQYXJhbGxlbCBQb3J0IHN1cHBvcnQuIElmIHlvdSBzYXkgWSBhdAorCSAgcGFycG9ydCwgeW91IHdpbGwgYmUgYWJsZSB0byBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUgKE0pCisJICBhbmQgYnVpbHQtaW4gYXMgd2VsbCAoWSkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZToKKwkgIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga3MwMTA4LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgS1MwMTA4X1BPUlQKKwloZXggIlBhcmFsbGVsIHBvcnQgd2hlcmUgdGhlIExDRCBpcyBjb25uZWN0ZWQiCisJZGVwZW5kcyBvbiBLUzAxMDgKKwlkZWZhdWx0IDB4Mzc4CisJLS0taGVscC0tLQorCSAgVGhlIGFkZHJlc3Mgb2YgdGhlIHBhcmFsbGVsIHBvcnQgd2hlcmUgdGhlIExDRCBpcyBjb25uZWN0ZWQuCisKKwkgIFRoZSBmaXJzdCAgc3RhbmRhcmQgcGFyYWxsZWwgcG9ydCBhZGRyZXNzIGlzIDB4Mzc4LgorCSAgVGhlIHNlY29uZCBzdGFuZGFyZCBwYXJhbGxlbCBwb3J0IGFkZHJlc3MgaXMgMHgyNzguCisJICBUaGUgdGhpcmQgIHN0YW5kYXJkIHBhcmFsbGVsIHBvcnQgYWRkcmVzcyBpcyAweDNCQy4KKworCSAgWW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IGFkZHJlc3MgaWYgeW91IG5lZWQuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgSSdtIHRhbGtpbmcgYWJvdXQsIGxvYWQgdGhlIHBhcnBvcnQgbW9kdWxlLAorCSAgYW5kIGV4ZWN1dGUgImRtZXNnIiBvciAiY2F0IC9wcm9jL2lvcG9ydHMiLiBZb3UgY2FuIHNlZSB0aGVyZSBob3cKKwkgIG1hbnkgcGFyYWxsZWwgcG9ydHMgYXJlIHByZXNlbnQgYW5kIHdoaWNoIGFkZHJlc3MgZWFjaCBvbmUgaGFzLgorCisJICBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgdG8gdXNlIDB4Mzc4LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoaXMKKwkgIHVzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVycy4KKworY29uZmlnIEtTMDEwOF9ERUxBWQorCWludCAiRGVsYXkgYmV0d2VlbiBlYWNoIGNvbnRyb2wgd3JpdGluZyAobWljcm9zZWNvbmRzKSIKKwlkZXBlbmRzIG9uIEtTMDEwOAorCWRlZmF1bHQgIjIiCisJLS0taGVscC0tLQorCSAgQW1vdW50IG9mIHRpbWUgdGhlIGtzMDEwOCBzaG91bGQgd2FpdCBiZXR3ZWVuIGVhY2ggY29udHJvbCB3cml0ZQorCSAgdG8gdGhlIHBhcmFsbGVsIHBvcnQuCisKKwkgIElmIHlvdXIgZHJpdmVyIHNlZW1zIHRvIG1pc3MgcmFuZG9tIHdyaXRpbmdzLCBpbmNyZW1lbnQgdGhpcy4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBJJ20gdGFsa2luZyBhYm91dCwgaWdub3JlIGl0LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoaXMKKwkgIHZhbHVlIHVzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVycy4KKworY29uZmlnIENGQUcxMjg2NEIKKwl0cmlzdGF0ZSAiQ0ZBRzEyODY0QiBMQ0QiCisJZGVwZW5kcyBvbiBYODYKKwlkZXBlbmRzIG9uIEZCCisJZGVwZW5kcyBvbiBLUzAxMDgKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIENyeXN0YWxmb250eiAxMjh4NjQgMi1jb2xvciBMQ0QsIGNmYWcxMjg2NGIgU2VyaWVzLAorCSAgc2F5IFkuIFlvdSBhbHNvIG5lZWQgdGhlIGtzMDEwOCBMQ0QgQ29udHJvbGxlciBkcml2ZXIuCisKKwkgIEZvciBoZWxwIGFib3V0IGhvdyB0byB3aXJlIHlvdXIgTENEIHRvIHRoZSBwYXJhbGxlbCBwb3J0LAorCSAgY2hlY2sgRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGIKKworCSAgRGVwZW5kcyBvbiB0aGUgeDg2IGFyY2ggYW5kIHRoZSBmcmFtZWJ1ZmZlciBzdXBwb3J0LgorCisJICBUaGUgTENEIGZyYW1lYnVmZmVyIGRyaXZlciBjYW4gYmUgYXR0YWNoZWQgdG8gYSBjb25zb2xlLgorCSAgSXQgd2lsbCB3b3JrIGZpbmUuIEhvd2V2ZXIsIHlvdSBjYW4ndCBhdHRhY2ggaXQgdG8gdGhlIGZiZGV2IGRyaXZlcgorCSAgb2YgdGhlIHhvcmcgc2VydmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6CisJICB0aGUgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBjZmFnMTI4NjRiIGFuZCBjZmFnMTI4NjRiZmIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDRkFHMTI4NjRCX1JBVEUKKyAgICAgICBpbnQgIlJlZnJlc2ggcmF0ZSAoaGVydHopIgorCWRlcGVuZHMgb24gQ0ZBRzEyODY0QgorCWRlZmF1bHQgIjIwIgorCS0tLWhlbHAtLS0KKwkgIFJlZnJlc2ggcmF0ZSBvZiB0aGUgTENELgorCisJICBBcyB0aGUgTENEIGlzIG5vdCBtZW1vcnkgbWFwcGVkLCB0aGUgZHJpdmVyIGhhcyB0byBtYWtlIHRoZSB3b3JrIGJ5CisJICBzb2Z0d2FyZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgc2V0dGluZyB0aGlzIHZhbHVlIGhpZ2hlci4KKwkgIElmIHlvdXIgQ1BVcyBhcmUgcmVhbGx5IHNsb3cgb3IgeW91IGZlZWwgdGhlIHN5c3RlbSBpcyBzbG93ZWQgZG93biwKKwkgIGRlY3JlYXNlIHRoZSB2YWx1ZS4KKworCSAgQmUgY2FyZWZ1bCBtb2RpZnlpbmcgdGhpcyB2YWx1ZSB0byBhIHZlcnkgaGlnaCB2YWx1ZToKKwkgIFlvdSBjYW4gZnJlZXplIHRoZSBjb21wdXRlciwgb3IgdGhlIExDRCBtYXliZSBjYW4ndCBkcmF3IGFzIGZhc3QgYXMgeW91CisJICBhcmUgcmVxdWVzdGluZy4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBJJ20gdGFsa2luZyBhYm91dCwgaWdub3JlIGl0LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoaXMKKwkgIHZhbHVlIHVzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVycy4KK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXV4ZGlzcGxheS9NYWtlZmlsZSBiL2RyaXZlcnMvYXV4ZGlzcGxheS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg5MzZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBhdXhpbGlhcnkgZGlzcGxheXMgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19LUzAxMDgpCQkrPSBrczAxMDgubworb2JqLSQoQ09ORklHX0NGQUcxMjg2NEIpCSs9IGNmYWcxMjg2NGIubyBjZmFnMTI4NjRiZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXhkaXNwbGF5L2NmYWcxMjg2NGIuYyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9jZmFnMTI4NjRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5NTgzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9jZmFnMTI4NjRiLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiAgICBGaWxlbmFtZTogY2ZhZzEyODY0Yi5jCisgKiAgICAgVmVyc2lvbjogMC4xLjAKKyAqIERlc2NyaXB0aW9uOiBjZmFnMTI4NjRiIExDRCBkcml2ZXIKKyAqICAgICBMaWNlbnNlOiBHUEx2MgorICogICAgIERlcGVuZHM6IGtzMDEwOAorICoKKyAqICAgICAgQXV0aG9yOiBDb3B5cmlnaHQgKEMpIE1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+CisgKiAgICAgICAgRGF0ZTogMjAwNi0xMC0zMQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tzMDEwOC5oPgorI2luY2x1ZGUgPGxpbnV4L2NmYWcxMjg2NGIuaD4KKworCisjZGVmaW5lIENGQUcxMjg2NEJfTkFNRSAiY2ZhZzEyODY0YiIKKworLyoKKyAqIE1vZHVsZSBQYXJhbWV0ZXJzCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBjZmFnMTI4NjRiX3JhdGUgPSBDT05GSUdfQ0ZBRzEyODY0Ql9SQVRFOworbW9kdWxlX3BhcmFtKGNmYWcxMjg2NGJfcmF0ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGNmYWcxMjg2NGJfcmF0ZSwKKwkiUmVmcmVzaCByYXRlIChoZXJ0enMpIik7CisKK3Vuc2lnbmVkIGludCBjZmFnMTI4NjRiX2dldHJhdGUodm9pZCkKK3sKKwlyZXR1cm4gY2ZhZzEyODY0Yl9yYXRlOworfQorCisvKgorICogY2ZhZzEyODY0YiBDb21tYW5kcworICoKKyAqCUUgPSBFbmFibGUgc2lnbmFsCisgKgkJRXZlcnl0aW1lIEUgc3dpdGNoIGZyb20gbG93IHRvIGhpZ2gsCisgKgkJY2ZhZzEyODY0Yi9rczAxMDggcmVhZHMgdGhlIGNvbW1hbmQvZGF0YS4KKyAqCisgKglDUzEgPSBGaXJzdCBrczAxMDhjb250cm9sbGVyLgorICoJCUlmIGhpZ2gsIHRoZSBmaXJzdCBrczAxMDggY29udHJvbGxlciByZWNlaXZlcyBjb21tYW5kcy9kYXRhLgorICoKKyAqCUNTMiA9IFNlY29uZCBrczAxMDggY29udHJvbGxlcgorICoJCUlmIGhpZ2gsIHRoZSBzZWNvbmQga3MwMTA4IGNvbnRyb2xsZXIgcmVjZWl2ZXMgY29tbWFuZHMvZGF0YS4KKyAqCisgKglESSA9IERhdGEvSW5zdHJ1Y3Rpb24KKyAqCQlJZiBsb3csIGNmYWcxMjg2NGIgd2lsbCBleHBlY3QgY29tbWFuZHMuCisgKgkJSWYgaGlnaCwgY2ZhZzEyODY0YiB3aWxsIGV4cGVjdCBkYXRhLgorICoKKyAqLworCisjZGVmaW5lIGJpdChuKSAoKCh1bnNpZ25lZCBjaGFyKTEpPDwobikpCisKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9CSVRfRQkoMCkKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9CSVRfQ1MxCSgyKQorI2RlZmluZSBDRkFHMTI4NjRCX0JJVF9DUzIJKDEpCisjZGVmaW5lIENGQUcxMjg2NEJfQklUX0RJCSgzKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjZmFnMTI4NjRiX3N0YXRlOworCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX3NldCh2b2lkKQoreworCWtzMDEwOF93cml0ZWNvbnRyb2woY2ZhZzEyODY0Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfc2V0Yml0KHVuc2lnbmVkIGNoYXIgc3RhdGUsIHVuc2lnbmVkIGNoYXIgbikKK3sKKwlpZiAoc3RhdGUpCisJCWNmYWcxMjg2NGJfc3RhdGUgfD0gYml0KG4pOworCWVsc2UKKwkJY2ZhZzEyODY0Yl9zdGF0ZSAmPSB+Yml0KG4pOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX2UodW5zaWduZWQgY2hhciBzdGF0ZSkKK3sKKwljZmFnMTI4NjRiX3NldGJpdChzdGF0ZSwgQ0ZBRzEyODY0Ql9CSVRfRSk7CisJY2ZhZzEyODY0Yl9zZXQoKTsKK30KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9jczEodW5zaWduZWQgY2hhciBzdGF0ZSkKK3sKKwljZmFnMTI4NjRiX3NldGJpdChzdGF0ZSwgQ0ZBRzEyODY0Ql9CSVRfQ1MxKTsKK30KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9jczIodW5zaWduZWQgY2hhciBzdGF0ZSkKK3sKKwljZmFnMTI4NjRiX3NldGJpdChzdGF0ZSwgQ0ZBRzEyODY0Ql9CSVRfQ1MyKTsKK30KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9kaSh1bnNpZ25lZCBjaGFyIHN0YXRlKQoreworCWNmYWcxMjg2NGJfc2V0Yml0KHN0YXRlLCBDRkFHMTI4NjRCX0JJVF9ESSk7Cit9CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfc2V0Y29udHJvbGxlcnModW5zaWduZWQgY2hhciBmaXJzdCwKKwl1bnNpZ25lZCBjaGFyIHNlY29uZCkKK3sKKwlpZiAoZmlyc3QpCisJCWNmYWcxMjg2NGJfY3MxKDApOworCWVsc2UKKwkJY2ZhZzEyODY0Yl9jczEoMSk7CisKKwlpZiAoc2Vjb25kKQorCQljZmFnMTI4NjRiX2NzMigwKTsKKwllbHNlCisJCWNmYWcxMjg2NGJfY3MyKDEpOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX2NvbnRyb2xsZXIodW5zaWduZWQgY2hhciB3aGljaCkKK3sKKwlpZiAod2hpY2ggPT0gMCkKKwkJY2ZhZzEyODY0Yl9zZXRjb250cm9sbGVycygxLCAwKTsKKwllbHNlIGlmICh3aGljaCA9PSAxKQorCQljZmFnMTI4NjRiX3NldGNvbnRyb2xsZXJzKDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX2Rpc3BsYXlzdGF0ZSh1bnNpZ25lZCBjaGFyIHN0YXRlKQoreworCWNmYWcxMjg2NGJfZGkoMCk7CisJY2ZhZzEyODY0Yl9lKDEpOworCWtzMDEwOF9kaXNwbGF5c3RhdGUoc3RhdGUpOworCWNmYWcxMjg2NGJfZSgwKTsKK30KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9hZGRyZXNzKHVuc2lnbmVkIGNoYXIgYWRkcmVzcykKK3sKKwljZmFnMTI4NjRiX2RpKDApOworCWNmYWcxMjg2NGJfZSgxKTsKKwlrczAxMDhfYWRkcmVzcyhhZGRyZXNzKTsKKwljZmFnMTI4NjRiX2UoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfcGFnZSh1bnNpZ25lZCBjaGFyIHBhZ2UpCit7CisJY2ZhZzEyODY0Yl9kaSgwKTsKKwljZmFnMTI4NjRiX2UoMSk7CisJa3MwMTA4X3BhZ2UocGFnZSk7CisJY2ZhZzEyODY0Yl9lKDApOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX3N0YXJ0bGluZSh1bnNpZ25lZCBjaGFyIHN0YXJ0bGluZSkKK3sKKwljZmFnMTI4NjRiX2RpKDApOworCWNmYWcxMjg2NGJfZSgxKTsKKwlrczAxMDhfc3RhcnRsaW5lKHN0YXJ0bGluZSk7CisJY2ZhZzEyODY0Yl9lKDApOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX3dyaXRlYnl0ZSh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJY2ZhZzEyODY0Yl9kaSgxKTsKKwljZmFnMTI4NjRiX2UoMSk7CisJa3MwMTA4X3dyaXRlZGF0YShieXRlKTsKKwljZmFnMTI4NjRiX2UoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfbm9wKHZvaWQpCit7CisJY2ZhZzEyODY0Yl9zdGFydGxpbmUoMCk7Cit9CisKKy8qCisgKiBjZmFnMTI4NjRiIEludGVybmFsIENvbW1hbmRzCisgKi8KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9vbih2b2lkKQoreworCWNmYWcxMjg2NGJfc2V0Y29udHJvbGxlcnMoMSwgMSk7CisJY2ZhZzEyODY0Yl9kaXNwbGF5c3RhdGUoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfb2ZmKHZvaWQpCit7CisJY2ZhZzEyODY0Yl9zZXRjb250cm9sbGVycygxLCAxKTsKKwljZmFnMTI4NjRiX2Rpc3BsYXlzdGF0ZSgwKTsKK30KKworc3RhdGljIHZvaWQgY2ZhZzEyODY0Yl9jbGVhcih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgaSwgajsKKworCWNmYWcxMjg2NGJfc2V0Y29udHJvbGxlcnMoMSwgMSk7CisJZm9yIChpID0gMDsgaSA8IENGQUcxMjg2NEJfUEFHRVM7IGkrKykgeworCQljZmFnMTI4NjRiX3BhZ2UoaSk7CisJCWNmYWcxMjg2NGJfYWRkcmVzcygwKTsKKwkJZm9yIChqID0gMDsgaiA8IENGQUcxMjg2NEJfQUREUkVTU0VTOyBqKyspCisJCQljZmFnMTI4NjRiX3dyaXRlYnl0ZSgwKTsKKwl9Cit9CisKKy8qCisgKiBVcGRhdGUgd29yaworICovCisKK3Vuc2lnbmVkIGNoYXIgKmNmYWcxMjg2NGJfYnVmZmVyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNmYWcxMjg2NGJfY2FjaGU7CitzdGF0aWMgREVGSU5FX01VVEVYKGNmYWcxMjg2NGJfbXV0ZXgpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZhZzEyODY0Yl91cGRhdGluZzsKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGVsYXllZF93b3JrKTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY2ZhZzEyODY0Yl93b3JrcXVldWU7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoY2ZhZzEyODY0Yl93b3JrLCBjZmFnMTI4NjRiX3VwZGF0ZSk7CisKK3N0YXRpYyB2b2lkIGNmYWcxMjg2NGJfcXVldWUodm9pZCkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoY2ZhZzEyODY0Yl93b3JrcXVldWUsICZjZmFnMTI4NjRiX3dvcmssCisJCUhaIC8gY2ZhZzEyODY0Yl9yYXRlKTsKK30KKwordW5zaWduZWQgY2hhciBjZmFnMTI4NjRiX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmV0OworCisJbXV0ZXhfbG9jaygmY2ZhZzEyODY0Yl9tdXRleCk7CisKKwlpZiAoIWNmYWcxMjg2NGJfdXBkYXRpbmcpIHsKKwkJY2ZhZzEyODY0Yl91cGRhdGluZyA9IDE7CisJCWNmYWcxMjg2NGJfcXVldWUoKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJcmV0ID0gMTsKKworCW11dGV4X3VubG9jaygmY2ZhZzEyODY0Yl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNmYWcxMjg2NGJfZGlzYWJsZSh2b2lkKQoreworCW11dGV4X2xvY2soJmNmYWcxMjg2NGJfbXV0ZXgpOworCisJaWYgKGNmYWcxMjg2NGJfdXBkYXRpbmcpIHsKKwkJY2ZhZzEyODY0Yl91cGRhdGluZyA9IDA7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNmYWcxMjg2NGJfd29yayk7CisJCWZsdXNoX3dvcmtxdWV1ZShjZmFnMTI4NjRiX3dvcmtxdWV1ZSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjZmFnMTI4NjRiX211dGV4KTsKK30KKwordW5zaWduZWQgY2hhciBjZmFnMTI4NjRiX2lzZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBjZmFnMTI4NjRiX3VwZGF0aW5nOworfQorCitzdGF0aWMgdm9pZCBjZmFnMTI4NjRiX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIHNob3J0IGksIGosIGssIGI7CisKKwlpZiAobWVtY21wKGNmYWcxMjg2NGJfY2FjaGUsIGNmYWcxMjg2NGJfYnVmZmVyLCBDRkFHMTI4NjRCX1NJWkUpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDRkFHMTI4NjRCX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWNmYWcxMjg2NGJfY29udHJvbGxlcihpKTsKKwkJCWNmYWcxMjg2NGJfbm9wKCk7CisJCQlmb3IgKGogPSAwOyBqIDwgQ0ZBRzEyODY0Ql9QQUdFUzsgaisrKSB7CisJCQkJY2ZhZzEyODY0Yl9wYWdlKGopOworCQkJCWNmYWcxMjg2NGJfbm9wKCk7CisJCQkJY2ZhZzEyODY0Yl9hZGRyZXNzKDApOworCQkJCWNmYWcxMjg2NGJfbm9wKCk7CisJCQkJZm9yIChrID0gMDsgayA8IENGQUcxMjg2NEJfQUREUkVTU0VTOyBrKyspIHsKKwkJCQkJZm9yIChjID0gMCwgYiA9IDA7IGIgPCA4OyBiKyspCisJCQkJCQlpZiAoY2ZhZzEyODY0Yl9idWZmZXIKKwkJCQkJCQlbaSAqIENGQUcxMjg2NEJfQUREUkVTU0VTIC8gOAorCQkJCQkJCSsgayAvIDggKyAoaiAqIDggKyBiKSAqCisJCQkJCQkJQ0ZBRzEyODY0Ql9XSURUSCAvIDhdCisJCQkJCQkJJiBiaXQoayAlIDgpKQorCQkJCQkJCWMgfD0gYml0KGIpOworCQkJCQljZmFnMTI4NjRiX3dyaXRlYnl0ZShjKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQltZW1jcHkoY2ZhZzEyODY0Yl9jYWNoZSwgY2ZhZzEyODY0Yl9idWZmZXIsIENGQUcxMjg2NEJfU0laRSk7CisJfQorCisJaWYgKGNmYWcxMjg2NGJfdXBkYXRpbmcpCisJCWNmYWcxMjg2NGJfcXVldWUoKTsKK30KKworLyoKKyAqIGNmYWcxMjg2NGIgRXhwb3J0ZWQgU3ltYm9scworICovCisKK0VYUE9SVF9TWU1CT0xfR1BMKGNmYWcxMjg2NGJfYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNmYWcxMjg2NGJfZ2V0cmF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChjZmFnMTI4NjRiX2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChjZmFnMTI4NjRiX2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTF9HUEwoY2ZhZzEyODY0Yl9pc2VuYWJsZWQpOworCisvKgorICogTW9kdWxlIEluaXQgJiBFeGl0CisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2ZhZzEyODY0Yl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoUEFHRV9TSVpFIDwgQ0ZBRzEyODY0Ql9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiBDRkFHMTI4NjRCX05BTUUgIjogRVJST1I6ICIKKwkJCSJwYWdlIHNpemUgKCVpKSA8IGNmYWcxMjg2NGIgc2l6ZSAoJWkpXG4iLAorCQkJKHVuc2lnbmVkIGludClQQUdFX1NJWkUsIENGQUcxMjg2NEJfU0laRSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbm9uZTsKKwl9CisKKwljZmFnMTI4NjRiX2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoY2ZhZzEyODY0Yl9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgQ0ZBRzEyODY0Ql9OQU1FICI6IEVSUk9SOiAiCisJCQkiY2FuJ3QgZ2V0IGEgZnJlZSBwYWdlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBub25lOworCX0KKworCWNmYWcxMjg2NGJfY2FjaGUgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqCisJCUNGQUcxMjg2NEJfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNmYWcxMjg2NGJfYnVmZmVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIENGQUcxMjg2NEJfTkFNRSAiOiBFUlJPUjogIgorCQkJImNhbid0IGFsbG9jIGNhY2hlIGJ1ZmZlciAoJWkgYnl0ZXMpXG4iLAorCQkJQ0ZBRzEyODY0Ql9TSVpFKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBidWZmZXJhbGxvY2VkOworCX0KKworCWNmYWcxMjg2NGJfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoQ0ZBRzEyODY0Ql9OQU1FKTsKKwlpZiAoY2ZhZzEyODY0Yl93b3JrcXVldWUgPT0gTlVMTCkKKwkJZ290byBjYWNoZWFsbG9jZWQ7CisKKwltZW1zZXQoY2ZhZzEyODY0Yl9idWZmZXIsIDAsIENGQUcxMjg2NEJfU0laRSk7CisKKwljZmFnMTI4NjRiX2NsZWFyKCk7CisJY2ZhZzEyODY0Yl9vbigpOworCisJcmV0dXJuIDA7CisKK2NhY2hlYWxsb2NlZDoKKwlrZnJlZShjZmFnMTI4NjRiX2NhY2hlKTsKKworYnVmZmVyYWxsb2NlZDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNmYWcxMjg2NGJfYnVmZmVyKTsKKworbm9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2ZhZzEyODY0Yl9leGl0KHZvaWQpCit7CisJY2ZhZzEyODY0Yl9kaXNhYmxlKCk7CisJY2ZhZzEyODY0Yl9vZmYoKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjZmFnMTI4NjRiX3dvcmtxdWV1ZSk7CisJa2ZyZWUoY2ZhZzEyODY0Yl9jYWNoZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjZmFnMTI4NjRiX2J1ZmZlcik7Cit9CisKK21vZHVsZV9pbml0KGNmYWcxMjg2NGJfaW5pdCk7Cittb2R1bGVfZXhpdChjZmFnMTI4NjRiX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJNaWd1ZWwgT2plZGEgU2FuZG9uaXMgPG1heGV4dHJlbWVAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJjZmFnMTI4NjRiIExDRCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXV4ZGlzcGxheS9jZmFnMTI4NjRiZmIuYyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9jZmFnMTI4NjRiZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc2NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L2NmYWcxMjg2NGJmYi5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogICAgRmlsZW5hbWU6IGNmYWcxMjg2NGJmYi5jCisgKiAgICAgVmVyc2lvbjogMC4xLjAKKyAqIERlc2NyaXB0aW9uOiBjZmFnMTI4NjRiIExDRCBmcmFtZWJ1ZmZlciBkcml2ZXIKKyAqICAgICBMaWNlbnNlOiBHUEx2MgorICogICAgIERlcGVuZHM6IGNmYWcxMjg2NGIKKyAqCisgKiAgICAgIEF1dGhvcjogQ29weXJpZ2h0IChDKSBNaWd1ZWwgT2plZGEgU2FuZG9uaXMgPG1heGV4dHJlbWVAZ21haWwuY29tPgorICogICAgICAgIERhdGU6IDIwMDYtMTAtMzEKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jZmFnMTI4NjRiLmg+CisKKyNkZWZpbmUgQ0ZBRzEyODY0QkZCX05BTUUgImNmYWcxMjg2NGJmYiIKKworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBjZmFnMTI4NjRiZmJfZml4IF9faW5pdGRhdGEgPSB7CisJLmlkID0gImNmYWcxMjg2NGIiLAorCS50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAorCS52aXN1YWwgPSBGQl9WSVNVQUxfTU9OTzEwLAorCS54cGFuc3RlcCA9IDAsCisJLnlwYW5zdGVwID0gMCwKKwkueXdyYXBzdGVwID0gMCwKKwkubGluZV9sZW5ndGggPSBDRkFHMTI4NjRCX1dJRFRIIC8gOCwKKwkuYWNjZWwgPSBGQl9BQ0NFTF9OT05FLAorfTsKKworc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBjZmFnMTI4NjRiZmJfdmFyIF9faW5pdGRhdGEgPSB7CisJLnhyZXMgPSBDRkFHMTI4NjRCX1dJRFRILAorCS55cmVzID0gQ0ZBRzEyODY0Ql9IRUlHSFQsCisJLnhyZXNfdmlydHVhbCA9IENGQUcxMjg2NEJfV0lEVEgsCisJLnlyZXNfdmlydHVhbCA9IENGQUcxMjg2NEJfSEVJR0hULAorCS5iaXRzX3Blcl9waXhlbCA9IDEsCisJLnJlZCA9IHsgMCwgMSwgMCB9LAorICAgICAgCS5ncmVlbiA9IHsgMCwgMSwgMCB9LAorICAgICAgCS5ibHVlID0geyAwLCAxLCAwIH0sCisJLmxlZnRfbWFyZ2luID0gMCwKKwkucmlnaHRfbWFyZ2luID0gMCwKKwkudXBwZXJfbWFyZ2luID0gMCwKKwkubG93ZXJfbWFyZ2luID0gMCwKKwkudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorfTsKKworc3RhdGljIGludCBjZmFnMTI4NjRiZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHZtX2luc2VydF9wYWdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJdmlydF90b19wYWdlKGNmYWcxMjg2NGJfYnVmZmVyKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGNmYWcxMjg2NGJmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2ZpbGxyZWN0ID0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYSA9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0ID0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfbW1hcCA9IGNmYWcxMjg2NGJmYl9tbWFwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2ZhZzEyODY0YmZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKyAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCAmZGV2aWNlLT5kZXYpOworCisJaWYgKCFpbmZvKQorCQlnb3RvIG5vbmU7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9faW9tZW0gKikgY2ZhZzEyODY0Yl9idWZmZXI7CisJaW5mby0+c2NyZWVuX3NpemUgPSBDRkFHMTI4NjRCX1NJWkU7CisJaW5mby0+ZmJvcHMgPSAmY2ZhZzEyODY0YmZiX29wczsKKwlpbmZvLT5maXggPSBjZmFnMTI4NjRiZmJfZml4OworCWluZm8tPnZhciA9IGNmYWcxMjg2NGJmYl92YXI7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBOVUxMOworCWluZm8tPnBhciA9IE5VTEw7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkKKwkJZ290byBmYmFsbG9jZWQ7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZpY2UsIGluZm8pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwgaW5mby0+bm9kZSwKKwkJaW5mby0+Zml4LmlkKTsKKworCXJldHVybiAwOworCitmYmFsbG9jZWQ6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKworbm9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNmYWcxMjg2NGJmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWlmIChpbmZvKSB7CisJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNmYWcxMjg2NGJmYl9kcml2ZXIgPSB7CisJLnByb2JlCT0gY2ZhZzEyODY0YmZiX3Byb2JlLAorCS5yZW1vdmUgPSBjZmFnMTI4NjRiZmJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gQ0ZBRzEyODY0QkZCX05BTUUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjZmFnMTI4NjRiZmJfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBjZmFnMTI4NjRiZmJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoY2ZhZzEyODY0Yl9lbmFibGUoKSkgeworCQlwcmludGsoS0VSTl9FUlIgQ0ZBRzEyODY0QkZCX05BTUUgIjogRVJST1I6ICIKKwkJCSJjYW4ndCBlbmFibGUgY2ZhZzEyODY0YiByZWZyZXNoaW5nIChiZWluZyB1c2VkKVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2ZhZzEyODY0YmZiX2RyaXZlcik7CisKKwlpZiAoIXJldCkgeworCQljZmFnMTI4NjRiZmJfZGV2aWNlID0KKwkJCXBsYXRmb3JtX2RldmljZV9hbGxvYyhDRkFHMTI4NjRCRkJfTkFNRSwgMCk7CisKKwkJaWYgKGNmYWcxMjg2NGJmYl9kZXZpY2UpCisJCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGNmYWcxMjg2NGJmYl9kZXZpY2UpOworCQllbHNlCisJCQlyZXQgPSAtRU5PTUVNOworCisJCWlmIChyZXQpIHsKKwkJCXBsYXRmb3JtX2RldmljZV9wdXQoY2ZhZzEyODY0YmZiX2RldmljZSk7CisJCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2ZhZzEyODY0YmZiX2RyaXZlcik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2ZhZzEyODY0YmZiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihjZmFnMTI4NjRiZmJfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2ZhZzEyODY0YmZiX2RyaXZlcik7CisJY2ZhZzEyODY0Yl9kaXNhYmxlKCk7Cit9CisKK21vZHVsZV9pbml0KGNmYWcxMjg2NGJmYl9pbml0KTsKK21vZHVsZV9leGl0KGNmYWcxMjg2NGJmYl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiTWlndWVsIE9qZWRhIFNhbmRvbmlzIDxtYXhleHRyZW1lQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiY2ZhZzEyODY0YiBMQ0QgZnJhbWVidWZmZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1eGRpc3BsYXkva3MwMTA4LmMgYi9kcml2ZXJzL2F1eGRpc3BsYXkva3MwMTA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzNzU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9rczAxMDguYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqICAgIEZpbGVuYW1lOiBrczAxMDguYworICogICAgIFZlcnNpb246IDAuMS4wCisgKiBEZXNjcmlwdGlvbjoga3MwMTA4IExDRCBDb250cm9sbGVyIGRyaXZlcgorICogICAgIExpY2Vuc2U6IEdQTHYyCisgKiAgICAgRGVwZW5kczogcGFycG9ydAorICoKKyAqICAgICAgQXV0aG9yOiBDb3B5cmlnaHQgKEMpIE1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+CisgKiAgICAgICAgRGF0ZTogMjAwNi0xMC0zMQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9rczAxMDguaD4KKworI2RlZmluZSBLUzAxMDhfTkFNRSAia3MwMTA4IgorCisvKgorICogTW9kdWxlIFBhcmFtZXRlcnMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGtzMDEwOF9wb3J0ID0gQ09ORklHX0tTMDEwOF9QT1JUOworbW9kdWxlX3BhcmFtKGtzMDEwOF9wb3J0LCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moa3MwMTA4X3BvcnQsICJQYXJhbGxlbCBwb3J0IHdoZXJlIHRoZSBMQ0QgaXMgY29ubmVjdGVkIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga3MwMTA4X2RlbGF5ID0gQ09ORklHX0tTMDEwOF9ERUxBWTsKK21vZHVsZV9wYXJhbShrczAxMDhfZGVsYXksIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhrczAxMDhfZGVsYXksICJEZWxheSBiZXR3ZWVuIGVhY2ggY29udHJvbCB3cml0aW5nIChtaWNyb3NlY29uZHMpIik7CisKKy8qCisgKiBEZXZpY2UKKyAqLworCitzdGF0aWMgc3RydWN0IHBhcnBvcnQgKmtzMDEwOF9wYXJwb3J0Oworc3RhdGljIHN0cnVjdCBwYXJkZXZpY2UgKmtzMDEwOF9wYXJkZXZpY2U7CisKKy8qCisgKiBrczAxMDggRXhwb3J0ZWQgQ29tbWFuZHMgKGRvbid0IGxvY2spCisgKgorICogICBZb3UgX3Nob3VsZF8gbG9jayBpbiB0aGUgdG9wIGRyaXZlcjogVGhpcyBmdW5jdGlvbnMgX3Nob3VsZCBub3RfCisgKiAgIGdldCByYWNlIGNvbmRpdGlvbnMgaW4gYW55IHdheS4gTG9ja2luZyBmb3IgZWFjaCBieXRlIGhlcmUgd291bGQgYmUKKyAqICAgc28gc2xvdyBhbmQgdXNlbGVzcy4KKyAqCisgKiAgIFRoZXJlIGFyZSBub3QgYml0IGRlZmluaXRpb25zIGJlY2F1c2UgdGhleSBhcmUgbm90IGZsYWdzLAorICogICBqdXN0IGFyYml0cmFyeSBjb21iaW5hdGlvbnMgZGVmaW5lZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaAorICogICBmdW5jdGlvbiBpbiB0aGUga3MwMTA4IExDRCBjb250cm9sbGVyLiBJZiB5b3Ugd2FudCB0byBrbm93IHdoYXQgbWVhbnMKKyAqICAgYSBzcGVjaWZpYyBjb21iaW5hdGlvbiwgbG9vayBhdCB0aGUgZnVuY3Rpb24ncyBuYW1lLgorICoKKyAqICAgVGhlIGtzMDEwOF93cml0ZWNvbnRyb2wgYml0cyBuZWVkIHRvIGJlIHJldmVydGVkIF4oMCwxLDMpIGJlY2F1c2UKKyAqICAgdGhlIHBhcmFsbGVsIHBvcnQgYWxzbyByZXZlcnQgdGhlbSB1c2luZyBhICJub3QiIGxvZ2ljIGdhdGUuCisgKi8KKworI2RlZmluZSBiaXQobikgKCgodW5zaWduZWQgY2hhcikxKTw8KG4pKQorCit2b2lkIGtzMDEwOF93cml0ZWRhdGEodW5zaWduZWQgY2hhciBieXRlKQoreworCXBhcnBvcnRfd3JpdGVfZGF0YShrczAxMDhfcGFycG9ydCwgYnl0ZSk7Cit9CisKK3ZvaWQga3MwMTA4X3dyaXRlY29udHJvbCh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJdWRlbGF5KGtzMDEwOF9kZWxheSk7CisJcGFycG9ydF93cml0ZV9jb250cm9sKGtzMDEwOF9wYXJwb3J0LCBieXRlIF4gKGJpdCgwKSB8IGJpdCgxKSB8IGJpdCgzKSkpOworfQorCit2b2lkIGtzMDEwOF9kaXNwbGF5c3RhdGUodW5zaWduZWQgY2hhciBzdGF0ZSkKK3sKKwlrczAxMDhfd3JpdGVkYXRhKChzdGF0ZSA/IGJpdCgwKSA6IDApIHwgYml0KDEpIHwgYml0KDIpIHwgYml0KDMpIHwgYml0KDQpIHwgYml0KDUpKTsKK30KKwordm9pZCBrczAxMDhfc3RhcnRsaW5lKHVuc2lnbmVkIGNoYXIgc3RhcnRsaW5lKQoreworCWtzMDEwOF93cml0ZWRhdGEobWluKHN0YXJ0bGluZSwodW5zaWduZWQgY2hhcik2MykgfCBiaXQoNikgfCBiaXQoNykpOworfQorCit2b2lkIGtzMDEwOF9hZGRyZXNzKHVuc2lnbmVkIGNoYXIgYWRkcmVzcykKK3sKKwlrczAxMDhfd3JpdGVkYXRhKG1pbihhZGRyZXNzLCh1bnNpZ25lZCBjaGFyKTYzKSB8IGJpdCg2KSk7Cit9CisKK3ZvaWQga3MwMTA4X3BhZ2UodW5zaWduZWQgY2hhciBwYWdlKQoreworCWtzMDEwOF93cml0ZWRhdGEobWluKHBhZ2UsKHVuc2lnbmVkIGNoYXIpNykgfCBiaXQoMykgfCBiaXQoNCkgfCBiaXQoNSkgfCBiaXQoNykpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChrczAxMDhfd3JpdGVkYXRhKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtzMDEwOF93cml0ZWNvbnRyb2wpOworRVhQT1JUX1NZTUJPTF9HUEwoa3MwMTA4X2Rpc3BsYXlzdGF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChrczAxMDhfc3RhcnRsaW5lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtzMDEwOF9hZGRyZXNzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtzMDEwOF9wYWdlKTsKKworLyoKKyAqIE1vZHVsZSBJbml0ICYgRXhpdAorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGtzMDEwOF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWtzMDEwOF9wYXJwb3J0ID0gcGFycG9ydF9maW5kX2Jhc2Uoa3MwMTA4X3BvcnQpOworCWlmIChrczAxMDhfcGFycG9ydCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBLUzAxMDhfTkFNRSAiOiBFUlJPUjogIgorCQkJInBhcnBvcnQgZGlkbid0IGZpbmQgJWkgcG9ydFxuIiwga3MwMTA4X3BvcnQpOworCQlnb3RvIG5vbmU7CisJfQorCisJa3MwMTA4X3BhcmRldmljZSA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKGtzMDEwOF9wYXJwb3J0LCBLUzAxMDhfTkFNRSwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgUEFSUE9SVF9ERVZfRVhDTCwgTlVMTCk7CisJaWYgKGtzMDEwOF9wYXJkZXZpY2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgS1MwMTA4X05BTUUgIjogRVJST1I6ICIKKwkJCSJwYXJwb3J0IGRpZG4ndCByZWdpc3RlciBuZXcgZGV2aWNlXG4iKTsKKwkJZ290byBub25lOworCX0KKworCXJlc3VsdCA9IHBhcnBvcnRfY2xhaW0oa3MwMTA4X3BhcmRldmljZSk7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBLUzAxMDhfTkFNRSAiOiBFUlJPUjogIgorCQkJImNhbid0IGNsYWltICVpIHBhcnBvcnQsIG1heWJlIGluIHVzZVxuIiwga3MwMTA4X3BvcnQpOworCQlyZXQgPSByZXN1bHQ7CisJCWdvdG8gcmVnaXN0ZXJlZDsKKwl9CisKKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJlZDoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGtzMDEwOF9wYXJkZXZpY2UpOworCitub25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrczAxMDhfZXhpdCh2b2lkKQoreworCXBhcnBvcnRfcmVsZWFzZShrczAxMDhfcGFyZGV2aWNlKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGtzMDEwOF9wYXJkZXZpY2UpOworfQorCittb2R1bGVfaW5pdChrczAxMDhfaW5pdCk7Cittb2R1bGVfZXhpdChrczAxMDhfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIk1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImtzMDEwOCBMQ0QgQ29udHJvbGxlciBkcml2ZXIiKTsKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZmFnMTI4NjRiLmggYi9pbmNsdWRlL2xpbnV4L2NmYWcxMjg2NGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM0NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jZmFnMTI4NjRiLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqICAgIEZpbGVuYW1lOiBjZmFnMTI4NjRiLmgKKyAqICAgICBWZXJzaW9uOiAwLjEuMAorICogRGVzY3JpcHRpb246IGNmYWcxMjg2NGIgTENEIGRyaXZlciBoZWFkZXIKKyAqICAgICBMaWNlbnNlOiBHUEx2MgorICoKKyAqICAgICAgQXV0aG9yOiBDb3B5cmlnaHQgKEMpIE1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+CisgKiAgICAgICAgRGF0ZTogMjAwNi0xMC0xMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0NGQUcxMjg2NEJfSF8KKyNkZWZpbmUgX0NGQUcxMjg2NEJfSF8KKworI2RlZmluZSBDRkFHMTI4NjRCX1dJRFRICSgxMjgpCisjZGVmaW5lIENGQUcxMjg2NEJfSEVJR0hUCSg2NCkKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9DT05UUk9MTEVSUwkoMikKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9QQUdFUwkoOCkKKyNkZWZpbmUgQ0ZBRzEyODY0Ql9BRERSRVNTRVMJKDY0KQorI2RlZmluZSBDRkFHMTI4NjRCX1NJWkUJCSgoQ0ZBRzEyODY0Ql9DT05UUk9MTEVSUykgKiBcCisJCQkJKENGQUcxMjg2NEJfUEFHRVMpICogXAorCQkJCShDRkFHMTI4NjRCX0FERFJFU1NFUykpCisKKy8qCisgKiBUaGUgZHJpdmVyIHdpbGwgYmxpdCB0aGlzIGJ1ZmZlciB0byB0aGUgTENECisgKgorICogSXRzIHNpemUgaXMgQ0ZBRzEyODY0Ql9TSVpFLgorICovCitleHRlcm4gdW5zaWduZWQgY2hhciAqIGNmYWcxMjg2NGJfYnVmZmVyOworCisvKgorICogR2V0IHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIExDRAorICoKKyAqIFJldHVybnMgdGhlIHJlZnJlc2ggcmF0ZSAoaGVydHpzKS4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBjZmFnMTI4NjRiX2dldHJhdGUodm9pZCk7CisKKy8qCisgKiBFbmFibGUgcmVmcmVzaGluZworICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsIChhbnlvbmUgd2FzIHVzaW5nIGl0KSwKKyAqIG9yICE9IDAgaWYgZmFpbGVkIChzb21lb25lIGlzIHVzaW5nIGl0KS4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2ZhZzEyODY0Yl9lbmFibGUodm9pZCk7CisKKy8qCisgKiBEaXNhYmxlIHJlZnJlc2hpbmcKKyAqCisgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBvbmx5IHdoZW4geW91IGZpbmlzaCB1c2luZyB0aGUgTENELgorICovCitleHRlcm4gdm9pZCBjZmFnMTI4NjRiX2Rpc2FibGUodm9pZCk7CisKKy8qCisgKiBJcyBlbmFibGVkIHJlZnJlc2hpbmc/IChpcyBhbnlvbmUgdXNpbmcgdGhlIG1vZHVsZT8pCisgKgorICogUmV0dXJucyAwIGlmIHJlZnJlc2hpbmcgaXMgbm90IGVuYWJsZWQgKGFueW9uZSBpcyB1c2luZyBpdCksCisgKiBvciAhPSAwIGlmIHJlZnJlc2hpbmcgaXMgZW5hYmxlZCAoc29tZW9uZSBpcyB1c2luZyBpdCkuCisgKgorICogVXNlZnVsIGZvciBidWZmZXIgcmVhZC1vbmx5IG1vZHVsZXMuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNmYWcxMjg2NGJfaXNlbmFibGVkKHZvaWQpOworCisjZW5kaWYgLyogX0NGQUcxMjg2NEJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rczAxMDguaCBiL2luY2x1ZGUvbGludXgva3MwMTA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0N2Q0YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgva3MwMTA4LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICAgIEZpbGVuYW1lOiBrczAxMDguaAorICogICAgIFZlcnNpb246IDAuMS4wCisgKiBEZXNjcmlwdGlvbjoga3MwMTA4IExDRCBDb250cm9sbGVyIGRyaXZlciBoZWFkZXIKKyAqICAgICBMaWNlbnNlOiBHUEx2MgorICoKKyAqICAgICAgQXV0aG9yOiBDb3B5cmlnaHQgKEMpIE1pZ3VlbCBPamVkYSBTYW5kb25pcyA8bWF4ZXh0cmVtZUBnbWFpbC5jb20+CisgKiAgICAgICAgRGF0ZTogMjAwNi0xMC0zMQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0tTMDEwOF9IXworI2RlZmluZSBfS1MwMTA4X0hfCisKKy8qIFdyaXRlIGEgYnl0ZSB0byB0aGUgZGF0YSBwb3J0ICovCitleHRlcm4gdm9pZCBrczAxMDhfd3JpdGVkYXRhKHVuc2lnbmVkIGNoYXIgYnl0ZSk7CisKKy8qIFdyaXRlIGEgYnl0ZSB0byB0aGUgY29udHJvbCBwb3J0ICovCitleHRlcm4gdm9pZCBrczAxMDhfd3JpdGVjb250cm9sKHVuc2lnbmVkIGNoYXIgYnl0ZSk7CisKKy8qIFNldCB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgZGlzcGxheSBzdGF0ZSAoMC4uMSkgKi8KK2V4dGVybiB2b2lkIGtzMDEwOF9kaXNwbGF5c3RhdGUodW5zaWduZWQgY2hhciBzdGF0ZSk7CisKKy8qIFNldCB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgc3RhcnRsaW5lICgwLi42MykgKi8KK2V4dGVybiB2b2lkIGtzMDEwOF9zdGFydGxpbmUodW5zaWduZWQgY2hhciBzdGFydGxpbmUpOworCisvKiBTZXQgdGhlIGNvbnRyb2xsZXIncyBjdXJyZW50IGFkZHJlc3MgKDAuLjYzKSAqLworZXh0ZXJuIHZvaWQga3MwMTA4X2FkZHJlc3ModW5zaWduZWQgY2hhciBhZGRyZXNzKTsKKworLyogU2V0IHRoZSBjb250cm9sbGVyJ3MgY3VycmVudCBwYWdlICgwLi43KSAqLworZXh0ZXJuIHZvaWQga3MwMTA4X3BhZ2UodW5zaWduZWQgY2hhciBwYWdlKTsKKworI2VuZGlmIC8qIF9LUzAxMDhfSF8gKi8K