LyogRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDAgKGMpIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgMjAwMCAoYykgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KICogQ29weXJpZ2h0IDIwMDYgKGMpIFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIG1ldGhvZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6UXVlcnlJbnRlcmZhY2UKICoKICogQ2FuIHF1ZXJ5IHRoZSBJVW5rbm93biBhbmQgSURpcmVjdERyYXdDbGlwcGVyIGludGVyZmFjZSBmcm9tIGEKICogQ2xpcHBlciBvYmplY3QuIFRoZSBJVW5rbm93biBJbnRlcmZhY2UgaXMgZXF1YWwgdG8gdGhlIElEaXJlY3REcmF3Q2xpcHBlcgogKiBpbnRlcmZhY2UuIENhbid0IGNyZWF0ZSBvdGhlciBpbnRlcmZhY2VzLgogKgogKiBBcmd1bWVudHM6CiAqICByaWlkOiBJbnRlcmZhY2UgaWQgYXNrZWQgZm9yCiAqICBwcHZPYmo6IFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAgRERfT0sgb24gc3VjY2VzcwogKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgcmVxdWVzdGVkIGludGVyZmFjZSB3YXNuJ3QgZm91bmQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUXVlcnlJbnRlcmZhY2UoCiAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmoKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKCiAgICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93biwgcmlpZCkKCXx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdDbGlwcGVyLCByaWlkKSkKICAgIHsKCSpwcHZPYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd0NsaXBwZXIpOwoJSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UKICAgIHsKCXJldHVybiBFX05PSU5URVJGQUNFOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpBZGRSZWYKICoKICogSW5jcmVhc2VzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGludGVyZmFjZSwgcmV0dXJucyB0aGUgbmV3IGNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0FkZFJlZiggTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSApCnsKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmIC0gMSk7CgogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6UmVsZWFzZQogKgogKiBEZWNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaW50ZXJmYWNlLCByZXR1cm5zIHRoZSBuZXcgY291bnQKICogSWYgdGhlIHJlZmNvdW50IGlzIGRlY3JlYXNlZCB0byAwLCB0aGUgaW50ZXJmYWNlIGlzIGRlc3Ryb3llZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUmVsZWFzZShJRGlyZWN0RHJhd0NsaXBwZXIgKmlmYWNlKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiArIDEpOwoKICAgIGlmIChyZWYgPT0gMCkKICAgIHsKICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIElXaW5lRDNEQ2xpcHBlcl9SZWxlYXNlKFRoaXMtPndpbmVEM0RDbGlwcGVyKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgZWxzZSByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpTZXRId25kCiAqCiAqIEFzc2lnbnMgYSBoV25kIHRvIHRoZSBjbGlwcGVyIGludGVyZmFjZS4KICoKICogQXJndW1lbnRzOgogKiAgRmxhZ3M6IFVuc3VwcG9ydGVkIHNvIGZhcgogKiAgaFduZDogVGhlIGhXbmQgdG8gc2V0CiAqCiAqIFJldHVybiB2YWx1ZXM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEZsYWdzIHdhcyAhPSAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldEh3bmQoCiAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBEV09SRCBkd0ZsYWdzLCBIV05EIGhXbmQKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApXG4iLCBUaGlzLCBkd0ZsYWdzLCBoV25kKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaHIgPSBJV2luZUQzRENsaXBwZXJfU2V0SFduZChUaGlzLT53aW5lRDNEQ2xpcHBlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgc3dpdGNoKGhyKQogICAgewogICAgICAgIGNhc2UgV0lORUQzREVSUl9JTlZBTElEQ0FMTDogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBocjsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6R2V0Q2xpcExpc3QKICoKICogUmV0cmlldmUgYSBjb3B5IG9mIHRoZSBjbGlwIGxpc3QKICoKICogQXJndW1lbnRzOgogKiAgUmVjdDogUmVjdGFuZ2xlIHRvIGJlIHVzZWQgdG8gY2xpcCB0aGUgY2xpcCBsaXN0IG9yIE5VTEwgZm9yIHRoZQogKiAgICAgICAgZW50aXJlIGNsaXAgbGlzdAogKiAgQ2xpcExpc3Q6IHN0cnVjdHVyZSBmb3IgdGhlIHJlc3VsdGluZyBjb3B5IG9mIHRoZSBjbGlwIGxpc3QuCiAqICAgICAgICAgICAgSWYgTlVMTCwgZmlsbHMgU2l6ZSB1cCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBob2xkCiAqICAgICAgICAgICAgdGhlIGVudGlyZSBjbGlwLgogKiAgU2l6ZTogU2l6ZSBvZiByZXN1bHRpbmcgY2xpcCBsaXN0OyBzaXplIG9mIHRoZSBidWZmZXIgYXQgQ2xpcExpc3QKICogICAgICAgIG9yLCBpZiBDbGlwTGlzdCBpcyBOVUxMLCByZWNlaXZlcyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyCiAqICAgICAgICBpbiBieXRlcwogKgogKiBSRVRVUk5TCiAqICBFaXRoZXIgRERfT0sgb3IgRERFUlJfKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRDbGlwTGlzdCgKICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIExQUkVDVCBscFJlY3QsIExQUkdOREFUQSBscENsaXBMaXN0LAogICAgTFBEV09SRCBscGR3U2l6ZSkKewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIFRoaXMsIGxwUmVjdCwgbHBDbGlwTGlzdCwgbHBkd1NpemUpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBociA9IElXaW5lRDNEQ2xpcHBlcl9HZXRDbGlwTGlzdChUaGlzLT53aW5lRDNEQ2xpcHBlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xpcExpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3U2l6ZSk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdDbGlwcGVyOjpTZXRDbGlwTGlzdAogKgogKiBTZXRzIG9yIGRlbGV0ZXMgKGlmIGxwcmduIGlzIE5VTEwpIHRoZSBjbGlwIGxpc3QKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIHN0dWIgYW5kIHJldHVybnMgRERfT0sgYWx3YXlzIHRvIG1ha2UgdGhlIGFwcAogKiBoYXBweS4KICoKICogUEFSQU1TCiAqICBscHJnbiAgIFBvaW50ZXIgdG8gYSBMUkdOREFUQSBzdHJ1Y3R1cmUgb3IgTlVMTAogKiAgZHdGbGFncyBub3QgdXNlZCwgbXVzdCBiZSAwCiAqIFJFVFVSTlMKICogIEVpdGhlciBERF9PSyBvciBEREVSUl8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0Q2xpcExpc3QoCiAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLExQUkdOREFUQSBscHJnbixEV09SRCBkd0ZsYWcKKSB7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKICAgIEhSRVNVTFQgaHI7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGhyID0gSVdpbmVEM0RDbGlwcGVyX1NldENsaXBMaXN0KFRoaXMtPndpbmVEM0RDbGlwcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6R2V0SHduZAogKgogKiBSZXR1cm5zIHRoZSBod25kIGFzc2lnbmVkIHdpdGggU2V0SHduZAogKgogKiBBcmd1bWVudHM6CiAqICBoV25kUHRyOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBIV05EIGF0CiAqCiAqIFJldHVybiB2YWx1ZXM6CiAqICBBbHdheXMgcmV0dXJucyBERF9PSzsKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRIV25kKAogICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgSFdORCogaFduZFB0cgopIHsKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBoV25kUHRyKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaHIgPSAgSVdpbmVEM0RDbGlwcGVyX0dldEhXbmQoVGhpcy0+d2luZUQzRENsaXBwZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kUHRyKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXI6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIGludGVyZmFjZS4gV2VsbCwgdGhlcmUgaXNuJ3QgbXVjaCB0byBkbyBmb3IgdGhpcwogKiBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IHN0b3JlcyB0aGUgRGlyZWN0RHJhdyBJbnRlcmZhY2UuCiAqCiAqIEFyZ3VtZW50czoKICogIEREOiBQb2ludGVyIHRvIGEgSURpcmVjdERyYXcgaW50ZXJmYWNlCiAqICBGbGFnczogVW5zdXBwb3J0ZWQgYnkgbm93CiAqCiAqIFJldHVybiB2YWx1ZXM6CiAqICBERF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9BTFJFQURZSU5JVElBTElaRUQgaWYgdGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW5pdGlhbGl6ZWQgYWxyZWFkeQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0luaXRpYWxpemUoCiAgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgTFBESVJFQ1REUkFXIGxwREQsIERXT1JEIGR3RmxhZ3MKKSB7CiAgICBJRGlyZWN0RHJhd0ltcGwqIHBPd25lcjsKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwogICAgVFJBQ0UoIiglcCktPiglcCwweCUwOHgpXG4iLCBUaGlzLCBscERELCBkd0ZsYWdzKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYgKFRoaXMtPmRkcmF3X293bmVyICE9IE5VTEwpCiAgICB7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwogICAgfQoKICAgIHBPd25lciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXcsIGxwREQpOwogICAgVGhpcy0+ZGRyYXdfb3duZXIgPSBwT3duZXI7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlcjo6SXNDbGlwTGlzdENoYW5nZWQKICoKICogVGhpcyBmdW5jdGlvbiBpcyBhIHN0dWIKICoKICogQXJndW1lbnRzOgogKiAgQ2hhbmdlZDoKICoKICogUmV0dXJuIHZhbHVlczoKICogIEREX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfSXNDbGlwTGlzdENoYW5nZWQoCiAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBCT09MKiBscGJDaGFuZ2VkCikgewogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CiAgICBGSVhNRSgiKCVwKS0+KCVwKSxzdHViIVxuIixUaGlzLGxwYkNoYW5nZWQpOwoKICAgIC8qIFhYWCBXaGF0IGlzIHNhZmVzdD8gKi8KICAgICpscGJDaGFuZ2VkID0gRkFMU0U7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhlIFZUYWJsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmNvbnN0IElEaXJlY3REcmF3Q2xpcHBlclZ0YmwgSURpcmVjdERyYXdDbGlwcGVyX1Z0YmwgPQp7CiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1JlbGVhc2UsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0dldENsaXBMaXN0LAogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRIV25kLAogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jbml0aWFsaXplLAogICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jc0NsaXBMaXN0Q2hhbmdlZCwKICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0Q2xpcExpc3QsCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldEh3bmQKfTsK