LyoKICogIEFUSSBGcmFtZSBCdWZmZXIgRGV2aWNlIERyaXZlciBDb3JlCiAqCiAqCUNvcHlyaWdodCAoQykgMjAwNCAgQWxleCBLZXJuIDxhbGV4Lmtlcm5AZ214LmRlPgogKglDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCUNvcHlyaWdodCAoQykgMTk5OCAgQmVybmQgSGFycmllcwogKglDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogKgogKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBVEkgZ3JhcGhpY3MgY2hpcHM6CiAqICAgIC0gQVRJIE1hY2g2NAogKgogKiAgVG8gZG86IGFkZCBzdXBwb3J0IGZvcgogKiAgICAtIEFUSSBSYWdlMTI4IChmcm9tIGF0eTEyOGZiLmMpCiAqICAgIC0gQVRJIFJhZGVvbiAoZnJvbSByYWRlb25mYi5jKQogKgogKiAgVGhpcyBkcml2ZXIgaXMgcGFydGx5IGJhc2VkIG9uIHRoZSBQb3dlck1hYyBjb25zb2xlIGRyaXZlcjoKICoKICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCiAqCiAqICBhbmQgb24gdGhlIFBvd2VyTWFjIEFUSS9tYWNoNjQgZGlzcGxheSBkcml2ZXI6CiAqCiAqCUNvcHlyaWdodCAoQykgMTk5NyBNaWNoYWVsIEFLIFRlc2NoCiAqCiAqCSAgICAgIHdpdGggd29yayBieSBKb24gSG93ZWxsCiAqCQkJICAgSGFycnkgQUMgRWF0b24KICoJCQkgICBBbnRob255IFRvbmcgPGF0b25nQHVpdWMuZWR1PgogKgogKiAgR2VuZXJpYyBMQ0Qgc3VwcG9ydCB3cml0dGVuIGJ5IERhbmllbCBNYW50aW9uZSwgcG9ydGVkIGZyb20gMi40LjIwIGJ5IEFsZXggS2VybgogKiAgTWFueSBUaGFua3MgdG8gVmlsbGUgU3lyauRs5CBmb3IgcGF0Y2hlcyBhbmQgZml4aW5nIG5hc3RpbmcgMTYgYml0IGNvbG9yIGJ1Zy4KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogKiAgbW9yZSBkZXRhaWxzLgogKgogKiAgTWFueSB0aGFua3MgdG8gTml0eWEgZnJvbSBBVEkgZGV2cmVsIGZvciBzdXBwb3J0IGFuZCBwYXRpZW5jZSAhCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBUT0RPOgoKICAgIC0gY3Vyc29yIHN1cHBvcnQgb24gYWxsIGNhcmRzIGFuZCBhbGwgcmFtZGFjcy4KICAgIC0gY3Vyc29yIHBhcmFtZXRlcnMgY29udHJvbGFibGUgdmlhIGlvY3RsKClzLgogICAgLSBndWVzcyBQTEwgYW5kIE1DTEsgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBMTCByZWdpc3RlciB2YWx1ZXMgaW5pdGlhbGl6ZWQKICAgICAgYnkgT3BlbiBGaXJtd2FyZSAoaWYgdGhleSBhcmUgaW5pdGlhbGl6ZWQpLiBCSU9TIGlzIGRvbmUKCiAgICAoQW55b25lIHdpdGggTWFjIHRvIGhlbHAgd2l0aCB0aGlzPykKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDx2aWRlby9tYWNoNjQuaD4KI2luY2x1ZGUgImF0eWZiLmgiCiNpbmNsdWRlICJhdGlfaWRzLmgiCgojaWZkZWYgX19wb3dlcnBjX18KI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiNpbmNsdWRlIDxhc20vcHJvbS5oPgojaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KI2luY2x1ZGUgPGFzbS9wYm0uaD4KI2luY2x1ZGUgPGFzbS9mYmlvLmg+CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BREJfUE1VCiNpbmNsdWRlIDxsaW51eC9hZGIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgojZW5kaWYKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiNpbmNsdWRlIDxhc20vYnRleHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTVRSUgojaW5jbHVkZSA8YXNtL210cnIuaD4KI2VuZGlmCgovKgogKiBEZWJ1ZyBmbGFncy4KICovCiN1bmRlZiBERUJVRwovKiNkZWZpbmUgREVCVUcqLwoKLyogTWFrZSBzdXJlIG4gKiBQQUdFX1NJWkUgaXMgcHJvdGVjdGVkIGF0IGVuZCBvZiBBcGVydHVyZSBmb3IgR1VJLXJlZ3MgKi8KLyogIC0gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY2F0Y2ggYWxsIEdVSS1SZWdzICAgKi8KLyogIC0gbXVzdCBiZSBhbGlnbmVkIHRvIGEgUEFHRSBib3VuZGFyeSAgICAgICAgICAgKi8KI2RlZmluZSBHVUlfUkVTRVJWRQkoMSAqIFBBR0VfU0laRSkKCi8qIEZJWE1FOiByZW1vdmUgdGhlIEZBSUwgZGVmaW5pdGlvbiAqLwojZGVmaW5lIEZBSUwobXNnKSBkbyB7IFwKCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCXByaW50ayhLRVJOX0NSSVQgImF0eWZiOiAiIG1zZyAiXG4iKTsgXAoJcmV0dXJuIC1FSU5WQUw7IFwKfSB3aGlsZSAoMCkKI2RlZmluZSBGQUlMX01BWChtc2csIHgsIF9tYXhfKSBkbyB7IFwKCWlmICh4ID4gX21heF8pIHsgXAoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIiAleCgleClcbiIsIHgsIF9tYXhfKTsgXAoJCXJldHVybiAtRUlOVkFMOyBcCgl9IFwKfSB3aGlsZSAoMCkKI2lmZGVmIERFQlVHCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiNlbHNlCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBQUklOVEtJKGZtdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyAiYXR5ZmI6ICIgZm10LCAjIyBhcmdzKQojZGVmaW5lIFBSSU5US0UoZm10LCBhcmdzLi4uKQkgcHJpbnRrKEtFUk5fRVJSICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCgojaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgY29uc3QgdTMyIGx0X2xjZF9yZWdzW10gPSB7CglDT05GSUdfUEFORUxfTEcsCglMQ0RfR0VOX0NOVExfTEcsCglEU1ROX0NPTlRST0xfTEcsCglIRkJfUElUQ0hfQUREUl9MRywKCUhPUlpfU1RSRVRDSElOR19MRywKCVZFUlRfU1RSRVRDSElOR19MRywKCTAsIC8qIEVYVF9WRVJUX1NUUkVUQ0ggKi8KCUxUX0dJT19MRywKCVBPV0VSX01BTkFHRU1FTlRfTEcKfTsKCnZvaWQgYXR5X3N0X2xjZChpbnQgaW5kZXgsIHUzMiB2YWwsIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaWYgKE02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJYXR5X3N0X2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCB2YWwsIHBhcik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIGxvbmcgdGVtcDsKCgkJLyogd3JpdGUgYWRkciBieXRlICovCgkJdGVtcCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQlhdHlfc3RfbGUzMihMQ0RfSU5ERVgsICh0ZW1wICYgfkxDRF9JTkRFWF9NQVNLKSB8IGluZGV4LCBwYXIpOwoJCS8qIHdyaXRlIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCWF0eV9zdF9sZTMyKExDRF9EQVRBLCB2YWwsIHBhcik7Cgl9Cn0KCnUzMiBhdHlfbGRfbGNkKGludCBpbmRleCwgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpZiAoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQlyZXR1cm4gYXR5X2xkX2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCBwYXIpOwoJfSBlbHNlIHsKCQl1bnNpZ25lZCBsb25nIHRlbXA7CgoJCS8qIHdyaXRlIGFkZHIgYnl0ZSAqLwoJCXRlbXAgPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJYXR5X3N0X2xlMzIoTENEX0lOREVYLCAodGVtcCAmIH5MQ0RfSU5ERVhfTUFTSykgfCBpbmRleCwgcGFyKTsKCQkvKiByZWFkIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCXJldHVybiBhdHlfbGRfbGUzMihMQ0RfREFUQSwgcGFyKTsKCX0KfQojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKLyoKICogQVRJUmVkdWNlUmF0aW8gLS0KICoKICogUmVkdWNlIGEgZnJhY3Rpb24gYnkgZmFjdG9yaW5nIG91dCB0aGUgbGFyZ2VzdCBjb21tb24gZGl2aWRlciBvZiB0aGUKICogZnJhY3Rpb24ncyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgogKi8Kc3RhdGljIHZvaWQgQVRJUmVkdWNlUmF0aW8oaW50ICpOdW1lcmF0b3IsIGludCAqRGVub21pbmF0b3IpCnsKICAgIGludCBNdWx0aXBsaWVyLCBEaXZpZGVyLCBSZW1haW5kZXI7CgogICAgTXVsdGlwbGllciA9ICpOdW1lcmF0b3I7CiAgICBEaXZpZGVyID0gKkRlbm9taW5hdG9yOwoKICAgIHdoaWxlICgoUmVtYWluZGVyID0gTXVsdGlwbGllciAlIERpdmlkZXIpKQogICAgewogICAgICAgIE11bHRpcGxpZXIgPSBEaXZpZGVyOwogICAgICAgIERpdmlkZXIgPSBSZW1haW5kZXI7CiAgICB9CgogICAgKk51bWVyYXRvciAvPSBEaXZpZGVyOwogICAgKkRlbm9taW5hdG9yIC89IERpdmlkZXI7Cn0KI2VuZGlmCiAgICAvKgogICAgICogIFRoZSBIYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhcmQKICAgICAqLwoKc3RydWN0IGF0eV9jbWFwX3JlZ3MgewoJdTggd2luZGV4OwoJdTggbHV0OwoJdTggbWFzazsKCXU4IHJpbmRleDsKCXU4IGNudGw7Cn07CgpzdHJ1Y3QgcGNpX21tYXBfbWFwIHsKCXVuc2lnbmVkIGxvbmcgdm9mZjsKCXVuc2lnbmVkIGxvbmcgcG9mZjsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXVuc2lnbmVkIGxvbmcgcHJvdF9mbGFnOwoJdW5zaWduZWQgbG9uZyBwcm90X21hc2s7Cn07CgpzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGF0eWZiX2ZpeCBfX2RldmluaXRkYXRhID0gewoJLmlkCQk9ICJBVFkgTWFjaDY0IiwKCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKCS52aXN1YWwJCT0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAoJLnhwYW5zdGVwCT0gOCwKCS55cGFuc3RlcAk9IDEsCn07CgogICAgLyoKICAgICAqICBGcmFtZSBidWZmZXIgZGV2aWNlIEFQSQogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKTsKc3RhdGljIGludCBhdHlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKI2lmZGVmIF9fc3BhcmNfXwpzdGF0aWMgaW50IGF0eWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKI2VuZGlmCnN0YXRpYyBpbnQgYXR5ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CgogICAgLyoKICAgICAqICBJbnRlcm5hbCByb3V0aW5lcwogICAgICovCgpzdGF0aWMgaW50IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKI2lmZGVmIENPTkZJR19BVEFSSQpzdGF0aWMgaW50IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb3BhciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKTsKI2VuZGlmCgpzdGF0aWMgc3RydWN0IGNydGMgc2F2ZWRfY3J0YzsKc3RhdGljIHVuaW9uIGF0eV9wbGwgc2F2ZWRfcGxsOwpzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CgpzdGF0aWMgdm9pZCBhdHlfc2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CnN0YXRpYyBpbnQgYXR5X3Zhcl90b19jcnRjKGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGNydGMgKmNydGMpOwpzdGF0aWMgaW50IGF0eV9jcnRjX3RvX3Zhcihjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwpzdGF0aWMgdm9pZCBzZXRfb2ZmX3BpdGNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pOwojaWZkZWYgQ09ORklHX1BQQwpzdGF0aWMgaW50IHJlYWRfYXR5X3NlbnNlKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcik7CiNlbmRpZgoKCiAgICAvKgogICAgICogIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZAogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyID0gewoJLyogNjQweDQ4MCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgyNS4xNzUgTUh6IGRvdGNsb2NrKSAqLwoJNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCA4LCAwLAoJezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAoJMCwgMCwgLTEsIC0xLCAwLCAzOTcyMiwgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAp9OwoKc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZGVmbW9kZSA9IHsKCS8qIDY0MHg0ODAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KCU5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjEsIDQwLCAyNCwgMzIsIDExLCA5NiwgMiwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKfTsKCnN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGF0eWZiX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5mYl9vcGVuCT0gYXR5ZmJfb3BlbiwKCS5mYl9yZWxlYXNlCT0gYXR5ZmJfcmVsZWFzZSwKCS5mYl9jaGVja192YXIJPSBhdHlmYl9jaGVja192YXIsCgkuZmJfc2V0X3Bhcgk9IGF0eWZiX3NldF9wYXIsCgkuZmJfc2V0Y29scmVnCT0gYXR5ZmJfc2V0Y29scmVnLAoJLmZiX3Bhbl9kaXNwbGF5CT0gYXR5ZmJfcGFuX2Rpc3BsYXksCgkuZmJfYmxhbmsJPSBhdHlmYl9ibGFuaywKCS5mYl9pb2N0bAk9IGF0eWZiX2lvY3RsLAoJLmZiX2ZpbGxyZWN0CT0gYXR5ZmJfZmlsbHJlY3QsCgkuZmJfY29weWFyZWEJPSBhdHlmYl9jb3B5YXJlYSwKCS5mYl9pbWFnZWJsaXQJPSBhdHlmYl9pbWFnZWJsaXQsCiNpZmRlZiBfX3NwYXJjX18KCS5mYl9tbWFwCT0gYXR5ZmJfbW1hcCwKI2VuZGlmCgkuZmJfc3luYwk9IGF0eWZiX3N5bmMsCn07CgpzdGF0aWMgaW50IG5vYWNjZWw7CiNpZmRlZiBDT05GSUdfTVRSUgpzdGF0aWMgaW50IG5vbXRycjsKI2VuZGlmCnN0YXRpYyBpbnQgdnJhbTsKc3RhdGljIGludCBwbGw7CnN0YXRpYyBpbnQgbWNsazsKc3RhdGljIGludCB4Y2xrOwpzdGF0aWMgaW50IGNvbXBfc3luYyBfX2RldmluaXRkYXRhID0gLTE7CnN0YXRpYyBjaGFyICptb2RlOwoKI2lmZGVmIENPTkZJR19QUEMKc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlIF9fZGV2aW5pdGRhdGEgPSBWTU9ERV9DSE9PU0U7CnN0YXRpYyBpbnQgZGVmYXVsdF9jbW9kZSBfX2RldmluaXRkYXRhID0gQ01PREVfQ0hPT1NFOwoKbW9kdWxlX3BhcmFtX25hbWVkKHZtb2RlLCBkZWZhdWx0X3Ztb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZtb2RlLCAiaW50OiB2aWRlbyBtb2RlIGZvciBtYWMiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGNtb2RlLCBkZWZhdWx0X2Ntb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNtb2RlLCAiaW50OiBjb2xvciBtb2RlIGZvciBtYWMiKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0FUQVJJCnN0YXRpYyB1bnNpZ25lZCBpbnQgbWFjaDY0X2NvdW50IF9fZGV2aW5pdGRhdGEgPSAwOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3ZtZW1iYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19zaXplW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19ndWlyZWdiYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKI2VuZGlmCgovKiB0b3AgLT4gZG93biBpcyBhbiBldm9sdXRpb24gb2YgbWFjaDY0IGNoaXBzZXQsIGFueSBjb3JyZWN0aW9ucz8gKi8KI2RlZmluZSBBVElfQ0hJUF84ODgwMEdYICAgKE02NEZfR1gpCiNkZWZpbmUgQVRJX0NISVBfODg4MDBDWCAgIChNNjRGX0dYKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRDVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKI2RlZmluZSBBVElfQ0hJUF8yNjRFVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQgICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX01BR0lDX0ZJRk8pCiNkZWZpbmUgQVRJX0NISVBfMjY0R1QgICAgIChNNjRGX0dUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX01BR0lDX0ZJRk8gfCBNNjRGX0VYVFJBX0JSSUdIVCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlRCICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1ApCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQzICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1AgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCkKI2RlZmluZSBBVElfQ0hJUF8yNjRWVDQgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCkKCi8qIEZJWE1FIHdoYXQgaXMgdGhpcyBjaGlwPyAqLwojZGVmaW5lIEFUSV9DSElQXzI2NExUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQKQoKLyogbWFrZSBzZXRzIHNob3J0ZXIgKi8KI2RlZmluZSBBVElfTU9ERVJOX1NFVCAgICAgKE02NEZfR1QgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCB8IE02NEZfRVhUUkFfQlJJR0hUKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVEIgICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwpCi8qI2RlZmluZSBBVElfQ0hJUF8yNjRHVERWRCAgPyovCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRHICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVDJDICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSkKI2RlZmluZSBBVElfQ0hJUF8yNjRHVFBSTyAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QpCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRQUk8gIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0WEwgICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCB8IE02NEZfWExfRExMIHwgTTY0Rl9NRkJfRk9SQ0VfNCkKI2RlZmluZSBBVElfQ0hJUF9NT0JJTElUWSAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEIHwgTTY0Rl9YTF9ETEwgfCBNNjRGX01GQl9GT1JDRV80IHwgTTY0Rl9NT0JJTF9CVVMpCgpzdGF0aWMgc3RydWN0IHsKCXUxNiBwY2lfaWQ7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50IHBsbCwgbWNsaywgeGNsaywgZWNwX21heDsKCXUzMiBmZWF0dXJlczsKfSBhdHlfY2hpcHNbXSBfX2RldmluaXRkYXRhID0gewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAoJLyogTWFjaDY0IEdYICovCgl7IFBDSV9DSElQX01BQ0g2NEdYLCAiQVRJODg4R1gwMCAoTWFjaDY0IEdYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMEdYIH0sCgl7IFBDSV9DSElQX01BQ0g2NENYLCAiQVRJODg4Q1gwMCAoTWFjaDY0IENYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMENYIH0sCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dYICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJeyBQQ0lfQ0hJUF9NQUNINjRDVCwgIkFUSTI2NENUIChNYWNoNjQgQ1QpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NENUIH0sCgl7IFBDSV9DSElQX01BQ0g2NEVULCAiQVRJMjY0RVQgKE1hY2g2NCBFVCkiLCAxMzUsIDYwLCA2MCwgMCwgQVRJX0NISVBfMjY0RVQgfSwKCgkvKiBGSVhNRSB3aGF0IGlzIHRoaXMgY2hpcD8gKi8KCXsgUENJX0NISVBfTUFDSDY0TFQsICJBVEkyNjRMVCAoTWFjaDY0IExUKSIsIDEzNSwgNjMsIDYzLCAwLCBBVElfQ0hJUF8yNjRMVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlQsICJBVEkyNjRWVCAoTWFjaDY0IFZUKSIsIDE3MCwgNjcsIDY3LCA4MCwgQVRJX0NISVBfMjY0VlQgfSwKCXsgUENJX0NISVBfTUFDSDY0R1QsICIzRCBSQUdFIChNYWNoNjQgR1QpIiwgMTM1LCA2MywgNjMsIDgwLCBBVElfQ0hJUF8yNjRHVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlUsICJBVEkyNjRWVDMgKE1hY2g2NCBWVSkiLCAyMDAsIDY3LCA2NywgODAsIEFUSV9DSElQXzI2NFZUMyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHVSwgIjNEIFJBR0UgSUkrIChNYWNoNjQgR1UpIiwgMjAwLCA2NywgNjcsIDEwMCwgQVRJX0NISVBfMjY0R1RCIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMRywgIjNEIFJBR0UgTFQgKE1hY2g2NCBMRykiLCAyMzAsIDYzLCA2MywgMTAwLCBBVElfQ0hJUF8yNjRMVEcgfCBNNjRGX0xUX0xDRF9SRUdTIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlYsICJBVEkyNjRWVDQgKE1hY2g2NCBWVikiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRWVDQgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdWLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHViwgUENJKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1csICIzRCBSQUdFIElJQyAoTWFjaDY0IEdXLCBBR1ApIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHWSwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1ksIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdaLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHWiwgQUdQKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdCLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHQiwgQkdBLCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHRCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0QsIEJHQSwgQUdQIDF4KSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0R0ksICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdJLCBCR0EsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIHwgTTY0Rl9NQUdJQ19WUkFNX1NJWkUgfSwKCXsgUENJX0NISVBfTUFDSDY0R1AsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdQLCBQUUZQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUSwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1EsIFBRRlAsIFBDSSwgbGltaXRlZCAzRCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMQiwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEIsIEFHUCkiLCAyMzYsIDc1LCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0TEQsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExELCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMSSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEksIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xXzEgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgl7IFBDSV9DSElQX01BQ0g2NExQLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgl7IFBDSV9DSElQX01BQ0g2NExRLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdNLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdNLCBBR1AgMngpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R04sICIzRCBSQUdFIFhDIChNYWNoNjQgR04sIEFHUCAyeCkiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHTywgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTywgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdMLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdMLCBQQ0ktNjYpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R1IsICIzRCBSQUdFIFhMIChNYWNoNjQgR1IsIFBDSS0zMykiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB8IE02NEZfU0RSQU1fTUFHSUNfUExMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdTLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdTLCBQQ0ktMzMpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCgl7IFBDSV9DSElQX01BQ0g2NExNLCAiM0QgUkFHRSBNb2JpbGl0eSBQL00gKE1hY2g2NCBMTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMTiwgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExOLCBBR1AgMngpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCgl7IFBDSV9DSElQX01BQ0g2NExSLCAiM0QgUkFHRSBNb2JpbGl0eSBQL00gKE1hY2g2NCBMUiwgUENJKSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUywgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExTLCBQQ0kpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCn07CgovKiBjYW4gbm90IGZhaWwgKi8Kc3RhdGljIGludCBfX2RldmluaXQgY29ycmVjdF9jaGlwc2V0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTggcmV2OwoJdTE2IHR5cGU7Cgl1MzIgY2hpcF9pZDsKCWNvbnN0IGNoYXIgKm5hbWU7CglpbnQgaTsKCglmb3IgKGkgPSBBUlJBWV9TSVpFKGF0eV9jaGlwcykgLSAxOyBpID49IDA7IGktLSkKCQlpZiAocGFyLT5wY2lfaWQgPT0gYXR5X2NoaXBzW2ldLnBjaV9pZCkKCQkJYnJlYWs7CgoJbmFtZSA9IGF0eV9jaGlwc1tpXS5uYW1lOwoJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSBhdHlfY2hpcHNbaV0ucGxsOwoJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBhdHlfY2hpcHNbaV0ubWNsazsKCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gYXR5X2NoaXBzW2ldLnhjbGs7CglwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IGF0eV9jaGlwc1tpXS5lY3BfbWF4OwoJcGFyLT5mZWF0dXJlcyA9IGF0eV9jaGlwc1tpXS5mZWF0dXJlczsKCgljaGlwX2lkID0gYXR5X2xkX2xlMzIoQ09ORklHX0NISVBfSUQsIHBhcik7Cgl0eXBlID0gY2hpcF9pZCAmIENGR19DSElQX1RZUEU7CglyZXYgPSAoY2hpcF9pZCAmIENGR19DSElQX1JFVikgPj4gMjQ7CgoJc3dpdGNoKHBhci0+cGNpX2lkKSB7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCgljYXNlIFBDSV9DSElQX01BQ0g2NEdYOgoJCWlmKHR5cGUgIT0gMHgwMGQ3KQoJCQlyZXR1cm4gLUVOT0RFVjsKCQlicmVhazsKCWNhc2UgUENJX0NISVBfTUFDSDY0Q1g6CgkJaWYodHlwZSAhPSAweDAwNTcpCgkJCXJldHVybiAtRU5PREVWOwoJCWJyZWFrOwojZW5kaWYKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWNhc2UgUENJX0NISVBfTUFDSDY0VlQ6CgkJc3dpdGNoIChyZXYgJiAweDA3KSB7CgkJY2FzZSAweDAwOgoJCQlzd2l0Y2ggKHJldiAmIDB4YzApIHsKCQkJY2FzZSAweDAwOgoJCQkJbmFtZSA9ICJBVEkyNjRWVCAoQTMpIChNYWNoNjQgVlQpIjsKCQkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMTcwOwoJCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUOwoJCQkJYnJlYWs7CgkJCWNhc2UgMHg0MDoKCQkJCW5hbWUgPSAiQVRJMjY0VlQyIChBNCkgKE1hY2g2NCBWVCkiOwoJCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlQgfCBNNjRGX01BR0lDX1BPU1RESVY7CgkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIDB4MDE6CgkJCW5hbWUgPSAiQVRJMjY0VlQzIChCMSkgKE1hY2g2NCBWVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUQjsKCQkJYnJlYWs7CgkJY2FzZSAweDAyOgoJCQluYW1lID0gIkFUSTI2NFZUMyAoQjIpIChNYWNoNjQgVlQpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVDM7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgUENJX0NISVBfTUFDSDY0R1Q6CgkJc3dpdGNoIChyZXYgJiAweDA3KSB7CgkJY2FzZSAweDAxOgoJCQluYW1lID0gIjNEIFJBR0UgSUkgKE1hY2g2NCBHVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDE3MDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NEdUQjsKCQkJYnJlYWs7CgkJY2FzZSAweDAyOgoJCQluYW1lID0gIjNEIFJBR0UgSUkrIChNYWNoNjQgR1QpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gMTAwOwoJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0R1RCOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CiNlbmRpZgoJfQoKCVBSSU5US0koIiVzIFsweCUwNHggcmV2IDB4JTAyeF1cbiIsIG5hbWUsIHR5cGUsIHJldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGNoYXIgcmFtX2RyYW1bXSBfX2RldmluaXRkYXRhID0gIkRSQU0iOwpzdGF0aWMgY2hhciByYW1fcmVzdltdIF9fZGV2aW5pdGRhdGEgPSAiUkVTViI7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCnN0YXRpYyBjaGFyIHJhbV92cmFtW10gX19kZXZpbml0ZGF0YSA9ICJWUkFNIjsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKc3RhdGljIGNoYXIgcmFtX2Vkb1tdIF9fZGV2aW5pdGRhdGEgPSAiRURPIjsKc3RhdGljIGNoYXIgcmFtX3NkcmFtW10gX19kZXZpbml0ZGF0YSA9ICJTRFJBTSAoMToxKSI7CnN0YXRpYyBjaGFyIHJhbV9zZ3JhbVtdIF9fZGV2aW5pdGRhdGEgPSAiU0dSQU0gKDE6MSkiOwpzdGF0aWMgY2hhciByYW1fc2RyYW0zMltdIF9fZGV2aW5pdGRhdGEgPSAiU0RSQU0gKDI6MSkgKDMyLWJpdCkiOwpzdGF0aWMgY2hhciByYW1fb2ZmW10gX19kZXZpbml0ZGF0YSA9ICJPRkYiOwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKCnN0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTddOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKc3RhdGljIGNoYXIgKmF0eV9neF9yYW1bOF0gX19kZXZpbml0ZGF0YSA9IHsKCXJhbV9kcmFtLCByYW1fdnJhbSwgcmFtX3ZyYW0sIHJhbV9kcmFtLAoJcmFtX2RyYW0sIHJhbV92cmFtLCByYW1fdnJhbSwgcmFtX3Jlc3YKfTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCnN0YXRpYyBjaGFyICphdHlfY3RfcmFtWzhdIF9fZGV2aW5pdGRhdGEgPSB7CglyYW1fb2ZmLCByYW1fZHJhbSwgcmFtX2VkbywgcmFtX2VkbywKCXJhbV9zZHJhbSwgcmFtX3NncmFtLCByYW1fc2RyYW0zMiwgcmFtX3Jlc3YKfTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCnN0YXRpYyB1MzIgYXR5ZmJfZ2V0X3BpeGNsb2NrKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBwaXhjbG9jayA9IHZhci0+cGl4Y2xvY2s7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECgl1MzIgbGNkX29uX29mZjsKCXBhci0+cGxsLmN0LnhyZXMgPSAwOwoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQlsY2Rfb25fb2ZmID0gYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcik7CgkJaWYobGNkX29uX29mZiAmIExDRF9PTikgewoJCQlwYXItPnBsbC5jdC54cmVzID0gdmFyLT54cmVzOwoJCQlwaXhjbG9jayA9IHBhci0+bGNkX3BpeGNsb2NrOwoJCX0KCX0KI2VuZGlmCglyZXR1cm4gcGl4Y2xvY2s7Cn0KCiNpZiBkZWZpbmVkKENPTkZJR19QUEMpCgovKgogKiAgQXBwbGUgbW9uaXRvciBzZW5zZQogKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfYXR5X3NlbnNlKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaW50IHNlbnNlLCBpOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDMxMDAzMTAwLCBwYXIpOyAvKiBkcml2ZSBvdXRwdXRzIGhpZ2ggKi8KCV9fZGVsYXkoMjAwKTsKCWF0eV9zdF9sZTMyKEdQX0lPLCAwLCBwYXIpOyAvKiB0dXJuIG9mZiBvdXRwdXRzICovCglfX2RlbGF5KDIwMDApOwoJaSA9IGF0eV9sZF9sZTMyKEdQX0lPLCBwYXIpOyAvKiBnZXQgcHJpbWFyeSBzZW5zZSB2YWx1ZSAqLwoJc2Vuc2UgPSAoKGkgJiAweDMwMDApID4+IDMpIHwgKGkgJiAweDEwMCk7CgoJLyogZHJpdmUgZWFjaCBzZW5zZSBsaW5lIGxvdyBpbiB0dXJuIGFuZCBjb2xsZWN0IHRoZSBvdGhlciAyICovCglhdHlfc3RfbGUzMihHUF9JTywgMHgyMDAwMDAwMCwgcGFyKTsgLyogZHJpdmUgQSBsb3cgKi8KCV9fZGVsYXkoMjAwMCk7CglpID0gYXR5X2xkX2xlMzIoR1BfSU8sIHBhcik7CglzZW5zZSB8PSAoKGkgJiAweDEwMDApID4+IDcpIHwgKChpICYgMHgxMDApID4+IDQpOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MjAwMDIwMDAsIHBhcik7IC8qIGRyaXZlIEEgaGlnaCBhZ2FpbiAqLwoJX19kZWxheSgyMDApOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDEwMDAwMDAwLCBwYXIpOyAvKiBkcml2ZSBCIGxvdyAqLwoJX19kZWxheSgyMDAwKTsKCWkgPSBhdHlfbGRfbGUzMihHUF9JTywgcGFyKTsKCXNlbnNlIHw9ICgoaSAmIDB4MjAwMCkgPj4gMTApIHwgKChpICYgMHgxMDApID4+IDYpOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MTAwMDEwMDAsIHBhcik7IC8qIGRyaXZlIEIgaGlnaCBhZ2FpbiAqLwoJX19kZWxheSgyMDApOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDAxMDAwMDAwLCBwYXIpOyAvKiBkcml2ZSBDIGxvdyAqLwoJX19kZWxheSgyMDAwKTsKCXNlbnNlIHw9IChhdHlfbGRfbGUzMihHUF9JTywgcGFyKSAmIDB4MzAwMCkgPj4gMTI7CglhdHlfc3RfbGUzMihHUF9JTywgMCwgcGFyKTsgLyogdHVybiBvZmYgb3V0cHV0cyAqLwoJcmV0dXJuIHNlbnNlOwp9CgojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDKSAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogIENSVEMgcHJvZ3JhbW1pbmcKICovCgpzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0YykKewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgY3J0Yy0+bGNkX2luZGV4ID0gYXR5X2xkX2xlMzIoTENEX0lOREVYLCBwYXIpOwoJCSAgICBhdHlfc3RfbGUzMihMQ0RfSU5ERVgsIGNydGMtPmxjZF9pbmRleCwgcGFyKTsKCQl9CgkJY3J0Yy0+bGNkX2NvbmZpZ19wYW5lbCA9IGF0eV9sZF9sY2QoQ09ORklHX1BBTkVMLCBwYXIpOwoJCWNydGMtPmxjZF9nZW5fY250bCA9IGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpOwoKCgkJLyogc3dpdGNoIHRvIG5vbiBzaGFkb3cgcmVnaXN0ZXJzICovCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCAmCiAgICAgICAgICAgICAgICAgICAgfihDUlRDX1JXX1NFTEVDVCB8IFNIQURPV19FTiB8IFNIQURPV19SV19FTiksIHBhcik7CgoJCS8qIHNhdmUgc3RyZXRjaGluZyAqLwoJCWNydGMtPmhvcnpfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoSE9SWl9TVFJFVENISU5HLCBwYXIpOwoJCWNydGMtPnZlcnRfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoVkVSVF9TVFJFVENISU5HLCBwYXIpOwoJCWlmICghTTY0X0hBUyhMVF9MQ0RfUkVHUykpCgkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggPSBhdHlfbGRfbGNkKEVYVF9WRVJUX1NUUkVUQ0gsIHBhcik7Cgl9CiNlbmRpZgoJY3J0Yy0+aF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIHBhcik7CgljcnRjLT52X3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIHBhcik7CgljcnRjLT52X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCWNydGMtPnZsaW5lX2NybnRfdmxpbmUgPSBhdHlfbGRfbGUzMihDUlRDX1ZMSU5FX0NSTlRfVkxJTkUsIHBhcik7CgljcnRjLT5vZmZfcGl0Y2ggPSBhdHlfbGRfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyKTsKCWNydGMtPmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIHN3aXRjaCB0byBzaGFkb3cgcmVnaXN0ZXJzICovCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIChjcnRjLT5sY2RfZ2VuX2NudGwgJiB+Q1JUQ19SV19TRUxFQ1QpIHwKCQkJU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOLCBwYXIpOwoKCQljcnRjLT5zaGFkb3dfaF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLT5zaGFkb3dfdl90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCgkJYXR5X3N0X2xlMzIoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwsIHBhcik7Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCn0KCnN0YXRpYyB2b2lkIGF0eV9zZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjKQp7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIHN0b3AgQ1JUQyAqLwoJCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGNydGMtPmdlbl9jbnRsICYgfihDUlRDX0VYVF9ESVNQX0VOIHwgQ1JUQ19FTiksIHBhcik7CgoJCS8qIHVwZGF0ZSBub24tc2hhZG93IHJlZ2lzdGVycyBmaXJzdCAqLwoJCWF0eV9zdF9sY2QoQ09ORklHX1BBTkVMLCBjcnRjLT5sY2RfY29uZmlnX3BhbmVsLCBwYXIpOwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwgJgoJCQl+KENSVENfUldfU0VMRUNUIHwgU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKSwgcGFyKTsKCgkJLyogdGVtcG9yYXJpbHkgZGlzYWJsZSBzdHJldGNoaW5nICovCgkJYXR5X3N0X2xjZChIT1JaX1NUUkVUQ0hJTkcsCgkJCWNydGMtPmhvcnpfc3RyZXRjaGluZyAmCgkJCX4oSE9SWl9TVFJFVENIX01PREUgfCBIT1JaX1NUUkVUQ0hfRU4pLCBwYXIpOwoJCWF0eV9zdF9sY2QoVkVSVF9TVFJFVENISU5HLAoJCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgJgoJCQl+KFZFUlRfU1RSRVRDSF9SQVRJTzEgfCBWRVJUX1NUUkVUQ0hfUkFUSU8yIHwKCQkJVkVSVF9TVFJFVENIX1VTRTAgfCBWRVJUX1NUUkVUQ0hfRU4pLCBwYXIpOwoJfQojZW5kaWYKCS8qIHR1cm4gb2ZmIENSVCAqLwoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgY3J0Yy0+Z2VuX2NudGwgJiB+Q1JUQ19FTiwgcGFyKTsKCglEUFJJTlRLKCJzZXR0aW5nIHVwIENSVENcbiIpOwoJRFBSSU5USygic2V0IHByaW1hcnkgQ1JUIHRvICVpeCVpICVjJWMgY29tcG9zaXRlICVjXG4iLAoJICAgICgoKChjcnRjLT5oX3RvdF9kaXNwPj4xNikgJiAweGZmKSArIDEpPDwzKSwgKCgoY3J0Yy0+dl90b3RfZGlzcD4+MTYpICYgMHg3ZmYpICsgMSksCgkgICAgKGNydGMtPmhfc3luY19zdHJ0X3dpZCAmIDB4MjAwMDAwKT8nTic6J1AnLCAoY3J0Yy0+dl9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsCgkgICAgKGNydGMtPmdlbl9jbnRsICYgQ1JUQ19DU1lOQ19FTik/J1AnOidOJyk7CgoJRFBSSU5USygiQ1JUQ19IX1RPVEFMX0RJU1A6ICV4XG4iLGNydGMtPmhfdG90X2Rpc3ApOwoJRFBSSU5USygiQ1JUQ19IX1NZTkNfU1RSVF9XSUQ6ICV4XG4iLGNydGMtPmhfc3luY19zdHJ0X3dpZCk7CglEUFJJTlRLKCJDUlRDX1ZfVE9UQUxfRElTUDogJXhcbiIsY3J0Yy0+dl90b3RfZGlzcCk7CglEUFJJTlRLKCJDUlRDX1ZfU1lOQ19TVFJUX1dJRDogJXhcbiIsY3J0Yy0+dl9zeW5jX3N0cnRfd2lkKTsKCURQUklOVEsoIkNSVENfT0ZGX1BJVENIOiAleFxuIiwgY3J0Yy0+b2ZmX3BpdGNoKTsKCURQUklOVEsoIkNSVENfVkxJTkVfQ1JOVF9WTElORTogJXhcbiIsIGNydGMtPnZsaW5lX2NybnRfdmxpbmUpOwoJRFBSSU5USygiQ1JUQ19HRU5fQ05UTDogJXhcbiIsY3J0Yy0+Z2VuX2NudGwpOwoKCWF0eV9zdF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBjcnRjLT5oX3RvdF9kaXNwLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIGNydGMtPmhfc3luY19zdHJ0X3dpZCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBjcnRjLT52X3RvdF9kaXNwLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIGNydGMtPnZfc3luY19zdHJ0X3dpZCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBjcnRjLT5vZmZfcGl0Y2gsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX1ZMSU5FX0NSTlRfVkxJTkUsIGNydGMtPnZsaW5lX2NybnRfdmxpbmUsIHBhcik7CgoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgY3J0Yy0+Z2VuX2NudGwsIHBhcik7CiNpZiAwCglGSVhNRQoJaWYgKHBhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlhdHlfaW5pdF9lbmdpbmUocGFyLCBpbmZvKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECgkvKiBhZnRlciBzZXR0aW5nIHRoZSBDUlRDIHJlZ2lzdGVycyB3ZSBzaG91bGQgc2V0IHRoZSBMQ0QgcmVnaXN0ZXJzLiAqLwoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQkvKiBzd2l0Y2ggdG8gc2hhZG93IHJlZ2lzdGVycyAqLwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgfkNSVENfUldfU0VMRUNUKSB8CgkJCShTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pLCBwYXIpOwoKCQlEUFJJTlRLKCJzZXQgc2hhZG93IENSVCB0byAlaXglaSAlYyVjXG4iLAoJCSAgICAoKCgoY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3A+PjE2KSAmIDB4ZmYpICsgMSk8PDMpLCAoKChjcnRjLT5zaGFkb3dfdl90b3RfZGlzcD4+MTYpICYgMHg3ZmYpICsgMSksCgkJICAgIChjcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsIChjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcpOwoKCQlEUFJJTlRLKCJTSEFET1cgQ1JUQ19IX1RPVEFMX0RJU1A6ICV4XG4iLCBjcnRjLT5zaGFkb3dfaF90b3RfZGlzcCk7CgkJRFBSSU5USygiU0hBRE9XIENSVENfSF9TWU5DX1NUUlRfV0lEOiAleFxuIiwgY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCk7CgkJRFBSSU5USygiU0hBRE9XIENSVENfVl9UT1RBTF9ESVNQOiAleFxuIiwgY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3ApOwoJCURQUklOVEsoIlNIQURPVyBDUlRDX1ZfU1lOQ19TVFJUX1dJRDogJXhcbiIsIGNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQpOwoKCQlhdHlfc3RfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3AsIHBhcik7CgkJYXR5X3N0X2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIGNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQsIHBhcik7CgkJYXR5X3N0X2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIGNydGMtPnNoYWRvd192X3RvdF9kaXNwLCBwYXIpOwoJCWF0eV9zdF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkLCBwYXIpOwoKCQkvKiByZXN0b3JlIENSVEMgc2VsZWN0aW9uICYgc2hhZG93IHN0YXRlIGFuZCBlbmFibGUgc3RyZXRjaGluZyAqLwoJCURQUklOVEsoIkxDRF9HRU5fQ05UTDogJXhcbiIsIGNydGMtPmxjZF9nZW5fY250bCk7CgkJRFBSSU5USygiSE9SWl9TVFJFVENISU5HOiAleFxuIiwgY3J0Yy0+aG9yel9zdHJldGNoaW5nKTsKCQlEUFJJTlRLKCJWRVJUX1NUUkVUQ0hJTkc6ICV4XG4iLCBjcnRjLT52ZXJ0X3N0cmV0Y2hpbmcpOwoJCWlmKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkKCQkgICAgRFBSSU5USygiRVhUX1ZFUlRfU1RSRVRDSDogJXhcbiIsIGNydGMtPmV4dF92ZXJ0X3N0cmV0Y2gpOwoKCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsLCBwYXIpOwoJCWF0eV9zdF9sY2QoSE9SWl9TVFJFVENISU5HLCBjcnRjLT5ob3J6X3N0cmV0Y2hpbmcsIHBhcik7CgkJYXR5X3N0X2xjZChWRVJUX1NUUkVUQ0hJTkcsIGNydGMtPnZlcnRfc3RyZXRjaGluZywgcGFyKTsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgYXR5X3N0X2xjZChFWFRfVkVSVF9TVFJFVENILCBjcnRjLT5leHRfdmVydF9zdHJldGNoLCBwYXIpOwoJCSAgICBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJICAgIGF0eV9zdF9sZTMyKExDRF9JTkRFWCwgY3J0Yy0+bGNkX2luZGV4LCBwYXIpOwoJCX0KCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KfQoKc3RhdGljIGludCBhdHlfdmFyX3RvX2NydGMoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCgljb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGNydGMgKmNydGMpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiB4cmVzLCB5cmVzLCB2eHJlcywgdnlyZXMsIHhvZmZzZXQsIHlvZmZzZXQsIGJwcDsKCXUzMiBzeW5jLCB2bW9kZSwgdmRpc3BsYXk7Cgl1MzIgaF90b3RhbCwgaF9kaXNwLCBoX3N5bmNfc3RydCwgaF9zeW5jX2VuZCwgaF9zeW5jX2RseSwgaF9zeW5jX3dpZCwgaF9zeW5jX3BvbDsKCXUzMiB2X3RvdGFsLCB2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfZW5kLCB2X3N5bmNfd2lkLCB2X3N5bmNfcG9sLCBjX3N5bmM7Cgl1MzIgcGl4X3dpZHRoLCBkcF9waXhfd2lkdGgsIGRwX2NoYWluX21hc2s7CgoJLyogaW5wdXQgKi8KCXhyZXMgPSB2YXItPnhyZXM7Cgl5cmVzID0gdmFyLT55cmVzOwoJdnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKCXZ5cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7Cgl4b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwoJeW9mZnNldCA9IHZhci0+eW9mZnNldDsKCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CglpZiAoYnBwID09IDE2KQoJCWJwcCA9ICh2YXItPmdyZWVuLmxlbmd0aCA9PSA1KSA/IDE1IDogMTY7CglzeW5jID0gdmFyLT5zeW5jOwoJdm1vZGUgPSB2YXItPnZtb2RlOwoKCS8qIGNvbnZlcnQgKGFuZCByb3VuZCB1cCkgYW5kIHZhbGlkYXRlICovCglpZiAodnhyZXMgPCB4cmVzICsgeG9mZnNldCkKCQl2eHJlcyA9IHhyZXMgKyB4b2Zmc2V0OwoJaF9kaXNwID0geHJlczsKCglpZiAodnlyZXMgPCB5cmVzICsgeW9mZnNldCkKCQl2eXJlcyA9IHlyZXMgKyB5b2Zmc2V0OwoJdl9kaXNwID0geXJlczsKCglpZiAoYnBwIDw9IDgpIHsKCQlicHAgPSA4OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzhCUFA7CgkJZHBfcGl4X3dpZHRoID0KCQkgICAgSE9TVF84QlBQIHwgU1JDXzhCUFAgfCBEU1RfOEJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fOEJQUDsKCX0gZWxzZSBpZiAoYnBwIDw9IDE1KSB7CgkJYnBwID0gMTY7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfMTVCUFA7CgkJZHBfcGl4X3dpZHRoID0gSE9TVF8xNUJQUCB8IFNSQ18xNUJQUCB8IERTVF8xNUJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fMTVCUFA7Cgl9IGVsc2UgaWYgKGJwcCA8PSAxNikgewoJCWJwcCA9IDE2OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzE2QlBQOwoJCWRwX3BpeF93aWR0aCA9IEhPU1RfMTZCUFAgfCBTUkNfMTZCUFAgfCBEU1RfMTZCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzE2QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMjQgJiYgTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCWJwcCA9IDI0OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzI0QlBQOwoJCWRwX3BpeF93aWR0aCA9CgkJICAgIEhPU1RfOEJQUCB8IFNSQ184QlBQIHwgRFNUXzhCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzI0QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMzIpIHsKCQlicHAgPSAzMjsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF8zMkJQUDsKCQlkcF9waXhfd2lkdGggPSBIT1NUXzMyQlBQIHwgU1JDXzMyQlBQIHwgRFNUXzMyQlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl8zMkJQUDsKCX0gZWxzZQoJCUZBSUwoImludmFsaWQgYnBwIik7CgoJaWYgKHZ4cmVzICogdnlyZXMgKiBicHAgLyA4ID4gaW5mby0+Zml4LnNtZW1fbGVuKQoJCUZBSUwoIm5vdCBlbm91Z2ggdmlkZW8gUkFNIik7CgoJaF9zeW5jX3BvbCA9IHN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCA/IDAgOiAxOwoJdl9zeW5jX3BvbCA9IHN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QgPyAwIDogMTsKCglpZigoeHJlcyA+IDE2MDApIHx8ICh5cmVzID4gMTIwMCkpIHsKCQlGQUlMKCJNQUNINjQgY2hpcHMgYXJlIGRlc2lnbmVkIGZvciBtYXggMTYwMHgxMjAwXG4iCgkJInNlbGVjdCBhbm90ZXIgcmVzb2x1dGlvbi4iKTsKCX0KCWhfc3luY19zdHJ0ID0gaF9kaXNwICsgdmFyLT5yaWdodF9tYXJnaW47CgloX3N5bmNfZW5kID0gaF9zeW5jX3N0cnQgKyB2YXItPmhzeW5jX2xlbjsKCWhfc3luY19kbHkgID0gdmFyLT5yaWdodF9tYXJnaW4gJiA3OwoJaF90b3RhbCA9IGhfc3luY19lbmQgKyBoX3N5bmNfZGx5ICsgdmFyLT5sZWZ0X21hcmdpbjsKCgl2X3N5bmNfc3RydCA9IHZfZGlzcCArIHZhci0+bG93ZXJfbWFyZ2luOwoJdl9zeW5jX2VuZCA9IHZfc3luY19zdHJ0ICsgdmFyLT52c3luY19sZW47Cgl2X3RvdGFsID0gdl9zeW5jX2VuZCArIHZhci0+dXBwZXJfbWFyZ2luOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJaWYoIU02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJICAgIHUzMiBsY2RfaW5kZXggPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJICAgIGNydGMtPmxjZF9pbmRleCA9IGxjZF9pbmRleCAmCgkJCX4oTENEX0lOREVYX01BU0sgfCBMQ0RfRElTUExBWV9ESVMgfCBMQ0RfU1JDX1NFTCB8IENSVEMyX0RJU1BMQVlfRElTKTsKCQkgICAgYXR5X3N0X2xlMzIoTENEX0lOREVYLCBsY2RfaW5kZXgsIHBhcik7CgkJfQoKCQlpZiAoIU02NF9IQVMoTU9CSUxfQlVTKSkKCQkJY3J0Yy0+bGNkX2luZGV4IHw9IENSVEMyX0RJU1BMQVlfRElTOwoKCQljcnRjLT5sY2RfY29uZmlnX3BhbmVsID0gYXR5X2xkX2xjZChDT05GSUdfUEFORUwsIHBhcikgfCAweDQwMDA7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsID0gYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiB+Q1JUQ19SV19TRUxFQ1Q7CgoJCWNydGMtPmxjZF9nZW5fY250bCAmPQoJCQl+KEhPUlpfRElWQlkyX0VOIHwgRElTX0hPUl9DUlRfRElWQlkyIHwgVFZDTEtfUE1fRU4gfAoJCQkvKlZDTEtfREFDX1BNX0VOIHwgVVNFX1NIQURPV0VEX1ZFTkQgfCovCgkJCVVTRV9TSEFET1dFRF9ST1dDVVIgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pOwoJCWNydGMtPmxjZF9nZW5fY250bCB8PSBET05UX1NIQURPV19WUEFSIHwgTE9DS184RE9UOwoKCQlpZigoY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSAmJgoJCQkoKHhyZXMgPiBwYXItPmxjZF93aWR0aCkgfHwgKHlyZXMgPiBwYXItPmxjZF9oZWlnaHQpKSkgewoJCQkvKiBXZSBjYW5ub3QgZGlzcGxheSB0aGUgbW9kZSBvbiB0aGUgTENELiBJZiB0aGUgQ1JUIGlzIGVuYWJsZWQKCQkJICAgd2UgY2FuIHR1cm4gb2ZmIHRoZSBMQ0QuCgkJCSAgIElmIHRoZSBDUlQgaXMgb2ZmLCBpdCBpc24ndCBhIGdvb2QgaWRlYSB0byBzd2l0Y2ggaXQgb247IHdlIGRvbid0CgkJCSAgIGtub3cgaWYgb25lIGlzIGNvbm5lY3RlZC4gU28gaXQncyBiZXR0ZXIgdG8gZmFpbCB0aGVuLgoJCQkgKi8KCQkJaWYgKGNydGMtPmxjZF9nZW5fY250bCAmIENSVF9PTikgewoJCQkJaWYgKCEodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1RFU1QpKQoJCQkJCVBSSU5US0koIkRpc2FibGUgTENEIHBhbmVsLCBiZWNhdXNlIHZpZGVvIG1vZGUgZG9lcyBub3QgZml0LlxuIik7CgkJCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0gfkxDRF9PTjsKCQkJCS8qYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCwgcGFyKTsqLwoJCQl9IGVsc2UgewoJCQkJaWYgKCEodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1RFU1QpKQoJCQkJCVBSSU5US0UoIlZpZGVvIG1vZGUgZXhjZWVkcyBzaXplIG9mIExDRCBwYW5lbC5cbkNvbm5lY3QgdGhpcyBjb21wdXRlciB0byBhIGNvbnZlbnRpb25hbCBtb25pdG9yIGlmIHlvdSByZWFsbHkgbmVlZCB0aGlzIG1vZGUuXG4iKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgkJfQoJfQoKCWlmICgocGFyLT5sY2RfdGFibGUgIT0gMCkgJiYgKGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikpIHsKCQlpbnQgVlNjYW4gPSAxOwoJCS8qIGJwcCAtPiBieXRlc3BwLCAxLDQgLT4gMDsgOCAtPiAyOyAxNSwxNiAtPiAxOyAyNCAtPiA2OyAzMiAtPiA1CgkJY29uc3QgdTggREZQX2hfc3luY19kbHlfTFRbXSA9IHsgMCwgMiwgMSwgNiwgNSB9OwoJCWNvbnN0IHU4IEFERF90b19zdHJ0X3dpZF9hbmRfZGx5X0xUX0RBQ1tdID0geyAwLCA1LCA2LCA5LCA5LCAxMiwgMTIgfTsgICovCgoJCXZtb2RlICY9IH4oRkJfVk1PREVfRE9VQkxFIHwgRkJfVk1PREVfSU5URVJMQUNFRCk7CgoJCS8qIFRoaXMgaXMgaG9ycm9yISBXaGVuIHdlIHNpbXVsYXRlLCBzYXkgNjQweDQ4MCBvbiBhbiA4MDB4NjAwCgkJICAgTENEIG1vbml0b3IsIHRoZSBDUlRDIHNob3VsZCBiZSBwcm9ncmFtbWVkIDgwMHg2MDAgdmFsdWVzIGZvcgoJCSAgIHRoZSBub24gdmlzaWJsZSBwYXJ0LCBidXQgNjQweDQ4MCBmb3IgdGhlIHZpc2libGUgcGFydC4KCQkgICBUaGlzIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIGEgbGFwdG9wIHdpdGggaXQncyAxNDAweDEwNTAgTENECgkJICAgbW9uaXRvciBhbmQgYSBjb252ZW50aW9uYWwgbW9uaXRvciBib3RoIHN3aXRjaGVkIG9uLgoJCSAgIFRlc3RlZCBtb2RlczogMTI4MHgxMDI0LCAxMTUyeDg2NCwgMTAyNHg3NjgsIDgwMHg2MDAsCgkJICAgIHdvcmtzIHdpdGggbGl0dGxlIGdsaXRjaGVzIGFsc28gd2l0aCBET1VCTEVTQ0FOIG1vZGVzCgkJICovCgkJaWYgKHlyZXMgPCBwYXItPmxjZF9oZWlnaHQpIHsKCQkJVlNjYW4gPSBwYXItPmxjZF9oZWlnaHQgLyB5cmVzOwoJCQlpZihWU2NhbiA+IDEpIHsKCQkJCVZTY2FuID0gMjsKCQkJCXZtb2RlIHw9IEZCX1ZNT0RFX0RPVUJMRTsKCQkJfQoJCX0KCgkJaF9zeW5jX3N0cnQgPSBoX2Rpc3AgKyBwYXItPmxjZF9yaWdodF9tYXJnaW47CgkJaF9zeW5jX2VuZCA9IGhfc3luY19zdHJ0ICsgcGFyLT5sY2RfaHN5bmNfbGVuOwoJCWhfc3luY19kbHkgPSAvKkRGUF9oX3N5bmNfZGx5WyAoIGJwcCArIDEgKSAvIDMgXTsgKi9wYXItPmxjZF9oc3luY19kbHk7CgkJaF90b3RhbCA9IGhfZGlzcCArIHBhci0+bGNkX2hibGFua19sZW47CgoJCXZfc3luY19zdHJ0ID0gdl9kaXNwICsgcGFyLT5sY2RfbG93ZXJfbWFyZ2luIC8gVlNjYW47CgkJdl9zeW5jX2VuZCA9IHZfc3luY19zdHJ0ICsgcGFyLT5sY2RfdnN5bmNfbGVuIC8gVlNjYW47CgkJdl90b3RhbCA9IHZfZGlzcCArIHBhci0+bGNkX3ZibGFua19sZW4gLyBWU2NhbjsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCgloX2Rpc3AgPSAoaF9kaXNwID4+IDMpIC0gMTsKCWhfc3luY19zdHJ0ID0gKGhfc3luY19zdHJ0ID4+IDMpIC0gMTsKCWhfc3luY19lbmQgPSAoaF9zeW5jX2VuZCA+PiAzKSAtIDE7CgloX3RvdGFsID0gKGhfdG90YWwgPj4gMykgLSAxOwoJaF9zeW5jX3dpZCA9IGhfc3luY19lbmQgLSBoX3N5bmNfc3RydDsKCglGQUlMX01BWCgiaF9kaXNwIHRvbyBsYXJnZSIsIGhfZGlzcCwgMHhmZik7CglGQUlMX01BWCgiaF9zeW5jX3N0cnQgdG9vIGxhcmdlIiwgaF9zeW5jX3N0cnQsIDB4MWZmKTsKCS8qRkFJTF9NQVgoImhfc3luY193aWQgdG9vIGxhcmdlIiwgaF9zeW5jX3dpZCwgMHgxZik7Ki8KCWlmKGhfc3luY193aWQgPiAweDFmKQoJCWhfc3luY193aWQgPSAweDFmOwoJRkFJTF9NQVgoImhfdG90YWwgdG9vIGxhcmdlIiwgaF90b3RhbCwgMHgxZmYpOwoKCWlmICh2bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkgewoJCXZfZGlzcCA8PD0gMTsKCQl2X3N5bmNfc3RydCA8PD0gMTsKCQl2X3N5bmNfZW5kIDw8PSAxOwoJCXZfdG90YWwgPDw9IDE7Cgl9CgoJdmRpc3BsYXkgPSB5cmVzOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKChwYXItPmxjZF90YWJsZSAhPSAwKSAmJiAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSkKCQl2ZGlzcGxheSAgPSBwYXItPmxjZF9oZWlnaHQ7CiNlbmRpZgoKCXZfZGlzcC0tOwoJdl9zeW5jX3N0cnQtLTsKCXZfc3luY19lbmQtLTsKCXZfdG90YWwtLTsKCXZfc3luY193aWQgPSB2X3N5bmNfZW5kIC0gdl9zeW5jX3N0cnQ7CgoJRkFJTF9NQVgoInZfZGlzcCB0b28gbGFyZ2UiLCB2X2Rpc3AsIDB4N2ZmKTsKCUZBSUxfTUFYKCJ2X3N5bmNfc3RzcnQgdG9vIGxhcmdlIiwgdl9zeW5jX3N0cnQsIDB4N2ZmKTsKCS8qRkFJTF9NQVgoInZfc3luY193aWQgdG9vIGxhcmdlIiwgdl9zeW5jX3dpZCwgMHgxZik7Ki8KCWlmKHZfc3luY193aWQgPiAweDFmKQoJCXZfc3luY193aWQgPSAweDFmOwoJRkFJTF9NQVgoInZfdG90YWwgdG9vIGxhcmdlIiwgdl90b3RhbCwgMHg3ZmYpOwoKCWNfc3luYyA9IHN5bmMgJiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgPyBDUlRDX0NTWU5DX0VOIDogMDsKCgkvKiBvdXRwdXQgKi8KCWNydGMtPnZ4cmVzID0gdnhyZXM7CgljcnRjLT52eXJlcyA9IHZ5cmVzOwoJY3J0Yy0+eG9mZnNldCA9IHhvZmZzZXQ7CgljcnRjLT55b2Zmc2V0ID0geW9mZnNldDsKCWNydGMtPmJwcCA9IGJwcDsKCWNydGMtPm9mZl9waXRjaCA9ICgoeW9mZnNldCp2eHJlcyt4b2Zmc2V0KSpicHAvNjQpIHwgKHZ4cmVzPDwxOSk7CgljcnRjLT52bGluZV9jcm50X3ZsaW5lID0gMDsKCgljcnRjLT5oX3RvdF9kaXNwID0gaF90b3RhbCB8IChoX2Rpc3A8PDE2KTsKCWNydGMtPmhfc3luY19zdHJ0X3dpZCA9IChoX3N5bmNfc3RydCAmIDB4ZmYpIHwgKGhfc3luY19kbHk8PDgpIHwKCQkoKGhfc3luY19zdHJ0ICYgMHgxMDApPDw0KSB8IChoX3N5bmNfd2lkPDwxNikgfCAoaF9zeW5jX3BvbDw8MjEpOwoJY3J0Yy0+dl90b3RfZGlzcCA9IHZfdG90YWwgfCAodl9kaXNwPDwxNik7CgljcnRjLT52X3N5bmNfc3RydF93aWQgPSB2X3N5bmNfc3RydCB8ICh2X3N5bmNfd2lkPDwxNikgfCAodl9zeW5jX3BvbDw8MjEpOwoKCS8qIGNydGMtPmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfUFJFU0VSVkVEX01BU0s7ICovCgljcnRjLT5nZW5fY250bCA9IENSVENfRVhUX0RJU1BfRU4gfCBDUlRDX0VOIHwgcGl4X3dpZHRoIHwgY19zeW5jOwoJY3J0Yy0+Z2VuX2NudGwgfD0gQ1JUQ19WR0FfTElORUFSOwoKCS8qIEVuYWJsZSBkb3VibGVzY2FuIG1vZGUgaWYgcmVxdWVzdGVkICovCglpZiAodm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpCgkJY3J0Yy0+Z2VuX2NudGwgfD0gQ1JUQ19EQkxfU0NBTl9FTjsKCS8qIEVuYWJsZSBpbnRlcmxhY2VkIG1vZGUgaWYgcmVxdWVzdGVkICovCglpZiAodm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKQoJCWNydGMtPmdlbl9jbnRsIHw9IENSVENfSU5URVJMQUNFX0VOOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQl2ZGlzcGxheSA9IHlyZXM7CgkJaWYodm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpCgkJCXZkaXNwbGF5IDw8PSAxOwoJCWNydGMtPmdlbl9jbnRsICY9IH4oQ1JUQzJfRU4gfCBDUlRDMl9QSVhfV0lEVEgpOwoJCWNydGMtPmxjZF9nZW5fY250bCAmPSB+KEhPUlpfRElWQlkyX0VOIHwgRElTX0hPUl9DUlRfRElWQlkyIHwKCQkJLypUVkNMS19QTV9FTiB8IFZDTEtfREFDX1BNX0VOIHwqLwoJCQlVU0VfU0hBRE9XRURfVkVORCB8IFVTRV9TSEFET1dFRF9ST1dDVVIgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pOwoJCWNydGMtPmxjZF9nZW5fY250bCB8PSAoRE9OVF9TSEFET1dfVlBBUi8qIHwgTE9DS184RE9UKi8pOwoKCQkvKiBNT0JJTElUWSBNMSB0ZXN0ZWQsIEZJWE1FOiBMVCAqLwoJCWNydGMtPmhvcnpfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoSE9SWl9TVFJFVENISU5HLCBwYXIpOwoJCWlmICghTTY0X0hBUyhMVF9MQ0RfUkVHUykpCgkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggPSBhdHlfbGRfbGNkKEVYVF9WRVJUX1NUUkVUQ0gsIHBhcikgJgoJCQkJfihBVVRPX1ZFUlRfUkFUSU8gfCBWRVJUX1NUUkVUQ0hfTU9ERSB8IFZFUlRfU1RSRVRDSF9SQVRJTzMpOwoKCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgJj0KCQkJfihIT1JaX1NUUkVUQ0hfUkFUSU8gfCBIT1JaX1NUUkVUQ0hfTE9PUCB8IEFVVE9fSE9SWl9SQVRJTyB8CgkJCUhPUlpfU1RSRVRDSF9NT0RFIHwgSE9SWl9TVFJFVENIX0VOKTsKCQlpZiAoeHJlcyA8IHBhci0+bGNkX3dpZHRoICYmIGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikgewoJCQlkbyB7CgkJCQkvKgoJCQkJKiBUaGUgaG9yaXpvbnRhbCBibGVuZGVyIG1pc2JlaGF2ZXMgd2hlbiBIRGlzcGxheSBpcyBsZXNzIHRoYW4gYQoJCQkJKiBhIGNlcnRhaW4gdGhyZXNob2xkICg0NDAgZm9yIGEgMTAyNC13aWRlIHBhbmVsKS4gIEl0IGRvZXNuJ3QKCQkJCSogc3RyZXRjaCBzdWNoIG1vZGVzIGVub3VnaC4gIFVzZSBwaXhlbCByZXBsaWNhdGlvbiBpbnN0ZWFkIG9mCgkJCQkqIGJsZW5kaW5nIHRvIHN0cmV0Y2ggbW9kZXMgdGhhdCBjYW4gYmUgbWFkZSB0byBleGFjdGx5IGZpdCB0aGUKCQkJCSogcGFuZWwgd2lkdGguICBUaGUgdW5kb2N1bWVudGVkICJOb0xDREJsZW5kIiBvcHRpb24gYWxsb3dzIHRoZQoJCQkJKiBwaXhlbC1yZXBsaWNhdGVkIG1vZGUgdG8gYmUgc2xpZ2h0bHkgd2lkZXIgb3IgbmFycm93ZXIgdGhhbiB0aGUKCQkJCSogcGFuZWwgd2lkdGguICBJdCBhbHNvIGNhdXNlcyBhIG1vZGUgdGhhdCBpcyBleGFjdGx5IGhhbGYgYXMgd2lkZQoJCQkJKiBhcyB0aGUgcGFuZWwgdG8gYmUgcGl4ZWwtcmVwbGljYXRlZCwgcmF0aGVyIHRoYW4gYmxlbmRlZC4KCQkJCSovCgkJCQlpbnQgSERpc3BsYXkgID0geHJlcyAmIH43OwoJCQkJaW50IG5TdHJldGNoICA9IHBhci0+bGNkX3dpZHRoIC8gSERpc3BsYXk7CgkJCQlpbnQgUmVtYWluZGVyID0gcGFyLT5sY2Rfd2lkdGggJSBIRGlzcGxheTsKCgkJCQlpZiAoKCFSZW1haW5kZXIgJiYgKChuU3RyZXRjaCA+IDIpKSkgfHwKCQkJCQkoKChIRGlzcGxheSAqIDE2KSAvIHBhci0+bGNkX3dpZHRoKSA8IDcpKSB7CgkJCQkJc3RhdGljIGNvbnN0IGNoYXIgU3RyZXRjaExvb3BzW10gPSB7MTAsIDEyLCAxMywgMTUsIDE2fTsKCQkJCQlpbnQgaG9yel9zdHJldGNoX2xvb3AgPSAtMSwgQmVzdFJlbWFpbmRlcjsKCQkJCQlpbnQgTnVtZXJhdG9yID0gSERpc3BsYXksIERlbm9taW5hdG9yID0gcGFyLT5sY2Rfd2lkdGg7CgkJCQkJaW50IEluZGV4ID0gNTsKCQkJCQlBVElSZWR1Y2VSYXRpbygmTnVtZXJhdG9yLCAmRGVub21pbmF0b3IpOwoKCQkJCQlCZXN0UmVtYWluZGVyID0gKE51bWVyYXRvciAqIDE2KSAvIERlbm9taW5hdG9yOwoJCQkJCXdoaWxlICgtLUluZGV4ID49IDApIHsKCQkJCQkJUmVtYWluZGVyID0gKChEZW5vbWluYXRvciAtIE51bWVyYXRvcikgKiBTdHJldGNoTG9vcHNbSW5kZXhdKSAlCgkJCQkJCQlEZW5vbWluYXRvcjsKCQkJCQkJaWYgKFJlbWFpbmRlciA8IEJlc3RSZW1haW5kZXIpIHsKCQkJCQkJCWhvcnpfc3RyZXRjaF9sb29wID0gSW5kZXg7CgkJCQkJCQlpZiAoIShCZXN0UmVtYWluZGVyID0gUmVtYWluZGVyKSkKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKChob3J6X3N0cmV0Y2hfbG9vcCA+PSAwKSAmJiAhQmVzdFJlbWFpbmRlcikgewoJCQkJCQlpbnQgaG9yel9zdHJldGNoX3JhdGlvID0gMCwgQWNjdW11bGF0b3IgPSAwOwoJCQkJCQlpbnQgcmV1c2VfcHJldmlvdXMgPSAxOwoKCQkJCQkJSW5kZXggPSBTdHJldGNoTG9vcHNbaG9yel9zdHJldGNoX2xvb3BdOwoKCQkJCQkJd2hpbGUgKC0tSW5kZXggPj0gMCkgewoJCQkJCQkJaWYgKEFjY3VtdWxhdG9yID4gMCkKCQkJCQkJCQlob3J6X3N0cmV0Y2hfcmF0aW8gfD0gcmV1c2VfcHJldmlvdXM7CgkJCQkJCQllbHNlCgkJCQkJCQkJQWNjdW11bGF0b3IgKz0gRGVub21pbmF0b3I7CgkJCQkJCQlBY2N1bXVsYXRvciAtPSBOdW1lcmF0b3I7CgkJCQkJCQlyZXVzZV9wcmV2aW91cyA8PD0gMTsKCQkJCQkJfQoKCQkJCQkJY3J0Yy0+aG9yel9zdHJldGNoaW5nIHw9IChIT1JaX1NUUkVUQ0hfRU4gfAoJCQkJCQkJKChob3J6X3N0cmV0Y2hfbG9vcCAmIEhPUlpfU1RSRVRDSF9MT09QKSA8PCAxNikgfAoJCQkJCQkJKGhvcnpfc3RyZXRjaF9yYXRpbyAmIEhPUlpfU1RSRVRDSF9SQVRJTykpOwoJCQkJCQlicmVhazsgICAgICAvKiBPdXQgb2YgdGhlIGRvIHsgLi4uIH0gd2hpbGUgKDApICovCgkJCQkJfQoJCQkJfQoKCQkJCWNydGMtPmhvcnpfc3RyZXRjaGluZyB8PSAoSE9SWl9TVFJFVENIX01PREUgfCBIT1JaX1NUUkVUQ0hfRU4gfAoJCQkJCSgoKEhEaXNwbGF5ICogKEhPUlpfU1RSRVRDSF9CTEVORCArIDEpKSAvIHBhci0+bGNkX3dpZHRoKSAmIEhPUlpfU1RSRVRDSF9CTEVORCkpOwoJCQl9IHdoaWxlICgwKTsKCQl9CgoJCWlmICh2ZGlzcGxheSA8IHBhci0+bGNkX2hlaWdodCAmJiBjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pIHsKCQkJY3J0Yy0+dmVydF9zdHJldGNoaW5nID0gKFZFUlRfU1RSRVRDSF9VU0UwIHwgVkVSVF9TVFJFVENIX0VOIHwKCQkJCSgoKHZkaXNwbGF5ICogKFZFUlRfU1RSRVRDSF9SQVRJTzAgKyAxKSkgLyBwYXItPmxjZF9oZWlnaHQpICYgVkVSVF9TVFJFVENIX1JBVElPMCkpOwoKCQkJaWYgKCFNNjRfSEFTKExUX0xDRF9SRUdTKSAmJgoJCQkgICAgeHJlcyA8PSAoTTY0X0hBUyhNT0JJTF9CVVMpPzEwMjQ6ODAwKSkKCQkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggfD0gVkVSVF9TVFJFVENIX01PREU7CgkJfSBlbHNlIHsKCQkJLyoKCQkJICogRG9uJ3QgdXNlIHZlcnRpY2FsIGJsZW5kaW5nIGlmIHRoZSBtb2RlIGlzIHRvbyB3aWRlIG9yIG5vdAoJCQkgKiB2ZXJ0aWNhbGx5IHN0cmV0Y2hlZC4KCQkJICovCgkJCWNydGMtPnZlcnRfc3RyZXRjaGluZyA9IDA7CgkJfQoJCS8qIGNvcHkgdG8gc2hhZG93IGNydGMgKi8KCQljcnRjLT5zaGFkb3dfaF90b3RfZGlzcCA9IGNydGMtPmhfdG90X2Rpc3A7CgkJY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCA9IGNydGMtPmhfc3luY19zdHJ0X3dpZDsKCQljcnRjLT5zaGFkb3dfdl90b3RfZGlzcCA9IGNydGMtPnZfdG90X2Rpc3A7CgkJY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCA9IGNydGMtPnZfc3luY19zdHJ0X3dpZDsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCglpZiAoTTY0X0hBUyhNQUdJQ19GSUZPKSkgewoJCS8qIEZJWE1FOiBkaXNwbGF5IEZJRk8gbG93IHdhdGVybWFyayB2YWx1ZXMgKi8KCQljcnRjLT5nZW5fY250bCB8PSAoYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfRklGT19MV00pOwoJfQoJY3J0Yy0+ZHBfcGl4X3dpZHRoID0gZHBfcGl4X3dpZHRoOwoJY3J0Yy0+ZHBfY2hhaW5fbWFzayA9IGRwX2NoYWluX21hc2s7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2NydGNfdG9fdmFyKGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJdTMyIHhyZXMsIHlyZXMsIGJwcCwgbGVmdCwgcmlnaHQsIHVwcGVyLCBsb3dlciwgaHNsZW4sIHZzbGVuLCBzeW5jOwoJdTMyIGhfdG90YWwsIGhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19kbHksIGhfc3luY193aWQsCgkgICAgaF9zeW5jX3BvbDsKCXUzMiB2X3RvdGFsLCB2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfd2lkLCB2X3N5bmNfcG9sLCBjX3N5bmM7Cgl1MzIgcGl4X3dpZHRoOwoJdTMyIGRvdWJsZV9zY2FuLCBpbnRlcmxhY2U7CgoJLyogaW5wdXQgKi8KCWhfdG90YWwgPSBjcnRjLT5oX3RvdF9kaXNwICYgMHgxZmY7CgloX2Rpc3AgPSAoY3J0Yy0+aF90b3RfZGlzcCA+PiAxNikgJiAweGZmOwoJaF9zeW5jX3N0cnQgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkICYgMHhmZikgfCAoKGNydGMtPmhfc3luY19zdHJ0X3dpZCA+PiA0KSAmIDB4MTAwKTsKCWhfc3luY19kbHkgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDgpICYgMHg3OwoJaF9zeW5jX3dpZCA9IChjcnRjLT5oX3N5bmNfc3RydF93aWQgPj4gMTYpICYgMHgxZjsKCWhfc3luY19wb2wgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDIxKSAmIDB4MTsKCXZfdG90YWwgPSBjcnRjLT52X3RvdF9kaXNwICYgMHg3ZmY7Cgl2X2Rpc3AgPSAoY3J0Yy0+dl90b3RfZGlzcCA+PiAxNikgJiAweDdmZjsKCXZfc3luY19zdHJ0ID0gY3J0Yy0+dl9zeW5jX3N0cnRfd2lkICYgMHg3ZmY7Cgl2X3N5bmNfd2lkID0gKGNydGMtPnZfc3luY19zdHJ0X3dpZCA+PiAxNikgJiAweDFmOwoJdl9zeW5jX3BvbCA9IChjcnRjLT52X3N5bmNfc3RydF93aWQgPj4gMjEpICYgMHgxOwoJY19zeW5jID0gY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX0NTWU5DX0VOID8gMSA6IDA7CglwaXhfd2lkdGggPSBjcnRjLT5nZW5fY250bCAmIENSVENfUElYX1dJRFRIX01BU0s7Cglkb3VibGVfc2NhbiA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19EQkxfU0NBTl9FTjsKCWludGVybGFjZSA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19JTlRFUkxBQ0VfRU47CgoJLyogY29udmVydCAqLwoJeHJlcyA9IChoX2Rpc3AgKyAxKSAqIDg7Cgl5cmVzID0gdl9kaXNwICsgMTsKCWxlZnQgPSAoaF90b3RhbCAtIGhfc3luY19zdHJ0IC0gaF9zeW5jX3dpZCkgKiA4IC0gaF9zeW5jX2RseTsKCXJpZ2h0ID0gKGhfc3luY19zdHJ0IC0gaF9kaXNwKSAqIDggKyBoX3N5bmNfZGx5OwoJaHNsZW4gPSBoX3N5bmNfd2lkICogODsKCXVwcGVyID0gdl90b3RhbCAtIHZfc3luY19zdHJ0IC0gdl9zeW5jX3dpZDsKCWxvd2VyID0gdl9zeW5jX3N0cnQgLSB2X2Rpc3A7Cgl2c2xlbiA9IHZfc3luY193aWQ7CglzeW5jID0gKGhfc3luY19wb2wgPyAwIDogRkJfU1lOQ19IT1JfSElHSF9BQ1QpIHwKCSAgICAodl9zeW5jX3BvbCA/IDAgOiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpIHwKCSAgICAoY19zeW5jID8gRkJfU1lOQ19DT01QX0hJR0hfQUNUIDogMCk7CgoJc3dpdGNoIChwaXhfd2lkdGgpIHsKI2lmIDAKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfNEJQUDoKCQlicHAgPSA0OwoJCXZhci0+cmVkLm9mZnNldCA9IDA7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKI2VuZGlmCgljYXNlIENSVENfUElYX1dJRFRIXzhCUFA6CgkJYnBwID0gODsKCQl2YXItPnJlZC5vZmZzZXQgPSAwOwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzE1QlBQOgkvKiBSR0IgNTU1ICovCgkJYnBwID0gMTY7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7CgkJdmFyLT5yZWQubGVuZ3RoID0gNTsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA1OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfMTZCUFA6CS8qIFJHQiA1NjUgKi8KCQlicHAgPSAxNjsKCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKCQl2YXItPnJlZC5sZW5ndGggPSA1OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSBDUlRDX1BJWF9XSURUSF8yNEJQUDoJLyogUkdCIDg4OCAqLwoJCWJwcCA9IDI0OwoJCXZhci0+cmVkLm9mZnNldCA9IDE2OwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzMyQlBQOgkvKiBBUkdCIDg4ODggKi8KCQlicHAgPSAzMjsKCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKCQl2YXItPnJlZC5sZW5ndGggPSA4OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKCQlicmVhazsKCWRlZmF1bHQ6CgkJUFJJTlRLRSgiSW52YWxpZCBwaXhlbCB3aWR0aFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogb3V0cHV0ICovCgl2YXItPnhyZXMgPSB4cmVzOwoJdmFyLT55cmVzID0geXJlczsKCXZhci0+eHJlc192aXJ0dWFsID0gY3J0Yy0+dnhyZXM7Cgl2YXItPnlyZXNfdmlydHVhbCA9IGNydGMtPnZ5cmVzOwoJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGJwcDsKCXZhci0+bGVmdF9tYXJnaW4gPSBsZWZ0OwoJdmFyLT5yaWdodF9tYXJnaW4gPSByaWdodDsKCXZhci0+dXBwZXJfbWFyZ2luID0gdXBwZXI7Cgl2YXItPmxvd2VyX21hcmdpbiA9IGxvd2VyOwoJdmFyLT5oc3luY19sZW4gPSBoc2xlbjsKCXZhci0+dnN5bmNfbGVuID0gdnNsZW47Cgl2YXItPnN5bmMgPSBzeW5jOwoJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CgkvKiBJbiBkb3VibGUgc2NhbiBtb2RlLCB0aGUgdmVydGljYWwgcGFyYW1ldGVycyBhcmUgZG91YmxlZCwgc28gd2UgbmVlZCB0bwoJICAgaGFsZiB0aGVtIHRvIGdldCB0aGUgcmlnaHQgdmFsdWVzLgoJICAgSW4gaW50ZXJsYWNlZCBtb2RlIHRoZSB2YWx1ZXMgYXJlIGFscmVhZHkgY29ycmVjdCwgc28gbm8gY29ycmVjdGlvbiBpcwoJICAgbmVjZXNzYXJ5LgoJICovCglpZiAoaW50ZXJsYWNlKQoJCXZhci0+dm1vZGUgPSBGQl9WTU9ERV9JTlRFUkxBQ0VEOwoKCWlmIChkb3VibGVfc2NhbikgewoJCXZhci0+dm1vZGUgPSBGQl9WTU9ERV9ET1VCTEU7CgkJdmFyLT55cmVzPj49MTsKCQl2YXItPnVwcGVyX21hcmdpbj4+PTE7CgkJdmFyLT5sb3dlcl9tYXJnaW4+Pj0xOwoJCXZhci0+dnN5bmNfbGVuPj49MTsKCX0KCglyZXR1cm4gMDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludCBhdHlmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7Cgl1MzIgdG1wLCBwaXhjbG9jazsKCWludCBlcnI7CiNpZmRlZiBERUJVRwoJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlYnVnOwoJdTMyIHBpeGNsb2NrX2luX3BzOwojZW5kaWYKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglpZiAoKGVyciA9IGF0eV92YXJfdG9fY3J0YyhpbmZvLCB2YXIsICZwYXItPmNydGMpKSkKCQlyZXR1cm4gZXJyOwoKCXBpeGNsb2NrID0gYXR5ZmJfZ2V0X3BpeGNsb2NrKHZhciwgcGFyKTsKCglpZiAocGl4Y2xvY2sgPT0gMCkgewoJCVBSSU5US0UoIkludmFsaWQgcGl4Y2xvY2tcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfSBlbHNlIHsKCQlpZigoZXJyID0gcGFyLT5wbGxfb3BzLT52YXJfdG9fcGxsKGluZm8sIHBpeGNsb2NrLCB2YXItPmJpdHNfcGVyX3BpeGVsLCAmcGFyLT5wbGwpKSkKCQkJcmV0dXJuIGVycjsKCX0KCglwYXItPmFjY2VsX2ZsYWdzID0gdmFyLT5hY2NlbF9mbGFnczsgLyogaGFjayAqLwoKCWlmICh2YXItPmFjY2VsX2ZsYWdzKSB7CgkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBhdHlmYl9zeW5jOwoJCWluZm8tPmZsYWdzICY9IH5GQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKCX0gZWxzZSB7CgkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBOVUxMOwoJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOwoJfQoKCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCgkJd2FpdF9mb3JfaWRsZShwYXIpOwoKCWF0eV9zZXRfY3J0YyhwYXIsICZwYXItPmNydGMpOwoJcGFyLT5kYWNfb3BzLT5zZXRfZGFjKGluZm8sICZwYXItPnBsbCwgdmFyLT5iaXRzX3Blcl9waXhlbCwgcGFyLT5hY2NlbF9mbGFncyk7CglwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnBhci0+cGxsKTsKCiNpZmRlZiBERUJVRwoJaWYocGFyLT5wbGxfb3BzICYmIHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcikKCQlwaXhjbG9ja19pbl9wcyA9IHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcihpbmZvLCAmKHBhci0+cGxsKSk7CgllbHNlCgkJcGl4Y2xvY2tfaW5fcHMgPSAwOwoKCWlmKDAgPT0gcGl4Y2xvY2tfaW5fcHMpIHsKCQlQUklOVEtFKCJBTEVSVCBvcHMtPnBsbF90b192YXIgZ2V0IDBcbiIpOwoJCXBpeGNsb2NrX2luX3BzID0gcGl4Y2xvY2s7Cgl9CgoJbWVtc2V0KCZkZWJ1ZywgMCwgc2l6ZW9mKGRlYnVnKSk7CglpZighYXR5X2NydGNfdG9fdmFyKCYocGFyLT5jcnRjKSwgJmRlYnVnKSkgewoJCXUzMiBoU3luYywgdlJlZnJlc2g7CgkJdTMyIGhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19lbmQsIGhfdG90YWw7CgkJdTMyIHZfZGlzcCwgdl9zeW5jX3N0cnQsIHZfc3luY19lbmQsIHZfdG90YWw7CgoJCWhfZGlzcCA9IGRlYnVnLnhyZXM7CgkJaF9zeW5jX3N0cnQgPSBoX2Rpc3AgKyBkZWJ1Zy5yaWdodF9tYXJnaW47CgkJaF9zeW5jX2VuZCA9IGhfc3luY19zdHJ0ICsgZGVidWcuaHN5bmNfbGVuOwoJCWhfdG90YWwgPSBoX3N5bmNfZW5kICsgZGVidWcubGVmdF9tYXJnaW47CgkJdl9kaXNwID0gZGVidWcueXJlczsKCQl2X3N5bmNfc3RydCA9IHZfZGlzcCArIGRlYnVnLmxvd2VyX21hcmdpbjsKCQl2X3N5bmNfZW5kID0gdl9zeW5jX3N0cnQgKyBkZWJ1Zy52c3luY19sZW47CgkJdl90b3RhbCA9IHZfc3luY19lbmQgKyBkZWJ1Zy51cHBlcl9tYXJnaW47CgoJCWhTeW5jID0gMTAwMDAwMDAwMCAvIChwaXhjbG9ja19pbl9wcyAqIGhfdG90YWwpOwoJCXZSZWZyZXNoID0gKGhTeW5jICogMTAwMCkgLyB2X3RvdGFsOwogICAgICAgIAlpZiAocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19JTlRFUkxBQ0VfRU4pCiAgICAgICAgICAgIAl2UmVmcmVzaCAqPSAyOwogICAgICAgIAlpZiAocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19EQkxfU0NBTl9FTikKICAgICAgICAgICAgCXZSZWZyZXNoIC89IDI7CgoJCURQUklOVEsoImF0eWZiX3NldF9wYXJcbiIpOwoJCURQUklOVEsoIiBTZXQgVmlzaWJsZSBNb2RlIHRvICVpeCVpLSVpXG4iLCB2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CgkJRFBSSU5USygiIFZpcnR1YWwgcmVzb2x1dGlvbiAlaXglaSwgcGl4Y2xvY2tfaW5fcHMgJWkgKGNhbGN1bGF0ZWQgJWkpXG4iLAoJCQl2YXItPnhyZXNfdmlydHVhbCwgdmFyLT55cmVzX3ZpcnR1YWwsIHBpeGNsb2NrLCBwaXhjbG9ja19pbl9wcyk7CgkJRFBSSU5USygiIERvdCBjbG9jazogICAgICAgICAgICVpIE1IelxuIiwgMTAwMDAwMCAvIHBpeGNsb2NrX2luX3BzKTsKCQlEUFJJTlRLKCIgSG9yaXpvbnRhbCBzeW5jOiAgICAgJWkga0h6XG4iLCBoU3luYyk7CgkJRFBSSU5USygiIFZlcnRpY2FsIHJlZnJlc2g6ICAgICVpIEh6XG4iLCB2UmVmcmVzaCk7CgkJRFBSSU5USygiIHggIHN0eWxlOiAlaS4lMDNpICVpICVpICVpICVpICAgJWkgJWkgJWkgJWlcbiIsCgkJCTEwMDAwMDAgLyBwaXhjbG9ja19pbl9wcywgMTAwMDAwMCAlIHBpeGNsb2NrX2luX3BzLAoJCQloX2Rpc3AsIGhfc3luY19zdHJ0LCBoX3N5bmNfZW5kLCBoX3RvdGFsLAoJCQl2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfZW5kLCB2X3RvdGFsKTsKCQlEUFJJTlRLKCIgZmIgc3R5bGU6ICVpICAlaSAlaSAlaSAlaSAlaSAlaSAlaSAlaVxuIiwKCQkJcGl4Y2xvY2tfaW5fcHMsCgkJCWRlYnVnLmxlZnRfbWFyZ2luLCBoX2Rpc3AsIGRlYnVnLnJpZ2h0X21hcmdpbiwgZGVidWcuaHN5bmNfbGVuLAoJCQlkZWJ1Zy51cHBlcl9tYXJnaW4sIHZfZGlzcCwgZGVidWcubG93ZXJfbWFyZ2luLCBkZWJ1Zy52c3luY19sZW4pOwoJfQojZW5kaWYgLyogREVCVUcgKi8KCglpZiAoIU02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkvKiBEb24ndCBmb3JnZXQgTUVNX0NOVEwgKi8KCQl0bXAgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSAmIDB4ZjBmZmZmZmY7CgkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CgkJY2FzZSA4OgoJCQl0bXAgfD0gMHgwMjAwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSAxNjoKCQkJdG1wIHw9IDB4MDMwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzI6CgkJCXRtcCB8PSAweDA2MDAwMDAwOwoJCQlicmVhazsKCQl9CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHRtcCwgcGFyKTsKCX0gZWxzZSB7CgkJdG1wID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcikgJiAweGYwMGZmZmZmOwoJCWlmICghTTY0X0hBUyhNQUdJQ19QT1NURElWKSkKCQkJdG1wIHw9IHBhci0+bWVtX3JlZnJlc2hfcmF0ZSA8PCAyMDsKCQlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKCQljYXNlIDg6CgkJY2FzZSAyNDoKCQkJdG1wIHw9IDB4MDAwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXRtcCB8PSAweDA0MDAwMDAwOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQl0bXAgfD0gMHgwODAwMDAwMDsKCQkJYnJlYWs7CgkJfQoJCWlmIChNNjRfSEFTKENUX0JVUykpIHsKCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODcwMTAxODQsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDY4MDAwMGY5LCBwYXIpOwoJCX0gZWxzZSBpZiAoTTY0X0hBUyhWVF9CVVMpKSB7CgkJCWF0eV9zdF9sZTMyKERBQ19DTlRMLCAweDg3MDEwMTg0LCBwYXIpOwoJCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgMHg2ODAwMDBmOSwgcGFyKTsKCQl9IGVsc2UgaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkgewoJCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgMHg4MDAxMDEwMiwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoQlVTX0NOVEwsIDB4N2IzM2EwNDAgfCAocGFyLT5hdXhfc3RhcnQgPyBCVVNfQVBFUl9SRUdfRElTIDogMCksIHBhcik7CgkJfSBlbHNlIHsKCQkJLyogR1QgKi8KCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODYwMTAxMDIsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDdiMjNhMDQwIHwgKHBhci0+YXV4X3N0YXJ0ID8gQlVTX0FQRVJfUkVHX0RJUyA6IDApLCBwYXIpOwoJCQlhdHlfc3RfbGUzMihFWFRfTUVNX0NOVEwsIGF0eV9sZF9sZTMyKEVYVF9NRU1fQ05UTCwgcGFyKSB8IDB4NTAwMDAwMSwgcGFyKTsKCQl9CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHRtcCwgcGFyKTsKCX0KCWF0eV9zdF84KERBQ19NQVNLLCAweGZmLCBwYXIpOwoKCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbC84OwoJaW5mby0+Zml4LnZpc3VhbCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gOCA/CgkJRkJfVklTVUFMX1BTRVVET0NPTE9SIDogRkJfVklTVUFMX0RJUkVDVENPTE9SOwoKCS8qIEluaXRpYWxpemUgdGhlIGdyYXBoaWNzIGVuZ2luZSAqLwoJaWYgKHBhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlhdHlfaW5pdF9lbmdpbmUocGFyLCBpbmZvKTsKCiNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAoJYnRleHRfdXBkYXRlX2Rpc3BsYXkoaW5mby0+Zml4LnNtZW1fc3RhcnQsCgkJKCgocGFyLT5jcnRjLmhfdG90X2Rpc3AgPj4gMTYpICYgMHhmZikgKyAxKSAqIDgsCgkJKChwYXItPmNydGMudl90b3RfZGlzcCA+PiAxNikgJiAweDdmZikgKyAxLAoJCXZhci0+Yml0c19wZXJfcGl4ZWwsCgkJcGFyLT5jcnRjLnZ4cmVzICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOwojZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KI2lmIDAKCS8qIHN3aXRjaCB0byBhY2NlbGVyYXRvciBtb2RlICovCglpZiAoIShwYXItPmNydGMuZ2VuX2NudGwgJiBDUlRDX0VYVF9ESVNQX0VOKSkKCQlhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXItPmNydGMuZ2VuX2NudGwgfCBDUlRDX0VYVF9ESVNQX0VOLCBwYXIpOwojZW5kaWYKI2lmZGVmIERFQlVHCnsKCS8qIGR1bXAgbm9uIHNoYWRvdyBDUlRDLCBwbGwsIExDRCByZWdpc3RlcnMgKi8KCWludCBpOyB1MzIgYmFzZTsKCgkvKiBDUlRDIHJlZ2lzdGVycyAqLwoJYmFzZSA9IDB4MjAwMDsKCXByaW50aygiZGVidWcgYXR5ZmI6IE1hY2g2NCBub24tc2hhZG93IHJlZ2lzdGVyIHZhbHVlczoiKTsKCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgPSBpKzQpIHsKCQlpZihpJTE2ID09IDApIHByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDRYOiAiLCBiYXNlICsgaSk7CgkJcHJpbnRrKCIgJTA4WCIsIGF0eV9sZF9sZTMyKGksIHBhcikpOwoJfQoJcHJpbnRrKCJcblxuIik7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJLyogUExMIHJlZ2lzdGVycyAqLwoJYmFzZSA9IDB4MDA7CglwcmludGsoImRlYnVnIGF0eWZiOiBNYWNoNjQgUExMIHJlZ2lzdGVyIHZhbHVlczoiKTsKCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CgkJaWYoaSUxNiA9PSAwKSBwcmludGsoIlxuZGVidWcgYXR5ZmI6IDB4JTAyWDogIiwgYmFzZSArIGkpOwoJCWlmKGklNCA9PSAwKSAgcHJpbnRrKCIgIik7CgkJcHJpbnRrKCIlMDJYIiwgYXR5X2xkX3BsbF9jdChpLCBwYXIpKTsKCX0KCXByaW50aygiXG5cbiIpOwojZW5kaWYJLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJLyogTENEIHJlZ2lzdGVycyAqLwoJCWJhc2UgPSAweDAwOwoJCXByaW50aygiZGVidWcgYXR5ZmI6IExDRCByZWdpc3RlciB2YWx1ZXM6Iik7CgkJaWYoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgZm9yKGkgPSAwOyBpIDw9IFBPV0VSX01BTkFHRU1FTlQ7IGkrKykgewoJCQlpZihpID09IEVYVF9WRVJUX1NUUkVUQ0gpCgkJCSAgICBjb250aW51ZTsKCQkJcHJpbnRrKCJcbmRlYnVnIGF0eWZiOiAweCUwNFg6ICIsIGx0X2xjZF9yZWdzW2ldKTsKCQkJcHJpbnRrKCIgJTA4WCIsIGF0eV9sZF9sY2QoaSwgcGFyKSk7CgkJICAgIH0KCgkJfSBlbHNlIHsKCQkgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKCQkJaWYoaSU0ID09IDApIHByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDJYOiAiLCBiYXNlICsgaSk7CgkJCXByaW50aygiICUwOFgiLCBhdHlfbGRfbGNkKGksIHBhcikpOwoJCSAgICB9CgkJfQoJCXByaW50aygiXG5cbiIpOwoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwp9CiNlbmRpZiAvKiBERUJVRyAqLwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJaW50IGVycjsKCXN0cnVjdCBjcnRjIGNydGM7Cgl1bmlvbiBhdHlfcGxsIHBsbDsKCXUzMiBwaXhjbG9jazsKCgltZW1jcHkoJnBsbCwgJihwYXItPnBsbCksIHNpemVvZihwbGwpKTsKCglpZigoZXJyID0gYXR5X3Zhcl90b19jcnRjKGluZm8sIHZhciwgJmNydGMpKSkKCQlyZXR1cm4gZXJyOwoKCXBpeGNsb2NrID0gYXR5ZmJfZ2V0X3BpeGNsb2NrKHZhciwgcGFyKTsKCglpZiAocGl4Y2xvY2sgPT0gMCkgewoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkKCQkJUFJJTlRLRSgiSW52YWxpZCBwaXhjbG9ja1xuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9IGVsc2UgewoJCWlmKChlcnIgPSBwYXItPnBsbF9vcHMtPnZhcl90b19wbGwoaW5mbywgcGl4Y2xvY2ssIHZhci0+Yml0c19wZXJfcGl4ZWwsICZwbGwpKSkKCQkJcmV0dXJuIGVycjsKCX0KCglpZiAodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQoJCWluZm8tPnZhci5hY2NlbF9mbGFncyA9IEZCX0FDQ0VMRl9URVhUOwoJZWxzZQoJCWluZm8tPnZhci5hY2NlbF9mbGFncyA9IDA7CgojaWYgMCAvKiBmYm1vbiBpcyBub3QgZG9uZS4gdW5jb21tZW50IGZvciAyLjUueCAtYnJhZCAqLwoJaWYgKCFmYm1vbl92YWxpZF90aW1pbmdzKHBpeGNsb2NrLCBodG90YWwsIHZ0b3RhbCwgaW5mbykpCgkJcmV0dXJuIC1FSU5WQUw7CiNlbmRpZgoJYXR5X2NydGNfdG9fdmFyKCZjcnRjLCB2YXIpOwoJdmFyLT5waXhjbG9jayA9IHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcihpbmZvLCAmcGxsKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBzZXRfb2ZmX3BpdGNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXUzMiB4b2Zmc2V0ID0gaW5mby0+dmFyLnhvZmZzZXQ7Cgl1MzIgeW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwoJdTMyIHZ4cmVzID0gcGFyLT5jcnRjLnZ4cmVzOwoJdTMyIGJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKCglwYXItPmNydGMub2ZmX3BpdGNoID0gKCh5b2Zmc2V0ICogdnhyZXMgKyB4b2Zmc2V0KSAqIGJwcCAvIDY0KSB8ICh2eHJlcyA8PCAxOSk7Cn0KCgogICAgLyoKICAgICAqICBPcGVuL1JlbGVhc2UgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmICh1c2VyKSB7CgkJcGFyLT5vcGVuKys7CiNpZmRlZiBfX3NwYXJjX18KCQlwYXItPm1tYXBlZCA9IDA7CiNlbmRpZgoJfQoJcmV0dXJuICgwKTsKfQoKc3RhdGljIGlycXJldHVybl90IGF0eV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBkZXZfaWQ7CglpbnQgaGFuZGxlZCA9IDA7Cgl1MzIgaW50X2NudGw7CgoJc3Bpbl9sb2NrKCZwYXItPmludF9sb2NrKTsKCglpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcik7CgoJaWYgKGludF9jbnRsICYgQ1JUQ19WQkxBTktfSU5UKSB7CgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgKGludF9jbnRsICYgQ1JUQ19JTlRfRU5fTUFTSykgfCBDUlRDX1ZCTEFOS19JTlRfQUssIHBhcik7CgkJcGFyLT52YmxhbmsuY291bnQrKzsKCQlpZiAocGFyLT52YmxhbmsucGFuX2Rpc3BsYXkpIHsKCQkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCQl9CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYXItPnZibGFuay53YWl0KTsKCQloYW5kbGVkID0gMTsKCX0KCglzcGluX3VubG9jaygmcGFyLT5pbnRfbG9jayk7CgoJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cn0KCnN0YXRpYyBpbnQgYXR5X2VuYWJsZV9pcnEoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgcmVlbmFibGUpCnsKCXUzMiBpbnRfY250bDsKCglpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnBhci0+aXJxX2ZsYWdzKSkgewoJCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgYXR5X2lycSwgSVJRRl9TSEFSRUQsICJhdHlmYiIsIHBhcikpIHsKCQkJY2xlYXJfYml0KDAsICZwYXItPmlycV9mbGFncyk7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCQlzcGluX2xvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCQlpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcikgJiBDUlRDX0lOVF9FTl9NQVNLOwoJCS8qIGNsZWFyIGludGVycnVwdCAqLwoJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsIHwgQ1JUQ19WQkxBTktfSU5UX0FLLCBwYXIpOwoJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCB8IENSVENfVkJMQU5LX0lOVF9FTiwgcGFyKTsKCQlzcGluX3VubG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJfSBlbHNlIGlmIChyZWVuYWJsZSkgewoJCXNwaW5fbG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKSAmIENSVENfSU5UX0VOX01BU0s7CgkJaWYgKCEoaW50X2NudGwgJiBDUlRDX1ZCTEFOS19JTlRfRU4pKSB7CgkJCXByaW50aygiYXR5ZmI6IHNvbWVvbmUgZGlzYWJsZWQgSVJRIFslMDh4XVxuIiwgaW50X2NudGwpOwoJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0ICovCgkJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsIHwgQ1JUQ19WQkxBTktfSU5UX0VOLCBwYXIgKTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlfZGlzYWJsZV9pcnEoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7Cgl1MzIgaW50X2NudGw7CgoJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmcGFyLT5pcnFfZmxhZ3MpKSB7CgkJaWYgKHBhci0+dmJsYW5rLnBhbl9kaXNwbGF5KSB7CgkJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMDsKCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJfQoJCXNwaW5fbG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKSAmIENSVENfSU5UX0VOX01BU0s7CgkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCAmIH5DUlRDX1ZCTEFOS19JTlRfRU4sIHBhciApOwoJCXNwaW5fdW5sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7CgkJZnJlZV9pcnEocGFyLT5pcnEsIHBhcik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWlmICh1c2VyKSB7CgkJcGFyLT5vcGVuLS07CgkJbWRlbGF5KDEpOwoJCXdhaXRfZm9yX2lkbGUocGFyKTsKCQlpZiAoIXBhci0+b3BlbikgewojaWZkZWYgX19zcGFyY19fCgkJCWludCB3YXNfbW1hcGVkID0gcGFyLT5tbWFwZWQ7CgoJCQlwYXItPm1tYXBlZCA9IDA7CgoJCQlpZiAod2FzX21tYXBlZCkgewoJCQkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKCgkJCQkvKiBOb3cgcmVzZXQgdGhlIGRlZmF1bHQgZGlzcGxheSBjb25maWcsIHdlIGhhdmUgbm8KCQkJCSAqIGlkZWEgd2hhdCB0aGUgcHJvZ3JhbShzKSB3aGljaCBtbWFwJ2QgdGhlIGNoaXAgZGlkCgkJCQkgKiB0byB0aGUgY29uZmlndXJhdGlvbiwgbm9yIHdoZXRoZXIgaXQgcmVzdG9yZWQgaXQKCQkJCSAqIGNvcnJlY3RseS4KCQkJCSAqLwoJCQkJdmFyID0gZGVmYXVsdF92YXI7CgkJCQlpZiAobm9hY2NlbCkKCQkJCQl2YXIuYWNjZWxfZmxhZ3MgJj0gfkZCX0FDQ0VMRl9URVhUOwoJCQkJZWxzZQoJCQkJCXZhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKCQkJCWlmICh2YXIueXJlcyA9PSB2YXIueXJlc192aXJ0dWFsKSB7CgkJCQkJdTMyIHZpZGVvcmFtID0gKGluZm8tPmZpeC5zbWVtX2xlbiAtIChQQUdFX1NJWkUgPDwgMikpOwoJCQkJCXZhci55cmVzX3ZpcnR1YWwgPSAoKHZpZGVvcmFtICogOCkgLyB2YXIuYml0c19wZXJfcGl4ZWwpIC8gdmFyLnhyZXNfdmlydHVhbDsKCQkJCQlpZiAodmFyLnlyZXNfdmlydHVhbCA8IHZhci55cmVzKQoJCQkJCQl2YXIueXJlc192aXJ0dWFsID0gdmFyLnlyZXM7CgkJCQl9CgkJCX0KI2VuZGlmCgkJCWF0eV9kaXNhYmxlX2lycShwYXIpOwoJCX0KCX0KCXJldHVybiAoMCk7Cn0KCiAgICAvKgogICAgICogIFBhbiBvciBXcmFwIHRoZSBEaXNwbGF5CiAgICAgKgogICAgICogIFRoaXMgY2FsbCBsb29rcyBvbmx5IGF0IHhvZmZzZXQsIHlvZmZzZXQgYW5kIHRoZSBGQl9WTU9ERV9ZV1JBUCBmbGFnCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Cgl1MzIgeHJlcywgeXJlcywgeG9mZnNldCwgeW9mZnNldDsKCgl4cmVzID0gKCgocGFyLT5jcnRjLmhfdG90X2Rpc3AgPj4gMTYpICYgMHhmZikgKyAxKSAqIDg7Cgl5cmVzID0gKChwYXItPmNydGMudl90b3RfZGlzcCA+PiAxNikgJiAweDdmZikgKyAxOwoJaWYgKHBhci0+Y3J0Yy5nZW5fY250bCAmIENSVENfREJMX1NDQU5fRU4pCgkJeXJlcyA+Pj0gMTsKCXhvZmZzZXQgPSAodmFyLT54b2Zmc2V0ICsgNykgJiB+NzsKCXlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CglpZiAoeG9mZnNldCArIHhyZXMgPiBwYXItPmNydGMudnhyZXMgfHwgeW9mZnNldCArIHlyZXMgPiBwYXItPmNydGMudnlyZXMpCgkJcmV0dXJuIC1FSU5WQUw7CglpbmZvLT52YXIueG9mZnNldCA9IHhvZmZzZXQ7CglpbmZvLT52YXIueW9mZnNldCA9IHlvZmZzZXQ7CglpZiAocGFyLT5hc2xlZXApCgkJcmV0dXJuIDA7CgoJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJaWYgKCh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVkJMKSAmJiAhYXR5X2VuYWJsZV9pcnEocGFyLCAwKSkgewoJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMTsKCX0gZWxzZSB7CgkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXItPmNydGMub2ZmX3BpdGNoLCBwYXIpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eV93YWl0Zm9ydmJsYW5rKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGNydGMpCnsKCXN0cnVjdCBhdHlfaW50ZXJydXB0ICp2Ymw7Cgl1bnNpZ25lZCBpbnQgY291bnQ7CglpbnQgcmV0OwoKCXN3aXRjaCAoY3J0YykgewoJY2FzZSAwOgoJCXZibCA9ICZwYXItPnZibGFuazsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcmV0ID0gYXR5X2VuYWJsZV9pcnEocGFyLCAwKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCgljb3VudCA9IHZibC0+Y291bnQ7CglyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh2YmwtPndhaXQsIGNvdW50ICE9IHZibC0+Y291bnQsIEhaLzEwKTsKCWlmIChyZXQgPCAwKSB7CgkJcmV0dXJuIHJldDsKCX0KCWlmIChyZXQgPT0gMCkgewoJCWF0eV9lbmFibGVfaXJxKHBhciwgMSk7CgkJcmV0dXJuIC1FVElNRURPVVQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCgojaWZkZWYgREVCVUcKI2RlZmluZSBBVFlJT19DTEtSCQkweDQxNTQ1OTAwCS8qIEFUWVwwMCAqLwojZGVmaW5lIEFUWUlPX0NMS1cJCTB4NDE1NDU5MDEJLyogQVRZXDAxICovCgpzdHJ1Y3QgYXR5Y2xrIHsKCXUzMiByZWZfY2xrX3BlcjsKCXU4IHBsbF9yZWZfZGl2OwoJdTggbWNsa19mYl9kaXY7Cgl1OCBtY2xrX3Bvc3RfZGl2OwkvKiAxLDIsMyw0LDggKi8KCXU4IG1jbGtfZmJfbXVsdDsJLyogMiBvciA0ICovCgl1OCB4Y2xrX3Bvc3RfZGl2OwkvKiAxLDIsMyw0LDggKi8KCXU4IHZjbGtfZmJfZGl2OwoJdTggdmNsa19wb3N0X2RpdjsJLyogMSwyLDMsNCw2LDgsMTIgKi8KCXUzMiBkc3BfeGNsa3NfcGVyX3JvdzsJLyogMC0xNjM4MyAqLwoJdTMyIGRzcF9sb29wX2xhdGVuY3k7CS8qIDAtMTUgKi8KCXUzMiBkc3BfcHJlY2lzaW9uOwkvKiAwLTcgKi8KCXUzMiBkc3Bfb247CQkvKiAwLTIwNDcgKi8KCXUzMiBkc3Bfb2ZmOwkJLyogMC0yMDQ3ICovCn07CgojZGVmaW5lIEFUWUlPX0ZFQVRSCQkweDQxNTQ1OTAyCS8qIEFUWVwwMiAqLwojZGVmaW5lIEFUWUlPX0ZFQVRXCQkweDQxNTQ1OTAzCS8qIEFUWVwwMyAqLwojZW5kaWYKCiNpZm5kZWYgRkJJT19XQUlURk9SVlNZTkMKI2RlZmluZSBGQklPX1dBSVRGT1JWU1lOQyBfSU9XKCdGJywgMHgyMCwgX191MzIpCiNlbmRpZgoKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CiNpZmRlZiBfX3NwYXJjX18KCXN0cnVjdCBmYnR5cGUgZmJ0eXA7CiNlbmRpZgoKCXN3aXRjaCAoY21kKSB7CiNpZmRlZiBfX3NwYXJjX18KCWNhc2UgRkJJT0dUWVBFOgoJCWZidHlwLmZiX3R5cGUgPSBGQlRZUEVfUENJX0dFTkVSSUM7CgkJZmJ0eXAuZmJfd2lkdGggPSBwYXItPmNydGMudnhyZXM7CgkJZmJ0eXAuZmJfaGVpZ2h0ID0gcGFyLT5jcnRjLnZ5cmVzOwoJCWZidHlwLmZiX2RlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoJCWZidHlwLmZiX2Ntc2l6ZSA9IGluZm8tPmNtYXAubGVuOwoJCWZidHlwLmZiX3NpemUgPSBpbmZvLT5maXguc21lbV9sZW47CgkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGZidHlwZSBfX3VzZXIgKikgYXJnLCAmZmJ0eXAsIHNpemVvZihmYnR5cCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwoKCWNhc2UgRkJJT19XQUlURk9SVlNZTkM6CgkJewoJCQl1MzIgY3J0YzsKCgkJCWlmIChnZXRfdXNlcihjcnRjLCAoX191MzIgX191c2VyICopIGFyZykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCgkJCXJldHVybiBhdHlfd2FpdGZvcnZibGFuayhwYXIsIGNydGMpOwoJCX0KCQlicmVhazsKCiNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfQ1QpCgljYXNlIEFUWUlPX0NMS1I6CgkJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkJc3RydWN0IGF0eWNsayBjbGs7CgkJCXVuaW9uIGF0eV9wbGwgKnBsbCA9ICYocGFyLT5wbGwpOwoJCQl1MzIgZHNwX2NvbmZpZyA9IHBsbC0+Y3QuZHNwX2NvbmZpZzsKCQkJdTMyIGRzcF9vbl9vZmYgPSBwbGwtPmN0LmRzcF9vbl9vZmY7CgkJCWNsay5yZWZfY2xrX3BlciA9IHBhci0+cmVmX2Nsa19wZXI7CgkJCWNsay5wbGxfcmVmX2RpdiA9IHBsbC0+Y3QucGxsX3JlZl9kaXY7CgkJCWNsay5tY2xrX2ZiX2RpdiA9IHBsbC0+Y3QubWNsa19mYl9kaXY7CgkJCWNsay5tY2xrX3Bvc3RfZGl2ID0gcGxsLT5jdC5tY2xrX3Bvc3RfZGl2X3JlYWw7CgkJCWNsay5tY2xrX2ZiX211bHQgPSBwbGwtPmN0Lm1jbGtfZmJfbXVsdDsKCQkJY2xrLnhjbGtfcG9zdF9kaXYgPSBwbGwtPmN0LnhjbGtfcG9zdF9kaXZfcmVhbDsKCQkJY2xrLnZjbGtfZmJfZGl2ID0gcGxsLT5jdC52Y2xrX2ZiX2RpdjsKCQkJY2xrLnZjbGtfcG9zdF9kaXYgPSBwbGwtPmN0LnZjbGtfcG9zdF9kaXZfcmVhbDsKCQkJY2xrLmRzcF94Y2xrc19wZXJfcm93ID0gZHNwX2NvbmZpZyAmIDB4M2ZmZjsKCQkJY2xrLmRzcF9sb29wX2xhdGVuY3kgPSAoZHNwX2NvbmZpZyA+PiAxNikgJiAweGY7CgkJCWNsay5kc3BfcHJlY2lzaW9uID0gKGRzcF9jb25maWcgPj4gMjApICYgNzsKCQkJY2xrLmRzcF9vZmYgPSBkc3Bfb25fb2ZmICYgMHg3ZmY7CgkJCWNsay5kc3Bfb24gPSAoZHNwX29uX29mZiA+PiAxNikgJiAweDdmZjsKCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGF0eWNsayBfX3VzZXIgKikgYXJnLCAmY2xrLAoJCQkJCSBzaXplb2YoY2xrKSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQl9IGVsc2UKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEFUWUlPX0NMS1c6CgkJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkJc3RydWN0IGF0eWNsayBjbGs7CgkJCXVuaW9uIGF0eV9wbGwgKnBsbCA9ICYocGFyLT5wbGwpOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsaywgKHN0cnVjdCBhdHljbGsgX191c2VyICopIGFyZywgc2l6ZW9mKGNsaykpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXBhci0+cmVmX2Nsa19wZXIgPSBjbGsucmVmX2Nsa19wZXI7CgkJCXBsbC0+Y3QucGxsX3JlZl9kaXYgPSBjbGsucGxsX3JlZl9kaXY7CgkJCXBsbC0+Y3QubWNsa19mYl9kaXYgPSBjbGsubWNsa19mYl9kaXY7CgkJCXBsbC0+Y3QubWNsa19wb3N0X2Rpdl9yZWFsID0gY2xrLm1jbGtfcG9zdF9kaXY7CgkJCXBsbC0+Y3QubWNsa19mYl9tdWx0ID0gY2xrLm1jbGtfZmJfbXVsdDsKCQkJcGxsLT5jdC54Y2xrX3Bvc3RfZGl2X3JlYWwgPSBjbGsueGNsa19wb3N0X2RpdjsKCQkJcGxsLT5jdC52Y2xrX2ZiX2RpdiA9IGNsay52Y2xrX2ZiX2RpdjsKCQkJcGxsLT5jdC52Y2xrX3Bvc3RfZGl2X3JlYWwgPSBjbGsudmNsa19wb3N0X2RpdjsKCQkJcGxsLT5jdC5kc3BfY29uZmlnID0gKGNsay5kc3BfeGNsa3NfcGVyX3JvdyAmIDB4M2ZmZikgfAoJCQkJKChjbGsuZHNwX2xvb3BfbGF0ZW5jeSAmIDB4Zik8PDE2KXwgKChjbGsuZHNwX3ByZWNpc2lvbiAmIDcpPDwyMCk7CgkJCXBsbC0+Y3QuZHNwX29uX29mZiA9IChjbGsuZHNwX29mZiAmIDB4N2ZmKSB8ICgoY2xrLmRzcF9vbiAmIDB4N2ZmKTw8MTYpOwoJCQkvKmF0eV9jYWxjX3BsbF9jdChpbmZvLCAmcGxsLT5jdCk7Ki8KCQkJYXR5X3NldF9wbGxfY3QoaW5mbywgcGxsKTsKCQl9IGVsc2UKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEFUWUlPX0ZFQVRSOgoJCWlmIChnZXRfdXNlcihwYXItPmZlYXR1cmVzLCAodTMyIF9fdXNlciAqKSBhcmcpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgQVRZSU9fRkVBVFc6CgkJaWYgKHB1dF91c2VyKHBhci0+ZmVhdHVyZXMsICh1MzIgX191c2VyICopIGFyZykpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwojZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX0ZCX0FUWV9DVCAqLwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAocGFyLT5ibGl0dGVyX21heV9iZV9idXN5KQoJCXdhaXRfZm9yX2lkbGUocGFyKTsKCXJldHVybiAwOwp9CgojaWZkZWYgX19zcGFyY19fCnN0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXVuc2lnbmVkIGludCBzaXplLCBwYWdlLCBtYXBfc2l6ZSA9IDA7Cgl1bnNpZ25lZCBsb25nIG1hcF9vZmZzZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBvZmY7CglpbnQgaTsKCglpZiAoIXBhci0+bW1hcF9tYXApCgkJcmV0dXJuIC1FTlhJTzsKCglpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKQoJCXJldHVybiAtRUlOVkFMOwoKCW9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CgoJLyogVG8gc3RvcCB0aGUgc3dhcHBlciBmcm9tIGV2ZW4gY29uc2lkZXJpbmcgdGhlc2UgcGFnZXMuICovCgl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1JFU0VSVkVEKTsKCglpZiAoKCh2bWEtPnZtX3Bnb2ZmID09IDApICYmIChzaXplID09IGluZm8tPmZpeC5zbWVtX2xlbikpIHx8CgkgICAgKChvZmYgPT0gaW5mby0+Zml4LnNtZW1fbGVuKSAmJiAoc2l6ZSA9PSBQQUdFX1NJWkUpKSkKCQlvZmYgKz0gMHg4MDAwMDAwMDAwMDAwMDAwVUw7CgoJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOwkvKiBwcm9wYWdhdGUgb2ZmIGNoYW5nZXMgKi8KCgkvKiBFYWNoIHBhZ2UsIHNlZSB3aGljaCBtYXAgYXBwbGllcyAqLwoJZm9yIChwYWdlID0gMDsgcGFnZSA8IHNpemU7KSB7CgkJbWFwX3NpemUgPSAwOwoJCWZvciAoaSA9IDA7IHBhci0+bW1hcF9tYXBbaV0uc2l6ZTsgaSsrKSB7CgkJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBwYXItPm1tYXBfbWFwW2ldLnZvZmY7CgkJCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBwYXItPm1tYXBfbWFwW2ldLnNpemU7CgkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gb2ZmICsgcGFnZTsKCgkJCWlmIChzdGFydCA+IG9mZnNldCkKCQkJCWNvbnRpbnVlOwoJCQlpZiAob2Zmc2V0ID49IGVuZCkKCQkJCWNvbnRpbnVlOwoKCQkJbWFwX3NpemUgPSBwYXItPm1tYXBfbWFwW2ldLnNpemUgLSAob2Zmc2V0IC0gc3RhcnQpOwoJCQltYXBfb2Zmc2V0ID0KCQkJICAgIHBhci0+bW1hcF9tYXBbaV0ucG9mZiArIChvZmZzZXQgLSBzdGFydCk7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIW1hcF9zaXplKSB7CgkJCXBhZ2UgKz0gUEFHRV9TSVpFOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBhZ2UgKyBtYXBfc2l6ZSA+IHNpemUpCgkJCW1hcF9zaXplID0gc2l6ZSAtIHBhZ2U7CgoJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9CgkJICAgIH4ocGFyLT5tbWFwX21hcFtpXS5wcm90X21hc2spOwoJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IHBhci0+bW1hcF9tYXBbaV0ucHJvdF9mbGFnOwoKCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCArIHBhZ2UsCgkJCW1hcF9vZmZzZXQgPj4gUEFHRV9TSElGVCwgbWFwX3NpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKCQkJcmV0dXJuIC1FQUdBSU47CgoJCXBhZ2UgKz0gbWFwX3NpemU7Cgl9CgoJaWYgKCFtYXBfc2l6ZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoIXBhci0+bW1hcGVkKQoJCXBhci0+bW1hcGVkID0gMTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHsKCXUzMiB5b2Zmc2V0OwoJdTggclsyXVsyNTZdOwoJdTggZ1syXVsyNTZdOwoJdTggYlsyXVsyNTZdOwp9IGF0eWZiX3NhdmU7CgpzdGF0aWMgdm9pZCBhdHlmYl9zYXZlX3BhbGV0dGUoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgZW50ZXIpCnsKCWludCBpLCB0bXA7CgoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJdG1wID0gYXR5X2xkXzgoREFDX0NOVEwsIHBhcikgJiAweGZjOwoJCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJCXRtcCB8PSAweDI7CgkJYXR5X3N0XzgoREFDX0NOVEwsIHRtcCwgcGFyKTsKCQlhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCgkJd3JpdGViKGksICZwYXItPmF0eV9jbWFwX3JlZ3MtPnJpbmRleCk7CgkJYXR5ZmJfc2F2ZS5yW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJYXR5ZmJfc2F2ZS5nW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJYXR5ZmJfc2F2ZS5iW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJd3JpdGViKGksICZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCk7CgkJd3JpdGViKGF0eWZiX3NhdmUuclsxIC0gZW50ZXJdW2ldLAoJCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJCXdyaXRlYihhdHlmYl9zYXZlLmdbMSAtIGVudGVyXVtpXSwKCQkgICAgICAgJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCQl3cml0ZWIoYXR5ZmJfc2F2ZS5iWzEgLSBlbnRlcl1baV0sCgkJICAgICAgICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGF0eWZiX3BhbGV0dGUoaW50IGVudGVyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBGQl9NQVg7IGkrKykgewoJCWluZm8gPSByZWdpc3RlcmVkX2ZiW2ldOwoJCWlmIChpbmZvICYmIGluZm8tPmZib3BzID09ICZhdHlmYl9vcHMpIHsKCQkJcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJCQkKCQkJYXR5ZmJfc2F2ZV9wYWxldHRlKHBhciwgZW50ZXIpOwoJCQlpZiAoZW50ZXIpIHsKCQkJCWF0eWZiX3NhdmUueW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSAwOwoJCQkJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJCQl9IGVsc2UgewoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSBhdHlmYl9zYXZlLnlvZmZzZXQ7CgkJCQlzZXRfb2ZmX3BpdGNoKHBhciwgaW5mbyk7CgkJCX0KCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJCWJyZWFrOwoJCX0KCX0KfQojZW5kaWYgLyogX19zcGFyY19fICovCgoKCiNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKQoKLyogUG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcy4gVGhvc2UgYXJlIHVzZWQgZm9yIFBvd2VyQm9vayBzbGVlcC4KICovCnN0YXRpYyBpbnQgYXR5X3Bvd2VyX21nbXQoaW50IHNsZWVwLCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBwbTsKCWludCB0aW1lb3V0OwoKCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJcG0gPSAocG0gJiB+UFdSX01HVF9NT0RFX01BU0spIHwgUFdSX01HVF9NT0RFX1JFRzsKCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CglwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCgl0aW1lb3V0ID0gMjAwMDsKCWlmIChzbGVlcCkgewoJCS8qIFNsZWVwICovCgkJcG0gJj0gflBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtICY9IH4oUFdSX0JMT04gfCBBVVRPX1BXUl9VUCk7CgkJcG0gfD0gU1VTUEVORF9OT1c7CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtIHw9IFBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlkbyB7CgkJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCQltZGVsYXkoMSk7CgkJCWlmICgoLS10aW1lb3V0KSA9PSAwKQoJCQkJYnJlYWs7CgkJfSB3aGlsZSAoKHBtICYgUFdSX01HVF9TVEFUVVNfTUFTSykgIT0gUFdSX01HVF9TVEFUVVNfU1VTUEVORCk7Cgl9IGVsc2UgewoJCS8qIFdha2V1cCAqLwoJCXBtICY9IH5QV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSAmPSB+U1VTUEVORF9OT1c7CgkJcG0gfD0gKFBXUl9CTE9OIHwgQVVUT19QV1JfVVApOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSB8PSBQV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJZG8gewoJCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQkJbWRlbGF5KDEpOwoJCQlpZiAoKC0tdGltZW91dCkgPT0gMCkKCQkJCWJyZWFrOwoJCX0gd2hpbGUgKChwbSAmIFBXUl9NR1RfU1RBVFVTX01BU0spICE9IDApOwoJfQoJbWRlbGF5KDUwMCk7CgoJcmV0dXJuIHRpbWVvdXQgPyAwIDogLUVJTzsKfQoKc3RhdGljIGludCBhdHlmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCiNpZm5kZWYgQ09ORklHX1BQQ19QTUFDCgkvKiBIQUNLIEFMRVJUICEgT25jZSBJIGZpbmQgYSBwcm9wZXIgd2F5IHRvIHNheSB0byBlYWNoIGRyaXZlcgoJICogaW5kaXZpZHVhbGx5IHdoYXQgd2lsbCBoYXBwZW4gd2l0aCBpdCdzIFBDSSBzbG90LCBJJ2xsIGNoYW5nZQoJICogdGhhdC4gT24gbGFwdG9wcywgdGhlIEFHUCBzbG90IGlzIGp1c3QgdW5jbG9ja2VkLCBzbyBEMiBpcwoJICogZXhwZWN0ZWQsIHdoaWxlIG9uIGRlc2t0b3BzLCB0aGUgY2FyZCBpcyBwb3dlcmVkIG9mZgoJICovCglyZXR1cm4gMDsKI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwoKCWlmIChzdGF0ZS5ldmVudCA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCgkJcmV0dXJuIDA7CgoJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwoKCWZiX3NldF9zdXNwZW5kKGluZm8sIDEpOwoKCS8qIElkbGUgJiByZXNldCBlbmdpbmUgKi8KCXdhaXRfZm9yX2lkbGUocGFyKTsKCWF0eV9yZXNldF9lbmdpbmUocGFyKTsKCgkvKiBCbGFuayBkaXNwbGF5IGFuZCBMQ0QgKi8KCWF0eWZiX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTiwgaW5mbyk7CgoJcGFyLT5hc2xlZXAgPSAxOwoJcGFyLT5sb2NrX2JsYW5rID0gMTsKCgkvKiBTZXQgY2hpcCB0byAic3VzcGVuZCIgbW9kZSAqLwoJaWYgKGF0eV9wb3dlcl9tZ210KDEsIHBhcikpIHsKCQlwYXItPmFzbGVlcCA9IDA7CgkJcGFyLT5sb2NrX2JsYW5rID0gMDsKCQlhdHlmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgkJcmV0dXJuIC1FSU87Cgl9CgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCgkJcmV0dXJuIDA7CgoJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwoKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gMikKCQlhdHlfcG93ZXJfbWdtdCgwLCBwYXIpOwoJcGFyLT5hc2xlZXAgPSAwOwoKCS8qIFJlc3RvcmUgZGlzcGxheSAqLwoJYXR5ZmJfc2V0X3BhcihpbmZvKTsKCgkvKiBSZWZyZXNoICovCglmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCgkvKiBVbmJsYW5rICovCglwYXItPmxvY2tfYmxhbmsgPSAwOwoJYXR5ZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZiAvKiAgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KCi8qIEJhY2tsaWdodCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKI2RlZmluZSBNQVhfTEVWRUwgMHhGRgoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YTsKCi8qIENhbGwgd2l0aCBmYl9pbmZvLT5ibF9tdXRleCBoZWxkICovCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IGxldmVsKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IGF0eWxldmVsOwoKCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KCWF0eWxldmVsID0gaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTDsKCglpZiAoYXR5bGV2ZWwgPCAwKQoJCWF0eWxldmVsID0gMDsKCWVsc2UgaWYgKGF0eWxldmVsID4gTUFYX0xFVkVMKQoJCWF0eWxldmVsID0gTUFYX0xFVkVMOwoKCXJldHVybiBhdHlsZXZlbDsKfQoKLyogQ2FsbCB3aXRoIGZiX2luZm8tPmJsX211dGV4IGhlbGQgKi8Kc3RhdGljIGludCBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOwoJdW5zaWduZWQgaW50IHJlZyA9IGF0eV9sZF9sY2QoTENEX01JU0NfQ05UTCwgcGFyKTsKCWludCBsZXZlbDsKCglpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CgkgICAgYmQtPnByb3BzLT5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQoJCWxldmVsID0gMDsKCWVsc2UKCQlsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKCglyZWcgfD0gKEJMTU9EX0VOIHwgQklBU01PRF9FTik7CglpZiAobGV2ZWwgPiAwKSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKCX0gZWxzZSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgMCkgPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOwoJfQoJYXR5X3N0X2xjZChMQ0RfTUlTQ19DTlRMLCByZWcsIHBhcik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IHJldDsKCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglyZXQgPSBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGJkKTsKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJcmV0dXJuIGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKfQoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YSA9IHsKCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCgkuZ2V0X2JyaWdodG5lc3MgPSBhdHlfYmxfZ2V0X2JyaWdodG5lc3MsCgkudXBkYXRlX3N0YXR1cwk9IGF0eV9ibF91cGRhdGVfc3RhdHVzLAoJLm1heF9icmlnaHRuZXNzID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKfTsKCnN0YXRpYyB2b2lkIGF0eV9ibF9zZXRfcG93ZXIoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBwb3dlcikKewoJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCWlmIChpbmZvLT5ibF9kZXYpIHsKCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CgkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBwb3dlcjsKCQlfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CgkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKCX0KCgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2luaXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOwoJY2hhciBuYW1lWzEyXTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCWlmICghcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoImF0aSIpKQoJCXJldHVybjsKI2VuZGlmCgoJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiYXR5YmwlZCIsIGluZm8tPm5vZGUpOwoKCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZhdHlfYmxfZGF0YSk7CglpZiAoSVNfRVJSKGJkKSkgewoJCWluZm8tPmJsX2RldiA9IE5VTEw7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXR5OiBCYWNrbGlnaHQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CgkJZ290byBlcnJvcjsKCX0KCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglpbmZvLT5ibF9kZXYgPSBiZDsKCWZiX2JsX2RlZmF1bHRfY3VydmUoaW5mbywgMCwKCQkweDNGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCwKCQkweEZGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKCglkb3duKCZiZC0+c2VtKTsKCWJkLT5wcm9wcy0+YnJpZ2h0bmVzcyA9IGF0eV9ibF9kYXRhLm1heF9icmlnaHRuZXNzOwoJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CgliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOwoJdXAoJmJkLT5zZW0pOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwoJaWYgKCFwbWFjX2JhY2tsaWdodCkKCQlwbWFjX2JhY2tsaWdodCA9IGJkOwoJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CiNlbmRpZgoKCXByaW50aygiYXR5OiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CgoJcmV0dXJuOwoKZXJyb3I6CglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkIGF0eV9ibF9leGl0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCgoJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOwoJaWYgKGluZm8tPmJsX2RldikgewojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgkJaWYgKHBtYWNfYmFja2xpZ2h0ID09IGluZm8tPmJsX2RldikKCQkJcG1hY19iYWNrbGlnaHQgPSBOVUxMOwojZW5kaWYKCgkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmJsX2Rldik7CgoJCXByaW50aygiYXR5OiBCYWNrbGlnaHQgdW5sb2FkZWRcbiIpOwoJfQoJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCn0KCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVCAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGF0eV9jYWxjX21lbV9yZWZyZXNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IHhjbGspCnsKCWNvbnN0IGludCByYWdlcHJvX3RibFtdID0gewoJCTQ0LCA1MCwgNTUsIDY2LCA3NSwgODAsIDEwMAoJfTsKCWNvbnN0IGludCByYWdleGxfdGJsW10gPSB7CgkJNTAsIDY2LCA3NSwgODMsIDkwLCA5NSwgMTAwLCAxMDUsCgkJMTEwLCAxMTUsIDEyMCwgMTI1LCAxMzMsIDE0MywgMTY2Cgl9OwoJY29uc3QgaW50ICpyZWZyZXNoX3RibDsKCWludCBpLCBzaXplOwoKCWlmIChJU19YTChwYXItPnBjaV9pZCkgfHwgSVNfTU9CSUxJVFkocGFyLT5wY2lfaWQpKSB7CgkJcmVmcmVzaF90YmwgPSByYWdleGxfdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2V4bF90YmwpOwoJfSBlbHNlIHsKCQlyZWZyZXNoX3RibCA9IHJhZ2Vwcm9fdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2Vwcm9fdGJsKTsKCX0KCglmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewoJCWlmICh4Y2xrIDwgcmVmcmVzaF90YmxbaV0pCgkJYnJlYWs7Cgl9CglwYXItPm1lbV9yZWZyZXNoX3JhdGUgPSBpOwp9CgogICAgLyoKICAgICAqICBJbml0aWFsaXNhdGlvbgogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX2luZm8gKmZiX2xpc3QgPSBOVUxMOwoKI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfZ2V0X3RpbWluZ3NfZnJvbV9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLAoJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJaW50IHJldCA9IC1FSU5WQUw7CgoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDAgJiYgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewoJCSp2YXIgPSBkZWZhdWx0X3ZhcjsKCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbCA9IHBhci0+bGNkX2hkaXNwOwoJCXZhci0+cmlnaHRfbWFyZ2luID0gcGFyLT5sY2RfcmlnaHRfbWFyZ2luOwoJCXZhci0+bGVmdF9tYXJnaW4gPSBwYXItPmxjZF9oYmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX3JpZ2h0X21hcmdpbiArIHBhci0+bGNkX2hzeW5jX2RseSArCgkJCSBwYXItPmxjZF9oc3luY19sZW4pOwoJCXZhci0+aHN5bmNfbGVuID0gcGFyLT5sY2RfaHN5bmNfbGVuICsgcGFyLT5sY2RfaHN5bmNfZGx5OwoJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsID0gcGFyLT5sY2RfdmRpc3A7CgkJdmFyLT5sb3dlcl9tYXJnaW4gPSBwYXItPmxjZF9sb3dlcl9tYXJnaW47CgkJdmFyLT51cHBlcl9tYXJnaW4gPSBwYXItPmxjZF92YmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX2xvd2VyX21hcmdpbiArIHBhci0+bGNkX3ZzeW5jX2xlbik7CgkJdmFyLT52c3luY19sZW4gPSBwYXItPmxjZF92c3luY19sZW47CgkJdmFyLT5waXhjbG9jayA9IHBhci0+bGNkX3BpeGNsb2NrOwoJCXJldCA9IDA7Cgl9CgoJcmV0dXJuIHJldDsKfQojZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWNvbnN0IGNoYXIgKnJhbW5hbWUgPSBOVUxMLCAqeHRhbDsKCWludCBndGJfbWVtc2l6ZSwgaGFzX3ZhciA9IDA7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwoJdTggcGxsX3JlZl9kaXY7Cgl1MzIgaTsKI2lmIGRlZmluZWQoQ09ORklHX1BQQykKCWludCBzZW5zZTsKI2VuZGlmCgoJaW5pdF93YWl0cXVldWVfaGVhZCgmcGFyLT52Ymxhbmsud2FpdCk7CglzcGluX2xvY2tfaW5pdCgmcGFyLT5pbnRfbG9jayk7CgoJcGFyLT5hdHlfY21hcF9yZWdzID0KCSAgICAoc3RydWN0IGF0eV9jbWFwX3JlZ3MgX19pb21lbSAqKSAocGFyLT5hdGlfcmVnYmFzZSArIDB4YzApOwoKI2lmZGVmIENPTkZJR19QUENfUE1BQwoJLyogVGhlIEFwcGxlIGlCb29rMSB1c2VzIG5vbi1zdGFuZGFyZCBtZW1vcnkgZnJlcXVlbmNpZXMuIFdlIGRldGVjdCBpdAoJICogYW5kIHNldCB0aGUgZnJlcXVlbmN5IG1hbnVhbGx5LiAqLwoJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMiwxIikpIHsKCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDcwOwoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNTM7Cgl9CiNlbmRpZgoJaWYgKHBsbCkKCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IHBsbDsKCWlmIChtY2xrKQoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gbWNsazsKCWlmICh4Y2xrKQoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0geGNsazsKCglhdHlfY2FsY19tZW1fcmVmcmVzaChwYXIsIHBhci0+cGxsX2xpbWl0cy54Y2xrKTsKCXBhci0+cGxsX3BlciA9IDEwMDAwMDAvcGFyLT5wbGxfbGltaXRzLnBsbF9tYXg7CglwYXItPm1jbGtfcGVyID0gMTAwMDAwMC9wYXItPnBsbF9saW1pdHMubWNsazsKCXBhci0+eGNsa19wZXIgPSAxMDAwMDAwL3Bhci0+cGxsX2xpbWl0cy54Y2xrOwoKCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMTQzMTgxODA7Cgl4dGFsID0gIjE0LjMxODE4IjsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCglpZiAoIU02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQl1MzIgc3RhdDA7CgkJdTggZGFjX3R5cGUsIGRhY19zdWJ0eXBlLCBjbGtfdHlwZTsKCQlzdGF0MCA9IGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKTsKCQlwYXItPmJ1c190eXBlID0gKHN0YXQwID4+IDApICYgMHgwNzsKCQlwYXItPnJhbV90eXBlID0gKHN0YXQwID4+IDMpICYgMHgwNzsKCQlyYW1uYW1lID0gYXR5X2d4X3JhbVtwYXItPnJhbV90eXBlXTsKCQkvKiBGSVhNRTogY2xvY2tjaGlwL1JBTURBQyBwcm9iaW5nPyAqLwoJCWRhY190eXBlID0gKGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpID4+IDE2KSAmIDB4MDc7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljbGtfdHlwZSA9IENMS19BVEkxODgxOF8xOwoJCWRhY190eXBlID0gKHN0YXQwID4+IDkpICYgMHgwNzsKCQlpZiAoZGFjX3R5cGUgPT0gMHgwNykKCQkJZGFjX3N1YnR5cGUgPSBEQUNfQVRUMjBDNDA4OwoJCWVsc2UKCQkJZGFjX3N1YnR5cGUgPSAoYXR5X2xkXzgoU0NSQVRDSF9SRUcxICsgMSwgcGFyKSAmIDB4RjApIHwgZGFjX3R5cGU7CiNlbHNlCgkJZGFjX3R5cGUgPSBEQUNfSUJNUkdCNTE0OwoJCWRhY19zdWJ0eXBlID0gREFDX0lCTVJHQjUxNDsKCQljbGtfdHlwZSA9IENMS19JQk1SR0I1MTQ7CiNlbmRpZgoJCXN3aXRjaCAoZGFjX3N1YnR5cGUpIHsKCQljYXNlIERBQ19JQk1SR0I1MTQ6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2libTUxNDsKCQkJYnJlYWs7CgkJY2FzZSBEQUNfQVRJNjg4NjBfQjoKCQljYXNlIERBQ19BVEk2ODg2MF9DOgoJCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY19hdGk2ODg2MGI7CgkJCWJyZWFrOwoJCWNhc2UgREFDX0FUVDIwQzQwODoKCQljYXNlIERBQ19BVFQyMUM0OTg6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2F0dDIxYzQ5ODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJUFJJTlRLSSgiYXR5X2luaXQ6IERBQyB0eXBlIG5vdCBpbXBsZW1lbnRlZCB5ZXQhXG4iKTsKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCQlzd2l0Y2ggKGNsa190eXBlKSB7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljYXNlIENMS19BVEkxODgxOF8xOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdGkxODgxOF8xOwoJCQlicmVhazsKI2Vsc2UKCQljYXNlIENMS19JQk1SR0I1MTQ6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2libTUxNDsKCQkJYnJlYWs7CiNlbmRpZgojaWYgMCAvKiBkZWFkIGNvZGUgKi8KCQljYXNlIENMS19TVEcxNzAzOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9zdGcxNzAzOwoJCQlicmVhazsKCQljYXNlIENMS19DSDgzOTg6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2NoODM5ODsKCQkJYnJlYWs7CgkJY2FzZSBDTEtfQVRUMjBDNDA4OgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdHQyMGM0MDg7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlQUklOVEtJKCJhdHlfaW5pdDogQ0xLIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfY3Q7CgkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfY3Q7CgkJcGFyLT5idXNfdHlwZSA9IFBDSTsKCQlwYXItPnJhbV90eXBlID0gKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKSAmIDB4MDcpOwoJCXJhbW5hbWUgPSBhdHlfY3RfcmFtW3Bhci0+cmFtX3R5cGVdOwoJCS8qIGZvciBtYW55IGNoaXBzLCB0aGUgbWNsayBpcyA2NyBNSHogZm9yIFNEUkFNLCA2MyBNSHogb3RoZXJ3aXNlICovCgkJaWYgKHBhci0+cGxsX2xpbWl0cy5tY2xrID09IDY3ICYmIHBhci0+cmFtX3R5cGUgPCBTRFJBTSkKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2MzsKCX0KCglpZiAoTTY0X0hBUyhHVEJfRFNQKQoJICAgICYmIChwbGxfcmVmX2RpdiA9IGF0eV9sZF9wbGxfY3QoUExMX1JFRl9ESVYsIHBhcikpKSB7CgkJaW50IGRpZmYxLCBkaWZmMjsKCQlkaWZmMSA9IDUxMCAqIDE0IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKCQlkaWZmMiA9IDUxMCAqIDI5IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKCQlpZiAoZGlmZjEgPCAwKQoJCQlkaWZmMSA9IC1kaWZmMTsKCQlpZiAoZGlmZjIgPCAwKQoJCQlkaWZmMiA9IC1kaWZmMjsKCQlpZiAoZGlmZjIgPCBkaWZmMSkgewoJCQlwYXItPnJlZl9jbGtfcGVyID0gMTAwMDAwMDAwMDAwMFVMTCAvIDI5NDk4OTI4OwoJCQl4dGFsID0gIjI5LjQ5ODkyOCI7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKCS8qIHNhdmUgcHJldmlvdXMgdmlkZW8gbW9kZSAqLwoJYXR5X2dldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJaWYocGFyLT5wbGxfb3BzLT5nZXRfcGxsKQoJCXBhci0+cGxsX29wcy0+Z2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCglpID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CglndGJfbWVtc2l6ZSA9IE02NF9IQVMoR1RCX0RTUCk7CglpZiAoZ3RiX21lbXNpemUpCgkJc3dpdGNoIChpICYgMHhGKSB7CS8qIDB4RiB1c2VkIGluc3RlYWQgb2YgTUVNX1NJWkVfQUxJQVMgKi8KCQljYXNlIE1FTV9TSVpFXzUxMks6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMU06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MTAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzJNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfNE1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TV9HVEI6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzhNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7Cgl9IGVsc2UKCQlzd2l0Y2ggKGkgJiBNRU1fU0laRV9BTElBUykgewoJCWNhc2UgTUVNX1NJWkVfNTEySzoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8xTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgxMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMk06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzRNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfOE06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDAwOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwOwoJCX0KCglpZiAoTTY0X0hBUyhNQUdJQ19WUkFNX1NJWkUpKSB7CgkJaWYgKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMSwgcGFyKSAmIDB4NDAwMDAwMDApCgkJCWluZm8tPmZpeC5zbWVtX2xlbiArPSAweDQwMDAwMDsKCX0KCglpZiAodnJhbSkgewoJCWluZm8tPmZpeC5zbWVtX2xlbiA9IHZyYW0gKiAxMDI0OwoJCWkgPSBpICYgfihndGJfbWVtc2l6ZSA/IDB4RiA6IE1FTV9TSVpFX0FMSUFTKTsKCQlpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4ODAwMDApCgkJCWkgfD0gTUVNX1NJWkVfNTEySzsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgxMDAwMDApCgkJCWkgfD0gTUVNX1NJWkVfMU07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4MjAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfMk1fR1RCIDogTUVNX1NJWkVfMk07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NDAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNE1fR1RCIDogTUVNX1NJWkVfNE07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NjAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNk1fR1RCIDogTUVNX1NJWkVfNk07CgkJZWxzZQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfOE1fR1RCIDogTUVNX1NJWkVfOE07CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIGksIHBhcik7Cgl9CgoJLyoKCSAqICBSZWcgQmxvY2sgMCAoQ1QtY29tcGF0aWJsZSBibG9jaykgaXMgYXQgbW1pb19zdGFydAoJICogIFJlZyBCbG9jayAxIChtdWx0aW1lZGlhIGV4dGVuc2lvbnMpIGlzIGF0IG1taW9fc3RhcnQgLSAweDQwMAoJICovCglpZiAoTTY0X0hBUyhHWCkpIHsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDQwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1g7Cgl9IGVsc2UgaWYgKE02NF9IQVMoQ1QpKSB7CgkJaW5mby0+Zml4Lm1taW9fbGVuID0gMHg0MDA7CgkJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfQVRJX01BQ0g2NENUOwoJfSBlbHNlIGlmIChNNjRfSEFTKFZUKSkgewoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0IC09IDB4NDAwOwoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4ODAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRWVDsKCX0gZWxzZSB7LyogR1QgKi8KCQlpbmZvLT5maXgubW1pb19zdGFydCAtPSAweDQwMDsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDgwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1Q7Cgl9CgoJUFJJTlRLSSgiJWQlYyAlcywgJXMgTUh6IFhUQUwsICVkIE1IeiBQTEwsICVkIE1oeiBNQ0xLLCAlZCBNSHogWENMS1xuIiwKCSAgICAgICBpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMCA/IDUxMiA6IChpbmZvLT5maXguc21lbV9sZW4gPj4gMjApLAoJICAgICAgIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwID8gJ0snIDogJ00nLCByYW1uYW1lLCB4dGFsLCBwYXItPnBsbF9saW1pdHMucGxsX21heCwKCSAgICAgICBwYXItPnBsbF9saW1pdHMubWNsaywgcGFyLT5wbGxfbGltaXRzLnhjbGspOwoKI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0FUWV9DVCkKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJaW50IGk7CgkJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogQlVTX0NOVEwgREFDX0NOVEwgTUVNX0NOVEwgRVhUX01FTV9DTlRMIENSVENfR0VOX0NOVEwgIgoJCSAgICAgICAiRFNQX0NPTkZJRyBEU1BfT05fT0ZGIENMT0NLX0NOVExcbiIKCQkgICAgICAgImRlYnVnIGF0eWZiOiAlMDh4ICUwOHggJTA4eCAlMDh4ICAgICAlMDh4ICAgICAgJTA4eCAgICUwOHggICAlMDh4XG4iCgkJICAgICAgICJkZWJ1ZyBhdHlmYjogUExMIiwKCQkJYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhciksIGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSwgYXR5X2xkX2xlMzIoRVhUX01FTV9DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpLCBhdHlfbGRfbGUzMihEU1BfQ09ORklHLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihEU1BfT05fT0ZGLCBwYXIpLCBhdHlfbGRfbGUzMihDTE9DS19DTlRMLCBwYXIpKTsKCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKCQkJcHJpbnRrKCIgJTAyeCIsIGF0eV9sZF9wbGxfY3QoaSwgcGFyKSk7CgkJcHJpbnRrKCJcbiIpOwoJfQojZW5kaWYKCWlmKHBhci0+cGxsX29wcy0+aW5pdF9wbGwpCgkJcGFyLT5wbGxfb3BzLT5pbml0X3BsbChpbmZvLCAmcGFyLT5wbGwpOwoKCS8qCgkgKiAgTGFzdCBwYWdlIG9mIDggTUIgKDQgTUIgb24gSVNBKSBhcGVydHVyZSBpcyBNTUlPCgkgKiAgRklYTUU6IHdlIHNob3VsZCB1c2UgdGhlIGF1eGlsaWFyeSBhcGVydHVyZSBpbnN0ZWFkIHNvIHdlIGNhbiBhY2Nlc3MKCSAqICB0aGUgZnVsbCA4IE1CIG9mIHZpZGVvIFJBTSBvbiA4IE1CIGJvYXJkcwoJICovCgoJaWYgKCFwYXItPmF1eF9zdGFydCAmJgoJCShpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMDAgfHwgKHBhci0+YnVzX3R5cGUgPT0gSVNBICYmIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDQwMDAwMCkpKQoJCWluZm8tPmZpeC5zbWVtX2xlbiAtPSBHVUlfUkVTRVJWRTsKCgkvKgoJICogIERpc2FibGUgcmVnaXN0ZXIgYWNjZXNzIHRocm91Z2ggdGhlIGxpbmVhciBhcGVydHVyZQoJICogIGlmIHRoZSBhdXhpbGlhcnkgYXBlcnR1cmUgaXMgdXNlZCBzbyB3ZSBjYW4gYWNjZXNzCgkgKiAgdGhlIGZ1bGwgOCBNQiBvZiB2aWRlbyBSQU0gb24gOCBNQiBib2FyZHMuCgkgKi8KCWlmIChwYXItPmF1eF9zdGFydCkKCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhcikgfCBCVVNfQVBFUl9SRUdfRElTLCBwYXIpOwoKI2lmZGVmIENPTkZJR19NVFJSCglwYXItPm10cnJfYXBlciA9IC0xOwoJcGFyLT5tdHJyX3JlZyA9IC0xOwoJaWYgKCFub210cnIpIHsKCQkvKiBDb3ZlciB0aGUgd2hvbGUgcmVzb3VyY2UuICovCgkJIHBhci0+bXRycl9hcGVyID0gbXRycl9hZGQocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUsIE1UUlJfVFlQRV9XUkNPTUIsIDEpOwoJCSBpZiAocGFyLT5tdHJyX2FwZXIgPj0gMCAmJiAhcGFyLT5hdXhfc3RhcnQpIHsKCQkJLyogTWFrZSBhIGhvbGUgZm9yIG1taW8uICovCgkJCXBhci0+bXRycl9yZWcgPSBtdHJyX2FkZChwYXItPnJlc19zdGFydCArIDB4ODAwMDAwIC0gR1VJX1JFU0VSVkUsCgkJCQlHVUlfUkVTRVJWRSwgTVRSUl9UWVBFX1VOQ0FDSEFCTEUsIDEpOwoJCQlpZiAocGFyLT5tdHJyX3JlZyA8IDApIHsKCQkJCW10cnJfZGVsKHBhci0+bXRycl9hcGVyLCAwLCAwKTsKCQkJCXBhci0+bXRycl9hcGVyID0gLTE7CgkJCX0KCQkgfQoJfQojZW5kaWYKCglpbmZvLT5mYm9wcyA9ICZhdHlmYl9vcHM7CglpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBzZXVkb19wYWxldHRlOwoJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCAgICAgICAgICAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9ZUEFOOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJaWYgKE02NF9IQVMoRzNfUEJfMV8xKSAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazEsMSIpKSB7CgkJLyogdGhlc2UgYml0cyBsZXQgdGhlIDEwMSBwb3dlcmJvb2sgd2FrZSB1cCBmcm9tIHNsZWVwIC0tIHBhdWx1cyAqLwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpCgkJCSAgIHwgKFVTRV9GMzJLSFogfCBUUklTVEFURV9NRU1fRU4pLCBwYXIpOwoJfSBlbHNlCiNlbmRpZgoJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkgewojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCQlhdHlfYmxfaW5pdCAocGFyKTsKI2VuZGlmCgl9CgoJbWVtc2V0KCZ2YXIsIDAsIHNpemVvZih2YXIpKTsKI2lmZGVmIENPTkZJR19QUEMKCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgewoJCS8qCgkJICogIEZJWE1FOiBUaGUgTlZSQU0gc3R1ZmYgc2hvdWxkIGJlIHB1dCBpbiBhIE1hYy1zcGVjaWZpYyBmaWxlLCBhcyBpdAoJCSAqICAgICAgICAgYXBwbGllcyB0byBhbGwgTWFjIHZpZGVvIGNhcmRzCgkJICovCgkJaWYgKG1vZGUpIHsKCQkJaWYgKG1hY19maW5kX21vZGUoJnZhciwgaW5mbywgbW9kZSwgOCkpCgkJCQloYXNfdmFyID0gMTsKCQl9IGVsc2UgewoJCQlpZiAoZGVmYXVsdF92bW9kZSA9PSBWTU9ERV9DSE9PU0UpIHsKCQkJCWlmIChNNjRfSEFTKEczX1BCXzEwMjR4NzY4KSkKCQkJCQkvKiBHMyBQb3dlckJvb2sgd2l0aCAxMDI0eDc2OCBMQ0QgKi8KCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfMTAyNF83NjhfNjA7CgkJCQllbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoImlNYWMiKSkKCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfMTAyNF83NjhfNzU7CgkJCQllbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUKCQkJCQkgKCJQb3dlckJvb2syLDEiKSkKCQkJCQkvKiBpQm9vayB3aXRoIDgwMHg2MDAgTENEICovCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzgwMF82MDBfNjA7CgkJCQllbHNlCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzY0MF80ODBfNjc7CgkJCQlzZW5zZSA9IHJlYWRfYXR5X3NlbnNlKHBhcik7CgkJCQlQUklOVEtJKCJtb25pdG9yIHNlbnNlPSV4LCBtb2RlICVkXG4iLAoJCQkJCXNlbnNlLCAgbWFjX21hcF9tb25pdG9yX3NlbnNlKHNlbnNlKSk7CgkJCX0KCQkJaWYgKGRlZmF1bHRfdm1vZGUgPD0gMCB8fCBkZWZhdWx0X3Ztb2RlID4gVk1PREVfTUFYKQoJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzY0MF80ODBfNjA7CgkJCWlmIChkZWZhdWx0X2Ntb2RlIDwgQ01PREVfOCB8fCBkZWZhdWx0X2Ntb2RlID4gQ01PREVfMzIpCgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfODsKCQkJaWYgKCFtYWNfdm1vZGVfdG9fdmFyKGRlZmF1bHRfdm1vZGUsIGRlZmF1bHRfY21vZGUsCgkJCQkJICAgICAgICZ2YXIpKQoJCQkJaGFzX3ZhciA9IDE7CgkJfQoJfQoKI2VuZGlmIC8qICFDT05GSUdfUFBDICovCgojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQoJaWYgKCFhdHlmYl9nZXRfdGltaW5nc19mcm9tX2xjZChwYXIsICZ2YXIpKQoJCWhhc192YXIgPSAxOwojZW5kaWYKCglpZiAobW9kZSAmJiBmYl9maW5kX21vZGUoJnZhciwgaW5mbywgbW9kZSwgTlVMTCwgMCwgJmRlZm1vZGUsIDgpKQoJCWhhc192YXIgPSAxOwoKCWlmICghaGFzX3ZhcikKCQl2YXIgPSBkZWZhdWx0X3ZhcjsKCglpZiAobm9hY2NlbCkKCQl2YXIuYWNjZWxfZmxhZ3MgJj0gfkZCX0FDQ0VMRl9URVhUOwoJZWxzZQoJCXZhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKCglpZiAoY29tcF9zeW5jICE9IC0xKSB7CgkJaWYgKCFjb21wX3N5bmMpCgkJCXZhci5zeW5jICY9IH5GQl9TWU5DX0NPTVBfSElHSF9BQ1Q7CgkJZWxzZQoJCQl2YXIuc3luYyB8PSBGQl9TWU5DX0NPTVBfSElHSF9BQ1Q7Cgl9CgoJaWYgKHZhci55cmVzID09IHZhci55cmVzX3ZpcnR1YWwpIHsKCQl1MzIgdmlkZW9yYW0gPSAoaW5mby0+Zml4LnNtZW1fbGVuIC0gKFBBR0VfU0laRSA8PCAyKSk7CgkJdmFyLnlyZXNfdmlydHVhbCA9ICgodmlkZW9yYW0gKiA4KSAvIHZhci5iaXRzX3Blcl9waXhlbCkgLyB2YXIueHJlc192aXJ0dWFsOwoJCWlmICh2YXIueXJlc192aXJ0dWFsIDwgdmFyLnlyZXMpCgkJCXZhci55cmVzX3ZpcnR1YWwgPSB2YXIueXJlczsKCX0KCglpZiAoYXR5ZmJfY2hlY2tfdmFyKCZ2YXIsIGluZm8pKSB7CgkJUFJJTlRLRSgiY2FuJ3Qgc2V0IGRlZmF1bHQgdmlkZW8gbW9kZVxuIik7CgkJZ290byBhdHlfaW5pdF9leGl0OwoJfQoKI2lmZGVmIF9fc3BhcmNfXwoJYXR5ZmJfc2F2ZV9wYWxldHRlKHBhciwgMCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWlmICghbm9hY2NlbCAmJiBNNjRfSEFTKElOVEVHUkFURUQpKQoJCWF0eV9pbml0X2N1cnNvcihpbmZvKTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCWluZm8tPnZhciA9IHZhcjsKCglmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOwoKCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCgkJZ290byBhdHlfaW5pdF9leGl0OwoKCWZiX2xpc3QgPSBpbmZvOwoKCVBSSU5US0koImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2Ugb24gJXNcbiIsCgkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCBuYW1lKTsKCXJldHVybiAwOwoKYXR5X2luaXRfZXhpdDoKCS8qIHJlc3RvcmUgdmlkZW8gbW9kZSAqLwoJYXR5X3NldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJcGFyLT5wbGxfb3BzLT5zZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKI2lmZGVmIENPTkZJR19NVFJSCglpZiAocGFyLT5tdHJyX3JlZyA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX3JlZywgMCwgMCk7CgkgICAgcGFyLT5tdHJyX3JlZyA9IC0xOwoJfQoJaWYgKHBhci0+bXRycl9hcGVyID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfYXBlciwgMCwgMCk7CgkgICAgcGFyLT5tdHJyX2FwZXIgPSAtMTsKCX0KI2VuZGlmCglyZXR1cm4gLTE7Cn0KCiNpZmRlZiBDT05GSUdfQVRBUkkKc3RhdGljIGludCBfX2RldmluaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQp7CgljaGFyICpwOwoJdW5zaWduZWQgbG9uZyB2bWVtYmFzZSwgc2l6ZSwgZ3VpcmVnYmFzZTsKCglQUklOVEtJKCJzdG9yZV92aWRlb19wYXIoKSAnJXMnIFxuIiwgdmlkZW9fc3RyKTsKCglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJdm1lbWJhc2UgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKCWlmICghKHAgPSBzdHJzZXAoJnZpZGVvX3N0ciwgIjsiKSkgfHwgISpwKQoJCWdvdG8gbWFjaDY0X2ludmFsaWQ7CglzaXplID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJZ3VpcmVnYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSB2bWVtYmFzZTsKCXBoeXNfc2l6ZVttNjRfbnVtXSA9IHNpemU7CglwaHlzX2d1aXJlZ2Jhc2VbbTY0X251bV0gPSBndWlyZWdiYXNlOwoJUFJJTlRLSSgic3RvcmVkIHRoZW0gYWxsOiAkJTA4bFggJCUwOGxYICQlMDhsWCBcbiIsIHZtZW1iYXNlLCBzaXplLAoJICAgICAgIGd1aXJlZ2Jhc2UpOwoJcmV0dXJuIDA7CgogICAgICBtYWNoNjRfaW52YWxpZDoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSAwOwoJcmV0dXJuIC0xOwp9CiNlbmRpZiAvKiBDT05GSUdfQVRBUkkgKi8KCiAgICAvKgogICAgICogIEJsYW5rIHRoZSBkaXNwbGF5LgogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiBnZW5fY250bDsKCglpZiAocGFyLT5sb2NrX2JsYW5rIHx8IHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCglpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwpCgkJYXR5X2JsX3NldF9wb3dlcihpbmZvLCBGQl9CTEFOS19QT1dFUkRPV04pOwojZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCglpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwgJiYKCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJdTMyIHBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXBtICY9IH5QV1JfQkxPTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJfQojZW5kaWYKCglnZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7Cglzd2l0Y2ggKGJsYW5rKSB7CiAgICAgICAgCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKCQkJZ2VuX2NudGwgJj0gfjB4NDAwMDA0YzsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19OT1JNQUw6CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0MDsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNDg7CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQ0OwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDRjOwoJCQlicmVhazsKCX0KCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGdlbl9jbnRsLCBwYXIpOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCglpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKQoJCWF0eV9ibF9zZXRfcG93ZXIoaW5mbywgRkJfQkxBTktfVU5CTEFOSyk7CiNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKCWlmIChwYXItPmxjZF90YWJsZSAmJiBibGFuayA8PSBGQl9CTEFOS19OT1JNQUwgJiYKCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJdTMyIHBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXBtIHw9IFBXUl9CTE9OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7Cgl9CiNlbmRpZgoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBhdHlfc3RfcGFsKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKI2lmZGVmIENPTkZJR19BVEFSSQoJb3V0XzgoJnBhci0+YXR5X2NtYXBfcmVncy0+d2luZGV4LCByZWdubyk7CglvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIHJlZCk7CglvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIGdyZWVuKTsKCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCwgYmx1ZSk7CiNlbHNlCgl3cml0ZWIocmVnbm8sICZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCk7Cgl3cml0ZWIocmVkLCAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJd3JpdGViKGdyZWVuLCAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJd3JpdGViKGJsdWUsICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CiNlbmRpZgp9CgogICAgLyoKICAgICAqICBTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlIGFscmVhZHkKICAgICAqICByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzIChhY2NvcmRpbmcgdG8gdGhlCiAgICAgKiAgZW50cmllcyBpbiB0aGUgdmFyIHN0cnVjdHVyZSkuIFJldHVybiAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgogICAgICogICEhIDQgJiA4ID0gIFBTRVVETywgPiA4ID0gRElSRUNUQ09MT1IKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgl1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglpbnQgaSwgZGVwdGg7Cgl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOwoKCWRlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoJaWYgKGRlcHRoID09IDE2KQoJCWRlcHRoID0gKGluZm8tPnZhci5ncmVlbi5sZW5ndGggPT0gNSkgPyAxNSA6IDE2OwoKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglpZiAocmVnbm8gPiAyNTUgfHwKCSAgICAoZGVwdGggPT0gMTYgJiYgcmVnbm8gPiA2MykgfHwKCSAgICAoZGVwdGggPT0gMTUgJiYgcmVnbm8gPiAzMSkpCgkJcmV0dXJuIDE7CgoJcmVkID4+PSA4OwoJZ3JlZW4gPj49IDg7CglibHVlID4+PSA4OwoKCXBhci0+cGFsZXR0ZVtyZWdub10ucmVkID0gcmVkOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ibHVlID0gYmx1ZTsKCglpZiAocmVnbm8gPCAxNikgewoJCXN3aXRjaCAoZGVwdGgpIHsKCQljYXNlIDE1OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDEwKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDE2OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDExKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDI0OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDE2KSB8IChyZWdubyA8PCA4KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQlpID0gKHJlZ25vIDw8IDgpIHwgcmVnbm87CgkJCXBhbFtyZWdub10gPSAoaSA8PCAxNikgfCBpOwoJCQlicmVhazsKCQl9Cgl9CgoJaSA9IGF0eV9sZF84KERBQ19DTlRMLCBwYXIpICYgMHhmYzsKCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJaSB8PSAweDI7IC8qIERBQ19DTlRMIHwgMHgyIHR1cm5zIG9mZiB0aGUgZXh0cmEgYnJpZ2h0bmVzcyBmb3IgZ3QgKi8KCWF0eV9zdF84KERBQ19DTlRMLCBpLCBwYXIpOwoJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CgoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlpZiAoZGVwdGggPT0gMTYpIHsKCQkJaWYgKHJlZ25vIDwgMzIpCgkJCQlhdHlfc3RfcGFsKHJlZ25vIDw8IDMsIHJlZCwKCQkJCQkgICBwYXItPnBhbGV0dGVbcmVnbm88PDFdLmdyZWVuLAoJCQkJCSAgIGJsdWUsIHBhcik7CgkJCXJlZCA9IHBhci0+cGFsZXR0ZVtyZWdubz4+MV0ucmVkOwoJCQlibHVlID0gcGFyLT5wYWxldHRlW3JlZ25vPj4xXS5ibHVlOwoJCQlyZWdubyA8PD0gMjsKCQl9IGVsc2UgaWYgKGRlcHRoID09IDE1KSB7CgkJCXJlZ25vIDw8PSAzOwoJCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKCQkJICAgIGF0eV9zdF9wYWwocmVnbm8gKyBpLCByZWQsIGdyZWVuLCBibHVlLCBwYXIpOwoJCQl9CgkJfQoJfQoJYXR5X3N0X3BhbChyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgcGFyKTsKCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QQ0kKCiNpZmRlZiBfX3NwYXJjX18KCmV4dGVybiB2b2lkICgqcHJvbV9wYWxldHRlKSAoaW50KTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwX3NwYXJjKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAoJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBhZGRyKQp7CglleHRlcm4gaW50IGNvbl9pc19wcmVzZW50KHZvaWQpOwoKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7CgljaGFyIHByb3BbMTI4XTsKCWludCBub2RlLCBsZW4sIGksIGosIHJldDsKCXUzMiBtZW0sIGNoaXBfaWQ7CgoJLyogRG8gbm90IGF0dGFjaCB3aGVuIHdlIGhhdmUgYSBzZXJpYWwgY29uc29sZS4gKi8KCWlmICghY29uX2lzX3ByZXNlbnQoKSkKCQlyZXR1cm4gLUVOWElPOwoKCS8qCgkgKiBNYXAgbWVtb3J5LW1hcHBlZCByZWdpc3RlcnMuCgkgKi8KCXBhci0+YXRpX3JlZ2Jhc2UgPSAodm9pZCAqKWFkZHIgKyAweDdmZmMwMFVMOwoJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBhZGRyICsgMHg3ZmZjMDBVTDsKCgkvKgoJICogTWFwIGluIGJpZy1lbmRpYW4gYXBlcnR1cmUuCgkgKi8KCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIgKikgKGFkZHIgKyAweDgwMDAwMFVMKTsKCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gYWRkciArIDB4ODAwMDAwVUw7CgoJLyoKCSAqIEZpZ3VyZSBtbWFwIGFkZHJlc3NlcyBmcm9tIFBDSSBjb25maWcgc3BhY2UuCgkgKiBTcGxpdCBGcmFtZWJ1ZmZlciBpbiBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIGhhbGZzLgoJICovCglmb3IgKGkgPSAwOyBpIDwgNiAmJiBwZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsgaSsrKQoJCS8qIG5vdGhpbmcgKi8gOwoJaiA9IGkgKyA0OwoKCXBhci0+bW1hcF9tYXAgPSBrbWFsbG9jKGogKiBzaXplb2YoKnBhci0+bW1hcF9tYXApLCBHRlBfQVRPTUlDKTsKCWlmICghcGFyLT5tbWFwX21hcCkgewoJCVBSSU5US0UoImF0eWZiX3NldHVwX3NwYXJjKCkgY2FuJ3QgYWxsb2MgbW1hcF9tYXBcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbWVtc2V0KHBhci0+bW1hcF9tYXAsIDAsIGogKiBzaXplb2YoKnBhci0+bW1hcF9tYXApKTsKCglmb3IgKGkgPSAwLCBqID0gMjsgaSA8IDYgJiYgcGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7IGkrKykgewoJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07CgkJaW50IGlvLCBicmVnID0gUENJX0JBU0VfQUREUkVTU18wICsgKGkgPDwgMik7CgkJdW5zaWduZWQgbG9uZyBiYXNlOwoJCXUzMiBzaXplLCBwYmFzZTsKCgkJYmFzZSA9IHJwLT5zdGFydDsKCgkJaW8gPSAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9JTyk7CgoJCXNpemUgPSBycC0+ZW5kIC0gYmFzZSArIDE7CgoJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBicmVnLCAmcGJhc2UpOwoKCQlpZiAoaW8pCgkJCXNpemUgJj0gfjE7CgoJCS8qCgkJICogTWFwIHRoZSBmcmFtZWJ1ZmZlciBhIHNlY29uZCB0aW1lLCB0aGlzIHRpbWUgd2l0aG91dAoJCSAqIHRoZSBicmFpbmRlYWQgX1BBR0VfSUUgc2V0dGluZy4gVGhpcyBpcyB1c2VkIGJ5IHRoZQoJCSAqIGZpeGVkIFhzZXJ2ZXIsIGJ1dCB3ZSBuZWVkIHRvIG1haW50YWluIHRoZSBvbGQgbWFwcGluZwoJCSAqIHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIG9sZGVyIG9uZXMuLi4KCQkgKi8KCQlpZiAoYmFzZSA9PSBhZGRyKSB7CgkJCXBhci0+bW1hcF9tYXBbal0udm9mZiA9IChwYmFzZSArIDB4MTAwMDAwMDApICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSBiYXNlICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0U7CgkJCWorKzsKCQl9CgoJCS8qCgkJICogSGVyZSBjb21lcyB0aGUgb2xkIGZyYW1lYnVmZmVyIG1hcHBpbmcgd2l0aCBfUEFHRV9JRQoJCSAqIHNldCBmb3IgdGhlIGJpZyBlbmRpYW4gaGFsZiBvZiB0aGUgZnJhbWVidWZmZXIuLi4KCQkgKi8KCQlpZiAoYmFzZSA9PSBhZGRyKSB7CgkJCXBhci0+bW1hcF9tYXBbal0udm9mZiA9IChwYmFzZSArIDB4ODAwMDAwKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5wb2ZmID0gKGJhc2UgKyAweDgwMDAwMCkgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IDB4ODAwMDAwOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0UgfCBfUEFHRV9JRTsKCQkJc2l6ZSAtPSAweDgwMDAwMDsKCQkJaisrOwoJCX0KCgkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gcGJhc2UgJiBQQUdFX01BU0s7CgkJcGFyLT5tbWFwX21hcFtqXS5wb2ZmID0gYmFzZSAmIFBBR0VfTUFTSzsKCQlwYXItPm1tYXBfbWFwW2pdLnNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spICYgUEFHRV9NQVNLOwoJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJcGFyLT5tbWFwX21hcFtqXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwoJCWorKzsKCX0KCglpZigocmV0ID0gY29ycmVjdF9jaGlwc2V0KHBhcikpKQoJCXJldHVybiByZXQ7CgoJaWYgKElTX1hMKHBkZXYtPmRldmljZSkpIHsKCQkvKgoJCSAqIEZpeCBQUk9NcyBpZGVhIG9mIE1FTV9DTlRMIHNldHRpbmdzLi4uCgkJICovCgkJbWVtID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CgkJY2hpcF9pZCA9IGF0eV9sZF9sZTMyKENPTkZJR19DSElQX0lELCBwYXIpOwoJCWlmICgoKGNoaXBfaWQgJiBDRkdfQ0hJUF9UWVBFKSA9PSBWVF9DSElQX0lEKSAmJiAhKChjaGlwX2lkID4+IDI0KSAmIDEpKSB7CgkJCXN3aXRjaCAobWVtICYgMHgwZikgewoJCQljYXNlIDM6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCAyOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDM7CgkJCQlicmVhazsKCQkJY2FzZSA5OgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgNDsKCQkJCWJyZWFrOwoJCQljYXNlIDExOgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgNTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKChhdHlfbGRfbGUzMihDT05GSUdfU1RBVDAsIHBhcikgJiA3KSA+PSBTRFJBTSkKCQkJCW1lbSAmPSB+KDB4MDA3MDAwMDApOwoJCX0KCQltZW0gJj0gfigweGNmODBlMDAwKTsJLyogVHVybiBvZmYgYWxsIHVuZG9jdW1lbnRlZCBiaXRzLiAqLwoJCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCBtZW0sIHBhcik7Cgl9CgoJLyoKCSAqIElmIHRoaXMgaXMgdGhlIGNvbnNvbGUgZGV2aWNlLCB3ZSB3aWxsIHNldCBkZWZhdWx0IHZpZGVvCgkgKiBzZXR0aW5ncyB0byB3aGF0IHRoZSBQUk9NIGxlZnQgdXMgd2l0aC4KCSAqLwoJbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwoJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgImFsaWFzZXMiKTsKCWlmIChub2RlKSB7CgkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAic2NyZWVuIiwgcHJvcCwgc2l6ZW9mKHByb3ApKTsKCQlpZiAobGVuID4gMCkgewoJCQlwcm9wW2xlbl0gPSAnXDAnOwoJCQlub2RlID0gcHJvbV9maW5kZGV2aWNlKHByb3ApOwoJCX0gZWxzZQoJCQlub2RlID0gMDsKCX0KCglwY3AgPSBwZGV2LT5zeXNkYXRhOwoJaWYgKG5vZGUgPT0gcGNwLT5wcm9tX25vZGUtPm5vZGUpIHsKCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZkZWZhdWx0X3ZhcjsKCQl1bnNpZ25lZCBpbnQgTiwgUCwgUSwgTSwgVCwgUjsKCQl1MzIgdl90b3RhbCwgaF90b3RhbDsKCQlzdHJ1Y3QgY3J0YyBjcnRjOwoJCXU4IHBsbF9yZWdzWzE2XTsKCQl1OCBjbG9ja19jbnRsOwoKCQljcnRjLnZ4cmVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJ3aWR0aCIsIDEwMjQpOwoJCWNydGMudnlyZXMgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImhlaWdodCIsIDc2OCk7CgkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiZGVwdGgiLCA4KTsKCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwoJCWNydGMuaF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMuaF9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIHBhcik7CgkJY3J0Yy52X3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy52X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCQlhdHlfY3J0Y190b192YXIoJmNydGMsIHZhcik7CgoJCWhfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuICsgdmFyLT5sZWZ0X21hcmdpbjsKCQl2X3RvdGFsID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbiArIHZhci0+dXBwZXJfbWFyZ2luOwoKCQkvKgoJCSAqIFJlYWQgdGhlIFBMTCB0byBmaWd1cmUgYWN0dWFsIFJlZnJlc2ggUmF0ZS4KCQkgKi8KCQljbG9ja19jbnRsID0gYXR5X2xkXzgoQ0xPQ0tfQ05UTCwgcGFyKTsKCQkvKiBEUFJJTlRLKCJDTE9DS19DTlRMICUwMnhcbiIsIGNsb2NrX2NudGwpOyAqLwoJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQoJCQlwbGxfcmVnc1tpXSA9IGF0eV9sZF9wbGxfY3QoaSwgcGFyKTsKCgkJLyoKCQkgKiBQTEwgUmVmZXJlbmNlIERpdmlkZXIgTToKCQkgKi8KCQlNID0gcGxsX3JlZ3NbMl07CgoJCS8qCgkJICogUExMIEZlZWRiYWNrIERpdmlkZXIgTiAoRGVwZW5kYW50IG9uIENMT0NLX0NOVEwpOgoJCSAqLwoJCU4gPSBwbGxfcmVnc1s3ICsgKGNsb2NrX2NudGwgJiAzKV07CgoJCS8qCgkJICogUExMIFBvc3QgRGl2aWRlciBQIChEZXBlbmRhbnQgb24gQ0xPQ0tfQ05UTCk6CgkJICovCgkJUCA9IDEgPDwgKHBsbF9yZWdzWzZdID4+ICgoY2xvY2tfY250bCAmIDMpIDw8IDEpKTsKCgkJLyoKCQkgKiBQTEwgRGl2aWRlciBROgoJCSAqLwoJCVEgPSBOIC8gUDsKCgkJLyoKCQkgKiBUYXJnZXQgRnJlcXVlbmN5OgoJCSAqCgkJICogICAgICBUICogTQoJCSAqIFEgPSAtLS0tLS0tCgkJICogICAgICAyICogUgoJCSAqCgkJICogd2hlcmUgUiBpcyBYVEFMSU4gKD0gMTQzMTggb3IgMjk0OTgga0h6KS4KCQkgKi8KCQlpZiAoSVNfWEwocGRldi0+ZGV2aWNlKSkKCQkJUiA9IDI5NDk4OwoJCWVsc2UKCQkJUiA9IDE0MzE4OwoKCQlUID0gMiAqIFEgKiBSIC8gTTsKCgkJZGVmYXVsdF92YXIucGl4Y2xvY2sgPSAxMDAwMDAwMDAwIC8gVDsKCX0KCglyZXR1cm4gMDsKfQoKI2Vsc2UgLyogX19zcGFyY19fICovCgojaWZkZWYgX19pMzg2X18KI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKc3RhdGljIHZvaWQgYXR5X2luaXRfbGNkKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGJpb3NfYmFzZSkKewoJdTMyIGRyaXZfaW5mX3RhYiwgc2lnOwoJdTE2IGxjZF9vZnM7CgoJLyogVG8gc3VwcG9ydCBhbiBMQ0QgcGFuZWwsIHdlIHNob3VsZCBrbm93IGl0J3MgZGltZW5zaW9ucyBhbmQKCSAqICBpdCdzIGRlc2lyZWQgcGl4ZWwgY2xvY2suCgkgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gaXQ6CgkgKiAgLSBDaGVjayB0aGUgc3RhcnR1cCB2aWRlbyBtb2RlIGFuZCBjYWxjdWxhdGUgdGhlIHBhbmVsCgkgKiAgICBzaXplIGZyb20gaXQuIFRoaXMgaXMgdW5yZWxpYWJsZS4KCSAqICAtIFJlYWQgaXQgZnJvbSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGluIHRoZSB2aWRlbyBCSU9TLgoJKi8KCS8qIEFkZHJlc3Mgb2YgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGlzIGF0IG9mZnNldCAweDc4LiAqLwoJZHJpdl9pbmZfdGFiID0gYmlvc19iYXNlICsgKigodTE2ICopKGJpb3NfYmFzZSsweDc4KSk7CgoJLyogQ2hlY2sgZm9yIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgc2lnbmF0dXJlLiAqLwoJc2lnID0gKCoodTMyICopZHJpdl9pbmZfdGFiKTsKCWlmICgoc2lnID09IDB4NTQ1MDRjMjQpIHx8IC8qIFJhZ2UgTFQgcHJvICovCgkJKHNpZyA9PSAweDU0NGQ1MjI0KSB8fCAvKiBSYWdlIG1vYmlsaXR5ICovCgkJKHNpZyA9PSAweDU0NDM1ODI0KSB8fCAvKiBSYWdlIFhDICovCgkJKHNpZyA9PSAweDU0NGM1ODI0KSkgeyAvKiBSYWdlIFhMICovCgkJUFJJTlRLSSgiQklPUyBjb250YWlucyBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUuXG4iKTsKCQlsY2Rfb2ZzID0gKCoodTE2ICopKGRyaXZfaW5mX3RhYiArIDEwKSk7CgkJcGFyLT5sY2RfdGFibGUgPSAwOwoJCWlmIChsY2Rfb2ZzICE9IDApIHsKCQkJcGFyLT5sY2RfdGFibGUgPSBiaW9zX2Jhc2UgKyBsY2Rfb2ZzOwoJCX0KCX0KCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWNoYXIgbW9kZWxbMjRdOwoJCWNoYXIgc3RyYnVmWzE2XTsKCQljaGFyIHJlZnJlc2hfcmF0ZXNfYnVmWzEwMF07CgkJaW50IGlkLCB0ZWNoLCBmLCBpLCBtLCBkZWZhdWx0X3JlZnJlc2hfcmF0ZTsKCQljaGFyICp0eHRjb2xvdXI7CgkJY2hhciAqdHh0bW9uaXRvcjsKCQljaGFyICp0eHRkdWFsOwoJCWNoYXIgKnR4dGZvcm1hdDsKCQl1MTYgd2lkdGgsIGhlaWdodCwgcGFuZWxfdHlwZSwgcmVmcmVzaF9yYXRlczsKCQl1MTYgKmxjZG1vZGVwdHI7CgkJdTMyIGZvcm1hdDsKCQl1OCBsY2RfcmVmcmVzaF9yYXRlc1sxNl0gPSB7NTAsNTYsNjAsNjcsNzAsNzIsNzUsNzYsODUsOTAsMTAwLDEyMCwxNDAsMTUwLDE2MCwyMDB9OwoJCS8qIFRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpcyB0aGUgcGFuZWwgc2l6ZSBhdAoJCSAqIG9mZnNldCAyNSBhbmQgMjcsIGJ1dCB0aGVyZSdzIHNvbWUgb3RoZXIgbmljZSBpbmZvcm1hdGlvbgoJCSAqIHdoaWNoIHdlIHByaW50IHRvIHRoZSBzY3JlZW4uCgkJICovCgkJaWQgPSAqKHU4ICopcGFyLT5sY2RfdGFibGU7CgkJc3RybmNweShtb2RlbCwoY2hhciAqKXBhci0+bGNkX3RhYmxlKzEsMjQpOwoJCW1vZGVsWzIzXT0wOwoKCQl3aWR0aCA9IHBhci0+bGNkX3dpZHRoID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjUpOwoJCWhlaWdodCA9IHBhci0+bGNkX2hlaWdodCA9ICoodTE2ICopKHBhci0+bGNkX3RhYmxlKzI3KTsKCQlwYW5lbF90eXBlID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjkpOwoJCWlmIChwYW5lbF90eXBlICYgMSkKCQkJdHh0Y29sb3VyID0gImNvbG91ciI7CgkJZWxzZQoJCQl0eHRjb2xvdXIgPSAibW9ub2Nocm9tZSI7CgkJaWYgKHBhbmVsX3R5cGUgJiAyKQoJCQl0eHRkdWFsID0gImR1YWwgKHNwbGl0KSAiOwoJCWVsc2UKCQkJdHh0ZHVhbCA9ICIiOwoJCXRlY2ggPSAocGFuZWxfdHlwZT4+MikgJiA2MzsKCQlzd2l0Y2ggKHRlY2gpIHsKCQljYXNlIDA6CgkJCXR4dG1vbml0b3IgPSAicGFzc2l2ZSBtYXRyaXgiOwoJCQlicmVhazsKCQljYXNlIDE6CgkJCXR4dG1vbml0b3IgPSAiYWN0aXZlIG1hdHJpeCI7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJdHh0bW9uaXRvciA9ICJhY3RpdmUgYWRkcmVzc2VkIFNUTiI7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJdHh0bW9uaXRvciA9ICJFTCI7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJdHh0bW9uaXRvciA9ICJwbGFzbWEiOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0eHRtb25pdG9yID0gInVua25vd24iOwoJCX0KCQlmb3JtYXQgPSAqKHUzMiAqKShwYXItPmxjZF90YWJsZSs1Nyk7CgkJaWYgKHRlY2ggPT0gMCB8fCB0ZWNoID09IDIpIHsKCQkJc3dpdGNoIChmb3JtYXQgJiA3KSB7CgkJCWNhc2UgMDoKCQkJCXR4dGZvcm1hdCA9ICIxMiBiaXQgaW50ZXJmYWNlIjsKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCQl0eHRmb3JtYXQgPSAiMTYgYml0IGludGVyZmFjZSI7CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJdHh0Zm9ybWF0ID0gIjI0IGJpdCBpbnRlcmZhY2UiOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQl0eHRmb3JtYXQgPSAidW5rb3duIGZvcm1hdCI7CgkJCX0KCQl9IGVsc2UgewoJCQlzd2l0Y2ggKGZvcm1hdCAmIDcpIHsKCQkJY2FzZSAwOgoJCQkJdHh0Zm9ybWF0ID0gIjggY29sb3VycyI7CgkJCQlicmVhazsKCQkJY2FzZSAxOgoJCQkJdHh0Zm9ybWF0ID0gIjUxMiBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQl0eHRmb3JtYXQgPSAiNDA5NiBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDQ6CgkJCQl0eHRmb3JtYXQgPSAiMjYyMTQ0IGNvbG91cnMgKExUIG1vZGUpIjsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQl0eHRmb3JtYXQgPSAiMTY3NzcyMTYgY29sb3VycyI7CgkJCQlicmVhazsKCQkJY2FzZSA2OgoJCQkJdHh0Zm9ybWF0ID0gIjI2MjE0NCBjb2xvdXJzIChGRFBJLTIgbW9kZSkiOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQl0eHRmb3JtYXQgPSAidW5rb3duIGZvcm1hdCI7CgkJCX0KCQl9CgkJUFJJTlRLSSgiJXMlcyAlcyBtb25pdG9yIGRldGVjdGVkOiAlc1xuIiwKCQkJdHh0ZHVhbCAsdHh0Y29sb3VyLCB0eHRtb25pdG9yLCBtb2RlbCk7CgkJUFJJTlRLSSgiICAgICAgIGlkPSVkLCAlZHglZCBwaXhlbHMsICVzXG4iLAoJCQlpZCwgd2lkdGgsIGhlaWdodCwgdHh0Zm9ybWF0KTsKCQlyZWZyZXNoX3JhdGVzX2J1ZlswXSA9IDA7CgkJcmVmcmVzaF9yYXRlcyA9ICoodTE2ICopKHBhci0+bGNkX3RhYmxlKzYyKTsKCQltID0gMTsKCQlmID0gMDsKCQlmb3IgKGk9MDtpPDE2O2krKykgewoJCQlpZiAocmVmcmVzaF9yYXRlcyAmIG0pIHsKCQkJCWlmIChmID09IDApIHsKCQkJCQlzcHJpbnRmKHN0cmJ1ZiwgIiVkIiwgbGNkX3JlZnJlc2hfcmF0ZXNbaV0pOwoJCQkJCWYrKzsKCQkJCX0gZWxzZSB7CgkJCQkJc3ByaW50ZihzdHJidWYsICIsJWQiLCBsY2RfcmVmcmVzaF9yYXRlc1tpXSk7CgkJCQl9CgkJCQlzdHJjYXQocmVmcmVzaF9yYXRlc19idWYsc3RyYnVmKTsKCQkJfQoJCQltID0gbSA8PCAxOwoJCX0KCQlkZWZhdWx0X3JlZnJlc2hfcmF0ZSA9ICgqKHU4ICopKHBhci0+bGNkX3RhYmxlKzYxKSAmIDB4ZjApID4+IDQ7CgkJUFJJTlRLSSgiICAgICAgIHN1cHBvcnRzIHJlZnJlc2ggcmF0ZXMgWyVzXSwgZGVmYXVsdCAlZCBIelxuIiwKCQkJcmVmcmVzaF9yYXRlc19idWYsIGxjZF9yZWZyZXNoX3JhdGVzW2RlZmF1bHRfcmVmcmVzaF9yYXRlXSk7CgkJcGFyLT5sY2RfcmVmcmVzaHJhdGUgPSBsY2RfcmVmcmVzaF9yYXRlc1tkZWZhdWx0X3JlZnJlc2hfcmF0ZV07CgkJLyogV2Ugbm93IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBjcnRjIHBhcmFtZXRlcnMgZm9yIHRoZQoJCSAqIExDRCBtb25pdG9yLiBUaGlzIGlzIHRyaWNreSwgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkCgkJICogaW5kaXZpZHVhbGx5IGluIHRoZSBCSU9TLiBJbnN0ZWFkLCB0aGUgQklPUyBjb250YWlucyBhCgkJICogdGFibGUgb2YgZGlzcGxheSBtb2RlcyB0aGF0IHdvcmsgZm9yIHRoaXMgbW9uaXRvci4KCQkgKgoJCSAqIFRoZSBpZGVhIGlzIHRoYXQgd2Ugc2VhcmNoIGZvciBhIG1vZGUgb2YgdGhlIHNhbWUgZGltZW5zaW9ucwoJCSAqIGFzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBMQ0QgbW9uaXRvci4gU2F5IG91ciBMQ0QgbW9uaXRvcgoJCSAqIGlzIDgwMHg2MDAgcGl4ZWxzLCB3ZSBzZWFyY2ggZm9yIGEgODAweDYwMCBtb25pdG9yLgoJCSAqIFRoZSBDUlRDIHBhcmFtZXRlcnMgd2UgZmluZCBoZXJlIGFyZSB0aGUgb25lcyB0aGF0IHdlIG5lZWQKCQkgKiB0byB1c2UgdG8gc2ltdWxhdGUgb3RoZXIgcmVzb2x1dGlvbnMgb24gdGhlIExDRCBzY3JlZW4uCgkJICovCgkJbGNkbW9kZXB0ciA9ICh1MTYgKikocGFyLT5sY2RfdGFibGUgKyA2NCk7CgkJd2hpbGUgKCpsY2Rtb2RlcHRyICE9IDApIHsKCQkJdTMyIG1vZGVwdHI7CgkJCXUxNiBtd2lkdGgsIG1oZWlnaHQsIGxjZF9oc3luY19zdGFydCwgbGNkX3ZzeW5jX3N0YXJ0OwoJCQltb2RlcHRyID0gYmlvc19iYXNlICsgKmxjZG1vZGVwdHI7CgoJCQltd2lkdGggPSAqKCh1MTYgKikobW9kZXB0ciswKSk7CgkJCW1oZWlnaHQgPSAqKCh1MTYgKikobW9kZXB0cisyKSk7CgoJCQlpZiAobXdpZHRoID09IHdpZHRoICYmIG1oZWlnaHQgPT0gaGVpZ2h0KSB7CgkJCQlwYXItPmxjZF9waXhjbG9jayA9IDEwMDAwMDAwMCAvICooKHUxNiAqKShtb2RlcHRyKzkpKTsKCQkJCXBhci0+bGNkX2h0b3RhbCA9ICooKHUxNiAqKShtb2RlcHRyKzE3KSkgJiA1MTE7CgkJCQlwYXItPmxjZF9oZGlzcCA9ICooKHUxNiAqKShtb2RlcHRyKzE5KSkgJiA1MTE7CgkJCQlsY2RfaHN5bmNfc3RhcnQgPSAqKCh1MTYgKikobW9kZXB0cisyMSkpICYgNTExOwoJCQkJcGFyLT5sY2RfaHN5bmNfZGx5ID0gKCooKHUxNiAqKShtb2RlcHRyKzIxKSkgPj4gOSkgJiA3OwoJCQkJcGFyLT5sY2RfaHN5bmNfbGVuID0gKigodTggKikobW9kZXB0cisyMykpICYgNjM7CgoJCQkJcGFyLT5sY2RfdnRvdGFsID0gKigodTE2ICopKG1vZGVwdHIrMjQpKSAmIDIwNDc7CgkJCQlwYXItPmxjZF92ZGlzcCA9ICooKHUxNiAqKShtb2RlcHRyKzI2KSkgJiAyMDQ3OwoJCQkJbGNkX3ZzeW5jX3N0YXJ0ID0gKigodTE2ICopKG1vZGVwdHIrMjgpKSAmIDIwNDc7CgkJCQlwYXItPmxjZF92c3luY19sZW4gPSAoKigodTE2ICopKG1vZGVwdHIrMjgpKSA+PiAxMSkgJiAzMTsKCgkJCQlwYXItPmxjZF9odG90YWwgPSAocGFyLT5sY2RfaHRvdGFsICsgMSkgKiA4OwoJCQkJcGFyLT5sY2RfaGRpc3AgPSAocGFyLT5sY2RfaGRpc3AgKyAxKSAqIDg7CgkJCQlsY2RfaHN5bmNfc3RhcnQgPSAobGNkX2hzeW5jX3N0YXJ0ICsgMSkgKiA4OwoJCQkJcGFyLT5sY2RfaHN5bmNfbGVuID0gcGFyLT5sY2RfaHN5bmNfbGVuICogODsKCgkJCQlwYXItPmxjZF92dG90YWwrKzsKCQkJCXBhci0+bGNkX3ZkaXNwKys7CgkJCQlsY2RfdnN5bmNfc3RhcnQrKzsKCgkJCQlwYXItPmxjZF9yaWdodF9tYXJnaW4gPSBsY2RfaHN5bmNfc3RhcnQgLSBwYXItPmxjZF9oZGlzcDsKCQkJCXBhci0+bGNkX2xvd2VyX21hcmdpbiA9IGxjZF92c3luY19zdGFydCAtIHBhci0+bGNkX3ZkaXNwOwoJCQkJcGFyLT5sY2RfaGJsYW5rX2xlbiA9IHBhci0+bGNkX2h0b3RhbCAtIHBhci0+bGNkX2hkaXNwOwoJCQkJcGFyLT5sY2RfdmJsYW5rX2xlbiA9IHBhci0+bGNkX3Z0b3RhbCAtIHBhci0+bGNkX3ZkaXNwOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWxjZG1vZGVwdHIrKzsKCQl9CgkJaWYgKCpsY2Rtb2RlcHRyID09IDApIHsKCQkJUFJJTlRLRSgiTENEIG1vbml0b3IgQ1JUQyBwYXJhbWV0ZXJzIG5vdCBmb3VuZCEhIVxuIik7CgkJCS8qIFRvIGRvOiBTd2l0Y2ggdG8gQ1JUIGlmIHBvc3NpYmxlLiAqLwoJCX0gZWxzZSB7CgkJCVBSSU5US0koIiAgICAgICBMQ0QgQ1JUQyBwYXJhbWV0ZXJzOiAlZC4lZCAgJWQgJWQgJWQgJWQgICVkICVkICVkICVkXG4iLAoJCQkJMTAwMDAwMCAvIHBhci0+bGNkX3BpeGNsb2NrLCAxMDAwMDAwICUgcGFyLT5sY2RfcGl4Y2xvY2ssCgkJCQlwYXItPmxjZF9oZGlzcCwKCQkJCXBhci0+bGNkX2hkaXNwICsgcGFyLT5sY2RfcmlnaHRfbWFyZ2luLAoJCQkJcGFyLT5sY2RfaGRpc3AgKyBwYXItPmxjZF9yaWdodF9tYXJnaW4KCQkJCQkrIHBhci0+bGNkX2hzeW5jX2RseSArIHBhci0+bGNkX2hzeW5jX2xlbiwKCQkJCXBhci0+bGNkX2h0b3RhbCwKCQkJCXBhci0+bGNkX3ZkaXNwLAoJCQkJcGFyLT5sY2RfdmRpc3AgKyBwYXItPmxjZF9sb3dlcl9tYXJnaW4sCgkJCQlwYXItPmxjZF92ZGlzcCArIHBhci0+bGNkX2xvd2VyX21hcmdpbiArIHBhci0+bGNkX3ZzeW5jX2xlbiwKCQkJCXBhci0+bGNkX3Z0b3RhbCk7CgkJCVBSSU5US0koIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKCQkJCXBhci0+bGNkX3BpeGNsb2NrLAoJCQkJcGFyLT5sY2RfaGJsYW5rX2xlbiAtIChwYXItPmxjZF9yaWdodF9tYXJnaW4gKwoJCQkJCXBhci0+bGNkX2hzeW5jX2RseSArIHBhci0+bGNkX2hzeW5jX2xlbiksCgkJCQlwYXItPmxjZF9oZGlzcCwKCQkJCXBhci0+bGNkX3JpZ2h0X21hcmdpbiwKCQkJCXBhci0+bGNkX2hzeW5jX2xlbiwKCQkJCXBhci0+bGNkX3ZibGFua19sZW4gLSAocGFyLT5sY2RfbG93ZXJfbWFyZ2luICsgcGFyLT5sY2RfdnN5bmNfbGVuKSwKCQkJCXBhci0+bGNkX3ZkaXNwLAoJCQkJcGFyLT5sY2RfbG93ZXJfbWFyZ2luLAoJCQkJcGFyLT5sY2RfdnN5bmNfbGVuKTsKCQl9Cgl9Cn0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfZnJvbV9iaW9zKHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIGJpb3NfYmFzZSwgcm9tX2FkZHI7CglpbnQgcmV0OwoKCXJvbV9hZGRyID0gMHhjMDAwMCArICgoYXR5X2xkX2xlMzIoU0NSQVRDSF9SRUcxLCBwYXIpICYgMHg3ZikgPDwgMTEpOwoJYmlvc19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChyb21fYWRkciwgMHgxMDAwMCk7CgoJLyogVGhlIEJJT1Mgc3RhcnRzIHdpdGggMHhhYTU1LiAqLwoJaWYgKCooKHUxNiAqKWJpb3NfYmFzZSkgPT0gMHhhYTU1KSB7CgoJCXU4ICpiaW9zX3B0cjsKCQl1MTYgcm9tX3RhYmxlX29mZnNldCwgZnJlcV90YWJsZV9vZmZzZXQ7CgkJUExMX0JMT0NLX01BQ0g2NCBwbGxfYmxvY2s7CgoJCVBSSU5US0koIk1hY2g2NCBCSU9TIGlzIGxvY2F0ZWQgYXQgJXgsIG1hcHBlZCBhdCAleC5cbiIsIHJvbV9hZGRyLCBiaW9zX2Jhc2UpOwoKCQkvKiBjaGVjayBmb3IgZnJlcXVuY3kgdGFibGUgKi8KCQliaW9zX3B0ciA9ICh1OCopYmlvc19iYXNlOwoJCXJvbV90YWJsZV9vZmZzZXQgPSAodTE2KShiaW9zX3B0clsweDQ4XSB8IChiaW9zX3B0clsweDQ5XSA8PCA4KSk7CgkJZnJlcV90YWJsZV9vZmZzZXQgPSBiaW9zX3B0cltyb21fdGFibGVfb2Zmc2V0ICsgMTZdIHwgKGJpb3NfcHRyW3JvbV90YWJsZV9vZmZzZXQgKyAxN10gPDwgOCk7CgkJbWVtY3B5KCZwbGxfYmxvY2ssIGJpb3NfcHRyICsgZnJlcV90YWJsZV9vZmZzZXQsIHNpemVvZihQTExfQkxPQ0tfTUFDSDY0KSk7CgoJCVBSSU5US0koIkJJT1MgZnJlcXVlbmN5IHRhYmxlOlxuIik7CgkJUFJJTlRLSSgiUENMS19taW5fZnJlcSAlZCwgUENMS19tYXhfZnJlcSAlZCwgcmVmX2ZyZXEgJWQsIHJlZl9kaXZpZGVyICVkXG4iLAoJCQlwbGxfYmxvY2suUENMS19taW5fZnJlcSwgcGxsX2Jsb2NrLlBDTEtfbWF4X2ZyZXEsCgkJCXBsbF9ibG9jay5yZWZfZnJlcSwgcGxsX2Jsb2NrLnJlZl9kaXZpZGVyKTsKCQlQUklOVEtJKCJNQ0xLX3B3ZCAlZCwgTUNMS19tYXhfZnJlcSAlZCwgWENMS19tYXhfZnJlcSAlZCwgU0NMS19mcmVxICVkXG4iLAoJCQlwbGxfYmxvY2suTUNMS19wd2QsIHBsbF9ibG9jay5NQ0xLX21heF9mcmVxLAoJCQlwbGxfYmxvY2suWENMS19tYXhfZnJlcSwgcGxsX2Jsb2NrLlNDTEtfZnJlcSk7CgoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWluID0gcGxsX2Jsb2NrLlBDTEtfbWluX2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gcGxsX2Jsb2NrLlBDTEtfbWF4X2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5yZWZfY2xrID0gcGxsX2Jsb2NrLnJlZl9mcmVxLzEwMDsKCQlwYXItPnBsbF9saW1pdHMucmVmX2RpdiA9IHBsbF9ibG9jay5yZWZfZGl2aWRlcjsKCQlwYXItPnBsbF9saW1pdHMuc2NsayA9IHBsbF9ibG9jay5TQ0xLX2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gcGxsX2Jsb2NrLk1DTEtfbWF4X2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5tY2xrX3BtID0gcGxsX2Jsb2NrLk1DTEtfcHdkLzEwMDsKCQlwYXItPnBsbF9saW1pdHMueGNsayA9IHBsbF9ibG9jay5YQ0xLX21heF9mcmVxLzEwMDsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCQlhdHlfaW5pdF9sY2QocGFyLCBiaW9zX2Jhc2UpOwojZW5kaWYKCQlyZXQgPSAwOwoJfSBlbHNlIHsKCQlQUklOVEtFKCJubyBCSU9TIGZyZXF1ZW5jeSB0YWJsZSBmb3VuZCwgdXNlIHBhcmFtZXRlcnNcbiIpOwoJCXJldCA9IC1FTlhJTzsKCX0KCWlvdW5tYXAoKHZvaWQqIF9faW9tZW0gKWJpb3NfYmFzZSk7CgoJcmV0dXJuIHJldDsKfQojZW5kaWYgLyogX19pMzg2X18gKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwX2dlbmVyaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGFkZHIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKCXUxNiB0bXA7Cgl1bnNpZ25lZCBsb25nIHJhZGRyOwoJc3RydWN0IHJlc291cmNlICpycnA7CglpbnQgcmV0ID0gMDsKCglyYWRkciA9IGFkZHIgKyAweDdmZjAwMFVMOwoJcnJwID0gJnBkZXYtPnJlc291cmNlWzJdOwoJaWYgKChycnAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICYmIHJlcXVlc3RfbWVtX3JlZ2lvbihycnAtPnN0YXJ0LCBycnAtPmVuZCAtIHJycC0+c3RhcnQgKyAxLCAiYXR5ZmIiKSkgewoJCXBhci0+YXV4X3N0YXJ0ID0gcnJwLT5zdGFydDsKCQlwYXItPmF1eF9zaXplID0gcnJwLT5lbmQgLSBycnAtPnN0YXJ0ICsgMTsKCQlyYWRkciA9IHJycC0+c3RhcnQ7CgkJUFJJTlRLSSgidXNpbmcgYXV4aWxpYXJ5IHJlZ2lzdGVyIGFwZXJ0dXJlXG4iKTsKCX0KCglpbmZvLT5maXgubW1pb19zdGFydCA9IHJhZGRyOwoJcGFyLT5hdGlfcmVnYmFzZSA9IGlvcmVtYXAoaW5mby0+Zml4Lm1taW9fc3RhcnQsIDB4MTAwMCk7CglpZiAocGFyLT5hdGlfcmVnYmFzZSA9PSAwKQoJCXJldHVybiAtRU5PTUVNOwoKCWluZm8tPmZpeC5tbWlvX3N0YXJ0ICs9IHBhci0+YXV4X3N0YXJ0ID8gMHg0MDAgOiAweGMwMDsKCXBhci0+YXRpX3JlZ2Jhc2UgKz0gcGFyLT5hdXhfc3RhcnQgPyAweDQwMCA6IDB4YzAwOwoKCS8qCgkgKiBFbmFibGUgbWVtb3J5LXNwYWNlIGFjY2Vzc2VzIHVzaW5nIGNvbmZpZy1zcGFjZQoJICogY29tbWFuZCByZWdpc3Rlci4KCSAqLwoJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZ0bXApOwoJaWYgKCEodG1wICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgewoJCXRtcCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CgkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCB0bXApOwoJfQojaWZkZWYgX19CSUdfRU5ESUFOCgkvKiBVc2UgdGhlIGJpZy1lbmRpYW4gYXBlcnR1cmUgKi8KCWFkZHIgKz0gMHg4MDAwMDA7CiNlbmRpZgoKCS8qIE1hcCBpbiBmcmFtZSBidWZmZXIgKi8KCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gYWRkcjsKCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChhZGRyLCAweDgwMDAwMCk7CglpZiAoaW5mby0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBhdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw7Cgl9CgoJaWYoKHJldCA9IGNvcnJlY3RfY2hpcHNldChwYXIpKSkKCQlnb3RvIGF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDsKI2lmZGVmIF9faTM4Nl9fCglpZigocmV0ID0gaW5pdF9mcm9tX2Jpb3MocGFyKSkpCgkJZ290byBhdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw7CiNlbmRpZgoJaWYgKCEoYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfRVhUX0RJU1BfRU4pKQoJCXBhci0+Y2xrX3dyX29mZnNldCA9IChpbmIoUl9HRU5NTykgJiAweDBDVSkgPj4gMjsKCWVsc2UKCQlwYXItPmNsa193cl9vZmZzZXQgPSBhdHlfbGRfOChDTE9DS19DTlRMLCBwYXIpICYgMHgwM1U7CgoJLyogYWNjb3JkaW5nIHRvIEFUSSwgd2Ugc2hvdWxkIHVzZSBjbG9jayAzIGZvciBhY2VsZXJhdGVkIG1vZGUgKi8KCXBhci0+Y2xrX3dyX29mZnNldCA9IDM7CgoJcmV0dXJuIDA7CgphdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw6Cglpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJcGFyLT5hdGlfcmVnYmFzZSA9IE5VTEw7CglyZXR1cm4gcmV0Owp9CgojZW5kaWYgLyogIV9fc3BhcmNfXyAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQp7Cgl1bnNpZ25lZCBsb25nIGFkZHIsIHJlc19zdGFydCwgcmVzX3NpemU7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCXN0cnVjdCByZXNvdXJjZSAqcnA7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglpbnQgaSwgcmMgPSAtRU5PTUVNOwoKCWZvciAoaSA9IEFSUkFZX1NJWkUoYXR5X2NoaXBzKSAtIDE7IGkgPj0gMDsgaS0tKQoJCWlmIChwZGV2LT5kZXZpY2UgPT0gYXR5X2NoaXBzW2ldLnBjaV9pZCkKCQkJYnJlYWs7CgoJaWYgKGkgPCAwKQoJCXJldHVybiAtRU5PREVWOwoKCS8qIEVuYWJsZSBkZXZpY2UgaW4gUENJIGNvbmZpZyAqLwoJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CgkJUFJJTlRLRSgiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKCQlyZXR1cm4gLUVOWElPOwoJfQoKCS8qIEZpbmQgd2hpY2ggcmVzb3VyY2UgdG8gdXNlICovCglycCA9ICZwZGV2LT5yZXNvdXJjZVswXTsKCWlmIChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQoJCXJwID0gJnBkZXYtPnJlc291cmNlWzFdOwoJYWRkciA9IHJwLT5zdGFydDsKCWlmICghYWRkcikKCQlyZXR1cm4gLUVOWElPOwoKCS8qIFJlc2VydmUgc3BhY2UgKi8KCXJlc19zdGFydCA9IHJwLT5zdGFydDsKCXJlc19zaXplID0gcnAtPmVuZCAtIHJwLT5zdGFydCArIDE7CglpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAocmVzX3N0YXJ0LCByZXNfc2l6ZSwgImF0eWZiIikpCgkJcmV0dXJuIC1FQlVTWTsKCiAgICAgICAgLyogQWxsb2NhdGUgZnJhbWVidWZmZXIgKi8KCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF0eWZiX3BhciksICZwZGV2LT5kZXYpOwoJaWYgKCFpbmZvKSB7CgkJUFJJTlRLRSgiYXR5ZmJfcGNpX3Byb2JlKCkgY2FuJ3QgYWxsb2MgZmJfaW5mb1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglwYXIgPSBpbmZvLT5wYXI7CglpbmZvLT5maXggPSBhdHlmYl9maXg7CglpbmZvLT5kZXZpY2UgPSAmcGRldi0+ZGV2OwoJcGFyLT5wY2lfaWQgPSBhdHlfY2hpcHNbaV0ucGNpX2lkOwoJcGFyLT5yZXNfc3RhcnQgPSByZXNfc3RhcnQ7CglwYXItPnJlc19zaXplID0gcmVzX3NpemU7CglwYXItPmlycSA9IHBkZXYtPmlycTsKCXBhci0+cGRldiA9IHBkZXY7CgoJLyogU2V0dXAgImluZm8iIHN0cnVjdHVyZSAqLwojaWZkZWYgX19zcGFyY19fCglyYyA9IGF0eWZiX3NldHVwX3NwYXJjKHBkZXYsIGluZm8sIGFkZHIpOwojZWxzZQoJcmMgPSBhdHlmYl9zZXR1cF9nZW5lcmljKHBkZXYsIGluZm8sIGFkZHIpOwojZW5kaWYKCWlmIChyYykKCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKCglwY2lfc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CgoJLyogSW5pdCBjaGlwICYgcmVnaXN0ZXIgZnJhbWVidWZmZXIgKi8KCWlmIChhdHlfaW5pdChpbmZvLCAiUENJIikpCgkJZ290byBlcnJfcmVsZWFzZV9pbzsKCiNpZmRlZiBfX3NwYXJjX18KCWlmICghcHJvbV9wYWxldHRlKQoJCXByb21fcGFsZXR0ZSA9IGF0eWZiX3BhbGV0dGU7CgoJLyoKCSAqIEFkZCAvZGV2L2ZiIG1tYXAgdmFsdWVzLgoJICovCglwYXItPm1tYXBfbWFwWzBdLnZvZmYgPSAweDgwMDAwMDAwMDAwMDAwMDBVTDsKCXBhci0+bW1hcF9tYXBbMF0ucG9mZiA9ICh1bnNpZ25lZCBsb25nKSBpbmZvLT5zY3JlZW5fYmFzZSAmIFBBR0VfTUFTSzsKCXBhci0+bW1hcF9tYXBbMF0uc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKCXBhci0+bW1hcF9tYXBbMF0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CglwYXItPm1tYXBfbWFwWzBdLnByb3RfZmxhZyA9IF9QQUdFX0U7CglwYXItPm1tYXBfbWFwWzFdLnZvZmYgPSBwYXItPm1tYXBfbWFwWzBdLnZvZmYgKyBpbmZvLT5maXguc21lbV9sZW47CglwYXItPm1tYXBfbWFwWzFdLnBvZmYgPSAobG9uZylwYXItPmF0aV9yZWdiYXNlICYgUEFHRV9NQVNLOwoJcGFyLT5tbWFwX21hcFsxXS5zaXplID0gUEFHRV9TSVpFOwoJcGFyLT5tbWFwX21hcFsxXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCXBhci0+bW1hcF9tYXBbMV0ucHJvdF9mbGFnID0gX1BBR0VfRTsKI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwoKCXJldHVybiAwOwoKZXJyX3JlbGVhc2VfaW86CiNpZmRlZiBfX3NwYXJjX18KCWtmcmVlKHBhci0+bW1hcF9tYXApOwojZWxzZQoJaWYgKHBhci0+YXRpX3JlZ2Jhc2UpCgkJaW91bm1hcChwYXItPmF0aV9yZWdiYXNlKTsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKI2VuZGlmCmVycl9yZWxlYXNlX21lbToKCWlmIChwYXItPmF1eF9zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5hdXhfc3RhcnQsIHBhci0+YXV4X3NpemUpOwoKCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSk7CglmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwoKCXJldHVybiByYzsKfQoKI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KCiNpZmRlZiBDT05GSUdfQVRBUkkKCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX2F0YXJpX3Byb2JlKHZvaWQpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKCXN0cnVjdCBmYl9pbmZvICppbmZvOwoJaW50IG02NF9udW07Cgl1MzIgY2xvY2tfcjsKCglmb3IgKG02NF9udW0gPSAwOyBtNjRfbnVtIDwgbWFjaDY0X2NvdW50OyBtNjRfbnVtKyspIHsKCQlpZiAoIXBoeXNfdm1lbWJhc2VbbTY0X251bV0gfHwgIXBoeXNfc2l6ZVttNjRfbnVtXSB8fAoJCSAgICAhcGh5c19ndWlyZWdiYXNlW202NF9udW1dKSB7CgkJICAgIFBSSU5US0koInBoeXNfKlslZF0gcGFyYW1ldGVycyBub3Qgc2V0ID0+IHJldHVybmluZyBlYXJseS4gXG4iLCBtNjRfbnVtKTsKCQkJY29udGludWU7CgkJfQoKCQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHlmYl9wYXIpLCBOVUxMKTsKCQlpZiAoIWluZm8pIHsKCQkJUFJJTlRLRSgiYXR5ZmJfYXRhcmlfcHJvYmUoKSBjYW4ndCBhbGxvYyBmYl9pbmZvXG4iKTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJCXBhciA9IGluZm8tPnBhcjsKCgkJaW5mby0+Zml4ID0gYXR5ZmJfZml4OwoKCQlwYXItPmlycSA9ICh1bnNpZ25lZCBpbnQpIC0xOyAvKiBzb21ldGhpbmcgaW52YWxpZCAqLwoKCQkvKgoJCSAqICBNYXAgdGhlIHZpZGVvIG1lbW9yeSAocGh5c2ljYWwgYWRkcmVzcyBnaXZlbikgdG8gc29tZXdoZXJlIGluIHRoZQoJCSAqICBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KCQkgKi8KCQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAocGh5c192bWVtYmFzZVttNjRfbnVtXSwgcGh5c19zaXplW202NF9udW1dKTsKCQlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlOyAvKiBGYWtlISAqLwoJCXBhci0+YXRpX3JlZ2Jhc2UgPSBpb3JlbWFwKHBoeXNfZ3VpcmVnYmFzZVttNjRfbnVtXSwgMHgxMDAwMCkgKwoJCQkJCQkweEZDMDB1bDsKCQlpbmZvLT5maXgubW1pb19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhci0+YXRpX3JlZ2Jhc2U7IC8qIEZha2UhICovCgoJCWF0eV9zdF9sZTMyKENMT0NLX0NOVEwsIDB4MTIzNDU2NzgsIHBhcik7CgkJY2xvY2tfciA9IGF0eV9sZF9sZTMyKENMT0NLX0NOVEwsIHBhcik7CgoJCXN3aXRjaCAoY2xvY2tfciAmIDB4MDAzRikgewoJCWNhc2UgMHgxMjoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMzsgLyogICovCgkJCWJyZWFrOwoJCWNhc2UgMHgzNDoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMjsgLyogTWVkdXNhIFNULUlPIElTQSBBZGFwdGVyIGV0Yy4gKi8KCQkJYnJlYWs7CgkJY2FzZSAweDE2OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAxOyAvKiAgKi8KCQkJYnJlYWs7CgkJY2FzZSAweDM4OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAwOyAvKiBQYW50aGVyIDEgSVNBIEFkYXB0ZXIgKEdlcmFsZCkgKi8KCQkJYnJlYWs7CgkJfQoKCQlpZiAoYXR5X2luaXQoaW5mbywgIklTQSBidXMiKSkgewoJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwoJCQkvKiBUaGlzIGlzIGluc3VmZmljaWVudCEga2VybmVsX21hcCBoYXMgYWRkZWQgdHdvIGxhcmdlIGNodW5rcyEhICovCgkJCXJldHVybiAtRU5YSU87CgkJfQoJfQp9CgojZW5kaWYgLyogQ09ORklHX0FUQVJJICovCgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXR5ZmJfcmVtb3ZlKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJLyogcmVzdG9yZSB2aWRlbyBtb2RlICovCglhdHlfc2V0X2NydGMocGFyLCAmc2F2ZWRfY3J0Yyk7CglwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnNhdmVkX3BsbCk7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCWlmIChNNjRfSEFTKE1PQklMX0JVUykpCgkJYXR5X2JsX2V4aXQocGFyKTsKI2VuZGlmCgoJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKCiNpZmRlZiBDT05GSUdfTVRSUgoJaWYgKHBhci0+bXRycl9yZWcgPj0gMCkgewoJICAgIG10cnJfZGVsKHBhci0+bXRycl9yZWcsIDAsIDApOwoJICAgIHBhci0+bXRycl9yZWcgPSAtMTsKCX0KCWlmIChwYXItPm10cnJfYXBlciA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX2FwZXIsIDAsIDApOwoJICAgIHBhci0+bXRycl9hcGVyID0gLTE7Cgl9CiNlbmRpZgojaWZuZGVmIF9fc3BhcmNfXwoJaWYgKHBhci0+YXRpX3JlZ2Jhc2UpCgkJaW91bm1hcChwYXItPmF0aV9yZWdiYXNlKTsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKI2lmZGVmIF9fQklHX0VORElBTgoJaWYgKGluZm8tPnNwcml0ZS5hZGRyKQoJCWlvdW5tYXAoaW5mby0+c3ByaXRlLmFkZHIpOwojZW5kaWYKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KCWtmcmVlKHBhci0+bW1hcF9tYXApOwojZW5kaWYKCWlmIChwYXItPmF1eF9zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5hdXhfc3RhcnQsIHBhci0+YXV4X3NpemUpOwoKCWlmIChwYXItPnJlc19zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUpOwoKCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Cn0KCiNpZmRlZiBDT05GSUdfUENJCgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXR5ZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CgoJYXR5ZmJfcmVtb3ZlKGluZm8pOwp9CgovKgogKiBUaGlzIGRyaXZlciB1c2VzIGl0cyBvd24gbWF0Y2hpbmcgdGFibGUuIFRoYXQgd2lsbCBiZSBtb3JlIGRpZmZpY3VsdAogKiB0byBmaXgsIHNvIGZvciBub3csIHdlIGp1c3QgbWF0Y2ggYWdhaW5zdCBhbnkgQVRJIElEIGFuZCBsZXQgdGhlCiAqIHByb2JlKCkgZnVuY3Rpb24gZmluZCBvdXQgd2hhdCdzIHVwLiBUaGF0IGFsc28gbWVhbiB3ZSBkb24ndCBoYXZlCiAqIGEgbW9kdWxlIElEIHRhYmxlIHRob3VnaC4KICovCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdHlmYl9wY2lfdGJsW10gPSB7Cgl7IFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAoJICBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZIDw8IDE2LCAweGZmMDAwMCwgMCB9LAoJeyAwLCB9Cn07CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXR5ZmJfZHJpdmVyID0gewoJLm5hbWUJCT0gImF0eWZiIiwKCS5pZF90YWJsZQk9IGF0eWZiX3BjaV90YmwsCgkucHJvYmUJCT0gYXR5ZmJfcGNpX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdHlmYl9wY2lfcmVtb3ZlKSwKI2lmZGVmIENPTkZJR19QTQoJLnN1c3BlbmQJPSBhdHlmYl9wY2lfc3VzcGVuZCwKCS5yZXN1bWUJCT0gYXR5ZmJfcGNpX3Jlc3VtZSwKI2VuZGlmIC8qIENPTkZJR19QTSAqLwp9OwoKI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KCiNpZm5kZWYgTU9EVUxFCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCnsKCWNoYXIgKnRoaXNfb3B0OwoKCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCgkJcmV0dXJuIDA7CgoJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewoJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vYWNjZWwiLCA3KSkgewoJCQlub2FjY2VsID0gMTsKI2lmZGVmIENPTkZJR19NVFJSCgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vbXRyciIsIDYpKSB7CgkJCW5vbXRyciA9IDE7CiNlbmRpZgoJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmFtOiIsIDUpKQoJCQl2cmFtID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInBsbDoiLCA0KSkKCQkJcGxsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA0LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1jbGs6IiwgNSkpCgkJCW1jbGsgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAieGNsazoiLCA1KSkKCQkJeGNsayA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiY29tcF9zeW5jOiIsIDEwKSkKCQkJY29tcF9zeW5jID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrMTAsIE5VTEwsIDApOwojaWZkZWYgQ09ORklHX1BQQwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidm1vZGU6IiwgNikpIHsKCQkJdW5zaWduZWQgaW50IHZtb2RlID0KCQkJICAgIHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CgkJCWlmICh2bW9kZSA+IDAgJiYgdm1vZGUgPD0gVk1PREVfTUFYKQoJCQkJZGVmYXVsdF92bW9kZSA9IHZtb2RlOwoJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJjbW9kZToiLCA2KSkgewoJCQl1bnNpZ25lZCBpbnQgY21vZGUgPQoJCQkgICAgc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKCQkJc3dpdGNoIChjbW9kZSkgewoJCQljYXNlIDA6CgkJCWNhc2UgODoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwoJCQkJYnJlYWs7CgkJCWNhc2UgMTU6CgkJCWNhc2UgMTY6CgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfMTY7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJY2FzZSAzMjoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8zMjsKCQkJCWJyZWFrOwoJCQl9CgkJfQojZW5kaWYKI2lmZGVmIENPTkZJR19BVEFSSQoJCS8qCgkJICogV2h5IGRvIHdlIG5lZWQgdGhpcyBzaWxseSBNYWNoNjQgYXJndW1lbnQ/CgkJICogV2UgYXJlIGFscmVhZHkgaGVyZSBiZWNhdXNlIG9mIG1hY2g2ND0gc28gaXRzIHJlZHVuZGFudC4KCQkgKi8KCQllbHNlIGlmIChNQUNIX0lTX0FUQVJJCgkJCSAmJiAoIXN0cm5jbXAodGhpc19vcHQsICJNYWNoNjQ6IiwgNykpKSB7CgkJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG02NF9udW07CgkJCXN0YXRpYyBjaGFyIG1hY2g2NF9zdHJbODBdOwoJCQlzdHJsY3B5KG1hY2g2NF9zdHIsIHRoaXNfb3B0ICsgNywgc2l6ZW9mKG1hY2g2NF9zdHIpKTsKCQkJaWYgKCFzdG9yZV92aWRlb19wYXIobWFjaDY0X3N0ciwgbTY0X251bSkpIHsKCQkJCW02NF9udW0rKzsKCQkJCW1hY2g2NF9jb3VudCA9IG02NF9udW07CgkJCX0KCQl9CiNlbmRpZgoJCWVsc2UKCQkJbW9kZSA9IHRoaXNfb3B0OwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmICAvKiAgTU9EVUxFICAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfaW5pdCh2b2lkKQp7CiAgICBpbnQgZXJyMSA9IDEsIGVycjIgPSAxOwojaWZuZGVmIE1PRFVMRQogICAgY2hhciAqb3B0aW9uID0gTlVMTDsKCiAgICBpZiAoZmJfZ2V0X29wdGlvbnMoImF0eWZiIiwgJm9wdGlvbikpCglyZXR1cm4gLUVOT0RFVjsKICAgIGF0eWZiX3NldHVwKG9wdGlvbik7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19QQ0kKICAgIGVycjEgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdHlmYl9kcml2ZXIpOwojZW5kaWYKI2lmZGVmIENPTkZJR19BVEFSSQogICAgZXJyMiA9IGF0eWZiX2F0YXJpX3Byb2JlKCk7CiNlbmRpZgoKICAgIHJldHVybiAoZXJyMSAmJiBlcnIyKSA/IC1FTk9ERVYgOiAwOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgYXR5ZmJfZXhpdCh2b2lkKQp7CiNpZmRlZiBDT05GSUdfUENJCglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmF0eWZiX2RyaXZlcik7CiNlbmRpZgp9Cgptb2R1bGVfaW5pdChhdHlmYl9pbml0KTsKbW9kdWxlX2V4aXQoYXR5ZmJfZXhpdCk7CgpNT0RVTEVfREVTQ1JJUFRJT04oIkZCRGV2IGRyaXZlciBmb3IgQVRJIE1hY2g2NCBjYXJkcyIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cm1vZHVsZV9wYXJhbShub2FjY2VsLCBib29sLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhub2FjY2VsLCAiYm9vbDogZGlzYWJsZSBhY2NlbGVyYXRpb24iKTsKbW9kdWxlX3BhcmFtKHZyYW0sIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0ModnJhbSwgImludDogb3ZlcnJpZGUgc2l6ZSBvZiB2aWRlbyByYW0iKTsKbW9kdWxlX3BhcmFtKHBsbCwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhwbGwsICJpbnQ6IG92ZXJyaWRlIHZpZGVvIGNsb2NrIik7Cm1vZHVsZV9wYXJhbShtY2xrLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1jbGssICJpbnQ6IG92ZXJyaWRlIG1lbW9yeSBjbG9jayIpOwptb2R1bGVfcGFyYW0oeGNsaywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh4Y2xrLCAiaW50OiBvdmVycmlkZSBhY2NlbGVyYXRlZCBlbmdpbmUgY2xvY2siKTsKbW9kdWxlX3BhcmFtKGNvbXBfc3luYywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhjb21wX3N5bmMsCgkJICJTZXQgY29tcG9zaXRlIHN5bmMgc2lnbmFsIHRvIGxvdyAoMCkgb3IgaGlnaCAoMSkiKTsKbW9kdWxlX3BhcmFtKG1vZGUsIGNoYXJwLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiU3BlY2lmeSByZXNvbHV0aW9uIGFzIFwiPHhyZXM+eDx5cmVzPlstPGJwcD5dW0A8cmVmcmVzaD5dXCIgIik7CiNpZmRlZiBDT05GSUdfTVRSUgptb2R1bGVfcGFyYW0obm9tdHJyLCBib29sLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhub210cnIsICJib29sOiBkaXNhYmxlIHVzZSBvZiBNVFJSIHJlZ2lzdGVycyIpOwojZW5kaWYK