LyogRGlyZWN0M0QgTGlnaHQKICogQ29weXJpZ2h0IChjKSAxOTk4IC8gMjAwMiBMaW9uZWwgVUxNRVIKICogQ29weXJpZ2h0IChjKSAyMDA2ICAgICAgICBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRExpZ2h0LgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAiZDNkLmgiCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0OjpRdWVyeUludGVyZmFjZQogKgogKiBRdWVyaWVzIHRoZSBvYmplY3QgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VzLiBVbmltcGxlbWVudGVkIGZvciB0aGlzCiAqIG9iamVjdCBhdCB0aGUgbW9tZW50CiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IEludGVyZmFjZSBpZCBhc2tlZCBmb3IKICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIHJlc3VsdGluZyBwb2ludGVyIGF0LgogKgogKiBSZXR1cm5zOgogKiAgRV9OT0lOVEVSRkFDRSwgYmVjYXVzZSBpdCdzIGEgc3R1YgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RMaWdodEltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNETGlnaHQgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JwKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVzLCVwKTogc3R1YiFcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICAqb2JwID0gTlVMTDsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQ6OkFkZFJlZgogKgogKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50IGJ5IDEKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9BZGRSZWYoSURpcmVjdDNETGlnaHQgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQ6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAogKiBpcyBkZXN0cm95ZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9SZWxlYXNlKElEaXJlY3QzRExpZ2h0ICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpIHsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0IE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RMaWdodDo6SW5pdGlhbGl6ZQogKgogKiBJbml0aWFsaXplcyB0aGUgaW50ZXJmYWNlLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AsIGJlY2F1c2UKICogaW5pdGlhbGl6YXRpb24gdGFrZXMgcGxhY2UgYXQgY3JlYXRpb24gdGltZQogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRDogUG9pbnRlciB0byBhbiBJRGlyZWN0M0QgaW50ZXJmYWNlLgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRExpZ2h0ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEICpscERpcmVjdDNEKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICBJRGlyZWN0RHJhd0ltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBscERpcmVjdDNEKTsKICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uXG4iLCBUaGlzLCBkM2QpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0OjpTZXRMaWdodAogKgogKiBBc3NpZ25zIGEgbGlnaHRpbmcgdmFsdWUgdG8gdGhpcyBvYmplY3QKICoKICogUGFyYW1zOgogKiAgTGlnaHQ6IExpZ2h0aW5nIHBhcmFtZXRlcyB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIExpZ2h0IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBkdW1wX2xpZ2h0KGNvbnN0IEQzRExJR0hUMiAqbGlnaHQpCnsKICAgIFRSQUNFKCIgICAgLSBkd1NpemUgOiAlZFxuIiwgbGlnaHQtPmR3U2l6ZSk7Cn0KCnN0YXRpYyBjb25zdCBmbG9hdCB6ZXJvX3ZhbHVlW10gPSB7CiAgICAwLjAsIDAuMCwgMC4wLCAwLjAKfTsKCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RMaWdodEltcGxfU2V0TGlnaHQoSURpcmVjdDNETGlnaHQgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETElHSFQgKmxwTGlnaHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRExpZ2h0SW1wbCwgSURpcmVjdDNETGlnaHQsIGlmYWNlKTsKICAgIExQRDNETElHSFQ3IGxpZ2h0NyA9ICYoVGhpcy0+bGlnaHQ3KTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscExpZ2h0KTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIExpZ2h0IGRlZmluaXRpb24gOlxuIik7CglkdW1wX2xpZ2h0KChMUEQzRExJR0hUMikgbHBMaWdodCk7CiAgICB9CgogICAgaWYgKCAobHBMaWdodC0+ZGx0VHlwZSA9PSAwKSB8fCAobHBMaWdodC0+ZGx0VHlwZSA+IEQzRExJR0hUX1BBUkFMTEVMUE9JTlQpICkKICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAKICAgIGlmICggbHBMaWdodC0+ZGx0VHlwZSA9PSBEM0RMSUdIVF9QQVJBTExFTFBPSU5UICkKCSBGSVhNRSgiRDNETElHSFRfUEFSQUxMRUxQT0lOVCBubyBzdXBwb3J0ZWRcbiIpOwogICAgCiAgICAvKiBUcmFuc2xhdGUgRDNETElHSDIgc3RydWN0dXJlIHRvIEQzRExJR0hUNyAqLwogICAgbGlnaHQ3LT5kbHRUeXBlICAgICAgICA9IGxwTGlnaHQtPmRsdFR5cGU7CiAgICBsaWdodDctPmRjdkRpZmZ1c2UgICAgID0gbHBMaWdodC0+ZGN2Q29sb3I7CiAgICBpZiAoKCgoTFBEM0RMSUdIVDIpbHBMaWdodCktPmR3RmxhZ3MgJiBEM0RMSUdIVF9OT19TUEVDVUxBUikgIT0gMCkJICAgIAogICAgICBsaWdodDctPmRjdlNwZWN1bGFyICAgID0gbHBMaWdodC0+ZGN2Q29sb3I7CiAgICBlbHNlCiAgICAgIGxpZ2h0Ny0+ZGN2U3BlY3VsYXIgICAgPSAqKGNvbnN0IEQzRENPTE9SVkFMVUUqKXplcm9fdmFsdWU7CSAgICAKICAgIGxpZ2h0Ny0+ZGN2QW1iaWVudCAgICAgPSBscExpZ2h0LT5kY3ZDb2xvcjsKICAgIGxpZ2h0Ny0+ZHZQb3NpdGlvbiAgICAgPSBscExpZ2h0LT5kdlBvc2l0aW9uOwogICAgbGlnaHQ3LT5kdkRpcmVjdGlvbiAgICA9IGxwTGlnaHQtPmR2RGlyZWN0aW9uOwogICAgbGlnaHQ3LT5kdlJhbmdlICAgICAgICA9IGxwTGlnaHQtPmR2UmFuZ2U7CiAgICBsaWdodDctPmR2RmFsbG9mZiAgICAgID0gbHBMaWdodC0+ZHZGYWxsb2ZmOwogICAgbGlnaHQ3LT5kdkF0dGVudWF0aW9uMCA9IGxwTGlnaHQtPmR2QXR0ZW51YXRpb24wOwogICAgbGlnaHQ3LT5kdkF0dGVudWF0aW9uMSA9IGxwTGlnaHQtPmR2QXR0ZW51YXRpb24xOwogICAgbGlnaHQ3LT5kdkF0dGVudWF0aW9uMiA9IGxwTGlnaHQtPmR2QXR0ZW51YXRpb24yOwogICAgbGlnaHQ3LT5kdlRoZXRhICAgICAgICA9IGxwTGlnaHQtPmR2VGhldGE7CiAgICBsaWdodDctPmR2UGhpICAgICAgICAgID0gbHBMaWdodC0+ZHZQaGk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIG1lbWNweSgmVGhpcy0+bGlnaHQsIGxwTGlnaHQsIGxwTGlnaHQtPmR3U2l6ZSk7CiAgICBpZiAoKFRoaXMtPmxpZ2h0LmR3RmxhZ3MgJiBEM0RMSUdIVF9BQ1RJVkUpICE9IDApIHsKICAgICAgICBUaGlzLT51cGRhdGUoVGhpcyk7ICAgICAgICAKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETGlnaHQ6OkdldExpZ2h0CiAqCiAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBJRGlyZWN0M0RMaWdodCBvYmplY3QKICoKICogUGFyYW1zOgogKiAgTGlnaHQ6IFBvaW50ZXIgdG8gYW4gRDNETElHSFQgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBMaWdodCBpcyBOVUxMCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRExpZ2h0SW1wbF9HZXRMaWdodChJRGlyZWN0M0RMaWdodCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVCAqbHBMaWdodCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscExpZ2h0KTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIFJldHVybmluZyBsaWdodCBkZWZpbml0aW9uIDpcbiIpOwoJZHVtcF9saWdodCgmVGhpcy0+bGlnaHQpOwogICAgfQoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBtZW1jcHkobHBMaWdodCwgJlRoaXMtPmxpZ2h0LCBscExpZ2h0LT5kd1NpemUpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBsaWdodF91cGRhdGUKICoKICogVXBkYXRlcyB0aGUgRGlyZWN0M0REZXZpY2U3IGxpZ2h0aW5nIHBhcmFtZXRlcnMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGxpZ2h0X3VwZGF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpCnsKICAgIElEaXJlY3QzRERldmljZUltcGwqIGRldmljZTsKCiAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CgogICAgaWYgKCFUaGlzLT5hY3RpdmVfdmlld3BvcnQgfHwgIVRoaXMtPmFjdGl2ZV92aWV3cG9ydC0+YWN0aXZlX2RldmljZSkKICAgICAgICByZXR1cm47CiAgICBkZXZpY2UgPSAgVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlOwoKICAgIElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQoSUNPTV9JTlRFUkZBQ0UoZGV2aWNlLElEaXJlY3QzRERldmljZTcpLCBUaGlzLT5kd0xpZ2h0SW5kZXgsICYoVGhpcy0+bGlnaHQ3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBsaWdodF9hY3RpdmF0ZQogKgogKiBVc2VzIHRoZSBEaXJlY3QzRERldmljZTc6OkxpZ2h0RW5hYmxlIG1ldGhvZCB0byBhY3RpdmUgdGhlIGxpZ2h0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBsaWdodF9hY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpCnsKICAgIElEaXJlY3QzRERldmljZUltcGwqIGRldmljZTsKCiAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CgogICAgaWYgKCFUaGlzLT5hY3RpdmVfdmlld3BvcnQgfHwgIVRoaXMtPmFjdGl2ZV92aWV3cG9ydC0+YWN0aXZlX2RldmljZSkKICAgICAgICByZXR1cm47CiAgICBkZXZpY2UgPSAgVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlOwogICAgCiAgICBsaWdodF91cGRhdGUoVGhpcyk7CiAgICAvKiBJZiB3YXMgbm90IGFjdGl2ZSwgYWN0aXZhdGUgaXQgKi8KICAgIGlmICgoVGhpcy0+bGlnaHQuZHdGbGFncyAmIEQzRExJR0hUX0FDVElWRSkgPT0gMCkgewogICAgICAgIElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUoSUNPTV9JTlRFUkZBQ0UoZGV2aWNlLElEaXJlY3QzRERldmljZTcpLCBUaGlzLT5kd0xpZ2h0SW5kZXgsIFRSVUUpOwoJVGhpcy0+bGlnaHQuZHdGbGFncyB8PSBEM0RMSUdIVF9BQ1RJVkU7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBsaWdodF9kZXNhY3RpdmF0ZQogKgogKiBVc2VzIHRoZSBEaXJlY3QzRERldmljZTc6OkxpZ2h0RW5hYmxlIG1ldGhvZCB0byBkZWFjdGl2YXRlIHRoZSBsaWdodAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgbGlnaHRfZGVzYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKQp7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsKiBkZXZpY2U7CgogICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOwoKICAgIGlmICghVGhpcy0+YWN0aXZlX3ZpZXdwb3J0IHx8ICFUaGlzLT5hY3RpdmVfdmlld3BvcnQtPmFjdGl2ZV9kZXZpY2UpCiAgICAgICAgcmV0dXJuOwogICAgZGV2aWNlID0gIFRoaXMtPmFjdGl2ZV92aWV3cG9ydC0+YWN0aXZlX2RldmljZTsKICAgIAogICAgLyogSWYgd2FzIG5vdCBhY3RpdmUsIGFjdGl2YXRlIGl0ICovCiAgICBpZiAoKFRoaXMtPmxpZ2h0LmR3RmxhZ3MgJiBEM0RMSUdIVF9BQ1RJVkUpICE9IDApIHsKICAgICAgICBJRGlyZWN0M0REZXZpY2U3X0xpZ2h0RW5hYmxlKElDT01fSU5URVJGQUNFKGRldmljZSxJRGlyZWN0M0REZXZpY2U3KSwgVGhpcy0+ZHdMaWdodEluZGV4LCBGQUxTRSk7CglUaGlzLT5saWdodC5kd0ZsYWdzICY9IH5EM0RMSUdIVF9BQ1RJVkU7CiAgICB9Cn0KCmNvbnN0IElEaXJlY3QzRExpZ2h0VnRibCBJRGlyZWN0M0RMaWdodF9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3QzRExpZ2h0SW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0M0RMaWdodEltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETGlnaHQgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RMaWdodEltcGxfSW5pdGlhbGl6ZSwKICAgIElEaXJlY3QzRExpZ2h0SW1wbF9TZXRMaWdodCwKICAgIElEaXJlY3QzRExpZ2h0SW1wbF9HZXRMaWdodAp9Owo=