LyogRGlyZWN0M0QgVmlld3BvcnQKICogQ29weXJpZ2h0IChjKSAxOTk4IExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRFZpZXdwb3J0Mi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEhlbHBlciBmdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHZpZXdwb3J0X2FjdGl2YXRlCiAqCiAqIGFjdGl2YXRlcyB0aGUgdmlld3BvcnQgdXNpbmcgSURpcmVjdDNERGV2aWNlNzo6U2V0Vmlld3BvcnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHZpZXdwb3J0X2FjdGl2YXRlKElEaXJlY3QzRFZpZXdwb3J0SW1wbCogVGhpcykgewogICAgSURpcmVjdDNETGlnaHRJbXBsKiBsaWdodDsKICAgIEQzRFZJRVdQT1JUNyB2cDsKICAgIAogICAgLyogQWN0aXZhdGUgYWxsIHRoZSBsaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCAqLwogICAgbGlnaHQgPSBUaGlzLT5saWdodHM7CgogICAgd2hpbGUgKGxpZ2h0ICE9IE5VTEwpIHsKICAgICAgICBsaWdodC0+YWN0aXZhdGUobGlnaHQpOwoJbGlnaHQgPSBsaWdodC0+bmV4dDsKICAgIH0KCiAgICAvKiBBbmQgY29weSB0aGUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgZGV2aWNlICovCiAgICBpZiAoVGhpcy0+dXNlX3ZwMikgewogICAgICAgIHZwLmR3WCA9IFRoaXMtPnZpZXdwb3J0cy52cDIuZHdYOwoJdnAuZHdZID0gVGhpcy0+dmlld3BvcnRzLnZwMi5kd1k7Cgl2cC5kd0hlaWdodCA9IFRoaXMtPnZpZXdwb3J0cy52cDIuZHdIZWlnaHQ7Cgl2cC5kd1dpZHRoID0gVGhpcy0+dmlld3BvcnRzLnZwMi5kd1dpZHRoOwoJdnAuZHZNaW5aID0gVGhpcy0+dmlld3BvcnRzLnZwMi5kdk1pblo7Cgl2cC5kdk1heFogPSBUaGlzLT52aWV3cG9ydHMudnAyLmR2TWF4WjsKICAgIH0gZWxzZSB7CiAgICAgICAgdnAuZHdYID0gVGhpcy0+dmlld3BvcnRzLnZwMS5kd1g7Cgl2cC5kd1kgPSBUaGlzLT52aWV3cG9ydHMudnAxLmR3WTsKCXZwLmR3SGVpZ2h0ID0gVGhpcy0+dmlld3BvcnRzLnZwMS5kd0hlaWdodDsKCXZwLmR3V2lkdGggPSBUaGlzLT52aWV3cG9ydHMudnAxLmR3V2lkdGg7Cgl2cC5kdk1pblogPSBUaGlzLT52aWV3cG9ydHMudnAxLmR2TWluWjsKCXZwLmR2TWF4WiA9IFRoaXMtPnZpZXdwb3J0cy52cDEuZHZNYXhaOwogICAgfQogICAgCiAgICAvKiBBbmQgYWxzbyBzZXQgdGhlIHZpZXdwb3J0ICovCiAgICBJRGlyZWN0M0REZXZpY2U3X1NldFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTcpLCAmdnApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogX2R1bXBfRDNEVklFV1BPUlQsIF9kdW1wX0QzRFZJRVdQT1JUMgogKgogKiBXcml0ZXMgdmlld3BvcnQgaW5mb3JtYXRpb24gdG8gVFJBQ0UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBfZHVtcF9EM0RWSUVXUE9SVChjb25zdCBEM0RWSUVXUE9SVCAqbHB2cCkKewogICAgVFJBQ0UoIiAgICAtIGR3U2l6ZSA9ICVkICAgZHdYID0gJWQgICBkd1kgPSAlZFxuIiwKCSAgbHB2cC0+ZHdTaXplLCBscHZwLT5kd1gsIGxwdnAtPmR3WSk7CiAgICBUUkFDRSgiICAgIC0gZHdXaWR0aCA9ICVkICAgZHdIZWlnaHQgPSAlZFxuIiwKCSAgbHB2cC0+ZHdXaWR0aCwgbHB2cC0+ZHdIZWlnaHQpOwogICAgVFJBQ0UoIiAgICAtIGR2U2NhbGVYID0gJWYgICBkdlNjYWxlWSA9ICVmXG4iLAoJICBscHZwLT5kdlNjYWxlWCwgbHB2cC0+ZHZTY2FsZVkpOwogICAgVFJBQ0UoIiAgICAtIGR2TWF4WCA9ICVmICAgZHZNYXhZID0gJWZcbiIsCgkgIGxwdnAtPmR2TWF4WCwgbHB2cC0+ZHZNYXhZKTsKICAgIFRSQUNFKCIgICAgLSBkdk1pblogPSAlZiAgIGR2TWF4WiA9ICVmXG4iLAoJICBscHZwLT5kdk1pblosIGxwdnAtPmR2TWF4Wik7Cn0KCnN0YXRpYyB2b2lkIF9kdW1wX0QzRFZJRVdQT1JUMihjb25zdCBEM0RWSUVXUE9SVDIgKmxwdnApCnsKICAgIFRSQUNFKCIgICAgLSBkd1NpemUgPSAlZCAgIGR3WCA9ICVkICAgZHdZID0gJWRcbiIsCgkgIGxwdnAtPmR3U2l6ZSwgbHB2cC0+ZHdYLCBscHZwLT5kd1kpOwogICAgVFJBQ0UoIiAgICAtIGR3V2lkdGggPSAlZCAgIGR3SGVpZ2h0ID0gJWRcbiIsCgkgIGxwdnAtPmR3V2lkdGgsIGxwdnAtPmR3SGVpZ2h0KTsKICAgIFRSQUNFKCIgICAgLSBkdkNsaXBYID0gJWYgICBkdkNsaXBZID0gJWZcbiIsCgkgIGxwdnAtPmR2Q2xpcFgsIGxwdnAtPmR2Q2xpcFkpOwogICAgVFJBQ0UoIiAgICAtIGR2Q2xpcFdpZHRoID0gJWYgICBkdkNsaXBIZWlnaHQgPSAlZlxuIiwKCSAgbHB2cC0+ZHZDbGlwV2lkdGgsIGxwdnAtPmR2Q2xpcEhlaWdodCk7CiAgICBUUkFDRSgiICAgIC0gZHZNaW5aID0gJWYgICBkdk1heFogPSAlZlxuIiwKCSAgbHB2cC0+ZHZNaW5aLCBscHZwLT5kdk1heFopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6UXVlcnlJbnRlcmZhY2UKICoKICogQSBub3JtYWwgUXVlcnlJbnRlcmZhY2UuIENhbiBxdWVyeSBhbGwgaW50ZXJmYWNlIHZlcnNpb25zIGFuZCB0aGUKICogSVVua25vd24gaW50ZXJmYWNlLiBUaGUgVlRhYmxlcyBvZiB0aGUgZGlmZmVyZW50IHZlcnNpb25zCiAqIGFyZSBlcXVhbAogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6IEludGVyZmFjZSBpZCBxdWVyaWVkIGZvcgogKiAgb2JqOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciB0bwogKgogKiBSZXR1cm5zOgogKiAgU19PSyBvbiBzdWNjZXNzLgogKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgcmVxdWVzdGVkIGludGVyZmFjZSB3YXNuJ3QgZm91bmQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYnApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKCiAgICAqb2JwID0gTlVMTDsKCiAgICBpZiAoIElzRXF1YWxHVUlEKCZJSURfSVVua25vd24sICByaWlkKSB8fAoJIElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEVmlld3BvcnQsIHJpaWQpIHx8CgkgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RWaWV3cG9ydDIsIHJpaWQpIHx8CgkgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RWaWV3cG9ydDMsIHJpaWQpICkgewogICAgICAgIElEaXJlY3QzRFZpZXdwb3J0M19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVmlld3BvcnQzKSk7CiAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZpZXdwb3J0Myk7CglUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RWaWV3cG9ydDEvMi8zIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpBZGRSZWYKICoKICogSW5jcmVhc2VzIHRoZSByZWZjb3VudC4KICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRSZWYoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQuIElmIGl0IGZhbGxzIHRvIDAsIHRoZSBpbnRlcmZhY2UgaXMgcmVsZWFzZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9SZWxlYXNlKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAoIXJlZikgewogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQgTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6SW5pdGlhbGl6ZQogKgogKiBOby1vcCBpbml0aWFsaXphdGlvbi4KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0Q6IFRoZSBkaXJlY3QzRCBkZXZpY2UgdGhpcyB2aWV3cG9ydCBpcyBhc3NpZ25lZCB0bwogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QpCnsKICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uXG4iLCBpZmFjZSwgRGlyZWN0M0QpOwogICAgcmV0dXJuIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6R2V0Vmlld3BvcnQKICoKICogUmV0dXJucyB0aGUgdmlld3BvcnQgZGF0YSBhc3NpZ25lZCB0byB0aGlzIHZpZXdwb3J0IGludGVyZmFjZQogKgogKiBQYXJhbXM6CiAqICBEYXRhOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBkYXRhCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldFZpZXdwb3J0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWSUVXUE9SVCAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgRFdPUkQgZHdTaXplOwogICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBpZiAoVGhpcy0+dXNlX3ZwMiAhPSAwKSB7CiAgICAgICAgRVJSKCIgIFJlcXVlc3RpbmcgdG8gZ2V0IGEgRDNEVklFV1BPUlQgc3RydWN0IHdoZXJlIGEgRDNEVklFV1BPUlQyIHdhcyBzZXQgIVxuIik7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KICAgIGR3U2l6ZSA9IGxwRGF0YS0+ZHdTaXplOwogICAgbWVtc2V0KGxwRGF0YSwgMCwgZHdTaXplKTsKICAgIG1lbWNweShscERhdGEsICYoVGhpcy0+dmlld3BvcnRzLnZwMSksIGR3U2l6ZSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgcmV0dXJuaW5nIEQzRFZJRVdQT1JUIDpcbiIpOwoJX2R1bXBfRDNEVklFV1BPUlQobHBEYXRhKTsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpTZXRWaWV3cG9ydAogKgogKiBTZXRzIHRoZSB2aWV3cG9ydCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UKICoKICogUGFyYW1zOgogKiAgbHBEYXRhOiBWaWV3cG9ydCB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERhdGEgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZJRVdQT1JUICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBMUERJUkVDVDNEVklFV1BPUlQzIGN1cnJlbnRfdmlld3BvcnQ7CiAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGF0YSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgZ2V0dGluZyBEM0RWSUVXUE9SVCA6XG4iKTsKCV9kdW1wX0QzRFZJRVdQT1JUKGxwRGF0YSk7CiAgICB9CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIFRoaXMtPnVzZV92cDIgPSAwOwogICAgbWVtc2V0KCYoVGhpcy0+dmlld3BvcnRzLnZwMSksIDAsIHNpemVvZihUaGlzLT52aWV3cG9ydHMudnAxKSk7CiAgICBtZW1jcHkoJihUaGlzLT52aWV3cG9ydHMudnAxKSwgbHBEYXRhLCBscERhdGEtPmR3U2l6ZSk7CgogICAgLyogVGVzdHMgb24gdHdvIGdhbWVzIHNob3cgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIG5ldmVyIHVzZWQgcHJvcGVybHkgc28gb3ZlcnJpZGUKICAgICAgIHRoZW0gd2l0aCBwcm9wZXIgb25lcyA6LSkKICAgICovCiAgICBUaGlzLT52aWV3cG9ydHMudnAxLmR2TWluWiA9IDAuMDsKICAgIFRoaXMtPnZpZXdwb3J0cy52cDEuZHZNYXhaID0gMS4wOwoKICAgIGlmIChUaGlzLT5hY3RpdmVfZGV2aWNlKSB7CiAgICAgIElEaXJlY3QzRERldmljZTNfR2V0Q3VycmVudFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTMpLCAmY3VycmVudF92aWV3cG9ydCk7CiAgICAgIGlmIChJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgY3VycmVudF92aWV3cG9ydCkgPT0gVGhpcykKICAgICAgICAgIFRoaXMtPmFjdGl2YXRlKFRoaXMpOwogICAgICBpZihjdXJyZW50X3ZpZXdwb3J0KSBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZShjdXJyZW50X3ZpZXdwb3J0KTsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpUcmFuc2Zvcm1WZXJ0aWNlcwogKgogKiBUcmFuc2Zvcm1zIHZlcnRpY2VzIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgcHJldHR5IHNpbWlsYXIgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6UHJvY2Vzc1ZlcnRpY2VzLAogKiBzbyBpdCdzIHRlbXB0aW5nIHRvIGZvcndhcmQgaXQgdG8gdGhlcmUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lCiAqIHRpbnkgZGlmZmVyZW5jZXMuIEZpcnN0LCB0aGUgbHBPZmZzY3JlZW4gZmxhZyB0aGF0IGlzIHJlcG9ydGVkIGJhY2ssCiAqIHRoZW4gdGhlcmUgaXMgdGhlIGhvbW9nZW5vdXMgdmVydGV4IHRoYXQgaXMgZ2VuZXJhdGVkLiBBbHNvIHRoZXJlJ3MgYSBsYWNrCiAqIG9mIEZWRnMsIGJ1dCBzdGlsbCBhIGN1c3RvbSBzdHJpZGUuIExhc3QsIHRoZSBkM2QxIC0gZDNkMyB2aWV3cG9ydCBoYXMgc29tZQogKiBzZXR0aW5ncyAoc2NhbGUpIHRoYXQgZDNkNyBhbmQgd2luZWQzZCBkbyBub3QgaGF2ZS4gQWxsIGluIGFsbCB3cmFwcGluZyB0bwogKiBQcm9jZXNzVmVydGljZXMgZG9lc24ndCBwYXkgb2YgaW4gdGVybXMgb2Ygd3JhcHBlciBjb2RlIG5lZWRlZCBhbmQgY29kZQogKiByZXVzZWQuCiAqCiAqIFBhcmFtczoKICogIGR3VmVydGV4Q291bnQ6IFRoZSBudW1iZXIgb2YgdmVydGljZXMgdG8gYmUgdHJhbnNmb3JtZWQKICogIGxwRGF0YTogUG9pbnRlciB0byB0aGUgdmVydGV4IGRhdGEKICogIGR3RmxhZ3M6IEQzRFRSQU5TRk9STV9DTElQUEVEIG9yIEQzRFRSQU5TRk9STV9VTkNMSVBQRUQKICogIGxwT2ZmU2NyZWVuOiBTZXQgdG8gdGhlIGNsaXBwaW5nIHBsYW5lIGNsaXBwaW5nIHRoZSB2ZXJ0ZXgsIGlmIG9ubHkgb25lCiAqICAgICAgICAgICAgICAgdmVydGV4IGlzIHRyYW5zZm9ybWVkIGFuZCBjbGlwcGluZyBpcyBvbi4gMCBvdGhlcndpc2UKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRSBpZiB0aGUgdmlld3BvcnQgaXMgbm90IGFzc2lnbmVkIHRvIGEgZGV2aWNlCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIG5vIGNsaXBwaW5nIGZsYWcgaXMgc3BlY2lmaWVkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9UcmFuc2Zvcm1WZXJ0aWNlcyhJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STURBVEEgKmxwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqbHBPZmZTY3JlZW4pCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBEM0RNQVRSSVggdmlld19tYXQsIHdvcmxkX21hdCwgcHJval9tYXQsIG1hdDsKICAgIGZsb2F0ICppbjsKICAgIGZsb2F0ICpvdXQ7CiAgICBmbG9hdCB4LCB5LCB6LCB3OwogICAgdW5zaWduZWQgaW50IGk7CiAgICBEM0RWSUVXUE9SVCB2cCA9IFRoaXMtPnZpZXdwb3J0cy52cDE7CiAgICBEM0RIVkVSVEVYICpvdXRIOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCUwOHgsJXApXG4iLCBUaGlzLCBkd1ZlcnRleENvdW50LCBscERhdGEsIGR3RmxhZ3MsIGxwT2ZmU2NyZWVuKTsKCiAgICAvKiBUZXN0cyBvbiB3aW5kb3dzIHNob3cgdGhhdCBXaW5kb3dzIGNyYXNoZXMgd2hlbiB0aGlzIG9jY3VycywKICAgICAqIHNvIGRvbid0IHJldHVybiB0aGUgKGludHVpdGl2ZSkgcmV0dXJuIHZhbHVlCiAgICBpZighVGhpcy0+YWN0aXZlX2RldmljZSkKICAgIHsKICAgICAgICBXQVJOKCJObyBkZXZpY2UgYWN0aXZlLCByZXR1cm5pbmcgRDNERVJSX1ZJRVdQT1JUSEFTTk9ERVZJQ0VcbiIpOwogICAgICAgIHJldHVybiBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRTsKICAgIH0KICAgICAqLwoKICAgIGlmKCEoZHdGbGFncyAmIChEM0RUUkFOU0ZPUk1fVU5DTElQUEVEIHwgRDNEVFJBTlNGT1JNX0NMSVBQRUQpKSkKICAgIHsKICAgICAgICBXQVJOKCJObyBjbGlwcGluZyBmbGFnIHBhc3NlZCwgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKFRoaXMtPmFjdGl2ZV9kZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVfVklFVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRE1BVFJJWCopICZ2aWV3X21hdCk7CgogICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKFRoaXMtPmFjdGl2ZV9kZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVfUFJPSkVDVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRE1BVFJJWCopICZwcm9qX21hdCk7CgogICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKFRoaXMtPmFjdGl2ZV9kZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRTX1dPUkxETUFUUklYKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgJndvcmxkX21hdCk7CiAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmdmlld19tYXQsJndvcmxkX21hdCk7CiAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmcHJval9tYXQsJm1hdCk7CgogICAgaW4gPSAoZmxvYXQgKikgbHBEYXRhLT5scEluOwogICAgb3V0ID0gKGZsb2F0ICopIGxwRGF0YS0+bHBPdXQ7CiAgICBvdXRIID0gbHBEYXRhLT5scEhPdXQ7CiAgICBmb3IoaSA9IDA7IGkgPCBkd1ZlcnRleENvdW50OyBpKyspCiAgICB7CiAgICAgICAgeCA9IChpblswXSAqIG1hdC5fMTEpICsgKGluWzFdICogbWF0Ll8yMSkgKyAoaW5bMl0gKiBtYXQuXzMxKSArICgxLjAgKiBtYXQuXzQxKTsKICAgICAgICB5ID0gKGluWzBdICogbWF0Ll8xMikgKyAoaW5bMV0gKiBtYXQuXzIyKSArIChpblsyXSAqIG1hdC5fMzIpICsgKDEuMCAqIG1hdC5fNDIpOwogICAgICAgIHogPSAoaW5bMF0gKiBtYXQuXzEzKSArIChpblsxXSAqIG1hdC5fMjMpICsgKGluWzJdICogbWF0Ll8zMykgKyAoMS4wICogbWF0Ll80Myk7CiAgICAgICAgdyA9IChpblswXSAqIG1hdC5fMTQpICsgKGluWzFdICogbWF0Ll8yNCkgKyAoaW5bMl0gKiBtYXQuXzM0KSArICgxLjAgKiBtYXQuXzQ0KTsKCiAgICAgICAgaWYoZHdGbGFncyAmIEQzRFRSQU5TRk9STV9DTElQUEVEKQogICAgICAgIHsKICAgICAgICAgICAgLyogSWYgY2xpcHBpbmcgaXMgZW5hYmxlZCwgV2luZG93cyBhc3N1bWVzIHRoYXQgb3V0SCBpcwogICAgICAgICAgICAgKiBhIHZhbGlkIHBvaW50ZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG91dEhbaV0udTEuaHggPSB4OyBvdXRIW2ldLnUyLmh5ID0geTsgb3V0SFtpXS51My5oeiA9IHo7CgogICAgICAgICAgICBvdXRIW2ldLmR3RmxhZ3MgPSAwOwogICAgICAgICAgICBpZih4ICogdnAuZHZTY2FsZVggPiAoKGZsb2F0KSB2cC5kd1dpZHRoICogMC41KSkKICAgICAgICAgICAgICAgIG91dEhbaV0uZHdGbGFncyB8PSBEM0RDTElQX1JJR0hUOwogICAgICAgICAgICBpZih4ICogdnAuZHZTY2FsZVggPD0gLSgoZmxvYXQpIHZwLmR3V2lkdGgpICogMC41KQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfTEVGVDsKICAgICAgICAgICAgaWYoeSAqIHZwLmR2U2NhbGVZID4gKChmbG9hdCkgdnAuZHdIZWlnaHQgKiAwLjUpKQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfVE9QOwogICAgICAgICAgICBpZih5ICogdnAuZHZTY2FsZVkgPD0gLSgoZmxvYXQpIHZwLmR3SGVpZ2h0KSAqIDAuNSkKICAgICAgICAgICAgICAgIG91dEhbaV0uZHdGbGFncyB8PSBEM0RDTElQX0JPVFRPTTsKICAgICAgICAgICAgaWYoeiA8IDAuMCkKICAgICAgICAgICAgICAgIG91dEhbaV0uZHdGbGFncyB8PSBEM0RDTElQX0ZST05UOwogICAgICAgICAgICBpZih6ID4gMS4wKQogICAgICAgICAgICAgICAgb3V0SFtpXS5kd0ZsYWdzIHw9IEQzRENMSVBfQkFDSzsKCiAgICAgICAgICAgIGlmKG91dEhbaV0uZHdGbGFncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTG9va3MgbGlrZSBuYXRpdmUganVzdCBkcm9wcyB0aGUgdmVydGV4LCBsZWF2ZXMgd2hhdGV2ZXIgZGF0YQogICAgICAgICAgICAgICAgICogaXQgaGFzIGluIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCBnb2VzIG9uIHdpdGggdGhlIG5leHQgdmVydGV4LgogICAgICAgICAgICAgICAgICogVGhlIGV4YWN0IHNjaGVtZSBoYXNuJ3QgYmVlbiBmaWd1cmVkIG91dCB5ZXQsIGJ1dCB3aW5kb3dzCiAgICAgICAgICAgICAgICAgKiBkZWZpbml0ZWx5IHdyaXRlcyBzb21ldGhpbmcgdGhlcmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG91dFswXSA9IHg7CiAgICAgICAgICAgICAgICBvdXRbMV0gPSB5OwogICAgICAgICAgICAgICAgb3V0WzJdID0gejsKICAgICAgICAgICAgICAgIG91dFszXSA9IHc7CiAgICAgICAgICAgICAgICBpbiA9IChmbG9hdCAqKSAoKGNoYXIgKikgaW4gKyBscERhdGEtPmR3SW5TaXplKTsKICAgICAgICAgICAgICAgIG91dCA9IChmbG9hdCAqKSAoKGNoYXIgKikgb3V0ICsgbHBEYXRhLT5kd091dFNpemUpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHcgPSAxIC8gdzsKICAgICAgICB4ICo9IHc7IHkgKj0gdzsgeiAqPSB3OwoKICAgICAgICBvdXRbMF0gPSB2cC5kd1dpZHRoIC8gMiArIHZwLmR3WCArIHggKiB2cC5kdlNjYWxlWDsKICAgICAgICBvdXRbMV0gPSB2cC5kd0hlaWdodCAvIDIgKyB2cC5kd1kgLSB5ICogdnAuZHZTY2FsZVk7CiAgICAgICAgb3V0WzJdID0gejsKICAgICAgICBvdXRbM10gPSB3OwogICAgICAgIGluID0gKGZsb2F0ICopICgoY2hhciAqKSBpbiArIGxwRGF0YS0+ZHdJblNpemUpOwogICAgICAgIG91dCA9IChmbG9hdCAqKSAoKGNoYXIgKikgb3V0ICsgbHBEYXRhLT5kd091dFNpemUpOwogICAgfQoKICAgIC8qIEFjY29yZGluZyB0byB0aGUgZDNkIHRlc3QsIHRoZSBvZmZzY3JlZW4gZmxhZyBpcyBzZXQgb25seQogICAgICogaWYgZXhhY3RseSBvbmUgdmVydGV4IGlzIHRyYW5zZm9ybWVkLiBJdHMgbm90IGRvY3VtZW50ZWQsCiAgICAgKiBidXQgdGhlIHRlc3Qgc2hvd3MgdGhhdCB0aGUgbHBPZmZzY3JlZW4gZmxhZyBpcyBzZXQgdG8gdGhlCiAgICAgKiBmbGFnIGNvbWJpbmF0aW9uIG9mIGNsaXBwaW5nIHBsYW5lcyB0aGF0IGNsaXBzIHRoZSB2ZXJ0ZXguCiAgICAgKgogICAgICogSWYgY2xpcHBpbmcgaXMgcmVxdWVzdGVkLCBXaW5kb3dzIGFzc3VtZXMgdGhhdCB0aGUgb2Zmc2NyZWVuCiAgICAgKiBwYXJhbSBpcyBhIHZhbGlkIHBvaW50ZXIuCiAgICAgKi8KICAgIGlmKGR3VmVydGV4Q291bnQgPT0gMSAmJiBkd0ZsYWdzICYgRDNEVFJBTlNGT1JNX0NMSVBQRUQpCiAgICB7CiAgICAgICAgKmxwT2ZmU2NyZWVuID0gb3V0SFswXS5kd0ZsYWdzOwogICAgfQogICAgZWxzZSBpZigqbHBPZmZTY3JlZW4pCiAgICB7CiAgICAgICAgKmxwT2ZmU2NyZWVuID0gMDsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgVFJBQ0UoIkFsbCBkb25lXG4iKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6TGlnaHRFbGVtZW50cwogKgogKiBUaGUgRGlyZWN0WCA1LjAgc2RrIHNheXMgdGhhdCBpdCdzIG5vdCBpbXBsZW1lbnRlZAogKgogKiBQYXJhbXM6CiAqICA/CiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfTGlnaHRFbGVtZW50cyhJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0VsZW1lbnRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVERBVEEgbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKTogVW5pbXBsZW1lbnRlZCFcbiIsIFRoaXMsIGR3RWxlbWVudENvdW50LCBscERhdGEpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpTZXRCYWNrZ3JvdW5kCiAqCiAqIFNldHMgdGplIGJhY2tncm91bmQgbWF0ZXJpYWwKICoKICogUGFyYW1zOgogKiAgaE1hdDogSGFuZGxlIGZyb20gYSBJRGlyZWN0M0RNYXRlcmlhbCBpbnRlcmZhY2UKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMSEFORExFIGhNYXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVkKVxuIiwgVGhpcywgKERXT1JEKSBoTWF0KTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYoaE1hdCAmJiBoTWF0ID4gVGhpcy0+ZGRyYXctPmQzZGRldmljZS0+bnVtSGFuZGxlcykKICAgIHsKICAgICAgICBXQVJOKCJTcGVjaWZpZWQgSGFuZGxlICVkIG91dCBvZiByYW5nZVxuIiwgaE1hdCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KICAgIGVsc2UgaWYoaE1hdCAmJiBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW2hNYXQgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdGVyaWFsKQogICAgewogICAgICAgIFdBUk4oIkhhbmRsZSAlZCBpcyBub3QgYSBtYXRlcmlhbCBoYW5kbGVcbiIsIGhNYXQpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgaWYoaE1hdCkKICAgIHsKICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kID0gKElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqKSBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW2hNYXQgLSAxXS5wdHI7CiAgICAgICAgVFJBQ0UoIiBzZXR0aW5nIGJhY2tncm91bmQgY29sb3IgOiAlZiAlZiAlZiAlZlxuIiwKICAgICAgICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnUxLnIsCiAgICAgICAgICAgICAgVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51Mi5nLAogICAgICAgICAgICAgIFRoaXMtPmJhY2tncm91bmQtPm1hdC51LmRpZmZ1c2UudTMuYiwKICAgICAgICAgICAgICBUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnU0LmEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFRoaXMtPmJhY2tncm91bmQgPSBOVUxMOwogICAgICAgIFRSQUNFKCJTZXR0aW5nIGJhY2tncm91bmQgdG8gTlVMTFxuIik7CiAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldEJhY2tncm91bmQKICoKICogUmV0dXJucyB0aGUgbWF0ZXJpYWwgaGFuZGxlIGFzc2lnbmVkIHRvIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSB2aWV3cG9ydAogKgogKiBQYXJhbXM6CiAqICBscGhNYXQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGhhbmRsZQogKiAgbHBWYWxpZDogaXMgc2V0IHRvIEZBTFNFIGlmIG5vIGJhY2tncm91bmQgaXMgc2V0LCBUUlVFIGlmIG9uZSBpcyBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTEhBTkRMRSAqbHBoTWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpscFZhbGlkKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIGxwaE1hdCwgbHBWYWxpZCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGlmKGxwVmFsaWQpCiAgICB7CiAgICAgICAgKmxwVmFsaWQgPSBUaGlzLT5iYWNrZ3JvdW5kICE9IE5VTEw7CiAgICB9CiAgICBpZihscGhNYXQpCiAgICB7CiAgICAgICAgaWYoVGhpcy0+YmFja2dyb3VuZCkKICAgICAgICB7CiAgICAgICAgICAgICpscGhNYXQgPSBUaGlzLT5iYWNrZ3JvdW5kLT5IYW5kbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICpscGhNYXQgPSAwOwogICAgICAgIH0KICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0QmFja2dyb3VuZERlcHRoCiAqCiAqIFNldHMgYSBzdXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgYmFja2dyb3VuZCBkZXB0aC4gSXQncyBjb250ZW50cyBhcmUKICogdXNlZCB0byBzZXQgdGhlIGRlcHRoIGJ1ZmZlciBpbiBJRGlyZWN0M0RWaWV3cG9ydDM6OkNsZWFyCiAqCiAqIFBhcmFtczoKICogIGxwRERTdXJmYWNlOiBTdXJmYWNlIHRvIHNldAogKgogKiBSZXR1cm5zOiBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmREZXB0aChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqbHBERFN1cmZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRERTdXJmYWNlKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldEJhY2tncm91bmREZXB0aAogKgogKiBSZXR1cm5zIHRoZSBzdXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVwdGggZmllbGQKICoKICogUGFyYW1zOgogKiAgbHBscEREU3VyZmFjZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKICogIGxwVmFsaWQ6IFNldCB0byBUUlVFIGlmIGEgZGVwdGggaXMgYXNpZ25lZCwgRkFMU0Ugb3RoZXJ3aXNlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIEREU3VyZmFjZSBvZiBWYWxpZCBpcyBOVUxMKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZERlcHRoKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICoqbHBscEREU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEJPT0wgbHBWYWxpZCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgbHBscEREU3VyZmFjZSwgbHBWYWxpZCk7CiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkNsZWFyCiAqCiAqIENsZWFycyB0aGUgcmVuZGVyIHRhcmdldCBhbmQgLyBvciB0aGUgeiBidWZmZXIKICoKICogUGFyYW1zOgogKiAgZHdDb3VudDogVGhlIGFtb3VudCBvZiByZWN0YW5nbGVzIHRvIGNsZWFyLiBJZiAwLCB0aGUgd2hvbGUgYnVmZmVyIGlzCiAqICAgICAgICAgICBjbGVhcmVkCiAqICBscFJlY3RzOiBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiByZWN0YW5nbGVzLiBJZiBOVUxMLCBDb3VudCBtdXN0IGJlIDAKICogIGR3RmxhZ3M6IEQzRENMRUFSX1pCVUZGRVIgYW5kIC8gb3IgRDNEQ0xFQVJfVEFSR0VUCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRDNERVJSX1ZJRVdQT1JUSEFTTk9ERVZJQ0UgaWYgdGhlcmUncyBubyBhY3RpdmUgZGV2aWNlCiAqICBUaGUgcmV0dXJuIHZhbHVlIG9mIElEaXJlY3QzRERldmljZTc6OkNsZWFyCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhcihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRUNUICpscFJlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgIERXT1JEIGNvbG9yID0gMHgwMDAwMDAwMDsKICAgIEhSRVNVTFQgaHI7CgogICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCVwLCUwOHgpXG4iLCBUaGlzLCBpZmFjZSwgZHdDb3VudCwgbHBSZWN0cywgZHdGbGFncyk7CiAgICBpZiAoVGhpcy0+YWN0aXZlX2RldmljZSA9PSBOVUxMKSB7CiAgICAgICAgRVJSKCIgVHJ5aW5nIHRvIGNsZWFyIGEgdmlld3BvcnQgbm90IGF0dGFjaGVkIHRvIGEgZGV2aWNlICFcbiIpOwoJcmV0dXJuIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFOwogICAgfQoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBpZiAoZHdGbGFncyAmIEQzRENMRUFSX1RBUkdFVCkgewogICAgICAgIGlmIChUaGlzLT5iYWNrZ3JvdW5kID09IE5VTEwpIHsKCSAgICBFUlIoIiBUcnlpbmcgdG8gY2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciB3aXRob3V0IGJhY2tncm91bmQgbWF0ZXJpYWwgIVxuIik7Cgl9IGVsc2UgewoJICAgIGNvbG9yID0gCgkgICAgICAoKGludCkgKChUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnUxLnIpICogMjU1KSA8PCAxNikgfAoJICAgICAgKChpbnQpICgoVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51Mi5nKSAqIDI1NSkgPDwgIDgpIHwKCSAgICAgICgoaW50KSAoKFRoaXMtPmJhY2tncm91bmQtPm1hdC51LmRpZmZ1c2UudTMuYikgKiAyNTUpIDw8ICAwKSB8CgkgICAgICAoKGludCkgKChUaGlzLT5iYWNrZ3JvdW5kLT5tYXQudS5kaWZmdXNlLnU0LmEpICogMjU1KSA8PCAyNCk7Cgl9CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0NsZWFyKElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBSZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICYgKEQzRENMRUFSX1pCVUZGRVIgfCBEM0RDTEVBUl9UQVJHRVQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkFkZExpZ2h0CiAqCiAqIEFkZHMgYW4gbGlnaHQgdG8gdGhlIHZpZXdwb3J0CiAqCiAqIFBhcmFtczoKICogIGxwRGlyZWN0M0RMaWdodDogSW50ZXJmYWNlIG9mIHRoZSBsaWdodCB0byBhZGQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERpcmVjdDNETGlnaHQgaXMgTlVMTAogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGVyZSBhcmUgOCBsaWdodHMgb3IgbW9yZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfQWRkTGlnaHQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICpscERpcmVjdDNETGlnaHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBJRGlyZWN0M0RMaWdodEltcGwgKmxwRGlyZWN0M0RMaWdodEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBscERpcmVjdDNETGlnaHQpOwogICAgRFdPUkQgaSA9IDA7CiAgICBEV09SRCBtYXAgPSBUaGlzLT5tYXBfbGlnaHRzOwogICAgCiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEaXJlY3QzRExpZ2h0KTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKFRoaXMtPm51bV9saWdodHMgPj0gOCkKICAgIHsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQoKICAgIC8qIEZpbmQgYSBsaWdodCBudW1iZXIgYW5kIHVwZGF0ZSBib3RoIGxpZ2h0IGFuZCB2aWV3cG9ydHMgb2JqZWN0cyBhY2NvcmRpbmdseSAqLwogICAgd2hpbGUobWFwJjEpIHsKICAgICAgICBtYXA+Pj0xOwoJaSsrOwogICAgfQogICAgbHBEaXJlY3QzRExpZ2h0SW1wbC0+ZHdMaWdodEluZGV4ID0gaTsKICAgIFRoaXMtPm51bV9saWdodHMrKzsKICAgIFRoaXMtPm1hcF9saWdodHMgfD0gMTw8aTsKCiAgICAvKiBBZGQgdGhlIGxpZ2h0IGluIHRoZSAnbGlua2VkJyBjaGFpbiAqLwogICAgbHBEaXJlY3QzRExpZ2h0SW1wbC0+bmV4dCA9IFRoaXMtPmxpZ2h0czsKICAgIFRoaXMtPmxpZ2h0cyA9IGxwRGlyZWN0M0RMaWdodEltcGw7CgogICAgLyogQXR0YWNoIHRoZSBsaWdodCB0byB0aGUgdmlld3BvcnQgKi8KICAgIGxwRGlyZWN0M0RMaWdodEltcGwtPmFjdGl2ZV92aWV3cG9ydCA9IFRoaXM7CiAgICAKICAgIC8qIElmIGFjdGl2ZSwgYWN0aXZhdGUgdGhlIGxpZ2h0ICovCiAgICBpZiAoVGhpcy0+YWN0aXZlX2RldmljZSAhPSBOVUxMKSB7CiAgICAgICAgbHBEaXJlY3QzRExpZ2h0SW1wbC0+YWN0aXZhdGUobHBEaXJlY3QzRExpZ2h0SW1wbCk7CiAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkRlbGV0ZUxpZ2h0CiAqCiAqIERlbGV0ZXMgYSBsaWdodCBmcm9tIHRoZSB2aWV3cG9ydHMnIGxpZ2h0IGxpc3QKICoKICogUGFyYW1zOgogKiAgbHBEaXJlY3QzRExpZ2h0OiBMaWdodCB0byBkZWxldGUKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBsaWdodCB3YXNuJ3QgZm91bmQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0RlbGV0ZUxpZ2h0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RMaWdodCAqbHBEaXJlY3QzRExpZ2h0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgSURpcmVjdDNETGlnaHRJbXBsICpscERpcmVjdDNETGlnaHRJbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgbHBEaXJlY3QzRExpZ2h0KTsKICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqY3VyX2xpZ2h0LCAqcHJldl9saWdodCA9IE5VTEw7CiAgICAKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERpcmVjdDNETGlnaHQpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBjdXJfbGlnaHQgPSBUaGlzLT5saWdodHM7CiAgICB3aGlsZSAoY3VyX2xpZ2h0ICE9IE5VTEwpIHsKICAgICAgICBpZiAoY3VyX2xpZ2h0ID09IGxwRGlyZWN0M0RMaWdodEltcGwpIHsKCSAgICBscERpcmVjdDNETGlnaHRJbXBsLT5kZXNhY3RpdmF0ZShscERpcmVjdDNETGlnaHRJbXBsKTsKCSAgICBpZiAocHJldl9saWdodCA9PSBOVUxMKSBUaGlzLT5saWdodHMgPSBjdXJfbGlnaHQtPm5leHQ7CgkgICAgZWxzZSBwcmV2X2xpZ2h0LT5uZXh0ID0gY3VyX2xpZ2h0LT5uZXh0OwoJICAgIC8qIERldGFjaCB0aGUgbGlnaHQgdG8gdGhlIHZpZXdwb3J0ICovCgkgICAgY3VyX2xpZ2h0LT5hY3RpdmVfdmlld3BvcnQgPSBOVUxMOwoJICAgIFRoaXMtPm51bV9saWdodHMtLTsKCSAgICBUaGlzLT5tYXBfbGlnaHRzICY9IH4oMTw8bHBEaXJlY3QzRExpZ2h0SW1wbC0+ZHdMaWdodEluZGV4KTsKICAgICAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICAgICAgcmV0dXJuIEQzRF9PSzsKCX0KCXByZXZfbGlnaHQgPSBjdXJfbGlnaHQ7CgljdXJfbGlnaHQgPSBjdXJfbGlnaHQtPm5leHQ7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwoKICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQ6Ok5leHRMaWdodAogKgogKiBFbnVtZXJhdGVzIHRoZSBsaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3cG9ydAogKgogKiBQYXJhbXM6CiAqICBscERpcmVjdDNETGlnaHQ6IExpZ2h0IHRvIHN0YXJ0IHdpdGgKICogIGxwbHBEaXJlY3QzRExpZ2h0OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBzdWNjZXNzb3IgdG8KICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RWaWV3cG9ydEltcGxfTmV4dExpZ2h0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKmxwRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RMaWdodCAqKmxwbHBEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwLCVwLCUwOHgpOiBzdHViIVxuIiwgVGhpcywgbHBEaXJlY3QzRExpZ2h0LCBscGxwRGlyZWN0M0RMaWdodCwgZHdGbGFncyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQyIE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldFZpZXdwb3J0MgogKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IHZpZXdwb3J0IGluIGEgRDNEVklFV1BPUlQyIHN0cnVjdHVyZS4KICogU2ltaWxhciB0byBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldFZpZXdwb3J0CiAqCiAqIFBhcmFtczoKICogIGxwRGF0YTogUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHRvIGZpbGwKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSB2aWV3cG9ydCB3YXMgc2V0IHdpdGgKICogICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzOjpTZXRWaWV3cG9ydAogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldFZpZXdwb3J0MihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZJRVdQT1JUMiAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgRFdPUkQgZHdTaXplOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwRGF0YSk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGlmIChUaGlzLT51c2VfdnAyICE9IDEpIHsKICAgICAgICBFUlIoIiAgUmVxdWVzdGluZyB0byBnZXQgYSBEM0RWSUVXUE9SVDIgc3RydWN0IHdoZXJlIGEgRDNEVklFV1BPUlQgd2FzIHNldCAhXG4iKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQogICAgZHdTaXplID0gbHBEYXRhLT5kd1NpemU7CiAgICBtZW1zZXQobHBEYXRhLCAwLCBkd1NpemUpOwogICAgbWVtY3B5KGxwRGF0YSwgJihUaGlzLT52aWV3cG9ydHMudnAyKSwgZHdTaXplKTsKCiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiICByZXR1cm5pbmcgRDNEVklFV1BPUlQyIDpcbiIpOwoJX2R1bXBfRDNEVklFV1BPUlQyKGxwRGF0YSk7CiAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldFZpZXdwb3J0MgogKgogKiBTZXRzIHRoZSB2aWV3cG9ydCBmcm9tIGEgRDNEVklFV1BPUlQyIHN0cnVjdHVyZQogKgogKiBQYXJhbXM6CiAqICBscERhdGE6IFZpZXdwb3J0IHRvIHNldAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldFZpZXdwb3J0MihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZJRVdQT1JUMiAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgTFBESVJFQ1QzRFZJRVdQT1JUMyBjdXJyZW50X3ZpZXdwb3J0OwogICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIGdldHRpbmcgRDNEVklFV1BPUlQyIDpcbiIpOwoJX2R1bXBfRDNEVklFV1BPUlQyKGxwRGF0YSk7CiAgICB9CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIFRoaXMtPnVzZV92cDIgPSAxOwogICAgbWVtc2V0KCYoVGhpcy0+dmlld3BvcnRzLnZwMiksIDAsIHNpemVvZihUaGlzLT52aWV3cG9ydHMudnAyKSk7CiAgICBtZW1jcHkoJihUaGlzLT52aWV3cG9ydHMudnAyKSwgbHBEYXRhLCBscERhdGEtPmR3U2l6ZSk7CgogICAgaWYgKFRoaXMtPmFjdGl2ZV9kZXZpY2UpIHsKICAgICAgSURpcmVjdDNERGV2aWNlM19HZXRDdXJyZW50Vmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlMyksICZjdXJyZW50X3ZpZXdwb3J0KTsKICAgICAgaWYgKElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBjdXJyZW50X3ZpZXdwb3J0KSA9PSBUaGlzKQogICAgICAgIFRoaXMtPmFjdGl2YXRlKFRoaXMpOwogICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZShjdXJyZW50X3ZpZXdwb3J0KTsKICAgIH0KICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZpZXdwb3J0MyBNZXRob2RzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQzOjpTZXRCYWNrZ3JvdW5kRGVwdGgyCiAqCiAqIFNldHMgYSBJRGlyZWN0RHJhd1N1cmZhY2U0IHN1cmZhY2UgYXMgdGhlIGJhY2tncm91bmQgZGVwdGggc3VyZmFjZQogKgogKiBQYXJhbXM6CiAqICBscEREUzogU3VyZmFjZSB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmREZXB0aDIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqbHBERFMpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRERTKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldEJhY2tncm91bmREZXB0aDIKICoKICogUmV0dXJucyB0aGUgSURpcmVjdDNEU3VyZmFjZTQgaW50ZXJmYWNlIHRvIHRoZSBiYWNrZ3JvdW5kIGRlcHRoIHN1cmZhY2UKICoKICogUGFyYW1zOgogKiAgbHBscEREUzogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKICogIGxwVmFsaWQ6IFNldCB0byB0cnVlIGlmIGEgc3VyZmFjZSBpcyBhc3NpZ25lZAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmREZXB0aDIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqKmxwbHBERFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKmxwVmFsaWQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscGxwRERTLCBscFZhbGlkKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkNsZWFyMgogKgogKiBBbm90aGVyIGNsZWFyaW5nIG1ldGhvZAogKgogKiBQYXJhbXM6CiAqICBDb3VudDogTnVtYmVyIG9mIHJlY3RhbmdsZXMgdG8gY2xlYXIKICogIFJlY3RzOiBSZWN0YW5nbGUgYXJyYXkgdG8gY2xlYXIKICogIEZsYWdzOiBTb21lIGZsYWdzIDopCiAqICBDb2xvcjogQ29sb3IgdG8gZmlsbCB0aGUgcmVuZGVyIHRhcmdldCB3aXRoCiAqICBaOiBWYWx1ZSB0byBmaWxsIHRoZSBkZXB0aCBidWZmZXIgd2l0aAogKiAgU3RlbmNpbDogVmFsdWUgdG8gZmlsbCB0aGUgc3RlbmNpbCBiaXRzIHdpdGgKICoKICogUmV0dXJuczoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVmlld3BvcnRJbXBsX0NsZWFyMihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RSRUNUIGxwUmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFIGR2WiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0ZW5jaWwpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCUwOHgsJTA4eCwlZiwlMDh4KVxuIiwgVGhpcywgZHdDb3VudCwgbHBSZWN0cywgZHdGbGFncywgZHdDb2xvciwgZHZaLCBkd1N0ZW5jaWwpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBpZiAoVGhpcy0+YWN0aXZlX2RldmljZSA9PSBOVUxMKSB7CiAgICAgICAgRVJSKCIgVHJ5aW5nIHRvIGNsZWFyIGEgdmlld3BvcnQgbm90IGF0dGFjaGVkIHRvIGEgZGV2aWNlICFcbiIpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0NsZWFyKElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBSZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZaLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RlbmNpbCk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhlIFZUYWJsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpjb25zdCBJRGlyZWN0M0RWaWV3cG9ydDNWdGJsIElEaXJlY3QzRFZpZXdwb3J0M19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNEVmlld3BvcnQgTWV0aG9kcyAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0Vmlld3BvcnQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfVHJhbnNmb3JtVmVydGljZXMsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfTGlnaHRFbGVtZW50cywKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmQsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0QmFja2dyb3VuZERlcHRoLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmREZXB0aCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhciwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRMaWdodCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9EZWxldGVMaWdodCwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9OZXh0TGlnaHQsCiAgICAvKioqIElEaXJlY3QzRFZpZXdwb3J0MiBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRWaWV3cG9ydDIsCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQyLAogICAgLyoqKiBJRGlyZWN0M0RWaWV3cG9ydDMgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0QmFja2dyb3VuZERlcHRoMiwKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRCYWNrZ3JvdW5kRGVwdGgyLAogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0NsZWFyMiwKfTsK