LyoKICogSHVuZ2FyaWFuIHJlc291cmNlcyBmb3IgTVNJCiAqCiAqIENvcHlyaWdodCAyMDA2IEFuZHJhcyBLb3ZhY3MKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmRlZi5oIgoKTEFOR1VBR0UgTEFOR19IVU5HQVJJQU4sIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewoJNCAiVGhlIHNwZWNpZmllZCBpbnN0YWxsYXRpb24gcGFja2FnZSBjb3VsZCBub3QgYmUgb3BlbmVkLiAgUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGggYW5kIHRyeSBhZ2Fpbi4iCgk1ICIlcyD6dHZvbmFsIG5lbSB0YWzhbGhhdPMiCgk5ICJoZWx5ZXp6ZSBiZSBhIGxlbWV6dDogJXMiCgkxMCAiV2luZG93cyBJbnN0YWxsZXIgJXNcblxuIiBcCgkiVXNhZ2U6XG4iIFwKCSJtc2lleGVjIGNvbW1hbmQge3JlcXVpcmVkIHBhcmFtZXRlcn0gW29wdGlvbmFsIHBhcmFtbWV0ZXJdXG5cbiIgXAoJIkluc3RhbGwgYSBwcm9kdWN0OlxuIiBcCgkiXHQvaSB7cGFja2FnZXxwcm9kdWN0Y29kZX0gW3Byb3BlcnR5XVxuIiBcCgkiXHQvcGFja2FnZSB7cGFja2FnZXxwcm9kdWN0Y29kZX0gW3Byb3BlcnR5XVxuIiBcCgkiXHQvYSBwYWNrYWdlIFtwcm9wZXJ0eV1cbiIgXAoJIlJlcGFpciBhbiBpbnN0YWxsYXRpb246XG4iIFwKCSJcdC9mW3B8b3xlfGR8Y3xhfHV8bXxzfHZdIHtwYWNrYWdlfHByb2R1Y3Rjb2RlfVxuIiBcCgkiVW5pbnN0YWxsIGEgcHJvZHVjdDpcbiIgXAoJIlx0L3VuaW5zdGFsbCB7cGFja2FnZXxwcm9kdWN0Y29kZX0gW3Byb3BlcnR5XVxuIiBcCgkiXHQveCB7cGFja2FnZXxwcm9kdWN0Y29kZX0gW3Byb3BlcnR5XVxuIiBcCgkiQWR2ZXJ0aXNlIGEgcHJvZHVjdDpcbiIgXAoJIlx0L2pbdXxtXSBwYWNrYWdlIFsvdCB0cmFuc2Zvcm1dIFsvZyBsYW5ndWFnZWlkXVxuIiBcCgkiQXBwbHkgYSBwYXRjaDpcbiIgXAoJIlx0L3AgcGF0Y2hwYWNrYWdlIFtwcm9wZXJ0eV1cbiIgXAoJIlx0L3AgcGF0Y2hwYWNrYWdlIC9hIHBhY2thZ2UgW3Byb3BlcnR5XVxuIiBcCgkiTG9nIGFuZCBVSSBNb2RpZmllcnMgZm9yIGFib3ZlIGNvbW1hbmRzOlxuIiBcCgkiXHQvbFsqXVtpfHd8ZXxhfHJ8dXxjfG18b3xwfHZ8XVsrfCFdIGxvZ2ZpbGVcbiIgXAoJIlx0L3F7fG58YnxyfGZ8bit8Yit8Yi19XG4iIFwKCSJSZWdpc3RlciBNU0kgU2VydmljZTpcbiIgXAoJIlx0L3lcbiIgXAoJIlVucmVnaXN0ZXIgTVNJIFNlcnZpY2U6XG4iIFwKCSJcdC96XG4iIFwKCSJEaXNwbGF5IHRoaXMgaGVscDpcbiIgXAoJIlx0L2hlbHBcbiIgXAoJIlx0Lz9cbiIKCTExICJhZGphIG1lZyBtZWx5aWsgbWFwcGEgdGFydGFsbWF6emEgZXp0OiAlcyIKCTEyICJoaeFueXrzIHR1bGFqZG9uc+FnIGEgdGVsZXDtdOlzaSBmb3Jy4XNob3oiCgkxMyAiaGnhbnl68yB0dWxhamRvbnPhZyBhIGjhbPN6YXRpIG1lZ2hhanTzaG96IgoJMTQgInR1bGFqZG9uc+FnIGlubmVuOiIKCTE1ICJ24Wxhc3N6YSBraSwgbWVseWlrIG1hcHBhIHRhcnRhbG1henphIGV6dDogJXMiCn0K