LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGZ0c3lzdGVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQW1pZ2Etc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENvcHlyaWdodCAoQykgMTk5Ni0yMDIyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4gICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBbWlnYSBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgICAgICovCiAgLyogbG93LWxldmVsLCBpLmUuIG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzIGFzIHdlbGwgYXMgdGhyZWFkICAgICAgICovCiAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBNYWludGFpbmVkIGJ5IERldGxlZiBX/HJrbmVyIDxUZXRpU29mdEBhcGcubGFobi5kZT4gICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZnRzeXN0ZW0uYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBtb2RpZmllZCB0byBhdm9pZCBmb3BlbigpLCBmY2xvc2UoKSwgZnJlYWQoKSwgZnNlZWsoKSwgZnRlbGwoKSwgICAgICAgKi8KICAvKiBtYWxsb2MoKSwgcmVhbGxvYygpLCBhbmQgZnJlZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBUaG9zZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBvZnRlbiBub3QgdGhyZWFkLXNhZmUgb3IgY2FudCBiZSAgICAgICAgKi8KICAvKiB1c2VkIGluIGEgc2hhcmVkIEFtaWdhIGxpYnJhcnkuIElmIHRoYXQncyBub3QgYSBwcm9ibGVtIGZvciB5b3UsICAgICAgICovCiAgLyogeW91IGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBkZWZhdWx0IGZ0c3lzdGVtLmMgd2l0aCBDIGxpYnJhcnkgY2FsbHMgICAgICovCiAgLyogaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBleGVjIFYzOSsgYmVjYXVzZSBpdCB1c2VzIEFsbG9jUG9vbGVkKCkgZXRjICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIF9fTk9MSUJCQVNFX18KI2RlZmluZSBfX05PR0xPQkFMSUZBQ0VfXwojZGVmaW5lIF9fVVNFX0lOTElORV9fCiNpbmNsdWRlIDxwcm90by9leGVjLmg+CiNpbmNsdWRlIDxkb3Mvc3RkaW8uaD4KI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgojaWZkZWYgX19hbWlnYW9zNF9fCmV4dGVybiBzdHJ1Y3QgRXhlY0lGYWNlICpJRXhlYzsKZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAgKklET1M7CiNlbHNlCmV4dGVybiBzdHJ1Y3QgTGlicmFyeSAgICpTeXNCYXNlOwpleHRlcm4gc3RydWN0IExpYnJhcnkgICAqRE9TQmFzZTsKI2VuZGlmCgojZGVmaW5lIElPQlVGX1NJWkUgNTEyCgovKiBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB1cyB0byBhdm9pZAogKiB1c2VsZXNzIGNhbGxzIG9mIFNlZWsoKSBhbmQgUmVhZCgpCiAqLwpzdHJ1Y3QgU3lzRmlsZQp7CiAgQlBUUiAgZmlsZTsKICBVTE9ORyBpb2J1Zl9zdGFydDsKICBVTE9ORyBpb2J1Zl9lbmQ7CiAgVUJZVEUgaW9idWZbSU9CVUZfU0laRV07Cn07CgojaWZuZGVmIF9fYW1pZ2FvczRfXwovKiBDIGltcGxlbWVudGF0aW9uIG9mIEFsbG9jVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwpBUFRSCkFsbG9jX1ZlY1Bvb2xlZCggQVBUUiAgIHBvb2xIZWFkZXIsCiAgICAgICAgICAgICAgICAgVUxPTkcgIG1lbVNpemUgKQp7CiAgVUxPTkcgIG5ld1NpemUgPSBtZW1TaXplICsgc2l6ZW9mICggVUxPTkcgKTsKICBVTE9ORyAgKm1lbSA9IEFsbG9jUG9vbGVkKCBwb29sSGVhZGVyLCBuZXdTaXplICk7CgogIGlmICggIW1lbSApCiAgICByZXR1cm4gTlVMTDsKICAqbWVtID0gbmV3U2l6ZTsKICByZXR1cm4gbWVtICsgMTsKfQoKLyogQyBpbXBsZW1lbnRhdGlvbiBvZiBGcmVlVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwp2b2lkCkZyZWVfVmVjUG9vbGVkKCBBUFRSICBwb29sSGVhZGVyLAogICAgICAgICAgICAgICAgQVBUUiAgbWVtb3J5ICkKewogIFVMT05HICAqcmVhbG1lbSA9IChVTE9ORyAqKW1lbW9yeSAtIDE7CgogIEZyZWVQb29sZWQoIHBvb2xIZWFkZXIsIHJlYWxtZW0sICpyZWFsbWVtICk7Cn0KI2VuZGlmCgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICiNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiNpbmNsdWRlIDxmcmVldHlwZS9mdHN5c3RlbS5oPgojaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRvIGFueSBlcnJvciBjaGVja2luZyBmb3IgdGhlICAgICAgICAgICAgICAgICAgKi8KICAvKiBhbGxvY2F0aW9uLXJlbGF0ZWQgZnVuY3Rpb25zLiAgVGhpcyBpcyBkb25lIGJ5IHRoZSBoaWdoZXIgbGV2ZWwgICAgICAgKi8KICAvKiByb3V0aW5lcyBsaWtlIGZ0X21lbV9hbGxvYygpIG9yIGZ0X21lbV9yZWFsbG9jKCkuICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGZ0X2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIG1lbW9yeSA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIHNpemUgICA6OiBUaGUgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBhZGRyZXNzIG9mIG5ld2x5IGFsbG9jYXRlZCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQogIGZ0X2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICkKICB7CiNpZmRlZiBfX2FtaWdhb3M0X18KICAgIHJldHVybiBBbGxvY1ZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBzaXplICk7CiNlbHNlCiAgICByZXR1cm4gQWxsb2NfVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIHNpemUgKTsKI2VuZGlmCiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgY3VyX3NpemUgOjogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgbmV3X3NpemUgOjogVGhlIG5ld2x5IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCiAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCiAgICAgICAgICAgICAgbG9uZyAgICAgICBjdXJfc2l6ZSwKICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAogICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQogIHsKICAgIHZvaWQqIG5ld19ibG9jazsKCiNpZmRlZiBfX2FtaWdhb3M0X18KICAgIG5ld19ibG9jayA9IEFsbG9jVmVjUG9vbGVkICggbWVtb3J5LT51c2VyLCBuZXdfc2l6ZSApOwojZWxzZQogICAgbmV3X2Jsb2NrID0gQWxsb2NfVmVjUG9vbGVkICggbWVtb3J5LT51c2VyLCBuZXdfc2l6ZSApOwojZW5kaWYKICAgIGlmICggbmV3X2Jsb2NrICE9IE5VTEwgKQogICAgewogICAgICBDb3B5TWVtICggYmxvY2ssIG5ld19ibG9jaywKICAgICAgICAgICAgICAgICggbmV3X3NpemUgPiBjdXJfc2l6ZSApID8gY3VyX3NpemUgOiBuZXdfc2l6ZSApOwojaWZkZWYgX19hbWlnYW9zNF9fCiAgICAgIEZyZWVWZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIGJsb2NrICk7CiNlbHNlCiAgICAgIEZyZWVfVmVjUG9vbGVkICggbWVtb3J5LT51c2VyLCBibG9jayApOwojZW5kaWYKICAgIH0KICAgIHJldHVybiBuZXdfYmxvY2s7CiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIG1lbW9yeSByZWxlYXNlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgbWVtb3J5ICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgYmxvY2sgICA6OiBUaGUgYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKICBmdF9mcmVlKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKICB7CiNpZmRlZiBfX2FtaWdhb3M0X18KICAgIEZyZWVWZWNQb29sZWQoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKI2Vsc2UKICAgIEZyZWVfVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIGJsb2NrICk7CiNlbmRpZgogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgUkVTT1VSQ0UgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCiAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCiAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiN1bmRlZiAgRlRfQ09NUE9ORU5UCiNkZWZpbmUgRlRfQ09NUE9ORU5UICBpbwoKICAvKiBXZSB1c2UgdGhlIG1hY3JvIFNUUkVBTV9GSUxFIGZvciBjb252ZW5pZW5jZSB0byBleHRyYWN0IHRoZSAgICAgICAqLwogIC8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCiNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChzdHJ1Y3QgU3lzRmlsZSAqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyICkKCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCiAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCiAgewogICAgc3RydWN0IFN5c0ZpbGUqIHN5c2ZpbGU7CgogICAgc3lzZmlsZSA9IFNUUkVBTV9GSUxFKCBzdHJlYW0gKTsKICAgIENsb3NlICggc3lzZmlsZS0+ZmlsZSApOwogICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwoKICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgID0gTlVMTDsKICB9CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmdF9hbWlnYV9zdHJlYW1faW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBvZmZzZXQgOjogVGhlIHBvc2l0aW9uIGluIHRoZSBkYXRhIHN0cmVhbSB0byBzdGFydCByZWFkaW5nLiAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEuICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBjb3VudCAgOjogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4gICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBGVF9DQUxMQkFDS19ERUYoIHVuc2lnbmVkIGxvbmcgKQogIGZ0X2FtaWdhX3N0cmVhbV9pbyggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICkKICB7CiAgICBzdHJ1Y3QgU3lzRmlsZSogc3lzZmlsZTsKICAgIHVuc2lnbmVkIGxvbmcgICByZWFkX2J5dGVzOwoKICAgIGlmICggY291bnQgIT0gMCApCiAgICB7CiAgICAgIHN5c2ZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7CgogICAgICAvKiBoYW5kbGUgdGhlIHNlZWsgKi8KICAgICAgaWYgKCAob2Zmc2V0IDwgc3lzZmlsZS0+aW9idWZfc3RhcnQpIHx8IChvZmZzZXQgKyBjb3VudCA+IHN5c2ZpbGUtPmlvYnVmX2VuZCkgKQogICAgICB7CiAgICAgICAgLyogcmVxdWVzdGVkIG9mZnNldCBpbXBsaWVzIHdlIG5lZWQgYSBidWZmZXIgcmVmaWxsICovCiAgICAgICAgaWYgKCAhc3lzZmlsZS0+aW9idWZfZW5kIHx8IG9mZnNldCAhPSBzeXNmaWxlLT5pb2J1Zl9lbmQgKQogICAgICAgIHsKICAgICAgICAgIC8qIGEgcGh5c2ljYWwgc2VlayBpcyBuZWNlc3NhcnkgKi8KICAgICAgICAgIFNlZWsoIHN5c2ZpbGUtPmZpbGUsIG9mZnNldCwgT0ZGU0VUX0JFR0lOTklORyApOwogICAgICAgIH0KICAgICAgICBzeXNmaWxlLT5pb2J1Zl9zdGFydCA9IG9mZnNldDsKICAgICAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgPSAwOyAvKiB0cmlnZ2VyIGEgYnVmZmVyIHJlZmlsbCAqLwogICAgICB9CgogICAgICAvKiBoYW5kbGUgdGhlIHJlYWQgKi8KICAgICAgaWYgKCBvZmZzZXQgKyBjb3VudCA8PSBzeXNmaWxlLT5pb2J1Zl9lbmQgKQogICAgICB7CiAgICAgICAgLyogd2UgaGF2ZSBidWZmZXIgYW5kIHJlcXVlc3RlZCBieXRlcyBhcmUgYWxsIGluc2lkZSBvdXIgYnVmZmVyICovCiAgICAgICAgQ29weU1lbSggJnN5c2ZpbGUtPmlvYnVmW29mZnNldCAtIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0XSwgYnVmZmVyLCBjb3VudCApOwogICAgICAgIHJlYWRfYnl0ZXMgPSBjb3VudDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKiAocmUpZmlsbCBidWZmZXIgKi8KICAgICAgICBpZiAoIGNvdW50IDw9IElPQlVGX1NJWkUgKQogICAgICAgIHsKICAgICAgICAgIC8qIHJlcXVlc3RlZCBieXRlcyBpcyBhIHN1YnNldCBvZiB0aGUgYnVmZmVyICovCiAgICAgICAgICByZWFkX2J5dGVzID0gUmVhZCggc3lzZmlsZS0+ZmlsZSwgc3lzZmlsZS0+aW9idWYsIElPQlVGX1NJWkUgKTsKICAgICAgICAgIGlmICggcmVhZF9ieXRlcyA9PSAtMVVMICkKICAgICAgICAgIHsKICAgICAgICAgICAgLyogZXJyb3IgKi8KICAgICAgICAgICAgcmVhZF9ieXRlcyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7CiAgICAgICAgICAgIENvcHlNZW0oIHN5c2ZpbGUtPmlvYnVmLCBidWZmZXIsIGNvdW50ICk7CiAgICAgICAgICAgIGlmICggcmVhZF9ieXRlcyA+IGNvdW50ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHJlYWRfYnl0ZXMgPSBjb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogd2UgYWN0dWFsbHkgbmVlZCBtb3JlIHRoYW4gb3VyIGJ1ZmZlciBjYW4gaG9sZCwgc28gd2UgZGVjaWRlCiAgICAgICAgICAqKiB0byBkbyBhIHNpbmdsZSBiaWcgcmVhZCwgYW5kIHRoZW4gY29weSB0aGUgbGFzdCBJT0JVRl9TSVpFCiAgICAgICAgICAqKiBieXRlcyBvZiB0aGF0IHRvIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLwogICAgICAgICAgcmVhZF9ieXRlcyA9IFJlYWQoIHN5c2ZpbGUtPmZpbGUsIGJ1ZmZlciwgY291bnQgKTsKICAgICAgICAgIGlmICggcmVhZF9ieXRlcyA9PSAtMVVMICkKICAgICAgICAgIHsKICAgICAgICAgICAgLyogZXJyb3IgKi8KICAgICAgICAgICAgcmVhZF9ieXRlcyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIFVMT05HIGJ1ZnNpemU7CgogICAgICAgICAgICBidWZzaXplID0gKCByZWFkX2J5dGVzID4gSU9CVUZfU0laRSApID8gSU9CVUZfU0laRSA6IHJlYWRfYnl0ZXM7CiAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7CiAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ID0gc3lzZmlsZS0+aW9idWZfZW5kIC0gYnVmc2l6ZTsKICAgICAgICAgICAgQ29weU1lbSggJmJ1ZmZlcltyZWFkX2J5dGVzIC0gYnVmc2l6ZV0gLCBzeXNmaWxlLT5pb2J1ZiwgYnVmc2l6ZSApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICByZWFkX2J5dGVzID0gMDsKICAgIH0KCiAgICByZXR1cm4gcmVhZF9ieXRlczsKICB9CgoKICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCgogIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCiAgRlRfU3RyZWFtX09wZW4oIEZUX1N0cmVhbSAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKQogIHsKICAgIHN0cnVjdCBGaWxlSW5mb0Jsb2NrKiAgZmliOwogICAgc3RydWN0IFN5c0ZpbGUqICAgICAgICBzeXNmaWxlOwoKCiAgICBpZiAoICFzdHJlYW0gKQogICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX0hhbmRsZSApOwoKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1NIQVJFRCApOwojZWxzZQogICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1BVQkxJQyApOwojZW5kaWYKICAgIGlmICggIXN5c2ZpbGUgKQogICAgewogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwoKICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwogICAgfQogICAgc3lzZmlsZS0+ZmlsZSA9IE9wZW4oIChTVFJQVFIpZmlsZXBhdGhuYW1lLCBNT0RFX09MREZJTEUgKTsKICAgIGlmICggIXN5c2ZpbGUtPmZpbGUgKQogICAgewogICAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7CiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CgogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7CiAgICB9CgogICAgZmliID0gQWxsb2NEb3NPYmplY3QoIERPU19GSUIsIE5VTEwgKTsKICAgIGlmICggIWZpYiApCiAgICB7CiAgICAgIENsb3NlICggc3lzZmlsZS0+ZmlsZSApOwogICAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7CiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CgogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7CiAgICB9CiAgICBpZiAoICEoIEV4YW1pbmVGSCggc3lzZmlsZS0+ZmlsZSwgZmliICkgKSApCiAgICB7CiAgICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOwogICAgICBDbG9zZSAoIHN5c2ZpbGUtPmZpbGUgKTsKICAgICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOwogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwoKICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwogICAgfQogICAgc3RyZWFtLT5zaXplID0gZmliLT5maWJfU2l6ZTsKICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOwoKICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gKHZvaWQgKilzeXNmaWxlOwogICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOwogICAgc3lzZmlsZS0+aW9idWZfc3RhcnQgICAgICAgPSAwOwogICAgc3lzZmlsZS0+aW9idWZfZW5kICAgICAgICAgPSAwOwogICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOwoKICAgIHN0cmVhbS0+cmVhZCAgPSBmdF9hbWlnYV9zdHJlYW1faW87CiAgICBzdHJlYW0tPmNsb3NlID0gZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlOwoKICAgIGlmICggIXN0cmVhbS0+c2l6ZSApCiAgICB7CiAgICAgIGZ0X2FtaWdhX3N0cmVhbV9jbG9zZSggc3RyZWFtICk7CiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICAgIEZUX0VSUk9SKCggIiBvcGVuZWQgYCVzJyBidXQgemVyby1zaXplZFxuIiwgZmlsZXBhdGhuYW1lICkpOwogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1N0cmVhbSApOwogICAgfQoKICAgIEZUX1RSQUNFMSgoICJGVF9TdHJlYW1fT3BlbjoiICkpOwogICAgRlRfVFJBQ0UxKCggIiBvcGVuZWQgYCVzJyAoJWxkIGJ5dGVzKSBzdWNjZXNzZnVsbHlcbiIsCiAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKCiAgICByZXR1cm4gRlRfRXJyX09rOwogIH0KCgojaWZkZWYgRlRfREVCVUdfTUVNT1JZCgogIGV4dGVybiBGVF9JbnQKICBmdF9tZW1fZGVidWdfaW5pdCggRlRfTWVtb3J5ICBtZW1vcnkgKTsKCiAgZXh0ZXJuIHZvaWQKICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKTsKCiNlbmRpZgoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwoKICBGVF9CQVNFX0RFRiggRlRfTWVtb3J5ICkKICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKICB7CiAgICBGVF9NZW1vcnkgIG1lbW9yeTsKCgojaWZkZWYgX19hbWlnYW9zNF9fCiAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KUFsbG9jVmVjKCBzaXplb2YgKCAqbWVtb3J5ICksIE1FTUZfU0hBUkVEICk7CiNlbHNlCiAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KUFsbG9jVmVjKCBzaXplb2YgKCAqbWVtb3J5ICksIE1FTUZfUFVCTElDICk7CiNlbmRpZgogICAgaWYgKCBtZW1vcnkgKQogICAgewojaWZkZWYgX19hbWlnYW9zNF9fCiAgICAgIG1lbW9yeS0+dXNlciA9IENyZWF0ZVBvb2woIE1FTUZfU0hBUkVELCAxNjM4NCwgMTYzODQgKTsKI2Vsc2UKICAgICAgbWVtb3J5LT51c2VyID0gQ3JlYXRlUG9vbCggTUVNRl9QVUJMSUMsIDE2Mzg0LCAxNjM4NCApOwojZW5kaWYKICAgICAgaWYgKCBtZW1vcnktPnVzZXIgPT0gTlVMTCApCiAgICAgIHsKICAgICAgICBGcmVlVmVjKCBtZW1vcnkgKTsKICAgICAgICBtZW1vcnkgPSBOVUxMOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X2FsbG9jOwogICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7CiAgICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKI2lmZGVmIEZUX0RFQlVHX01FTU9SWQogICAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsKI2VuZGlmCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWVtb3J5OwogIH0KCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KCiAgRlRfQkFTRV9ERUYoIHZvaWQgKQogIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApCiAgewojaWZkZWYgRlRfREVCVUdfTUVNT1JZCiAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7CiNlbmRpZgoKICAgIERlbGV0ZVBvb2woIG1lbW9yeS0+dXNlciApOwogICAgRnJlZVZlYyggbWVtb3J5ICk7CiAgfQoKLyoKTG9jYWwgVmFyaWFibGVzOgpjb2Rpbmc6IGxhdGluLTEKRW5kOgoqLwovKiBFTkQgKi8K