LyogRGlyZWN0M0QgTGlnaHQKICogQ29weXJpZ2h0IChjKSAxOTk4IC8gMjAwMiBMaW9uZWwgVUxNRVIKICogQ29weXJpZ2h0IChjKSAyMDA2ICAgICAgICBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRExpZ2h0LgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAiZDNkLmgiCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0OjpRdWVyeUludGVyZmFjZQogKgogKiBRdWVyaWVzIHRoZSBvYmplY3QgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VzLiBVbmltcGxlbWVudGVkIGZvciB0aGlzCiAqIG9iamVjdCBhdCB0aGUgbW9tZW50CiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IEludGVyZmFjZSBpZCBhc2tlZCBmb3IKICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIHJlc3VsdGluZyBwb2ludGVyIGF0LgogKgogKiBSZXR1cm5zOgogKiAgRV9OT0lOVEVSRkFDRSwgYmVjYXVzZSBpdCdzIGEgc3R1YgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RMaWdodEltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNETGlnaHQgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JwKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVzLCVwKTogc3R1YiFcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICAqb2JwID0gTlVMTDsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQ6OkFkZFJlZgogKgogKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50IGJ5IDEKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9BZGRSZWYoSURpcmVjdDNETGlnaHQgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQ6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAogKiBpcyBkZXN0cm95ZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9SZWxlYXNlKElEaXJlY3QzRExpZ2h0ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpIHsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0IE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RMaWdodDo6SW5pdGlhbGl6ZQogKgogKiBJbml0aWFsaXplcyB0aGUgaW50ZXJmYWNlLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AsIGJlY2F1c2UKICogaW5pdGlhbGl6YXRpb24gdGFrZXMgcGxhY2UgYXQgY3JlYXRpb24gdGltZQogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRDogUG9pbnRlciB0byBhbiBJRGlyZWN0M0QgaW50ZXJmYWNlLgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRExpZ2h0ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEICpscERpcmVjdDNEKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd0ltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBscERpcmVjdDNEKTsKICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uXG4iLCBUaGlzLCBkM2QpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0OjpTZXRMaWdodAogKgogKiBBc3NpZ25zIGEgbGlnaHRpbmcgdmFsdWUgdG8gdGhpcyBvYmplY3QKICoKICogUGFyYW1zOgogKiAgTGlnaHQ6IExpZ2h0aW5nIHBhcmFtZXRlcyB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIExpZ2h0IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBkdW1wX2xpZ2h0KGNvbnN0IEQzRExJR0hUMiAqbGlnaHQpCnsKICAgIERQUklOVEYoIiAgICAtIGR3U2l6ZSA6ICVkXG4iLCBsaWdodC0+ZHdTaXplKTsKfQoKc3RhdGljIGNvbnN0IGZsb2F0IHplcm9fdmFsdWVbXSA9IHsKICAgIDAuMCwgMC4wLCAwLjAsIDAuMAp9OwoKc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9TZXRMaWdodChJRGlyZWN0M0RMaWdodCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVCAqbHBMaWdodCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwogICAgTFBEM0RMSUdIVDcgbGlnaHQ3ID0gJihUaGlzLT5saWdodDcpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwTGlnaHQpOwogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgTGlnaHQgZGVmaW5pdGlvbiA6XG4iKTsKCWR1bXBfbGlnaHQoKExQRDNETElHSFQyKSBscExpZ2h0KTsKICAgIH0KCiAgICBpZiAoIChscExpZ2h0LT5kbHRUeXBlID09IDApIHx8IChscExpZ2h0LT5kbHRUeXBlID4gRDNETElHSFRfUEFSQUxMRUxQT0lOVCkgKQogICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIAogICAgaWYgKCBscExpZ2h0LT5kbHRUeXBlID09IEQzRExJR0hUX1BBUkFMTEVMUE9JTlQgKQoJIEZJWE1FKCJEM0RMSUdIVF9QQVJBTExFTFBPSU5UIG5vIHN1cHBvcnRlZFxuIik7CiAgICAKICAgIC8qIFRyYW5zbGF0ZSBEM0RMSUdIMiBzdHJ1Y3R1cmUgdG8gRDNETElHSFQ3ICovCiAgICBsaWdodDctPmRsdFR5cGUgICAgICAgID0gbHBMaWdodC0+ZGx0VHlwZTsKICAgIGxpZ2h0Ny0+ZGN2RGlmZnVzZSAgICAgPSBscExpZ2h0LT5kY3ZDb2xvcjsKICAgIGlmICgoKChMUEQzRExJR0hUMilscExpZ2h0KS0+ZHdGbGFncyAmIEQzRExJR0hUX05PX1NQRUNVTEFSKSAhPSAwKQkgICAgCiAgICAgIGxpZ2h0Ny0+ZGN2U3BlY3VsYXIgICAgPSBscExpZ2h0LT5kY3ZDb2xvcjsKICAgIGVsc2UKICAgICAgbGlnaHQ3LT5kY3ZTcGVjdWxhciAgICA9ICooY29uc3QgRDNEQ09MT1JWQUxVRSopemVyb192YWx1ZTsJICAgIAogICAgbGlnaHQ3LT5kY3ZBbWJpZW50ICAgICA9IGxwTGlnaHQtPmRjdkNvbG9yOwogICAgbGlnaHQ3LT5kdlBvc2l0aW9uICAgICA9IGxwTGlnaHQtPmR2UG9zaXRpb247CiAgICBsaWdodDctPmR2RGlyZWN0aW9uICAgID0gbHBMaWdodC0+ZHZEaXJlY3Rpb247CiAgICBsaWdodDctPmR2UmFuZ2UgICAgICAgID0gbHBMaWdodC0+ZHZSYW5nZTsKICAgIGxpZ2h0Ny0+ZHZGYWxsb2ZmICAgICAgPSBscExpZ2h0LT5kdkZhbGxvZmY7CiAgICBsaWdodDctPmR2QXR0ZW51YXRpb24wID0gbHBMaWdodC0+ZHZBdHRlbnVhdGlvbjA7CiAgICBsaWdodDctPmR2QXR0ZW51YXRpb24xID0gbHBMaWdodC0+ZHZBdHRlbnVhdGlvbjE7CiAgICBsaWdodDctPmR2QXR0ZW51YXRpb24yID0gbHBMaWdodC0+ZHZBdHRlbnVhdGlvbjI7CiAgICBsaWdodDctPmR2VGhldGEgICAgICAgID0gbHBMaWdodC0+ZHZUaGV0YTsKICAgIGxpZ2h0Ny0+ZHZQaGkgICAgICAgICAgPSBscExpZ2h0LT5kdlBoaTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgbWVtY3B5KCZUaGlzLT5saWdodCwgbHBMaWdodCwgbHBMaWdodC0+ZHdTaXplKTsKICAgIGlmICgoVGhpcy0+bGlnaHQuZHdGbGFncyAmIEQzRExJR0hUX0FDVElWRSkgIT0gMCkgewogICAgICAgIFRoaXMtPnVwZGF0ZShUaGlzKTsgICAgICAgIAogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RMaWdodDo6R2V0TGlnaHQKICoKICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIElEaXJlY3QzRExpZ2h0IG9iamVjdAogKgogKiBQYXJhbXM6CiAqICBMaWdodDogUG9pbnRlciB0byBhbiBEM0RMSUdIVCBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIExpZ2h0IGlzIE5VTEwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETGlnaHRJbXBsX0dldExpZ2h0KElEaXJlY3QzRExpZ2h0ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUICpscExpZ2h0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwTGlnaHQpOwogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgUmV0dXJuaW5nIGxpZ2h0IGRlZmluaXRpb24gOlxuIik7CglkdW1wX2xpZ2h0KCZUaGlzLT5saWdodCk7CiAgICB9CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIG1lbWNweShscExpZ2h0LCAmVGhpcy0+bGlnaHQsIGxwTGlnaHQtPmR3U2l6ZSk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGxpZ2h0X3VwZGF0ZQogKgogKiBVcGRhdGVzIHRoZSBEaXJlY3QzRERldmljZTcgbGlnaHRpbmcgcGFyYW1ldGVycwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgbGlnaHRfdXBkYXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcykKewogICAgSURpcmVjdDNERGV2aWNlSW1wbCogZGV2aWNlOwoKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICBpZiAoIVRoaXMtPmFjdGl2ZV92aWV3cG9ydCB8fCAhVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlKQogICAgICAgIHJldHVybjsKICAgIGRldmljZSA9ICBUaGlzLT5hY3RpdmVfdmlld3BvcnQtPmFjdGl2ZV9kZXZpY2U7CgogICAgSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChJQ09NX0lOVEVSRkFDRShkZXZpY2UsSURpcmVjdDNERGV2aWNlNyksIFRoaXMtPmR3TGlnaHRJbmRleCwgJihUaGlzLT5saWdodDcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGxpZ2h0X2FjdGl2YXRlCiAqCiAqIFVzZXMgdGhlIERpcmVjdDNERGV2aWNlNzo6TGlnaHRFbmFibGUgbWV0aG9kIHRvIGFjdGl2ZSB0aGUgbGlnaHQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGxpZ2h0X2FjdGl2YXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcykKewogICAgSURpcmVjdDNERGV2aWNlSW1wbCogZGV2aWNlOwoKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICBpZiAoIVRoaXMtPmFjdGl2ZV92aWV3cG9ydCB8fCAhVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlKQogICAgICAgIHJldHVybjsKICAgIGRldmljZSA9ICBUaGlzLT5hY3RpdmVfdmlld3BvcnQtPmFjdGl2ZV9kZXZpY2U7CiAgICAKICAgIGxpZ2h0X3VwZGF0ZShUaGlzKTsKICAgIC8qIElmIHdhcyBub3QgYWN0aXZlLCBhY3RpdmF0ZSBpdCAqLwogICAgaWYgKChUaGlzLT5saWdodC5kd0ZsYWdzICYgRDNETElHSFRfQUNUSVZFKSA9PSAwKSB7CiAgICAgICAgSURpcmVjdDNERGV2aWNlN19MaWdodEVuYWJsZShJQ09NX0lOVEVSRkFDRShkZXZpY2UsSURpcmVjdDNERGV2aWNlNyksIFRoaXMtPmR3TGlnaHRJbmRleCwgVFJVRSk7CglUaGlzLT5saWdodC5kd0ZsYWdzIHw9IEQzRExJR0hUX0FDVElWRTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGxpZ2h0X2Rlc2FjdGl2YXRlCiAqCiAqIFVzZXMgdGhlIERpcmVjdDNERGV2aWNlNzo6TGlnaHRFbmFibGUgbWV0aG9kIHRvIGRlYWN0aXZhdGUgdGhlIGxpZ2h0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBsaWdodF9kZXNhY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpCnsKICAgIElEaXJlY3QzRERldmljZUltcGwqIGRldmljZTsKCiAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CgogICAgaWYgKCFUaGlzLT5hY3RpdmVfdmlld3BvcnQgfHwgIVRoaXMtPmFjdGl2ZV92aWV3cG9ydC0+YWN0aXZlX2RldmljZSkKICAgICAgICByZXR1cm47CiAgICBkZXZpY2UgPSAgVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlOwogICAgCiAgICAvKiBJZiB3YXMgbm90IGFjdGl2ZSwgYWN0aXZhdGUgaXQgKi8KICAgIGlmICgoVGhpcy0+bGlnaHQuZHdGbGFncyAmIEQzRExJR0hUX0FDVElWRSkgIT0gMCkgewogICAgICAgIElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUoSUNPTV9JTlRFUkZBQ0UoZGV2aWNlLElEaXJlY3QzRERldmljZTcpLCBUaGlzLT5kd0xpZ2h0SW5kZXgsIEZBTFNFKTsKCVRoaXMtPmxpZ2h0LmR3RmxhZ3MgJj0gfkQzRExJR0hUX0FDVElWRTsKICAgIH0KfQoKY29uc3QgSURpcmVjdDNETGlnaHRWdGJsIElEaXJlY3QzRExpZ2h0X1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNETGlnaHRJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSURpcmVjdDNETGlnaHRJbXBsX0FkZFJlZiwKICAgIElEaXJlY3QzRExpZ2h0SW1wbF9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0RMaWdodCBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbF9Jbml0aWFsaXplLAogICAgSURpcmVjdDNETGlnaHRJbXBsX1NldExpZ2h0LAogICAgSURpcmVjdDNETGlnaHRJbXBsX0dldExpZ2h0Cn07Cg==