LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBwb3J0ZWQgZnJvbSBjdGZiLmMgKGxpbnV4IGtlcm5lbCkgZm9yIHRoZSBVLUJvb3QKICoKICovCgoKI2luY2x1ZGUgPGNvbW1vbi5oPgoKI2lmZGVmIENPTkZJR19WSURFTwoKI2luY2x1ZGUgPHBjaS5oPgojaW5jbHVkZSA8dmlkZW9fZmIuaD4KI2luY2x1ZGUgInZpZGVvbW9kZXMuaCIKCiNpZmRlZiBDT05GSUdfVklERU9fQ1Q2OTAwMAoKLyogZGVidWcgKi8KI3VuZGVmIFZHQV9ERUJVRwojdW5kZWYgVkdBX0RVTVBfUkVHCiNpZmRlZiBWR0FfREVCVUcKI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQojZW5kaWYKCi8qIE1hY3JvcyAqLwojaWZuZGVmIG1pbgojZGVmaW5lIG1pbiggYSwgYiApICggKCBhICkgPCAoIGIgKSApID8gKCBhICkgOiAoIGIgKQojZW5kaWYKI2lmbmRlZiBtYXgKI2RlZmluZSBtYXgoIGEsIGIgKSAoICggYSApID4gKCBiICkgKSA/ICggYSApIDogKCBiICkKI2VuZGlmCiNpZmRlZiBtaW5tYXgKI2Vycm9yICJ0ZXJtIG1pbm1heCBhbHJlYWR5IHVzZWQuIgojZW5kaWYKI2RlZmluZSBtaW5tYXgoIGEsIHgsIGIgKSBtYXgoICggYSApLCBtaW4oICggeCApLCAoIGIgKSApICkKI2RlZmluZSBOX0VMVFMoIHggKSAoIHNpemVvZiggeCApIC8gc2l6ZW9mKCB4WyAwIF0gKSApCgovKiBDVCBSZWdpc3RlciBPZmZzZXRzICovCiNkZWZpbmUgQ1RfQVJfTwkJCTB4M2MwCS8qIEluZGV4IGFuZCBEYXRhIHdyaXRlIHBvcnQgb2YgdGhlIGF0dHJpYnV0ZSBSZWdpc3RlcnMgKi8KI2RlZmluZSBDVF9HUl9PCQkJMHgzY2UJLyogSW5kZXggcG9ydCBvZiB0aGUgR3JhcGhpYyBDb250cm9sbGVyIFJlZ2lzdGVycyAqLwojZGVmaW5lIENUX1NSX08JCQkweDNjNAkvKiBJbmRleCBwb3J0IG9mIHRoZSBTZXF1ZW5jZXIgQ29udHJvbGxlciAqLwojZGVmaW5lIENUX0NSX08JCQkweDNkNAkvKiBJbmRleCBwb3J0IG9mIHRoZSBDUlQgQ29udHJvbGxlciAqLwojZGVmaW5lIENUX1hSX08JCQkweDNkNgkvKiBFeHRlbmRlZCBSZWdpc3RlciBpbmRleCAqLwojZGVmaW5lIENUX01TUl9XX08JCTB4M2MyCS8qIE1pc2MuIE91dHB1dCBSZWdpc3RlciAod3JpdGUgb25seSkgKi8KI2RlZmluZSBDVF9MVVRfTUFTS19PCQkweDNjNgkvKiBDb2xvciBQYWxldHRlIE1hc2sgKi8KI2RlZmluZSBDVF9MVVRfU1RBUlRfTwkJMHgzYzgJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBNb2RlIEluZGV4ICovCiNkZWZpbmUgQ1RfTFVUX1JHQl9PCQkweDNjOQkvKiBDb2xvciBQYWxldHRlIERhdGEgUG9ydCAqLwojZGVmaW5lIENUX1NUQVRVU19SRUcwX08JMHgzYzIJLyogU3RhdHVzIFJlZ2lzdGVyIDAgKHJlYWQgb25seSkgKi8KI2RlZmluZSBDVF9TVEFUVVNfUkVHMV9PCTB4M2RhCS8qIElucHV0IFN0YXR1cyBSZWdpc3RlciAxIChyZWFkIG9ubHkpICovCgojZGVmaW5lIENUX0ZQX08JCQkweDNkMAkvKiBJbmRleCBwb3J0IG9mIHRoZSBGbGF0IHBhbmVsIFJlZ2lzdGVycyAqLwojZGVmaW5lIENUX01SX08JCQkweDNkMgkvKiBJbmRleCBQb3J0IG9mIHRoZSBNdWx0aW1lZGlhIEV4dGVuc2lvbiAqLwoKLyogZGVmaW5lcyBmb3IgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCiNkZWZpbmUgQlIwMF9vCQkweDQwMDAwMAkvKiBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIFNwYW4gUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjAxX28JCTB4NDAwMDA0CS8qIFBhdHRlcm4vU291cmNlIEV4cGFuc2lvbiBCYWNrZ3JvdW5kIENvbG9yICYgVHJhbnNwYXJlbmN5IEtleSBSZWdpc3RlciAqLwojZGVmaW5lIEJSMDJfbwkJMHg0MDAwMDgJLyogUGF0dGVybi9Tb3VyY2UgRXhwYW5zaW9uIEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjAzX28JCTB4NDAwMDBDCS8qIE1vbm9jaHJvbWUgU291cmNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA0X28JCTB4NDAwMDEwCS8qIEJpdEJMVCBDb250cm9sIFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwNV9vCQkweDQwMDAxNAkvKiBQYXR0ZXJuIEFkZHJlc3MgUmVnaXN0ZSAqLwojZGVmaW5lIEJSMDZfbwkJMHg0MDAwMTgJLyogU291cmNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA3X28JCTB4NDAwMDFDCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA4X28JCTB4NDAwMDIwCS8qIERlc3RpbmF0aW9uIFdpZHRoICYgSGVpZ2h0IFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwOV9vCQkweDQwMDAyNAkvKiBTb3VyY2UgRXhwYW5zaW9uIEJhY2tncm91bmQgQ29sb3IgJiBUcmFuc3BhcmVuY3kgS2V5IFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwQV9vCQkweDQwMDAyOAkvKiBTb3VyY2UgRXhwYW5zaW9uIEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgKi8KCiNkZWZpbmUgQ1VSU09SX1NJWkUJMHgxMDAwCS8qIGluIEtCeXRlIGZvciBIVyBDdXJzb3IgKi8KI2RlZmluZSBQQVRURVJOX0FEUgkocEdELT5kcHJCYXNlICsgQ1VSU09SX1NJWkUpCS8qIHBhdHRlcm4gTWVtb3J5IGFmdGVyIEN1cnNvciBNZW1vcnkgKi8KI2RlZmluZSBQQVRURVJOX1NJWkUJOCo4KjQJLyogNCBCeXRlcyBwZXIgUGl4ZWwgOCB4IDggUGl4ZWwgKi8KI2RlZmluZSBBQ0NFTE1FTU9SWQkoQ1VSU09SX1NJWkUgKyBQQVRURVJOX1NJWkUpCS8qIHJlc2VydmVkIE1lbW9yeSBmb3IgQklUQmx0IGFuZCBodyBjdXJzb3IgKi8KCi8qIFNvbWUgTW9kZSBkZWZpbml0aW9ucyAqLwojZGVmaW5lIEZCX1NZTkNfSE9SX0hJR0hfQUNUCTEJLyogaG9yaXpvbnRhbCBzeW5jIGhpZ2ggYWN0aXZlICAqLwojZGVmaW5lIEZCX1NZTkNfVkVSVF9ISUdIX0FDVAkyCS8qIHZlcnRpY2FsIHN5bmMgaGlnaCBhY3RpdmUgICAgKi8KI2RlZmluZSBGQl9TWU5DX0VYVAkJNAkvKiBleHRlcm5hbCBzeW5jICAgICAgICAgICAgICAgICovCiNkZWZpbmUgRkJfU1lOQ19DT01QX0hJR0hfQUNUCTgJLyogY29tcG9zaXRlIHN5bmMgaGlnaCBhY3RpdmUgICAqLwojZGVmaW5lIEZCX1NZTkNfQlJPQURDQVNUCTE2CS8qIGJyb2FkY2FzdCB2aWRlbyB0aW1pbmdzICAgICAgKi8KCQkJCQkvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCgkJCQkJLyogdnRvdGFsID0gMTIxZC8yNDJuLzQ4NGkgPT4gTlRTQyAqLwojZGVmaW5lIEZCX1NZTkNfT05fR1JFRU4JMzIJLyogc3luYyBvbiBncmVlbiAqLwoKI2RlZmluZSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEICAwCS8qIG5vbiBpbnRlcmxhY2VkICovCiNkZWZpbmUgRkJfVk1PREVfSU5URVJMQUNFRAkxCS8qIGludGVybGFjZWQgICAqLwojZGVmaW5lIEZCX1ZNT0RFX0RPVUJMRQkJMgkvKiBkb3VibGUgc2NhbiAqLwojZGVmaW5lIEZCX1ZNT0RFX01BU0sJCTI1NQoKI2RlZmluZSBGQl9WTU9ERV9ZV1JBUAkJMjU2CS8qIHl3cmFwIGluc3RlYWQgb2YgcGFubmluZyAgICAgKi8KI2RlZmluZSBGQl9WTU9ERV9TTU9PVEhfWFBBTgk1MTIJLyogc21vb3RoIHhwYW4gcG9zc2libGUgKGludGVybmFsbHkgdXNlZCkgKi8KI2RlZmluZSBGQl9WTU9ERV9DT05VUERBVEUJNTEyCS8qIGRvbid0IHVwZGF0ZSB4L3lvZmZzZXQgICAgICAgKi8KCiNkZWZpbmUgdGV4dAkJCTAKI2RlZmluZSBmbnR3aWR0aAkJOAoKLyogdGFibGUgZm9yIFZHQSBJbml0aWFsaXphdGlvbiAgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJY29uc3QgdW5zaWduZWQgY2hhciByZWc7Cgljb25zdCB1bnNpZ25lZCBjaGFyIHZhbDsKfSBDVF9DRkdfVEFCTEU7CgovKiB0aGlzIHRhYmxlIHByb3ZpZGVzIHNvbWUgYmFzaWMgaW5pdGlhbGlzYXRpb25zIHN1Y2ggYXMgTWVtb3J5IENsb2NrIGV0YyAqLwpzdGF0aWMgQ1RfQ0ZHX1RBQkxFIHhyZWdbXSA9IHsKCXsweDA5LCAweDAxfSwJCS8qIENSVCBDb250cm9sbGVyIEV4dGVuc2lvbnMgRW5hYmxlICovCgl7MHgwQSwgMHgwMn0sCQkvKiBGcmFtZSBCdWZmZXIgTWFwcGluZyAqLwoJezB4MEIsIDB4MDF9LAkJLyogUENJIFdyaXRlIEJ1cnN0IHN1cHBvcnQgKi8KCXsweDIwLCAweDAwfSwJCS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCgl7MHg0MCwgMHgwM30sCQkvKiBNZW1vcnkgQWNjZXNzIENvbnRyb2wgKi8KCXsweDYwLCAweDAwfSwJCS8qIFZpZGVvIFBpbiBDb250cm9sICovCgl7MHg2MSwgMHgwMH0sCQkvKiBEUE1TIFN5bmNoIGNvbnRyb2wgKi8KCXsweDYyLCAweDAwfSwJCS8qIEdQSU8gUGluIENvbnRyb2wgKi8KCXsweDYzLCAweEJEfSwJCS8qIEdQSU8gUGluIERhdGEgKi8KCXsweDY3LCAweDAwfSwJCS8qIFBpbiBUcmktU3RhdGUgKi8KCXsweDgwLCAweDgwfSwJCS8qIFBpeGVsIFBpcGVsaW5lIENvbmZpZyAwIHJlZ2lzdGVyICovCgl7MHhBMCwgMHgwMH0sCQkvKiBDdXJzb3IgMSBDb250cm9sIFJlZyAqLwoJezB4QTEsIDB4MDB9LAkJLyogQ3Vyc29yIDEgVmVydGljYWwgRXh0ZW5zaW9uIFJlZyAqLwoJezB4QTIsIDB4MDB9LAkJLyogQ3Vyc29yIDEgQmFzZSBBZGRyZXNzIExvdyAqLwoJezB4QTMsIDB4MDB9LAkJLyogQ3Vyc29yIDEgQmFzZSBBZGRyZXNzIEhpZ2ggKi8KCXsweEE0LCAweDAwfSwJCS8qIEN1cnNvciAxIFgtUG9zaXRpb24gTG93ICovCgl7MHhBNSwgMHgwMH0sCQkvKiBDdXJzb3IgMSBYLVBvc2l0aW9uIEhpZ2ggKi8KCXsweEE2LCAweDAwfSwJCS8qIEN1cnNvciAxIFktUG9zaXRpb24gTG93ICovCgl7MHhBNywgMHgwMH0sCQkvKiBDdXJzb3IgMSBZLVBvc2l0aW9uIEhpZ2ggKi8KCXsweEE4LCAweDAwfSwJCS8qIEN1cnNvciAyIENvbnRyb2wgUmVnICovCgl7MHhBOSwgMHgwMH0sCQkvKiBDdXJzb3IgMiBWZXJ0aWNhbCBFeHRlbnNpb24gUmVnICovCgl7MHhBQSwgMHgwMH0sCQkvKiBDdXJzb3IgMiBCYXNlIEFkZHJlc3MgTG93ICovCgl7MHhBQiwgMHgwMH0sCQkvKiBDdXJzb3IgMiBCYXNlIEFkZHJlc3MgSGlnaCAqLwoJezB4QUMsIDB4MDB9LAkJLyogQ3Vyc29yIDIgWC1Qb3NpdGlvbiBMb3cgKi8KCXsweEFELCAweDAwfSwJCS8qIEN1cnNvciAyIFgtUG9zaXRpb24gSGlnaCAqLwoJezB4QUUsIDB4MDB9LAkJLyogQ3Vyc29yIDIgWS1Qb3NpdGlvbiBMb3cgKi8KCXsweEFGLCAweDAwfSwJCS8qIEN1cnNvciAyIFktUG9zaXRpb24gSGlnaCAqLwoJezB4QzAsIDB4N0R9LAkJLyogRG90IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLwoJezB4QzEsIDB4MDd9LAkJLyogRG90IENsb2NrIDAgVkNPIE4tRGl2aXNvciAqLwoJezB4QzMsIDB4MzR9LAkJLyogRG90IENsb2NrIDAgRGl2aXNvciBzZWxlY3QgKi8KCXsweEM0LCAweDU1fSwJCS8qIERvdCBDbG9jayAxIFZDTyBNLURpdmlzb3IgKi8KCXsweEM1LCAweDA5fSwJCS8qIERvdCBDbG9jayAxIFZDTyBOLURpdmlzb3IgKi8KCXsweEM3LCAweDI0fSwJCS8qIERvdCBDbG9jayAxIERpdmlzb3Igc2VsZWN0ICovCgl7MHhDOCwgMHg3RH0sCQkvKiBEb3QgQ2xvY2sgMiBWQ08gTS1EaXZpc29yICovCgl7MHhDOSwgMHgwN30sCQkvKiBEb3QgQ2xvY2sgMiBWQ08gTi1EaXZpc29yICovCgl7MHhDQiwgMHgzNH0sCQkvKiBEb3QgQ2xvY2sgMiBEaXZpc29yIHNlbGVjdCAqLwoJezB4Q0MsIDB4Mzh9LAkJLyogTWVtb3J5IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLwoJezB4Q0QsIDB4MDN9LAkJLyogTWVtb3J5IENsb2NrIDAgVkNPIE4tRGl2aXNvciAqLwoJezB4Q0UsIDB4OTB9LAkJLyogTWVtb3J5IENsb2NrIDAgRGl2aXNvciBzZWxlY3QgKi8KCXsweENGLCAweDA2fSwJCS8qIENsb2NrIENvbmZpZyAqLwoJezB4RDAsIDB4MEZ9LAkJLyogUG93ZXIgRG93biAqLwoJezB4RDEsIDB4MDF9LAkJLyogUG93ZXIgRG93biBCaXRCTFQgKi8KCXsweEZGLCAweEZGfQkJLyogZW5kIG9mIHRhYmxlICovCn07Ci8qIENsb2NrIENvbmZpZzoKICogPT09PT09PT09PT09PQogKgogKiBQRCBSZWdpc3RlcnM6CiAqIC0tLS0tLS0tLS0tLS0KICogQml0MiBhbmQgQml0NC4uNiBhcmUgdXNlZCBmb3IgdGhlIExvb3AgRGl2aXNvciBhbmQgUG9zdCBEaXZpc29yLgogKiBUaGV5IGFyZSBlbmNvZGVkIGFzIGZvbGxvd3M6CiAqCiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMiB8IExvb3AgRGl2aXNvciB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMSB8IDEgICAgICAgICAgICB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMCB8IDQgICAgICAgICAgICB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIE5vdGU6IFRoZSBNZW1vcnkgQ2xvY2sgZG9lcyBub3QgaGF2ZSBhIExvb3AgRGl2aXNvci4KICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDYgfCA1IHwgNCB8IFBvc3QgRGl2aXNvciB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAwIHwgMCB8IDAgfCAxICAgICAgICAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMCB8IDAgfCAxIHwgMiAgICAgICAgICAgIHwKICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDAgfCAxIHwgMCB8IDQgICAgICAgICAgICB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAwIHwgMSB8IDEgfCA4ICAgICAgICAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMSB8IDAgfCAwIHwgMTYgICAgICAgICAgIHwKICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDEgfCAwIHwgMSB8IDMyICAgICAgICAgICB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAxIHwgMSB8IFggfCByZXNlcnZlZCAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqCiAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBpbiB0aGVzZSByZWdpc3RlcnMuCiAqCiAqIENsb2NrIFZDTyBNIFJlZ2lzdGVyczoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBUaGVzZSBSZWdpc3RlcnMgY29udGFpbiB0aGUgTSBWYWx1ZSAtMi4KICoKICogQ2xvY2sgVkNPIE4gUmVnaXN0ZXJzOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFRoZXNlIFJlZ2lzdGVycyBjb250YWluIHRoZSBOIFZhbHVlIC0yLgogKgogKiBGb3JtdWxhczoKICogLS0tLS0tLS0tCiAqIEZ2Y28gPSAoRnJlZiAqIExvb3AgRGl2aXNvciAqIE0vTiksIHdoZXJlYXMgMTAwTUh6IDwgRnZjbyA8IDIyME1IegogKiBGb3V0ID0gRnZjbyAvIFBvc3QgRGl2aXNvcgogKgogKiBEb3QgQ2xrMCAoZGVmYXVsdCAyNU1Ieik6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDEyNyAvIDkgPSAyMDIuMDQ1TUh6CiAqIEZvdXQgPSAyMDIuMDQ1TUh6IC8gOCA9IDI1LjI1TUh6CiAqIFBvc3QgRGl2aXNvciA9IDgKICogTG9vcCBEaXZpc29yID0gMQogKiBYUkMwID0gKE0gLSAyKSA9IDEyNSA9IDB4N0QKICogWFJDMSA9IChOIC0gMikgPSA3ICAgPSAweDA3CiAqIFhSQzMgPSAgICAgICAgICAgICAgICAgMHgzNAogKgogKiBEb3QgQ2xrMSAoZGVmYXVsdCAyOE1Ieik6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDg3IC8gMTEgPSAxMTMuMjRNSHoKICogRm91dCA9IDExMy4yNE1IeiAvIDQgPSAyOC4zMU1IegogKiBQb3N0IERpdmlzb3IgPSA0CiAqIExvb3AgRGl2aXNvciA9IDEKICogWFJDNCA9IChNIC0gMikgPSA4NSA9IDB4NTUKICogWFJDNSA9IChOIC0gMikgPSA5ICA9IDB4MDkKICogWFJDNyA9ICAgICAgICAgICAgICAgIDB4MjQKICoKICogRG90IENsazIgKHZhcmlhYmxlIGZvciBleHRlbmRlZCBtb2RlcyBzZXQgdG8gMjVNSHopOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZ2Y28gPSAxNC4zMTggKiAxMjcgLyA5ID0gMjAyLjA0NU1IegogKiBGb3V0ID0gMjAyLjA0NU1IeiAvIDggPSAyNS4yNU1IegogKiBQb3N0IERpdmlzb3IgPSA4CiAqIExvb3AgRGl2aXNvciA9IDEKICogWFJDOCA9IChNIC0gMikgPSAxMjUgPSAweDdECiAqIFhSQzkgPSAoTiAtIDIpID0gNyAgID0gMHgwNwogKiBYUkNCID0gICAgICAgICAgICAgICAgIDB4MzQKICoKICogTWVtb3J5IENsayBmb3IgbW9zdCBtb2RlcyA+NTBNSHo6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDU4IC8gNSA9IDE2Nk1IegogKiBGb3V0ID0gMTY2TUh6IC8gMiAgICAgID0gODNNSHoKICogUG9zdCBEaXZpc29yID0gMgogKiBYUkNDID0gKE0gLSAyKSA9IDU3ICA9IDB4MzgKICogWFJDRCA9IChOIC0gMikgPSAzICAgPSAweDAzCiAqIFhSQ0UgPSAgICAgICAgICAgICAgICAgMHg5MAogKgogKiBOb3RlIEJpdDcgZW5hYmxlcyB0aGUgY2xvY2sgc291cmNlIGZyb20gdGhlIFZDTwogKgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENoaXBzIHN0cnVjdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyB7CglpbnQgZGV2aWNlX2lkOwkJLyogUENJIERldmljZSBJRCAqLwoJdW5zaWduZWQgbG9uZyBtYXhfbWVtOwkvKiBtZW1vcnkgZm9yIGZyYW1lIGJ1ZmZlciAqLwoJaW50IHZsZF9zZXQ7CQkvKiB2YWx1ZSBvZiBWTEQgaWYgYml0MiBpbiBjbG9jayBjb250cm9sIGlzIHNldCAqLwoJaW50IHZsZF9ub3Rfc2V0OwkvKiB2YWx1ZSBvZiBWTEQgaWYgYml0MiBpbiBjbG9jayBjb250cm9sIGlzIHNldCAqLwoJaW50IG1uX2RpZmY7CQkvKiBkaWZmZXJlbmNlIGJldHdlZW4gTS9OIFZhbHVlICsgbW5fZGlmZiA9IE0vTiBSZWdpc3RlciAqLwoJaW50IG1uX21pbjsJCS8qIG1pbiB2YWx1ZSBvZiBNL04gVmFsdWUgKi8KCWludCBtbl9tYXg7CQkvKiBtYXggdmFsdWUgb2YgTS9OIFZhbHVlICovCglpbnQgdmNvX21pbjsJCS8qIFZDTyBNaW4gaW4gTUh6ICovCglpbnQgdmNvX21heDsJCS8qIFZDTyBNYXggaW4gTUh6ICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyBjaGlwc1tdID0gewoJe1BDSV9ERVZJQ0VfSURfQ1RfNjkwMDAsIDB4MjAwMDAwLCAxLCA0LCAtMiwgMywgMjU3LCAxMDAsIDIyMH0sCgl7UENJX0RFVklDRV9JRF9DVF82NTU1NSwgMHgxMDAwMDAsIDE2LCA0LCAwLCAxLCAyNTUsIDQ4LCAyMjB9LAkvKiBOT1QgVEVTVEVEICovCgl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0JLyogVGVybWluYXRvciAqLwp9OwoKLyoKICogVGhlIEdyYXBoaWMgRGV2aWNlCiAqLwpHcmFwaGljRGV2aWNlIGN0ZmI7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogTG93IExldmVsIFJvdXRpbmVzCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogUmVhZCBDVCBJU0EgcmVnaXN0ZXIKKi8KI2lmZGVmIFZHQV9ERUJVRwpzdGF0aWMgdW5zaWduZWQgY2hhcgpjdFJlYWQgKHVuc2lnbmVkIHNob3J0IGluZGV4KQp7CglHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CglpZiAoaW5kZXggPT0gQ1RfQVJfTykKCQkvKiBzeW5jaCB0aGUgRmxpcCBGbG9wICovCgkJaW44IChwR0QtPmlzYUJhc2UgKyBDVF9TVEFUVVNfUkVHMV9PKTsKCglyZXR1cm4gKGluOCAocEdELT5pc2FCYXNlICsgaW5kZXgpKTsKfQojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFdyaXRlIENUIElTQSByZWdpc3RlcgoqLwpzdGF0aWMgdm9pZApjdFdyaXRlICh1bnNpZ25lZCBzaG9ydCBpbmRleCwgdW5zaWduZWQgY2hhciB2YWwpCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCglvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCB2YWwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogUmVhZCBDVCBJU0EgcmVnaXN0ZXIgaW5kZXhlZAoqLwpzdGF0aWMgdW5zaWduZWQgY2hhcgpjdFJlYWRfaSAodW5zaWduZWQgc2hvcnQgaW5kZXgsIGNoYXIgcmVnKQp7CglHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CglpZiAoaW5kZXggPT0gQ1RfQVJfTykKCQkvKiBzeW5jaCB0aGUgRmxpcCBGbG9wICovCgkJaW44IChwR0QtPmlzYUJhc2UgKyBDVF9TVEFUVVNfUkVHMV9PKTsKCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHJlZyk7CglyZXR1cm4gKGluOCAocEdELT5pc2FCYXNlICsgaW5kZXggKyAxKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBXcml0ZSBDVCBJU0EgcmVnaXN0ZXIgaW5kZXhlZAoqLwpzdGF0aWMgdm9pZApjdFdyaXRlX2kgKHVuc2lnbmVkIHNob3J0IGluZGV4LCBjaGFyIHJlZywgY2hhciB2YWwpCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCWlmIChpbmRleCA9PSBDVF9BUl9PKSB7CgkJLyogc3luY2ggdGhlIEZsaXAgRmxvcCAqLwoJCWluOCAocEdELT5pc2FCYXNlICsgQ1RfU1RBVFVTX1JFRzFfTyk7CgkJb3V0OCAoKHBHRC0+aXNhQmFzZSArIGluZGV4KSwgcmVnKTsKCQlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCB2YWwpOwoJfSBlbHNlIHsKCQlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCByZWcpOwoJCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCArIDEpLCB2YWwpOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogV3JpdGUgYSB0YWJsZSBvZiBDVCBJU0EgcmVnaXN0ZXIKKi8Kc3RhdGljIHZvaWQKY3RMb2FkUmVncyAodW5zaWduZWQgc2hvcnQgaW5kZXgsIENUX0NGR19UQUJMRSAqIHJlZ1RhYikKewoJd2hpbGUgKHJlZ1RhYi0+cmVnICE9IDB4RkYpIHsKCQljdFdyaXRlX2kgKGluZGV4LCByZWdUYWItPnJlZywgcmVnVGFiLT52YWwpOwoJCXJlZ1RhYisrOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkClNldEFyUmVncyAodm9pZCkKewoJaW50IGksIHRtcDsKCglmb3IgKGkgPSAwOyBpIDwgMHgxMDsgaSsrKQoJCWN0V3JpdGVfaSAoQ1RfQVJfTywgaSwgaSk7CglpZiAodGV4dCkKCQl0bXAgPSAweDA0OwoJZWxzZQoJCXRtcCA9IDB4NDE7CgoJY3RXcml0ZV9pIChDVF9BUl9PLCAweDEwLCB0bXApOwkvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KCWN0V3JpdGVfaSAoQ1RfQVJfTywgMHgxMSwgMHgwMCk7CS8qIE92ZXJzY2FuIENvbG9yIFJlZ2lzdGVyICovCgljdFdyaXRlX2kgKENUX0FSX08sIDB4MTIsIDB4MGYpOwkvKiBNZW1vcnkgUGxhbmUgRW5hYmxlIFJlZ2lzdGVyICovCglpZiAoZm50d2lkdGggPT0gOSkKCQl0bXAgPSAweDA4OwoJZWxzZQoJCXRtcCA9IDB4MDA7CgljdFdyaXRlX2kgKENUX0FSX08sIDB4MTMsIHRtcCk7CS8qIEhvcml6b250YWwgUGl4ZWwgUGFubmluZyAqLwoJY3RXcml0ZV9pIChDVF9BUl9PLCAweDE0LCAweDAwKTsJLyogQ29sb3IgU2VsZWN0IFJlZ2lzdGVyICAgICovCgljdFdyaXRlIChDVF9BUl9PLCAweDIwKTsJLyogZW5hYmxlIHZpZGVvICAgICAgICAgICAgICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0R3JSZWdzICh2b2lkKQp7CQkJCS8qIFNldCBHcmFwaGljcyBNb2RlICovCglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgMHgwNTsgaSsrKQoJCWN0V3JpdGVfaSAoQ1RfR1JfTywgaSwgMCk7CglpZiAodGV4dCkgewoJCWN0V3JpdGVfaSAoQ1RfR1JfTywgMHgwNSwgMHgxMCk7CgkJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA2LCAweDAyKTsKCX0gZWxzZSB7CgkJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA1LCAweDQwKTsKCQljdFdyaXRlX2kgKENUX0dSX08sIDB4MDYsIDB4MDUpOwoJfQoJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA3LCAweDBmKTsKCWN0V3JpdGVfaSAoQ1RfR1JfTywgMHgwOCwgMHhmZik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0U3JSZWdzICh2b2lkKQp7CglpbnQgdG1wID0gMDsKCgljdFdyaXRlX2kgKENUX1NSX08sIDB4MDAsIDB4MDApOwkvKiByZXNldCAqLwoJLypyciggc3IsIDB4MDEsIHRtcCApOwoJICAgaWYoIGZudHdpZHRoID09IDggKSB0bXAgfD0gMHgwMTsgZWxzZSB0bXAgJj0gfjB4MDE7CgkgICB3ciggc3IsIDB4MDEsIHRtcCApOyAgKi8KCWlmIChmbnR3aWR0aCA9PSA4KQoJCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMSwgMHgwMSk7CS8qIENsb2NraW5nIE1vZGUgUmVnaXN0ZXIgKi8KCWVsc2UKCQljdFdyaXRlX2kgKENUX1NSX08sIDB4MDEsIDB4MDApOwkvKiBDbG9ja2luZyBNb2RlIFJlZ2lzdGVyICovCgljdFdyaXRlX2kgKENUX1NSX08sIDB4MDIsIDB4MGYpOwkvKiBFbmFibGUgQ1BVIHdyIGFjY2VzcyB0byBnaXZlbiBtZW1vcnkgcGxhbmUgKi8KCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMywgMHgwMCk7CS8qIENoYXJhY3RlciBNYXAgU2VsZWN0IFJlZ2lzdGVyICovCglpZiAodGV4dCkKCQl0bXAgPSAweDAyOwoJZWxzZQoJCXRtcCA9IDB4MGU7CgljdFdyaXRlX2kgKENUX1NSX08sIDB4MDQsIHRtcCk7CS8qIEVuYWJsZSBDUFUgYWNjZXNzZXMgdG8gdGhlIHJlc3Qgb2YgdGhlIDI1NktCCgkJCQkJICAgdG90YWwgVkdBIG1lbW9yeSBiZXlvbmQgdGhlIGZpcnN0IDY0S0IgYW5kIHNldAoJCQkJCSAgIGZiIG1hcHBpbmcgbW9kZS4gKi8KCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMCwgMHgwMyk7CS8qIGVuYWJsZSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkClNldEJpdHNQZXJQaXhlbEludG9YclJlZ3MgKGludCBicHApCnsKCXVuc2lnbmVkIGludCBuID0gKGJwcCA+PiAzKSwgdG1wOwkvKiBvbmx5IGZvciAxNSwgOCwgMTYsIDI0IGJwcCAqLwoJc3RhdGljIGNoYXIgbWRbNF0gPSB7IDB4MDQsIDB4MDIsIDB4MDUsIDB4MDYgfTsJLyogRGlzcGxheUNvbG9yTW9kZSAqLwoJc3RhdGljIGNoYXIgb2ZmWzRdID0geyB+MHgyMCwgfjB4MzAsIH4weDIwLCB+MHgxMCB9OwkvKiBtYXNrICovCglzdGF0aWMgY2hhciBvbls0XSA9IHsgMHgxMCwgMHgwMCwgMHgxMCwgMHgyMCB9OwkvKiBtYXNrICovCglpZiAoYnBwID09IDE1KQoJCW4gPSAwOwoJdG1wID0gY3RSZWFkX2kgKENUX1hSX08sIDB4MjApOwoJdG1wICY9IG9mZltuXTsKCXRtcCB8PSBvbltuXTsKCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHgyMCwgdG1wKTsJLyogQml0QkxUIENvbmZpZ3VyYXRpb24gKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHg4MSwgbWRbbl0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkClNldENyUmVncyAoc3RydWN0IGN0ZmJfcmVzX21vZGVzICp2YXIsIGludCBiaXRzX3Blcl9waXhlbCkKewkJCQkvKiBoZSAtbGUtICAgaHR8MCAgICBoZCAtcmktIGhzICAgICAtaC0gICAgICBoZSAqLwoJdW5zaWduZWQgY2hhciBjclsweDdhXTsKCWludCBpLCB0bXA7Cgl1bnNpZ25lZCBpbnQgaGQsIGhzLCBoZSwgaHQsIGhiZTsJLyogSG9yaXpvbnRhbC4gICovCgl1bnNpZ25lZCBpbnQgdmQsIHZzLCB2ZSwgdnQ7CS8qIHZlcnRpY2FsICovCgl1bnNpZ25lZCBpbnQgYnBwLCB3ZCwgZGJsc2NhbiwgaW50ZXJsYWNlZCwgYmNhc3QsIENydEhhbGZMaW5lOwoJdW5zaWduZWQgaW50IENvbXBTeW5jQ2hhckNsa0RlbGF5LCBDb21wU3luY1BpeGVsQ2xrRGVsYXk7Cgl1bnNpZ25lZCBpbnQgTlRTQ19QQUxfSG9yaXpvbnRhbFB1bHNlV2lkdGgsIEJsRGVsYXlDdHJsOwoJdW5zaWduZWQgaW50IEhvcml6b250YWxFcXVhbGl6YXRpb25QdWxzZXM7Cgl1bnNpZ25lZCBpbnQgSG9yaXpvbnRhbFNlcnJhdGlvbjFTdGFydCwgSG9yaXpvbnRhbFNlcnJhdGlvbjJTdGFydDsKCgljb25zdCBpbnQgTGluZUNvbXBhcmUgPSAweDNmZjsKCXVuc2lnbmVkIGludCBUZXh0U2NhbkxpbmVzID0gMTsJLyogdGhpcyBpcyBpbiBmYWN0IGEgdmVydGljYWwgem9vbSBmYWN0b3IgICAqLwoJdW5zaWduZWQgaW50IFJBTURBQ19CbGFua1BlZGVzdGFsRW5hYmxlID0gMDsJLyogMT1lbi0sIDA9ZGlzYWJsZSwgc2VlIFhSODIgKi8KCgloZCA9ICh2YXItPnhyZXMpIC8gODsJLyogSERpc3AuICAqLwoJaHMgPSAodmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4pIC8gODsJLyogSHNTdHJ0ICAqLwoJaGUgPSAodmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbikgLyA4OwkvKiBIc0VuZCAgICovCglodCA9ICh2YXItPmxlZnRfbWFyZ2luICsgdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbikgLyA4OwkvKiBIVG90YWwgICovCgloYmUgPSBodCAtIDE7CQkvKiBIQmxhbmtFbmFibGUgdG9kbyBkb2N1IHdhbnRzIGh0IGhlcmUsIGJ1dCBpdCBkb2VzIG5vdCB3b3JrICovCgkvKiB2ZSAtdXAtICB2dHwwICAgIHZkIC1sby0gdnMgICAgIC12LSAgICAgIHZlICovCgl2ZCA9IHZhci0+eXJlczsJCS8qIFZEaXNwbGF5ICAgKi8KCXZzID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW47CS8qIFZTeW5jU3RhcnQgKi8KCXZlID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbjsJLyogVlN5bmNFbmQgKi8KCXZ0ID0gdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOwkvKiBWVG90YWwgICovCglicHAgPSBiaXRzX3Blcl9waXhlbDsKCWRibHNjYW4gPSAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkgPyAxIDogMDsKCWludGVybGFjZWQgPSB2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRDsKCWJjYXN0ID0gdmFyLT5zeW5jICYgRkJfU1lOQ19CUk9BRENBU1Q7CglDcnRIYWxmTGluZSA9IGJjYXN0ID8gKGhkID4+IDEpIDogMDsKCUJsRGVsYXlDdHJsID0gYmNhc3QgPyAxIDogMDsKCUNvbXBTeW5jQ2hhckNsa0RlbGF5ID0gMDsJLyogMiBiaXQgKi8KCUNvbXBTeW5jUGl4ZWxDbGtEZWxheSA9IDA7CS8qIDMgYml0ICovCglpZiAoYmNhc3QpIHsKCQlOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aCA9IDc7CS8qKCB2YXItPmhzeW5jX2xlbiA+PiAxICkgKyAxICovCgkJSG9yaXpvbnRhbEVxdWFsaXphdGlvblB1bHNlcyA9IDA7CS8qIGludmVyc2UgdmFsdWUgKi8KCQlIb3Jpem9udGFsU2VycmF0aW9uMVN0YXJ0ID0gMzE7CS8qICggaHQgPj4gMSApICovCgkJSG9yaXpvbnRhbFNlcnJhdGlvbjJTdGFydCA9IDg5OwkvKiAoIGh0ID4+IDEgKSAqLwoJfSBlbHNlIHsKCQlOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aCA9IDA7CgkJLyogNCBiaXQ6IGhzeW5jIHB1bHNlIHdpZHRoID0gKCAoIENSNzRbNDowXSAtIENSNzRbNV0gKQoJCSAqIC8gMiApICsgMSAtLT4gQ1I3NFs0OjBdID0gMiooaHMtMSkgKyBDUjc0WzVdICovCgkJSG9yaXpvbnRhbEVxdWFsaXphdGlvblB1bHNlcyA9IDE7CS8qIGludmVyc2UgdmFsdWUgKi8KCQlIb3Jpem9udGFsU2VycmF0aW9uMVN0YXJ0ID0gMDsJLyogKCBodCA+PiAxICkgKi8KCQlIb3Jpem9udGFsU2VycmF0aW9uMlN0YXJ0ID0gMDsJLyogKCBodCA+PiAxICkgKi8KCX0KCglpZiAoYnBwID09IDE1KQoJCWJwcCA9IDE2OwoJd2QgPSB2YXItPnhyZXMgKiBicHAgLyA2NDsJLyogZG91YmxlIHdvcmRzIHBlciBsaW5lICovCglpZiAoaW50ZXJsYWNlZCkgewkvKiB3ZSBkaXZpZGUgYWxsIHZlcnRpY2FsIHRpbWluZ3MsIGV4ZXB0IHZkICovCgkJdnMgPj49IDE7CgkJdmUgPj49IDE7CgkJdnQgPj49IDE7Cgl9CgltZW1zZXQgKGNyLCAwLCBzaXplb2YgKGNyKSk7CgljclsweDAwXSA9IDB4ZmYgJiAoaHQgLSA1KTsKCWNyWzB4MDFdID0gaGQgLSAxOwkvKiBzb2xsOjRmIGlzdCA1OSAqLwoJY3JbMHgwMl0gPSBoZDsKCWNyWzB4MDNdID0gKGhiZSAmIDB4MUYpIHwgMHg4MDsJLyogaGQgKyBodCAtIGhkICAqLwoJY3JbMHgwNF0gPSBoczsKCWNyWzB4MDVdID0gKChoYmUgJiAweDIwKSA8PCAyKSB8IChoZSAmIDB4MWYpOwoJY3JbMHgwNl0gPSAodnQgLSAyKSAmIDB4RkY7CgljclsweDMwXSA9ICh2dCAtIDIpID4+IDg7CgljclsweDA3XSA9ICgodnQgJiAweDEwMCkgPj4gOCkKCSAgICB8ICgodmQgJiAweDEwMCkgPj4gNykKCSAgICB8ICgodnMgJiAweDEwMCkgPj4gNikKCSAgICB8ICgodnMgJiAweDEwMCkgPj4gNSkKCSAgICB8ICgoTGluZUNvbXBhcmUgJiAweDEwMCkgPj4gNCkKCSAgICB8ICgodnQgJiAweDIwMCkgPj4gNCkKCSAgICB8ICgodmQgJiAweDIwMCkgPj4gMykKCSAgICB8ICgodnMgJiAweDIwMCkgPj4gMik7CgljclsweDA4XSA9IDB4MDA7CgljclsweDA5XSA9IChkYmxzY2FuIDw8IDcpCgkgICAgfCAoKExpbmVDb21wYXJlICYgMHgyMDApID4+IDMpCgkgICAgfCAoKHZzICYgMHgyMDApID4+IDQpCgkgICAgfCAoVGV4dFNjYW5MaW5lcyAtIDEpOwoJY3JbMHgxMF0gPSB2cyAmIDB4ZmY7CS8qIFZTeW5jUHVsc2VTdGFydCAqLwoJY3JbMHgzMl0gPSAodnMgJiAweGYwMCkgPj4gODsJLyogVlN5bmNQdWxzZVN0YXJ0ICovCgljclsweDExXSA9ICh2ZSAmIDB4MGYpOwkvKiB8IDB4MjA7ICAgICAgKi8KCWNyWzB4MTJdID0gKHZkIC0gMSkgJiAweGZmOwkvKiBMaW5lQ291bnQgICovCgljclsweDMxXSA9ICgodmQgLSAxKSAmIDB4ZjAwKSA+PiA4OwkvKiBMaW5lQ291bnQgKi8KCWNyWzB4MTNdID0gd2QgJiAweGZmOwoJY3JbMHg0MV0gPSAod2QgJiAweGYwMCkgPj4gODsKCWNyWzB4MTVdID0gdnMgJiAweGZmOwoJY3JbMHgzM10gPSAodnMgJiAweGYwMCkgPj4gODsKCWNyWzB4MzhdID0gKDB4MTAwICYgKGh0IC0gNSkpID4+IDg7CgljclsweDNDXSA9IDB4YzAgJiBoYmU7CgljclsweDE2XSA9ICh2dCAtIDEpICYgMHhmZjsJLyogdmJlIC0gZG9jdSB3YW50cyB2dCBoZXJlLCAqLwoJY3JbMHgxN10gPSAweGUzOwkvKiBidXQgaXQgZG9lcyBub3Qgd29yayAqLwoJY3JbMHgxOF0gPSAweGZmICYgTGluZUNvbXBhcmU7CgljclsweDIyXSA9IDB4ZmY7CS8qIHRvZG8/ICovCgljclsweDcwXSA9IGludGVybGFjZWQgPyAoMHg4MCB8IENydEhhbGZMaW5lKSA6IDB4MDA7CS8qIGNoZWNrOjB4YTYgICovCgljclsweDcxXSA9IDB4ODAgfCAoUkFNREFDX0JsYW5rUGVkZXN0YWxFbmFibGUgPDwgNikKCSAgICB8IChCbERlbGF5Q3RybCA8PCA1KQoJICAgIHwgKCgweDAzICYgQ29tcFN5bmNDaGFyQ2xrRGVsYXkpIDw8IDMpCgkgICAgfCAoMHgwNyAmIENvbXBTeW5jUGl4ZWxDbGtEZWxheSk7CS8qIHRvZG86IHNlZSBYUjgyICovCgljclsweDcyXSA9IEhvcml6b250YWxTZXJyYXRpb24xU3RhcnQ7CgljclsweDczXSA9IEhvcml6b250YWxTZXJyYXRpb24yU3RhcnQ7CgljclsweDc0XSA9IChIb3Jpem9udGFsRXF1YWxpemF0aW9uUHVsc2VzIDw8IDUpCgkgICAgfCBOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aDsKCS8qIHRvZG86IGN0NjkwMDAgaGFzIGFsc28gMHg3NS03OSAqLwoJLyogbm93IHNldCB0aGUgcmVnaXN0ZXJzICovCglmb3IgKGkgPSAwOyBpIDw9IDB4MGQ7IGkrKykgewkvKkNSMDAgLi4gQ1IwRCAqLwoJCWN0V3JpdGVfaSAoQ1RfQ1JfTywgaSwgY3JbaV0pOwoJfQoJZm9yIChpID0gMHgxMDsgaSA8PSAweDE4OyBpKyspIHsJLypDUjEwIC4uIENSMTggKi8KCQljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCX0KCWkgPSAweDIyOwkJLypDUjIyICovCgljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCWZvciAoaSA9IDB4MzA7IGkgPD0gMHgzMzsgaSsrKSB7CS8qQ1IzMCAuLiBDUjMzICovCgkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7Cgl9CglpID0gMHgzODsJCS8qQ1IzOCAqLwoJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CglpID0gMHgzQzsJCS8qQ1IzQyAqLwoJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7Cglmb3IgKGkgPSAweDQwOyBpIDw9IDB4NDE7IGkrKykgewkvKkNSNDAgLi4gQ1I0MSAqLwoJCWN0V3JpdGVfaSAoQ1RfQ1JfTywgaSwgY3JbaV0pOwoJfQoJZm9yIChpID0gMHg3MDsgaSA8PSAweDc0OyBpKyspIHsJLypDUjcwIC4uIENSNzQgKi8KCQljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCX0KCXRtcCA9IGN0UmVhZF9pIChDVF9DUl9PLCAweDQwKTsKCXRtcCAmPSAweDBmOwoJdG1wIHw9IDB4ODA7CgljdFdyaXRlX2kgKENUX0NSX08sIDB4NDAsIHRtcCk7CS8qIFN0YXJ0QWRkcmVzc0VuYWJsZSAqLwp9CgovKiBwaXhlbGNsb2NrIGNvbnRyb2wgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogV2UgaGF2ZSBhIHJhdGlvbmFsIG51bWJlciBwL3EgYW5kIG5lZWQgYW4gbS9uIHdoaWNoIGlzIHZlcnkgY2xvc2UgdG8gcC9xCiBidXQgaGFzIG0gYW5kIG4gd2l0aGluIG1ubWluIGFuZCBtbm1heC4gV2UgaGF2ZSBubyBmbG9hdGluZyBwb2ludCBpbiB0aGUKIGtlcm5lbC4gV2UgY2FuIHVzZSBsb25nIGxvbmcgd2l0aG91dCBkaXZpZGUuIEFuZCB3ZSBoYXZlIHRpbWUgdG8gY29tcHV0ZS4uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB1bnNpZ25lZCBpbnQKRmluZEJlc3RQUUZpdHRpbmdNTiAodW5zaWduZWQgaW50IHAsIHVuc2lnbmVkIGludCBxLCB1bnNpZ25lZCBpbnQgbW5taW4sCgkJICAgICB1bnNpZ25lZCBpbnQgbW5tYXgsIHVuc2lnbmVkIGludCAqcG0sIHVuc2lnbmVkIGludCAqcG4pCnsKCS8qIHRoaXMgY29kZSBpcyBub3QgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FibGUgYnV0IGdvb2QgZm9yIG91ciBudW1iZXIgcmFuZ2VzICovCgl1bnNpZ25lZCBpbnQgbiA9IG1ubWluLCBtID0gMDsKCWxvbmcgbG9uZyBpbnQgTCA9IDAsIFAgPSBwLCBRID0gcSwgSCA9IFAgPj4gMTsKCWxvbmcgbG9uZyBpbnQgRCA9IDB4N2ZmZmZmZmZmZmZmZmZmTEw7Cglmb3IgKG4gPSBtbm1pbjsgbiA8PSBtbm1heDsgbisrKSB7CgkJbSA9IG1ubWluOwkvKiBwL3EgfiBtL24gLT4gcCpuIH4gbSpxIC0+IHAqbi14KnEgfiAwICovCgkJTCA9IFAgKiBuIC0gbSAqIFE7CS8qIG4gKiB2Y28gLSBtICogZnJlZiBzaG91bGQgYmUgbmVhciAwICovCgkJd2hpbGUgKEwgPiAwICYmIG0gPCBtbm1heCkgewoJCQlMIC09IHE7CS8qIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciBhcyAwIHN1YnRyYWN0IGZyZWYgKi8KCQkJbSsrOwkvKiBhbmQgaW5jcmVtZW50IG0gKi8KCQl9CgkJLyogZGlmZmVyZW5jZSBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gMCBvciBtID4gbWF4aW11bSAqLwoJCWlmIChtID4gbW5tYXgpCgkJCWJyZWFrOwkvKiBubyBzb2x1dGlvbjogaWYgd2UgaW5jcmVhc2UgbiB3ZSBnZXQgdGhlIHNhbWUgc2l0dWF0aW9uICovCgkJLyogTCBpcyA8PSAwIG5vdyAqLwoJCWlmICgtTCA+IEggJiYgbSA+IG1ubWluKSB7CS8qIGlmIGRpZmZlcmVuY2UgPiB0aGUgaGFsZiBmcmVmICovCgkJCUwgKz0gcTsJLyogd2UgdGFrZSB0aGUgc2l0dWF0aW9uIGJlZm9yZSAqLwoJCQltLS07CS8qIGJlY2F1c2UgaXRzIGNsb3NlciB0byAwICovCgkJfQoJCUwgPSAoTCA8IDApID8gLUwgOiArTDsJLyogYWJzb2x1dGUgdmFsdWUgKi8KCQlpZiAoRCA8IEwpCS8qIGlmIGxhc3QgZGlmZmVyZW5jZSB3YXMgYmV0dGVyIHRha2UgbmV4dCBuICovCgkJCWNvbnRpbnVlOwoJCUQgPSBMOwoJCSpwbSA9IG07CgkJKnBuID0gbjsJLyogIGtlZXAgaW1wcm92ZWQgZGF0YSAqLwoJCWlmIChEID09IDApCgkJCWJyZWFrOwkvKiBiZXN0IHJlc3VsdCB3ZSBjYW4gZ2V0ICovCgl9CglyZXR1cm4gKHVuc2lnbmVkIGludCkgKDB4ZmZmZmZmZmYgJiBEKTsKfQoKLyogdGhhdCBpcyB0aGUgaGFyZHdhcmUgPCA2OTAwMCB3ZSBoYXZlIHRvIG1hbmFnZQogKy0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICArLS0rCiB8IFJFRkNMSyAgfF9ffE5UU0MgRGl2aXNvciBTZWxlY3R8X198RlZDTyBSZWZlcmVuY2UgRGl2aXNvcnxfX3z3TnxfXwogfCAxNC4zTUh6IHwgIHwoTlRTQ0RTKSAo9zEsIPc1KSAgfCAgfFNlbGVjdCAoUkRTKSAo9zEsIPc0KSB8ICB8ICB8ICB8CiArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLSsgIHwKICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogfAogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2Y28gICAgICAgICAgICAgICAgICAgICAgZm91dAogfCArLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tKyAgKy0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICAgKy0tLS0rCiArLXwgUGhhc2UgIHxfX3xDaGFyZ2UgUHVtcCB8X198IFZDTyB8X19fX198UG9zdCBEaXZpc29yIChQRCkgIHxfX198Q0xLIHwtLS0+CiArLXwgRGV0ZWN0IHwgIHwmIEZpbHRlciBWQ098ICB8ICAgICB8ICB8ICB89zEsIDIsIDQsIDgsIDE2LCAzMnwgICB8ICAgIHwKIHwgKy0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLSsgICstLS0tLSsgIHwgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgICstLS0tKwogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCAgICArLS0rICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgfAogfF9fX1989018X19ffFZDTyBMb29wIERpdmlkZXxfX19fX19fX19ffAogICAgICB8ICB8ICAgfChWTEQpKPc0LCD3MTYpIHwKICAgICAgKy0tKyAgICstLS0tLS0tLS0tLS0tLS0rCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICB0aGF0IGlzIHRoZSBoYXJkd2FyZSA+PSA2OTAwMCB3ZSBoYXZlIHRvIG1hbmFnZQogKy0tLS0tLS0tLSsgICstLSsKIHwgUkVGQ0xLICB8X1989058X18KIHwgMTQuM01IeiB8ICB8ICB8ICB8CiArLS0tLS0tLS0tKyAgKy0tKyAgfAogIF9fX19fX19fX19fX19fX19fX3wKIHwKIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdmNvICAgICAgICAgICAgICAgICAgICAgIGZvdXQKIHwgKy0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLSsgICstLS0tLSsgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgICstLS0tKwogKy18IFBoYXNlICB8X198Q2hhcmdlIFB1bXAgfF9ffCBWQ08gfF9fX19ffFBvc3QgRGl2aXNvciAoUEQpICB8X19ffENMSyB8LS0tPgogKy18IERldGVjdCB8ICB8JiBGaWx0ZXIgVkNPfCAgfCAgICAgfCAgfCAgfPcxLCAyLCA0LCA4LCAxNiwgMzJ8ICAgfCAgICB8CiB8ICstLS0tLS0tLSsgICstLS0tLS0tLS0tLS0rICArLS0tLS0rICB8ICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICArLS0tLSsKIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwgICAgKy0tKyAgICstLS0tLS0tLS0tLS0tLS0rICAgICAgICAgIHwKIHxfX19ffPdNfF9fX3xWQ08gTG9vcCBEaXZpZGV8X19fX19fX19fX3wKICAgICAgfCAgfCAgIHwoVkxEKSj3MSwg9zQpICB8CiAgICAgICstLSsgICArLS0tLS0tLS0tLS0tLS0tKwoKCiovCgojZGVmaW5lIFZJREVPX0ZSRUYgMTQzMTgxODA7CS8qIEh6ICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKUmVhZFBpeENsY2tGcm9tWHJSZWdzQmFjayAoc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyAqcGFyYW0pCnsKCXVuc2lnbmVkIGludCBtLCBuLCB2bGQsIHBkLCBQRCwgZnJlZiwgeHJfY2IsIGksIHBpeGNsb2NrOwoJaSA9IDA7CglwaXhjbG9jayA9IC0xOwoJZnJlZiA9IFZJREVPX0ZSRUY7CgltID0gY3RSZWFkX2kgKENUX1hSX08sIDB4YzgpOwoJbiA9IGN0UmVhZF9pIChDVF9YUl9PLCAweGM5KTsKCW0gLT0gcGFyYW0tPm1uX2RpZmY7CgluIC09IHBhcmFtLT5tbl9kaWZmOwoJeHJfY2IgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHhjYik7CglQRCA9ICgweDcwICYgeHJfY2IpID4+IDQ7CglwZCA9IDE7Cglmb3IgKGkgPSAwOyBpIDwgUEQ7IGkrKykgewoJCXBkICo9IDI7Cgl9Cgl2bGQgPSAoMHgwNCAmIHhyX2NiKSA/IHBhcmFtLT52bGRfc2V0IDogcGFyYW0tPnZsZF9ub3Rfc2V0OwoJaWYgKG4gKiB2bGQgKiBtKSB7CgkJdW5zaWduZWQgbG9uZyBsb25nIHAgPSAxMDAwMDAwMDAwMDAwTEwgKiBwZCAqIG47CgkJdW5zaWduZWQgbG9uZyBsb25nIHEgPSAobG9uZyBsb25nKSBmcmVmICogdmxkICogbTsKCQl3aGlsZSAoKHAgPiAweGZmZmZmZmZmTEwpIHx8IChxID4gMHhmZmZmZmZmZkxMKSkgewoJCQlwID4+PSAxOwkvKiBjYW4ndCBkaXZpZGUgd2l0aCBsb25nIGxvbmcgc28gd2Ugc2NhbGUgZG93biAqLwoJCQlxID4+PSAxOwoJCX0KCQlwaXhjbG9jayA9ICh1bnNpZ25lZCkgcCAvICh1bnNpZ25lZCkgcTsKCX0gZWxzZQoJCXByaW50ZiAoIkludmFsaWQgZGF0YSBpbiB4ciByZWdzLlxuIik7CglyZXR1cm4gcGl4Y2xvY2s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKRmluZEFuZFNldFBsbFBhcmFtSW50b1hyUmVncyAodW5zaWduZWQgaW50IHBpeGVsY2xvY2ssCgkJCSAgICAgIHN0cnVjdCBjdGZiX2NoaXBzX3Byb3BlcnRpZXMgKnBhcmFtKQp7Cgl1bnNpZ25lZCBpbnQgbSwgbiwgdmxkLCBwZCwgUEQsIGZyZWYsIHhyX2NiOwoJdW5zaWduZWQgaW50IGZ2Y29taW4sIGZ2Y29tYXgsIHBjbGNrbWluLCBwY2xja21heCwgcGNsazsKCXVuc2lnbmVkIGludCBwZnJlcSwgZnZjbywgbmV3X3BpeGNsb2NrOwoJdW5zaWduZWQgaW50IEQsbmJhY2ssbWJhY2s7CgoJZnJlZiA9IFZJREVPX0ZSRUY7CglwZCA9IDE7CglQRCA9IDA7CglmdmNvbWluID0gcGFyYW0tPnZjb19taW47CglmdmNvbWF4ID0gcGFyYW0tPnZjb19tYXg7CS8qIE1IeiAqLwoJcGNsY2ttaW4gPSAxMDAwMDAwIC8gZnZjb21heCArIDE7CS8qICAgNDU0NiAqLwoJcGNsY2ttYXggPSAzMjAwMDAwMCAvIGZ2Y29taW4gLSAxOwkvKiA2NjY2NjUgKi8KCXBjbGsgPSBtaW5tYXggKHBjbGNrbWluLCBwaXhlbGNsb2NrLCBwY2xja21heCk7CS8qIHBzIHBwICovCglwZnJlcSA9IDI1MCAqICg0MDAwMDAwMDAwVSAvIHBjbGspOwoJZnZjbyA9IHBmcmVxOwkJLyogSHogKi8KCW5ld19waXhjbG9jayA9IDA7Cgl3aGlsZSAoZnZjbyA8IGZ2Y29taW4gKiAxMDAwMDAwKSB7CgkJLyogZG91YmxlIFZDTyBzdGFydGluZyB3aXRoIHRoZSBwaXhlbGNsb2NrIGZyZXF1ZW5jeQoJCSAqIGFzIGxvbmcgYXMgaXQgaXMgbG93ZXIgdGhhbiB0aGUgbWluaW1hbCBWQ08gZnJlcXVlbmN5ICovCgkJZnZjbyAqPSAyOwoJCXBkICo9IDI7CgkJUEQrKzsKCX0KCS8qIGZ2Y28gaXMgZXhhY3RseSBwZCAqIHBpeGVsY2xvY2sgYW5kIGhpZ2hlciB0aGFuIHRoZSBuaW5tYWwgVkNPIGZyZXF1ZW5jeSAqLwoJLyogZmlyc3QgdHJ5ICovCgl2bGQgPSBwYXJhbS0+dmxkX3NldDsKCUQ9RmluZEJlc3RQUUZpdHRpbmdNTiAoZnZjbyAvIHZsZCwgZnJlZiwgcGFyYW0tPm1uX21pbiwgcGFyYW0tPm1uX21heCwgJm0sICZuKTsgLyogcmRzID0gMSAqLwoJbWJhY2s9bTsKCW5iYWNrPW47CgkvKiBzZWNvbmQgdHJ5ICovCgl2bGQgPSBwYXJhbS0+dmxkX25vdF9zZXQ7CglpZihEPEZpbmRCZXN0UFFGaXR0aW5nTU4gKGZ2Y28gLyB2bGQsIGZyZWYsIHBhcmFtLT5tbl9taW4sIHBhcmFtLT5tbl9tYXgsICZtLCAmbikpIHsgICAgLyogcmRzID0gMSAqLwoJCS8qIGZpcnN0IHRyeSB3YXMgYmV0dGVyICovCgkJbT1tYmFjazsKCQluPW5iYWNrOwoJCXZsZCA9IHBhcmFtLT52bGRfc2V0OwoJfQoJbSArPSBwYXJhbS0+bW5fZGlmZjsKCW4gKz0gcGFyYW0tPm1uX2RpZmY7CglQUklOVEYgKCJWQ08gJWQsIHBkICVkLCBtICVkIG4gJWQgdmxkICVkIFxuIiwgZnZjbywgcGQsIG0sIG4sIHZsZCk7Cgl4cl9jYiA9ICgoMHg3ICYgUEQpIDw8IDQpIHwgKHZsZCA9PSBwYXJhbS0+dmxkX3NldCA/IDB4MDQgOiAwKTsKCS8qIEFsbCBmb3VyIG9mIHRoZSByZWdpc3RlcnMgdXNlZCBmb3IgZG90IGNsb2NrIDIgKFhSQzggLSBYUkNCKSBtdXN0IGJlCgkgKiB3cml0dGVuLCBhbmQgaW4gb3JkZXIgZnJvbSBYUkM4IHRvIFhSQ0IsIGJlZm9yZSB0aGUgaGFyZHdhcmUgd2lsbAoJICogdXBkYXRlIHRoZSBzeW50aGVzaXplciBzIHNldHRpbmdzLgoJICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4YzgsIG0pOwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGM5LCBuKTsJLyogeHJjYSBkb2VzIG5vdCBleGlzdCBpbiBDVDY5MDAwIGFuZCBDVDY5MDMwICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4Y2EsIDApOwkvKiBiZWNhdXNlIG9mIGEgaHcgYnVnIEkgZ3Vlc3MsIGJ1dCB3ZSB3cml0ZSAqLwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGNiLCB4cl9jYik7CS8qIDAgdG8gaXQgZm9yIHNhdmV0eSAqLwoJbmV3X3BpeGNsb2NrID0gUmVhZFBpeENsY2tGcm9tWHJSZWdzQmFjayAocGFyYW0pOwoJUFJJTlRGICgicGl4ZWxjbG9jay5zZXQgPSAlZCwgcGl4ZWxjbG9jay5yZWFsID0gJWQgXG4iLAoJCXBpeGVsY2xvY2ssIG5ld19waXhjbG9jayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0TXNyUmVncyAoc3RydWN0IGN0ZmJfcmVzX21vZGVzICptb2RlKQp7Cgl1bnNpZ25lZCBjaGFyIGhfc3luY2hfaGlnaCwgdl9zeW5jaF9oaWdoOwoKCWhfc3luY2hfaGlnaCA9IChtb2RlLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpID8gMCA6IDB4NDA7CS8qIGhvcml6b250YWwgU3luY2ggSGlnaCBhY3RpdmUgKi8KCXZfc3luY2hfaGlnaCA9IChtb2RlLT5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSA/IDAgOiAweDgwOwkvKiB2ZXJ0aWNhbCBTeW5jaCBIaWdoIGFjdGl2ZSAqLwoJY3RXcml0ZSAoQ1RfTVNSX1dfTywgKGhfc3luY2hfaGlnaCB8IHZfc3luY2hfaGlnaCB8IDB4MjkpKTsKCS8qIHVwcGVyNjRLPT0weDIwLCBDTEMyc2VsZWN0PT0weDA4LCBSQU1lbmFibGU9PTB4MDIhKHRvZG8pLCBDR0E9PTB4MDEKCSAqIFNlbGVjdHMgdGhlIHVwcGVyIDY0S0IgcGFnZS5CaXQ1PTEKCSAqIENMSzIgKGxlZnQgcmVzZXJ2ZWQgaW4gc3RhbmRhcmQgVkdBKSBCaXQzfDI9MXwwCgkgKiBEaXNhYmxlcyBDUFUgYWNjZXNzIHRvIGZyYW1lIGJ1ZmZlci4gQml0MT0wCgkgKiBTZXRzIHRoZSBJL08gYWRkcmVzcyBkZWNvZGUgZm9yIFNUMDEsIEZDUiwgYW5kIGFsbCBDUiByZWdpc3RlcnMKCSAqIHRvIHRoZSAzRHggSS9PIGFkZHJlc3MgcmFuZ2UgKENHQSBlbXVsYXRpb24pLiBCaXQwPTEKCSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWZkZWYgVkdBX0RVTVBfUkVHCgpzdGF0aWMgdm9pZApjdERpc3BSZWdzICh1bnNpZ25lZCBzaG9ydCBpbmRleCwgaW50IGZyb20sIGludCB0bykKewoJdW5zaWduZWQgY2hhciBzdGF0dXM7CglpbnQgaTsKCglmb3IgKGkgPSBmcm9tOyBpIDwgdG87IGkrKykgewoJCXN0YXR1cyA9IGN0UmVhZF9pIChpbmRleCwgaSk7CgkJcHJpbnRmICgiJTAyWDogaXMgJTAyWFxuIiwgaSwgc3RhdHVzKTsKCX0KfQoKdm9pZAp2aWRlb19kdW1wX3JlZyAodm9pZCkKewoJaW50IGk7CgoJcHJpbnRmICgiRXh0ZW5kZWQgUmVnczpcbiIpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMCwgMHhDKTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4ZSwgMHhmKTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4MjAsIDB4MjEpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHg0MCwgMHg1MCk7CgljdERpc3BSZWdzIChDVF9YUl9PLCAweDYwLCAweDY0KTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NjcsIDB4NjgpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHg3MCwgMHg3Mik7CgljdERpc3BSZWdzIChDVF9YUl9PLCAweDgwLCAweDgzKTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4QTAsIDB4QjApOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHhDMCwgMHhEMyk7CglwcmludGYgKCJTZXF1ZW5jZXIgUmVnczpcbiIpOwoJY3REaXNwUmVncyAoQ1RfU1JfTywgMCwgMHg4KTsKCXByaW50ZiAoIkdyYXBoaWMgUmVnczpcbiIpOwoJY3REaXNwUmVncyAoQ1RfR1JfTywgMCwgMHg5KTsKCXByaW50ZiAoIkNSVCBSZWdzOlxuIik7CgljdERpc3BSZWdzIChDVF9DUl9PLCAwLCAweDE5KTsKCWN0RGlzcFJlZ3MgKENUX0NSX08sIDB4MjIsIDB4MjMpOwoJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgzMCwgMHgzNCk7CgljdERpc3BSZWdzIChDVF9DUl9PLCAweDM4LCAweDM5KTsKCWN0RGlzcFJlZ3MgKENUX0NSX08sIDB4M0MsIDB4M0QpOwoJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHg0MCwgMHg0Mik7CgljdERpc3BSZWdzIChDVF9DUl9PLCAweDcwLCAweDgwKTsKCS8qIGRvbid0IGRpc3BsYXkgdGhlIGF0dHJpYnV0ZXMgKi8KfQoKI2VuZGlmCgojaWZkZWYgQ09ORklHX1ZJREVPX0hXX0NVUlNPUgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNldCBIYXJkd2FyZSBDdXJzb3IgaW4gUGl4ZWwKICovCnZvaWQKdmlkZW9fc2V0X2h3X2N1cnNvciAoaW50IHgsIGludCB5KQp7CglpbnQgc2lnX3ggPSAwLCBzaWdfeSA9IDA7CglpZiAoeCA8IDApIHsKCQl4ICo9IC0xOwoJCXNpZ194ID0gMTsKCX0KCWlmICh5IDwgMCkgewoJCXkgKj0gLTE7CgkJc2lnX3kgPSAxOwoJfQoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGE0LCB4ICYgMHhmZik7CgljdFdyaXRlX2kgKENUX1hSX08sIDB4YTUsICh4ID4+IDgpICYgMHg3KTsKCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhNiwgeSAmIDB4ZmYpOwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGE3LCAoeSA+PiA4KSAmIDB4Nyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSW5pdCBIYXJkd2FyZSBDdXJzb3IuIFRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEN1cnNvciwKICogd2UgaGF2ZSB0byBrbm93IHRoZSBGb250IHNpemUuCiAqLwp2b2lkCnZpZGVvX2luaXRfaHdfY3Vyc29yIChpbnQgZm9udF93aWR0aCwgaW50IGZvbnRfaGVpZ2h0KQp7Cgl1bnNpZ25lZCBjaGFyIHhyXzgwOwoJdW5zaWduZWQgbG9uZyAqY3VycywgcGF0dGVybjsKCWludCBpOwoJaW50IGN1cnNvcl9zdGFydDsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCgljdXJzb3Jfc3RhcnQgPSBwR0QtPmRwckJhc2U7Cgl4cl84MCA9IGN0UmVhZF9pIChDVF9YUl9PLCAweDgwKTsKCS8qIHNldCBzdGFydCBhZGRyZXNzICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4YTIsIChjdXJzb3Jfc3RhcnQgPj4gOCkgJiAweGYwKTsKCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhMywgKGN1cnNvcl9zdGFydCA+PiAxNikgJiAweDNmKTsKCS8qIHNldCBjdXJzb3Igc2hhcGUgKi8KCWN1cnMgPSAodW5zaWduZWQgbG9uZyAqKSBjdXJzb3Jfc3RhcnQ7CglpID0gMDsKCXdoaWxlIChpIDwgMHg0MDApIHsKCQljdXJzW2krK10gPSAweGZmZmZmZmZmOwkvKiBBTkQgbWFzayAqLwoJCWN1cnNbaSsrXSA9IDB4ZmZmZmZmZmY7CS8qIEFORCBtYXNrICovCgkJY3Vyc1tpKytdID0gMDsJLyogWE9SIG1hc2sgKi8KCQljdXJzW2krK10gPSAwOwkvKiBYT1IgbWFzayAqLwoJCS8qIFRyYW5zcGFyZW50ICovCgl9CglwYXR0ZXJuID0gMHhmZmZmZmZmZiA+PiBmb250X3dpZHRoOwoJaSA9IDA7Cgl3aGlsZSAoaSA8IChmb250X2hlaWdodCAqIDIpKSB7CgkJY3Vyc1tpKytdID0gcGF0dGVybjsJLyogQU5EIG1hc2sgKi8KCQljdXJzW2krK10gPSBwYXR0ZXJuOwkvKiBBTkQgbWFzayAqLwoJCWN1cnNbaSsrXSA9IDA7CS8qIFhPUiBtYXNrICovCgkJY3Vyc1tpKytdID0gMDsJLyogWE9SIG1hc2sgKi8KCQkvKiBDdXJzb3IgQ29sb3IgMCAqLwoJfQoJLyogc2V0IGJsaW5rIHJhdGUgKi8KCWN0V3JpdGVfaSAoQ1RfRlBfTywgMHgxOSwgMHhmKTsKCgkvKiBzZXQgY3Vyc29ycyBjb2xvcnMgKi8KCXhyXzgwID0gY3RSZWFkX2kgKENUX1hSX08sIDB4ODApOwoJeHJfODAgfD0gMHgxOwkJLyogYWx0ZXJuYXRlIHBhbGV0dGUgc2VsZWN0ICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4ODAsIHhyXzgwKTsKCXZpZGVvX3NldF9sdXQgKDQsIENPTlNPTEVfRkdfQ09MLCBDT05TT0xFX0ZHX0NPTCwgQ09OU09MRV9GR19DT0wpOwoJLyogcG9zaXRpb24gNCBpcyBjb2xvciAwIGN1cnNvciAwICovCgl4cl84MCAmPSAweGZlOwkJLyogbm9ybWFsIHBhbGV0dGUgc2VsZWN0ICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4ODAsIHhyXzgwKTsKCS8qIGN1cnNvciBlbmFibGUgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhMCwgMHg5MSk7Cgl4cl84MCB8PSAweDEwOwkJLyogZW5hYmxlIGh3Y3Vyc29yICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4ODAsIHhyXzgwKTsKCXZpZGVvX3NldF9od19jdXJzb3IgKDAsIDApOwp9CiNlbmRpZgkJCQkvKiBDT05GSUdfVklERU9fSFdfQ1VSU09SICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdhaXQgZm9yIEJpdEJsdCByZWFkeQogKi8Kc3RhdGljIGludAp2aWRlb193YWl0X2JpdGJsdCAodW5zaWduZWQgbG9uZyBhZGRyKQp7Cgl1bnNpZ25lZCBsb25nIGJyMDQ7CglpbnQgaSA9IDA7CglicjA0ID0gaW4zMnIgKGFkZHIpOwoJd2hpbGUgKGJyMDQgJiAweDgwMDAwMDAwKSB7CgkJdWRlbGF5ICgxKTsKCQlicjA0ID0gaW4zMnIgKGFkZHIpOwoJCWlmIChpKysgPiAxMDAwMDAwKSB7CgkJCXByaW50ZiAoIkVSUk9SIFRpbWVvdXQgJWx4XG4iLCBicjA0KTsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0IHVwIEJpdEJsdCBSZWdpc3RycwogKi8Kc3RhdGljIHZvaWQKU2V0RHJhd2luZ0VuZ2luZSAoaW50IGJpdHNfcGVyX3BpeGVsKQp7Cgl1bnNpZ25lZCBsb25nIGJyMDQsIGJyMDA7Cgl1bnNpZ25lZCBjaGFyIHRtcDsKCglHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CgoJdG1wID0gY3RSZWFkX2kgKENUX1hSX08sIDB4MjApOwkvKiBCaXRCTFQgQ29uZmlndXJhdGlvbiAqLwoJdG1wIHw9IDB4MDI7CQkvKiByZXNldCBCaXRCTFQgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHgyMCwgdG1wKTsJLyogQml0QkxUIENvbmZpZ3VyYXRpb24gKi8KCXVkZWxheSAoMTApOwoJdG1wICY9IDB4ZmQ7CQkvKiByZWxlYXNlIHJlc2V0IEJpdEJMVCAqLwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweDIwLCB0bXApOwkvKiBCaXRCTFQgQ29uZmlndXJhdGlvbiAqLwoJdmlkZW9fd2FpdF9iaXRibHQgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7CgoJLyogc2V0IHBhdHRlcm4gQWRkcmVzcyAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA1X28sIFBBVFRFUk5fQURSICYgMHgwMDNmZmZmOCk7CglicjA0ID0gMDsKCWlmIChiaXRzX3Blcl9waXhlbCA9PSAxKSB7CgkJYnIwNCB8PSAweDAwMDQwMDAwOwkvKiBtb25vY2hvbWUgUGF0dGVybiAqLwoJCWJyMDQgfD0gMHgwMDAwMTAwMDsJLyogbW9ub2Nob21lIHNvdXJjZSAqLwoJfQoJYnIwMCA9ICgocEdELT53aW5TaXplWCAqIHBHRC0+Z2RmQnl0ZXNQUCkgPDwgMTYpICsgKHBHRC0+d2luU2l6ZVggKiBwR0QtPmdkZkJ5dGVzUFApOwkvKiBieXRlcyBwZXIgc2NhbmxpbmUgKi8KCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwMF9vLCBicjAwKTsJLyogKi8KCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwOF9vLCAoMTAgPDwgMTYpICsgMTApOwkvKiBkdW1teSAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA0X28sIGJyMDQpOwkvKiB3cml0ZSBhbGwgMCAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA3X28sIDApOwkvKiBkZXN0aW5hdGlvbiAqLwoJdmlkZW9fd2FpdF9iaXRibHQgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogc3VwcG9ydGVkIFZpZGVvIENoaXBzCiovCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdXBwb3J0ZWRbXSA9IHsKCXtQQ0lfVkVORE9SX0lEX0NULCBQQ0lfREVWSUNFX0lEX0NUXzY5MDAwfSwKCXt9Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogSW5pdCB2aWRlbyBjaGlwCiovCnZvaWQgKgp2aWRlb19od19pbml0ICh2b2lkKQp7CglHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7Cgl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CglwY2lfZGV2X3QgZGV2YnVzZm47CglpbnQgdmlkZW9tb2RlOwoJdW5zaWduZWQgbG9uZyB0MSwgaHN5bmNoLCB2c3luY2g7Cgl1bnNpZ25lZCBpbnQgcGNpX21lbV9iYXNlLCAqdm07CglpbnQgdG1wLCBpLCBiaXRzX3Blcl9waXhlbDsKCWNoYXIgKnBlbnY7CglzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKnJlc19tb2RlOwoJc3RydWN0IGN0ZmJfcmVzX21vZGVzIHZhcl9tb2RlOwoJc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyAqY2hpcHNfcGFyYW07CgkvKiBTZWFyY2ggZm9yIHZpZGVvIGNoaXAgKi8KCglpZiAoKGRldmJ1c2ZuID0gcGNpX2ZpbmRfZGV2aWNlcyAoc3VwcG9ydGVkLCAwKSkgPCAwKSB7CiNpZmRlZiBDT05GSUdfVklERU9fT05CT0FSRAoJCXByaW50ZiAoIlZpZGVvOiBDb250cm9sbGVyIG5vdCBmb3VuZCAhXG4iKTsKI2VuZGlmCgkJcmV0dXJuIChOVUxMKTsKCX0KCgkvKiBQQ0kgc2V0dXAgKi8KCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldmJ1c2ZuLCBQQ0lfQ09NTUFORCwKCQkJCShQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTykpOwoJcGNpX3JlYWRfY29uZmlnX3dvcmQgKGRldmJ1c2ZuLCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2YnVzZm4sIFBDSV9CQVNFX0FERFJFU1NfMCwgJnBjaV9tZW1fYmFzZSk7CglwY2lfbWVtX2Jhc2UgPSBwY2lfbWVtX3RvX3BoeXMgKGRldmJ1c2ZuLCBwY2lfbWVtX2Jhc2UpOwoKCS8qIGdldCBjaGlwcyBwYXJhbXMgKi8KCWZvciAoY2hpcHNfcGFyYW0gPSAoc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyAqKSAmY2hpcHNbMF07CgkgICAgIGNoaXBzX3BhcmFtLT5kZXZpY2VfaWQgIT0gMDsgY2hpcHNfcGFyYW0rKykgewoJCWlmIChjaGlwc19wYXJhbS0+ZGV2aWNlX2lkID09IGRldmljZV9pZCkKCQkJYnJlYWs7Cgl9CglpZiAoY2hpcHNfcGFyYW0tPmRldmljZV9pZCA9PSAwKSB7CiNpZmRlZiBDT05GSUdfVklERU9fT05CT0FSRAoJCXByaW50ZiAoIlZpZGVvOiBjb250cm9sbGVyIDB4JVggbm90IHN1cHBvcnRlZFxuIiwgZGV2aWNlX2lkKTsKI2VuZGlmCgkJcmV0dXJuIE5VTEw7Cgl9CgkvKiBzdXBwb3J0ZWQgVmlkZW8gY29udHJvbGxlciBmb3VuZCAqLwoJcHJpbnRmICgiVmlkZW86ICIpOwoKCXRtcCA9IDA7Cgl2aWRlb21vZGUgPSAweDMwMTsKCS8qIGdldCB2aWRlbyBtb2RlIHZpYSBlbnZpcm9ubWVudCAqLwoJaWYgKChwZW52ID0gZ2V0ZW52ICgidmlkZW9tb2RlIikpICE9IE5VTEwpIHsKCQkvKiBkZWNlaWRlIGlmIGl0IGlzIGEgc3RyaW5nICovCgkJaWYgKHBlbnZbMF0gPD0gJzknKSB7CgkJCXZpZGVvbW9kZSA9IChpbnQpIHNpbXBsZV9zdHJ0b3VsIChwZW52LCBOVUxMLCAxNik7CgkJCXRtcCA9IDE7CgkJfQoJfSBlbHNlIHsKCQl0bXAgPSAxOwoJfQoJaWYgKHRtcCkgewoJCS8qIHBhcmFtZXRlciBhcmUgdmVzYSBtb2RlcyAqLwoJCS8qIHNlYXJjaCBwYXJhbXMgKi8KCQlmb3IgKGkgPSAwOyBpIDwgVkVTQV9NT0RFU19DT1VOVDsgaSsrKSB7CgkJCWlmICh2ZXNhX21vZGVzW2ldLnZlc2FuciA9PSB2aWRlb21vZGUpCgkJCQlicmVhazsKCQl9CgkJaWYgKGkgPT0gVkVTQV9NT0RFU19DT1VOVCkgewoJCQlwcmludGYgKCJubyBWRVNBIE1vZGUgZm91bmQsIHN3aXRjaGluZyB0byBtb2RlIDB4MzAxICIpOwoJCQlpID0gMDsKCQl9CgkJcmVzX21vZGUgPQoJCSAgICAoc3RydWN0IGN0ZmJfcmVzX21vZGVzICopICZyZXNfbW9kZV9pbml0W3Zlc2FfbW9kZXNbaV0uCgkJCQkJCQkgICAgIHJlc2luZGV4XTsKCQliaXRzX3Blcl9waXhlbCA9IHZlc2FfbW9kZXNbaV0uYml0c19wZXJfcGl4ZWw7Cgl9IGVsc2UgewoKCQlyZXNfbW9kZSA9IChzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKikgJnZhcl9tb2RlOwoJCWJpdHNfcGVyX3BpeGVsID0gdmlkZW9fZ2V0X3BhcmFtcyAocmVzX21vZGUsIHBlbnYpOwoJfQoKCS8qIGNhbGN1bGF0ZSBhdmFpbGFibGUgY29sb3IgZGVwdGggZm9yIGNvbnRyb2xsZXIgbWVtb3J5ICovCglpZiAoYml0c19wZXJfcGl4ZWwgPT0gMTUpCgkJdG1wID0gMjsKCWVsc2UKCQl0bXAgPSBiaXRzX3Blcl9waXhlbCA+PiAzOwkvKiAvOCAqLwoJaWYgKCgoY2hpcHNfcGFyYW0tPm1heF9tZW0gLQoJICAgICAgQUNDRUxNRU1PUlkpIC8gKHJlc19tb2RlLT54cmVzICogcmVzX21vZGUtPnlyZXMpKSA8IHRtcCkgewoJCXRtcCA9CgkJICAgICgoY2hpcHNfcGFyYW0tPm1heF9tZW0gLQoJCSAgICAgIEFDQ0VMTUVNT1JZKSAvIChyZXNfbW9kZS0+eHJlcyAqIHJlc19tb2RlLT55cmVzKSk7CgkJaWYgKHRtcCA9PSAwKSB7CgkJCXByaW50ZgoJCQkgICAgKCJObyBtYXRjaGluZyB2aWRlb21vZGUgZm91bmQgLi0+IHJlZHVjZSByZXNvbHV0aW9uXG4iKTsKCQkJcmV0dXJuIE5VTEw7CgkJfSBlbHNlIHsKCQkJcHJpbnRmICgiU3dpdGNoaW5nIGJhY2sgdG8gJWQgQml0cyBwZXIgUGl4ZWwgIiwKCQkJCXRtcCA8PCAzKTsKCQkJYml0c19wZXJfcGl4ZWwgPSB0bXAgPDwgMzsKCQl9Cgl9CgoJLyogY2FsY3VsYXRlIGhzeW5jaCBhbmQgdnN5bmNoIGZyZXEgKGluZm8gb25seSkgKi8KCXQxID0gKHJlc19tb2RlLT5sZWZ0X21hcmdpbiArIHJlc19tb2RlLT54cmVzICsKCSAgICAgIHJlc19tb2RlLT5yaWdodF9tYXJnaW4gKyByZXNfbW9kZS0+aHN5bmNfbGVuKSAvIDg7Cgl0MSAqPSA4OwoJdDEgKj0gcmVzX21vZGUtPnBpeGNsb2NrOwoJdDEgLz0gMTAwMDsKCWhzeW5jaCA9IDEwMDAwMDAwMDBMIC8gdDE7Cgl0MSAqPQoJICAgIChyZXNfbW9kZS0+dXBwZXJfbWFyZ2luICsgcmVzX21vZGUtPnlyZXMgKwoJICAgICByZXNfbW9kZS0+bG93ZXJfbWFyZ2luICsgcmVzX21vZGUtPnZzeW5jX2xlbik7Cgl0MSAvPSAxMDAwOwoJdnN5bmNoID0gMTAwMDAwMDAwMEwgLyB0MTsKCgkvKiBmaWxsIGluIEdyYXBoaWMgZGV2aWNlIHN0cnVjdCAqLwoJc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsICIlZHglZHglZCAlbGRrSHogJWxkSHoiLCByZXNfbW9kZS0+eHJlcywKCQkgcmVzX21vZGUtPnlyZXMsIGJpdHNfcGVyX3BpeGVsLCAoaHN5bmNoIC8gMTAwMCksCgkJICh2c3luY2ggLyAxMDAwKSk7CglwcmludGYgKCIlc1xuIiwgcEdELT5tb2RlSWRlbnQpOwoJcEdELT53aW5TaXplWCA9IHJlc19tb2RlLT54cmVzOwoJcEdELT53aW5TaXplWSA9IHJlc19tb2RlLT55cmVzOwoJcEdELT5wbG5TaXplWCA9IHJlc19tb2RlLT54cmVzOwoJcEdELT5wbG5TaXplWSA9IHJlc19tb2RlLT55cmVzOwoJc3dpdGNoIChiaXRzX3Blcl9waXhlbCkgewoJY2FzZSA4OgoJCXBHRC0+Z2RmQnl0ZXNQUCA9IDE7CgkJcEdELT5nZGZJbmRleCA9IEdERl9fOEJJVF9JTkRFWDsKCQlicmVhazsKCWNhc2UgMTU6CgkJcEdELT5nZGZCeXRlc1BQID0gMjsKCQlwR0QtPmdkZkluZGV4ID0gR0RGXzE1QklUXzU1NVJHQjsKCQlicmVhazsKCWNhc2UgMTY6CgkJcEdELT5nZGZCeXRlc1BQID0gMjsKCQlwR0QtPmdkZkluZGV4ID0gR0RGXzE2QklUXzU2NVJHQjsKCQlicmVhazsKCWNhc2UgMjQ6CgkJcEdELT5nZGZCeXRlc1BQID0gMzsKCQlwR0QtPmdkZkluZGV4ID0gR0RGXzI0QklUXzg4OFJHQjsKCQlicmVhazsKCX0KCXBHRC0+aXNhQmFzZSA9IENGR19JU0FfSU9fQkFTRV9BRERSRVNTOwoJcEdELT5wY2lCYXNlID0gcGNpX21lbV9iYXNlOwoJcEdELT5mcmFtZUFkcnMgPSBwY2lfbWVtX2Jhc2U7CglwR0QtPm1lbVNpemUgPSBjaGlwc19wYXJhbS0+bWF4X21lbTsKCS8qIEN1cnNvciBTdGFydCBBZGRyZXNzICovCglwR0QtPmRwckJhc2UgPQoJICAgIChwR0QtPndpblNpemVYICogcEdELT53aW5TaXplWSAqIHBHRC0+Z2RmQnl0ZXNQUCkgKyBwY2lfbWVtX2Jhc2U7CglpZiAoKHBHRC0+ZHByQmFzZSAmIDB4MGZmZikgIT0gMCkgewoJCS8qIGFsbGlnbiBpdCAqLwoJCXBHRC0+ZHByQmFzZSAmPSAweGZmZmZmMDAwOwoJCXBHRC0+ZHByQmFzZSArPSAweDAwMDAxMDAwOwoJfQoJUFJJTlRGICgiQ3Vyc29yIFN0YXJ0ICV4IFBhdHRlcm4gU3RhcnQgJXhcbiIsIHBHRC0+ZHByQmFzZSwKCQlQQVRURVJOX0FEUik7CglwR0QtPnZwckJhc2UgPSBwY2lfbWVtX2Jhc2U7CS8qIER1bW15ICovCglwR0QtPmNwckJhc2UgPSBwY2lfbWVtX2Jhc2U7CS8qIER1bW15ICovCgkvKiBzZXQgdXAgSGFyZHdhcmUgKi8KCgljdFdyaXRlIChDVF9NU1JfV19PLCAweDAxKTsKCgkvKiBzZXQgdGhlIGV4dGVuZGVkIFJlZ2lzdGVycyAqLwoJY3RMb2FkUmVncyAoQ1RfWFJfTywgeHJlZyk7CgkvKiBzZXQgYXRyaWJ1dGUgcmVnaXN0ZXJzICovCglTZXRBclJlZ3MgKCk7CgkvKiBzZXQgR3JhcGhpY3MgcmVnaXN0ZXIgKi8KCVNldEdyUmVncyAoKTsKCS8qIHNldCBzZXF1ZW5jZXIgKi8KCVNldFNyUmVncyAoKTsKCgkvKiBzZXQgbXNyICovCglTZXRNc3JSZWdzIChyZXNfbW9kZSk7CgoJLyogc2V0IENSVCBSZWdpc3RlcnMgKi8KCVNldENyUmVncyAocmVzX21vZGUsIGJpdHNfcGVyX3BpeGVsKTsKCS8qIHNldCBjb2xvciBtb2RlICovCglTZXRCaXRzUGVyUGl4ZWxJbnRvWHJSZWdzIChiaXRzX3Blcl9waXhlbCk7CgoJLyogc2V0IFBMTCAqLwoJRmluZEFuZFNldFBsbFBhcmFtSW50b1hyUmVncyAocmVzX21vZGUtPnBpeGNsb2NrLCBjaGlwc19wYXJhbSk7CgoJY3RXcml0ZV9pIChDVF9TUl9PLCAwLCAweDAzKTsJLyogY2xlYXIgc3luY2hyb25vdXMgcmVzZXQgKi8KCS8qIENsZWFyIHZpZGVvIG1lbW9yeSAqLwoJaSA9IHBHRC0+bWVtU2l6ZSAvIDQ7Cgl2bSA9ICh1bnNpZ25lZCBpbnQgKikgcEdELT5wY2lCYXNlOwoJd2hpbGUgKGktLSkKCQkqdm0rKyA9IDA7CglTZXREcmF3aW5nRW5naW5lIChiaXRzX3Blcl9waXhlbCk7CiNpZmRlZiBWR0FfRFVNUF9SRUcKCXZpZGVvX2R1bXBfcmVnICgpOwojZW5kaWYKCglyZXR1cm4gKCh2b2lkICopICZjdGZiKTsKfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTZXQgYSBSR0IgY29sb3IgaW4gdGhlIExVVCAoOCBiaXQgaW5kZXgpCiovCnZvaWQKdmlkZW9fc2V0X2x1dCAodW5zaWduZWQgaW50IGluZGV4LAkvKiBjb2xvciBudW1iZXIgKi8KCSAgICAgICB1bnNpZ25lZCBjaGFyIHIsCS8qIHJlZCAqLwoJICAgICAgIHVuc2lnbmVkIGNoYXIgZywJLyogZ3JlZW4gKi8KCSAgICAgICB1bnNpZ25lZCBjaGFyIGIJLyogYmx1ZSAqLwogICAgKQp7CgoJY3RXcml0ZSAoQ1RfTFVUX01BU0tfTywgMHhmZik7CgoJY3RXcml0ZSAoQ1RfTFVUX1NUQVJUX08sIChjaGFyKSBpbmRleCk7CgoJY3RXcml0ZSAoQ1RfTFVUX1JHQl9PLCByKTsJLyogcmVkICovCgljdFdyaXRlIChDVF9MVVRfUkdCX08sIGcpOwkvKiBncmVlbiAqLwoJY3RXcml0ZSAoQ1RfTFVUX1JHQl9PLCBiKTsJLyogYmx1ZSAqLwoJdWRlbGF5ICgxKTsKCWN0V3JpdGUgKENUX0xVVF9NQVNLX08sIDB4ZmYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRHJhd2luZyBlbmdpbmUgZmlsbCBvbiBzY3JlZW4gcmVnaW9uCiovCnZvaWQKdmlkZW9faHdfcmVjdGZpbGwgKHVuc2lnbmVkIGludCBicHAsCS8qIGJ5dGVzIHBlciBwaXhlbCAqLwoJCSAgIHVuc2lnbmVkIGludCBkc3RfeCwJLyogZGVzdCBwb3MgeCAqLwoJCSAgIHVuc2lnbmVkIGludCBkc3RfeSwJLyogZGVzdCBwb3MgeSAqLwoJCSAgIHVuc2lnbmVkIGludCBkaW1feCwJLyogZnJhbWUgd2lkdGggKi8KCQkgICB1bnNpZ25lZCBpbnQgZGltX3ksCS8qIGZyYW1lIGhlaWdodCAqLwoJCSAgIHVuc2lnbmVkIGludCBjb2xvcgkvKiBmaWxsIGNvbG9yICovCiAgICApCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCXVuc2lnbmVkIGxvbmcgKnAsIGJyMDQ7CgoJdmlkZW9fd2FpdF9iaXRibHQgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7CgoJcCA9ICh1bnNpZ25lZCBsb25nICopIFBBVFRFUk5fQURSOwoJZGltX3ggKj0gYnBwOwoJaWYgKGJwcCA9PSAzKQoJCWJwcCsrOwkJLyogMjRCaXQgbmVlZHMgYSAzMmJpdCBwYXR0ZXJuICovCgltZW1zZXQgKHAsIGNvbG9yLCAoYnBwICogc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSAqIDggKiA4KSk7CS8qIDggeCA4IHBhdHRlcm4gZGF0YSAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA3X28sICgocEdELT53aW5TaXplWCAqIGRzdF95KSArIGRzdF94KSAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIGRlc3RpbmF0aW9uICovCglicjA0ID0gaW4zMnIgKHBHRC0+cGNpQmFzZSArIEJSMDRfbykgJiAweGZmZmZmZjAwOwoJYnIwNCB8PSAweEYwOwkJLyogd3JpdGUgUGF0dGVybiBQIC0+IEQgKi8KCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwNF9vLCBicjA0KTsJLyogKi8KCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwOF9vLCAoZGltX3kgPDwgMTYpICsgZGltX3gpOwkvKiBzdGFydHMgdGhlIEJJVEJsdCAqLwoJdmlkZW9fd2FpdF9iaXRibHQgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBEcmF3aW5nIGVuZ2luZSBiaXRibHQgd2l0aCBzY3JlZW4gcmVnaW9uCiovCnZvaWQKdmlkZW9faHdfYml0Ymx0ICh1bnNpZ25lZCBpbnQgYnBwLAkvKiBieXRlcyBwZXIgcGl4ZWwgKi8KCQkgdW5zaWduZWQgaW50IHNyY194LAkvKiBzb3VyY2UgcG9zIHggKi8KCQkgdW5zaWduZWQgaW50IHNyY195LAkvKiBzb3VyY2UgcG9zIHkgKi8KCQkgdW5zaWduZWQgaW50IGRzdF94LAkvKiBkZXN0IHBvcyB4ICovCgkJIHVuc2lnbmVkIGludCBkc3RfeSwJLyogZGVzdCBwb3MgeSAqLwoJCSB1bnNpZ25lZCBpbnQgZGltX3gsCS8qIGZyYW1lIHdpZHRoICovCgkJIHVuc2lnbmVkIGludCBkaW1feQkvKiBmcmFtZSBoZWlnaHQgKi8KICAgICkKewoJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOwoJdW5zaWduZWQgbG9uZyBicjA0OwoKCWJyMDQgPSBpbjMyciAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKCgkvKiB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBkdWUgdG8gb3ZlcmxhcCwgd2UgaGF2ZSB0bwoJICogZmluZCBvdXQgaWYsIGFuZCBob3cgdGhlIGZyYW1lcyBvdmVybGFwcyAqLwoJaWYgKHNyY194IDwgZHN0X3gpIHsKCQkvKiBzcmMgaXMgbW9yZSBsZWZ0IHRoYW4gZGVzdAoJCSAqIHRoZSBmcmFtZSBtYXkgb3ZlcmxhcCAtPiBzdGFydCBmcm9tIHJpZ2h0IHRvIGxlZnQgKi8KCQlicjA0IHw9IDB4MDAwMDAxMDA7CS8qIHNldCBiaXQgOCAqLwoJCXNyY194ICs9IGRpbV94OwoJCWRzdF94ICs9IGRpbV94OwoJfSBlbHNlIHsKCQlicjA0ICY9IDB4ZmZmZmZlZmY7CS8qIGNsZWFyIGJpdCA4IGxlZnQgdG8gcmlnaHQgKi8KCX0KCWlmIChzcmNfeSA8IGRzdF95KSB7CgkJLyogc3JjIGlzIGhpZ2hlciB0aGFuIGRzdAoJCSAqIHRoZSBmcmFtZSBtYXkgb3ZlcmxhcCA9PiBzdGFydCBmcm9tIGJvdHRvbSAqLwoJCWJyMDQgfD0gMHgwMDAwMDIwMDsJLyogc2V0IGJpdCA5ICovCgkJc3JjX3kgKz0gZGltX3k7CgkJZHN0X3kgKz0gZGltX3k7Cgl9IGVsc2UgewoJCWJyMDQgJj0gMHhmZmZmZmRmZjsJLyogY2xlYXIgYml0IDkgdG9wIHRvIGJvdHRvbSAqLwoJfQoJZGltX3ggKj0gYnBwOwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA2X28sICgocEdELT53aW5TaXplWCAqIHNyY195KSArIHNyY194KSAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIHNvdXJjZSAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA3X28sICgocEdELT53aW5TaXplWCAqIGRzdF95KSArIGRzdF94KSAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIGRlc3RpbmF0aW9uICovCglicjA0ICY9IDB4ZmZmZmZmMDA7CglicjA0IHw9IDB4MDAwMDAwQ0M7CS8qIFMgLT4gRCAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA0X28sIGJyMDQpOwkvKiAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA4X28sIChkaW1feSA8PCAxNikgKyBkaW1feCk7CS8qIHN0YXJ0IHRoZSBCSVRCbHQgKi8KCXZpZGVvX3dhaXRfYml0Ymx0IChwR0QtPnBjaUJhc2UgKyBCUjA0X28pOwp9CgojZW5kaWYJCQkJLyogQ09ORklHX0NUNjkwMDAgKi8KCiNlbmRpZgkJCQkvKiBDT05GSUdfVklERU8gKi8K