LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgojaW5jbHVkZSAiZXhjcHQuaCIKCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAiZDNkLmgiCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6UXVlcnlJbnRlcmZhY2UKICoKICogUXVlcnlJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gd2l0aCB0aHVua3MgdG8gSURpcmVjdERyYXc3CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZShJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIERpcmVjdERyYXcgcmVmY291bnRpbmcgaXMgYSBiaXQgb2RkLiBFdmVyeSB2ZXJzaW9uIG9mIHRoZSBkZHJhdyBpbnRlcmZhY2UKICogaGFzIGl0cyBvd24gcmVmY291bnQsIGJ1dCBJRGlyZWN0M0QgMS8yLzMgcmVmY291bnRzIGFyZSBsaW5rZWQgdG8KICogSURpcmVjdERyYXcsIGFuZCBJRGlyZWN0M0Q3IGlzIGxpbmtlZCB0byBJRGlyZWN0RHJhdzcKICoKICogSURpcmVjdDNENyAtPiBJRGlyZWN0RHJhdzcKICogSURpcmVjdDNEMyAtPiBJRGlyZWN0RHJhdwogKiBJRGlyZWN0M0QyIC0+IElEaXJlY3REcmF3CiAqIElEaXJlY3QzRCAgLT4gSURpcmVjdERyYXcKICoKICogU28gZXZlcnkgQWRkUmVmIGltcGxlbWVudGF0aW9uIHRodW5rcyB0byBhIGRpZmZlcmVudCBpbnRlcmZhY2UsIGFuZCB0aGUKICogSURpcmVjdERyYXdYOjpBZGRSZWYgaW1wbGVtZW50YXRpb25zIGhhdmUgZGlmZmVyZW50IGNvdW50ZXJzLi4uCiAqCiAqIFJldHVybnMKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYoSURpcmVjdDNENyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQWRkUmVmKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0FkZFJlZihJRGlyZWN0M0QyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYoSURpcmVjdDNEICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpSZWxlYXNlCiAqCiAqIFNhbWUgc3RvcnkgYXMgSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIFJldHVybnM6IFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlKElEaXJlY3QzRDcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19SZWxlYXNlKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9SZWxlYXNlKElEaXJlY3QzRDIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9SZWxlYXNlKElEaXJlY3QzRCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIElEaXJlY3QzRCBpbnRlcmZhY2UuIFRoaXMgaXMgYSBuby1vcCBpbXBsZW1lbnRhdGlvbiwKICogYXMgYWxsIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgYXQgY3JlYXRlIHRpbWUuCiAqCiAqIFZlcnNpb24gMQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6ID8KICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgbm8tb3AKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzKSBuby1vcC4uLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFbnVtRGV2aWNlcwogKgogKiBUaGUgRW51bURldmljZXMgbWV0aG9kIGZvciBJRGlyZWN0M0Q3LiBJdCBlbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQKICogRDNENyBkZXZpY2VzLiBDdXJyZW50bHkgdGhlcmUncyBvbmx5IG9uZS4KICoKICogUGFyYW1zOgogKiAgQ2FsbGJhY2s6IEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW51bWVyYXRlZCBkZXZpY2UKICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSBhcHAKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgR2V0Q2FwcyBjYWxsCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19FbnVtRGV2aWNlcyhJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgY2hhciBpbnRlcmZhY2VfbmFtZVtdID0gIldJTkUgRGlyZWN0M0Q3IHVzaW5nIFdpbmVEM0QiOwogICAgY2hhciBkZXZpY2VfbmFtZVtdID0gIldpbmUgRDNENyBkZXZpY2UiOwogICAgRDNEREVWSUNFREVTQzcgZGRlc2M7CiAgICBEM0RERVZJQ0VERVNDIG9sZERlc2M7CiAgICBIUkVTVUxUIGhyOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CgogICAgVFJBQ0UoIiglcCkgRW51bWVyYXRpbmcgV2luZUQzRCBEM0RldmljZTcgaW50ZXJmYWNlXG4iLCBUaGlzKTsKICAgIGhyID0gSURpcmVjdDNESW1wbF9HZXRDYXBzKFRoaXMtPndpbmVEM0QsICZvbGREZXNjLCAmZGRlc2MpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CiAgICBDYWxsYmFjayhpbnRlcmZhY2VfbmFtZSwgZGV2aWNlX25hbWUsICZkZGVzYywgQ29udGV4dCk7CgogICAgVFJBQ0UoIiglcCkgRW5kIG9mIGVudW1lcmF0aW9uXG4iLCBUaGlzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QzOjpFbnVtRGV2aWNlcwogKgogKiBFbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQgRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlcy4gVGhpcyBpcyB0aGUKICogaW1wbGVtZW50YXRpb24gZm9yIERpcmVjdDNEIDEgdG8gRGlyZWMzRCAzLCBWZXJzaW9uIDcgaGFzIGl0cyBvd24uCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBDYWxsYmFjazogQXBwbGljYXRpb24tcHJvdmlkZWQgcm91dGluZSB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgZGV2aWNlCiAqICBDb250ZXh0OiBQb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcywKICogIFRoZSByZXN1bHQgb2YgSURpcmVjdDNESW1wbF9HZXRDYXBzIGlmIGl0IGZhaWxlZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfRW51bURldmljZXMoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIEQzRERFVklDRURFU0MgZHJlZiwgZDEsIGQyOwogICAgRDNEREVWSUNFREVTQzcgbmV3RGVzYzsKICAgIHN0YXRpYyBDSEFSIHdpbmVkM2RfZGVzY3JpcHRpb25bXSA9ICJXaW5lIEQzRERldmljZSB1c2luZyBXaW5lRDNEIGFuZCBPcGVuR0wiOwogICAgSFJFU1VMVCBocjsKCiAgICAvKiBTb21lIGdhbWVzIChNb3RvcmFjZXIgMiBkZW1vKSBoYXZlIHRoZSBiYWQgaWRlYSB0byBtb2RpZnkgdGhlIGRldmljZSBuYW1lIHN0cmluZy4KICAgICAgIExldCdzIHB1dCB0aGUgc3RyaW5nIGluIGEgc3VmZmljaWVudGx5IHNpemVkIGFycmF5IGluIHdyaXRhYmxlIG1lbW9yeS4gKi8KICAgIGNoYXIgZGV2aWNlX25hbWVbNTBdOwogICAgc3RyY3B5KGRldmljZV9uYW1lLCJkaXJlY3QzZCIpOwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CgogICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+d2luZUQzRCwgJmRyZWYsICZuZXdEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykgcmV0dXJuIGhyOwoKICAgIC8qIERvIEkgaGF2ZSB0byBlbnVtZXJhdGUgdGhlIHJlZmVyZW5jZSBpZD8gTm90ZSBmcm9tIG9sZCBkM2Q3OgogICAgICogIkl0IHNlZW1zIHRoYXQgZW51bWVyYXRpbmcgdGhlIHJlZmVyZW5jZSBJSUQgb24gRGlyZWN0M0QgMSBnYW1lcwogICAgICogKEF2UCAvIE1vdG9yYWNlcjIpIGJyZWFrcyB0aGVtIi4gU28gZG8gbm90IGVudW1lcmF0ZSB0aGlzIGlpZCBpbiBWMQogICAgICoKICAgICAqIFRoZXJlJ3MgYSByZWdpc3RyeSBrZXkgSEtMTVxTb2Z0d2FyZVxNaWNyb3NvZnRcRGlyZWN0M0RcRHJpdmVycywgRW51bVJlZmVyZW5jZQogICAgICogd2hpY2ggZW5hYmxlcyAvIGRpc2FibGVzIGVudW1lcmF0aW5nIHRoZSByZWZlcmVuY2UgcmFzdGVyaXplci4gSXQncyBhIERXT1JELAogICAgICogMCBtZWFucyBkaXNhYmxlZCwgMiBtZWFucyBlbmFibGVkLiBUaGUgZW5hYmxlcmVmcmFzdC5yZWcgYW5kIGRpc2FibGVyZWZyYXN0LnJlZwogICAgICogZmlsZXMgaW4gdGhlIERpcmVjdFggNy4wIHNkayBkZW1vIGRpcmVjdG9yeSBzdWdnZXN0IHRoaXMuCiAgICAgKgogICAgICogU29tZSBnYW1lcyhHVEEgMikgc2VlbSB0byB1c2UgdGhlIHNlY29uZCBlbnVtZXJhdGVkIGRldmljZSwgc28gSSBoYXZlIHRvIGVudW1lcmF0ZQogICAgICogYXQgbGVhc3QgMiBkZXZpY2VzLiBTbyBlbnVtZXJhdGUgdGhlIHJlZmVyZW5jZSBkZXZpY2UgdG8gaGF2ZSAyIGRldmljZXMuCiAgICAgKi8KCiAgICBpZihUaGlzLT5kM2R2ZXJzaW9uICE9IDEpCiAgICB7CiAgICAgICAgc3RhdGljIENIQVIgcmVmZXJlbmNlX2Rlc2NyaXB0aW9uW10gPSAiUmVmZXJlbmNlIERpcmVjdDNEIElEIjsKCiAgICAgICAgVFJBQ0UoIiglcCkgRW51bWVyYXRpbmcgV2luZUQzRCBEM0REZXZpY2UgaW50ZXJmYWNlXG4iLCBUaGlzKTsKICAgICAgICBkMSA9IGRyZWY7CiAgICAgICAgZDIgPSBkcmVmOwogICAgICAgIGhyID0gQ2FsbGJhY2soIChMUElJRCkgJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsIHJlZmVyZW5jZV9kZXNjcmlwdGlvbiwgZGV2aWNlX25hbWUsICZkMSwgJmQyLCBDb250ZXh0KTsKICAgICAgICBpZihociAhPSBEM0RFTlVNUkVUX09LKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIkFwcGxpY2F0aW9uIGNhbmNlbGxlZCB0aGUgZW51bWVyYXRpb25cbiIpOwogICAgICAgICAgICByZXR1cm4gRDNEX09LOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRSgiKCVwKSBFbnVtZXJhdGluZyBXaW5lRDNEIEQzRERldmljZSBpbnRlcmZhY2VcbiIsIFRoaXMpOwogICAgZDEgPSBkcmVmOwogICAgZDIgPSBkcmVmOwogICAgaHIgPSBDYWxsYmFjayggKExQSUlEKSAmSUlEX0QzRERFVklDRV9XaW5lRDNELCB3aW5lZDNkX2Rlc2NyaXB0aW9uLCBkZXZpY2VfbmFtZSwgJmQxLCAmZDIsIENvbnRleHQpOwogICAgaWYoaHIgIT0gRDNERU5VTVJFVF9PSykKICAgIHsKICAgICAgICBUUkFDRSgiQXBwbGljYXRpb24gY2FuY2VsbGVkIHRoZSBlbnVtZXJhdGlvblxuIik7CiAgICAgICAgcmV0dXJuIEQzRF9PSzsKICAgIH0KICAgIFRSQUNFKCIoJXApIEVuZCBvZiBlbnVtZXJhdGlvblxuIiwgVGhpcyk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9FbnVtRGV2aWNlcyhJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICByZXR1cm4gSURpcmVjdDNEM19FbnVtRGV2aWNlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBDb250ZXh0KTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0VudW1EZXZpY2VzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkNyZWF0ZUxpZ2h0CiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNETGlnaHQgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGluCiAqIERpcmVjdDNEMyBvciBlYXJsaWVyIGZvciBsaWdodGluZy4gSW4gRGlyZWN0M0Q3IGl0IGhhcyBiZWVuIHJlcGxhY2VkCiAqIGJ5IHRoZSBESVJFQ1QzRExJR0hUNyBzdHJ1Y3R1cmUuIFdpbmUncyBEaXJlY3QzRExpZ2h0IGltcGxlbWVudGF0aW9uCiAqIHVzZXMgdGhlIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlIHdpdGggRDNENyBsaWdodHMuCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBMaWdodDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSBwb2ludGVyCiAqICBVbmtPdXRlcjogQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICogICAgICAgICAgICBNdXN0IGJlIE5VTEwKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfM19DcmVhdGVMaWdodChJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqTGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqb2JqZWN0OwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBMaWdodCwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RMaWdodEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0LCBJRGlyZWN0M0RMaWdodF9WdGJsKTsKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOwogICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKICAgIG9iamVjdC0+YWN0aXZlX3ZpZXdwb3J0ID0gTlVMTDsKCiAgICAvKiBVcGRhdGUgZnVuY3Rpb25zICovCiAgICBvYmplY3QtPmFjdGl2YXRlID0gbGlnaHRfdXBkYXRlOwogICAgb2JqZWN0LT5kZXNhY3RpdmF0ZSA9IGxpZ2h0X2FjdGl2YXRlOwogICAgb2JqZWN0LT51cGRhdGUgPSBsaWdodF9kZXNhY3RpdmF0ZTsKICAgIG9iamVjdC0+YWN0aXZlX3ZpZXdwb3J0ID0gTlVMTDsKCiAgICAqTGlnaHQgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0KTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsIFRoaXMsIG9iamVjdCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodChJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETGlnaHQsIFVua091dGVyKTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZUxpZ2h0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVMaWdodChJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKipEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEaXJlY3QzRExpZ2h0LCBVbmtPdXRlcik7CiAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVMaWdodChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdDNETGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QzOjpDcmVhdGVNYXRlcmlhbAogKgogKiBDcmVhdGVzIGFuIElEaXJlY3QzRE1hdGVyaWFsIGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBEaXJlY3QzRDMKICogYW5kIG9sZGVyIHZlcnNpb25zLiBUaGUgSURpcmVjdDNETWF0ZXJpYWwgaW1wbGVtZW50YXRpb24gd3JhcHMgaXRzCiAqIGZ1bmN0aW9uYWxpdHkgdG8gSURpcmVjdDNERGV2aWNlNzo6U2V0TWF0ZXJpYWwgYW5kIGZyaWVuZHMuCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBNYXRlcmlhbDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSdzIHBvaW50ZXIgdG8KICogIFVua091dGVyOiBCYXNpY2FsbHkgZm9yIGFnZ3JlZ2F0aW9uLCBidXQgZGRyYXcgZG9lc24ndCBzdXBwb3J0IGl0LgogKiAgICAgICAgICAgIE11c3QgYmUgTlVMTAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAogKiAgQ0xBU1NfRV9OT0FHR1JFR0FUSU9OIGlmIFVua091dGVyICE9IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8zX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWwzICoqTWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqb2JqZWN0OwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBNYXRlcmlhbCwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RNYXRlcmlhbEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwzX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsKTsKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOwogICAgb2JqZWN0LT5hY3RpdmF0ZSA9IG1hdGVyaWFsX2FjdGl2YXRlOwoKICAgICpNYXRlcmlhbCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwzKTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsIFRoaXMsIG9iamVjdCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVNYXRlcmlhbChJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRE1hdGVyaWFsMiAqKkRpcmVjdDNETWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgSFJFU1VMVCByZXQ7CiAgICBJRGlyZWN0M0RNYXRlcmlhbDMgKnJldF92YWw7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEaXJlY3QzRE1hdGVyaWFsLCBVbmtPdXRlcik7CiAgICByZXQgPSBJRGlyZWN0M0QzX0NyZWF0ZU1hdGVyaWFsKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rT3V0ZXIpOwoKICAgICpEaXJlY3QzRE1hdGVyaWFsID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBJRGlyZWN0M0RNYXRlcmlhbDIsIHJldF92YWwpOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcC5cbiIsICpEaXJlY3QzRE1hdGVyaWFsKTsKCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbCAqKkRpcmVjdDNETWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIExQRElSRUNUM0RNQVRFUklBTDMgcmV0X3ZhbDsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETWF0ZXJpYWwsIFVua091dGVyKTsKICAgIHJldCA9IElEaXJlY3QzRDNfQ3JlYXRlTWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7CgogICAgKkRpcmVjdDNETWF0ZXJpYWwgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIElEaXJlY3QzRE1hdGVyaWFsLCByZXRfdmFsKTsKCiAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXAuXG4iLCAqRGlyZWN0M0RNYXRlcmlhbCk7CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkNyZWF0ZVZpZXdwb3J0CiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNEVmlld3BvcnQgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkCiAqIGJ5IERpcmVjdDNEIGFuZCBlYXJsaWVyIHZlcnNpb25zIGZvciBWaWV3cG9ydCBtYW5hZ2VtZW50LiBJbiBEaXJlY3QzRDcKICogaXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSB2aWV3cG9ydCBzdHJ1Y3R1cmUgYW5kCiAqIElEaXJlY3QzRERldmljZTc6OipWaWV3cG9ydC4gV2luZSdzIElEaXJlY3QzRFZpZXdwb3J0IGltcGxlbWVudGF0aW9uCiAqIHVzZXMgdGhlIElEaXJlY3QzRERldmljZTcgbWV0aG9kcyBmb3IgaXRzIGZ1bmN0aW9uYWxpdHkKICoKICogUGFyYW1zOgogKiAgVmlld3BvcnQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIG5ldyBpbnRlcmZhY2UgcG9pbnRlcgogKiAgVW5rT3V0ZXI6IEJhc2ljYWxseSBmb3IgYWdncmVnYXRpb24sIGJ1dCBkZHJhdyBkb2Vzbid0IHN1cHBvcnQgaXQuCiAqICAgICAgICAgICAgTXVzdCBiZSBOVUxMCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgIT0gTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqKlZpZXdwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqb2JqZWN0OwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RWaWV3cG9ydEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzX1Z0YmwpOwogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CiAgICBvYmplY3QtPmFjdGl2YXRlID0gdmlld3BvcnRfYWN0aXZhdGU7CiAgICBvYmplY3QtPnVzZV92cDIgPSAweEZGOwogICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKICAgIG9iamVjdC0+bGlnaHRzID0gTlVMTDsKICAgIG9iamVjdC0+bnVtX2xpZ2h0cyA9IDA7CiAgICBvYmplY3QtPm1hcF9saWdodHMgPSAwOwoKICAgICpWaWV3cG9ydCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmlld3BvcnQzKTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsVGhpcywgb2JqZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZVZpZXdwb3J0KElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICoqRDNEVmlld3BvcnQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEVmlld3BvcnQyLCBVbmtPdXRlcik7CgogICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmlld3BvcnQzICoqKSBEM0RWaWV3cG9ydDIgLyogTm8gbmVlZCB0byBjYXN0IGhlcmUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICoqRDNEVmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIEQzRFZpZXdwb3J0LCBVbmtPdXRlcik7CgogICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmlld3BvcnQzICoqKSBEM0RWaWV3cG9ydCAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkZpbmREZXZpY2UKICoKICogVGhpcyBtZXRob2QgZmluZHMgYSBkZXZpY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgYW5kIHJldHVybnMgYQogKiBkZXZpY2UgZGVzY3JpcHRpb24KICoKICogVmVyaW9uIDEsIDIgYW5kIDMKICogUGFyYW1zOgogKiAgRDNEREZTOiBEZXNjcmliZXMgdGhlIHJlcXVlc3RlZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzCiAqICBEM0RGRFI6IFJldHVybnMgdGhlIGRldmljZSBkZXNjcmlwdGlvbgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgbm8gZGV2aWNlIHdhcyBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfRmluZERldmljZShJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFUkVTVUxUICpEM0RGRFIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgRDNEREVWSUNFREVTQyBkZXNjOwogICAgRDNEREVWSUNFREVTQzcgbmV3RGVzYzsKICAgIEhSRVNVTFQgaHI7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIEQzRERGUywgRDNERkRSKTsKCiAgICBpZiAoKEQzRERGUy0+ZHdGbGFncyAmIEQzREZEU19DT0xPUk1PREVMKSAmJgogICAgICAgIChEM0RERlMtPmRjbUNvbG9yTW9kZWwgIT0gRDNEQ09MT1JfUkdCKSkKICAgIHsKICAgICAgICBUUkFDRSgiIHRyeWluZyB0byByZXF1ZXN0IGEgbm9uLVJHQiBEM0QgY29sb3IgbW9kZWwuIE5vdCBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogTm8gcmVhbCBpZGVhIHdoYXQgdG8gcmV0dXJuIGhlcmUgOi0pICovCiAgICB9CiAgICBpZiAoRDNEREZTLT5kd0ZsYWdzICYgRDNERkRTX0dVSUQpCiAgICB7CiAgICAgICAgVFJBQ0UoIiB0cnlpbmcgdG8gbWF0Y2ggZ3VpZCAlcy5cbiIsIGRlYnVnc3RyX2d1aWQoJihEM0RERlMtPmd1aWQpKSk7CiAgICAgICAgaWYgKChJc0VxdWFsR1VJRCgmSUlEX0QzRERFVklDRV9XaW5lRDNELCAmKEQzRERGUy0+Z3VpZCkpID09IDApICYmCiAgICAgICAgICAgIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzREhBTERldmljZSwgJihEM0RERlMtPmd1aWQpKSA9PSAwKSAmJgogICAgICAgICAgICAoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsICYoRDNEREZTLT5ndWlkKSkgPT0gMCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiIG5vIG1hdGNoIGZvciB0aGlzIEdVSUQuXG4iKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEdldCB0aGUgY2FwcyAqLwogICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+d2luZUQzRCwgJmRlc2MsICZuZXdEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykgcmV0dXJuIGhyOwoKICAgIC8qIE5vdyByZXR1cm4gb3VyIG93biBHVUlEICovCiAgICBEM0RGRFItPmd1aWQgPSBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CiAgICBEM0RGRFItPmRkSHdEZXNjID0gZGVzYzsKICAgIEQzREZEUi0+ZGRTd0Rlc2MgPSBkZXNjOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIFdpbmUncyBXaW5lRDNEIGRldmljZSB3aXRoICh1bmR1bXBlZCkgY2FwYWJpbGl0aWVzXG4iKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UoSURpcmVjdDNEMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VTRUFSQ0ggKkQzRERGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVJFU1VMVCAqRDNERkRSKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIEQzRERGUywgRDNERkRSKTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0ZpbmREZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERkRSKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9GaW5kRGV2aWNlKElEaXJlY3QzRCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VSRVNVTFQgKkQzRERldmljZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEREZTLCBEM0REZXZpY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRDNfRmluZERldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REZXZpY2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6Q3JlYXRlRGV2aWNlCiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuCiAqCiAqIFZlcnNpb24gMiwgMyBhbmQgNy4gSURpcmVjdDNERGV2aWNlIDEgaW50ZXJmYWNlcyBhcmUgaW50ZXJmYWNlcyB0bwogKiBEaXJlY3REcmF3IHN1cmZhY2VzIGFuZCBhcmUgY3JlYXRlZCB3aXRoCiAqIElEaXJlY3REcmF3U3VyZmFjZTo6UXVlcnlJbnRlcmZhY2UuIFRoaXMgbWV0aG9kIHVzZXMgQ3JlYXRlRGV2aWNlIHRvCiAqIGNyZWF0ZSB0aGUgZGV2aWNlIG9iamVjdCBhbmQgUXVlcnlJbnRlcmZhY2VzIGZvciBJRGlyZWN0M0REZXZpY2UKICoKICogUGFyYW1zOgogKiAgcmVmaWlkOiBJSUQgb2YgdGhlIGRldmljZSB0byBjcmVhdGUKICogIFN1cmZhY2U6IEluaXRpdGlhbCByZW5kZXJ0YXJnZXQKICogIERldmljZTogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIGEgZGV2aWNlIGV4aXN0cyBhbHJlYWR5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19DcmVhdGVEZXZpY2UoSURpcmVjdDNENyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlNyAqKkRldmljZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpvYmplY3Q7CiAgICBJUGFyZW50SW1wbCAqSW5kZXhCdWZmZXJQYXJlbnQ7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgU3VyZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpkZXB0aGJ1ZmZlciA9IE5VTEw7CiAgICBzdGF0aWMgRERTQ0FQUzIgZGVwdGhjYXBzID0geyBERFNDQVBTX1pCVUZGRVIsIDAsIDAsIDAgfTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UpOwoKICAgICpEZXZpY2UgPSBOVUxMOwoKICAgIC8qIEZhaWwgZGV2aWNlIGNyZWF0aW9uIGlmIG5vbi1vcGVuZ2wgc3VyZmFjZXMgYXJlIHVzZWQgKi8KICAgIGlmKFRoaXMtPkltcGxUeXBlICE9IFNVUkZBQ0VfT1BFTkdMKQogICAgewogICAgICAgIEVSUigiVGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIERpcmVjdDNEIGRldmljZSwgYnV0IG5vbi1vcGVuZ2wgc3VyZmFjZXMgYXJlIHNldCBpbiB0aGUgcmVnaXN0cnkuIFBsZWFzZSBzZXQgdGhlIHN1cmZhY2UgaW1wbGVtZW50YXRpb24gdG8gb3BlbmdsIG9yIGF1dG9kZXRlY3Rpb24gdG8gYWxsb3cgM0QgcmVuZGVyaW5nXG4iKTsKCiAgICAgICAgLyogV2Ugb25seSBoaXQgdGhpcyBwYXRoIGlmIGEgZGVmYXVsdCBzdXJmYWNlIGlzIHNldCBpbiB0aGUgcmVnaXN0cnkuIEluY29ycmVjdCBhdXRvZGV0ZWN0aW9uCiAgICAgICAgICogaXMgY2F1Z2h0IGluIENyZWF0ZVN1cmZhY2Ugb3IgUXVlcnlJbnRlcmZhY2UKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gRERFUlJfTk8zRDsKICAgIH0KCiAgICAvKiBTbyBmYXIgd2UgY2FuIG9ubHkgY3JlYXRlIG9uZSBkZXZpY2UgcGVyIGRkcmF3IG9iamVjdCAqLwogICAgaWYoVGhpcy0+ZDNkZGV2aWNlKQogICAgewogICAgICAgIEZJWE1FKCIoJXApOiBPbmx5IG9uZSBEaXJlY3QzRCBkZXZpY2UgcGVyIERpcmVjdERyYXcgb2JqZWN0IHN1cHBvcnRlZFxuIiwgVGhpcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJRGlyZWN0M0REZXZpY2VJbXBsKSk7CiAgICBpZighb2JqZWN0KQogICAgewogICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgYSBJRGlyZWN0M0REZXZpY2UgaW1wbGVtZW50YXRpb25cbiIpOwogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKICAgIH0KCiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNERGV2aWNlNywgSURpcmVjdDNERGV2aWNlN19WdGJsKTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2UzX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTJfVnRibCk7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2UxX1Z0YmwpOwoKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOwogICAgb2JqZWN0LT52aWV3cG9ydF9saXN0ID0gTlVMTDsKICAgIG9iamVjdC0+Y3VycmVudF92aWV3cG9ydCA9IE5VTEw7CiAgICBvYmplY3QtPm1hdGVyaWFsID0gMDsKICAgIG9iamVjdC0+dGFyZ2V0ID0gdGFyZ2V0OwoKICAgIG9iamVjdC0+SGFuZGxlcyA9IE5VTEw7CiAgICBvYmplY3QtPm51bUhhbmRsZXMgPSAwOwoKICAgIC8qIFRoaXMgaXMgZm9yIGNvbnZlbmllbmNlICovCiAgICBvYmplY3QtPndpbmVEM0REZXZpY2UgPSBUaGlzLT53aW5lRDNERGV2aWNlOwoKICAgIC8qIENyZWF0ZSBhbiBpbmRleCBidWZmZXIsIGl0J3MgbmVlZGVkIGZvciBpbmRleGVkIGRyYXdpbmcgKi8KICAgIEluZGV4QnVmZmVyUGFyZW50ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJUGFyZW50SW1wbCAqKSk7CiAgICBpZighSW5kZXhCdWZmZXJQYXJlbnQpCiAgICB7CiAgICAgICAgRVJSKCJBbGxvY2F0aW5nIG1lbW9yeSBmb3IgYW4gaW5kZXggYnVmZmVyIHBhcmVudCBmYWlsZWRcbiIpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iamVjdCk7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQogICAgSUNPTV9JTklUX0lOVEVSRkFDRShJbmRleEJ1ZmZlclBhcmVudCwgSVBhcmVudCwgSVBhcmVudF9WdGJsKTsKICAgIEluZGV4QnVmZmVyUGFyZW50LT5yZWYgPSAxOwoKICAgIC8qIENyZWF0ZSBhbiBJbmRleCBCdWZmZXIuIFdpbmVEM0QgbmVlZHMgb25lIGZvciBEcmF3aW5nIGluZGV4ZWQgcHJpbWl0aXZlcwogICAgICogQ3JlYXRlIGEgKGhvcGVmdWxseSkgbG9uZyBlbm91Z2ggYnVmZmVyLCBhbmQgY29weSB0aGUgaW5kaWNlcyBpbnRvIGl0CiAgICAgKiBJZGVhbGx5LCBhIElXaW5lRDNESW5kZXhCdWZmZXI6OlNldERhdGEgbWV0aG9kIGNvdWxkIGJlIGNyZWF0ZWQsIHdoaWNoCiAgICAgKiB0YWtlcyB0aGUgcG9pbnRlciBhbmQgYXZvaWRzIHRoZSBtZW1jcHkKICAgICAqLwogICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVJbmRleEJ1ZmZlcihUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwLCAvKiBMZW5ndGguIERvbid0IGtub3cgaG93IGxvbmcgaXQgc2hvdWxkIGJlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RVU0FHRV9EWU5BTUlDLCAvKiBVc2FnZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk1UX0lOREVYMTYsIC8qIEZvcm1hdC4gRDNENyB1c2VzIFdPUkRTICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQT09MX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QtPmluZGV4YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICopIElDT01fSU5URVJGQUNFKEluZGV4QnVmZmVyUGFyZW50LCBJUGFyZW50KSk7CgogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgYW4gaW5kZXggYnVmZmVyXG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwogICAgICAgIHJldHVybiBocjsKICAgIH0KICAgIEluZGV4QnVmZmVyUGFyZW50LT5jaGlsZCA9IChJVW5rbm93biAqKSBvYmplY3QtPmluZGV4YnVmZmVyOwoKICAgIC8qIE5vIG5lZWQgdG8gc2V0IHRoZSBpbmRpY2VzLCBpdCdzIGRvbmUgd2hlbiBuZWNlc3NhcnkgKi8KCiAgICAvKiBBZGRSZWYgdGhlIFdpbmVEM0QgRGV2aWNlICovCiAgICBJV2luZUQzRERldmljZV9BZGRSZWYoVGhpcy0+d2luZUQzRERldmljZSk7CgogICAgLyogRG9uJ3QgZm9yZ2V0IHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIDspICovCiAgICAqRGV2aWNlID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2U3KTsKCiAgICBUUkFDRSgiICglcCkgQ3JlYXRlZCBhbiBJRGlyZWN0M0REZXZpY2VJbXBsIG9iamVjdCBhdCAlcFxuIiwgVGhpcywgb2JqZWN0KTsKCiAgICAvKiBUaGlzIGlzIGZvciBhcHBzIHdoaWNoIGNyZWF0ZSBhIG5vbi1mbGlwLCBub24tZDNkIHByaW1hcnkgc3VyZmFjZQogICAgICogYW5kIGFuIG9mZnNjcmVlbiBEM0RERVZJQ0Ugc3VyZmFjZSwgdGhlbiByZW5kZXIgdG8gdGhlIG9mZnNjcmVlbiBzdXJmYWNlCiAgICAgKiBhbmQgZG8gYSBCbHQgZnJvbSB0aGUgb2Zmc2NyZWVuIHRvIHRoZSBwcmltYXJ5IHN1cmZhY2UuCiAgICAgKgogICAgICogU2V0IHRoZSBvZmZzY3JlZW4gRDNERERFVklDRSBzdXJmYWNlKD10YXJnZXQpIGFzIHRoZSBiYWNrIGJ1ZmZlciwKICAgICAqIGFuZCB0aGUgcHJpbWFyeSBzdXJmYWNlKD1UaGlzLT5kM2RfdGFyZ2V0KSBhcyB0aGUgZnJvbnQgYnVmZmVyLgogICAgICoKICAgICAqIFRoaXMgd2F5IHRoZSBhcHAgd2lsbCByZW5kZXIgdG8gdGhlIEQzRERFVklDRSBzdXJmYWNlIGFuZCBXaW5lRDNECiAgICAgKiB3aWxsIGNhdGNoIHRoZSBCbHQgd2FzIEJhY2sgQnVmZmVyIC0+IEZyb250IGJ1ZmZlciBibHQgYW5kIHBlcmZvcm0KICAgICAqIGEgZmxpcCBpbnN0ZWFkLiBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBhIG1peGVkIEdMIC8gR0RJCiAgICAgKiBlbnZpcm9ubWVudC4KICAgICAqCiAgICAgKiBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGFnYWluc3Qgd2luZG93ZWQgYXBwcy4gVGhlIG9ubHkgYXBwIHRlc3RlZCB3aXRoCiAgICAgKiB0aGlzIGlzIG1vdG8gcmFjZXIgMiBkdXJpbmcgdGhlIGxvYWRpbmcgc2NyZWVuLgogICAgICovCiAgICBUUkFDRSgiSXNyZW5kZXJ0YXJnZXQ6ICVzLCBkM2RfdGFyZ2V0PSVwXG4iLCB0YXJnZXQtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgPyAidHJ1ZSIgOiAiZmFsc2UiLCBUaGlzLT5kM2RfdGFyZ2V0KTsKICAgIGlmKCEodGFyZ2V0LT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKSAmJgogICAgICAgKFRoaXMtPmQzZF90YXJnZXQgIT0gdGFyZ2V0KSkKICAgIHsKICAgICAgICBUUkFDRSgiKCVwKSBVc2luZyAlcCBhcyBmcm9udCBidWZmZXIsICVwIGFzIGJhY2sgYnVmZmVyXG4iLCBUaGlzLCBUaGlzLT5kM2RfdGFyZ2V0LCB0YXJnZXQpOwogICAgICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0RnJvbnRCYWNrQnVmZmVycyhUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5kM2RfdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSk7CiAgICAgICAgaWYoaHIgIT0gRDNEX09LKQogICAgICAgICAgICBFUlIoIiglcCkgRXJyb3IgJTA4eCBzZXR0aW5nIHRoZSBmcm9udCBhbmQgYmFjayBidWZmZXJcbiIsIFRoaXMsIGhyKTsKCiAgICAgICAgb2JqZWN0LT5PZmZTY3JlZW5UYXJnZXQgPSBUUlVFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG9iamVjdC0+T2ZmU2NyZWVuVGFyZ2V0ID0gRkFMU0U7CiAgICB9CgogICAgLyogQWRkUmVmIHRoZSByZW5kZXIgdGFyZ2V0LiBBbHNvIEFkZFJlZiB0aGUgcmVuZGVyIHRhcmdldCBmcm9tIGRkcmF3LAogICAgICogYmVjYXVzZSBpZiBpdCBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIGFwcCByZWxlYXNlcyB0aGUgRDNEIGRldmljZSwgdGhlIEQzRCBjYXBhYmlsaXRpZXMKICAgICAqIG9mIFdpbmVEM0Qgd2lsbCBiZSB1bmluaXRpYWxpemVkLCB3aGljaCBoYXMgYmFkIGVmZmVjdHMuCiAgICAgKgogICAgICogSW4gbW9zdCBjYXNlcywgdGhvc2Ugc3VyZmFjZXMgYXJlIHRoZSBzdXJmYWNlcyBhcmUgdGhlIHNhbWUgYW55d2F5LCBidXQgdGhpcyB3aWxsIHNpbXBseQogICAgICogYWRkIGFub3RoZXIgcmVmIHdoaWNoIGlzIHJlbGVhc2VkIHdoZW4gdGhlIGRldmljZSBpcyBkZXN0cm95ZWQuCiAgICAgKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKFN1cmZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZDNkX3RhcmdldCwgSURpcmVjdERyYXdTdXJmYWNlNykpOwoKICAgIFRoaXMtPmQzZGRldmljZSA9IG9iamVjdDsKCiAgICAvKiBMb29rIGZvciBhIGRlcHRoIGJ1ZmZlciBhbmQgZW5hYmxlIHRoZSBaIHRlc3QgaWYgb25lIGlzIGZvdW5kICovCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0QXR0YWNoZWRTdXJmYWNlKFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aGNhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aGJ1ZmZlcik7CiAgICBpZihkZXB0aGJ1ZmZlcikKICAgIHsKICAgICAgICBUUkFDRSgiKCVwKSBEZXB0aCBidWZmZXIgZm91bmQsIGVuYWJsaW5nIFogdGVzdFxuIiwgb2JqZWN0KTsKICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RSU19aRU5BQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShkZXB0aGJ1ZmZlcik7CiAgICB9CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVEZXZpY2UoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTQgKlN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMyAqKkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXAsJXApOiBUaHVua2luZyB0byBJRGlyZWN0M0Q3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIFN1cmZhY2UsIERldmljZSwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBociA9ICBJRGlyZWN0M0Q3X0NyZWF0ZURldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0RHJhd1N1cmZhY2U3ICopIFN1cmZhY2UgLyogU2FtZSBWVGFibGVzICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRERldmljZTcgKiopIERldmljZSk7CgogICAgKkRldmljZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UzLCAqRGV2aWNlKTsKICAgIHJldHVybiBocjsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVEZXZpY2UoSURpcmVjdDNEMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UyICoqRGV2aWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UpOwoKICAgIGhyID0gIElEaXJlY3QzRDdfQ3JlYXRlRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIElEaXJlY3REcmF3U3VyZmFjZTcsIFN1cmZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRERldmljZTcgKiopIERldmljZSk7CgogICAgKkRldmljZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UyLCAqRGV2aWNlKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDc6OkNyZWF0ZVZlcnRleEJ1ZmZlcgogKgogKiBDcmVhdGVzIGEgbmV3IHZlcnRleCBidWZmZXIgb2JqZWN0IGFuZCByZXR1cm5zIGEgSURpcmVjdDNEVmVydGV4QnVmZmVyNwogKiBpbnRlcmZhY2UuCiAqCiAqIFZlcnNpb24gMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICBEZXNjOiBSZXF1ZXN0ZWQgVmVydGV4IGJ1ZmZlciBwcm9wZXJ0aWVzCiAqICBWZXJ0ZXhCdWZmZXI6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIG11c3QgYmUgMAogKgogKiBSZXR1cm5zCiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBUaGUgcmV0dXJuIHZhbHVlIG9mIElXaW5lRDNERGV2aWNlOjpDcmVhdGVWZXJ0ZXhCdWZmZXIgaWYgdGhpcyBjYWxsIGZhaWxzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERlc2Mgb3IgVmVydGV4QnVmZmVyIGFyZSBOVUxMLCBvciBGbGFncyAhPSAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19DcmVhdGVWZXJ0ZXhCdWZmZXIoSURpcmVjdDNENyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYQlVGRkVSREVTQyAqRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICoqVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKm9iamVjdDsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOHgpXG4iLCBUaGlzLCBEZXNjLCBWZXJ0ZXhCdWZmZXIsIEZsYWdzKTsKCiAgICBUUkFDRSgiKCVwKSBWZXJ0ZXggYnVmZmVyIGRlc2NyaXB0aW9uOlxuIiwgVGhpcyk7CiAgICBUUkFDRSgiKCVwKSAgZHdTaXplPSVkXG4iLCBUaGlzLCBEZXNjLT5kd1NpemUpOwogICAgVFJBQ0UoIiglcCkgIGR3Q2Fwcz0lMDh4XG4iLCBUaGlzLCBEZXNjLT5kd0NhcHMpOwogICAgVFJBQ0UoIiglcCkgIEZWRj0lMDh4XG4iLCBUaGlzLCBEZXNjLT5kd0ZWRik7CiAgICBUUkFDRSgiKCVwKSAgZHdOdW1WZXJ0aWNlcz0lZFxuIiwgVGhpcywgRGVzYy0+ZHdOdW1WZXJ0aWNlcyk7CgogICAgLyogRDNENyBTREs6ICJObyBGbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQgZm9yIHRoaXMgbWV0aG9kLiBUaGlzCiAgICAgKiBwYXJhbWV0ZXIgbXVzdCBiZSAwIgogICAgICoKICAgICAqIE5ldmVyIHRydXN0IHRoZSBkb2N1bWVudGF0aW9uIC0gdGhpcyBpcyB3cm9uZwogICAgaWYoRmxhZ3MgIT0gMCkKICAgIHsKICAgICAgICBFUlIoIiglcCkgRmxhZ3MgaXMgJTA4bHgsIHJldHVybmluZyBEREVSUl9JTlZBTElEUEFSQU1TXG4iLCBUaGlzLCBGbGFncyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CiAgICAgKi8KCiAgICAvKiBXZWxsLCB0aGlzIHNvdW5kcyBzYW5lICovCiAgICBpZiggKCFWZXJ0ZXhCdWZmZXIpIHx8ICghRGVzYykgKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIC8qIE5vdyBjcmVhdGUgdGhlIHZlcnRleCBidWZmZXIgKi8KICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCkpOwogICAgaWYoIW9iamVjdCkKICAgIHsKICAgICAgICBFUlIoIiglcCkgT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgYSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsIHN0cnVjdHVyZVxuIiwgVGhpcyk7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQoKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsKTsKCiAgICBvYmplY3QtPkNhcHMgPSBEZXNjLT5kd0NhcHM7CiAgICBvYmplY3QtPmRkcmF3ID0gVGhpczsKCiAgICBociA9IElXaW5lRDNERGV2aWNlX0NyZWF0ZVZlcnRleEJ1ZmZlcihUaGlzLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERlc2MtPmR3RlZGKSAqIERlc2MtPmR3TnVtVmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjLT5kd0NhcHMgJiBEM0RWQkNBUFNfV1JJVEVPTkxZID8gV0lORUQzRFVTQUdFX1dSSVRFT05MWSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjLT5kd0ZWRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3Q2FwcyAmIEQzRFZCQ0FQU19TWVNURU1NRU1PUlkgPyBXSU5FRDNEUE9PTF9TWVNURU1NRU0gOiBXSU5FRDNEUE9PTF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdC0+d2luZUQzRFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU2hhcmVkSGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICopIElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOwogICAgaWYoaHIgIT0gRDNEX09LKQogICAgewogICAgICAgIEVSUigiKCVwKSBJV2luZUQzRERldmljZTo6Q3JlYXRlVmVydGV4QnVmZmVyIGZhaWxlZCB3aXRoIGhyPSUwOHhcbiIsIFRoaXMsIGhyKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwogICAgICAgIGlmIChociA9PSBXSU5FRDNERVJSX0lOVkFMSURDQUxMKQogICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBocjsKICAgIH0KCiAgICAvKiBSZXR1cm4gdGhlIGludGVyZmFjZSAqLwogICAgKlZlcnRleEJ1ZmZlciA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNyk7CgogICAgVFJBQ0UoIiglcCkgQ3JlYXRlZCBuZXcgdmVydGV4IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBhdCAlcCwgcmV0dXJuaW5nIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgb2JqZWN0LCAqVmVydGV4QnVmZmVyKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmVydGV4QnVmZmVyKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgKkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyICoqVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlMDh4LCVwKTogUmVsYXlpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgRGVzYywgVmVydGV4QnVmZmVyLCBGbGFncywgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyICE9IE5VTEwpIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgaHIgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKiopIFZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOwoKICAgICpWZXJ0ZXhCdWZmZXIgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgSURpcmVjdDNEVmVydGV4QnVmZmVyLCAqVmVydGV4QnVmZmVyKTsKICAgIHJldHVybiBocjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFbnVtWkJ1ZmZlckZvcm1hdHMKICoKICogRW51bWVyYXRlcyBhbGwgc3VwcG9ydGVkIFogYnVmZmVyIHBpeGVsIGZvcm1hdHMKICoKICogVmVyc2lvbiAzIGFuZCA3CiAqCiAqIFBhcmFtczoKICogIHJlZmlpZERldmljZToKICogIENhbGxiYWNrOiBDYWxsYmFjayB0byBjYWxsIGZvciBlYWNoIHBpeGVsIGZvcm1hdAogKiAgQ29udGV4dDogUG9pbnRlciB0byBwYXNzIGJhY2sgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBDYWxsYmFjayBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpFbnVtWkJ1ZmZlckZvcm1hdHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF83X0VudW1aQnVmZmVyRm9ybWF0cyhJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByZWZpaWREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgaW50IGk7CgogICAgLyogT3JkZXIgbWF0dGVycy4gU3BlY2lmaWNhbGx5LCBCYXR0bGVab25lIElJIChmdWxsIHZlcnNpb24pIGV4cGVjdHMgdGhlCiAgICAgKiAxNi1iaXQgZGVwdGggZm9ybWF0cyB0byBiZSBsaXN0ZWQgYmVmb3JlIHRoZSAyNCBhbmQgMzIgb25lcy4gKi8KICAgIFdJTkVEM0RGT1JNQVQgRm9ybWF0TGlzdFtdID0gewogICAgICAgIFdJTkVEM0RGTVRfRDE1UzEsCiAgICAgICAgV0lORUQzREZNVF9EMTYsCiAgICAgICAgV0lORUQzREZNVF9EMjRYOCwKICAgICAgICBXSU5FRDNERk1UX0QyNFg0UzQsCiAgICAgICAgV0lORUQzREZNVF9EMjRTOCwKICAgICAgICBXSU5FRDNERk1UX0QzMgogICAgfTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwKTogUmVsYXlcbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZERldmljZSksIENhbGxiYWNrLCBDb250ZXh0KTsKCiAgICBpZighQ2FsbGJhY2spCiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CgogICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKEZvcm1hdExpc3QpIC8gc2l6ZW9mKFdJTkVEM0RGT1JNQVQpOyBpKyspCiAgICB7CiAgICAgICAgaHIgPSBJV2luZUQzRF9DaGVja0RldmljZUZvcm1hdChUaGlzLT53aW5lRDNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBBZGFwdGVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBEZXZpY2VUeXBlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBBZGFwdGVyRm9ybWF0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFVTQUdFX0RFUFRIU1RFTkNJTCAvKiBVc2FnZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogUmVzb3VyY2VUeXBlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TGlzdFtpXSk7CiAgICAgICAgaWYoaHIgPT0gRDNEX09LKQogICAgICAgIHsKICAgICAgICAgICAgRERQSVhFTEZPUk1BVCBwZm9ybWF0OwoKICAgICAgICAgICAgbWVtc2V0KCZwZm9ybWF0LCAwLCBzaXplb2YocGZvcm1hdCkpOwogICAgICAgICAgICBwZm9ybWF0LmR3U2l6ZSA9IHNpemVvZihwZm9ybWF0KTsKICAgICAgICAgICAgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoJnBmb3JtYXQsIEZvcm1hdExpc3RbaV0pOwoKICAgICAgICAgICAgVFJBQ0UoIkVudW1lcmF0aW5nIFdpbmVEM0RGb3JtYXQgJWRcbiIsIEZvcm1hdExpc3RbaV0pOwogICAgICAgICAgICBociA9IENhbGxiYWNrKCZwZm9ybWF0LCBDb250ZXh0KTsKICAgICAgICAgICAgaWYoaHIgIT0gRERFTlVNUkVUX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiRm9ybWF0IGVudW1lcmF0aW9uIGNhbmNlbGxlZCBieSBhcHBsaWNhdGlvblxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNEX09LOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgVFJBQ0UoIkVuZCBvZiBlbnVtZXJhdGlvblxuIik7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8zX0VudW1aQnVmZmVyRm9ybWF0cyhJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByaWlkRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNENyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWREZXZpY2UpLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICByZXR1cm4gSURpcmVjdDNEN19FbnVtWkJ1ZmZlckZvcm1hdHMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDc6OkV2aWN0TWFuYWdlZFRleHR1cmVzCiAqCiAqIFJlbW92ZXMgYWxsIG1hbmFnZWQgdGV4dHVyZXMgKD1zdXJmYWNlcyB3aXRoIEREU0NBUFMyX1RFWFRVUkVNQU5BR0Ugb3IKICogRERTQ0FQUzJfRDNEVEVYVFVSRU1BTkFHRSBjYXBzKSB0byBiZSByZW1vdmVkIGZyb20gdmlkZW8gbWVtb3J5LgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzdfRXZpY3RNYW5hZ2VkVGV4dHVyZXMoSURpcmVjdDNENyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgRklYTUUoIiglcCk6IFN0dWIhXG4iLCBUaGlzKTsKCiAgICAvKiBJbXBsZW1lbnRhdGlvbiBpZGVhOgogICAgICogQWRkIGFuIElXaW5lRDNEU3VyZmFjZSBtZXRob2Qgd2hpY2ggc2V0cyB0aGUgb3BlbmdsIHRleHR1cmUKICAgICAqIHByaW9yaXR5IGxvdyBvciBldmVuIHJlbW92ZXMgdGhlIG9wZW5nbCB0ZXh0dXJlLgogICAgICovCgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19FdmljdE1hbmFnZWRUZXh0dXJlcyhJRGlyZWN0M0QzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNENyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKICAgIHJldHVybiBJRGlyZWN0M0Q3X0V2aWN0TWFuYWdlZFRleHR1cmVzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREltcGxfR2V0Q2FwcwogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZGV2aWNlIGNhcHMgZnJvbSB3aW5lZDNkCiAqIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgRDNENyBhbmQgRDNEIC0gRDNEMyBzdHJ1Y3R1cmUKICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlcyBpbiBkZHJhdwogKgogKiBQYXJhbXM6CiAqICBXaW5lRDNEOiBUaGUgaW50ZXJmYWNlIHRvIGdldCB0aGUgY2FwcyBmcm9tCiAqICBEZXNjMTIzOiBPbGQgRDNEIDwzIHN0cnVjdHVyZSB0byBmaWxsIChuZWVkZWQpCiAqICBEZXNjNzogRDNENyBkZXZpY2UgZGVzYyBzdHJ1Y3R1cmUgdG8gZmlsbCAobmVlZGVkKQogKgogKiBSZXR1cm5zCiAqICBEM0RfT0sgb24gc3VjY2Vzcywgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBJV2luZUQzRDo6R2V0Q2FwcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQKSURpcmVjdDNESW1wbF9HZXRDYXBzKElXaW5lRDNEICpXaW5lRDNELAogICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQyAqRGVzYzEyMywKICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0M3ICpEZXNjNykKewogICAgV0lORUQzRENBUFMgV0NhcHM7CiAgICBIUkVTVUxUIGhyOwoKICAgIC8qIFNvbWUgVmFyaWFibGVzIHRvIGFzaWduIHRvIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLwogICAgV0lORUQzRERFVlRZUEUgRGV2VHlwZTsKICAgIFVJTlQgZHVtbXlfdWludDsKICAgIGZsb2F0IGR1bW15X2Zsb2F0OwogICAgRFdPUkQgZHVtbXlfZHdvcmQsIE1heFRleHR1cmVCbGVuZFN0YWdlcywgTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CiAgICBEV09SRCBNYXhVc2VyQ2xpcFBsYW5lcywgTWF4VmVydGV4QmxlbmRNYXRyaWNlczsKCiAgICBUUkFDRSgiKCktPiglcCwlcCwlcFxuIiwgV2luZUQzRCwgRGVzYzEyMywgRGVzYzcpOwoKICAgIC8qIEFzaWduIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLwogICAgV0NhcHMuRGV2aWNlVHlwZSA9ICZEZXZUeXBlOwogICAgV0NhcHMuQWRhcHRlck9yZGluYWwgPSAmZHVtbXlfdWludDsKCiAgICBXQ2Fwcy5DYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuQ2FwczIgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5DYXBzMyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLlByZXNlbnRhdGlvbkludGVydmFscyA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5DdXJzb3JDYXBzID0gJmR1bW15X2R3b3JkOwoKICAgIFdDYXBzLkRldkNhcHMgPSAmRGVzYzctPmR3RGV2Q2FwczsKICAgIFdDYXBzLlByaW1pdGl2ZU1pc2NDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuUmFzdGVyQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdSYXN0ZXJDYXBzOwogICAgV0NhcHMuWkNtcENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3WkNtcENhcHM7CiAgICBXQ2Fwcy5TcmNCbGVuZENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzOwogICAgV0NhcHMuRGVzdEJsZW5kQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdEZXN0QmxlbmRDYXBzOwogICAgV0NhcHMuQWxwaGFDbXBDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd0FscGhhQ21wQ2FwczsKICAgIFdDYXBzLlNoYWRlQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHM7CiAgICBXQ2Fwcy5UZXh0dXJlQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwczsKICAgIFdDYXBzLlRleHR1cmVGaWx0ZXJDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzOwogICAgV0NhcHMuQ3ViZVRleHR1cmVGaWx0ZXJDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuVm9sdW1lVGV4dHVyZUZpbHRlckNhcHMgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5UZXh0dXJlQWRkcmVzc0NhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzOwogICAgV0NhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0gJmR1bW15X2R3b3JkOwoKICAgIFdDYXBzLkxpbmVDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4VGV4dHVyZVdpZHRoID0gJkRlc2M3LT5kd01heFRleHR1cmVXaWR0aDsKICAgIFdDYXBzLk1heFRleHR1cmVIZWlnaHQgPSAmRGVzYzctPmR3TWF4VGV4dHVyZUhlaWdodDsKICAgIFdDYXBzLk1heFZvbHVtZUV4dGVudCA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gJkRlc2M3LT5kd01heFRleHR1cmVSZXBlYXQ7CiAgICBXQ2Fwcy5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSAmRGVzYzctPmR3TWF4VGV4dHVyZUFzcGVjdFJhdGlvOwogICAgV0NhcHMuTWF4QW5pc290cm9weSA9ICZEZXNjNy0+ZHdNYXhBbmlzb3Ryb3B5OwogICAgV0NhcHMuTWF4VmVydGV4VyA9ICZEZXNjNy0+ZHZNYXhWZXJ0ZXhXOwoKICAgIFdDYXBzLkd1YXJkQmFuZExlZnQgPSAmRGVzYzctPmR2R3VhcmRCYW5kTGVmdDsKICAgIFdDYXBzLkd1YXJkQmFuZFRvcCA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRUb3A7CiAgICBXQ2Fwcy5HdWFyZEJhbmRSaWdodCA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRSaWdodDsKICAgIFdDYXBzLkd1YXJkQmFuZEJvdHRvbSA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRCb3R0b207CgogICAgV0NhcHMuRXh0ZW50c0FkanVzdCA9ICZEZXNjNy0+ZHZFeHRlbnRzQWRqdXN0OwogICAgV0NhcHMuU3RlbmNpbENhcHMgPSAmRGVzYzctPmR3U3RlbmNpbENhcHM7CgogICAgV0NhcHMuRlZGQ2FwcyA9ICZEZXNjNy0+ZHdGVkZDYXBzOwogICAgV0NhcHMuVGV4dHVyZU9wQ2FwcyA9ICZEZXNjNy0+ZHdUZXh0dXJlT3BDYXBzOwogICAgV0NhcHMuTWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gJk1heFRleHR1cmVCbGVuZFN0YWdlczsKICAgIFdDYXBzLk1heFNpbXVsdGFuZW91c1RleHR1cmVzID0gJk1heFNpbXVsdGFuZW91c1RleHR1cmVzOwoKICAgIFdDYXBzLlZlcnRleFByb2Nlc3NpbmdDYXBzID0gJkRlc2M3LT5kd1ZlcnRleFByb2Nlc3NpbmdDYXBzOwogICAgV0NhcHMuTWF4QWN0aXZlTGlnaHRzID0gJkRlc2M3LT5kd01heEFjdGl2ZUxpZ2h0czsKICAgIFdDYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gJk1heFVzZXJDbGlwUGxhbmVzOwogICAgV0NhcHMuTWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9ICZNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzOwogICAgV0NhcHMuTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5NYXhQb2ludFNpemUgPSAmZHVtbXlfZmxvYXQ7CiAgICBXQ2Fwcy5NYXhQcmltaXRpdmVDb3VudCA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFZlcnRleEluZGV4ID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4U3RyZWFtcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFN0cmVhbVN0cmlkZSA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuTWF4VmVydGV4U2hhZGVyQ29uc3QgPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlID0gJmR1bW15X2Zsb2F0OwoKICAgIC8qIFRoZXNlIGFyZSBkeDkgb25seSwgc2V0IHRoZW0gdG8gTlVMTCAqLwogICAgV0NhcHMuRGV2Q2FwczIgPSBOVUxMOwogICAgV0NhcHMuTWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgPSBOVUxMOwogICAgV0NhcHMuUmVzZXJ2ZWQ1ID0gTlVMTDsKICAgIFdDYXBzLk1hc3RlckFkYXB0ZXJPcmRpbmFsID0gTlVMTDsKICAgIFdDYXBzLkFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IE5VTEw7CiAgICBXQ2Fwcy5OdW1iZXJPZkFkYXB0ZXJzSW5Hcm91cCA9IE5VTEw7CiAgICBXQ2Fwcy5EZWNsVHlwZXMgPSBOVUxMOwogICAgV0NhcHMuTnVtU2ltdWx0YW5lb3VzUlRzID0gTlVMTDsKICAgIFdDYXBzLlN0cmV0Y2hSZWN0RmlsdGVyQ2FwcyA9IE5VTEw7CiAgICAvKiBXQ2Fwcy5WUzIwQ2FwcyA9IE5VTEw7ICovCiAgICAvKiBXQ2Fwcy5QUzIwQ2FwcyA9IE5VTEw7ICovCiAgICBXQ2Fwcy5WZXJ0ZXhUZXh0dXJlRmlsdGVyQ2FwcyA9IE5VTEw7CiAgICBXQ2Fwcy5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSBOVUxMOwogICAgV0NhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gTlVMTDsKICAgIFdDYXBzLk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IE5VTEw7CiAgICBXQ2Fwcy5NYXhQaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IE5VTEw7CiAgICBXQ2Fwcy5SZXNlcnZlZDIgPSBOVUxMOwogICAgV0NhcHMuUmVzZXJ2ZWQzID0gTlVMTDsKCiAgICAvKiBOb3cgZ2V0IHRoZSBjYXBzICovCiAgICBociA9IElXaW5lRDNEX0dldERldmljZUNhcHMoV2luZUQzRCwgMCwgV0lORUQzRERFVlRZUEVfSEFMLCAmV0NhcHMpOwogICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CgogICAgLyogRmlsbCB0aGUgbWlzc2luZyBtZW1iZXJzLCBhbmQgZG8gc29tZSBmaXh1cCAqLwogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U2l6ZSA9IHNpemVvZihEZXNjNy0+ZHBjTGluZUNhcHMpOwogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwcyA9IEQzRFBUQkxFTkRDQVBTX0FERCB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFTUFTSyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFRCTEVORENBUFNfQ09QWSB8IEQzRFBUQkxFTkRDQVBTX0RFQ0FMIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQVEJMRU5EQ0FQU19ERUNBTEFMUEhBIHwgRDNEUFRCTEVORENBUFNfREVDQUxNQVNLIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURSB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFQUxQSEE7CiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTdGlwcGxlV2lkdGggPSAzMjsKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1N0aXBwbGVIZWlnaHQgPSAzMjsKICAgIC8qIFVzZSB0aGUgc2FtZSBmb3IgdGhlIFRyaUNhcHMgKi8KICAgIERlc2M3LT5kcGNUcmlDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzOwoKICAgIERlc2M3LT5kd0RldmljZVJlbmRlckJpdERlcHRoID0gRERCRF8xNiB8IEREQkRfMjQgfCBEREJEXzMyOwogICAgRGVzYzctPmR3RGV2aWNlWkJ1ZmZlckJpdERlcHRoID0gRERCRF8xNiB8IEREQkRfMjQ7CiAgICBEZXNjNy0+ZHdNaW5UZXh0dXJlV2lkdGggPSAxOwogICAgRGVzYzctPmR3TWluVGV4dHVyZUhlaWdodCA9IDE7CgogICAgLyogQ29udmVydCBEV09SRHMgc2FmZWx5IHRvIFdPUkRzICovCiAgICBpZihNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPiA2NTUzNSkgRGVzYzctPndNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSA2NTUzNTsKICAgIGVsc2UgRGVzYzctPndNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSAoV09SRCkgTWF4VGV4dHVyZUJsZW5kU3RhZ2VzOwogICAgaWYoTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPiA2NTUzNSkgRGVzYzctPndNYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9IDY1NTM1OwogICAgZWxzZSBEZXNjNy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gKFdPUkQpIE1heFNpbXVsdGFuZW91c1RleHR1cmVzOwoKICAgIGlmKE1heFVzZXJDbGlwUGxhbmVzID4gNjU1MzUpIERlc2M3LT53TWF4VXNlckNsaXBQbGFuZXMgPSA2NTUzNTsKICAgIGVsc2UgRGVzYzctPndNYXhVc2VyQ2xpcFBsYW5lcyA9IChXT1JEKSBNYXhVc2VyQ2xpcFBsYW5lczsKICAgIGlmKE1heFZlcnRleEJsZW5kTWF0cmljZXMgPiA2NTUzNSkgRGVzYzctPndNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID0gNjU1MzU7CiAgICBlbHNlIERlc2M3LT53TWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9IChXT1JEKSBNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzOwoKICAgIERlc2M3LT5kZXZpY2VHVUlEID0gSUlEX0lEaXJlY3QzRFRuTEhhbERldmljZTsKCiAgICBEZXNjNy0+ZHdSZXNlcnZlZDEgPSAwOwogICAgRGVzYzctPmR3UmVzZXJ2ZWQyID0gMDsKICAgIERlc2M3LT5kd1Jlc2VydmVkMyA9IDA7CiAgICBEZXNjNy0+ZHdSZXNlcnZlZDQgPSAwOwoKICAgIC8qIEZpbGwgdGhlIG9sZCBzdHJ1Y3R1cmUgKi8KICAgIG1lbXNldChEZXNjMTIzLCAweDAsIHNpemVvZihEM0RERVZJQ0VERVNDKSk7CiAgICBEZXNjMTIzLT5kd1NpemUgPSBzaXplb2YoRDNEREVWSUNFREVTQyk7CiAgICBEZXNjMTIzLT5kd0ZsYWdzID0gRDNERERfQ09MT1JNT0RFTCAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZDQVBTICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX1RSQU5TRk9STUNBUFMgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfQkNMSVBQSU5HICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9MSUdIVElOR0NBUFMgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0xJTkVDQVBTICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfVFJJQ0FQUyAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZJQ0VSRU5ERVJCSVRERVBUSCAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0RFVklDRVpCVUZGRVJCSVRERVBUSCB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfTUFYQlVGRkVSU0laRSAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9NQVhWRVJURVhDT1VOVDsKICAgIERlc2MxMjMtPmRjbUNvbG9yTW9kZWwgPSBEM0RDT0xPUl9SR0I7CiAgICBEZXNjMTIzLT5kd0RldkNhcHMgPSBEZXNjNy0+ZHdEZXZDYXBzOwogICAgRGVzYzEyMy0+ZHRjVHJhbnNmb3JtQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNEVFJBTlNGT1JNQ0FQUyk7CiAgICBEZXNjMTIzLT5kdGNUcmFuc2Zvcm1DYXBzLmR3Q2FwcyA9IEQzRFRSQU5TRk9STUNBUFNfQ0xJUDsKICAgIERlc2MxMjMtPmJDbGlwcGluZyA9IFRSVUU7CiAgICBEZXNjMTIzLT5kbGNMaWdodGluZ0NhcHMuZHdTaXplID0gc2l6ZW9mKEQzRExJR0hUSU5HQ0FQUyk7CiAgICBEZXNjMTIzLT5kbGNMaWdodGluZ0NhcHMuZHdDYXBzID0gRDNETElHSFRDQVBTX0RJUkVDVElPTkFMIHwgRDNETElHSFRDQVBTX1BBUkFMTEVMUE9JTlQgfCBEM0RMSUdIVENBUFNfUE9JTlQgfCBEM0RMSUdIVENBUFNfU1BPVDsKICAgIERlc2MxMjMtPmRsY0xpZ2h0aW5nQ2Fwcy5kd0xpZ2h0aW5nTW9kZWwgPSBEM0RMSUdIVElOR01PREVMX1JHQjsKICAgIERlc2MxMjMtPmRsY0xpZ2h0aW5nQ2Fwcy5kd051bUxpZ2h0cyA9IERlc2M3LT5kd01heEFjdGl2ZUxpZ2h0czsKCiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNEUFJJTUNBUFMpOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdNaXNjQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd01pc2NDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdSYXN0ZXJDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3UmFzdGVyQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3WkNtcENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdaQ21wQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdEZXN0QmxlbmRDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U2hhZGVDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3U2hhZGVDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdTdGlwcGxlV2lkdGggPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTdGlwcGxlV2lkdGg7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd0FscGhhQ21wQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd0FscGhhQ21wQ2FwczsKCiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RQUklNQ0FQUyk7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3TWlzY0NhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd01pc2NDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1Jhc3RlckNhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1Jhc3RlckNhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3WkNtcENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1pDbXBDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1NyY0JsZW5kQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3U3JjQmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd0Rlc3RCbGVuZENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd0Rlc3RCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3U2hhZGVDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdTaGFkZUNhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1N0aXBwbGVXaWR0aCA9IERlc2M3LT5kcGNUcmlDYXBzLmR3U3RpcHBsZVdpZHRoOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd0FscGhhQ21wQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3QWxwaGFDbXBDYXBzOwoKICAgIERlc2MxMjMtPmR3RGV2aWNlUmVuZGVyQml0RGVwdGggPSBEZXNjNy0+ZHdEZXZpY2VSZW5kZXJCaXREZXB0aDsKICAgIERlc2MxMjMtPmR3RGV2aWNlWkJ1ZmZlckJpdERlcHRoID0gRGVzYzctPmR3RGV2aWNlWkJ1ZmZlckJpdERlcHRoOwogICAgRGVzYzEyMy0+ZHdNYXhCdWZmZXJTaXplID0gMDsKICAgIERlc2MxMjMtPmR3TWF4VmVydGV4Q291bnQgPSA2NTUzNjsKICAgIERlc2MxMjMtPmR3TWluVGV4dHVyZVdpZHRoICA9IERlc2M3LT5kd01pblRleHR1cmVXaWR0aDsKICAgIERlc2MxMjMtPmR3TWluVGV4dHVyZUhlaWdodCA9IERlc2M3LT5kd01pblRleHR1cmVIZWlnaHQ7CiAgICBEZXNjMTIzLT5kd01heFRleHR1cmVXaWR0aCAgPSBEZXNjNy0+ZHdNYXhUZXh0dXJlV2lkdGg7CiAgICBEZXNjMTIzLT5kd01heFRleHR1cmVIZWlnaHQgPSBEZXNjNy0+ZHdNYXhUZXh0dXJlSGVpZ2h0OwogICAgRGVzYzEyMy0+ZHdNaW5TdGlwcGxlV2lkdGggID0gMTsKICAgIERlc2MxMjMtPmR3TWluU3RpcHBsZUhlaWdodCA9IDE7CiAgICBEZXNjMTIzLT5kd01heFN0aXBwbGVXaWR0aCAgPSAzMjsKICAgIERlc2MxMjMtPmR3TWF4U3RpcHBsZUhlaWdodCA9IDMyOwogICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlUmVwZWF0ID0gRGVzYzctPmR3TWF4VGV4dHVyZVJlcGVhdDsKICAgIERlc2MxMjMtPmR3TWF4VGV4dHVyZUFzcGVjdFJhdGlvID0gRGVzYzctPmR3TWF4VGV4dHVyZUFzcGVjdFJhdGlvOwogICAgRGVzYzEyMy0+ZHdNYXhBbmlzb3Ryb3B5ID0gRGVzYzctPmR3TWF4QW5pc290cm9weTsKICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kTGVmdCA9IERlc2M3LT5kdkd1YXJkQmFuZExlZnQ7CiAgICBEZXNjMTIzLT5kdkd1YXJkQmFuZFJpZ2h0ID0gRGVzYzctPmR2R3VhcmRCYW5kUmlnaHQ7CiAgICBEZXNjMTIzLT5kdkd1YXJkQmFuZFRvcCA9IERlc2M3LT5kdkd1YXJkQmFuZFRvcDsKICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kQm90dG9tID0gRGVzYzctPmR2R3VhcmRCYW5kQm90dG9tOwogICAgRGVzYzEyMy0+ZHZFeHRlbnRzQWRqdXN0ID0gRGVzYzctPmR2RXh0ZW50c0FkanVzdDsKICAgIERlc2MxMjMtPmR3U3RlbmNpbENhcHMgPSBEZXNjNy0+ZHdTdGVuY2lsQ2FwczsKICAgIERlc2MxMjMtPmR3RlZGQ2FwcyA9IERlc2M3LT5kd0ZWRkNhcHM7CiAgICBEZXNjMTIzLT5kd1RleHR1cmVPcENhcHMgPSBEZXNjNy0+ZHdUZXh0dXJlT3BDYXBzOwogICAgRGVzYzEyMy0+d01heFRleHR1cmVCbGVuZFN0YWdlcyA9IERlc2M3LT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzOwogICAgRGVzYzEyMy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gRGVzYzctPndNYXhTaW11bHRhbmVvdXNUZXh0dXJlczsKCiAgICByZXR1cm4gRERfT0s7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCB2dGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKY29uc3QgSURpcmVjdDNEVnRibCBJRGlyZWN0M0QxX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RJbXBsXzFfSW5pdGlhbGl6ZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9FbnVtRGV2aWNlcywKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVMaWdodCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVWaWV3cG9ydCwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9GaW5kRGV2aWNlCn07Cgpjb25zdCBJRGlyZWN0M0QyVnRibCBJRGlyZWN0M0QyX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0QyIG1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0VudW1EZXZpY2VzLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZUxpZ2h0LAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZU1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZVZpZXdwb3J0LAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlRGV2aWNlCn07Cgpjb25zdCBJRGlyZWN0M0QzVnRibCBJRGlyZWN0M0QzX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0QzIG1ldGhvZHMgKioqLwogICAgSURpcmVjdDNESW1wbF8zX0VudW1EZXZpY2VzLAogICAgSURpcmVjdDNESW1wbF8zX0NyZWF0ZUxpZ2h0LAogICAgSURpcmVjdDNESW1wbF8zX0NyZWF0ZU1hdGVyaWFsLAogICAgSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZpZXdwb3J0LAogICAgSURpcmVjdDNESW1wbF8zX0ZpbmREZXZpY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlRGV2aWNlLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZlcnRleEJ1ZmZlciwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19FbnVtWkJ1ZmZlckZvcm1hdHMsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfRXZpY3RNYW5hZ2VkVGV4dHVyZXMKfTsKCmNvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzdfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzdfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF83X1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRDcgbWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMsCiAgICBJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlRGV2aWNlLAogICAgSURpcmVjdDNESW1wbF83X0NyZWF0ZVZlcnRleEJ1ZmZlciwKICAgIElEaXJlY3QzREltcGxfN19FbnVtWkJ1ZmZlckZvcm1hdHMsCiAgICBJRGlyZWN0M0RJbXBsXzdfRXZpY3RNYW5hZ2VkVGV4dHVyZXMKfTsK