ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2VhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTBlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZQpAQCAtMCwwICsxLDY0IEBACisjIFN0YW5kYXJkIHBhcnQgb2YgTWFrZWZpbGUgZm9yIHRvcGRpci4KK1RPUExFVkVMX0lOQ0xVREVEPVlFUworCitpZm5kZWYgS0VSTkVMX0RJUgorS0VSTkVMX0RJUj0vdXNyL3NyYy9saW51eAorZW5kaWYKK05FVEZJTFRFUl9WRVJTSU9OOj0xLjAuMGFscGhhCisKK0xJQkRJUjo9L3Vzci9sb2NhbC9saWIKK0JJTkRJUjo9L3Vzci9sb2NhbC9iaW4KK01BTkRJUjo9L3Vzci9sb2NhbC9tYW4KKworQ09QVF9GTEFHUzo9LU8KK0NGTEFHUzo9JChDT1BUX0ZMQUdTKSAtV2FsbCAtV3VudXNlZCAtSWluY2x1ZGUvIC1JJChLRVJORUxfRElSKS9pbmNsdWRlIC1ETkVURklMVEVSX1ZFUlNJT049XCIkKE5FVEZJTFRFUl9WRVJTSU9OKVwiIC1nCisKK0RFUEZJTEVTIDo9ICQoU0hBUkVEX0xJQlM6JS5zbz0lLmQpCitTSF9DRkxBR1M6PSQoQ0ZMQUdTKSAtZlBJQworREVQRklMRVMgOj0gJChTSEFSRURfTElCUzolLnNvPSUuZCkKKworRVhUUkFTKz1pcHRhYmxlcyBpcHRhYmxlcy5vICNpcHRhYmxlcy1zYXZlIGlwdGFibGVzLXJlc3RvcmUKK0VYVFJBX0lOU1RBTExTKz0kKERFU1RESVIpJChCSU5ESVIpL2lwdGFibGVzICQoREVTVERJUikkKE1BTkRJUikvbWFuOC9pcHRhYmxlcy44ICMkKERFU1RESVIpJChCSU5ESVIpL2lwdGFibGVzLXNhdmUgJChERVNURElSKSQoQklORElSKS9pcHRhYmxlcy1yZXN0b3JlCisKK2lmbmRlZiBJUFRfTElCRElSCitJUFRfTElCRElSOj0kKExJQkRJUikvaXB0YWJsZXMKK2VuZGlmCisKK2RlZmF1bHQ6IGFsbAorCitpcHRhYmxlcy5vOiBpcHRhYmxlcy5jCisJJChDQykgJChDRkxBR1MpIC1ESVBUX0xJQl9ESVI9XCIkKElQVF9MSUJESVIpXCIgLWMgLW8gJEAgJDwKKworaXB0YWJsZXM6IGlwdGFibGVzLXN0YW5kYWxvbmUuYyBpcHRhYmxlcy5vIGxpYmlwdGMvbGliaXB0Yy5hCisJJChDQykgJChDRkxBR1MpIC1ESVBUX0xJQl9ESVI9XCIkKElQVF9MSUJESVIpXCIgLXJkeW5hbWljIC1vICRAICReIC1sZGwKKworJChERVNURElSKSQoQklORElSKS9pcHRhYmxlczogaXB0YWJsZXMKKwlAWyAtZCAkKERFU1RESVIpJChCSU5ESVIpIF0gfHwgbWtkaXIgLXAgJChERVNURElSKSQoQklORElSKQorCWNwICQ8ICRACisKK2lwdGFibGVzLXNhdmU6IGlwdGFibGVzLXNhdmUuYyBpcHRhYmxlcy5vIGxpYmlwdGMvbGliaXB0Yy5hCisJJChDQykgJChDRkxBR1MpIC1ESVBUX0xJQl9ESVI9XCIkKElQVF9MSUJESVIpXCIgLXJkeW5hbWljIC1vICRAICReIC1sZGwKKworJChERVNURElSKSQoQklORElSKS9pcHRhYmxlcy1zYXZlOiBpcHRhYmxlcy1zYXZlCisJQFsgLWQgJChERVNURElSKSQoQklORElSKSBdIHx8IG1rZGlyIC1wICQoREVTVERJUikkKEJJTkRJUikKKwljcCAkPCAkQAorCitpcHRhYmxlcy1yZXN0b3JlOiBpcHRhYmxlcy1yZXN0b3JlLmMgaXB0YWJsZXMubyBsaWJpcHRjL2xpYmlwdGMuYQorCSQoQ0MpICQoQ0ZMQUdTKSAtRElQVF9MSUJfRElSPVwiJChJUFRfTElCRElSKVwiIC1yZHluYW1pYyAtbyAkQCAkXiAtbGRsCisKKyQoREVTVERJUikkKEJJTkRJUikvaXB0YWJsZXMtcmVzdG9yZTogaXB0YWJsZXMtcmVzdG9yZQorCUBbIC1kICQoREVTVERJUikkKEJJTkRJUikgXSB8fCBta2RpciAtcCAkKERFU1RESVIpJChCSU5ESVIpCisJY3AgJDwgJEAKKworJChERVNURElSKSQoTUFORElSKS9tYW44L2lwdGFibGVzLjg6IGlwdGFibGVzLjgKKwlAWyAtZCAkKERFU1RESVIpJChNQU5ESVIpL21hbjggXSB8fCBta2RpciAtcCAkKERFU1RESVIpJChNQU5ESVIpL21hbjgKKwljcCAkPCAkQAorCitFWFRSQV9ERVBFTkRTKz1pcHRhYmxlcy1zdGFuZGFsb25lLmQgaXB0YWJsZXMuZAorCitpcHRhYmxlcy1zdGFuZGFsb25lLmQgaXB0YWJsZXMuZDogJS5kOiAlLmMKKwlALSQoQ0MpIC1NIC1NRyAkKENGTEFHUykgJDwgfCBzZWQgLWUgJ3NAXi4qXC5vOkAkKi5kICQqLm86QCcgPiAkQAorCisjICQod2lsZGNhcmQpIGZhaWxzIHdpZXJkbHkgd2l0aCBtYWtlIHYuMy43OC4xLgoraW5jbHVkZSAkKHNoZWxsIGVjaG8gKi9NYWtlZmlsZSkKK2luY2x1ZGUgUnVsZXMubWFrZQpkaWZmIC0tZ2l0IGEvUnVsZXMubWFrZSBiL1J1bGVzLm1ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwODY2ZAotLS0gL2Rldi9udWxsCisrKyBiL1J1bGVzLm1ha2UKQEAgLTAsMCArMSw1NiBAQAorIyEgL3Vzci9iaW4vbWFrZQorCithbGw6ICQoU0hBUkVEX0xJQlMpICQoRVhUUkFTKQorCitjbGVhbjogJChFWFRSQV9DTEVBTlMpCisJcm0gLWYgJChTSEFSRURfTElCUykgJChFWFRSQVMpICQoU0hBUkVEX0xJQlM6JS5zbz0lX3NoLm8pCisKK2luc3RhbGw6IGFsbCAkKEVYVFJBX0lOU1RBTExTKQorCitUQUdTOgorCUBybSAtZiAkQAorCWZpbmQgLiAtbmFtZSAnKi5bY2hdJyB8IHhhcmdzIGV0YWdzIC1hCisKK2RlcDogJChERVBGSUxFUykgJChFWFRSQV9ERVBFTkRTKQorCUBlY2hvIERlcGVuZGVuY2llcyB3aWxsIGJlIGdlbmVyYXRlZCBvbiBuZXh0IG1ha2UuCisJQHJtIC1mICQoREVQRklMRVMpICQoRVhUUkFfREVQRU5EUykgLm1ha2VmaXJzdAorCiskKFNIQVJFRF9MSUJTOiUuc289JS5kKTogJS5kOiAlLmMKKwlALSQoQ0MpIC1NIC1NRyAkKENGTEFHUykgJDwgfCBcCisJICAgIHNlZCAtZSAnc0BeLipcLm86QCQqLmQgJCoubzpAJyA+ICRACisKKyQoU0hBUkVEX0xJQlMpOiAlLnNvIDogJV9zaC5vCisJJChMRCkgLXNoYXJlZCAtbyAkQCAkPAorCislX3NoLm8gOiAlLmMKKwkkKENDKSAkKFNIX0NGTEFHUykgLW8gJEAgLWMgJDwKKworZGlzdHJpYjogbm93aGl0ZXNwYWNlIGRpc3RjbGVhbiBkZWxyZWxlYXNlIC9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pLnRhci5iejIgI2RpZmYgbWQ1c3VtcworCitkZWxyZWxlYXNlOgorCXJtIC1mIC9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pLnRhci5iejIKKworZGlzdGNsZWFuOiBjbGVhbgorCUBybSAtZiBUQUdTIGBmaW5kIC4gLW5hbWUgJyp+JyAtbyAtbmFtZSAnKi5bZG9dJyAtbyAtbmFtZSAnKi5yZWonYCAubWFrZWZpcnN0CisKK25vd2hpdGVzcGFjZToKKwlAaWYgZ3JlcCAtbiAnWwkgXSQkJyBgZmluZCAuIC1uYW1lICdNYWtlZmlsZScgLW8gLW5hbWUgJyouW2NoXSdgOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpCisKKy9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pLnRhci5iejI6CisJY2QgLi4gJiYgbG4gLXNmbiBuZXRmaWx0ZXIgbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pICYmIHRhciBjdmYgLSAtLWV4Y2x1ZGUgaW5zdGFsbC1rZXJuZWwgLS1leGNsdWRlIHRyYW5zZmVyIC0tZXhjbHVkZSBuZXRmaWx0ZXItJChORVRGSUxURVJfVkVSU0lPTikvYnVncyAtLWV4Y2x1ZGUgQ1ZTIC0tZXhjbHVkZSAuZGVwZW5kIC0tZXhjbHVkZSBuZXRmaWx0ZXItJChORVRGSUxURVJfVkVSU0lPTikvLi9OQVQvdXNlcnNwYWNlLy5kZXBlbmQgLS1leGNsdWRlIG5ldGZpbHRlci0kKE5FVEZJTFRFUl9WRVJTSU9OKS9saW51eC1uZXRmaWx0ZXIgbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pLy4gfCBiemlwMiAtOSA+ICRAICYmIHJtIG5ldGZpbHRlci0kKE5FVEZJTFRFUl9WRVJTSU9OKQorCitkaWZmOiAvaG9tZS9wdWJsaWMvbmV0ZmlsdGVyL25ldGZpbHRlci0kKE5FVEZJTFRFUl9WRVJTSU9OKS50YXIuYnoyCisJQG1rZGlyIC90bXAvZGlmZmRpcgorCUBjZCAvdG1wL2RpZmZkaXIgJiYgdGFyIHhmSSAvaG9tZS9wdWJsaWMvbmV0ZmlsdGVyL25ldGZpbHRlci0kKE5FVEZJTFRFUl9WRVJTSU9OKS50YXIuYnoyCisJQHNldCAtZTsgY2QgL3RtcC9kaWZmZGlyOyB0YXIgeGZJIC9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvbmV0ZmlsdGVyLSQoT0xEX05FVEZJTFRFUl9WRVJTSU9OKS50YXIuYnoyOyBlY2hvIENyZWF0aW5nIHBhdGNoLW5ldGZpbHRlci0kKE9MRF9ORVRGSUxURVJfVkVSU0lPTiktJChORVRGSUxURVJfVkVSU0lPTikuYnoyOyBkaWZmIC11ck4gbmV0ZmlsdGVyLSQoT0xEX05FVEZJTFRFUl9WRVJTSU9OKSBuZXRmaWx0ZXItJChORVRGSUxURVJfVkVSU0lPTikgfCBiemlwMiAtOSA+IC9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvcGF0Y2gtbmV0ZmlsdGVyLSQoT0xEX05FVEZJTFRFUl9WRVJTSU9OKS0kKE5FVEZJTFRFUl9WRVJTSU9OKS5iejIKKwlAcm0gLXJmIC90bXAvZGlmZmRpcgorCittZDVzdW1zOgorCWNkIC9ob21lL3B1YmxpYy9uZXRmaWx0ZXIvICYmIG1kNXN1bSBwYXRjaC1uZXRmaWx0ZXItKi0kKE5FVEZJTFRFUl9WRVJTSU9OKS5iejIgbmV0ZmlsdGVyLSQoTkVURklMVEVSX1ZFUlNJT04pLnRhci5iejIKKworLm1ha2VmaXJzdDoKKwlAZWNobyBNYWtpbmcgZGVwZW5kZW5jaWVzOiBwbGVhc2Ugd2FpdC4uLgorCUB0b3VjaCAubWFrZWZpcnN0CisKKy1pbmNsdWRlICQoREVQRklMRVMpICQoRVhUUkFfREVQRU5EUykKKy1pbmNsdWRlIC5tYWtlZmlyc3QKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvTWFrZWZpbGUgYi9leHRlbnNpb25zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGRlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMhIC91c3IvYmluL21ha2UKKworUEZfRVhUX1NMSUI6PXRjcCB1ZHAgaWNtcCBtYWMgbGltaXQgc3RhbmRhcmQgUkVKRUNUIExPRyB1bmNsZWFuIHN0YXRlIG11bHRpcG9ydCB0b3MgVE9TIG1hcmsgTUFSSyBvd25lciBTTkFUIEROQVQgTUFTUVVFUkFERSBSRURJUkVDVAorU0hBUkVEX0xJQlMrPSQoZm9yZWFjaCBULCQoUEZfRVhUX1NMSUIpLGV4dGVuc2lvbnMvbGliaXB0XyQoVCkuc28pCitFWFRSQV9JTlNUQUxMUys9JChmb3JlYWNoIFQsICQoUEZfRVhUX1NMSUIpLCAkKERFU1RESVIpJChMSUJESVIpL2lwdGFibGVzL2xpYmlwdF8kKFQpLnNvKQorCitpZm5kZWYgVE9QTEVWRUxfSU5DTFVERUQKK2xvY2FsOgorCWNkIC4uICYmICQoTUFLRSkgJChTSEFSRURfTElCUykKK2VuZGlmCisKKyQoREVTVERJUikkKExJQkRJUikvaXB0YWJsZXMvbGliaXB0XyUuc286IGV4dGVuc2lvbnMvbGliaXB0XyUuc28KKwlAWyAtZCAkKERFU1RESVIpJChMSUJESVIpL2lwdGFibGVzIF0gfHwgbWtkaXIgLXAgJChERVNURElSKSQoTElCRElSKS9pcHRhYmxlcworCWNwICQ8ICRACmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2xpYmlwdF9ETkFULmMgYi9leHRlbnNpb25zL2xpYmlwdF9ETkFULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjMzcyMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X0ROQVQuYwpAQCAtMCwwICsxLDI0NCBAQAorLyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBkZXN0aW5hdGlvbi1OQVQgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorCisvKiBEZXN0IE5BVCBkYXRhIGNvbnNpc3RzIG9mIGEgbXVsdGktcmFuZ2UsIGluZGljYXRpbmcgd2hlcmUgdG8gbWFwCisgICB0by4gKi8KK3N0cnVjdCBpcHRfbmF0aW5mbworeworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0IHQ7CisJc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSBtcjsKK307CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorIkROQVQgdiVzIG9wdGlvbnM6XG4iCisiIC0tdG8tZGVzdGluYXRpb24gPGlwYWRkcj5bLTxpcGFkZHI+XVs6cG9ydC1wb3J0XVxuIgorIgkJCQlBZGRyZXNzIHRvIG1hcCBkZXN0aW5hdGlvbiB0by5cbiIKKyIJCQkJKFlvdSBjYW4gdXNlIHRoaXMgbW9yZSB0aGFuIG9uY2UpXG5cbiIsCitORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ0by1kZXN0aW5hdGlvbiIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCS8qIENhbid0IGNhY2hlIHRoaXMgKi8KKwkqbmZjYWNoZSB8PSBORkNfVU5LTk9XTjsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbmF0aW5mbyAqCithcHBlbmRfcmFuZ2Uoc3RydWN0IGlwdF9uYXRpbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIE9uZSByYW5nZXNpemUgYWxyZWFkeSBpbiBzdHJ1Y3QgaXB0X25hdGluZm8gKi8KKwlzaXplID0gSVBUX0FMSUdOKHNpemVvZigqaW5mbykgKyBpbmZvLT5tci5yYW5nZXNpemUgKiBzaXplb2YoKnJhbmdlKSk7CisKKwlpbmZvID0gcmVhbGxvYyhpbmZvLCBzaXplKTsKKwlpZiAoIWluZm8pCisJCWV4aXRfZXJyb3IoT1RIRVJfUFJPQkxFTSwgIk91dCBvZiBtZW1vcnlcbiIpOworCisJaW5mby0+dC50YXJnZXRfc2l6ZSA9IHNpemU7CisJaW5mby0+bXIucmFuZ2VbaW5mby0+bXIucmFuZ2VzaXplXSA9ICpyYW5nZTsKKwlpbmZvLT5tci5yYW5nZXNpemUrKzsKKworCXJldHVybiBpbmZvOworfQorCisvKiBSYW5nZXMgZXhwZWN0ZWQgaW4gbmV0d29yayBvcmRlci4gKi8KK3N0YXRpYyBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqCitwYXJzZV90byhjaGFyICphcmcsIGludCBwb3J0b2ssIHN0cnVjdCBpcHRfbmF0aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCWNoYXIgKmNvbG9uLCAqZGFzaDsKKwlzdHJ1Y3QgaW5fYWRkciAqaXA7CisKKwltZW1zZXQoJnJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKwljb2xvbiA9IHN0cmNocihhcmcsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJaW50IHBvcnQ7CisKKwkJaWYgKCFwb3J0b2spCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJOZWVkIFRDUCBvciBVRFAgd2l0aCBwb3J0IHNwZWNpZmljYXRpb24iKTsKKworCQlyYW5nZS5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCisJCXBvcnQgPSBhdG9pKGNvbG9uKzEpOworCQlpZiAocG9ydCA9PSAwIHx8IHBvcnQgPiA2NTUzNSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIlBvcnQgYCVzJyBub3QgdmFsaWRcbiIsIGNvbG9uKzEpOworCisJCWRhc2ggPSBzdHJjaHIoY29sb24sICctJyk7CisJCWlmICghZGFzaCkgeworCQkJcmFuZ2UubWluLnRjcC5wb3J0CisJCQkJPSByYW5nZS5tYXgudGNwLnBvcnQKKwkJCQk9IGh0b25zKHBvcnQpOworCQl9IGVsc2UgeworCQkJaW50IG1heHBvcnQ7CisKKwkJCW1heHBvcnQgPSBhdG9pKGRhc2ggKyAxKTsKKwkJCWlmIChtYXhwb3J0ID09IDAgfHwgbWF4cG9ydCA+IDY1NTM1KQorCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJQb3J0IGAlcycgbm90IHZhbGlkXG4iLCBkYXNoKzEpOworCQkJaWYgKG1heHBvcnQgPCBwb3J0KQorCQkJCS8qIFBlb3BsZSBhcmUgc3R1cGlkLiAqLworCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJQb3J0IHJhbmdlIGAlcycgZnVua3lcbiIsIGNvbG9uKzEpOworCQkJcmFuZ2UubWluLnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7CisJCQlyYW5nZS5tYXgudGNwLnBvcnQgPSBodG9ucyhtYXhwb3J0KTsKKwkJfQorCQkvKiBTdGFydHMgd2l0aCBhIGNvbG9uPyBObyBJUCBpbmZvLi4uKi8KKwkJaWYgKGNvbG9uID09IGFyZykKKwkJCXJldHVybiAmKGFwcGVuZF9yYW5nZShpbmZvLCAmcmFuZ2UpLT50KTsKKwkJKmNvbG9uID0gJ1wwJzsKKwl9CisKKwlyYW5nZS5mbGFncyB8PSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKKwlkYXNoID0gc3RyY2hyKGFyZywgJy0nKTsKKwlpZiAoY29sb24gJiYgZGFzaCAmJiBkYXNoID4gY29sb24pCisJCWRhc2ggPSBOVUxMOworCisJaWYgKGRhc2gpCisJCSpkYXNoID0gJ1wwJzsKKworCWlwID0gZG90dGVkX3RvX2FkZHIoYXJnKTsKKwlpZiAoIWlwKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIElQIGFkZHJlc3MgYCVzJ1xuIiwKKwkJCSAgIGFyZyk7CisJcmFuZ2UubWluX2lwID0gaXAtPnNfYWRkcjsKKwlpZiAoZGFzaCkgeworCQlpcCA9IGRvdHRlZF90b19hZGRyKGRhc2grMSk7CisJCWlmICghaXApCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIElQIGFkZHJlc3MgYCVzJ1xuIiwKKwkJCQkgICBkYXNoKzEpOworCQlyYW5nZS5tYXhfaXAgPSBpcC0+c19hZGRyOworCX0gZWxzZQorCQlyYW5nZS5tYXhfaXAgPSByYW5nZS5taW5faXA7CisKKwlyZXR1cm4gJihhcHBlbmRfcmFuZ2UoaW5mbywgJnJhbmdlKS0+dCk7Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqKnRhcmdldCkKK3sKKwlzdHJ1Y3QgaXB0X25hdGluZm8gKmluZm8gPSAodm9pZCAqKSp0YXJnZXQ7CisJaW50IHBvcnRvazsKKworCWlmIChlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19UQ1AKKwkgICAgfHwgZW50cnktPmlwLnByb3RvID09IElQUFJPVE9fVURQKQorCQlwb3J0b2sgPSAxOworCWVsc2UKKwkJcG9ydG9rID0gMDsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS10by1kZXN0aW5hdGlvbiIpOworCisJCSp0YXJnZXQgPSBwYXJzZV90byhvcHRhcmcsIHBvcnRvaywgaW5mbyk7CisJCSpmbGFncyA9IDE7CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBGaW5hbCBjaGVjazsgbXVzdCBoYXZlIHNwZWNmaWVkIC0tdG8tc291cmNlLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghZmxhZ3MpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkgICAiWW91IG11c3Qgc3BlY2lmeSAtLXRvLWRlc3RpbmF0aW9uIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnIpCit7CisJaWYgKHItPmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpIHsKKwkJc3RydWN0IGluX2FkZHIgYTsKKworCQlhLnNfYWRkciA9IHItPm1pbl9pcDsKKwkJcHJpbnRmKCIlcyIsIGFkZHJfdG9fZG90dGVkKCZhKSk7CisJCWlmIChyLT5tYXhfaXAgIT0gci0+bWluX2lwKSB7CisJCQlhLnNfYWRkciA9IHItPm1heF9pcDsKKwkJCXByaW50ZigiLSVzIiwgYWRkcl90b19kb3R0ZWQoJmEpKTsKKwkJfQorCX0KKwlpZiAoci0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB7CisJCXByaW50ZigiOiIpOworCQlwcmludGYoIiVodSIsIG50b2hzKHItPm1pbi50Y3AucG9ydCkpOworCQlpZiAoci0+bWF4LnRjcC5wb3J0ICE9IHItPm1pbi50Y3AucG9ydCkKKwkJCXByaW50ZigiLSVodSIsIG50b2hzKHItPm1heC50Y3AucG9ydCkpOworCX0KK30KKworLyogUHJpbnRzIG91dCB0aGUgdGFyZ2luZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LAorICAgICAgaW50IG51bWVyaWMpCit7CisJc3RydWN0IGlwdF9uYXRpbmZvICppbmZvID0gKHZvaWQgKil0YXJnZXQ7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJcHJpbnRmKCJ0bzoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bXIucmFuZ2VzaXplOyBpKyspIHsKKwkJcHJpbnRfcmFuZ2UoJmluZm8tPm1yLnJhbmdlW2ldKTsKKwkJcHJpbnRmKCIgIik7CisJfQorfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X3RhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQKK3NhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IGlwdF9uYXRpbmZvICppbmZvID0gKHZvaWQgKil0YXJnZXQ7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm1yLnJhbmdlc2l6ZTsgaSsrKSB7CisJCXByaW50ZigiLS10by1kZXN0aW5hdGlvbiAiKTsKKwkJcHJpbnRfcmFuZ2UoJmluZm8tPm1yLnJhbmdlW2ldKTsKKwkJcHJpbnRmKCIgIik7CisJfQorfQorCitzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0IGRuYXQKKz0geyBOVUxMLAorICAgICJETkFUIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RhcmdldCgmZG5hdCk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2xpYmlwdF9MT0cuYyBiL2V4dGVuc2lvbnMvbGliaXB0X0xPRy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjU3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2xpYmlwdF9MT0cuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBMT0cgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmg+CisKKyNkZWZpbmUgTE9HX0RFRkFVTFRfTEVWRUwgTE9HX1dBUk5JTkcKKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiTE9HIHYlcyBvcHRpb25zOlxuIgorIiAtLWxvZy1sZXZlbCBsZXZlbAkJTGV2ZWwgb2YgbG9nZ2luZyAobnVtZXJpYyBvciBzZWUgc3lzbG9nLmNvbmYpXG4iCisiIC0tbG9nLXByZWZpeCBwcmVmaXgJCVByZWZpeCBsb2cgbWVzc2FnZXMgd2l0aCB0aGlzIHByZWZpeC5cblxuIgorIiAtLWxvZy10Y3Atc2VxdWVuY2UJCUxvZyBUQ1Agc2VxdWVuY2UgbnVtYmVycy5cblxuIgorIiAtLWxvZy10Y3Atb3B0aW9ucwkJTG9nIFRDUCBvcHRpb25zLlxuXG4iCisiIC0tbG9nLWlwLW9wdGlvbnMJCUxvZyBJUCBvcHRpb25zLlxuXG4iLAorTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAibG9nLWxldmVsIiwgMSwgMCwgJyEnIH0sCisJeyAibG9nLXByZWZpeCIsIDEsIDAsICcjJyB9LAorCXsgImxvZy10Y3Atc2VxdWVuY2UiLCAwLCAwLCAnMScgfSwKKwl7ICJsb2ctdGNwLW9wdGlvbnMiLCAwLCAwLCAnMicgfSwKKwl7ICJsb2ctaXAtb3B0aW9ucyIsIDAsIDAsICczJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCXN0cnVjdCBpcHRfbG9nX2luZm8gKmxvZ2luZm8gPSAoc3RydWN0IGlwdF9sb2dfaW5mbyAqKXQtPmRhdGE7CisKKwlsb2dpbmZvLT5sZXZlbCA9IExPR19ERUZBVUxUX0xFVkVMOworCisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCitzdHJ1Y3QgaXB0X2xvZ19uYW1lcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbGV2ZWw7Cit9OworCitzdGF0aWMgc3RydWN0IGlwdF9sb2dfbmFtZXMgaXB0X2xvZ19uYW1lc1tdCis9IHsgeyAiYWxlcnQiLCBMT0dfQUxFUlQgfSwKKyAgICB7ICJjcml0IiwgTE9HX0NSSVQgfSwKKyAgICB7ICJkZWJ1ZyIsIExPR19ERUJVRyB9LAorICAgIHsgImVtZXJnIiwgTE9HX0VNRVJHIH0sCisgICAgeyAiZXJyb3IiLCBMT0dfRVJSIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAiaW5mbyIsIExPR19JTkZPIH0sCisgICAgeyAibm90aWNlIiwgTE9HX05PVElDRSB9LAorICAgIHsgInBhbmljIiwgTE9HX0VNRVJHIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAid2FybmluZyIsIExPR19XQVJOSU5HIH0KK307CisKK3N0YXRpYyB1X2ludDhfdAorcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbGV2ZWwpCit7CisJaW50IGxldjsKKworCWxldiA9IHN0cmluZ190b19udW1iZXIobGV2ZWwsIDAsIDcpOworCWlmIChsZXYgPT0gLTEpIHsKKwkJdW5zaWduZWQgaW50IGkgPSAwOworCisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IHNpemVvZihpcHRfbG9nX25hbWVzKSAvIHNpemVvZihzdHJ1Y3QgaXB0X2xvZ19uYW1lcyk7CisJCSAgICAgaSsrKSB7CisJCQlpZiAoc3RybmNhc2VjbXAobGV2ZWwsIGlwdF9sb2dfbmFtZXNbaV0ubmFtZSwKKwkJCQkJc3RybGVuKGxldmVsKSkgPT0gMCkgeworCQkJCWlmIChsZXYgIT0gLTEpCisJCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCQkgICAibG9nLWxldmVsIGAlcycgYW1iaWd1b3VzIiwKKwkJCQkJCSAgIGxldmVsKTsKKwkJCQlsZXYgPSBpcHRfbG9nX25hbWVzW2ldLmxldmVsOworCQkJfQorCQl9CisKKwkJaWYgKGxldiA9PSAtMSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgImxvZy1sZXZlbCBgJXMnIHVua25vd24iLCBsZXZlbCk7CisJfQorCisJcmV0dXJuICh1X2ludDhfdClsZXY7Cit9CisKKyNkZWZpbmUgSVBUX0xPR19PUFRfTEVWRUwgMHgwMQorI2RlZmluZSBJUFRfTE9HX09QVF9QUkVGSVggMHgwMgorI2RlZmluZSBJUFRfTE9HX09QVF9UQ1BTRVEgMHgwNAorI2RlZmluZSBJUFRfTE9HX09QVF9UQ1BPUFQgMHgwOAorI2RlZmluZSBJUFRfTE9HX09QVF9JUE9QVCAweDEwCisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqKnRhcmdldCkKK3sKKwlzdHJ1Y3QgaXB0X2xvZ19pbmZvICpsb2dpbmZvID0gKHN0cnVjdCBpcHRfbG9nX2luZm8gKikoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICchJzoKKwkJaWYgKCpmbGFncyAmIElQVF9MT0dfT1BUX0xFVkVMKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiQ2FuJ3Qgc3BlY2lmeSAtLWxvZy1sZXZlbCB0d2ljZSIpOworCQkJCisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxvZy1sZXZlbCIpOworCisJCWxvZ2luZm8tPmxldmVsID0gcGFyc2VfbGV2ZWwob3B0YXJnKTsKKwkJKmZsYWdzIHw9IElQVF9MT0dfT1BUX0xFVkVMOworCQlicmVhazsKKworCWNhc2UgJyMnOgorCQlpZiAoKmZsYWdzICYgSVBUX0xPR19PUFRfUFJFRklYKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiQ2FuJ3Qgc3BlY2lmeSAtLWxvZy1wcmVmaXggdHdpY2UiKTsKKwkJCQorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1sb2ctcHJlZml4Iik7CisKKwkJaWYgKHN0cmxlbihvcHRhcmcpID4gc2l6ZW9mKGxvZ2luZm8tPnByZWZpeCkgLSAxKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiTWF4aW11bSBwcmVmaXggbGVuZ3RoICV1IGZvciAtLWxvZy1wcmVmaXgiLAorCQkJCSAgIHNpemVvZihsb2dpbmZvLT5wcmVmaXgpIC0gMSk7CisKKwkJc3RyY3B5KGxvZ2luZm8tPnByZWZpeCwgb3B0YXJnKTsKKwkJKmZsYWdzIHw9IElQVF9MT0dfT1BUX1BSRUZJWDsKKwkJYnJlYWs7CisKKwljYXNlICcxJzoKKwkJaWYgKCpmbGFncyAmIElQVF9MT0dfT1BUX1RDUFNFUSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIkNhbid0IHNwZWNpZnkgLS1sb2ctdGNwLXNlcXVlbmNlICIKKwkJCQkgICAidHdpY2UiKTsKKworCQlsb2dpbmZvLT5sb2dmbGFncyB8PSBJUFRfTE9HX1RDUFNFUTsKKwkJKmZsYWdzIHw9IElQVF9MT0dfT1BUX1RDUFNFUTsKKwkJYnJlYWs7CisKKwljYXNlICcyJzoKKwkJaWYgKCpmbGFncyAmIElQVF9MT0dfT1BUX1RDUE9QVCkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIkNhbid0IHNwZWNpZnkgLS1sb2ctdGNwLW9wdGlvbnMgdHdpY2UiKTsKKworCQlsb2dpbmZvLT5sb2dmbGFncyB8PSBJUFRfTE9HX1RDUE9QVDsKKwkJKmZsYWdzIHw9IElQVF9MT0dfT1BUX1RDUE9QVDsKKwkJYnJlYWs7CisKKwljYXNlICczJzoKKwkJaWYgKCpmbGFncyAmIElQVF9MT0dfT1BUX0lQT1BUKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiQ2FuJ3Qgc3BlY2lmeSAtLWxvZy1pcC1vcHRpb25zIHR3aWNlIik7CisKKwkJbG9naW5mby0+bG9nZmxhZ3MgfD0gSVBUX0xPR19JUE9QVDsKKwkJKmZsYWdzIHw9IElQVF9MT0dfT1BUX0lQT1BUOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBGaW5hbCBjaGVjazsgbm90aGluZy4gKi8KK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKK30KKworLyogUHJpbnRzIG91dCB0aGUgdGFyZ2luZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LAorICAgICAgaW50IG51bWVyaWMpCit7CisJY29uc3Qgc3RydWN0IGlwdF9sb2dfaW5mbyAqbG9naW5mbworCQk9IChjb25zdCBzdHJ1Y3QgaXB0X2xvZ19pbmZvICopdGFyZ2V0LT5kYXRhOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCXByaW50ZigiTE9HICIpOworCWlmIChudW1lcmljKQorCQlwcmludGYoImZsYWdzICV1IGxldmVsICV1ICIsCisJCSAgICAgICBsb2dpbmZvLT5sb2dmbGFncywgbG9naW5mby0+bGV2ZWwpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCBzaXplb2YoaXB0X2xvZ19uYW1lcykgLyBzaXplb2Yoc3RydWN0IGlwdF9sb2dfbmFtZXMpOworCQkgICAgIGkrKykgeworCQkJaWYgKGxvZ2luZm8tPmxldmVsID09IGlwdF9sb2dfbmFtZXNbaV0ubGV2ZWwpIHsKKwkJCQlwcmludGYoImxldmVsICVzICIsIGlwdF9sb2dfbmFtZXNbaV0ubmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gc2l6ZW9mKGlwdF9sb2dfbmFtZXMpIC8gc2l6ZW9mKHN0cnVjdCBpcHRfbG9nX25hbWVzKSkKKwkJCXByaW50ZigiVU5LTk9XTiBsZXZlbCAldSAiLCBsb2dpbmZvLT5sZXZlbCk7CisJCWlmIChsb2dpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfVENQU0VRKQorCQkJcHJpbnRmKCJ0Y3Atc2VxdWVuY2UgIik7CisJCWlmIChsb2dpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfVENQT1BUKQorCQkJcHJpbnRmKCJ0Y3Atb3B0aW9ucyAiKTsKKwkJaWYgKGxvZ2luZm8tPmxvZ2ZsYWdzICYgSVBUX0xPR19JUE9QVCkKKwkJCXByaW50ZigiaXAtb3B0aW9ucyAiKTsKKwkJaWYgKGxvZ2luZm8tPmxvZ2ZsYWdzICYgfihJUFRfTE9HX01BU0spKQorCQkJcHJpbnRmKCJ1bmtub3duLWZsYWdzICIpOworCX0KKworCWlmIChzdHJjbXAobG9naW5mby0+cHJlZml4LCAiIikgIT0gMCkKKwkJcHJpbnRmKCJwcmVmaXggYCVzJyAiLCBsb2dpbmZvLT5wcmVmaXgpOworfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X3RhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQKK3NhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJY29uc3Qgc3RydWN0IGlwdF9sb2dfaW5mbyAqbG9naW5mbworCQk9IChjb25zdCBzdHJ1Y3QgaXB0X2xvZ19pbmZvICopdGFyZ2V0LT5kYXRhOworCisJaWYgKHN0cmNtcChsb2dpbmZvLT5wcmVmaXgsICIiKSAhPSAwKQorCQlwcmludGYoIi0tbG9nLXByZWZpeCAlcyAiLCBsb2dpbmZvLT5wcmVmaXgpOworCisJaWYgKGxvZ2luZm8tPmxldmVsICE9IExPR19ERUZBVUxUX0xFVkVMKQorCQlwcmludGYoIi0tbG9nLWxldmVsICV1ICIsIGxvZ2luZm8tPmxldmVsKTsKKworCWlmIChsb2dpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfVENQU0VRKQorCQlwcmludGYoIi0tbG9nLXRjcC1zZXF1ZW5jZSAiKTsKKwlpZiAobG9naW5mby0+bG9nZmxhZ3MgJiBJUFRfTE9HX1RDUE9QVCkKKwkJcHJpbnRmKCItLWxvZy10Y3Atb3B0aW9ucyAiKTsKKwlpZiAobG9naW5mby0+bG9nZmxhZ3MgJiBJUFRfTE9HX0lQT1BUKQorCQlwcmludGYoIi0tbG9nLWlwLW9wdGlvbnMgIik7Cit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgbG9nCis9IHsgTlVMTCwKKyAgICAiTE9HIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF9sb2dfaW5mbyksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RhcmdldCgmbG9nKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvbGliaXB0X01BUksuYyBiL2V4dGVuc2lvbnMvbGliaXB0X01BUksuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVhNjBkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfTUFSSy5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBTaGFyZWQgbGlicmFyeSBhZGQtb24gdG8gaXB0YWJsZXMgdG8gYWRkIE1BUksgdGFyZ2V0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaD4KKworc3RydWN0IG1hcmtpbmZvIHsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCB0OworCXN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyBtYXJrOworfTsKKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiTUFSSyB0YXJnZXQgdiVzIG9wdGlvbnM6XG4iCisiICAtLXNldC1tYXJrIHZhbHVlICAgICAgICAgICAgICAgICAgIFNldCBuZm1hcmsgdmFsdWVcbiIKKyJcbiIsCitORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJzZXQtbWFyayIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworfQorCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbworCQk9IChzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8gKikoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwkJY2hhciAqZW5kOworCWNhc2UgJzEnOgorCQltYXJraW5mby0+bWFyayA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAwKTsKKwkJaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gb3B0YXJnKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIkJhZCBNQVJLIHZhbHVlIGAlcyciLCBvcHRhcmcpOworCQlpZiAoKmZsYWdzKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICAgICAgICAgIk1BUksgdGFyZ2V0OiBDYW4ndCBzcGVjaWZ5IC0tc2V0LW1hcmsgdHdpY2UiKTsKKwkJKmZsYWdzID0gMTsKKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghZmxhZ3MpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCSAgICAgICAgICAgIk1BUksgdGFyZ2V0OiBQYXJhbWV0ZXIgLS1zZXQtbWFyayBpcyByZXF1aXJlZCIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbWFyayh1bnNpZ25lZCBsb25nIG1hcmssIGludCBudW1lcmljKQoreworCXByaW50ZigiMHglbHggIiwgbWFyayk7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIHRhcmdpbmZvLiAqLworc3RhdGljIHZvaWQKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCwKKyAgICAgIGludCBudW1lcmljKQoreworCWNvbnN0IHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPQorCQkoY29uc3Qgc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICopdGFyZ2V0LT5kYXRhOworCXByaW50ZigiTUFSSyBzZXQgIik7CisJcHJpbnRfbWFyayhtYXJraW5mby0+bWFyaywgbnVtZXJpYyk7CQorfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X3RhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQKK3NhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJY29uc3Qgc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9CisJCShjb25zdCBzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8gKil0YXJnZXQtPmRhdGE7CisJCisJcHJpbnRmKCItLXNldC1tYXJrIDB4JWx4ICIsIG1hcmtpbmZvLT5tYXJrKTsJCit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgbWFyaworPSB7IE5VTEwsCisgICAgIk1BUksiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8pLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl90YXJnZXQoJm1hcmspOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfTUFTUVVFUkFERS5jIGIvZXh0ZW5zaW9ucy9saWJpcHRfTUFTUVVFUkFERS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTUxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2xpYmlwdF9NQVNRVUVSQURFLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgbWFzcXVlcmFkZSBzdXBwb3J0LiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxpcHRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorIk1BU1FVRVJBREUgdiVzIG9wdGlvbnM6XG4iCisiIC0tdG8tcG9ydHMgPHBvcnQ+Wy08cG9ydD5dXG4iCisiCQkJCVBvcnQgKHJhbmdlKSB0byBtYXAgdG8uXG5cbiIsCitORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ0by1wb3J0cyIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCXN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yID0gKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKil0LT5kYXRhOworCisJLyogQWN0dWFsbHksIGl0J3MgMCwgYnV0IGl0J3MgaWdub3JlZCBhdCB0aGUgbW9tZW50LiAqLworCW1yLT5yYW5nZXNpemUgPSAxOworCisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCisvKiBQYXJzZXMgcG9ydHMgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9wb3J0cyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yKQoreworCWNvbnN0IGNoYXIgKmRhc2g7CisJaW50IHBvcnQ7CisKKwltci0+cmFuZ2VbMF0uZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKKworCXBvcnQgPSBhdG9pKGFyZyk7CisJaWYgKHBvcnQgPT0gMCB8fCBwb3J0ID4gNjU1MzUpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJQb3J0IGAlcycgbm90IHZhbGlkXG4iLCBhcmcpOworCisJZGFzaCA9IHN0cmNocihhcmcsICctJyk7CisJaWYgKCFkYXNoKSB7CisJCW1yLT5yYW5nZVswXS5taW4udGNwLnBvcnQKKwkJCT0gbXItPnJhbmdlWzBdLm1heC50Y3AucG9ydAorCQkJPSBwb3J0OworCX0gZWxzZSB7CisJCWludCBtYXhwb3J0OworCisJCW1heHBvcnQgPSBhdG9pKGRhc2ggKyAxKTsKKwkJaWYgKG1heHBvcnQgPT0gMCB8fCBtYXhwb3J0ID4gNjU1MzUpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJQb3J0IGAlcycgbm90IHZhbGlkXG4iLCBkYXNoKzEpOworCQlpZiAobWF4cG9ydCA8IHBvcnQpCisJCQkvKiBQZW9wbGUgYXJlIHN0dXBpZC4gIFByZXNlbnQgcmVhZGVyIGV4Y2VwdGVkLiAqLworCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiUG9ydCByYW5nZSBgJXMnIGZ1bmt5XG4iLCBhcmcpOworCQltci0+cmFuZ2VbMF0ubWluLnRjcC5wb3J0ID0gcG9ydDsKKwkJbXItPnJhbmdlWzBdLm1heC50Y3AucG9ydCA9IG1heHBvcnQ7CisJfQorfQorCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJaW50IHBvcnRvazsKKwlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlICptcgorCQk9IChzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlICopKCp0YXJnZXQpLT5kYXRhOworCisJaWYgKGVudHJ5LT5pcC5wcm90byA9PSBJUFBST1RPX1RDUAorCSAgICB8fCBlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19VRFApCisJCXBvcnRvayA9IDE7CisJZWxzZQorCQlwb3J0b2sgPSAwOworCisJc3dpdGNoIChjKSB7CisJY2FzZSAnMSc6CisJCWlmICghcG9ydG9rKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiTmVlZCBUQ1Agb3IgVURQIHdpdGggcG9ydCBzcGVjaWZpY2F0aW9uIik7CisKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIlVuZXhwZWN0ZWQgYCEnIGFmdGVyIC0tdG8tcG9ydHMiKTsKKworCQlwYXJzZV9wb3J0cyhvcHRhcmcsIG1yKTsKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBkb24ndCBjYXJlLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworfQorCisvKiBQcmludHMgb3V0IHRoZSB0YXJnaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQsCisgICAgICBpbnQgbnVtZXJpYykKK3sKKwlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlICptcgorCQk9IChzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlICopdGFyZ2V0LT5kYXRhOworCXN0cnVjdCBpcF9uYXRfcmFuZ2UgKnIgPSAmbXItPnJhbmdlWzBdOworCisJcHJpbnRmKCJNQVNRVUVSQURFICIpOworCWlmIChyLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHsKKwkJcHJpbnRmKCIlaHUiLCByLT5taW4udGNwLnBvcnQpOworCQlpZiAoci0+bWF4LnRjcC5wb3J0ICE9IHItPm1pbi50Y3AucG9ydCkKKwkJCXByaW50ZigiLSVodSIsIHItPm1heC50Y3AucG9ydCk7CisJCXByaW50ZigiICIpOworCX0KK30KKworLyogU2F2ZXMgdGhlIHVuaW9uIGlwdF90YXJnaW5mbyBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkCitzYXZlKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yCisJCT0gKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKil0YXJnZXQtPmRhdGE7CisJc3RydWN0IGlwX25hdF9yYW5nZSAqciA9ICZtci0+cmFuZ2VbMF07CisKKwlpZiAoci0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB7CisJCXByaW50ZigiJWh1Iiwgci0+bWluLnRjcC5wb3J0KTsKKwkJaWYgKHItPm1heC50Y3AucG9ydCAhPSByLT5taW4udGNwLnBvcnQpCisJCQlwcmludGYoIi0laHUiLCByLT5tYXgudGNwLnBvcnQpOworCQlwcmludGYoIiAiKTsKKwl9Cit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgbWFzcQorPSB7IE5VTEwsCisgICAgIk1BU1FVRVJBREUiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlKSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgICZwcmludCwKKyAgICAmc2F2ZSwKKyAgICBvcHRzCit9OworCit2b2lkIF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfdGFyZ2V0KCZtYXNxKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvbGliaXB0X1JFRElSRUNULmMgYi9leHRlbnNpb25zL2xpYmlwdF9SRURJUkVDVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWZhYWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2xpYmlwdF9SRURJUkVDVC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBTaGFyZWQgbGlicmFyeSBhZGQtb24gdG8gaXB0YWJsZXMgdG8gYWRkIHJlZGlyZWN0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiUkVESVJFQ1QgdiVzIG9wdGlvbnM6XG4iCisiIC0tdG8tcG9ydHMgPHBvcnQ+Wy08cG9ydD5dXG4iCisiCQkJCVBvcnQgKHJhbmdlKSB0byBtYXAgdG8uXG5cbiIsCitORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ0by1wb3J0cyIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCXN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yID0gKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKil0LT5kYXRhOworCisJLyogQWN0dWFsbHksIGl0J3MgMCwgYnV0IGl0J3MgaWdub3JlZCBhdCB0aGUgbW9tZW50LiAqLworCW1yLT5yYW5nZXNpemUgPSAxOworCisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCisvKiBQYXJzZXMgcG9ydHMgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9wb3J0cyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yKQoreworCWNvbnN0IGNoYXIgKmRhc2g7CisJaW50IHBvcnQ7CisKKwltci0+cmFuZ2VbMF0uZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKKworCXBvcnQgPSBhdG9pKGFyZyk7CisJaWYgKHBvcnQgPT0gMCB8fCBwb3J0ID4gNjU1MzUpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJQb3J0IGAlcycgbm90IHZhbGlkXG4iLCBhcmcpOworCisJZGFzaCA9IHN0cmNocihhcmcsICctJyk7CisJaWYgKCFkYXNoKSB7CisJCW1yLT5yYW5nZVswXS5taW4udGNwLnBvcnQKKwkJCT0gbXItPnJhbmdlWzBdLm1heC50Y3AucG9ydAorCQkJPSBwb3J0OworCX0gZWxzZSB7CisJCWludCBtYXhwb3J0OworCisJCW1heHBvcnQgPSBhdG9pKGRhc2ggKyAxKTsKKwkJaWYgKG1heHBvcnQgPT0gMCB8fCBtYXhwb3J0ID4gNjU1MzUpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJQb3J0IGAlcycgbm90IHZhbGlkXG4iLCBkYXNoKzEpOworCQlpZiAobWF4cG9ydCA8IHBvcnQpCisJCQkvKiBQZW9wbGUgYXJlIHN0dXBpZC4gKi8KKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIlBvcnQgcmFuZ2UgYCVzJyBmdW5reVxuIiwgYXJnKTsKKwkJbXItPnJhbmdlWzBdLm1pbi50Y3AucG9ydCA9IHBvcnQ7CisJCW1yLT5yYW5nZVswXS5tYXgudGNwLnBvcnQgPSBtYXhwb3J0OworCX0KK30KKworLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICBhdGUgYW4gb3B0aW9uICovCitzdGF0aWMgaW50CitwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBpbnZlcnQsIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKyAgICAgIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KQoreworCXN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKm1yCisJCT0gKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2UgKikoKnRhcmdldCktPmRhdGE7CisJaW50IHBvcnRvazsKKworCWlmIChlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19UQ1AKKwkgICAgfHwgZW50cnktPmlwLnByb3RvID09IElQUFJPVE9fVURQKQorCQlwb3J0b2sgPSAxOworCWVsc2UKKwkJcG9ydG9rID0gMDsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoIXBvcnRvaykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk5lZWQgVENQIG9yIFVEUCB3aXRoIHBvcnQgc3BlY2lmaWNhdGlvbiIpOworCisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLXRvLXBvcnRzIik7CisKKwkJcGFyc2VfcG9ydHMob3B0YXJnLCBtcik7CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBGaW5hbCBjaGVjazsgZG9uJ3QgY2FyZS4gKi8KK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKK30KKworLyogUHJpbnRzIG91dCB0aGUgdGFyZ2luZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LAorICAgICAgaW50IG51bWVyaWMpCit7CisJc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSAqbXIKKwkJPSAoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSAqKXRhcmdldC0+ZGF0YTsKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyID0gJm1yLT5yYW5nZVswXTsKKworCXByaW50ZigiUkVESVJFQ1QgIik7CisJaWYgKHItPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkgeworCQlwcmludGYoIiVodSIsIHItPm1pbi50Y3AucG9ydCk7CisJCWlmIChyLT5tYXgudGNwLnBvcnQgIT0gci0+bWluLnRjcC5wb3J0KQorCQkJcHJpbnRmKCItJWh1Iiwgci0+bWF4LnRjcC5wb3J0KTsKKwkJcHJpbnRmKCIgIik7CisJfQorfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X3RhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQKK3NhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSAqbXIKKwkJPSAoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSAqKXRhcmdldC0+ZGF0YTsKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyID0gJm1yLT5yYW5nZVswXTsKKworCWlmIChyLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHsKKwkJcHJpbnRmKCIlaHUiLCByLT5taW4udGNwLnBvcnQpOworCQlpZiAoci0+bWF4LnRjcC5wb3J0ICE9IHItPm1pbi50Y3AucG9ydCkKKwkJCXByaW50ZigiLSVodSIsIHItPm1heC50Y3AucG9ydCk7CisJCXByaW50ZigiICIpOworCX0KK30KKworc3RydWN0IGlwdGFibGVzX3RhcmdldCByZWRpcgorPSB7IE5VTEwsCisgICAgIlJFRElSRUNUIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZSksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RhcmdldCgmcmVkaXIpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfUkVKRUNULmMgYi9leHRlbnNpb25zL2xpYmlwdF9SRUpFQ1QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM2NTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfUkVKRUNULmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgY3VzdG9taXplZCBSRUpFQ1Qgc3VwcG9ydC4KKyAqCisgKiAoQykgMjAwMCBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oPgorCitzdHJ1Y3QgcmVqZWN0X25hbWVzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmFsaWFzOworCWVudW0gaXB0X3JlamVjdF93aXRoIHdpdGg7CisJY29uc3QgY2hhciAqZGVzYzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVqZWN0X25hbWVzIHJlamVjdF90YWJsZVtdID0geworCXsiaWNtcC1uZXQtdW5yZWFjaGFibGUiLCAibmV0LXVucmVhY2giLCAKKwkJSVBUX0lDTVBfTkVUX1VOUkVBQ0hBQkxFLCAiSUNNUCBuZXR3b3JrIHVucmVhY2hhYmxlIn0sCisJeyJpY21wLWhvc3QtdW5yZWFjaGFibGUiLCAiaG9zdC11bnJlYWNoIiwKKwkJSVBUX0lDTVBfSE9TVF9VTlJFQUNIQUJMRSwgIklDTVAgaG9zdCB1bnJlYWNoYWJsZSJ9LAorCXsiaWNtcC1wb3J0LXVucmVhY2hhYmxlIiwgInBvcnQtdW5yZWFjaCIsCisJCUlQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEUsICJJQ01QIHBvcnQgdW5yZWFjaGFibGUgKGRlZmF1bHQpIn0sCisJeyJpY21wLXByb3RvLXVucmVhY2hhYmxlIiwgInByb3RvLXVucmVhY2giLAorCQlJUFRfSUNNUF9QUk9UX1VOUkVBQ0hBQkxFLCAiSUNNUCBwcm90b2NvbCB1bnJlYWNoYWJsZSJ9LAorCXsidGNwLXJlc2V0IiwgInJzdCIsIAorCQlJUFRfVENQX1JFU0VULCAiZm9yIFRDUCBvbmx5OiBmYWtlZCBUQ1AgUlNUIn0sCisJeyJlY2hvLXJlcGx5IiwgImVjaG9yZXBseSIsCisJCUlQVF9JQ01QX0VDSE9SRVBMWSwgImZvciBJQ01QIGVjaG8gb25seTogZmFrZWQgSUNNUCBlY2hvIHJlcGx5In0sCit9OworCitzdGF0aWMgdm9pZCAKK3ByaW50X3JlamVjdF90eXBlcygpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJcHJpbnRmKCJWYWxpZCByZWplY3QgdHlwZXM6XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmVqZWN0X3RhYmxlKS9zaXplb2Yoc3RydWN0IHJlamVjdF9uYW1lcyk7IGkrKykgeworCQlwcmludGYoIiAgICAlLTI1c1x0JXNcbiIsIHJlamVjdF90YWJsZVtpXS5uYW1lLCByZWplY3RfdGFibGVbaV0uZGVzYyk7CisJCXByaW50ZigiICAgICUtMjVzXHRhbGlhc1xuIiwgcmVqZWN0X3RhYmxlW2ldLmFsaWFzKTsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X3RhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworCisvKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCitzdGF0aWMgdm9pZCAKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiUkVKRUNUIG9wdGlvbnM6XG4iCisiLS1yZWplY3Qtd2l0aCB0eXBlICAgICAgICAgICAgICBkcm9wIGlucHV0IHBhY2tldCBhbmQgc2VuZCBiYWNrXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJlcGx5IHBhY2tldCBhY2NvcmRpbmcgdG8gdHlwZTpcbiIpOworCisJcHJpbnRfcmVqZWN0X3R5cGVzKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJyZWplY3Qtd2l0aCIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0LiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQsIHVuc2lnbmVkIGludCAqbmZjYWNoZSkKK3sKKwlzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICpyZWplY3QgPSAoc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqKXQtPmRhdGE7CisJCisJLyogZGVmYXVsdCAqLworCXJlamVjdC0+d2l0aCA9IElQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEU7CisJCisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CQorCXN0cnVjdCBpcHRfcmVqZWN0X2luZm8gKnJlamVjdCA9IChzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICopKCp0YXJnZXQpLT5kYXRhOworCXVuc2lnbmVkIGludCBsaW1pdCA9IHNpemVvZihyZWplY3RfdGFibGUpL3NpemVvZihzdHJ1Y3QgcmVqZWN0X25hbWVzKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwkJCisJc3dpdGNoKGMpIHsKKwljYXNlICcxJzoKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sIAorCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLXJlamVjdC13aXRoIik7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7CisJCQlpZiAoKHN0cm5jYXNlY21wKHJlamVjdF90YWJsZVtpXS5uYW1lLCBvcHRhcmcsIHN0cmxlbihvcHRhcmcpKSA9PSAwKQorCQkJICAgIHx8IChzdHJuY2FzZWNtcChyZWplY3RfdGFibGVbaV0uYWxpYXMsIG9wdGFyZywgc3RybGVuKG9wdGFyZykpID09IDApKSB7CisJCQkJcmVqZWN0LT53aXRoID0gcmVqZWN0X3RhYmxlW2ldLndpdGg7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgInVua25vd24gcmVqZWN0IHR5cGUgYCVzJyIsb3B0YXJnKTsKKwlkZWZhdWx0OgorCQkvKiBGYWxsIHRocm91Z2ggKi8KKwl9CisJcmV0dXJuIDA7Cit9CQorCisvKiBGaW5hbCBjaGVjazsgbm90aGluZy4gKi8KK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKK30KKworLyogUHJpbnRzIG91dCBpcHRfcmVqZWN0X2luZm8uICovCitzdGF0aWMgdm9pZCAKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCwgCisgICAgICBpbnQgbnVtZXJpYykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICpyZWplY3QgCisJCT0gKGNvbnN0IHN0cnVjdCBpcHRfcmVqZWN0X2luZm8gKil0YXJnZXQtPmRhdGE7CisJdW5zaWduZWQgaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyZWplY3RfdGFibGUpL3NpemVvZihzdHJ1Y3QgcmVqZWN0X25hbWVzKTsgaSsrKSB7CisJCWlmIChyZWplY3RfdGFibGVbaV0ud2l0aCA9PSByZWplY3QtPndpdGgpCisJCQlicmVhazsKKwl9CisJcHJpbnRmKCJyZWplY3Qtd2l0aCAlcyAiLCByZWplY3RfdGFibGVbaV0ubmFtZSk7Cit9CisKKy8qIFNhdmVzIGlwdF9yZWplY3QgaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCitzdGF0aWMgdm9pZCBzYXZlKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCWNvbnN0IHN0cnVjdCBpcHRfcmVqZWN0X2luZm8gKnJlamVjdCAKKwkJPSAoY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKwkKKwlwcmludGYoIi0tcmVqZWN0LXdpdGggJXMgIiwgcmVqZWN0X3RhYmxlW3JlamVjdC0+d2l0aF0ubmFtZSk7Cit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgcmVqZWN0Cis9IHsgTlVMTCwKKyAgICAiUkVKRUNUIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF9yZWplY3RfaW5mbyksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RhcmdldCgmcmVqZWN0KTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvbGliaXB0X1NOQVQuYyBiL2V4dGVuc2lvbnMvbGliaXB0X1NOQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJhMzliCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfU05BVC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBTaGFyZWQgbGlicmFyeSBhZGQtb24gdG8gaXB0YWJsZXMgdG8gYWRkIHNvdXJjZS1OQVQgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorCisvKiBTb3VyY2UgTkFUIGRhdGEgY29uc2lzdHMgb2YgYSBtdWx0aS1yYW5nZSwgaW5kaWNhdGluZyB3aGVyZSB0byBtYXAKKyAgIHRvLiAqLworc3RydWN0IGlwdF9uYXRpbmZvCit7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgdDsKKwlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlIG1yOworfTsKKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiU05BVCB2JXMgb3B0aW9uczpcbiIKKyIgLS10by1zb3VyY2UgPGlwYWRkcj5bLTxpcGFkZHI+XVs6cG9ydC1wb3J0XVxuIgorIgkJCQlBZGRyZXNzIHRvIG1hcCBzb3VyY2UgdG8uXG4iCisiCQkJCShZb3UgY2FuIHVzZSB0aGlzIG1vcmUgdGhhbiBvbmNlKVxuXG4iLAorTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAidG8tc291cmNlIiwgMSwgMCwgJzEnIH0sCisJeyAwIH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIHRhcmdldC4gKi8KK3N0YXRpYyB2b2lkCitpbml0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCit7CisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9uYXRpbmZvICoKK2FwcGVuZF9yYW5nZShzdHJ1Y3QgaXB0X25hdGluZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQoreworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogT25lIHJhbmdlc2l6ZSBhbHJlYWR5IGluIHN0cnVjdCBpcHRfbmF0aW5mbyAqLworCXNpemUgPSBJUFRfQUxJR04oc2l6ZW9mKCppbmZvKSArIGluZm8tPm1yLnJhbmdlc2l6ZSAqIHNpemVvZigqcmFuZ2UpKTsKKworCWluZm8gPSByZWFsbG9jKGluZm8sIHNpemUpOworCWlmICghaW5mbykKKwkJZXhpdF9lcnJvcihPVEhFUl9QUk9CTEVNLCAiT3V0IG9mIG1lbW9yeVxuIik7CisKKwlpbmZvLT50LnRhcmdldF9zaXplID0gc2l6ZTsKKwlpbmZvLT5tci5yYW5nZVtpbmZvLT5tci5yYW5nZXNpemVdID0gKnJhbmdlOworCWluZm8tPm1yLnJhbmdlc2l6ZSsrOworCisJcmV0dXJuIGluZm87Cit9CisKKy8qIFJhbmdlcyBleHBlY3RlZCBpbiBuZXR3b3JrIG9yZGVyLiAqLworc3RhdGljIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoKK3BhcnNlX3RvKGNoYXIgKmFyZywgaW50IHBvcnRvaywgc3RydWN0IGlwdF9uYXRpbmZvICppbmZvKQoreworCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7CisJY2hhciAqY29sb24sICpkYXNoOworCXN0cnVjdCBpbl9hZGRyICppcDsKKworCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOworCWNvbG9uID0gc3RyY2hyKGFyZywgJzonKTsKKworCWlmIChjb2xvbikgeworCQlpbnQgcG9ydDsKKworCQlpZiAoIXBvcnRvaykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk5lZWQgVENQIG9yIFVEUCB3aXRoIHBvcnQgc3BlY2lmaWNhdGlvbiIpOworCisJCXJhbmdlLmZsYWdzIHw9IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQ7CisKKwkJcG9ydCA9IGF0b2koY29sb24rMSk7CisJCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IDY1NTM1KQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiUG9ydCBgJXMnIG5vdCB2YWxpZFxuIiwgY29sb24rMSk7CisKKwkJZGFzaCA9IHN0cmNocihjb2xvbiwgJy0nKTsKKwkJaWYgKCFkYXNoKSB7CisJCQlyYW5nZS5taW4udGNwLnBvcnQKKwkJCQk9IHJhbmdlLm1heC50Y3AucG9ydAorCQkJCT0gaHRvbnMocG9ydCk7CisJCX0gZWxzZSB7CisJCQlpbnQgbWF4cG9ydDsKKworCQkJbWF4cG9ydCA9IGF0b2koZGFzaCArIDEpOworCQkJaWYgKG1heHBvcnQgPT0gMCB8fCBtYXhwb3J0ID4gNjU1MzUpCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIlBvcnQgYCVzJyBub3QgdmFsaWRcbiIsIGRhc2grMSk7CisJCQlpZiAobWF4cG9ydCA8IHBvcnQpCisJCQkJLyogUGVvcGxlIGFyZSBzdHVwaWQuICovCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIlBvcnQgcmFuZ2UgYCVzJyBmdW5reVxuIiwgY29sb24rMSk7CisJCQlyYW5nZS5taW4udGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKKwkJCXJhbmdlLm1heC50Y3AucG9ydCA9IGh0b25zKG1heHBvcnQpOworCQl9CisJCS8qIFN0YXJ0cyB3aXRoIGEgY29sb24/IE5vIElQIGluZm8uLi4qLworCQlpZiAoY29sb24gPT0gYXJnKQorCQkJcmV0dXJuICYoYXBwZW5kX3JhbmdlKGluZm8sICZyYW5nZSktPnQpOworCQkqY29sb24gPSAnXDAnOworCX0KKworCXJhbmdlLmZsYWdzIHw9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCWRhc2ggPSBzdHJjaHIoYXJnLCAnLScpOworCWlmIChjb2xvbiAmJiBkYXNoICYmIGRhc2ggPiBjb2xvbikKKwkJZGFzaCA9IE5VTEw7CisKKwlpZiAoZGFzaCkKKwkJKmRhc2ggPSAnXDAnOworCisJaXAgPSBkb3R0ZWRfdG9fYWRkcihhcmcpOworCWlmICghaXApCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJCYWQgSVAgYWRkcmVzcyBgJXMnXG4iLAorCQkJICAgYXJnKTsKKwlyYW5nZS5taW5faXAgPSBpcC0+c19hZGRyOworCWlmIChkYXNoKSB7CisJCWlwID0gZG90dGVkX3RvX2FkZHIoZGFzaCsxKTsKKwkJaWYgKCFpcCkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJCYWQgSVAgYWRkcmVzcyBgJXMnXG4iLAorCQkJCSAgIGRhc2grMSk7CisJCXJhbmdlLm1heF9pcCA9IGlwLT5zX2FkZHI7CisJfSBlbHNlCisJCXJhbmdlLm1heF9pcCA9IHJhbmdlLm1pbl9pcDsKKworCXJldHVybiAmKGFwcGVuZF9yYW5nZShpbmZvLCAmcmFuZ2UpLT50KTsKK30KKworLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICBhdGUgYW4gb3B0aW9uICovCitzdGF0aWMgaW50CitwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBpbnZlcnQsIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKyAgICAgIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KQoreworCXN0cnVjdCBpcHRfbmF0aW5mbyAqaW5mbyA9ICh2b2lkICopKnRhcmdldDsKKwlpbnQgcG9ydG9rOworCisJaWYgKGVudHJ5LT5pcC5wcm90byA9PSBJUFBST1RPX1RDUAorCSAgICB8fCBlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19VRFApCisJCXBvcnRvayA9IDE7CisJZWxzZQorCQlwb3J0b2sgPSAwOworCisJc3dpdGNoIChjKSB7CisJY2FzZSAnMSc6CisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLXRvLXNvdXJjZSIpOworCisJCSp0YXJnZXQgPSBwYXJzZV90byhvcHRhcmcsIHBvcnRvaywgaW5mbyk7CisJCSpmbGFncyA9IDE7CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBGaW5hbCBjaGVjazsgbXVzdCBoYXZlIHNwZWNmaWVkIC0tdG8tc291cmNlLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghZmxhZ3MpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkgICAiWW91IG11c3Qgc3BlY2lmeSAtLXRvLXNvdXJjZSIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yYW5nZShjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyKQoreworCWlmIChyLT5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJCXN0cnVjdCBpbl9hZGRyIGE7CisKKwkJYS5zX2FkZHIgPSByLT5taW5faXA7CisJCXByaW50ZigiJXMiLCBhZGRyX3RvX2RvdHRlZCgmYSkpOworCQlpZiAoci0+bWF4X2lwICE9IHItPm1pbl9pcCkgeworCQkJYS5zX2FkZHIgPSByLT5tYXhfaXA7CisJCQlwcmludGYoIi0lcyIsIGFkZHJfdG9fZG90dGVkKCZhKSk7CisJCX0KKwl9CisJaWYgKHItPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkgeworCQlwcmludGYoIjoiKTsKKwkJcHJpbnRmKCIlaHUiLCBudG9ocyhyLT5taW4udGNwLnBvcnQpKTsKKwkJaWYgKHItPm1heC50Y3AucG9ydCAhPSByLT5taW4udGNwLnBvcnQpCisJCQlwcmludGYoIi0laHUiLCBudG9ocyhyLT5tYXgudGNwLnBvcnQpKTsKKwl9Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIHRhcmdpbmZvLiAqLworc3RhdGljIHZvaWQKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCwKKyAgICAgIGludCBudW1lcmljKQoreworCXN0cnVjdCBpcHRfbmF0aW5mbyAqaW5mbyA9ICh2b2lkICopdGFyZ2V0OworCXVuc2lnbmVkIGludCBpID0gMDsKKworCXByaW50ZigidG86Iik7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPm1yLnJhbmdlc2l6ZTsgaSsrKSB7CisJCXByaW50X3JhbmdlKCZpbmZvLT5tci5yYW5nZVtpXSk7CisJCXByaW50ZigiICIpOworCX0KK30KKworLyogU2F2ZXMgdGhlIHVuaW9uIGlwdF90YXJnaW5mbyBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkCitzYXZlKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBpcHRfbmF0aW5mbyAqaW5mbyA9ICh2b2lkICopdGFyZ2V0OworCXVuc2lnbmVkIGludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5tci5yYW5nZXNpemU7IGkrKykgeworCQlwcmludGYoIi0tdG8tc291cmNlICIpOworCQlwcmludF9yYW5nZSgmaW5mby0+bXIucmFuZ2VbaV0pOworCQlwcmludGYoIiAiKTsKKwl9Cit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgc25hdAorPSB7IE5VTEwsCisgICAgIlNOQVQiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlKSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgICZwcmludCwKKyAgICAmc2F2ZSwKKyAgICBvcHRzCit9OworCit2b2lkIF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfdGFyZ2V0KCZzbmF0KTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvbGliaXB0X1RPUy5jIGIvZXh0ZW5zaW9ucy9saWJpcHRfVE9TLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4ZTkxYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X1RPUy5jCkBAIC0wLDAgKzEsMTczIEBACisvKiBTaGFyZWQgbGlicmFyeSBhZGQtb24gdG8gaXB0YWJsZXMgdG8gYWRkIFRPUyB0YXJnZXQgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVE9TLmg+CisKK3N0cnVjdCB0b3NpbmZvIHsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCB0OworCXN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvIHRvczsKK307CisKKy8qIFRPUyBuYW1lcyBhbmQgdmFsdWVzLiAqLworc3RydWN0IFRPU192YWx1ZQoreworCXVuc2lnbmVkIGNoYXIgVE9TOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IFRPU192YWx1ZXNbXSA9IHsKKwl7IElQVE9TX0xPV0RFTEFZLCAgICAiTWluaW1pemUtRGVsYXkiIH0sCisJeyBJUFRPU19USFJPVUdIUFVULCAgIk1heGltaXplLVRocm91Z2hwdXQiIH0sCisJeyBJUFRPU19SRUxJQUJJTElUWSwgIk1heGltaXplLVJlbGlhYmlsaXR5IiB9LAorCXsgSVBUT1NfTUlOQ09TVCwgICAgICJNaW5pbWl6ZS1Db3N0IiB9LAorCXsgSVBUT1NfTk9STUFMU1ZDLCAgICJOb3JtYWwtU2VydmljZSIgfSwKK307CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJcHJpbnRmKAorIlRPUyB0YXJnZXQgdiVzIG9wdGlvbnM6XG4iCisiICAtLXNldC10b3MgdmFsdWUgICAgICAgICAgICAgICAgICAgU2V0IFR5cGUgb2YgU2VydmljZSBmaWVsZCB0byBvbmUgb2YgdGhlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgbnVtZXJpYyBvciBkZXNjcmlwdGl2ZSB2YWx1ZXM6XG4iLAorTkVURklMVEVSX1ZFUlNJT04pOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihUT1NfdmFsdWVzKS9zaXplb2Yoc3RydWN0IFRPU192YWx1ZSk7aSsrKQorCQlwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlcyAldSAoMHglMDJ4KVxuIiwKKwkJICAgICAgIFRPU192YWx1ZXNbaV0ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgVE9TX3ZhbHVlc1tpXS5UT1MsCisgICAgICAgICAgICAgICAgICAgICAgIFRPU192YWx1ZXNbaV0uVE9TKTsKKwlmcHV0YygnXG4nLCBzdGRvdXQpOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAic2V0LXRvcyIsIDEsIDAsICcxJyB9LAorCXsgMCB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfdG9zKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIHN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCWludCB0b3MgPSBzdHJpbmdfdG9fbnVtYmVyKHMsIDAsIDI1NSk7CisKKwlpZiAodG9zICE9IC0xKSB7CisJCWlmICh0b3MgPT0gSVBUT1NfTE9XREVMQVkKKwkJICAgIHx8IHRvcyA9PSBJUFRPU19USFJPVUdIUFVUCisJCSAgICB8fCB0b3MgPT0gSVBUT1NfUkVMSUFCSUxJVFkKKwkJICAgIHx8IHRvcyA9PSBJUFRPU19NSU5DT1NUCisJCSAgICB8fCB0b3MgPT0gSVBUT1NfTk9STUFMU1ZDKSB7CisJCSAgICAJaW5mby0+dG9zID0gKHVfaW50OF90ICl0b3M7CisJCSAgICAJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaTxzaXplb2YoVE9TX3ZhbHVlcykvc2l6ZW9mKHN0cnVjdCBUT1NfdmFsdWUpOyBpKyspCisJCQlpZiAoc3RyY2FzZWNtcChzLFRPU192YWx1ZXNbaV0ubmFtZSkgPT0gMCkgeworCQkJCWluZm8tPnRvcyA9IFRPU192YWx1ZXNbaV0uVE9TOworCQkJCXJldHVybjsKKwkJCX0KKwl9CisJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIkJhZCBUT1MgdmFsdWUgYCVzJyIsIHMpOworfQorCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKnRvc2luZm8KKwkJPSAoc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKikoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcxJzoKKwkJaWYgKCpmbGFncykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkgICAgICAgICAgICJUT1MgdGFyZ2V0OiBDYW50IHNwZWNpZnkgLS1zZXQtdG9zIHR3aWNlIik7CisJCXBhcnNlX3RvcyhvcHRhcmcsIHRvc2luZm8pOworCQkqZmxhZ3MgPSAxOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJICAgICAgICAgICAiVE9TIHRhcmdldDogUGFyYW1ldGVyIC0tc2V0LXRvcyBpcyByZXF1aXJlZCIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdG9zKHVfaW50OF90IHRvcywgaW50IG51bWVyaWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJaWYgKCFudW1lcmljKSB7CisJCWZvciAoaSA9IDA7IGk8c2l6ZW9mKFRPU192YWx1ZXMpL3NpemVvZihzdHJ1Y3QgVE9TX3ZhbHVlKTsgaSsrKQorCQkJaWYgKFRPU192YWx1ZXNbaV0uVE9TID09IHRvcykgeworCQkJCXByaW50ZigiJXMgIiwgVE9TX3ZhbHVlc1tpXS5uYW1lKTsKKwkJCQlyZXR1cm47CisJCQl9CisJfQorCXByaW50ZigiMHglMDJ4ICIsIHRvcyk7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIHRhcmdpbmZvLiAqLworc3RhdGljIHZvaWQKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCwKKyAgICAgIGludCBudW1lcmljKQoreworCWNvbnN0IHN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvICp0b3NpbmZvID0KKwkJKGNvbnN0IHN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvICopdGFyZ2V0LT5kYXRhOworCXByaW50ZigiVE9TIHNldCAiKTsKKwlwcmludF90b3ModG9zaW5mby0+dG9zLCBudW1lcmljKTsJCit9CisKKy8qIFNhdmVzIHRoZSB1bmlvbiBpcHRfdGFyZ2luZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCitzdGF0aWMgdm9pZAorc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqdG9zaW5mbyA9CisJCShjb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKwkKKwlwcmludGYoIi0tc2V0LXRvcyAweCUwMnggIiwgdG9zaW5mby0+dG9zKTsJCit9CisKK3N0cnVjdCBpcHRhYmxlc190YXJnZXQgdG9zCis9IHsgTlVMTCwKKyAgICAiVE9TIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8pLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl90YXJnZXQoJnRvcyk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2xpYmlwdF9pY21wLmMgYi9leHRlbnNpb25zL2xpYmlwdF9pY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4NTdjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X2ljbXAuYwpAQCAtMCwwICsxLDI5NSBAQAorLyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBJQ01QIHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK3N0cnVjdCBpY21wX25hbWVzIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVfaW50OF90IHR5cGU7CisJdV9pbnQ4X3QgY29kZV9taW4sIGNvZGVfbWF4OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpY21wX25hbWVzIGljbXBfY29kZXNbXSA9IHsKKwl7ICJlY2hvLXJlcGx5IiwgMCwgMCwgMHhGRiB9LAorCS8qIEFsaWFzICovIHsgInBvbmciLCAwLCAwLCAweEZGIH0sCisKKwl7ICJkZXN0aW5hdGlvbi11bnJlYWNoYWJsZSIsIDMsIDAsIDB4RkYgfSwKKwl7ICAgIm5ldHdvcmstdW5yZWFjaGFibGUiLCAzLCAwLCAwIH0sCisJeyAgICJob3N0LXVucmVhY2hhYmxlIiwgMywgMSwgMSB9LAorCXsgICAicHJvdG9jb2wtdW5yZWFjaGFibGUiLCAzLCAyLCAyIH0sCisJeyAgICJwb3J0LXVucmVhY2hhYmxlIiwgMywgMywgMyB9LAorCXsgICAiZnJhZ21lbnRhdGlvbi1uZWVkZWQiLCAzLCA0LCA0IH0sCisJeyAgICJzb3VyY2Utcm91dGUtZmFpbGVkIiwgMywgNSwgNSB9LAorCXsgICAibmV0d29yay11bmtub3duIiwgMywgNiwgNiB9LAorCXsgICAiaG9zdC11bmtub3duIiwgMywgNywgNyB9LAorCXsgICAibmV0d29yay1wcm9oaWJpdGVkIiwgMywgOSwgOSB9LAorCXsgICAiaG9zdC1wcm9oaWJpdGVkIiwgMywgMTAsIDEwIH0sCisJeyAgICJUT1MtbmV0d29yay11bnJlYWNoYWJsZSIsIDMsIDExLCAxMSB9LAorCXsgICAiVE9TLWhvc3QtdW5yZWFjaGFibGUiLCAzLCAxMiwgMTIgfSwKKwl7ICAgImNvbW11bmljYXRpb24tcHJvaGliaXRlZCIsIDMsIDEzLCAxMyB9LAorCXsgICAiaG9zdC1wcmVjZWRlbmNlLXZpb2xhdGlvbiIsIDMsIDE0LCAxNCB9LAorCXsgICAicHJlY2VkZW5jZS1jdXRvZmYiLCAzLCAxNSwgMTUgfSwKKworCXsgInNvdXJjZS1xdWVuY2giLCA0LCAwLCAweEZGIH0sCisKKwl7ICJyZWRpcmVjdCIsIDUsIDAsIDB4RkYgfSwKKwl7ICAgIm5ldHdvcmstcmVkaXJlY3QiLCA1LCAwLCAwIH0sCisJeyAgICJob3N0LXJlZGlyZWN0IiwgNSwgMSwgMSB9LAorCXsgICAiVE9TLW5ldHdvcmstcmVkaXJlY3QiLCA1LCAyLCAyIH0sCisJeyAgICJUT1MtaG9zdC1yZWRpcmVjdCIsIDUsIDMsIDMgfSwKKworCXsgImVjaG8tcmVxdWVzdCIsIDgsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJwaW5nIiwgOCwgMCwgMHhGRiB9LAorCisJeyAicm91dGVyLWFkdmVydGlzZW1lbnQiLCA5LCAwLCAweEZGIH0sCisKKwl7ICJyb3V0ZXItc29saWNpdGF0aW9uIiwgMTAsIDAsIDB4RkYgfSwKKworCXsgInRpbWUtZXhjZWVkZWQiLCAxMSwgMCwgMHhGRiB9LAorCS8qIEFsaWFzICovIHsgInR0bC1leGNlZWRlZCIsIDExLCAwLCAweEZGIH0sCisJeyAgICJ0dGwtemVyby1kdXJpbmctdHJhbnNpdCIsIDExLCAwLCAwIH0sCisJeyAgICJ0dGwtemVyby1kdXJpbmctcmVhc3NlbWJseSIsIDExLCAxLCAxIH0sCisKKwl7ICJwYXJhbWV0ZXItcHJvYmxlbSIsIDEyLCAwLCAweEZGIH0sCisJeyAgICJpcC1oZWFkZXItYmFkIiwgMTIsIDAsIDAgfSwKKwl7ICAgInJlcXVpcmVkLW9wdGlvbi1taXNzaW5nIiwgMTIsIDEsIDEgfSwKKworCXsgInRpbWVzdGFtcC1yZXF1ZXN0IiwgMTMsIDAsIDB4RkYgfSwKKworCXsgInRpbWVzdGFtcC1yZXBseSIsIDE0LCAwLCAweEZGIH0sCisKKwl7ICJhZGRyZXNzLW1hc2stcmVxdWVzdCIsIDE3LCAwLCAweEZGIH0sCisKKwl7ICJhZGRyZXNzLW1hc2stcmVwbHkiLCAxOCwgMCwgMHhGRiB9Cit9OworCitzdGF0aWMgdm9pZAorcHJpbnRfaWNtcHR5cGVzKCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlwcmludGYoIlZhbGlkIElDTVAgVHlwZXM6Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGljbXBfY29kZXMpL3NpemVvZihzdHJ1Y3QgaWNtcF9uYW1lcyk7IGkrKykgeworCQlpZiAoaSAmJiBpY21wX2NvZGVzW2ldLnR5cGUgPT0gaWNtcF9jb2Rlc1tpLTFdLnR5cGUpIHsKKwkJCWlmIChpY21wX2NvZGVzW2ldLmNvZGVfbWluID09IGljbXBfY29kZXNbaS0xXS5jb2RlX21pbgorCQkJICAgICYmIChpY21wX2NvZGVzW2ldLmNvZGVfbWF4CisJCQkJPT0gaWNtcF9jb2Rlc1tpLTFdLmNvZGVfbWF4KSkKKwkJCQlwcmludGYoIiAoJXMpIiwgaWNtcF9jb2Rlc1tpXS5uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIlxuICAgJXMiLCBpY21wX2NvZGVzW2ldLm5hbWUpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiXG4lcyIsIGljbXBfY29kZXNbaV0ubmFtZSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiSUNNUCB2JXMgb3B0aW9uczpcbiIKKyIgLS1pY21wLXR5cGUgWyFdIHR5cGVuYW1lCW1hdGNoIGljbXAgdHlwZVxuIgorIgkJCQkob3IgbnVtZXJpYyB0eXBlIG9yIHR5cGUvY29kZSlcbiIKKyJcbiIsIE5FVEZJTFRFUl9WRVJTSU9OKTsKKwlwcmludF9pY21wdHlwZXMoKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworCXsgImljbXAtdHlwZSIsIDEsIDAsICcxJyB9LAorCXswfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludAorcGFyc2VfaWNtcChjb25zdCBjaGFyICppY21wdHlwZSwgdV9pbnQ4X3QgKnR5cGUsIHVfaW50OF90IGNvZGVbXSkKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQgPSBzaXplb2YoaWNtcF9jb2Rlcykvc2l6ZW9mKHN0cnVjdCBpY21wX25hbWVzKTsKKwl1bnNpZ25lZCBpbnQgbWF0Y2ggPSBsaW1pdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7CisJCWlmIChzdHJuY2FzZWNtcChpY21wX2NvZGVzW2ldLm5hbWUsIGljbXB0eXBlLCBzdHJsZW4oaWNtcHR5cGUpKQorCQkgICAgPT0gMCkgeworCQkJaWYgKG1hdGNoICE9IGxpbWl0KQorCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJBbWJpZ3VvdXMgSUNNUCB0eXBlIGAlcyc6IgorCQkJCQkgICAiIGAlcycgb3IgYCVzJz8iLAorCQkJCQkgICBpY21wdHlwZSwKKwkJCQkJICAgaWNtcF9jb2Rlc1ttYXRjaF0ubmFtZSwKKwkJCQkJICAgaWNtcF9jb2Rlc1tpXS5uYW1lKTsKKwkJCW1hdGNoID0gaTsKKwkJfQorCX0KKworCWlmIChtYXRjaCAhPSBsaW1pdCkgeworCQkqdHlwZSA9IGljbXBfY29kZXNbbWF0Y2hdLnR5cGU7CisJCWNvZGVbMF0gPSBpY21wX2NvZGVzW21hdGNoXS5jb2RlX21pbjsKKwkJY29kZVsxXSA9IGljbXBfY29kZXNbbWF0Y2hdLmNvZGVfbWF4OworCX0gZWxzZSB7CisJCWNoYXIgKnNsYXNoOworCQljaGFyIGJ1ZmZlcltzdHJsZW4oaWNtcHR5cGUpICsgMV07CisJCWludCBudW1iZXI7CisKKwkJc3RyY3B5KGJ1ZmZlciwgaWNtcHR5cGUpOworCQlzbGFzaCA9IHN0cmNocihidWZmZXIsICcvJyk7CisKKwkJaWYgKHNsYXNoKQorCQkJKnNsYXNoID0gJ1wwJzsKKworCQludW1iZXIgPSBzdHJpbmdfdG9fbnVtYmVyKGJ1ZmZlciwgMCwgMjU1KTsKKwkJaWYgKG51bWJlciA9PSAtMSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIkludmFsaWQgSUNNUCB0eXBlIGAlcydcbiIsIGJ1ZmZlcik7CisJCSp0eXBlID0gbnVtYmVyOworCQlpZiAoc2xhc2gpIHsKKwkJCW51bWJlciA9IHN0cmluZ190b19udW1iZXIoc2xhc2grMSwgMCwgMjU1KTsKKwkJCWlmIChudW1iZXIgPT0gLTEpCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIkludmFsaWQgSUNNUCBjb2RlIGAlcydcbiIsCisJCQkJCSAgIHNsYXNoKzEpOworCQkJY29kZVswXSA9IGNvZGVbMV0gPSBudW1iZXI7CisJCX0gZWxzZSB7CisJCQljb2RlWzBdID0gMDsKKwkJCWNvZGVbMV0gPSAweEZGOworCQl9CisJfQorCisJaWYgKGNvZGVbMF0gPT0gMCAmJiBjb2RlWzFdID09IDB4RkYpCisJCXJldHVybiBORkNfSVBfU1JDX1BUOworCWVsc2UgcmV0dXJuIE5GQ19JUF9TUkNfUFQgfCBORkNfSVBfRFNUX1BUOworfQorCisvKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8KK3N0YXRpYyB2b2lkCitpbml0KHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqbmZjYWNoZSkKK3sKKwlzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gKHN0cnVjdCBpcHRfaWNtcCAqKW0tPmRhdGE7CisKKwlpY21waW5mby0+Y29kZVsxXSA9IDB4RkY7Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9pY21wICppY21waW5mbyA9IChzdHJ1Y3QgaXB0X2ljbXAgKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisJCSpuZmNhY2hlIHw9IHBhcnNlX2ljbXAoYXJndltvcHRpbmQtMV0sCisJCQkJICAgICAgICZpY21waW5mby0+dHlwZSwKKwkJCQkgICAgICAgaWNtcGluZm8tPmNvZGUpOworCQlpZiAoaW52ZXJ0KQorCQkJaWNtcGluZm8tPmludmZsYWdzIHw9IElQVF9JQ01QX0lOVjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaWNtcHR5cGUodV9pbnQ4X3QgdHlwZSwKKwkJCSAgIHVfaW50OF90IGNvZGVfbWluLCB1X2ludDhfdCBjb2RlX21heCwKKwkJCSAgIGludCBpbnZlcnQsCisJCQkgICBpbnQgbnVtZXJpYykKK3sKKwlpZiAoIW51bWVyaWMpIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgc2l6ZW9mKGljbXBfY29kZXMpL3NpemVvZihzdHJ1Y3QgaWNtcF9uYW1lcyk7CisJCSAgICAgaSsrKSB7CisJCQlpZiAoaWNtcF9jb2Rlc1tpXS50eXBlID09IHR5cGUKKwkJCSAgICAmJiBpY21wX2NvZGVzW2ldLmNvZGVfbWluID09IGNvZGVfbWluCisJCQkgICAgJiYgaWNtcF9jb2Rlc1tpXS5jb2RlX21heCA9PSBjb2RlX21heCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpICE9IHNpemVvZihpY21wX2NvZGVzKS9zaXplb2Yoc3RydWN0IGljbXBfbmFtZXMpKSB7CisJCQlwcmludGYoIiVzJXMgIiwKKwkJCSAgICAgICBpbnZlcnQgPyAiISIgOiAiIiwKKwkJCSAgICAgICBpY21wX2NvZGVzW2ldLm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGludmVydCkKKwkJcHJpbnRmKCIhIik7CisKKwlwcmludGYoInR5cGUgJXUiLCB0eXBlKTsKKwlpZiAoY29kZV9taW4gPT0gMCAmJiBjb2RlX21heCA9PSAweEZGKQorCQlwcmludGYoIiAiKTsKKwllbHNlIGlmIChjb2RlX21pbiA9PSBjb2RlX21heCkKKwkJcHJpbnRmKCIgY29kZSAldSAiLCBjb2RlX21pbik7CisJZWxzZQorCQlwcmludGYoIiBjb2RlcyAldS0ldSAiLCBjb2RlX21pbiwgY29kZV9tYXgpOworfQorCisvKiBQcmludHMgb3V0IHRoZSB1bmlvbiBpcHRfbWF0Y2hpbmZvLiAqLworc3RhdGljIHZvaWQKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gsCisgICAgICBpbnQgbnVtZXJpYykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXAgPSAoc3RydWN0IGlwdF9pY21wICopbWF0Y2gtPmRhdGE7CisKKwlwcmludGYoImljbXAgIik7CisJcHJpbnRfaWNtcHR5cGUoaWNtcC0+dHlwZSwgaWNtcC0+Y29kZVswXSwgaWNtcC0+Y29kZVsxXSwKKwkJICAgICAgIGljbXAtPmludmZsYWdzICYgSVBUX0lDTVBfSU5WLAorCQkgICAgICAgbnVtZXJpYyk7CisKKwlpZiAoaWNtcC0+aW52ZmxhZ3MgJiB+SVBUX0lDTVBfSU5WKQorCQlwcmludGYoIlVua25vd24gaW52ZmxhZ3M6IDB4JVggIiwKKwkJICAgICAgIGljbXAtPmludmZsYWdzICYgfklQVF9JQ01QX0lOVik7Cit9CisKKy8qIFNhdmVzIHRoZSBtYXRjaCBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkIHNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaWNtcCAqaWNtcCA9IChzdHJ1Y3QgaXB0X2ljbXAgKiltYXRjaC0+ZGF0YTsKKworCWlmIChpY21wLT5pbnZmbGFncyAmIElQVF9JQ01QX0lOVikKKwkJcHJpbnRmKCIhICIpOworCisJcHJpbnRmKCItLWljbXAtdHlwZSAldSIsIGljbXAtPnR5cGUpOworCWlmIChpY21wLT5jb2RlWzBdICE9IDAgfHwgaWNtcC0+Y29kZVsxXSAhPSAweEZGKQorCQlwcmludGYoIi8ldSIsIGljbXAtPmNvZGVbMF0pOworCXByaW50ZigiICIpOworfQorCisvKiBGaW5hbCBjaGVjazsgd2UgZG9uJ3QgY2FyZS4gKi8KK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKK30KKworc3RydWN0IGlwdGFibGVzX21hdGNoIGljbXAKKz0geyBOVUxMLAorICAgICJpY21wIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF9pY21wKSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgICZwcmludCwKKyAgICAmc2F2ZSwKKyAgICBvcHRzCit9OworCit2b2lkIF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfbWF0Y2goJmljbXApOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfbGltaXQuYyBiL2V4dGVuc2lvbnMvbGliaXB0X2xpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkNjMwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X2xpbWl0LmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgbGltaXQgc3VwcG9ydC4KKyAqCisgKiBK6XL0bWUgZGUgVml2aWUgICA8ZGV2aXZpZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgorICogSGVydukgRXljaGVubmUgICA8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaD4KKworI2RlZmluZSBJUFRfTElNSVRfQVZHCSIzL2hvdXIiCisjZGVmaW5lIElQVF9MSU1JVF9CVVJTVAk1CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorImxpbWl0IHYlcyBvcHRpb25zOlxuIgorIi0tbGltaXQgYXZnCQkJbWF4IGF2ZXJhZ2UgbWF0Y2ggcmF0ZTogZGVmYXVsdCAiSVBUX0xJTUlUX0FWRyJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQYWNrZXRzIHBlciBzZWNvbmQgdW5sZXNzIGZvbGxvd2VkIGJ5IFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3NlYyAvbWludXRlIC9ob3VyIC9kYXkgcG9zdGZpeGVzXVxuIgorIi0tbGltaXQtYnVyc3QgbnVtYmVyCQludW1iZXIgdG8gbWF0Y2ggaW4gYSBidXJzdCwgZGVmYXVsdCAldVxuIgorIlxuIiwgTkVURklMVEVSX1ZFUlNJT04sIElQVF9MSU1JVF9CVVJTVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJsaW1pdCIsIDEsIDAsICclJyB9LAorCXsgImxpbWl0LWJ1cnN0IiwgMSwgMCwgJyQnIH0sCisJeyAwIH0KK307CisKK3N0YXRpYworaW50IHBhcnNlX3JhdGUoY29uc3QgY2hhciAqcmF0ZSwgdV9pbnQzMl90ICp2YWwpCit7CisJY29uc3QgY2hhciAqZGVsaW07CisJdV9pbnQzMl90IHI7CisJdV9pbnQzMl90IG11bHQgPSAxOyAgLyogU2Vjb25kcyBieSBkZWZhdWx0LiAqLworCisJZGVsaW0gPSBzdHJjaHIocmF0ZSwgJy8nKTsKKwlpZiAoZGVsaW0pIHsKKwkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gMTsKKwkJZWxzZSBpZiAoc3RybmNhc2VjbXAoZGVsaW0rMSwgIm1pbnV0ZSIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKKwkJCW11bHQgPSA2MDsKKwkJZWxzZSBpZiAoc3RybmNhc2VjbXAoZGVsaW0rMSwgImhvdXIiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gNjAqNjA7CisJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gMjQqNjAqNjA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyID0gYXRvaShyYXRlKTsKKwlpZiAoIXIpCisJCXJldHVybiAwOworCisJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKKyAgICAgICAgICAgY2FuIHNwZWNpZnksIHNvIHdlJ3JlIG9rIGF0IHRoYXQgZW5kKS4gKi8KKwlpZiAociAvIG11bHQgPiBJUFRfTElNSVRfU0NBTEUpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJSYXRlIHRvbyBmYXN0IGAlcydcbiIsIHJhdGUpOworCisJKnZhbCA9IElQVF9MSU1JVF9TQ0FMRSAqIG11bHQgLyByOworCXJldHVybiAxOworfQorCisvKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8KK3N0YXRpYyB2b2lkCitpbml0KHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqbmZjYWNoZSkKK3sKKwlzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKHN0cnVjdCBpcHRfcmF0ZWluZm8gKiltLT5kYXRhOworCisJcGFyc2VfcmF0ZShJUFRfTElNSVRfQVZHLCAmci0+YXZnKTsKKwlyLT5idXJzdCA9IElQVF9MSU1JVF9CVVJTVDsKKworCS8qIENhbid0IGNhY2hlIHRoaXMgKi8KKwkqbmZjYWNoZSB8PSBORkNfVU5LTk9XTjsKK30KKworLyogRklYTUU6IGhhbmRsZSBvdmVyZmxvdzoKKwlpZiAoci0+YXZnKnItPmJ1cnN0L3ItPmJ1cnN0ICE9IHItPmF2ZykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJTb3JyeTogYnVyc3QgdG9vIGxhcmdlIGZvciB0aGF0IGF2ZyByYXRlLlxuIik7CisqLworCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgdW5zaWduZWQgaW50ICpuZmNhY2hlLAorICAgICAgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqKm1hdGNoKQoreworCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKSgqbWF0Y2gpLT5kYXRhOworCWludCBudW07CisKKwlzd2l0Y2goYykgeworCWNhc2UgJyUnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1saW1pdCIpOworCQlpZiAoIXBhcnNlX3JhdGUob3B0YXJnLCAmci0+YXZnKSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgImJhZCByYXRlIGAlcyciLCBvcHRhcmcpOworCQlicmVhazsJCisKKwljYXNlICckJzoKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIlVuZXhwZWN0ZWQgYCEnIGFmdGVyIC0tbGltaXQtYnVyc3QiKTsKKworCQludW0gPSBzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMTAwMDApOworCQlpZiAobnVtIDw9IDApCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJiYWQgLS1saW1pdC1idXJzdCBgJXMnIiwgb3B0YXJnKTsKKwkJci0+YnVyc3QgPSBudW07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBub3RoaW5nLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworfQorCitzdGF0aWMgc3RydWN0IHJhdGVzCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1X2ludDMyX3QgbXVsdDsKK30gcmF0ZXNbXSA9IHsgeyAiZGF5IiwgSVBUX0xJTUlUX1NDQUxFKjI0KjYwKjYwIH0sCisJICAgICAgeyAiaG91ciIsIElQVF9MSU1JVF9TQ0FMRSo2MCo2MCB9LAorCSAgICAgIHsgIm1pbiIsIElQVF9MSU1JVF9TQ0FMRSo2MCB9LAorCSAgICAgIHsgInNlYyIsIElQVF9MSU1JVF9TQ0FMRSB9IH07CisKK3N0YXRpYyB2b2lkIHByaW50X3JhdGUodV9pbnQzMl90IHBlcmlvZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBzaXplb2YocmF0ZXMpL3NpemVvZihzdHJ1Y3QgcmF0ZXMpOyBpKyspIHsKKwkJaWYgKHBlcmlvZCA+IHJhdGVzW2ldLm11bHQKKwkJICAgIHx8IHJhdGVzW2ldLm11bHQgJSBwZXJpb2QgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCXByaW50ZigiJXUvJXMgIiwgcmF0ZXNbaS0xXS5tdWx0IC8gcGVyaW9kLCByYXRlc1tpLTFdLm5hbWUpOworfQorCisvKiBQcmludHMgb3V0IHRoZSBtYXRjaGluZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwKKyAgICAgIGludCBudW1lcmljKQoreworCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW1hdGNoLT5kYXRhOworCXByaW50ZigibGltaXQ6IGF2ZyAiKTsgcHJpbnRfcmF0ZShyLT5hdmcpOworCXByaW50ZigiYnVyc3QgJXUgIiwgci0+YnVyc3QpOworfQorCisvKiBGSVhNRTogTWFrZSBtaW5pbWFsaXN0OiBvbmx5IHByaW50IHJhdGUgaWYgbm90IGRlZmF1bHQgLS1SUiAqLworc3RhdGljIHZvaWQgc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9yYXRlaW5mbyAqciA9IChzdHJ1Y3QgaXB0X3JhdGVpbmZvICopbWF0Y2gtPmRhdGE7CisKKwlwcmludGYoIi0tbGltaXQgIik7IHByaW50X3JhdGUoci0+YXZnKTsKKwlpZiAoci0+YnVyc3QgIT0gSVBUX0xJTUlUX0JVUlNUKQorCQlwcmludGYoIi0tbGltaXQtYnVyc3QgJXUgIiwgci0+YnVyc3QpOworfQorCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggbGltaXQKKz0geyBOVUxMLAorICAgICJsaW1pdCIsCisgICAgTkVURklMVEVSX1ZFUlNJT04sCisgICAgc2l6ZW9mKHN0cnVjdCBpcHRfcmF0ZWluZm8pLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9tYXRjaCgmbGltaXQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfbWFjLmMgYi9leHRlbnNpb25zL2xpYmlwdF9tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ4OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfbWFjLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgTUFDIGFkZHJlc3Mgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA9PSAyCisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxpcHRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYWMuaD4KKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiTUFDIHYlcyBvcHRpb25zOlxuIgorIiAtLW1hYy1zb3VyY2UgWyFdIFhYOlhYOlhYOlhYOlhYOlhYXG4iCisiCQkJCU1hdGNoIHNvdXJjZSBNQUMgYWRkcmVzc1xuIgorIlxuIiwgTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAibWFjLXNvdXJjZSIsIDEsIDAsICcxJyB9LAorCXswfQorfTsKKworLyogSW5pdGlhbGl6ZSB0aGUgbWF0Y2guICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCit7CisJLyogQ2FuJ3QgY2FjaGUgdGhpcyAqLworCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfbWFjKGNvbnN0IGNoYXIgKm1hYywgc3RydWN0IGlwdF9tYWNfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisKKwlpZiAoc3RybGVuKG1hYykgIT0gRVRIX0FMRU4qMy0xKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIG1hYyBhZGRyZXNzIGAlcyciLCBtYWMpOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJbG9uZyBudW1iZXI7CisJCWNoYXIgKmVuZDsKKworCQludW1iZXIgPSBzdHJ0b2wobWFjICsgaSozLCAmZW5kLCAxNik7CisKKwkJaWYgKGVuZCA9PSBtYWMgKyBpKjMgKyAyCisJCSAgICAmJiBudW1iZXIgPj0gMAorCQkgICAgJiYgbnVtYmVyIDw9IDI1NSkKKwkJCWluZm8tPnNyY2FkZHJbaV0gPSBudW1iZXI7CisJCWVsc2UKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIkJhZCBtYWMgYWRkcmVzcyBgJXMnIiwgbWFjKTsKKwl9Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9tYWNfaW5mbyAqbWFjaW5mbyA9IChzdHJ1Y3QgaXB0X21hY19pbmZvICopKCptYXRjaCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcxJzoKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCW9wdGluZCsrOworCQlwYXJzZV9tYWMoYXJndltvcHRpbmQtMV0sIG1hY2luZm8pOworCQlpZiAoaW52ZXJ0KQorCQkJbWFjaW5mby0+aW52ZXJ0ID0gMTsKKwkJKmZsYWdzID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWFjKHVuc2lnbmVkIGNoYXIgbWFjYWRkcmVzc1tFVEhfQUxFTl0sIGludCBpbnZlcnQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlwcmludGYoIiVzJTAyWCIsIGludmVydCA/ICIhIiA6ICIiLCBtYWNhZGRyZXNzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJcHJpbnRmKCI6JTAyWCIsIG1hY2FkZHJlc3NbaV0pOworCXByaW50ZigiICIpOworfQorCisvKiBGaW5hbCBjaGVjazsgbXVzdCBoYXZlIHNwZWNpZmllZCAtLW1hYy4gKi8KK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoIWZsYWdzKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIllvdSBtdXN0IHNwZWNpZnkgYC0tbWFjLXNvdXJjZSciKTsKK30KKworLyogUHJpbnRzIG91dCB0aGUgbWF0Y2hpbmZvLiAqLworc3RhdGljIHZvaWQKK3ByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gsCisgICAgICBpbnQgbnVtZXJpYykKK3sKKwlwcmludGYoIk1BQyAiKTsKKwlwcmludF9tYWMoKChzdHJ1Y3QgaXB0X21hY19pbmZvICopbWF0Y2gtPmRhdGEpLT5zcmNhZGRyLAorCQkgICgoc3RydWN0IGlwdF9tYWNfaW5mbyAqKW1hdGNoLT5kYXRhKS0+aW52ZXJ0KTsKK30KKworLyogU2F2ZXMgdGhlIHVuaW9uIGlwdF9tYXRjaGluZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCitzdGF0aWMgdm9pZCBzYXZlKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCkKK3sKKwlwcmludGYoIi0tbWFjICIpOworCXByaW50X21hYygoKHN0cnVjdCBpcHRfbWFjX2luZm8gKiltYXRjaC0+ZGF0YSktPnNyY2FkZHIsCisJCSAgKChzdHJ1Y3QgaXB0X21hY19pbmZvICopbWF0Y2gtPmRhdGEpLT5pbnZlcnQpOworfQorCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggbWFjCis9IHsgTlVMTCwKKyAgICAibWFjIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF9tYWNfaW5mbyksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX21hdGNoKCZtYWMpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfbWFyay5jIGIvZXh0ZW5zaW9ucy9saWJpcHRfbWFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGNkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2xpYmlwdF9tYXJrLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgTkZNQVJLIG1hdGNoaW5nIHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oPgorCisvKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCitzdGF0aWMgdm9pZAoraGVscCh2b2lkKQoreworCXByaW50ZigKKyJNQVJLIG1hdGNoIHYlcyBvcHRpb25zOlxuIgorIlshXSAtLW1hcmsgdmFsdWVbL21hc2tdICAgICAgICAgTWF0Y2ggbmZtYXJrIHZhbHVlIHdpdGggb3B0aW9uYWwgbWFza1xuIgorIlxuIiwKK05FVEZJTFRFUl9WRVJTSU9OKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworCXsgIm1hcmsiLCAxLCAwLCAnMScgfSwKKwl7MH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCS8qIENhbid0IGNhY2hlIHRoaXMuICovCisJKm5mY2FjaGUgfD0gTkZDX1VOS05PV047Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9tYXJrX2luZm8gKm1hcmtpbmZvID0gKHN0cnVjdCBpcHRfbWFya19pbmZvICopKCptYXRjaCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwkJY2hhciAqZW5kOworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisJCW1hcmtpbmZvLT5tYXJrID0gc3RydG91bChvcHRhcmcsICZlbmQsIDApOworCQlpZiAoKmVuZCA9PSAnLycpIHsKKwkJCW1hcmtpbmZvLT5tYXNrID0gc3RydG91bChlbmQrMSwgJmVuZCwgMCk7CisJCX0gZWxzZQorCQkJbWFya2luZm8tPm1hc2sgPSAweGZmZmZmZmZmOworCQlpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBvcHRhcmcpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIE1BUksgdmFsdWUgYCVzJyIsIG9wdGFyZyk7CisJCWlmIChpbnZlcnQpCisJCQltYXJraW5mby0+aW52ZXJ0ID0gMTsKKwkJKmZsYWdzID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9tYXJrKHVuc2lnbmVkIGxvbmcgbWFyaywgdW5zaWduZWQgbG9uZyBtYXNrLCBpbnQgaW52ZXJ0LCBpbnQgbnVtZXJpYykKK3sKKwlpZiAoaW52ZXJ0KQorCQlmcHV0YygnIScsIHN0ZG91dCk7CisJCQorCWlmKG1hc2sgIT0gMHhmZmZmZmZmZikKKwkJcHJpbnRmKCIweCVseC8weCVseCAiLCBtYXJrLCBtYXNrKTsKKwllbHNlCisJCXByaW50ZigiMHglbHggIiwgbWFyayk7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBtdXN0IGhhdmUgc3BlY2lmaWVkIC0tbWFyay4gKi8KK3N0YXRpYyB2b2lkCitmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJNQVJLIG1hdGNoOiBZb3UgbXVzdCBzcGVjaWZ5IGAtLW1hcmsnIik7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoLAorICAgICAgaW50IG51bWVyaWMpCit7CisJcHJpbnRmKCJNQVJLIG1hdGNoICIpOworCXByaW50X21hcmsoKChzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqKW1hdGNoLT5kYXRhKS0+bWFyaywKKwkJICAoKHN0cnVjdCBpcHRfbWFya19pbmZvICopbWF0Y2gtPmRhdGEpLT5tYXNrLAorCQkgICgoc3RydWN0IGlwdF9tYXJrX2luZm8gKiltYXRjaC0+ZGF0YSktPmludmVydCwgbnVtZXJpYyk7Cit9CisKKy8qIFNhdmVzIHRoZSB1bmlvbiBpcHRfbWF0Y2hpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQKK3NhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXByaW50ZigiLS1tYXJrICIpOworCXByaW50X21hcmsoKChzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqKW1hdGNoLT5kYXRhKS0+bWFyaywKKwkJICAoKHN0cnVjdCBpcHRfbWFya19pbmZvICopbWF0Y2gtPmRhdGEpLT5tYXNrLAorCQkgICgoc3RydWN0IGlwdF9tYXJrX2luZm8gKiltYXRjaC0+ZGF0YSktPmludmVydCwgMCk7Cit9CisKK3N0cnVjdCBpcHRhYmxlc19tYXRjaCBtYXJrCis9IHsgTlVMTCwKKyAgICAibWFyayIsCisgICAgTkVURklMVEVSX1ZFUlNJT04sCisgICAgc2l6ZW9mKHN0cnVjdCBpcHRfbWFya19pbmZvKSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgICZwcmludCwKKyAgICAmc2F2ZSwKKyAgICBvcHRzCit9OworCit2b2lkIF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfbWF0Y2goJm1hcmspOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfbXVsdGlwb3J0LmMgYi9leHRlbnNpb25zL2xpYmlwdF9tdWx0aXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmOTVmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfbXVsdGlwb3J0LmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgbXVsdGlwbGUgVENQIHBvcnQgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbXVsdGlwb3J0Lmg+CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorIm11bHRpcG9ydCB2JXMgb3B0aW9uczpcbiIKKyIgLS1zb3VyY2UtcG9ydHMgcG9ydFsscG9ydCxwb3J0Li4uXVxuIgorIiAtLXNwb3J0cyAuLi5cbiIKKyIJCQkJbWF0Y2ggc291cmNlIHBvcnQocylcbiIKKyIgLS1kZXN0aW5hdGlvbi1wb3J0cyBwb3J0Wyxwb3J0LHBvcnQuLi5dXG4iCisiIC0tZHBvcnRzIC4uLlxuIgorIgkJCQltYXRjaCBkZXN0aW5hdGlvbiBwb3J0KHMpXG4iCisiIC0tcG9ydHMgcG9ydFsscG9ydCxwb3J0XVxuIgorIgkJCQltYXRjaCBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydChzKVxuIiwKK05FVEZJTFRFUl9WRVJTSU9OKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworCXsgInNvdXJjZS1wb3J0cyIsIDEsIDAsICcxJyB9LAorCXsgInNwb3J0cyIsIDEsIDAsICcxJyB9LCAvKiBzeW5vbnltICovCisJeyAiZGVzdGluYXRpb24tcG9ydHMiLCAxLCAwLCAnMicgfSwKKwl7ICJkcG9ydHMiLCAxLCAwLCAnMicgfSwgLyogc3lub255bSAqLworCXsgInBvcnRzIiwgMSwgMCwgJzMnIH0sCisJezB9Cit9OworCitzdGF0aWMgaW50CitzZXJ2aWNlX3RvX3BvcnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcHJvdG8pCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZpY2U7CisKKwlpZiAoKHNlcnZpY2UgPSBnZXRzZXJ2YnluYW1lKG5hbWUsIHByb3RvKSkgIT0gTlVMTCkKKwkJcmV0dXJuIG50b2hzKCh1bnNpZ25lZCBzaG9ydCkgc2VydmljZS0+c19wb3J0KTsKKworCQlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1X2ludDE2X3QKK3BhcnNlX3BvcnQoY29uc3QgY2hhciAqcG9ydCwgY29uc3QgY2hhciAqcHJvdG8pCit7CisJaW50IHBvcnRudW07CisJaWYgKChwb3J0bnVtID0gc3RyaW5nX3RvX251bWJlcihwb3J0LCAwLCA2NTUzNSkpICE9IC0xIHx8CisJICAgIChwb3J0bnVtID0gc2VydmljZV90b19wb3J0KHBvcnQsIHByb3RvKSkgIT0gLTEpCisJCXJldHVybiAodV9pbnQxNl90KXBvcnRudW07CisKKwlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkgICAiaW52YWxpZCBwb3J0L3NlcnZpY2UgYCVzJyBzcGVjaWZpZWQiLCBwb3J0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcGFyc2VfbXVsdGlfcG9ydHMoY29uc3QgY2hhciAqcG9ydHN0cmluZywgdV9pbnQxNl90ICpwb3J0cywgY29uc3QgY2hhciAqcHJvdG8pCit7CisJY2hhciAqYnVmZmVyLCAqY3AsICpuZXh0OworCXVuc2lnbmVkIGludCBpOworCisJYnVmZmVyID0gc3RyZHVwKHBvcnRzdHJpbmcpOworCWlmICghYnVmZmVyKSBleGl0X2Vycm9yKE9USEVSX1BST0JMRU0sICJzdHJkdXAgZmFpbGVkIik7CisKKwlmb3IgKGNwPWJ1ZmZlciwgaT0wOyBjcCAmJiBpPElQVF9NVUxUSV9QT1JUUzsgY3A9bmV4dCxpKyspCisJeworCQluZXh0PXN0cmNocihjcCwgJywnKTsKKwkJaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKKwkJcG9ydHNbaV0gPSBwYXJzZV9wb3J0KGNwLCBwcm90byk7CisJfQorCWlmIChjcCkgZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgInRvbyBtYW55IHBvcnRzIHNwZWNpZmllZCIpOworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gaTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgbWF0Y2guICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCit7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2NoZWNrX3Byb3RvKGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5KQoreworCWlmIChlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCXJldHVybiAidGNwIjsKKwllbHNlIGlmIChlbnRyeS0+aXAucHJvdG8gPT0gSVBQUk9UT19VRFApCisJCXJldHVybiAidWRwIjsKKwllbHNlIGlmICghZW50cnktPmlwLnByb3RvKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIm11bHRpcG9ydCBuZWVkcyBgLXAgdGNwJyBvciBgLXAgdWRwJyIpOworCWVsc2UKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJtdWx0aXBvcnQgb25seSB3b3JrcyB3aXRoIFRDUCBvciBVRFAiKTsKK30KKworLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICBhdGUgYW4gb3B0aW9uICovCitzdGF0aWMgaW50CitwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBpbnZlcnQsIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKyAgICAgIHVuc2lnbmVkIGludCAqbmZjYWNoZSwKKyAgICAgIHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKiptYXRjaCkKK3sKKwljb25zdCBjaGFyICpwcm90bzsKKwlzdHJ1Y3QgaXB0X211bHRpcG9ydCAqbXVsdGlpbmZvCisJCT0gKHN0cnVjdCBpcHRfbXVsdGlwb3J0ICopKCptYXRjaCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcxJzoKKwkJcHJvdG8gPSBjaGVja19wcm90byhlbnRyeSk7CisJCW11bHRpaW5mby0+Y291bnQgPSBwYXJzZV9tdWx0aV9wb3J0cyhhcmd2W29wdGluZC0xXSwKKwkJCQkJCSAgICAgbXVsdGlpbmZvLT5wb3J0cywgcHJvdG8pOworCQltdWx0aWluZm8tPmZsYWdzID0gSVBUX01VTFRJUE9SVF9TT1VSQ0U7CisJCSpuZmNhY2hlIHw9IE5GQ19JUF9TUkNfUFQ7CisJCWJyZWFrOworCisJY2FzZSAnMic6CisJCXByb3RvID0gY2hlY2tfcHJvdG8oZW50cnkpOworCQltdWx0aWluZm8tPmNvdW50ID0gcGFyc2VfbXVsdGlfcG9ydHMoYXJndltvcHRpbmQtMV0sCisJCQkJCQkgICAgIG11bHRpaW5mby0+cG9ydHMsIHByb3RvKTsKKwkJbXVsdGlpbmZvLT5mbGFncyA9IElQVF9NVUxUSVBPUlRfREVTVElOQVRJT047CisJCSpuZmNhY2hlIHw9IE5GQ19JUF9EU1RfUFQ7CisJCWJyZWFrOworCisJY2FzZSAnMyc6CisJCXByb3RvID0gY2hlY2tfcHJvdG8oZW50cnkpOworCQltdWx0aWluZm8tPmNvdW50ID0gcGFyc2VfbXVsdGlfcG9ydHMoYXJndltvcHRpbmQtMV0sCisJCQkJCQkgICAgIG11bHRpaW5mby0+cG9ydHMsIHByb3RvKTsKKwkJbXVsdGlpbmZvLT5mbGFncyA9IElQVF9NVUxUSVBPUlRfRUlUSEVSOworCQkqbmZjYWNoZSB8PSBORkNfSVBfU1JDX1BUIHwgTkZDX0lQX0RTVF9QVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKmZsYWdzKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIm11bHRpcG9ydCBjYW4gb25seSBoYXZlIG9uZSBvcHRpb24iKTsKKwkqZmxhZ3MgPSAxOworCXJldHVybiAxOworfQorCisvKiBGaW5hbCBjaGVjazsgbXVzdCBzcGVjaWZ5IHNvbWV0aGluZy4gKi8KK3N0YXRpYyB2b2lkCitmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIm11bHRpcG9ydCBleHBlY3Rpb24gYW4gb3B0aW9uIik7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BvcnRfdG9fc2VydmljZShpbnQgcG9ydCwgdV9pbnQ4X3QgcHJvdG8pCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZpY2U7CisKKwlpZiAoKHNlcnZpY2UgPSBnZXRzZXJ2Ynlwb3J0KGh0b25zKHBvcnQpLAorCQkJCSAgICAgcHJvdG8gPT0gSVBQUk9UT19UQ1AgPyAidGNwIiA6ICJ1ZHAiKSkpCisJCXJldHVybiBzZXJ2aWNlLT5zX25hbWU7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3BvcnQodV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHByb3RvY29sLCBpbnQgbnVtZXJpYykKK3sKKwljaGFyICpzZXJ2aWNlOworCisJaWYgKG51bWVyaWMgfHwgKHNlcnZpY2UgPSBwb3J0X3RvX3NlcnZpY2UocG9ydCwgcHJvdG9jb2wpKSA9PSBOVUxMKQorCQlwcmludGYoIiV1IiwgcG9ydCk7CisJZWxzZQorCQlwcmludGYoIiVzIiwgc2VydmljZSk7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoLAorICAgICAgaW50IG51bWVyaWMpCit7CisJY29uc3Qgc3RydWN0IGlwdF9tdWx0aXBvcnQgKm11bHRpaW5mbworCQk9IChjb25zdCBzdHJ1Y3QgaXB0X211bHRpcG9ydCAqKW1hdGNoLT5kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJcHJpbnRmKCJtdWx0aXBvcnQgIik7CisKKwlzd2l0Y2ggKG11bHRpaW5mby0+ZmxhZ3MpIHsKKwljYXNlIElQVF9NVUxUSVBPUlRfU09VUkNFOgorCQlwcmludGYoInNwb3J0cyAiKTsKKwkJYnJlYWs7CisKKwljYXNlIElQVF9NVUxUSVBPUlRfREVTVElOQVRJT046CisJCXByaW50ZigiZHBvcnRzICIpOworCQlicmVhazsKKworCWNhc2UgSVBUX01VTFRJUE9SVF9FSVRIRVI6CisJCXByaW50ZigicG9ydHMgIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJFUlJPUiAiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpPTA7IGkgPCBtdWx0aWluZm8tPmNvdW50OyBpKyspIHsKKwkJcHJpbnRmKCIlcyIsIGkgPyAiLCIgOiAiIik7CisJCXByaW50X3BvcnQobXVsdGlpbmZvLT5wb3J0c1tpXSwgaXAtPnByb3RvLCBudW1lcmljKTsKKwl9CisJcHJpbnRmKCIgIik7Cit9CisKKy8qIFNhdmVzIHRoZSB1bmlvbiBpcHRfbWF0Y2hpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQgc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJY29uc3Qgc3RydWN0IGlwdF9tdWx0aXBvcnQgKm11bHRpaW5mbworCQk9IChjb25zdCBzdHJ1Y3QgaXB0X211bHRpcG9ydCAqKW1hdGNoLT5kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChtdWx0aWluZm8tPmZsYWdzKSB7CisJY2FzZSBJUFRfTVVMVElQT1JUX1NPVVJDRToKKwkJcHJpbnRmKCItLXNwb3J0cyAiKTsKKwkJYnJlYWs7CisKKwljYXNlIElQVF9NVUxUSVBPUlRfREVTVElOQVRJT046CisJCXByaW50ZigiLS1kcG9ydHMgIik7CisJCWJyZWFrOworCisJY2FzZSBJUFRfTVVMVElQT1JUX0VJVEhFUjoKKwkJcHJpbnRmKCItLXBvcnRzICIpOworCQlicmVhazsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IG11bHRpaW5mby0+Y291bnQ7IGkrKykgeworCQlwcmludGYoIiVzIiwgaSA/ICIsIiA6ICIiKTsKKwkJcHJpbnRfcG9ydChtdWx0aWluZm8tPnBvcnRzW2ldLCBpcC0+cHJvdG8sIDApOworCX0KKwlwcmludGYoIiAiKTsKK30KKworc3RydWN0IGlwdGFibGVzX21hdGNoIG11bHRpcG9ydAorPSB7IE5VTEwsCisgICAgIm11bHRpcG9ydCIsCisgICAgTkVURklMVEVSX1ZFUlNJT04sCisgICAgc2l6ZW9mKHN0cnVjdCBpcHRfbXVsdGlwb3J0KSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgICZwcmludCwKKyAgICAmc2F2ZSwKKyAgICBvcHRzCit9OworCit2b2lkCitfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX21hdGNoKCZtdWx0aXBvcnQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfb3duZXIuYyBiL2V4dGVuc2lvbnMvbGliaXB0X293bmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMTEwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X293bmVyLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgT1dORVIgbWF0Y2hpbmcgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxpcHRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9vd25lci5oPgorCisvKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCitzdGF0aWMgdm9pZAoraGVscCh2b2lkKQoreworCXByaW50ZigKKyJPV05FUiBtYXRjaCB2JXMgb3B0aW9uczpcbiIKKyJbIV0gLS11aWQtb3duZXIgdXNlcmlkICAgICBNYXRjaCBsb2NhbCB1aWRcbiIKKyJbIV0gLS1naWQtb3duZXIgZ3JvdXBpZCAgICBNYXRjaCBsb2NhbCBnaWRcbiIKKyJbIV0gLS1waWQtb3duZXIgcHJvY2Vzc2lkICBNYXRjaCBsb2NhbCBwaWRcbiIKKyJbIV0gLS1zaWQtb3duZXIgc2Vzc2lvbmlkICBNYXRjaCBsb2NhbCBzaWRcbiIKKyJcbiIsCitORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ1aWQtb3duZXIiLCAxLCAwLCAnMScgfSwKKwl7ICJnaWQtb3duZXIiLCAxLCAwLCAnMicgfSwKKwl7ICJwaWQtb3duZXIiLCAxLCAwLCAnMycgfSwKKwl7ICJzaWQtb3duZXIiLCAxLCAwLCAnNCcgfSwKKwl7MH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCS8qIENhbid0IGNhY2hlIHRoaXMuICovCisJKm5mY2FjaGUgfD0gTkZDX1VOS05PV047Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9vd25lcl9pbmZvICpvd25lcmluZm8gPSAoc3RydWN0IGlwdF9vd25lcl9pbmZvICopKCptYXRjaCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwkJY2hhciAqZW5kOworCQlzdHJ1Y3QgcGFzc3dkICpwd2Q7CisJCXN0cnVjdCBncm91cCAqZ3JwOworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisKKwkJaWYgKChwd2QgPSBnZXRwd25hbShvcHRhcmcpKSkKKwkJCW93bmVyaW5mby0+dWlkID0gcHdkLT5wd191aWQ7CisJCWVsc2UgeworCQkJb3duZXJpbmZvLT51aWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVuZCwgMCk7CisJCQlpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBvcHRhcmcpCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIkJhZCBPV05FUiBVSUQgdmFsdWUgYCVzJyIsIG9wdGFyZyk7CisJCX0KKwkJaWYgKGludmVydCkKKwkJCW93bmVyaW5mby0+aW52ZXJ0IHw9IElQVF9PV05FUl9VSUQ7CisJCW93bmVyaW5mby0+bWF0Y2ggfD0gSVBUX09XTkVSX1VJRDsKKwkJKmZsYWdzID0gMTsKKwkJYnJlYWs7CisKKwljYXNlICcyJzoKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCW9wdGluZCsrOworCQlpZiAoKGdycCA9IGdldGdybmFtKG9wdGFyZykpKQorCQkJb3duZXJpbmZvLT5naWQgPSBncnAtPmdyX2dpZDsKKwkJZWxzZSB7CisJCQlvd25lcmluZm8tPmdpZCA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAwKTsKKwkJCWlmICgqZW5kICE9ICdcMCcgfHwgZW5kID09IG9wdGFyZykKKwkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIE9XTkVSIEdJRCB2YWx1ZSBgJXMnIiwgb3B0YXJnKTsKKwkJfQorCQlpZiAoaW52ZXJ0KQorCQkJb3duZXJpbmZvLT5pbnZlcnQgfD0gSVBUX09XTkVSX0dJRDsKKwkJb3duZXJpbmZvLT5tYXRjaCB8PSBJUFRfT1dORVJfR0lEOworCQkqZmxhZ3MgPSAxOworCQlicmVhazsKKworCWNhc2UgJzMnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisJCW93bmVyaW5mby0+cGlkID0gc3RydG91bChvcHRhcmcsICZlbmQsIDApOworCQlpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBvcHRhcmcpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIE9XTkVSIFBJRCB2YWx1ZSBgJXMnIiwgb3B0YXJnKTsKKwkJaWYgKGludmVydCkKKwkJCW93bmVyaW5mby0+aW52ZXJ0IHw9IElQVF9PV05FUl9QSUQ7CisJCW93bmVyaW5mby0+bWF0Y2ggfD0gSVBUX09XTkVSX1BJRDsKKwkJKmZsYWdzID0gMTsKKwkJYnJlYWs7CisKKwljYXNlICc0JzoKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCW9wdGluZCsrOworCQlvd25lcmluZm8tPnNpZCA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAwKTsKKwkJaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gb3B0YXJnKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIkJhZCBPV05FUiBTSUQgdmFsdWUgYCVzJyIsIG9wdGFyZyk7CisJCWlmIChpbnZlcnQpCisJCQlvd25lcmluZm8tPmludmVydCB8PSBJUFRfT1dORVJfU0lEOworCQlvd25lcmluZm8tPm1hdGNoIHw9IElQVF9PV05FUl9TSUQ7CisJCSpmbGFncyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaXRlbShzdHJ1Y3QgaXB0X293bmVyX2luZm8gKmluZm8sIHVfaW50OF90IGZsYWcsIGludCBudW1lcmljLCBjaGFyICpsYWJlbCkKK3sKKwlpZihpbmZvLT5tYXRjaCAmIGZsYWcpIHsKKworCQlwcmludGYobGFiZWwpOworCisJCWlmIChpbmZvLT5pbnZlcnQgJiBmbGFnKQorCQkJZnB1dGMoJyEnLCBzdGRvdXQpOworCisJCXN3aXRjaChpbmZvLT5tYXRjaCAmIGZsYWcpIHsKKwkJY2FzZSBJUFRfT1dORVJfVUlEOgorCQkJaWYoIW51bWVyaWMpIHsKKwkJCQlzdHJ1Y3QgcGFzc3dkICpwd2QgPSBnZXRwd3VpZChpbmZvLT51aWQpOworCisJCQkJaWYocHdkICYmIHB3ZC0+cHdfbmFtZSkgeworCQkJCQlwcmludGYoIiVzICIsIHB3ZC0+cHdfbmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJfQorCQkJcHJpbnRmKCIldSAiLCBpbmZvLT51aWQpOworCQkJYnJlYWs7CisJCWNhc2UgSVBUX09XTkVSX0dJRDoKKwkJCWlmKCFudW1lcmljKSB7CisJCQkJc3RydWN0IGdyb3VwICpncnAgPSBnZXRncmdpZChpbmZvLT5naWQpOworCisJCQkJaWYoZ3JwICYmIGdycC0+Z3JfbmFtZSkgeworCQkJCQlwcmludGYoIiVzICIsIGdycC0+Z3JfbmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJfQorCQkJcHJpbnRmKCIldSAiLCBpbmZvLT5naWQpOworCQkJYnJlYWs7CisJCWNhc2UgSVBUX09XTkVSX1BJRDoKKwkJCXByaW50ZigiJXUgIiwgaW5mby0+cGlkKTsKKwkJCWJyZWFrOworCQljYXNlIElQVF9PV05FUl9TSUQ6CisJCQlwcmludGYoIiV1ICIsIGluZm8tPnNpZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBGaW5hbCBjaGVjazsgbXVzdCBoYXZlIHNwZWNpZmllZCAtLW93bi4gKi8KK3N0YXRpYyB2b2lkCitmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJPV05FUiBtYXRjaDogWW91IG11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSBvcHRpb25zIik7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoLAorICAgICAgaW50IG51bWVyaWMpCit7CisJc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gKHN0cnVjdCBpcHRfb3duZXJfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJcHJpbnRfaXRlbShpbmZvLCBJUFRfT1dORVJfVUlELCBudW1lcmljLCAiT1dORVIgVUlEIG1hdGNoICIpOworCXByaW50X2l0ZW0oaW5mbywgSVBUX09XTkVSX0dJRCwgbnVtZXJpYywgIk9XTkVSIEdJRCBtYXRjaCAiKTsKKwlwcmludF9pdGVtKGluZm8sIElQVF9PV05FUl9QSUQsIG51bWVyaWMsICJPV05FUiBQSUQgbWF0Y2ggIik7CisJcHJpbnRfaXRlbShpbmZvLCBJUFRfT1dORVJfU0lELCBudW1lcmljLCAiT1dORVIgU0lEIG1hdGNoICIpOworfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X21hdGNoaW5mbyBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkCitzYXZlKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCkKK3sKKwlzdHJ1Y3QgaXB0X293bmVyX2luZm8gKmluZm8gPSAoc3RydWN0IGlwdF9vd25lcl9pbmZvICopbWF0Y2gtPmRhdGE7CisKKwlwcmludF9pdGVtKGluZm8sIElQVF9PV05FUl9VSUQsIDAsICItLXVpZC1vd25lciAiKTsKKwlwcmludF9pdGVtKGluZm8sIElQVF9PV05FUl9HSUQsIDAsICItLWdpZC1vd25lciAiKTsKKwlwcmludF9pdGVtKGluZm8sIElQVF9PV05FUl9QSUQsIDAsICItLXBpZC1vd25lciAiKTsKKwlwcmludF9pdGVtKGluZm8sIElQVF9PV05FUl9TSUQsIDAsICItLXNpZC1vd25lciAiKTsKK30KKworc3RydWN0IGlwdGFibGVzX21hdGNoIG93bmVyCis9IHsgTlVMTCwKKyAgICAib3duZXIiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXB0X293bmVyX2luZm8pLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9tYXRjaCgmb3duZXIpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfc3RhbmRhcmQuYyBiL2V4dGVuc2lvbnMvbGliaXB0X3N0YW5kYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3NDZiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X3N0YW5kYXJkLmMKQEAgLTAsMCArMSw2NyBAQAorLyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIGZvciBzdGFuZGFyZCB0YXJnZXQgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisiU3RhbmRhcmQgdiVzIG9wdGlvbnM6XG4iCisiKElmIHRhcmdldCBpcyBEUk9QLCBBQ0NFUFQsIFJFVFVSTiBvciBub3RoaW5nKVxuIiwgTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJezB9Cit9OworCisvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworfQorCisvKiBGdW5jdGlvbiB3aGljaCBwYXJzZXMgY29tbWFuZCBvcHRpb25zOyByZXR1cm5zIHRydWUgaWYgaXQKKyAgIGF0ZSBhbiBvcHRpb24gKi8KK3N0YXRpYyBpbnQKK3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorICAgICAgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBkb24ndCBjYXJlLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworfQorCisvKiBTYXZlcyB0aGUgdGFyZ2luZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCitzdGF0aWMgdm9pZAorc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKK30KKworc3RydWN0IGlwdGFibGVzX3RhcmdldCBzdGFuZGFyZAorPSB7IE5VTEwsCisgICAgInN0YW5kYXJkIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2YoaW50KSwKKyAgICAmaGVscCwKKyAgICAmaW5pdCwKKyAgICAmcGFyc2UsCisgICAgJmZpbmFsX2NoZWNrLAorICAgIE5VTEwsIC8qIHByaW50ICovCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RhcmdldCgmc3RhbmRhcmQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfc3RhdGUuYyBiL2V4dGVuc2lvbnMvbGliaXB0X3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NTFkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X3N0YXRlLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgc3RhdGUgdHJhY2tpbmcgc3VwcG9ydC4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaD4KKworLyogRnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCB1c2FnZSBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK2hlbHAodm9pZCkKK3sKKwlwcmludGYoCisic3RhdGUgdiVzIG9wdGlvbnM6XG4iCisiIFshXSAtLXN0YXRlIFtJTlZBTElEfEVTVEFCTElTSEVEfE5FV3xSRUxBVEVEXVssLi4uXVxuIgorIgkJCQlTdGF0ZShzKSB0byBtYXRjaFxuIgorIlxuIiwgTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAic3RhdGUiLCAxLCAwLCAnMScgfSwKKwl7MH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCS8qIENhbid0IGNhY2hlIHRoaXMgKi8KKwkqbmZjYWNoZSB8PSBORkNfVU5LTk9XTjsKK30KKworc3RhdGljIGludAorcGFyc2Vfc3RhdGUoY29uc3QgY2hhciAqc3RhdGUsIHNpemVfdCBzdHJsZW4sIHN0cnVjdCBpcHRfc3RhdGVfaW5mbyAqc2luZm8pCit7CisJaWYgKHN0cm5jYXNlY21wKHN0YXRlLCAiSU5WQUxJRCIsIHN0cmxlbikgPT0gMCkKKwkJc2luZm8tPnN0YXRlbWFzayB8PSBJUFRfU1RBVEVfSU5WQUxJRDsKKwllbHNlIGlmIChzdHJuY2FzZWNtcChzdGF0ZSwgIk5FVyIsIHN0cmxlbikgPT0gMCkKKwkJc2luZm8tPnN0YXRlbWFzayB8PSBJUFRfU1RBVEVfQklUKElQX0NUX05FVyk7CisJZWxzZSBpZiAoc3RybmNhc2VjbXAoc3RhdGUsICJFU1RBQkxJU0hFRCIsIHN0cmxlbikgPT0gMCkKKwkJc2luZm8tPnN0YXRlbWFzayB8PSBJUFRfU1RBVEVfQklUKElQX0NUX0VTVEFCTElTSEVEKTsKKwllbHNlIGlmIChzdHJuY2FzZWNtcChzdGF0ZSwgIlJFTEFURUQiLCBzdHJsZW4pID09IDApCisJCXNpbmZvLT5zdGF0ZW1hc2sgfD0gSVBUX1NUQVRFX0JJVChJUF9DVF9SRUxBVEVEKTsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcGFyc2Vfc3RhdGVzKGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IGlwdF9zdGF0ZV9pbmZvICpzaW5mbykKK3sKKwljb25zdCBjaGFyICpjb21tYTsKKworCXdoaWxlICgoY29tbWEgPSBzdHJjaHIoYXJnLCAnLCcpKSAhPSBOVUxMKSB7CisJCWlmIChjb21tYSA9PSBhcmcgfHwgIXBhcnNlX3N0YXRlKGFyZywgY29tbWEtYXJnLCBzaW5mbykpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIHN0YXRlIGAlcyciLCBhcmcpOworCQlhcmcgPSBjb21tYSsxOworCX0KKworCWlmIChzdHJsZW4oYXJnKSA9PSAwIHx8ICFwYXJzZV9zdGF0ZShhcmcsIHN0cmxlbihhcmcpLCBzaW5mbykpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJCYWQgc3RhdGUgYCVzJyIsIGFyZyk7Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9zdGF0ZV9pbmZvICpzaW5mbyA9IChzdHJ1Y3QgaXB0X3N0YXRlX2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisKKwkJcGFyc2Vfc3RhdGVzKGFyZ3Zbb3B0aW5kLTFdLCBzaW5mbyk7CisJCWlmIChpbnZlcnQpCisJCQlzaW5mby0+c3RhdGVtYXNrID0gfnNpbmZvLT5zdGF0ZW1hc2s7CisJCSpmbGFncyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBtdXN0IGhhdmUgc3BlY2lmaWVkIC0tc3RhdGUuICovCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIllvdSBtdXN0IHNwZWNpZnkgYC0tc3RhdGUnIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRlKHVuc2lnbmVkIGludCBzdGF0ZW1hc2spCit7CisJY29uc3QgY2hhciAqc2VwID0gIiI7CisKKwlpZiAoc3RhdGVtYXNrICYgSVBUX1NUQVRFX0lOVkFMSUQpIHsKKwkJcHJpbnRmKCIlc0lOVkFMSUQiLCBzZXApOworCQlzZXAgPSAiLCI7CisJfQorCWlmIChzdGF0ZW1hc2sgJiBJUFRfU1RBVEVfQklUKElQX0NUX05FVykpIHsKKwkJcHJpbnRmKCIlc05FVyIsIHNlcCk7CisJCXNlcCA9ICIsIjsKKwl9CisJaWYgKHN0YXRlbWFzayAmIElQVF9TVEFURV9CSVQoSVBfQ1RfUkVMQVRFRCkpIHsKKwkJcHJpbnRmKCIlc1JFTEFURUQiLCBzZXApOworCQlzZXAgPSAiLCI7CisJfQorCWlmIChzdGF0ZW1hc2sgJiBJUFRfU1RBVEVfQklUKElQX0NUX0VTVEFCTElTSEVEKSkgeworCQlwcmludGYoIiVzRVNUQUJMSVNIRUQiLCBzZXApOworCQlzZXAgPSAiLCI7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBQcmludHMgb3V0IHRoZSBtYXRjaGluZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwKKyAgICAgIGludCBudW1lcmljKQoreworCXN0cnVjdCBpcHRfc3RhdGVfaW5mbyAqc2luZm8gPSAoc3RydWN0IGlwdF9zdGF0ZV9pbmZvICopbWF0Y2gtPmRhdGE7CisKKwlwcmludGYoInN0YXRlICIpOworCXByaW50X3N0YXRlKHNpbmZvLT5zdGF0ZW1hc2spOworfQorCisvKiBTYXZlcyB0aGUgbWF0Y2hpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQgc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGlwdF9zdGF0ZV9pbmZvICpzaW5mbyA9IChzdHJ1Y3QgaXB0X3N0YXRlX2luZm8gKiltYXRjaC0+ZGF0YTsKKworCXByaW50ZigiLS1zdGF0ZSAiKTsKKwlwcmludF9zdGF0ZShzaW5mby0+c3RhdGVtYXNrKTsKK30KKworc3RydWN0IGlwdGFibGVzX21hdGNoIHN0YXRlCis9IHsgTlVMTCwKKyAgICAic3RhdGUiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXB0X3N0YXRlX2luZm8pLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9tYXRjaCgmc3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfdGNwLmMgYi9leHRlbnNpb25zL2xpYmlwdF90Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI4NWEwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfdGNwLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgVENQIHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorIlRDUCB2JXMgb3B0aW9uczpcbiIKKyIgLS10Y3AtZmxhZ3MgWyFdIG1hc2sgY29tcAltYXRjaCB3aGVuIFRDUCBmbGFncyAmIG1hc2sgPT0gY29tcFxuIgorIgkJCQkoRmxhZ3M6IFNZTiBBQ0sgRklOIFJTVCBVUkcgUFNIIEFMTCBOT05FKVxuIgorIlshXSAtLXN5bgkJCW1hdGNoIHdoZW4gb25seSBTWU4gZmxhZyBzZXRcbiIKKyIJCQkJKGVxdWl2YWxlbnQgdG8gLS10Y3AtZmxhZ3MgU1lOLFJTVCxBQ0sgU1lOKVxuIgorIiAtLXNvdXJjZS1wb3J0IFshXSBwb3J0Wzpwb3J0XVxuIgorIiAtLXNwb3J0IC4uLlxuIgorIgkJCQltYXRjaCBzb3VyY2UgcG9ydChzKVxuIgorIiAtLWRlc3RpbmF0aW9uLXBvcnQgWyFdIHBvcnRbOnBvcnRdXG4iCisiIC0tZHBvcnQgLi4uXG4iCisiCQkJCW1hdGNoIGRlc3RpbmF0aW9uIHBvcnQocylcbiIKKyIgLS10Y3Atb3B0aW9uIFshXSBudW1iZXIgICAgICAgbWF0Y2ggaWYgVENQIG9wdGlvbiBzZXRcblxuIiwKK05FVEZJTFRFUl9WRVJTSU9OKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworCXsgInNvdXJjZS1wb3J0IiwgMSwgMCwgJzEnIH0sCisJeyAic3BvcnQiLCAxLCAwLCAnMScgfSwgLyogc3lub255bSAqLworCXsgImRlc3RpbmF0aW9uLXBvcnQiLCAxLCAwLCAnMicgfSwKKwl7ICJkcG9ydCIsIDEsIDAsICcyJyB9LCAvKiBzeW5vbnltICovCisJeyAic3luIiwgMCwgMCwgJzMnIH0sCisJeyAidGNwLWZsYWdzIiwgMSwgMCwgJzQnIH0sCisJeyAidGNwLW9wdGlvbiIsIDEsIDAsICc1JyB9LAorCXswfQorfTsKKworc3RhdGljIGludAorc2VydmljZV90b19wb3J0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZpY2U7CisKKwlpZiAoKHNlcnZpY2UgPSBnZXRzZXJ2YnluYW1lKG5hbWUsICJ0Y3AiKSkgIT0gTlVMTCkKKwkJcmV0dXJuIG50b2hzKCh1bnNpZ25lZCBzaG9ydCkgc2VydmljZS0+c19wb3J0KTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHVfaW50MTZfdAorcGFyc2VfdGNwX3BvcnQoY29uc3QgY2hhciAqcG9ydCkKK3sKKwlpbnQgcG9ydG51bTsKKworCWlmICgocG9ydG51bSA9IHN0cmluZ190b19udW1iZXIocG9ydCwgMCwgNjU1MzUpKSAhPSAtMSB8fAorCSAgICAocG9ydG51bSA9IHNlcnZpY2VfdG9fcG9ydChwb3J0KSkgIT0gLTEpCisJCXJldHVybiAodV9pbnQxNl90KXBvcnRudW07CisKKwlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkgICAiaW52YWxpZCBUQ1AgcG9ydC9zZXJ2aWNlIGAlcycgc3BlY2lmaWVkIiwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV90Y3BfcG9ydHMoY29uc3QgY2hhciAqcG9ydHN0cmluZywgdV9pbnQxNl90ICpwb3J0cykKK3sKKwljaGFyICpidWZmZXI7CisJY2hhciAqY3A7CisKKwlidWZmZXIgPSBzdHJkdXAocG9ydHN0cmluZyk7CisJaWYgKChjcCA9IHN0cmNocihidWZmZXIsICc6JykpID09IE5VTEwpCisJCXBvcnRzWzBdID0gcG9ydHNbMV0gPSBwYXJzZV90Y3BfcG9ydChidWZmZXIpOworCWVsc2UgeworCQkqY3AgPSAnXDAnOworCQljcCsrOworCisJCXBvcnRzWzBdID0gYnVmZmVyWzBdID8gcGFyc2VfdGNwX3BvcnQoYnVmZmVyKSA6IDA7CisJCXBvcnRzWzFdID0gY3BbMF0gPyBwYXJzZV90Y3BfcG9ydChjcCkgOiAweEZGRkY7CisJfQorCWZyZWUoYnVmZmVyKTsKK30KKworc3RydWN0IHRjcF9mbGFnX25hbWVzIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBmbGFnOworfTsKKworc3RhdGljIHN0cnVjdCB0Y3BfZmxhZ19uYW1lcyB0Y3BfZmxhZ19uYW1lc1tdCis9IHsgeyAiRklOIiwgMHgwMSB9LAorICAgIHsgIlNZTiIsIDB4MDIgfSwKKyAgICB7ICJSU1QiLCAweDA0IH0sCisgICAgeyAiUFNIIiwgMHgwOCB9LAorICAgIHsgIkFDSyIsIDB4MTAgfSwKKyAgICB7ICJVUkciLCAweDIwIH0sCisgICAgeyAiQUxMIiwgMHgzRiB9LAorICAgIHsgIk5PTkUiLCAwIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50CitwYXJzZV90Y3BfZmxhZyhjb25zdCBjaGFyICpmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwljaGFyICpwdHI7CisJY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0gc3RyZHVwKGZsYWdzKTsKKworCWZvciAocHRyID0gc3RydG9rKGJ1ZmZlciwgIiwiKTsgcHRyOyBwdHIgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgc2l6ZW9mKHRjcF9mbGFnX25hbWVzKS9zaXplb2Yoc3RydWN0IHRjcF9mbGFnX25hbWVzKTsKKwkJICAgICBpKyspIHsKKwkJCWlmIChzdHJjYXNlY21wKHRjcF9mbGFnX25hbWVzW2ldLm5hbWUsIHB0cikgPT0gMCkgeworCQkJCXJldCB8PSB0Y3BfZmxhZ19uYW1lc1tpXS5mbGFnOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID09IHNpemVvZih0Y3BfZmxhZ19uYW1lcykvc2l6ZW9mKHN0cnVjdCB0Y3BfZmxhZ19uYW1lcykpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJVbmtub3duIFRDUCBmbGFnIGAlcyciLCBidWZmZXIpOworCQl9CisKKwlmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX3RjcF9mbGFncyhzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbywKKwkJY29uc3QgY2hhciAqbWFzaywKKwkJY29uc3QgY2hhciAqY21wLAorCQlpbnQgaW52ZXJ0KQoreworCXRjcGluZm8tPmZsZ19tYXNrID0gcGFyc2VfdGNwX2ZsYWcobWFzayk7CisJdGNwaW5mby0+ZmxnX2NtcCA9IHBhcnNlX3RjcF9mbGFnKGNtcCk7CisKKwlpZiAoaW52ZXJ0KQorCQl0Y3BpbmZvLT5pbnZmbGFncyB8PSBJUFRfVENQX0lOVl9GTEFHUzsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX3RjcF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCB1X2ludDhfdCAqcmVzdWx0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpbmdfdG9fbnVtYmVyKG9wdGlvbiwgMSwgMjU1KTsKKwlpZiAocmV0ID09IC0xKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQmFkIFRDUCBvcHRpb24gYCVzJyIsIG9wdGlvbik7CisKKwkqcmVzdWx0ID0gKHVfaW50OF90KXJldDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgbWF0Y2guICovCitzdGF0aWMgdm9pZAoraW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCit7CisJc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSAoc3RydWN0IGlwdF90Y3AgKiltLT5kYXRhOworCisJdGNwaW5mby0+c3B0c1sxXSA9IHRjcGluZm8tPmRwdHNbMV0gPSAweEZGRkY7Cit9CisKKyNkZWZpbmUgVENQX1NSQ19QT1JUUyAweDAxCisjZGVmaW5lIFRDUF9EU1RfUE9SVFMgMHgwMgorI2RlZmluZSBUQ1BfRkxBR1MgMHgwNAorI2RlZmluZSBUQ1BfT1BUSU9OCTB4MDgKKworLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICBhdGUgYW4gb3B0aW9uLiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSAoc3RydWN0IGlwdF90Y3AgKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoKmZsYWdzICYgVENQX1NSQ19QT1JUUykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk9ubHkgb25lIGAtLXNvdXJjZS1wb3J0JyBhbGxvd2VkIik7CisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlvcHRpbmQrKzsKKwkJcGFyc2VfdGNwX3BvcnRzKGFyZ3Zbb3B0aW5kLTFdLCB0Y3BpbmZvLT5zcHRzKTsKKwkJaWYgKGludmVydCkKKwkJCXRjcGluZm8tPmludmZsYWdzIHw9IElQVF9UQ1BfSU5WX1NSQ1BUOworCQkqZmxhZ3MgfD0gVENQX1NSQ19QT1JUUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX1NSQ19QVDsKKwkJYnJlYWs7CisKKwljYXNlICcyJzoKKwkJaWYgKCpmbGFncyAmIFRDUF9EU1RfUE9SVFMpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJPbmx5IG9uZSBgLS1kZXN0aW5hdGlvbi1wb3J0JyBhbGxvd2VkIik7CisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlvcHRpbmQrKzsKKwkJcGFyc2VfdGNwX3BvcnRzKGFyZ3Zbb3B0aW5kLTFdLCB0Y3BpbmZvLT5kcHRzKTsKKwkJaWYgKGludmVydCkKKwkJCXRjcGluZm8tPmludmZsYWdzIHw9IElQVF9UQ1BfSU5WX0RTVFBUOworCQkqZmxhZ3MgfD0gVENQX0RTVF9QT1JUUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX0RTVF9QVDsKKwkJYnJlYWs7CisKKwljYXNlICczJzoKKwkJaWYgKCpmbGFncyAmIFRDUF9GTEFHUykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk9ubHkgb25lIG9mIGAtLXN5bicgb3IgYC0tdGNwLWZsYWdzJyAiCisJCQkJICAgIiBhbGxvd2VkIik7CisJCXBhcnNlX3RjcF9mbGFncyh0Y3BpbmZvLCAiU1lOLFJTVCxBQ0siLCAiU1lOIiwgaW52ZXJ0KTsKKwkJKmZsYWdzIHw9IFRDUF9GTEFHUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX1RDUEZMQUdTOworCQlicmVhazsKKworCWNhc2UgJzQnOgorCQlpZiAoKmZsYWdzICYgVENQX0ZMQUdTKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiT25seSBvbmUgb2YgYC0tc3luJyBvciBgLS10Y3AtZmxhZ3MnICIKKwkJCQkgICAiIGFsbG93ZWQiKTsKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCW9wdGluZCsrOworCisJCWlmICghYXJndltvcHRpbmRdCisJCSAgICB8fCBhcmd2W29wdGluZF1bMF0gPT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVswXSA9PSAnIScpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICItLXRjcC1mbGFncyByZXF1aXJlcyB0d28gYXJncy4iKTsKKworCQlwYXJzZV90Y3BfZmxhZ3ModGNwaW5mbywgb3B0YXJnLCBhcmd2W29wdGluZCsrXSwgaW52ZXJ0KTsKKwkJKmZsYWdzIHw9IFRDUF9GTEFHUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX1RDUEZMQUdTOworCQlicmVhazsKKworCWNhc2UgJzUnOgorCQlpZiAoKmZsYWdzICYgVENQX09QVElPTikKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk9ubHkgb25lIGAtLXRjcC1vcHRpb24nIGFsbG93ZWQiKTsKKwkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCW9wdGluZCsrOworCQlwYXJzZV90Y3Bfb3B0aW9uKGFyZ3Zbb3B0aW5kLTFdLCAmdGNwaW5mby0+b3B0aW9uKTsKKwkJaWYgKGludmVydCkKKwkJCXRjcGluZm8tPmludmZsYWdzIHw9IElQVF9UQ1BfSU5WX09QVElPTjsKKwkJKmZsYWdzIHw9IFRDUF9PUFRJT047CisJCSpuZmNhY2hlIHw9IE5GQ19JUF9QUk9UT19VTktOT1dOOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBGaW5hbCBjaGVjazsgd2UgZG9uJ3QgY2FyZS4gKi8KK3N0YXRpYyB2b2lkCitmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BvcnRfdG9fc2VydmljZShpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKKworCWlmICgoc2VydmljZSA9IGdldHNlcnZieXBvcnQoaHRvbnMocG9ydCksICJ0Y3AiKSkpCisJCXJldHVybiBzZXJ2aWNlLT5zX25hbWU7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3BvcnQodV9pbnQxNl90IHBvcnQsIGludCBudW1lcmljKQoreworCWNoYXIgKnNlcnZpY2U7CisKKwlpZiAobnVtZXJpYyB8fCAoc2VydmljZSA9IHBvcnRfdG9fc2VydmljZShwb3J0KSkgPT0gTlVMTCkKKwkJcHJpbnRmKCIldSIsIHBvcnQpOworCWVsc2UKKwkJcHJpbnRmKCIlcyIsIHNlcnZpY2UpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcG9ydHMoY29uc3QgY2hhciAqbmFtZSwgdV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwKKwkgICAgaW50IGludmVydCwgaW50IG51bWVyaWMpCit7CisJY29uc3QgY2hhciAqaW52ID0gaW52ZXJ0ID8gIiEiIDogIiI7CisKKwlpZiAobWluICE9IDAgfHwgbWF4ICE9IDB4RkZGRiB8fCBpbnZlcnQpIHsKKwkJcHJpbnRmKCIlcyIsIG5hbWUpOworCQlpZiAobWluID09IG1heCkgeworCQkJcHJpbnRmKCI6JXMiLCBpbnYpOworCQkJcHJpbnRfcG9ydChtaW4sIG51bWVyaWMpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJzOiVzIiwgaW52KTsKKwkJCXByaW50X3BvcnQobWluLCBudW1lcmljKTsKKwkJCXByaW50ZigiOiIpOworCQkJcHJpbnRfcG9ydChtYXgsIG51bWVyaWMpOworCQl9CisJCXByaW50ZigiICIpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X29wdGlvbih1X2ludDhfdCBvcHRpb24sIGludCBpbnZlcnQsIGludCBudW1lcmljKQoreworCWlmIChvcHRpb24gfHwgaW52ZXJ0KQorCQlwcmludGYoIm9wdGlvbj0lcyV1ICIsIGludmVydCA/ICIhIiA6ICIiLCBvcHRpb24pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdGNwZih1X2ludDhfdCBmbGFncykKK3sKKwlpbnQgc29sZV9mbGFnID0gMTsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJLyogVGVybWluYXRlcyBiZWNhdXNlIGxhc3QgZmxhZyBpcyAwICovCisJCWZvciAoaSA9IDA7ICEoZmxhZ3MgJiB0Y3BfZmxhZ19uYW1lc1tpXS5mbGFnKTsgaSsrKTsKKworCQlpZiAoIXNvbGVfZmxhZykKKwkJCXByaW50ZigiLCIpOworCQlwcmludGYoIiVzIiwgdGNwX2ZsYWdfbmFtZXNbaV0ubmFtZSk7CisJCXNvbGVfZmxhZyA9IDA7CisKKwkJZmxhZ3MgJj0gfnRjcF9mbGFnX25hbWVzW2ldLmZsYWc7CisJfSB3aGlsZSAoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZmxhZ3ModV9pbnQ4X3QgbWFzaywgdV9pbnQ4X3QgY21wLCBpbnQgaW52ZXJ0LCBpbnQgbnVtZXJpYykKK3sKKwlpZiAobWFzayB8fCBpbnZlcnQpIHsKKwkJcHJpbnRmKCJmbGFnczolcyIsIGludmVydCA/ICIhIiA6ICIiKTsKKwkJaWYgKG51bWVyaWMpCisJCQlwcmludGYoIjB4MDIlWC8weDAyJVggIiwgbWFzaywgY21wKTsKKwkJZWxzZSB7CisJCQlwcmludF90Y3BmKGNtcCk7CisJCQlwcmludGYoIi8iKTsKKwkJCXByaW50X3RjcGYobWFzayk7CisJCQlwcmludGYoIiAiKTsKKwkJfQorCX0KK30KKworLyogUHJpbnRzIG91dCB0aGUgdW5pb24gaXB0X21hdGNoaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoLCBpbnQgbnVtZXJpYykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwID0gKHN0cnVjdCBpcHRfdGNwICopbWF0Y2gtPmRhdGE7CisKKwlwcmludGYoInRjcCAiKTsKKwlwcmludF9wb3J0cygic3B0IiwgdGNwLT5zcHRzWzBdLCB0Y3AtPnNwdHNbMV0sCisJCSAgICB0Y3AtPmludmZsYWdzICYgSVBUX1RDUF9JTlZfU1JDUFQsCisJCSAgICBudW1lcmljKTsKKwlwcmludF9wb3J0cygiZHB0IiwgdGNwLT5kcHRzWzBdLCB0Y3AtPmRwdHNbMV0sCisJCSAgICB0Y3AtPmludmZsYWdzICYgSVBUX1RDUF9JTlZfRFNUUFQsCisJCSAgICBudW1lcmljKTsKKwlwcmludF9vcHRpb24odGNwLT5vcHRpb24sCisJCSAgICAgdGNwLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX09QVElPTiwKKwkJICAgICBudW1lcmljKTsKKwlwcmludF9mbGFncyh0Y3AtPmZsZ19tYXNrLCB0Y3AtPmZsZ19jbXAsCisJCSAgICB0Y3AtPmludmZsYWdzICYgSVBUX1RDUF9JTlZfRkxBR1MsCisJCSAgICBudW1lcmljKTsKKwlpZiAodGNwLT5pbnZmbGFncyAmIH5JUFRfVENQX0lOVl9NQVNLKQorCQlwcmludGYoIlVua25vd24gaW52ZmxhZ3M6IDB4JVggIiwKKwkJICAgICAgIHRjcC0+aW52ZmxhZ3MgJiB+SVBUX1RDUF9JTlZfTUFTSyk7Cit9CisKKy8qIFNhdmVzIHRoZSB1bmlvbiBpcHRfbWF0Y2hpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworc3RhdGljIHZvaWQgc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJY29uc3Qgc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSAoc3RydWN0IGlwdF90Y3AgKiltYXRjaC0+ZGF0YTsKKworCWlmICh0Y3BpbmZvLT5zcHRzWzBdICE9IDAKKwkgICAgJiYgdGNwaW5mby0+c3B0c1sxXSAhPSAweEZGRkYpIHsKKwkJaWYgKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfU1JDUFQpCisJCQlwcmludGYoIiEgIik7CisJCWlmICh0Y3BpbmZvLT5zcHRzWzBdCisJCSAgICAhPSB0Y3BpbmZvLT5zcHRzWzFdKQorCQkJcHJpbnRmKCItLXNwb3J0ICV1LSV1ICIsCisJCQkgICAgICAgbnRvaHModGNwaW5mby0+c3B0c1swXSksCisJCQkgICAgICAgbnRvaHModGNwaW5mby0+c3B0c1sxXSkpOworCQllbHNlCisJCQlwcmludGYoIi0tc3BvcnQgJXUgIiwKKwkJCSAgICAgICBudG9ocyh0Y3BpbmZvLT5zcHRzWzBdKSk7CisJfQorCisJaWYgKHRjcGluZm8tPmRwdHNbMF0gIT0gMAorCSAgICAmJiB0Y3BpbmZvLT5kcHRzWzFdICE9IDB4RkZGRikgeworCQlpZiAodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9EU1RQVCkKKwkJCXByaW50ZigiISAiKTsKKwkJaWYgKHRjcGluZm8tPmRwdHNbMF0KKwkJICAgICE9IHRjcGluZm8tPmRwdHNbMV0pCisJCQlwcmludGYoIi0tZHBvcnQgJXUtJXUgIiwKKwkJCSAgICAgICBudG9ocyh0Y3BpbmZvLT5kcHRzWzBdKSwKKwkJCSAgICAgICBudG9ocyh0Y3BpbmZvLT5kcHRzWzFdKSk7CisJCWVsc2UKKwkJCXByaW50ZigiLS1kcG9ydCAldSAiLAorCQkJICAgICAgIG50b2hzKHRjcGluZm8tPmRwdHNbMF0pKTsKKwl9CisKKwlpZiAodGNwaW5mby0+b3B0aW9uCisJICAgIHx8ICh0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX09QVElPTikpIHsKKwkJaWYgKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfT1BUSU9OKQorCQkJcHJpbnRmKCIhICIpOworCQlwcmludGYoIi0tdGNwLW9wdGlvbiAldSAiLCB0Y3BpbmZvLT5vcHRpb24pOworCX0KKworCWlmICh0Y3BpbmZvLT5mbGdfbWFzaworCSAgICB8fCAodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9GTEFHUykpIHsKKwkJaWYgKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfRkxBR1MpCisJCQlwcmludGYoIiEgIik7CisKKwkJcHJpbnRfdGNwZih0Y3BpbmZvLT5mbGdfY21wKTsKKwkJaWYgKHRjcGluZm8tPmZsZ19tYXNrICE9IDB4RkYpIHsKKwkJCXByaW50ZigiLyIpOworCQkJcHJpbnRfdGNwZih0Y3BpbmZvLT5mbGdfbWFzayk7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBpcHRhYmxlc19tYXRjaCB0Y3AKKz0geyBOVUxMLAorICAgICJ0Y3AiLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIHNpemVvZihzdHJ1Y3QgaXB0X3RjcCksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cyB9OworCit2b2lkCitfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX21hdGNoKCZ0Y3ApOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfdG9zLmMgYi9leHRlbnNpb25zL2xpYmlwdF90b3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjYyMDgxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfdG9zLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgVE9TIG1hdGNoaW5nIHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8aXB0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdG9zLmg+CisKKy8qIFRPUyBuYW1lcyBhbmQgdmFsdWVzLiAqLworc3RydWN0IFRPU192YWx1ZQoreworCXVuc2lnbmVkIGNoYXIgVE9TOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IFRPU192YWx1ZXNbXSA9IHsKKwl7IElQVE9TX0xPV0RFTEFZLCAgICAiTWluaW1pemUtRGVsYXkiIH0sCisJeyBJUFRPU19USFJPVUdIUFVULCAgIk1heGltaXplLVRocm91Z2hwdXQiIH0sCisJeyBJUFRPU19SRUxJQUJJTElUWSwgIk1heGltaXplLVJlbGlhYmlsaXR5IiB9LAorCXsgSVBUT1NfTUlOQ09TVCwgICAgICJNaW5pbWl6ZS1Db3N0IiB9LAorCXsgSVBUT1NfTk9STUFMU1ZDLCAgICJOb3JtYWwtU2VydmljZSIgfSwKK307CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJcHJpbnRmKAorIlRPUyBtYXRjaCB2JXMgb3B0aW9uczpcbiIKKyJbIV0gLS10b3MgdmFsdWUgICAgICAgICAgICAgICAgIE1hdGNoIFR5cGUgb2YgU2VydmljZSBmaWVsZCBmcm9tIG9uZSBvZiB0aGVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBudW1lcmljIG9yIGRlc2NyaXB0aXZlIHZhbHVlczpcbiIsCitORVRGSUxURVJfVkVSU0lPTik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFRPU192YWx1ZXMpL3NpemVvZihzdHJ1Y3QgVE9TX3ZhbHVlKTtpKyspCisJCXByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzICV1ICgweCUwMngpXG4iLAorCQkgICAgICAgVE9TX3ZhbHVlc1tpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBUT1NfdmFsdWVzW2ldLlRPUywKKyAgICAgICAgICAgICAgICAgICAgICAgVE9TX3ZhbHVlc1tpXS5UT1MpOworCWZwdXRjKCdcbicsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7ICJ0b3MiLCAxLCAwLCAnMScgfSwKKwl7MH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCSpuZmNhY2hlIHw9IE5GQ19JUF9UT1M7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV90b3MoY29uc3QgdW5zaWduZWQgY2hhciAqcywgc3RydWN0IGlwdF90b3NfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgdG9zID0gc3RyaW5nX3RvX251bWJlcihzLCAwLCAyNTUpOworCisJaWYgKHRvcyAhPSAtMSkgeworCQlpZiAodG9zID09IElQVE9TX0xPV0RFTEFZCisJCSAgICB8fCB0b3MgPT0gSVBUT1NfVEhST1VHSFBVVAorCQkgICAgfHwgdG9zID09IElQVE9TX1JFTElBQklMSVRZCisJCSAgICB8fCB0b3MgPT0gSVBUT1NfTUlOQ09TVAorCQkgICAgfHwgdG9zID09IElQVE9TX05PUk1BTFNWQykgeworCQkgICAgCWluZm8tPnRvcyA9ICh1X2ludDhfdCApdG9zOworCQkgICAgCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGk8c2l6ZW9mKFRPU192YWx1ZXMpL3NpemVvZihzdHJ1Y3QgVE9TX3ZhbHVlKTsgaSsrKQorCQkJaWYgKHN0cmNhc2VjbXAocyxUT1NfdmFsdWVzW2ldLm5hbWUpID09IDApIHsKKwkJCQlpbmZvLT50b3MgPSBUT1NfdmFsdWVzW2ldLlRPUzsKKwkJCQlyZXR1cm47CisJCQl9CisJfQorCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJCYWQgVE9TIHZhbHVlIGAlcyciLCBzKTsKK30KKworLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICBhdGUgYW4gb3B0aW9uICovCitzdGF0aWMgaW50CitwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBpbnZlcnQsIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKyAgICAgIHVuc2lnbmVkIGludCAqbmZjYWNoZSwKKyAgICAgIHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKiptYXRjaCkKK3sKKwlzdHJ1Y3QgaXB0X3Rvc19pbmZvICp0b3NpbmZvID0gKHN0cnVjdCBpcHRfdG9zX2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoY2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQorCQkJb3B0aW5kKys7CisJCXBhcnNlX3Rvcyhhcmd2W29wdGluZC0xXSwgdG9zaW5mbyk7CisJCWlmIChpbnZlcnQpCisJCQl0b3NpbmZvLT5pbnZlcnQgPSAxOworCQkqZmxhZ3MgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3Rvcyh1X2ludDhfdCB0b3MsIGludCBpbnZlcnQsIGludCBudW1lcmljKQoreworCXVuc2lnbmVkIGludCBpOworCQorCWlmIChpbnZlcnQpCisJCWZwdXRjKCchJywgc3Rkb3V0KTsKKwkJCisJaWYgKCFudW1lcmljKSB7CisJCWZvciAoaSA9IDA7IGk8c2l6ZW9mKFRPU192YWx1ZXMpL3NpemVvZihzdHJ1Y3QgVE9TX3ZhbHVlKTsgaSsrKQorCQkJaWYgKFRPU192YWx1ZXNbaV0uVE9TID09IHRvcykgeworCQkJCXByaW50ZigiJXMgIiwgVE9TX3ZhbHVlc1tpXS5uYW1lKTsKKwkJCQlyZXR1cm47CisJCQl9CisJfQorCXByaW50ZigiMHglMDJ4ICIsIHRvcyk7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBtdXN0IGhhdmUgc3BlY2lmaWVkIC0tdG9zLiAqLworc3RhdGljIHZvaWQKK2ZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoIWZsYWdzKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIlRPUyBtYXRjaDogWW91IG11c3Qgc3BlY2lmeSBgLS10b3MnIik7Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8KK3N0YXRpYyB2b2lkCitwcmludChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoLAorICAgICAgaW50IG51bWVyaWMpCit7CisJcHJpbnRmKCJUT1MgbWF0Y2ggIik7CisJcHJpbnRfdG9zKCgoc3RydWN0IGlwdF90b3NfaW5mbyAqKW1hdGNoLT5kYXRhKS0+dG9zLAorCQkgICgoc3RydWN0IGlwdF90b3NfaW5mbyAqKW1hdGNoLT5kYXRhKS0+aW52ZXJ0LCBudW1lcmljKTsKK30KKworLyogU2F2ZXMgdGhlIHVuaW9uIGlwdF9tYXRjaGluZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCitzdGF0aWMgdm9pZAorc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJcHJpbnRmKCItLXRvcyAiKTsKKwlwcmludF90b3MoKChzdHJ1Y3QgaXB0X3Rvc19pbmZvICopbWF0Y2gtPmRhdGEpLT50b3MsCisJCSAgKChzdHJ1Y3QgaXB0X3Rvc19pbmZvICopbWF0Y2gtPmRhdGEpLT5pbnZlcnQsIDApOworfQorCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggdG9zCis9IHsgTlVMTCwKKyAgICAidG9zIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF90b3NfaW5mbyksCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICAmcHJpbnQsCisgICAgJnNhdmUsCisgICAgb3B0cworfTsKKwordm9pZCBfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX21hdGNoKCZ0b3MpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9saWJpcHRfdWRwLmMgYi9leHRlbnNpb25zL2xpYmlwdF91ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU5MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9saWJpcHRfdWRwLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IGFkZC1vbiB0byBpcHRhYmxlcyB0byBhZGQgVURQIHN1cHBvcnQuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkCitoZWxwKHZvaWQpCit7CisJcHJpbnRmKAorIlVEUCB2JXMgb3B0aW9uczpcbiIKKyIgLS1zb3VyY2UtcG9ydCBbIV0gcG9ydFs6cG9ydF1cbiIKKyIgLS1zcG9ydCAuLi5cbiIKKyIJCQkJbWF0Y2ggc291cmNlIHBvcnQocylcbiIKKyIgLS1kZXN0aW5hdGlvbi1wb3J0IFshXSBwb3J0Wzpwb3J0XVxuIgorIiAtLWRwb3J0IC4uLlxuIgorIgkJCQltYXRjaCBkZXN0aW5hdGlvbiBwb3J0KHMpXG4iLAorTkVURklMVEVSX1ZFUlNJT04pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAic291cmNlLXBvcnQiLCAxLCAwLCAnMScgfSwKKwl7ICJzcG9ydCIsIDEsIDAsICcxJyB9LCAvKiBzeW5vbnltICovCisJeyAiZGVzdGluYXRpb24tcG9ydCIsIDEsIDAsICcyJyB9LAorCXsgImRwb3J0IiwgMSwgMCwgJzInIH0sIC8qIHN5bm9ueW0gKi8KKwl7MH0KK307CisKK3N0YXRpYyBpbnQKK3NlcnZpY2VfdG9fcG9ydChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZXJ2ZW50ICpzZXJ2aWNlOworCisJaWYgKChzZXJ2aWNlID0gZ2V0c2VydmJ5bmFtZShuYW1lLCAidWRwIikpICE9IE5VTEwpCisJCXJldHVybiBudG9ocygodW5zaWduZWQgc2hvcnQpIHNlcnZpY2UtPnNfcG9ydCk7CisKKwkJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdV9pbnQxNl90CitwYXJzZV91ZHBfcG9ydChjb25zdCBjaGFyICpwb3J0KQoreworCWludCBwb3J0bnVtOworCisJaWYgKChwb3J0bnVtID0gc3RyaW5nX3RvX251bWJlcihwb3J0LCAwLCA2NTUzNSkpICE9IC0xIHx8CisJICAgIChwb3J0bnVtID0gc2VydmljZV90b19wb3J0KHBvcnQpKSAhPSAtMSkKKwkJcmV0dXJuICh1X2ludDE2X3QpcG9ydG51bTsKKworCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgImludmFsaWQgVURQIHBvcnQvc2VydmljZSBgJXMnIHNwZWNpZmllZCIsIHBvcnQpOworCX0KKworc3RhdGljIHZvaWQKK3BhcnNlX3VkcF9wb3J0cyhjb25zdCBjaGFyICpwb3J0c3RyaW5nLCB1X2ludDE2X3QgKnBvcnRzKQoreworCWNoYXIgKmJ1ZmZlcjsKKwljaGFyICpjcDsKKworCWJ1ZmZlciA9IHN0cmR1cChwb3J0c3RyaW5nKTsKKwlpZiAoKGNwID0gc3RyY2hyKGJ1ZmZlciwgJzonKSkgPT0gTlVMTCkKKwkJcG9ydHNbMF0gPSBwb3J0c1sxXSA9IHBhcnNlX3VkcF9wb3J0KGJ1ZmZlcik7CisJZWxzZSB7CisJCSpjcCA9ICdcMCc7CisJCWNwKys7CisKKwkJcG9ydHNbMF0gPSBidWZmZXJbMF0gPyBwYXJzZV91ZHBfcG9ydChidWZmZXIpIDogMDsKKwkJcG9ydHNbMV0gPSBjcFswXSA/IHBhcnNlX3VkcF9wb3J0KGNwKSA6IDB4RkZGRjsKKwl9CisJZnJlZShidWZmZXIpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8KK3N0YXRpYyB2b2lkCitpbml0KHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqbmZjYWNoZSkKK3sKKwlzdHJ1Y3QgaXB0X3VkcCAqdWRwaW5mbyA9IChzdHJ1Y3QgaXB0X3VkcCAqKW0tPmRhdGE7CisKKwl1ZHBpbmZvLT5zcHRzWzFdID0gdWRwaW5mby0+ZHB0c1sxXSA9IDB4RkZGRjsKK30KKworI2RlZmluZSBVRFBfU1JDX1BPUlRTIDB4MDEKKyNkZWZpbmUgVURQX0RTVF9QT1JUUyAweDAyCisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGlwdF91ZHAgKnVkcGluZm8gPSAoc3RydWN0IGlwdF91ZHAgKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQlpZiAoKmZsYWdzICYgVURQX1NSQ19QT1JUUykKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIk9ubHkgb25lIGAtLXNvdXJjZS1wb3J0JyBhbGxvd2VkIik7CisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlvcHRpbmQrKzsKKwkJcGFyc2VfdWRwX3BvcnRzKGFyZ3Zbb3B0aW5kLTFdLCB1ZHBpbmZvLT5zcHRzKTsKKwkJaWYgKGludmVydCkKKwkJCXVkcGluZm8tPmludmZsYWdzIHw9IElQVF9VRFBfSU5WX1NSQ1BUOworCQkqZmxhZ3MgfD0gVURQX1NSQ19QT1JUUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX1NSQ19QVDsKKwkJYnJlYWs7CisKKwljYXNlICcyJzoKKwkJaWYgKCpmbGFncyAmIFVEUF9EU1RfUE9SVFMpCisJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCSAgICJPbmx5IG9uZSBgLS1kZXN0aW5hdGlvbi1wb3J0JyBhbGxvd2VkIik7CisJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQlvcHRpbmQrKzsKKwkJcGFyc2VfdWRwX3BvcnRzKGFyZ3Zbb3B0aW5kLTFdLCB1ZHBpbmZvLT5kcHRzKTsKKwkJaWYgKGludmVydCkKKwkJCXVkcGluZm8tPmludmZsYWdzIHw9IElQVF9VRFBfSU5WX0RTVFBUOworCQkqZmxhZ3MgfD0gVURQX0RTVF9QT1JUUzsKKwkJKm5mY2FjaGUgfD0gTkZDX0lQX0RTVF9QVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRmluYWwgY2hlY2s7IHdlIGRvbid0IGNhcmUuICovCitzdGF0aWMgdm9pZAorZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworfQorCitzdGF0aWMgY2hhciAqCitwb3J0X3RvX3NlcnZpY2UoaW50IHBvcnQpCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZpY2U7CisKKwlpZiAoKHNlcnZpY2UgPSBnZXRzZXJ2Ynlwb3J0KGh0b25zKHBvcnQpLCAidWRwIikpKQorCQlyZXR1cm4gc2VydmljZS0+c19uYW1lOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9wb3J0KHVfaW50MTZfdCBwb3J0LCBpbnQgbnVtZXJpYykKK3sKKwljaGFyICpzZXJ2aWNlOworCisJaWYgKG51bWVyaWMgfHwgKHNlcnZpY2UgPSBwb3J0X3RvX3NlcnZpY2UocG9ydCkpID09IE5VTEwpCisJCXByaW50ZigiJXUiLCBwb3J0KTsKKwllbHNlCisJCXByaW50ZigiJXMiLCBzZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3BvcnRzKGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsCisJICAgIGludCBpbnZlcnQsIGludCBudW1lcmljKQoreworCWNvbnN0IGNoYXIgKmludiA9IGludmVydCA/ICIhIiA6ICIiOworCisJaWYgKG1pbiAhPSAwIHx8IG1heCAhPSAweEZGRkYgfHwgaW52ZXJ0KSB7CisJCXByaW50ZigiJXMiLCBuYW1lKTsKKwkJaWYgKG1pbiA9PSBtYXgpIHsKKwkJCXByaW50ZigiOiVzIiwgaW52KTsKKwkJCXByaW50X3BvcnQobWluLCBudW1lcmljKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiczolcyIsIGludik7CisJCQlwcmludF9wb3J0KG1pbiwgbnVtZXJpYyk7CisJCQlwcmludGYoIjoiKTsKKwkJCXByaW50X3BvcnQobWF4LCBudW1lcmljKTsKKwkJfQorCQlwcmludGYoIiAiKTsKKwl9Cit9CisKKy8qIFByaW50cyBvdXQgdGhlIHVuaW9uIGlwdF9tYXRjaGluZm8uICovCitzdGF0aWMgdm9pZAorcHJpbnQoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwgaW50IG51bWVyaWMpCit7CisJY29uc3Qgc3RydWN0IGlwdF91ZHAgKnVkcCA9IChzdHJ1Y3QgaXB0X3VkcCAqKW1hdGNoLT5kYXRhOworCisJcHJpbnRmKCJ1ZHAgIik7CisJcHJpbnRfcG9ydHMoInNwdCIsIHVkcC0+c3B0c1swXSwgdWRwLT5zcHRzWzFdLAorCQkgICAgdWRwLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX1NSQ1BULAorCQkgICAgbnVtZXJpYyk7CisJcHJpbnRfcG9ydHMoImRwdCIsIHVkcC0+ZHB0c1swXSwgdWRwLT5kcHRzWzFdLAorCQkgICAgdWRwLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX0RTVFBULAorCQkgICAgbnVtZXJpYyk7CisJaWYgKHVkcC0+aW52ZmxhZ3MgJiB+SVBUX1VEUF9JTlZfTUFTSykKKwkJcHJpbnRmKCJVbmtub3duIGludmZsYWdzOiAweCVYICIsCisJCSAgICAgICB1ZHAtPmludmZsYWdzICYgfklQVF9VRFBfSU5WX01BU0spOworfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X21hdGNoaW5mbyBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkIHNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCWNvbnN0IHN0cnVjdCBpcHRfdWRwICp1ZHBpbmZvID0gKHN0cnVjdCBpcHRfdWRwICopbWF0Y2gtPmRhdGE7CisKKwlpZiAodWRwaW5mby0+c3B0c1swXSAhPSAwCisJICAgICYmIHVkcGluZm8tPnNwdHNbMV0gIT0gMHhGRkZGKSB7CisJCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX1NSQ1BUKQorCQkJcHJpbnRmKCIhICIpOworCQlpZiAodWRwaW5mby0+c3B0c1swXQorCQkgICAgIT0gdWRwaW5mby0+c3B0c1sxXSkKKwkJCXByaW50ZigiLS1zcG9ydCAldS0ldSAiLAorCQkJICAgICAgIG50b2hzKHVkcGluZm8tPnNwdHNbMF0pLAorCQkJICAgICAgIG50b2hzKHVkcGluZm8tPnNwdHNbMV0pKTsKKwkJZWxzZQorCQkJcHJpbnRmKCItLXNwb3J0ICV1ICIsCisJCQkgICAgICAgbnRvaHModWRwaW5mby0+c3B0c1swXSkpOworCX0KKworCWlmICh1ZHBpbmZvLT5kcHRzWzBdICE9IDAKKwkgICAgJiYgdWRwaW5mby0+ZHB0c1sxXSAhPSAweEZGRkYpIHsKKwkJaWYgKHVkcGluZm8tPmludmZsYWdzICYgSVBUX1VEUF9JTlZfRFNUUFQpCisJCQlwcmludGYoIiEgIik7CisJCWlmICh1ZHBpbmZvLT5kcHRzWzBdCisJCSAgICAhPSB1ZHBpbmZvLT5kcHRzWzFdKQorCQkJcHJpbnRmKCItLWRwb3J0ICV1LSV1ICIsCisJCQkgICAgICAgbnRvaHModWRwaW5mby0+ZHB0c1swXSksCisJCQkgICAgICAgbnRvaHModWRwaW5mby0+ZHB0c1sxXSkpOworCQllbHNlCisJCQlwcmludGYoIi0tZHBvcnQgJXUgIiwKKwkJCSAgICAgICBudG9ocyh1ZHBpbmZvLT5kcHRzWzBdKSk7CisJfQorfQorCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggdWRwCis9IHsgTlVMTCwKKyAgICAidWRwIiwKKyAgICBORVRGSUxURVJfVkVSU0lPTiwKKyAgICBzaXplb2Yoc3RydWN0IGlwdF91ZHApLAorICAgICZoZWxwLAorICAgICZpbml0LAorICAgICZwYXJzZSwKKyAgICAmZmluYWxfY2hlY2ssCisgICAgJnByaW50LAorICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQKK19pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfbWF0Y2goJnVkcCk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2xpYmlwdF91bmNsZWFuLmMgYi9leHRlbnNpb25zL2xpYmlwdF91bmNsZWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNjJiZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvbGliaXB0X3VuY2xlYW4uYwpAQCAtMCwwICsxLDY2IEBACisvKiBTaGFyZWQgbGlicmFyeSBhZGQtb24gdG8gaXB0YWJsZXMgZm9yIHVuY2xlYW4uICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxpcHRhYmxlcy5oPgorCisvKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCitzdGF0aWMgdm9pZAoraGVscCh2b2lkKQoreworCXByaW50ZigKKyJ1bmNsZWFuIHYlcyB0YWtlcyBubyBvcHRpb25zXG4iCisiXG4iLCBORVRGSUxURVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwl7MH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQKK2luaXQoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKQoreworCS8qIENhbid0IGNhY2hlIHRoaXMuICovCisJKm5mY2FjaGUgfD0gTkZDX1VOS05PV047Cit9CisKKy8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgYXRlIGFuIG9wdGlvbiAqLworc3RhdGljIGludAorcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisgICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmFsIGNoZWNrOyBtdXN0IGhhdmUgc3BlY2lmaWVkIC0tbWFjLiAqLworc3RhdGljIHZvaWQgZmluYWxfY2hlY2sodW5zaWduZWQgaW50IGZsYWdzKQoreworfQorCisvKiBTYXZlcyB0aGUgdW5pb24gaXB0X21hdGNoaW5mbyBpbiBwYXJzYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkIHNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworfQorCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggdW5jbGVhbgorPSB7IE5VTEwsCisgICAgInVuY2xlYW4iLAorICAgIE5FVEZJTFRFUl9WRVJTSU9OLAorICAgIDAsCisgICAgJmhlbHAsCisgICAgJmluaXQsCisgICAgJnBhcnNlLAorICAgICZmaW5hbF9jaGVjaywKKyAgICBOVUxMLCAvKiBwcmludCAqLworICAgICZzYXZlLAorICAgIG9wdHMKK307CisKK3ZvaWQgX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9tYXRjaCgmdW5jbGVhbik7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2lwdGFibGVzLmggYi9pbmNsdWRlL2lwdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxYTRhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXB0YWJsZXMuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfSVBUQUJMRVNfVVNFUl9ICisjZGVmaW5lIF9JUFRBQkxFU19VU0VSX0gKKworI2luY2x1ZGUgImxpYmlwdGMvbGliaXB0Yy5oIgorCisvKiBJbmNsdWRlIGZpbGUgZm9yIGFkZGl0aW9uczogbmV3IG1hdGNoZXMgYW5kIHRhcmdldHMuICovCitzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2gKK3sKKwlzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggKm5leHQ7CisKKwlpcHRfY2hhaW5sYWJlbCBuYW1lOworCisJY29uc3QgY2hhciAqdmVyc2lvbjsKKworCS8qIFNpemUgb2YgbWF0Y2ggZGF0YS4gKi8KKwlzaXplX3Qgc2l6ZTsKKworCS8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KKwl2b2lkICgqaGVscCkodm9pZCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8KKwl2b2lkICgqaW5pdCkoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICpuZmNhY2hlKTsKKworCS8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAorICAgICAgICAgICBhdGUgYW4gb3B0aW9uICovCisJaW50ICgqcGFyc2UpKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKKwkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKKwkJICAgICB1bnNpZ25lZCBpbnQgKm5mY2FjaGUsCisJCSAgICAgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqKm1hdGNoKTsKKworCS8qIEZpbmFsIGNoZWNrOyBleGl0IGlmIG5vdCBvay4gKi8KKwl2b2lkICgqZmluYWxfY2hlY2spKHVuc2lnbmVkIGludCBmbGFncyk7CisKKwkvKiBQcmludHMgb3V0IHRoZSBtYXRjaCBpZmYgbm9uLU5VTEw6IHB1dCBzcGFjZSBhdCBlbmQgKi8KKwl2b2lkICgqcHJpbnQpKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwgaW50IG51bWVyaWMpOworCisJLyogU2F2ZXMgdGhlIHVuaW9uIGlwdF9tYXRjaGluZm8gaW4gcGFyc2FibGUgZm9ybSB0byBzdGRvdXQuICovCisJdm9pZCAoKnNhdmUpKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKTsKKworCS8qIFBvaW50ZXIgdG8gbGlzdCBvZiBleHRyYSBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworCXN0cnVjdCBvcHRpb24gKmV4dHJhX29wdHM7CisKKwkvKiBJZ25vcmUgdGhlc2UgbWVuIGJlaGluZCB0aGUgY3VydGFpbjogKi8KKwl1bnNpZ25lZCBpbnQgb3B0aW9uX29mZnNldDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptOworCXVuc2lnbmVkIGludCBtZmxhZ3M7Cit9OworCitzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0Cit7CisJc3RydWN0IGlwdGFibGVzX3RhcmdldCAqbmV4dDsKKworCWlwdF9jaGFpbmxhYmVsIG5hbWU7CisKKwljb25zdCBjaGFyICp2ZXJzaW9uOworCisJLyogU2l6ZSBvZiB0YXJnZXQgZGF0YS4gKi8KKwlzaXplX3Qgc2l6ZTsKKworCS8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8KKwl2b2lkICgqaGVscCkodm9pZCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0YXJnZXQuICovCisJdm9pZCAoKmluaXQpKHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpOworCisJLyogRnVuY3Rpb24gd2hpY2ggcGFyc2VzIGNvbW1hbmQgb3B0aW9uczsgcmV0dXJucyB0cnVlIGlmIGl0CisgICAgICAgICAgIGF0ZSBhbiBvcHRpb24gKi8KKwlpbnQgKCpwYXJzZSkoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorCQkgICAgIHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KTsKKworCS8qIEZpbmFsIGNoZWNrOyBleGl0IGlmIG5vdCBvay4gKi8KKwl2b2lkICgqZmluYWxfY2hlY2spKHVuc2lnbmVkIGludCBmbGFncyk7CisKKwkvKiBQcmludHMgb3V0IHRoZSB0YXJnZXQgaWZmIG5vbi1OVUxMOiBwdXQgc3BhY2UgYXQgZW5kICovCisJdm9pZCAoKnByaW50KShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhcmdldCwgaW50IG51bWVyaWMpOworCisJLyogU2F2ZXMgdGhlIHRhcmdpbmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLworCXZvaWQgKCpzYXZlKShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KTsKKworCS8qIFBvaW50ZXIgdG8gbGlzdCBvZiBleHRyYSBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworCXN0cnVjdCBvcHRpb24gKmV4dHJhX29wdHM7CisKKwkvKiBJZ25vcmUgdGhlc2UgbWVuIGJlaGluZCB0aGUgY3VydGFpbjogKi8KKwl1bnNpZ25lZCBpbnQgb3B0aW9uX29mZnNldDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKwl1bnNpZ25lZCBpbnQgdGZsYWdzOworfTsKKworLyogWW91ciBzaGFyZWQgbGlicmFyeSBzaG91bGQgY2FsbCBvbmUgb2YgdGhlc2UuICovCitleHRlcm4gdm9pZCByZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggKm1lKTsKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICptZSk7CisKKy8qIEZ1bmN0aW9ucyB3ZSBzaGFyZSAqLworZW51bSBleGl0dHlwZSB7CisJT1RIRVJfUFJPQkxFTSA9IDEsCisJUEFSQU1FVEVSX1BST0JMRU0sCisJVkVSU0lPTl9QUk9CTEVNCit9OworZXh0ZXJuIHZvaWQgZXhpdF9wcmludGhlbHAoKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworZXh0ZXJuIHZvaWQgZXhpdF90cnloZWxwKGludCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK2ludCBjaGVja19pbnZlcnNlKGNvbnN0IGNoYXIgb3B0aW9uW10sIGludCAqaW52ZXJ0KTsKK2V4dGVybiBpbnQgc3RyaW5nX3RvX251bWJlcihjb25zdCBjaGFyICosIGludCwgaW50KTsKK3ZvaWQgZXhpdF9lcnJvcihlbnVtIGV4aXR0eXBlLCBjaGFyICosIC4uLilfX2F0dHJpYnV0ZV9fKChub3JldHVybiwKKwkJCQkJCQkgIGZvcm1hdChwcmludGYsMiwzKSkpOworZXh0ZXJuIGNoYXIgKmFkZHJfdG9fZG90dGVkKGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRycCk7CitzdHJ1Y3QgaW5fYWRkciAqZG90dGVkX3RvX2FkZHIoY29uc3QgY2hhciAqZG90dGVkKTsKK2V4dGVybiBjb25zdCBjaGFyICpwcm9ncmFtX25hbWUsICpwcm9ncmFtX3ZlcnNpb247CisKK2V4dGVybiBpbnQgZG9fY29tbWFuZChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyICoqdGFibGUsCisJCSAgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSk7CisvKiBLZWVwaW5nIHRyYWNrIG9mIGV4dGVybmFsIG1hdGNoZXMgYW5kIHRhcmdldHM6IGxpbmtlZCBsaXN0cy4gICovCitleHRlcm4gc3RydWN0IGlwdGFibGVzX21hdGNoICppcHRhYmxlc19tYXRjaGVzOworZXh0ZXJuIHN0cnVjdCBpcHRhYmxlc190YXJnZXQgKmlwdGFibGVzX3RhcmdldHM7CisKK2V4dGVybiBzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICpmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCBpbnQgdHJ5bG9hZCk7CitleHRlcm4gc3RydWN0IGlwdGFibGVzX21hdGNoICpmaW5kX21hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCB0cnlsb2FkKTsKKyNlbmRpZiAvKl9JUFRBQkxFU19VU0VSX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJpcHEvbGliaXBxLmggYi9pbmNsdWRlL2xpYmlwcS9saWJpcHEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzUxZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saWJpcHEvbGliaXBxLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGxpYmlwcS5oCisgKgorICogSVBRIGxpYnJhcnkgZm9yIHVzZXJzcGFjZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9MSUJJUFFfSAorI2RlZmluZSBfTElCSVBRX0gKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3F1ZXVlLmg+CisKKyNpZmRlZiBERUJVR19MSUJJUFEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBMREVCVUcoeC4uLikgZnByaW50ZihzdGRlcnIsICMjIHgpCisjZWxzZQorI2RlZmluZSBMREVCVUcoeC4uLikKKyNlbmRpZgkvKiBERUJVR19MSUJJUFEgKi8KKworLyogRklYTUU6IGdsaWJjIHN1Y2tzICovCisjaWZuZGVmIE1TR19UUlVOQworI2RlZmluZSBNU0dfVFJVTkMgMHgyMAorI2VuZGlmCisKK3N0cnVjdCBpcHFfaGFuZGxlCit7CisJaW50IGZkOworCXVfaW50OF90IGJsb2NraW5nOworCXN0cnVjdCBzb2NrYWRkcl9ubCBsb2NhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgcGVlcjsKK307CisKK3N0cnVjdCBpcHFfaGFuZGxlICppcHFfY3JlYXRlX2hhbmRsZSh1X2ludDMyX3QgZmxhZ3MpOworCitpbnQgaXBxX2Rlc3Ryb3lfaGFuZGxlKHN0cnVjdCBpcHFfaGFuZGxlICpoKTsKKworc3NpemVfdCBpcHFfcmVhZChjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0KTsKKworaW50IGlwcV9zZXRfbW9kZShjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwgdV9pbnQ4X3QgbW9kZSwgc2l6ZV90IGxlbik7CisKK2lwcV9wYWNrZXRfbXNnX3QgKmlwcV9nZXRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisKK2ludCBpcHFfbWVzc2FnZV90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisKK2ludCBpcHFfZ2V0X21zZ2Vycihjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpOworCitpbnQgaXBxX3NldF92ZXJkaWN0KGNvbnN0IHN0cnVjdCBpcHFfaGFuZGxlICpoLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlkLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmVyZGljdCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpOworCitpbnQgaXBxX2N0bChjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwgaW50IHJlcXVlc3QsIC4uLik7CisKK3ZvaWQgaXBxX3BlcnJvcihjb25zdCBjaGFyICpzKTsKKworI2VuZGlmCS8qIF9MSUJJUFFfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmggYi9pbmNsdWRlL2xpYmlwdGMvaXB0X2tlcm5lbF9oZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkODQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGliaXB0Yy9pcHRfa2VybmVsX2hlYWRlcnMuaApAQCAtMCwwICsxLDIyIEBACisvKiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2Uva2VybmVsIGludGVyZmFjZSBmb3IgR2VuZXJpYyBJUCBDaGFpbnMsCisgICByZXF1aXJlZCBmb3IgbGliYzYuICovCisjaWZuZGVmIF9GV0NIQUlOU19LRVJORUxfSEVBREVSU19ICisjZGVmaW5lIF9GV0NIQUlOU19LRVJORUxfSEVBREVSU19ICisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID09IDIKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2Vsc2UgLyogbGliYzUgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliaXB0Yy9saWJpcHRjLmggYi9pbmNsdWRlL2xpYmlwdGMvbGliaXB0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTY0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpYmlwdGMvbGliaXB0Yy5oCkBAIC0wLDAgKzEsMTMxIEBACisjaWZuZGVmIF9MSUJJUFRDX0gKKyNkZWZpbmUgX0xJQklQVENfSAorLyogTGlicmFyeSB3aGljaCBtYW5pcHVsYXRlcyBmaWx0ZXJpbmcgcnVsZXMuICovCisKKyNpbmNsdWRlIDxsaWJpcHRjL2lwdF9rZXJuZWxfaGVhZGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCisjaWZuZGVmIElQVF9NSU5fQUxJR04KKyNkZWZpbmUgSVBUX01JTl9BTElHTiAoX19hbGlnbm9mX18oc3RydWN0IGlwdF9lbnRyeV9tYXRjaCkpCisjZW5kaWYKKyNkZWZpbmUgSVBUX0FMSUdOKHMpICgoKHMpICsgKElQVF9NSU5fQUxJR04tMSkpICYgfihJUFRfTUlOX0FMSUdOLTEpKQorCit0eXBlZGVmIGNoYXIgaXB0X2NoYWlubGFiZWxbMzJdOworCisjZGVmaW5lIElQVENfTEFCRUxfQUNDRVBUICAiQUNDRVBUIgorI2RlZmluZSBJUFRDX0xBQkVMX0RST1AgICAgIkRST1AiCisjZGVmaW5lIElQVENfTEFCRUxfUVVFVUUgICAiUVVFVUUiCisjZGVmaW5lIElQVENfTEFCRUxfUkVUVVJOICAiUkVUVVJOIgorCisvKiBUcmFuc3BhcmVudCBoYW5kbGUgdHlwZS4gKi8KK3R5cGVkZWYgc3RydWN0IGlwdGNfaGFuZGxlICppcHRjX2hhbmRsZV90OworCisvKiBEb2VzIHRoaXMgY2hhaW4gZXhpc3Q/ICovCitpbnQgaXB0Y19pc19jaGFpbihjb25zdCBjaGFyICpjaGFpbiwgY29uc3QgaXB0Y19oYW5kbGVfdCBoYW5kbGUpOworCisvKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHJ1bGVzLiAgUmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLworaXB0Y19oYW5kbGVfdCBpcHRjX2luaXQoY29uc3QgY2hhciAqdGFibGVuYW1lKTsKKworLyogSXRlcmF0b3IgZnVuY3Rpb25zIHRvIHJ1biB0aHJvdWdoIHRoZSBjaGFpbnM7IHByZXYgPSBOVUxMIG1lYW5zCisgICBmaXJzdCBjaGFpbi4gIFJldHVybnMgTlVMTCBhdCBlbmQuICovCitjb25zdCBjaGFyICppcHRjX25leHRfY2hhaW4oY29uc3QgY2hhciAqcHJldiwgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogSG93IG1hbnkgcnVsZXMgaW4gdGhpcyBjaGFpbj8gKi8KK3Vuc2lnbmVkIGludCBpcHRjX251bV9ydWxlcyhjb25zdCBjaGFyICpjaGFpbiwgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogR2V0IG4ndGggcnVsZSBpbiB0aGlzIGNoYWluLiAqLworY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqaXB0Y19nZXRfcnVsZShjb25zdCBjaGFyICpjaGFpbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbiwKKwkJCQkgICAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpOworCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG5hbWUgb2YgdGhpcyBwb3NpdGlvbi4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfZ2V0X3RhcmdldChjb25zdCBjaGFyICpjaGFpbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbiwKKwkJCSAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpOworCisvKiBJcyB0aGlzIGEgYnVpbHQtaW4gY2hhaW4/ICovCitpbnQgaXB0Y19idWlsdGluKGNvbnN0IGNoYXIgKmNoYWluLCBjb25zdCBpcHRjX2hhbmRsZV90IGhhbmRsZSk7CisKKy8qIEdldCB0aGUgcG9saWN5IG9mIGEgZ2l2ZW4gYnVpbHQtaW4gY2hhaW4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfZ2V0X3BvbGljeShjb25zdCBjaGFyICpjaGFpbiwKKwkJCSAgICBzdHJ1Y3QgaXB0X2NvdW50ZXJzICpjb3VudGVyLAorCQkJICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gVFJVRSBmb3IgT0sgb3IgMCBhbmQgc2V0IGVycm5vLiAgSWYgZXJybm8gPT0KKyAgIDAsIGl0IG1lYW5zIHRoZXJlIHdhcyBhIHZlcnNpb24gZXJyb3IgKGllLiB1cGdyYWRlIGxpYmlwdGMpLiAqLworLyogUnVsZSBudW1iZXJzIHN0YXJ0IGF0IDEgZm9yIHRoZSBmaXJzdCBydWxlLiAqLworCisvKiBJbnNlcnQgdGhlIGVudHJ5IGBlJyBpbiBjaGFpbiBgY2hhaW4nIGludG8gcG9zaXRpb24gYHJ1bGVudW0nLiAqLworaW50IGlwdGNfaW5zZXJ0X2VudHJ5KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICB1bnNpZ25lZCBpbnQgcnVsZW51bSwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogQXRvbWljYWxseSByZXBsYWNlIHJ1bGUgYHJ1bGVudW0nIGluIGBjaGFpbicgd2l0aCBgZScuICovCitpbnQgaXB0Y19yZXBsYWNlX2VudHJ5KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogQXBwZW5kIGVudHJ5IGBlJyB0byBjaGFpbiBgY2hhaW4nLiAgRXF1aXZhbGVudCB0byBpbnNlcnQgd2l0aAorICAgcnVsZW51bSA9IGxlbmd0aCBvZiBjaGFpbi4gKi8KK2ludCBpcHRjX2FwcGVuZF9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogRGVsZXRlIHRoZSBmaXJzdCBydWxlIGluIGBjaGFpbicgd2hpY2ggbWF0Y2hlcyBgZScuICovCitpbnQgaXB0Y19kZWxldGVfZW50cnkoY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKm9yaWdmdywKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogRGVsZXRlIHRoZSBydWxlIGluIHBvc2l0aW9uIGBydWxlbnVtJyBpbiBgY2hhaW4nLiAqLworaW50IGlwdGNfZGVsZXRlX251bV9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJCSAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCQkgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSk7CisKKy8qIENoZWNrIHRoZSBwYWNrZXQgYGUnIG9uIGNoYWluIGBjaGFpbicuICBSZXR1cm5zIHRoZSB2ZXJkaWN0LCBvcgorICAgTlVMTCBhbmQgc2V0cyBlcnJuby4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfY2hlY2tfcGFja2V0KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkJICAgICAgc3RydWN0IGlwdF9lbnRyeSAqZW50cnksCisJCQkgICAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpOworCisvKiBGbHVzaGVzIHRoZSBlbnRyaWVzIGluIHRoZSBnaXZlbiBjaGFpbiAoaWUuIGVtcHRpZXMgY2hhaW4pLiAqLworaW50IGlwdGNfZmx1c2hfZW50cmllcyhjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSk7CisKKy8qIFplcm9lcyB0aGUgY291bnRlcnMgaW4gYSBjaGFpbi4gKi8KK2ludCBpcHRjX3plcm9fZW50cmllcyhjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogQ3JlYXRlcyBhIG5ldyBjaGFpbi4gKi8KK2ludCBpcHRjX2NyZWF0ZV9jaGFpbihjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogRGVsZXRlcyBhIGNoYWluLiAqLworaW50IGlwdGNfZGVsZXRlX2NoYWluKGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpOworCisvKiBSZW5hbWVzIGEgY2hhaW4uICovCitpbnQgaXB0Y19yZW5hbWVfY2hhaW4oY29uc3QgaXB0X2NoYWlubGFiZWwgb2xkbmFtZSwKKwkJICAgICAgY29uc3QgaXB0X2NoYWlubGFiZWwgbmV3bmFtZSwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogU2V0cyB0aGUgcG9saWN5IG9uIGEgYnVpbHQtaW4gY2hhaW4uICovCitpbnQgaXB0Y19zZXRfcG9saWN5KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgY29uc3QgaXB0X2NoYWlubGFiZWwgcG9saWN5LAorCQkgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGlzIGNoYWluICovCitpbnQgaXB0Y19nZXRfcmVmZXJlbmNlcyh1bnNpZ25lZCBpbnQgKnJlZiwKKwkJCWNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkJaXB0Y19oYW5kbGVfdCAqaGFuZGxlKTsKKworLyogTWFrZXMgdGhlIGFjdHVhbCBjaGFuZ2VzLiAqLworaW50IGlwdGNfY29tbWl0KGlwdGNfaGFuZGxlX3QgKmhhbmRsZSk7CisKKy8qIEdldCByYXcgc29ja2V0LiAqLworaW50IGlwdGNfZ2V0X3Jhd19zb2NrZXQoKTsKKworLyogVHJhbnNsYXRlcyBlcnJubyBudW1iZXJzIGludG8gbW9yZSBodW1hbi1yZWFkYWJsZSBmb3JtIHRoYW4gc3RyZXJyb3IuICovCitjb25zdCBjaGFyICppcHRjX3N0cmVycm9yKGludCBlcnIpOworI2VuZGlmIC8qIF9MSUJJUFRDX0ggKi8KZGlmZiAtLWdpdCBhL2lwdGFibGVzLXJlc3RvcmUuYyBiL2lwdGFibGVzLXJlc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjRlY2UyCi0tLSAvZGV2L251bGwKKysrIGIvaXB0YWJsZXMtcmVzdG9yZS5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiBDb2RlIHRvIHJlc3RvcmUgdGhlIGlwdGFibGVzIHN0YXRlLCBmcm9tIGZpbGUgYnkgaXB0YWJsZXMtc2F2ZS4gKi8KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBhY2tldC1maWx0ZXIvdXNlcnNwYWNlL2lwdGFibGVzLmgiCisjaW5jbHVkZSAicGFja2V0LWZpbHRlci91c2Vyc3BhY2UvbGliaXB0Yy9saWJpcHRjLmgiCisKKy8qIEtlZXBpbmcgdHJhY2sgb2YgZXh0ZXJuYWwgbWF0Y2hlcyBhbmQgdGFyZ2V0cy4gICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJeyAiYmluYXJ5IiwgMSwgMCwgJ2InIH0sCisJeyAiY291bnRlcnMiLCAxLCAwLCAnYycgfSwKKwl7ICJ2ZXJib3NlIiwgMSwgMCwgJ3YnIH0sCisJeyAiaGVscCIsIDEsIDAsICdoJyB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstYl0gWy1jXSBbLXZdIFstaF1cbiIsIG5hbWUpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgY2xlYW5fc2xhdGUoaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCS8qIFNraXAgb3ZlciBidWlsdGlucy4gKi8KKwljb25zdCBjaGFyICppLCAqbGFzdCA9IElQVENfTEFCRUxfT1VUUFVUOworCisJLyogQmUgY2FyZWZ1bCBpdGVyYXRpbmc6IGl0IGlzbid0IHNhZmUgZHVyaW5nIGRlbGV0ZS4gKi8KKwkvKiBSZS1pdGVyYXRlIGFmdGVyIGVhY2ggZGVsZXRlIHN1Y2Nlc3NmdWwgKi8KKwl3aGlsZSAoKGkgPSBpcHRjX25leHRfY2hhaW4obGFzdCwgaGFuZGxlKSkgIT0gTlVMTCkgeworCQlpZiAoIWlwdGNfZmx1c2hfZW50cmllcyhpLCBoYW5kbGUpCisJCSAgICB8fCAhaXB0Y19kZWxldGVfY2hhaW4oaSwgaGFuZGxlKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpcHRjX2hhbmRsZV90IGhhbmRsZTsKKwljaGFyIGJ1ZmZlclsxMDI0MF07CisJaW50IGNvdW50ZXJzID0gMCwgYmluYXJ5ID0gMCwgdmVyYm9zZSA9IDA7CisJdW5zaWduZWQgaW50IGxpbmUgPSAwOworCWludCBjOworCWNvbnN0IGNoYXIgKmNoYWluOworCUZJTEUgKmluOworCisJcHJvZ3JhbV9uYW1lID0gImlwdGFibGVzLXJlc3RvcmUiOworCXByb2dyYW1fdmVyc2lvbiA9IE5FVEZJTFRFUl9WRVJTSU9OOworCisJLyogRG9uJ3QgdXNlIGdldG9wdCBoZXJlOyBpdCB3b3VsZCBpbnRlcmZlcmUgOC0oLiAqLworCWlmIChvcHRpbmQgPT0gYXJnYyAtIDEpIHsKKwkJaW4gPSBmb3Blbihhcmd2W29wdGluZF0sICJyIik7CisJCWlmICghaW4pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiAlczogJXMiLCBhcmd2W29wdGluZF0sCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJZWxzZSBpZiAob3B0aW5kIDwgYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gYXJndW1lbnRzIGZvdW5kIG9uIGNvbW1hbmRsaW5lIik7CisJCWV4aXQoMSk7CisJfQorCWVsc2UgaW4gPSBzdGRpbjsKKworCWhhbmRsZSA9IGlwdGNfaW5pdCgpOworCWlmICghaGFuZGxlKQorCQlleGl0X2Vycm9yKFZFUlNJT05fUFJPQkxFTSwKKwkJCSAgICJjYW4ndCBpbml0aWFsaXplIGlwdGFibGVzLXJlc3RvcmU6ICVzIiwKKwkJCSAgIGlwdGNfc3RyZXJyb3IoZXJybm8pKTsKKworCWlmICghY2xlYW5fc2xhdGUoJmhhbmRsZSkpCisJCWV4aXRfZXJyb3IoT1RIRVJfUFJPQkxFTSwgIkRlbGV0aW5nIG9sZCBjaGFpbnM6ICVzIiwKKwkJCSAgIGlwdGNfc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIEdyYWIgc3RhbmRhcmQgaW5wdXQuICovCisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGluKSkgeworCQlpbnQgcmV0OworCisJCWxpbmUrKzsKKwkJaWYgKGJ1ZmZlclswXSA9PSAnXG4nKSBjb250aW51ZTsKKwkJZWxzZSBpZiAoYnVmZmVyWzBdID09ICcjJykgeworCQkJaWYgKHZlcmJvc2UpIGZwdXRzKGJ1ZmZlciwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcChidWZmZXIsICJDT01NSVRcbiIpID09IDApCisJCQlyZXQgPSBpcHRjX2NvbW1pdCgmaGFuZGxlKTsKKwkJZWxzZSBpZiAoYnVmZmVyWzBdID09ICc6JykgeworCQkJLyogTmV3IGNoYWluLiAqLworCQkJY2hhciAqY2hhaW4sICpwb2xpY3k7CisKKwkJCS8qIEZJWE1FOiBEb24ndCBpZ25vcmUgY291bnRlcnMuICovCisJCQljaGFpbiA9IHN0cnRvayhidWZmZXIrMSwgIiBcdFxuIik7CisJCQlpZiAoIWNoYWluKSB7CisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIiVzOiBsaW5lICV1IGNoYWluIG5hbWUgaW52YWxpZFxuIiwKKwkJCQkJICAgcHJvZ3JhbV9uYW1lLCBsaW5lKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJcG9saWN5ID0gc3RydG9rKE5VTEwsICIgXHRcbiIpOworCQkJaWYgKCFwb2xpY3kpIHsKKwkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCQkgICAiJXM6IGxpbmUgJXUgcG9saWN5IGludmFsaWRcbiIsCisJCQkJCSAgIHByb2dyYW1fbmFtZSwgbGluZSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWlmIChzdHJjbXAocG9saWN5LCAiLSIpICE9IDAKKwkJCSAgICAmJiAhaXB0Y19zZXRfcG9saWN5KGNoYWluLCBwb2xpY3ksICZoYW5kbGUpKQorCQkJCWV4aXRfZXJyb3IoT1RIRVJfUFJPQkxFTSwKKwkJCQkJICAgIkNhbid0IHNldCBwb2xpY3kgYCVzJyIKKwkJCQkJICAgIiBvbiBgJXMnIGxpbmUgJXU6ICVzXG4iLAorCQkJCQkgICBjaGFpbiwgcG9saWN5LCBsaW5lLAorCQkJCQkgICBpcHRjX3N0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQljaGFyICpuZXdhcmd2WzEwMjRdOworCQkJaW50IGk7CisJCQljaGFyICpwdHIgPSBidWZmZXI7CisKKwkJCS8qIEZJWE1FOiBEb24ndCBpZ25vcmUgY291bnRlcnMuICovCisJCQlpZiAoYnVmZmVyWzBdID09ICdbJykgeworCQkJCXB0ciA9IHN0cmNocihidWZmZXIsICddJyk7CisJCQkJaWYgKCFwdHIpCisJCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCQkgICAiQmFkIGxpbmUgJXU6IG5lZWQgXVxuIiwKKwkJCQkJCSAgIGxpbmUpOworCQkJfQorCQkJCQkKKwkJCS8qIHN0cnRvazogYSBmdW5jdGlvbiBvbmx5IGEgY29kZXIgY291bGQgbG92ZSAqLworCQkJbmV3YXJndlswXSA9IGFyZ3ZbMF07CisJCQlmb3IgKGkgPSAxOyBpIDwgc2l6ZW9mKG5ld2FyZ3YpL3NpemVvZihjaGFyICopOyBpKyspIHsKKwkJCQlpZiAoIShuZXdhcmd2W2ldID0gc3RydG9rKHB0ciwgIiBcdFxuIikpKQorCQkJCQlicmVhazsKKwkJCQlwdHIgPSBOVUxMOworCQkJfQorCQkJaWYgKGkgPT0gc2l6ZW9mKG5ld2FyZ3YpL3NpemVvZihjaGFyICopKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogbGluZSAldSB0b28gbWFueSBhcmd1bWVudHNcbiIsCisJCQkJCXByb2dyYW1fbmFtZSwgbGluZSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKworCQkJcmV0ID0gZG9fY29tbWFuZChpLCBuZXdhcmd2LCAmaGFuZGxlKTsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogbGluZSAldSBmYWlsZWRcbiIsCisJCQkJCXByb2dyYW1fbmFtZSwgbGluZSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHRhYmxlcy1zYXZlLmMgYi9pcHRhYmxlcy1zYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlOWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2lwdGFibGVzLXNhdmUuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogQ29kZSB0byBzYXZlIHRoZSBpcHRhYmxlcyBzdGF0ZSwgaW4gaHVtYW4gcmVhZGFibGUtZm9ybS4gKi8KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInBhY2tldC1tYXRjaC91c2Vyc3BhY2UvbGliaXB0Yy9saWJpcHRjLmgiCisjaW5jbHVkZSAicGFja2V0LW1hdGNoL3VzZXJzcGFjZS9pcHRhYmxlcy5oIgorCisvKiBLZWVwaW5nIHRyYWNrIG9mIGV4dGVybmFsIG1hdGNoZXMgYW5kIHRhcmdldHMuICAqLworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCXsgImJpbmFyeSIsIDEsIDAsICdiJyB9LAorCXsgImNvdW50ZXJzIiwgMSwgMCwgJ2MnIH0sCisJeyAiZHVtcCIsIDEsIDAsICdkJyB9LAorCXsgMCB9Cit9OworCisjZGVmaW5lIElQX1BBUlRTX05BVElWRShuKQkJCVwKKyh1bnNpZ25lZCBpbnQpKChuKT4+MjQpJjB4RkYsCQkJXAorKHVuc2lnbmVkIGludCkoKG4pPj4xNikmMHhGRiwJCQlcCisodW5zaWduZWQgaW50KSgobik+PjgpJjB4RkYsCQkJXAorKHVuc2lnbmVkIGludCkoKG4pJjB4RkYpCisKKyNkZWZpbmUgSVBfUEFSVFMobikgSVBfUEFSVFNfTkFUSVZFKG50b2hsKG4pKQorCisvKiBUaGlzIGFzc3VtZXMgdGhhdCBtYXNrIGlzIGNvbnRpZ3VvdXMsIGFuZCBieXRlLWJvdW5kZWQuICovCitzdGF0aWMgdm9pZAorcHJpbnRfaWZhY2UoY2hhciBsZXR0ZXIsIGNvbnN0IGNoYXIgKmlmYWNlLCBjb25zdCB1bnNpZ25lZCBjaGFyICptYXNrLAorCSAgICBpbnQgaW52ZXJ0KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG1hc2tbMF0gPT0gMCkKKwkJcmV0dXJuOworCQorCXByaW50ZigiLSVjICVzIiwgbGV0dGVyLCBpbnZlcnQgPyAiISAiIDogIiIpOworCisJZm9yIChpID0gMDsgaSA8IElGTkFNU0laOyBpKyspIHsKKwkJaWYgKG1hc2tbaV0gIT0gMCkgeworCQkJaWYgKGlmYWNlW2ldICE9ICdcMCcpCisJCQkJcHJpbnRmKCIlYyIsIGlmYWNlW2ldKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpZmFjZVtpXSAhPSAnXDAnKQorCQkJCXByaW50ZigiKyIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIFRoZXNlIGFyZSBoYXJkY29kZWQgYmFja3VwcyBpbiBpcHRhYmxlcy5jLCBzbyB0aGV5IGFyZSBzYWZlICovCitzdHJ1Y3QgcHByb3QgeworCWNoYXIgKm5hbWU7CisJdV9pbnQ4X3QgbnVtOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcHJvdCBjaGFpbl9wcm90b3NbXSA9IHsKKwl7ICJ0Y3AiLCBJUFBST1RPX1RDUCB9LAorCXsgInVkcCIsIElQUFJPVE9fVURQIH0sCisJeyAiaWNtcCIsIElQUFJPVE9fSUNNUCB9LAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfcHJvdG8odV9pbnQxNl90IHByb3RvLCBpbnQgaW52ZXJ0KQoreworCWlmIChwcm90bykgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJY29uc3QgY2hhciAqaW52ZXJ0c3RyID0gaW52ZXJ0ID8gIiEgIiA6ICIiOworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhaW5fcHJvdG9zKS9zaXplb2Yoc3RydWN0IHBwcm90KTsgaSsrKQorCQkJaWYgKGNoYWluX3Byb3Rvc1tpXS5udW0gPT0gcHJvdG8pIHsKKwkJCQlwcmludGYoIi1wICVzJXMgIiwKKwkJCQkgICAgICAgaW52ZXJ0c3RyLCBjaGFpbl9wcm90b3NbaV0ubmFtZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCXByaW50ZigiLXAgJXMldSAiLCBpbnZlcnRzdHIsIHByb3RvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbm9uX3plcm8oY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWlmICgoKGNoYXIgKilwdHIpW2ldKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogV2Ugd2FudCB0aGlzIHRvIGJlIHJlYWRhYmxlLCBzbyBvbmx5IHByaW50IG91dCBuZWNjZXNzYXJ5IGZpZWxkcy4KKyAqIEJlY2F1c2UgdGhhdCdzIHRoZSBraW5kIG9mIHdvcmxkIEkgd2FudCB0byBsaXZlIGluLiAgKi8KK3N0YXRpYyB2b2lkIHByaW50X3J1bGUoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwgaW50IGNvdW50ZXJzKQoreworCWlmIChjb3VudGVycykKKwkJcHJpbnRmKCJbJWxsdSwlbGx1XSAiLCBlLT5jb3VudGVycy5wY250LCBlLT5jb3VudGVycy5iY250KTsKKworCS8qIFByaW50IElQIHBhcnQuICovCisJaWYgKGUtPmlwLnNtc2suc19hZGRyKQorCQlwcmludGYoIi1zICVzJXUuJXUuJXUuJXUvJXUuJXUuJXUuJXUgIiwKKwkJICAgICAgIGUtPmlwLmludmZsYWdzICYgSVBUX0lOVl9TUkNJUCA/ICIhICIgOiAiIiwKKwkJICAgICAgIElQX1BBUlRTKGUtPmlwLnNyYy5zX2FkZHIpLAorCQkgICAgICAgSVBfUEFSVFMoZS0+aXAuc21zay5zX2FkZHIpKTsKKwlpZiAoZS0+aXAuZG1zay5zX2FkZHIpCisJCXByaW50ZigiLWQgJXMldS4ldS4ldS4ldS8ldS4ldS4ldS4ldSAiLAorCQkgICAgICAgZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1NSQ0lQID8gIiEgIiA6ICIiLAorCQkgICAgICAgSVBfUEFSVFMoZS0+aXAuZHN0LnNfYWRkciksCisJCSAgICAgICBJUF9QQVJUUyhlLT5pcC5kbXNrLnNfYWRkcikpOworCisJcHJpbnRfaWZhY2UoJ2knLCBlLT5pcC5pbmlmYWNlLCBlLT5pcC5pbmlmYWNlX21hc2ssCisJCSAgICBlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfVklBX0lOKTsKKwlwcmludF9pZmFjZSgnbycsIGUtPmlwLm91dGlmYWNlLCBlLT5pcC5vdXRpZmFjZV9tYXNrLAorCQkgICAgZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1ZJQV9PVVQpOworCXByaW50X3Byb3RvKGUtPmlwLnByb3RvLCBlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pOworCisJaWYgKGUtPmlwLmZsYWdzICYgSVBUX0ZfRlJBRykKKwkJcHJpbnRmKCIlcy1mICIsCisJCSAgICAgICBlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfRlJBRyA/ICIhICIgOiAiIik7CisKKwlpZiAoZS0+aXAuZmxhZ3MgJiBJUFRfRl9UT1MpCisJCXByaW50ZigiLXQgJXMweCUwMlggIiwKKwkJICAgICAgIGUtPmlwLmludmZsYWdzICYgSVBUX0lOVl9UT1MgPyAiISAiIDogIiIsCisJCSAgICAgICBlLT5pcC50b3MpOworCisJLyogUHJpbnQgbWF0Y2hpbmZvIHBhcnQgKi8KKwlpZiAoZS0+bWF0Y2hfbmFtZVswXSkgeworCQlzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggKm1hdGNoID0gZmluZF9tYXRjaChlLT5tYXRjaF9uYW1lLCAxKTsKKworCQlpZiAobWF0Y2gpCisJCQltYXRjaC0+c2F2ZShlKTsKKwkJZWxzZSB7CisJCQkvKiBJZiBzb21lIGJpdHMgYXJlIG5vbi16ZXJvLCBpdCBpbXBsaWVzIHdlICpuZWVkKgorCQkJICAgdG8gdW5kZXJzdGFuZCBpdCAqLworCQkJaWYgKG5vbl96ZXJvKCZlLT5tYXRjaGluZm8sIHNpemVvZihlLT5tYXRjaGluZm8pKSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ2FuJ3QgZmluZCBsaWJyYXJ5IGZvciBtYXRjaCBgJXMnXG4iLAorCQkJCQllLT5tYXRjaF9uYW1lKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9CisJfQorCisJLyogUHJpbnQgdGFyZ2luZm8gcGFydCAqLworCWlmIChlLT50YXJnZXRfbmFtZVswXSkgeworCQlzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICp0YXJnZXQKKwkJCT0gZmluZF90YXJnZXQoZS0+dGFyZ2V0X25hbWUsIDEpOworCisJCWlmICh0YXJnZXQpCisJCQl0YXJnZXQtPnNhdmUoZSk7CisJCWVsc2UgeworCQkJLyogSWYgc29tZSBiaXRzIGFyZSBub24temVybywgaXQgaW1wbGllcyB3ZSAqbmVlZCoKKwkJCSAgIHRvIHVuZGVyc3RhbmQgaXQgKi8KKwkJCWlmIChub25femVybygmZS0+dGFyZ2luZm8sIHNpemVvZihlLT50YXJnaW5mbykpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJDYW4ndCBmaW5kIGxpYnJhcnkgZm9yIHRhcmdldCBgJXMnXG4iLAorCQkJCQllLT50YXJnZXRfbmFtZSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCX0KKwlwcmludGYoIlxuIik7Cit9CisKKy8qIERlYnVnZ2luZyBwcm90b3R5cGUuICovCitleHRlcm4gdm9pZCBkdW1wX2VudHJpZXMoaXB0Y19oYW5kbGVfdCBoYW5kbGUpOworCisvKiBGb3JtYXQ6CisgKiA6Q2hhaW4gbmFtZSBQT0xJQ1kgcGFja2V0cyBieXRlcworICogcnVsZQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWlwdGNfaGFuZGxlX3QgaDsKKwljb25zdCBjaGFyICpjaGFpbiA9IE5VTEw7CisJaW50IGM7CisJaW50IGJpbmFyeSA9IDAsIGNvdW50ZXJzID0gMDsKKworCXByb2dyYW1fbmFtZSA9ICJpcHRhYmxlcy1zYXZlIjsKKwlwcm9ncmFtX3ZlcnNpb24gPSBORVRGSUxURVJfVkVSU0lPTjsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJiYyIsIG9wdGlvbnMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYic6CisJCQliaW5hcnkgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnYyc6CisJCQljb3VudGVycyA9IDE7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJCS8qIERlYnVnZ2luZyBkdW1wLiAqLworCQkJaCA9IGlwdGNfaW5pdCgpOworCQkJaWYgKCFoKQorCQkJCWV4aXRfZXJyb3IoT1RIRVJfUFJPQkxFTSwgImlwdGNfaW5pdDogJXNcbiIsCisJCQkJCSAgIGlwdGNfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWR1bXBfZW50cmllcyhoKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gYXJndW1lbnRzIGZvdW5kIG9uIGNvbW1hbmRsaW5lIik7CisJCWV4aXQoMSk7CisJfQorCisJaCA9IGlwdGNfaW5pdCgpOworCWlmICghaCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGluaXRpYWxpemU6ICVzXG4iLAorCQkJaXB0Y19zdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCWlmICghYmluYXJ5KSB7CisJCXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworCisJCXByaW50ZigiIyBHZW5lcmF0ZWQgYnkgaXB0YWJsZXMtc2F2ZSB2JXMgb24gJXMiLAorCQkgICAgICAgTkVURklMVEVSX1ZFUlNJT04sIGN0aW1lKCZub3cpKTsKKworCQkvKiBEdW1wIG91dCBjaGFpbiBuYW1lcyAqLworCQl3aGlsZSAoKGNoYWluID0gaXB0Y19uZXh0X2NoYWluKGNoYWluLCAmaCkpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiOiVzICIsIGNoYWluKTsKKwkJCWlmIChpcHRjX2J1aWx0aW4oY2hhaW4sICZoKSkgeworCQkJCXN0cnVjdCBpcHRfY291bnRlcnMgY291bnQ7CisJCQkJcHJpbnRmKCIlcyAiLAorCQkJCSAgICAgICBpcHRjX2dldF9wb2xpY3koY2hhaW4sICZjb3VudCwgJmgpKTsKKwkJCQlwcmludGYoIiVsbHUgJWxsdVxuIiwgY291bnQucGNudCwgY291bnQuYmNudCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiLSAwIDBcbiIpOworCQkJfQorCQl9CisKKwkJLyogRHVtcCBvdXQgcnVsZXMgKi8KKwkJd2hpbGUgKChjaGFpbiA9IGlwdGNfbmV4dF9jaGFpbihjaGFpbiwgJmgpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IGlwdGNfbnVtX3J1bGVzKGNoYWluLCAmaCk7IGkrKykgeworCQkJCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUKKwkJCQkJPSBpcHRjX2dldF9ydWxlKGNoYWluLCBpLCAmaCk7CisKKwkJCQlpZiAoIWUpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkiQ2FuJ3QgcmVhZCBydWxlICV1IG9mIGNoYWluICVzOiAlc1xuIiwKKwkJCQkJCWksIGNoYWluLCBpcHRjX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJCXByaW50X3J1bGUoZSwgY291bnRlcnMpOworCQkJfQorCQl9CisKKwkJbm93ID0gdGltZShOVUxMKTsKKwkJcHJpbnRmKCJDT01NSVRcbiIpOworCQlwcmludGYoIiMgQ29tcGxldGVkIG9uICVzIiwgY3RpbWUoJm5vdykpOworCX0gZWxzZSB7CisJCS8qIEJpbmFyeSwgaHVoPyAgT0suICovCisJCWZwcmludGYoc3RkZXJyLCAiQmluYXJ5IE5ZSVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pcHRhYmxlcy1zdGFuZGFsb25lLmMgYi9pcHRhYmxlcy1zdGFuZGFsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiYzBmYQotLS0gL2Rldi9udWxsCisrKyBiL2lwdGFibGVzLXN0YW5kYWxvbmUuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQXV0aG9yOiBQYXVsLlJ1c3NlbGxAcnVzdGNvcnAuY29tLmF1IGFuZCBtbmV1bGluZ0ByYWRsb2dpYy5jb20uYXUKKyAqCisgKiBCYXNlZCBvbiB0aGUgaXBjaGFpbnMgY29kZSBieSBQYXVsIFJ1c3NlbGwgYW5kIE1pY2hhZWwgTmV1bGluZworICoKKyAqCWlwdGFibGVzIC0tIElQIGZpcmV3YWxsIGFkbWluaXN0cmF0aW9uIGZvciBrZXJuZWxzIHdpdGgKKyAqCWZpcmV3YWxsIHRhYmxlIChhaW1lZCBmb3IgdGhlIDIuMyBrZXJuZWxzKQorICoKKyAqCVNlZSB0aGUgYWNjb21wYW55aW5nIG1hbnVhbCBwYWdlIGlwdGFibGVzKDgpIGZvciBpbmZvcm1hdGlvbgorICoJYWJvdXQgcHJvcGVyIHVzYWdlIG9mIHRoaXMgcHJvZ3JhbS4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGlwdGFibGVzLmg+CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisJY2hhciAqdGFibGUgPSAiZmlsdGVyIjsKKwlpcHRjX2hhbmRsZV90IGhhbmRsZTsKKworCXByb2dyYW1fbmFtZSA9ICJpcHRhYmxlcyI7CisJcHJvZ3JhbV92ZXJzaW9uID0gTkVURklMVEVSX1ZFUlNJT047CisKKwlyZXQgPSBkb19jb21tYW5kKGFyZ2MsIGFyZ3YsICZ0YWJsZSwgJmhhbmRsZSk7CisJaWYgKHJldCkKKwkJcmV0ID0gaXB0Y19jb21taXQoJmhhbmRsZSk7CisKKwlpZiAoIXJldCkKKwkJZnByaW50ZihzdGRlcnIsICJpcHRhYmxlczogJXNcbiIsCisJCQlpcHRjX3N0cmVycm9yKGVycm5vKSk7CisKKwlleGl0KCFyZXQpOworfQpkaWZmIC0tZ2l0IGEvaXB0YWJsZXMuOCBiL2lwdGFibGVzLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNDRhMwotLS0gL2Rldi9udWxsCisrKyBiL2lwdGFibGVzLjgKQEAgLTAsMCArMSw3MDggQEAKKy5USCBJUFRBQkxFUyA4ICJNYXIgMjAsIDIwMDAiICIiICIiCisuXCIKKy5cIiBNYW4gcGFnZSB3cml0dGVuIGJ5IEhlcnZlIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgorLlwiIEl0IGlzIGJhc2VkIG9uIGlwY2hhaW5zIG1hbiBwYWdlLgorLlwiCisuXCIgaXBjaGFpbnMgcGFnZSBieSBQYXVsIGBgUnVzdHknJyBSdXNzZWxsIE1hcmNoIDE5OTcKKy5cIiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgaXBmd2FkbSBtYW4gcGFnZSBieSBKb3MgVm9zIDxqb3NAeG9zLm5sPiAoc2VlIFJFQURNRSkKKy5cIgorLlwiCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisuXCIJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy5cIgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorLlwiCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisuXCIKKy5cIglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy5cIglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLlwiCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy5cIglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLlwiCisuXCIJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy5cIglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLlwiCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorLlwiCisuXCIKKy5TSCBOQU1FCitpcHRhYmxlcyBcLSBJUCBwYWNrZXQgZmlsdGVyIGFkbWluaXN0cmF0aW9uCisuU0ggU1lOT1BTSVMKKy5CUiAiaXB0YWJsZXMgLVtBRENdICIgImNoYWluIHJ1bGUtc3BlY2lmaWNhdGlvbiBbb3B0aW9uc10iCisuYnIKKy5CUiAiaXB0YWJsZXMgLVtSSV0gIiAiY2hhaW4gcnVsZW51bSBydWxlLXNwZWNpZmljYXRpb24gW29wdGlvbnNdIgorLmJyCisuQlIgImlwdGFibGVzIC1EICIgImNoYWluIHJ1bGVudW0gW29wdGlvbnNdIgorLmJyCisuQlIgImlwdGFibGVzIC1bTEZaXSAiICJbY2hhaW5dIFtvcHRpb25zXSIKKy5icgorLkJSICJpcHRhYmxlcyAtW05YXSAiICJjaGFpbiIKKy5icgorLkJSICJpcHRhYmxlcyAtUCAiICJjaGFpbiB0YXJnZXQgW29wdGlvbnNdIgorLmJyCisuQlIgImlwdGFibGVzIC1FICIgIm9sZC1jaGFpbi1uYW1lIG5ldy1jaGFpbi1uYW1lIgorLlNIIERFU0NSSVBUSU9OCisuQiBJcHRhYmxlcworaXMgdXNlZCB0byBzZXQgdXAsIG1haW50YWluLCBhbmQgaW5zcGVjdCB0aGUgdGFibGVzIG9mIElQIHBhY2tldAorZmlsdGVyIHJ1bGVzIGluIHRoZSBMaW51eCBrZXJuZWwuICBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdGFibGVzCit3aGljaCBtYXkgYmUgZGVmaW5lZCwgYW5kIGVhY2ggdGFibGUgY29udGFpbnMgYSBudW1iZXIgb2YgYnVpbHQtaW4KK2NoYWlucywgYW5kIG1heSBjb250YWluIHVzZXItZGVmaW5lZCBjaGFpbnMuCisKK0VhY2ggY2hhaW4gaXMgYSBsaXN0IG9mIHJ1bGVzIHdoaWNoIGNhbiBtYXRjaCBhIHNldCBvZiBwYWNrZXRzOiBlYWNoCitydWxlIHNwZWNpZmllcyB3aGF0IHRvIGRvIHdpdGggYSBwYWNrZXQgd2hpY2ggbWF0Y2hlcy4gIFRoaXMgaXMgY2FsbGVkCithIGB0YXJnZXQnLCB3aGljaCBtYXkgYmUgYSBqdW1wIHRvIGEgdXNlci1kZWZpbmVkIGNoYWluIGluIHRoZSBzYW1lCit0YWJsZS4KKworLlNIIFRBUkdFVFMKK0EgZmlyZXdhbGwgcnVsZSBzcGVjaWZpZXMgY3JpdGVyaWEgZm9yIGEgcGFja2V0LCBhbmQgYSB0YXJnZXQuICBJZiB0aGUKK3BhY2tldCBkb2VzIG5vdCBtYXRjaCwgdGhlIG5leHQgcnVsZSBpbiB0aGUgY2hhaW4gaXMgdGhlIGV4YW1pbmVkOyBpZgoraXQgZG9lcyBtYXRjaCwgdGhlbiB0aGUgbmV4dCBydWxlIGlzIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlCit0YXJnZXQsIHdoaWNoIGNhbiBiZSB0aGUgbmFtZSBvZiBhIHVzZXItZGVmaW5lZCBjaGFpbiwgb3Igb25lIG9mIHRoZQorc3BlY2lhbCB2YWx1ZXMgCisuSVIgQUNDRVBUICwKKy5JUiBEUk9QICwKKy5JUiBRVUVVRSAsCitvcgorLklSIFJFVFVSTiAuCisuUFAKKy5JIEFDQ0VQVCAKK21lYW5zIHRvIGxldCB0aGUgcGFja2V0IHRocm91Z2guCisuSSBEUk9QCittZWFucyB0byBkcm9wIHRoZSBwYWNrZXQgb24gdGhlIGZsb29yLgorLkkgUVVFVUUKK21lYW5zIHRvIHBhc3MgdGhlIHBhY2tldCB0byB1c2Vyc3BhY2UuCisuSSBSRVRVUk4KK21lYW5zIHN0b3AgdHJhdmVyc2luZyB0aGlzIGNoYWluLCBhbmQgcmVzdW1lIGF0IHRoZSBuZXh0IHJ1bGUgaW4gdGhlCitwcmV2aW91cyAoY2FsbGluZykgY2hhaW4uICBJZiB0aGUgZW5kIG9mIGEgYnVpbHQtaW4gY2hhaW4gaXMgcmVhY2hlZCwKK29yIGEgcnVsZSBpbiBhIGJ1aWx0LWluIGNoYWluIHdpdGggdGFyZ2V0CisuSSBSRVRVUk4KK2lzIG1hdGNoZWQsIHRoZSB0YXJnZXQgc3BlY2lmaWVkIGJ5IHRoZSBjaGFpbiBwb2xpY3kgZGV0ZXJtaW5lcyB0aGUKK2ZhdGUgb2YgdGhlIHBhY2tldC4KKy5TSCBUQUJMRVMKK1RoZXJlIGFyZSBjdXJyZW50IHRocmVlIHRhYmxlcyAod2hpY2ggdGFibGVzIGFyZSBwcmVzZW50IGF0IGFueSB0aW1lCitkZXBlbmRzIG9uIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCB3aGljaCBtb2R1bGVzIGFyZQorcHJlc2VudCkuCisuVFAKKy5CICItdCwgLS10YWJsZSIKK1RoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgcGFja2V0IG1hdGNoaW5nIHRhYmxlIHdoaWNoIHRoZSBjb21tYW5kCitzaG91bGQgb3BlcmF0ZSBvbi4gIElmIHRoZSBrZXJuZWwgaXMgY29uZmlndXJlZCB3aXRoIGF1dG9tYXRpYyBtb2R1bGUKK2xvYWRpbmcsIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIG1vZHVsZSBmb3IKK3RoYXQgdGFibGUgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuCisKK1RoZSB0YWJsZXMgYXJlIGFzIGZvbGxvd3M6CisuQlIgImZpbHRlciIKK1RoaXMgaXMgdGhlIGRlZmF1bHQgdGFibGUsIGFuZCBjb250YWlucyB0aGUgYnVpbHQtaW4gY2hhaW5zIElOUFVUIChmb3IKK3BhY2tldHMgY29taW5nIGludG8gdGhlIGJveCBpdHNlbGYpLCBGT1JXQVJEIChmb3IgcGFja2V0cyBiZWluZyByb3V0ZWQKK3Rocm91Z2ggdGhlIGJveCksIGFuZCBPVVRQVVQgKGZvciBsb2NhbGx5LWdlbmVyYXRlZCBwYWNrZXRzKS4KKy5CUiAibmF0IgorVGhpcyB0YWJsZSBpcyBjb25zdWx0ZWQgd2hlbiBhIHBhY2tldCB3aGljaCBpcyBjcmVhdGVzIGEgbmV3Citjb25uZWN0aW9uIGlzIGVuY291bnRlcmVkLiAgSXQgY29uc2lzdHMgb2YgdGhyZWUgYnVpbHQtaW5zOiBQUkVST1VUSU5HCisoZm9yIGFsdGVyaW5nIHBhY2tldHMgYXMgc29vbiBhcyB0aGV5IGNvbWUgaW4pLCBPVVRQVVQgKGZvciBhbHRlcmluZworbG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cyBiZWZvcmUgcm91dGluZyksIGFuZCBQT1NUUk9VVElORyAoZm9yCithbHRlcmluZyBwYWNrZXRzIGFzIHRoZXkgYXJlIGFib3V0IHRvIGdvIG91dCkuCisuQlIgIm1hbmdsZSIKK1RoaXMgdGFibGUgaXMgdXNlZCBmb3Igc3BlY2lhbGl6ZWQgcGFja2V0IGFsdGVyYXRpb24uICBJdCBoYXMgdHdvCitidWlsdC1pbiBjaGFpbnM6IFBSRVJPVVRJTkcgKGZvciBhbHRlcmluZyBpbmNvbWluZyBwYWNrZXRzIGJlZm9yZQorcm91dGluZykgYW5kIE9VVFBVVCAoZm9yIGFsdGVyaW5nIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMgYmVmb3JlCityb3V0aW5nKS4KKy5TSCBPUFRJT05TCitUaGUgb3B0aW9ucyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5CisuQiBpcHRhYmxlcworY2FuIGJlIGRpdmlkZWQgaW50byBzZXZlcmFsIGRpZmZlcmVudCBncm91cHMuCisuU1MgQ09NTUFORFMKK1RoZXNlIG9wdGlvbnMgc3BlY2lmeSB0aGUgc3BlY2lmaWMgYWN0aW9uIHRvIHBlcmZvcm07IG9ubHkgb25lIG9mIHRoZW0KK2NhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQKK2JlbG93LiAgRm9yIGFsbCB0aGUgbG9uZyB2ZXJzaW9ucyBvZiB0aGUgY29tbWFuZCBhbmQgb3B0aW9uIG5hbWVzLCB5b3UKK29ubHkgbmVlZCB0byB1c2UgZW5vdWdoIGxldHRlcnMgdG8gZW5zdXJlIHRoYXQgCisuQiBpcHRhYmxlcworY2FuIGRpZmZlcmVudGlhdGUgaXQgZnJvbSBhbGwgb3RoZXIgb3B0aW9ucy4KKy5UUAorLkJSICItQSwgLS1hcHBlbmQiCitBcHBlbmQgb25lIG9yIG1vcmUgcnVsZXMgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0ZWQgY2hhaW4uCitXaGVuIHRoZSBzb3VyY2UgYW5kL29yIGRlc3RpbmF0aW9uIG5hbWVzIHJlc29sdmUgdG8gbW9yZSB0aGFuIG9uZQorYWRkcmVzcywgYSBydWxlIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2ggcG9zc2libGUgYWRkcmVzcyBjb21iaW5hdGlvbi4KKy5UUAorLkJSICItRCwgLS1kZWxldGUiCitEZWxldGUgb25lIG9yIG1vcmUgcnVsZXMgZnJvbSB0aGUgc2VsZWN0ZWQgY2hhaW4uICBUaGVyZSBhcmUgdHdvCit2ZXJzaW9ucyBvZiB0aGlzIGNvbW1hbmQ6IHRoZSBydWxlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBudW1iZXIgaW4gdGhlCitjaGFpbiAoc3RhcnRpbmcgYXQgMSBmb3IgdGhlIGZpcnN0IHJ1bGUpIG9yIGEgcnVsZSB0byBtYXRjaC4KKy5UUAorLkIgIi1SLCAtLXJlcGxhY2UiCitSZXBsYWNlIGEgcnVsZSBpbiB0aGUgc2VsZWN0ZWQgY2hhaW4uICBJZiB0aGUgc291cmNlIGFuZC9vcgorZGVzdGluYXRpb24gbmFtZXMgcmVzb2x2ZSB0byBtdWx0aXBsZSBhZGRyZXNzZXMsIHRoZSBjb21tYW5kIHdpbGwKK2ZhaWwuICBSdWxlcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgYXQgMS4KKy5UUAorLkIgIi1JLCAtLWluc2VydCIKK0luc2VydCBvbmUgb3IgbW9yZSBydWxlcyBpbiB0aGUgc2VsZWN0ZWQgY2hhaW4gYXMgdGhlIGdpdmVuIHJ1bGUKK251bWJlci4gIFNvLCBpZiB0aGUgcnVsZSBudW1iZXIgaXMgMSwgdGhlIHJ1bGUgb3IgcnVsZXMgYXJlIGluc2VydGVkCithdCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4uICBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgaWYgbm8gcnVsZSBudW1iZXIKK2lzIHNwZWNpZmllZC4KKy5UUAorLkIgIi1MLCAtLWxpc3QiCitMaXN0IGFsbCBydWxlcyBpbiB0aGUgc2VsZWN0ZWQgY2hhaW4uICBJZiBubyBjaGFpbiBpcyBzZWxlY3RlZCwgYWxsCitjaGFpbnMgYXJlIGxpc3RlZC4gIEl0IGlzIGxlZ2FsIHRvIHNwZWNpZnkgdGhlCisuQiAtWgorKHplcm8pIG9wdGlvbiBhcyB3ZWxsLCBpbiB3aGljaCBjYXNlIHRoZSBjaGFpbihzKSB3aWxsIGJlIGF0b21pY2FsbHkKK2xpc3RlZCBhbmQgemVyb2VkLiAgVGhlIGV4YWN0IG91dHB1dCBpcyBlZmZlY3RlZCBieSB0aGUgb3RoZXIKK2FyZ3VtZW50cyBnaXZlbi4KKy5UUAorLkIgIi1GLCAtLWZsdXNoIgorRmx1c2ggdGhlIHNlbGVjdGVkIGNoYWluLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGRlbGV0aW5nIGFsbCB0aGUKK3J1bGVzIG9uZSBieSBvbmUuCisuVFAKKy5CICItWiwgLS16ZXJvIgorWmVybyB0aGUgcGFja2V0IGFuZCBieXRlIGNvdW50ZXJzIGluIGFsbCBjaGFpbnMuICBJdCBpcyBsZWdhbCB0bworc3BlY2lmeSB0aGUKKy5CICItTCwgLS1saXN0IgorKGxpc3QpIG9wdGlvbiBhcyB3ZWxsLCB0byBzZWUgdGhlIGNvdW50ZXJzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGV5IGFyZQorY2xlYXJlZDsgc2VlIGFib3ZlLgorLlRQCisuQiAiLU4sIC0tbmV3LWNoYWluIgorQ3JlYXRlIGEgbmV3IHVzZXItZGVmaW5lZCBjaGFpbiBvZiB0aGUgZ2l2ZW4gbmFtZS4gIFRoZXJlIG11c3QgYmUgbm8KK3RhcmdldCBvZiB0aGF0IG5hbWUgYWxyZWFkeS4KKy5UUAorLkIgIi1YLCAtLWRlbGV0ZS1jaGFpbiIKK0RlbGV0ZSB0aGUgc3BlY2lmaWVkIHVzZXItZGVmaW5lZCBjaGFpbi4gIFRoZXJlIG11c3QgYmUgbm8gcmVmZXJlbmNlcwordG8gdGhlIGNoYWluIChpZiB0aGVyZSBhcmUgeW91IG11c3QgZGVsZXRlIG9yIHJlcGxhY2UgdGhlIHJlZmVycmluZworcnVsZXMgYmVmb3JlIHRoZSBjaGFpbiBjYW4gYmUgZGVsZXRlZCkuICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgaXQKK3dpbGwgYXR0ZW1wdCB0byBkZWxldGUgZXZlcnkgbm9uLWJ1aWx0aW4gY2hhaW4uCisuVFAKKy5CICItUCwgLS1wb2xpY3kiCitTZXQgdGhlIHBvbGljeSBmb3IgdGhlIGNoYWluIHRvIHRoZSBnaXZlbiB0YXJnZXQuICBTZWUgdGhlIHNlY3Rpb24KKy5UUAorLkIgIi1FLCAtLXJlbmFtZS1jaGFpbiIKK1JlbmFtZSB0aGUgdXNlciBzcGVjaWZpZWQgY2hhaW4gdG8gdGhlIHVzZXIgc3VwcGxpZWQgbmFtZTsgdGhpcyBpcworY29zbWV0aWMsIGFuZCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRhYmxlLgorLkIgVEFSR0VUUworZm9yIHRoZSBsZWdhbCB0YXJnZXRzLiAgT25seSBub24tdXNlcmRlZmluZWQgY2hhaW5zIGNhbiBoYXZlIHBvbGljaWVzLAorYW5kIG5laXRoZXIgYnVpbHQtaW4gbm9yIHVzZXItZGVmaW5lZCBjaGFpbnMgY2FuIGJlIHBvbGljeSB0YXJnZXRzLgorLlRQCisuQiAtaAorSGVscC4KK0dpdmUgYSAoY3VycmVudGx5IHZlcnkgYnJpZWYpIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kIHN5bnRheC4KKy5TUyBQQVJBTUVURVJTCitUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbWFrZSB1cCBhIHJ1bGUgc3BlY2lmaWNhdGlvbiAoYXMgdXNlZCBpbiB0aGUKK2FkZCwgZGVsZXRlLCByZXBsYWNlLCBhcHBlbmQgYW5kIGNoZWNrIGNvbW1hbmRzKS4KKy5UUAorLkJSICItcCwgLS1wcm90byAiICJbIV0gXGZJcHJvdG9jb2xcZlAiCitUaGUgcHJvdG9jb2wgb2YgdGhlIHJ1bGUgb3Igb2YgdGhlIHBhY2tldCB0byBjaGVjay4KK1RoZSBzcGVjaWZpZWQgcHJvdG9jb2wgY2FuIGJlIG9uZSBvZgorLklSIHRjcCAsCisuSVIgdWRwICwKKy5JUiBpY21wICwKK29yCisuSVIgYWxsICwKK29yIGl0IGNhbiBiZSBhIG51bWVyaWMgdmFsdWUsIHJlcHJlc2VudGluZyBvbmUgb2YgdGhlc2UgcHJvdG9jb2xzIG9yIGEKK2RpZmZlcmVudCBvbmUuICBBbHNvIGEgcHJvdG9jb2wgbmFtZSBmcm9tIC9ldGMvcHJvdG9jb2xzIGlzIGFsbG93ZWQuCitBICIhIiBhcmd1bWVudCBiZWZvcmUgdGhlIHByb3RvY29sIGludmVydHMgdGhlCit0ZXN0LiAgVGhlIG51bWJlciB6ZXJvIGlzIGVxdWl2YWxlbnQgdG8KKy5JUiBhbGwgLgorUHJvdG9jb2wKKy5JIGFsbAord2lsbCBtYXRjaCB3aXRoIGFsbCBwcm90b2NvbHMgYW5kIGlzIHRha2VuIGFzIGRlZmF1bHQgd2hlbiB0aGlzCitvcHRpb24gaXMgb21pdHRlZC4KKy5JIEFsbAorbWF5IG5vdCBiZSB1c2VkIGluIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGNoZWNrIGNvbW1hbmQuCisuVFAKKy5CUiAiLXMsIC0tc291cmNlICIgIlshXSBcZklhZGRyZXNzXGZQWy9cZkltYXNrXGZQXSIKK1NvdXJjZSBzcGVjaWZpY2F0aW9uLgorLkkgQWRkcmVzcworY2FuIGJlIGVpdGhlciBhIGhvc3RuYW1lLCBhIG5ldHdvcmsgbmFtZSwgb3IgYSBwbGFpbiBJUCBhZGRyZXNzLgorVGhlCisuSSBtYXNrCitjYW4gYmUgZWl0aGVyIGEgbmV0d29yayBtYXNrIG9yIGEgcGxhaW4gbnVtYmVyLAorc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIDEncyBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBuZXR3b3JrIG1hc2suCitUaHVzLCBhIG1hc2sgb2YKKy5JIDI0CitpcyBlcXVpdmFsZW50IHRvCisuSVIgMjU1LjI1NS4yNTUuMCAuCitBICIhIiBhcmd1bWVudCBiZWZvcmUgdGhlIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBpbnZlcnRzIHRoZSBzZW5zZSBvZgordGhlIGFkZHJlc3MuIFRoZSBmbGFnCisuQiAtLXNyYworaXMgYSBjb252ZW5pZW50IGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItZCwgLS1kZXN0aW5hdGlvbiAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitEZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uLiAKK1NlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCisuQiAtcworKHNvdXJjZSkgZmxhZyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4LiAgVGhlIGZsYWcKKy5CIC0tZHN0CitpcyBhbiBhbGlhcyBmb3IgdGhpcyBvcHRpb24uCisuVFAKKy5CSSAiLWosIC0tanVtcCAiICJ0YXJnZXQiCitUaGlzIHNwZWNpZmllcyB0aGUgdGFyZ2V0IG9mIHRoZSBydWxlOyBpZS4gd2hhdCB0byBkbyBpZiB0aGUgcGFja2V0CittYXRjaGVzIGl0LiAgVGhlIHRhcmdldCBjYW4gYmUgYSB1c2VyLWRlZmluZWQgY2hhaW4gKG5vdCB0aGUgb25lIHRoaXMKK3J1bGUgaXMgaW4pLCBvbmUgb2YgdGhlIHNwZWNpYWwgYnVpbHRpbiB0YXJnZXRzIHdoaWNoIGRlY2lkZSB0aGUgZmF0ZQorb2YgdGhlIHBhY2tldCBpbW1lZGlhdGVseSwgb3IgYW4gZXh0ZW5zaW9uIChzZWUgCisuQiBFWFRFTlNJT05TCitiZWxvdykuICBJZiB0aGlzCitvcHRpb24gaXMgb21pdHRlZCBpbiBhIHJ1bGUsIHRoZW4gbWF0Y2hpbmcgdGhlIHJ1bGUgd2lsbCBoYXZlIG5vCitlZmZlY3Qgb24gdGhlIHBhY2tldCdzIGZhdGUsIGJ1dCB0aGUgY291bnRlcnMgb24gdGhlIHJ1bGUgd2lsbCBiZQoraW5jcmVtZW50ZWQuCisuVFAKKy5CUiAiLWksIC0taW4taW50ZXJmYWNlICIgIlshXSBbXGZJbmFtZVxmUF0iCitPcHRpb25hbCBuYW1lIG9mIGFuIGludGVyZmFjZSB2aWEgd2hpY2ggYSBwYWNrZXQgaXMgcmVjZWl2ZWQgKGZvcgorcGFja2V0cyBlbnRlcmluZyB0aGUgCisuQlIgSU5QVVQgLAorLkIgRk9SV0FSRAorYW5kCisuQiBQUkVST1VUSU5HCitjaGFpbnMpLiAgV2hlbiB0aGUgIiEiIGFyZ3VtZW50IGlzIHVzZWQgYmVmb3JlIHRoZSBpbnRlcmZhY2UgbmFtZSwgdGhlCitzZW5zZSBpcyBpbnZlcnRlZC4gIElmIHRoZSBpbnRlcmZhY2UgbmFtZSBlbmRzIGluIGEgIisiLCB0aGVuIGFueQoraW50ZXJmYWNlIHdoaWNoIGJlZ2lucyB3aXRoIHRoaXMgbmFtZSB3aWxsIG1hdGNoLiAgSWYgdGhpcyBvcHRpb24gaXMKK29taXR0ZWQsIHRoZSBzdHJpbmcgIisiIGlzIGFzc3VtZWQsIHdoaWNoIHdpbGwgbWF0Y2ggd2l0aCBhbnkKK2ludGVyZmFjZSBuYW1lLgorLlRQCisuQlIgIi1vLCAtLW91dC1pbnRlcmZhY2UgIiAiWyFdIFtcZkluYW1lXGZQXSIKK09wdGlvbmFsIG5hbWUgb2YgYW4gaW50ZXJmYWNlIHZpYSB3aGljaCBhIHBhY2tldCBpcyBnb2luZyB0bworYmUgc2VudCAoZm9yIHBhY2tldHMgZW50ZXJpbmcgdGhlCisuQlIgRk9SV0FSRCAsCisuQiBPVVRQVVQKK2FuZAorLkIgUE9TVFJPVVRJTkcKK2NoYWlucykuICBXaGVuIHRoZSAiISIgYXJndW1lbnQgaXMgdXNlZCBiZWZvcmUgdGhlIGludGVyZmFjZSBuYW1lLAordGhlIHNlbnNlIGlzIGludmVydGVkLiAgSWYgdGhlIGludGVyZmFjZSBuYW1lIGVuZHMgaW4gYSAiKyIsIHRoZW4gYW55CitpbnRlcmZhY2Ugd2hpY2ggYmVnaW5zIHdpdGggdGhpcyBuYW1lIHdpbGwgbWF0Y2guICBJZiB0aGlzIG9wdGlvbiBpcworb21pdHRlZCwgdGhlIHN0cmluZyAiKyIgaXMgYXNzdW1lZCwgd2hpY2ggd2lsbCBtYXRjaCB3aXRoIGFueQoraW50ZXJmYWNlIG5hbWUuCisuVFAKKy5CICJbIV0gIiAiLWYsIC0tZnJhZ21lbnQiCitUaGlzIG1lYW5zIHRoYXQgdGhlIHJ1bGUgb25seSByZWZlcnMgdG8gc2Vjb25kIGFuZCBmdXJ0aGVyIGZyYWdtZW50cworb2YgZnJhZ21lbnRlZCBwYWNrZXRzLiAgU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgdGhlIHNvdXJjZSBvcgorZGVzdGluYXRpb24gcG9ydHMgb2Ygc3VjaCBhIHBhY2tldCAob3IgSUNNUCB0eXBlKSwgc3VjaCBhIHBhY2tldCB3aWxsCitub3QgbWF0Y2ggYW55IHJ1bGVzIHdoaWNoIHNwZWNpZnkgdGhlbS4gIFdoZW4gdGhlICIhIiBhcmd1bWVudAorcHJlY2VkZXMgdGhlICItZiIgZmxhZywgdGhlIHNlbnNlIGlzIGludmVydGVkLgorLlNTICJPVEhFUiBPUFRJT05TIgorVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZDoKKy5UUAorLkIgIi12LCAtLXZlcmJvc2UiCitWZXJib3NlIG91dHB1dC4gIFRoaXMgb3B0aW9uIG1ha2VzIHRoZSBsaXN0IGNvbW1hbmQgc2hvdyB0aGUgaW50ZXJmYWNlCithZGRyZXNzLCB0aGUgcnVsZSBvcHRpb25zIChpZiBhbnkpLCBhbmQgdGhlIFRPUyBtYXNrcy4gIFRoZSBwYWNrZXQgYW5kCitieXRlIGNvdW50ZXJzIGFyZSBhbHNvIGxpc3RlZCwgd2l0aCB0aGUgc3VmZml4ICdLJywgJ00nIG9yICdHJyBmb3IKKzEwMDAsIDEsMDAwLDAwMCBhbmQgMSwwMDAsMDAwLDAwMCBtdWx0aXBsaWVycyByZXNwZWN0aXZlbHkgKGJ1dCBzZWUKK3RoZQorLkIgLXgKK2ZsYWcgdG8gY2hhbmdlIHRoaXMpLgorRm9yIGFwcGVuZGluZywgaW5zZXJ0aW9uLCBkZWxldGlvbiBhbmQgcmVwbGFjZW1lbnQsIHRoaXMgY2F1c2VzCitkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgcnVsZSBvciBydWxlcyB0byBiZSBwcmludGVkLgorLlRQCisuQiAiLW4sIC0tbnVtZXJpYyIKK051bWVyaWMgb3V0cHV0LgorSVAgYWRkcmVzc2VzIGFuZCBwb3J0IG51bWJlcnMgd2lsbCBiZSBwcmludGVkIGluIG51bWVyaWMgZm9ybWF0LgorQnkgZGVmYXVsdCwgdGhlIHByb2dyYW0gd2lsbCB0cnkgdG8gZGlzcGxheSB0aGVtIGFzIGhvc3QgbmFtZXMsCituZXR3b3JrIG5hbWVzLCBvciBzZXJ2aWNlcyAod2hlbmV2ZXIgYXBwbGljYWJsZSkuCisuVFAKKy5CICIteCwgLS1leGFjdCIKK0V4cGFuZCBudW1iZXJzLgorRGlzcGxheSB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycywKK2luc3RlYWQgb2Ygb25seSB0aGUgcm91bmRlZCBudW1iZXIgaW4gSydzIChtdWx0aXBsZXMgb2YgMTAwMCkKK00ncyAobXVsdGlwbGVzIG9mIDEwMDBLKSBvciBHJ3MgKG11bHRpcGxlcyBvZiAxMDAwTSkuICBUaGlzIG9wdGlvbiBpcworb25seSByZWxldmVudCBmb3IgdGhlIAorLkIgLUwKK2NvbW1hbmQuCisuVFAKKy5CICItLWxpbmUtbnVtYmVycyIKK1doZW4gbGlzdGluZyBydWxlcywgYWRkIGxpbmUgbnVtYmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwKK2NvcnJlc3BvbmRpbmcgdG8gdGhhdCBydWxlJ3MgcG9zaXRpb24gaW4gdGhlIGNoYWluLgorLlNIIE1BVENIIEVYVEVOU0lPTlMKK2lwdGFibGVzIGNhbiB1c2UgZXh0ZW5kZWQgcGFja2V0IG1hdGNoaW5nIG1vZHVsZXMuICBUaGUgZm9sbG93aW5nIGFyZQoraW5jbHVkZWQgaW4gdGhlIGJhc2UgcGFja2FnZSwgYW5kIG1vc3Qgb2YgdGhlc2UgY2FuIGJlIHByZWNlZWRlZCBieSBhCisuQiAhCit0byBpbnZlcnQgdGhlIHNlbnNlIG9mIHRoZSBtYXRjaC4KKy5TUyB0Y3AKK1RoZXNlIGV4dGVuc2lvbnMgYXJlIGxvYWRlZCBpZiBgLS1wcm90b2NvbCB0Y3AnIGlzIHNwZWNpZmllZCwgYW5kIG5vCitvdGhlciBtYXRjaCBpcyBzcGVjaWZpZWQuIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKy5UUAorLkJSICItLXNvdXJjZS1wb3J0ICIgIlshXSBbXGZJcG9ydFs6cG9ydF1cZlBdIG9yIFtcZklwb3J0Wy1wb3J0XV1cZlBdIgorU291cmNlIHBvcnQgb3IgcG9ydCByYW5nZSBzcGVjaWZpY2F0aW9uLiBUaGlzIGNhbiBlaXRoZXIgYmUgYSBzZXJ2aWNlCituYW1lIG9yIGEgcG9ydCBudW1iZXIuIEFuIGluY2x1c2l2ZSByYW5nZSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQsCit1c2luZyB0aGUgZm9ybWF0CisuSVIgcG9ydCA6IHBvcnQgCitvcgorLklSIHBvcnQgLSBwb3J0IC4KK0lmIHRoZSBmaXJzdCBwb3J0IGlzIG9taXR0ZWQsICIwIiBpcyBhc3N1bWVkOyBpZiB0aGUgbGFzdCBpcyBvbWl0dGVkLAorIjY1NTM1IiBpcyBhc3N1bWVkLgorSWYgdGhlIHNlY29uZCBwb3J0IGdyZWF0ZXIgdGhlbiB0aGUgZmlyc3QgdGhleSB3aWxsIGJlIHN3YXBwZWQuCitUaGUgZmxhZworLkIgLS1zcG9ydAoraXMgYW4gYWxpYXMgZm9yIHRoaXMgb3B0aW9uLgorLlRQCisuQlIgIi0tZGVzdGluYXRpb24tcG9ydCAiICJbIV0gW1xmSXBvcnRbOnBvcnRdXGZQXSBvciBbXGZJcG9ydFstcG9ydF1dXGZQIgorRGVzdGluYXRpb24gcG9ydCBvciBwb3J0IHJhbmdlIHNwZWNpZmljYXRpb24uIFRoZSBmbGFnCisuQiAtLWRwb3J0CitpcyBhbiBhbGlhcyBmb3IgdGhpcyBvcHRpb24uCisuVFAKKy5CUiAiLS10Y3AtZmxhZ3MgIiAiWyFdIFxmSW1hc2tcZlAgXGZJY29tcFxmUCIKK01hdGNoIHdoZW4gdGhlIFRDUCBmbGFncyBhcmUgYXMgc3BlY2lmaWVkLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZQorZmxhZ3Mgd2hpY2ggd2Ugc2hvdWxkIGV4YW1pbmUsIHdyaXR0ZW4gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgYW5kCit0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmxhZ3Mgd2hpY2ggbXVzdCBiZQorc2V0LiAgRmxhZ3MgYXJlOiAKKy5CUiAiU1lOIEFDSyBGSU4gUlNUIFVSRyBQU0ggQUxMIE5PTkUiIC4KK0hlbmNlIHRoZSBjb21tYW5kCisuYnIKKyBpcGNoYWlucyAtcCB0Y3AgLS10Y3AtZmxhZ3MgU1lOLEFDSyxGSU4sUlNUIFNZTgorLmJyCit3aWxsIG9ubHkgbWF0Y2ggcGFja2V0cyB3aXRoIHRoZSBTWU4gZmxhZyBzZXQsIGFuZCB0aGUgQUNLLCBGSU4gYW5kCitSU1QgZmxhZ3MgdW5zZXQuCisuVFAKKy5CICJbIV0gLS1zeW4iCitPbmx5IG1hdGNoIFRDUCBwYWNrZXRzIHdpdGggdGhlIFNZTiBiaXQgc2V0IGFuZCB0aGUgQUNLIGFuZCBGSU4gYml0cworY2xlYXJlZC4gIFN1Y2ggcGFja2V0cyBhcmUgdXNlZCB0byByZXF1ZXN0IFRDUCBjb25uZWN0aW9uIGluaXRpYXRpb247Citmb3IgZXhhbXBsZSwgYmxvY2tpbmcgc3VjaCBwYWNrZXRzIGNvbWluZyBpbiBhbiBpbnRlcmZhY2Ugd2lsbCBwcmV2ZW50CitpbmNvbWluZyBUQ1AgY29ubmVjdGlvbnMsIGJ1dCBvdXRnb2luZyBUQ1AgY29ubmVjdGlvbnMgd2lsbCBiZQordW5hZmZlY3RlZC4KK0l0IGlzIGVxdWl2YWxlbnQgdG8gXGZCLS10Y3AtZmxhZ3MgU1lOLFJTVCxBQ0sgU1lOXGZQLgorSWYgdGhlICIhIiBmbGFnIHByZWNlZGVzIHRoZSAiLS1zeW4iLCB0aGUgc2Vuc2Ugb2YgdGhlCitvcHRpb24gaXMgaW52ZXJ0ZWQuCisuVFAKKy5CUiAiLS10Y3Atb3B0aW9uICIgIlshXSBcZkludW1iZXJcZlAiCitNYXRjaCBpZiBUQ1Agb3B0aW9uIHNldC4KKy5TUyB1ZHAKK1RoZXNlIGV4dGVuc2lvbnMgYXJlIGxvYWRlZCBpZiBgLS1wcm90b2NvbCB1ZHAnIGlzIHNwZWNpZmllZCwgYW5kIG5vCitvdGhlciBtYXRjaCBpcyBzcGVjaWZpZWQuIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKy5UUAorLkJSICItLXNvdXJjZS1wb3J0ICIgIlshXSBbXGZJcG9ydFs6cG9ydF1cZlBdIG9yIFtcZklwb3J0Wy1wb3J0XV1cZlAiCitTb3VyY2UgcG9ydCBvciBwb3J0IHJhbmdlIHNwZWNpZmljYXRpb24uCitTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorLkIgLS1zb3VyY2UtcG9ydAorb3B0aW9uIG9mIHRoZSBUQ1AgZXh0ZW5zaW9uIGZvciBkZXRhaWxzLgorLlRQCisuQlIgIi0tZGVzdGluYXRpb24tcG9ydCAiICJbIV0gW1xmSXBvcnRbOnBvcnRdXGZQXSBvciBbXGZJcG9ydFstcG9ydF1dXGZQIgorRGVzdGluYXRpb24gcG9ydCBvciBwb3J0IHJhbmdlIHNwZWNpZmljYXRpb24uCitTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorLkIgLS1kZXN0aW5hdGlvbi1wb3J0CitvcHRpb24gb2YgdGhlIFRDUCBleHRlbnNpb24gZm9yIGRldGFpbHMuCisuU1MgaWNtcAorVGhpcyBleHRlbnNpb24gaXMgbG9hZGVkIGlmIGAtLXByb3RvY29sIGljbXAnIGlzIHNwZWNpZmllZCwgYW5kIG5vCitvdGhlciBtYXRjaCBpcyBzcGVjaWZpZWQuIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb3B0aW9uOgorLlRQCisuQlIgIi0taWNtcC10eXBlICIgIlshXSBcZkl0eXBlbmFtZVxmUCIKK1RoaXMgYWxsb3dzIHNwZWNpZmljYXRpb24gb2YgdGhlIElDTVAgdHlwZSwgd2hpY2ggY2FuIGJlIGEgbnVtZXJpYworSUNNUCB0eXBlLCBvciBvbmUgb2YgdGhlIElDTVAgdHlwZSBuYW1lcyBzaG93biBieSB0aGUgY29tbWFuZAorLmJyCisgaXB0YWJsZXMgLXAgaWNtcCAtaAorLmJyCisuU1MgbWFjCisuVFAKKy5CUiAiLS1tYWMtc291cmNlICIgIlshXSBcZklhZGRyZXNzXGZQIgorTWF0Y2ggc291cmNlIE1BQyBhZGRyZXNzLiAgSXQgbXVzdCBiZSBvZiB0aGUgZm9ybSBYWDpYWDpYWDpYWDpYWDpYWC4KK05vdGUgdGhhdCB0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHBhY2tldHMgZW50ZXJpbmcgdGhlCisuQlIgUFJFUk9VVElORyAsCitvcgorLkIgSU5QVVQKK2NoYWlucyBmcm9tIGFuIGV0aGVybmV0IGRldmljZS4KKy5TUyBsaW1pdAorVGhpcyBtb2R1bGUgbWF0Y2hlcyBhdCBhIGxpbWl0ZWQgcmF0ZSB1c2luZyBhIHRva2VuIGJ1Y2tldCBmaWx0ZXI6IGl0CitjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBMT0cgdGFyZ2V0IHRvIGdpdmUgbGltaXRlZAorbG9nZ2luZy4gIEEgcnVsZSB1c2luZyB0aGlzIGV4dGVuc2lvbiB3aWxsIG1hdGNoIHVudGlsIHRoaXMgbGltaXQgaXMKK3JlYWNoZWQgKHVubGVzcyB0aGUgYCEnIGZsYWcgaXMgdXNlZCkuCisuVFAKKy5CSSAiLS1saW1pdCAiICJyYXRlIgorTWF4aW11bSBhdmVyYWdlIG1hdGNoaW5nIHJhdGU6IHNwZWNpZmllZCBhcyBhIG51bWJlciwgd2l0aCBhbiBvcHRpb25hbAorYC9zZWNvbmQnLCBgL21pbnV0ZScsIGAvaG91cicsIG9yIGAvZGF5JyBzdWZmaXg7IHRoZSBkZWZhdWx0IGlzCiszL2hvdXIuCisuVFAKKy5CSSAiLS1saW1pdC1idXJzdCAiICJudW1iZXIiCitUaGUgbWF4aW11bSBpbml0aWFsIG51bWJlciBvZiBwYWNrZXRzIHRvIG1hdGNoOiB0aGlzIG51bWJlciBnZXRzCityZWNoYXJnZWQgYnkgb25lIGV2ZXJ5IHRpbWUgdGhlIGxpbWl0IHNwZWNpZmllZCBhYm92ZSBpcyBub3QgcmVhY2hlZCwKK3VwIHRvIHRoaXMgbnVtYmVyOyB0aGUgZGVmYXVsdCBpcyA1LgorLlNTIG11bHRpcG9ydAorVGhpcyBtb2R1bGUgbWF0Y2hlcyBhIHNldCBvZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcG9ydHMuIFVwIHRvIDE1Citwb3J0cyBjYW4gYmUgc3BlY2lmaWVkLiBJdCBjYW4gb25seSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKy5CICItcCB0Y3AiCitvcgorLkJSICItcCB1ZHAiIC4KKy5UUAorLkJSICItLXNvdXJjZS1wb3J0IiAiIFtcZklwb3J0Wyxwb3J0XVxmUF0iCitNYXRjaCBpZiB0aGUgc291cmNlIHBvcnQgaXMgb25lIG9mIHRoZSBnaXZlbiBwb3J0cy4KKy5UUAorLkJSICItLWRlc3RpbmF0aW9uLXBvcnQiICIgW1xmSXBvcnRbLHBvcnRdXGZQXSIKK01hdGNoIGlmIHRoZSBkZXN0aW5hdGlvbiBwb3J0IGlzIG9uZSBvZiB0aGUgZ2l2ZW4gcG9ydHMuCisuVFAKKy5CUiAiLS1wb3J0IiAiIFtcZklwb3J0Wyxwb3J0XVxmUF0iCitNYXRjaCBpZiB0aGUgYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb3J0cyBhcmUgZXF1YWwgdG8gZWFjaAorb3RoZXIgYW5kIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gcG9ydHMuCisuU1MgbWFyaworVGhpcyBtb2R1bGUgbWF0Y2hlcyB0aGUgbmV0ZmlsdGVyIG1hcmsgZmllbGQgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2V0Cisod2hpY2ggY2FuIGJlIHNldCB1c2luZyB0aGUKKy5CIE1BUksKK3RhcmdldCBiZWxvdykuCisuVFAKKy5CSSAiLS1tYXJrICIgInZhbHVlWy9tYXNrXSIKK01hdGNoZXMgcGFja2V0cyB3aXRoIHRoZSBnaXZlbiB1bnNpZ25lZCBtYXJrIHZhbHVlIChpZiBhIG1hc2sgaXMKK3NwZWNpZmllZCwgdGhpcyBpcyBsb2dpY2FsbHkgQU5EZWQgd2l0aCB0aGUgbWFyayBiZWZvcmUgdGhlCitjb21wYXJpc29uKS4KKy5TUyBvd25lcgorVGhpcyBtb2R1bGUgYXR0ZW1wdHMgdG8gbWF0Y2ggdmFyaW91cyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHBhY2tldAorY3JlYXRvciwgZm9yIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMuICBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZQorT1VUUFVUIGNoYWluLCBhbmQgZXZlbiB0aGlzIHNvbWUgcGFja2V0cyAoc3VjaCBhcyBJQ01QIHBpbmcgcmVzcG9uc2VzKQorbWF5IGhhdmUgbm8gb3duZXIsIGFuZCBoZW5jZSBuZXZlciBtYXRjaC4KKy5UUAorLkJJICItLXVpZC1vd25lciIgInVzZXJpZCIKK01hdGNoZXMgaWYgdGhlIHBhY2tldCB3YXMgY3JlYXRlZCBieSBhIHByb2Nlc3Mgd2l0aCB0aGUgZ2l2ZW4KK2VmZmVjdGl2ZSB1c2VyIGlkLgorLlRQCisuQkkgIi0tZ2lkLW93bmVyIiAiZ3JvdXBpZCIKK01hdGNoZXMgaWYgdGhlIHBhY2tldCB3YXMgY3JlYXRlZCBieSBhIHByb2Nlc3Mgd2l0aCB0aGUgZ2l2ZW4KK2VmZmVjdGl2ZSBncm91cCBpZC4KKy5UUAorLkJJICItLXBpZC1vd25lciIgInByb2Nlc3NpZCIKK01hdGNoZXMgaWYgdGhlIHBhY2tldCB3YXMgY3JlYXRlZCBieSBhIHByb2Nlc3Mgd2l0aCB0aGUgZ2l2ZW4KK3Byb2Nlc3MgaWQuCisuVFAKKy5CSSAiLS1zaWQtb3duZXIiICJzZXNzaW9uaWQiCitNYXRjaGVzIGlmIHRoZSBwYWNrZXQgd2FzIGNyZWF0ZWQgYnkgYSBwcm9jZXNzIGluIHRoZSBnaXZlbiBzZXNzaW9uCitncm91cC4KKy5TUyBzdGF0ZQorVGhpcyBtb2R1bGUsIHdoZW4gY29tYmluZWQgd2l0aCBjb25uZWN0aW9uIHRyYWNraW5nLCBhbGxvd3MgYWNjZXNzIHRvCit0aGUgY29ubmVjdGlvbiB0cmFja2luZyBzdGF0ZSBmb3IgdGhpcyBwYWNrZXQuCisuVFAKKy5CSSAiLS1zdGF0ZSIgInN0YXRlIgorV2hlcmUgc3RhdGUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY29ubmVjdGlvbiBzdGF0ZXMgdG8KK21hdGNoLiAgUG9zc2libGUgc3RhdGVzIGFyZSAKKy5CIElOVkFMSUQKK21lYW5pbmcgdGhhdCB0aGUgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aCBubyBrbm93biBjb25uZWN0aW9uLAorLkIgRVNUQUJMSVNIRUQKK21lYW5pbmcgdGhhdCB0aGUgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbm5lY3Rpb24gd2hpY2ggaGFzIHNlZW4KK3BhY2tldHMgaW4gYm90aCBkaXJlY3Rpb25zLAorLkIgTkVXCittZWFuaW5nIHRoYXQgdGhlIHBhY2tldCBoYXMgc3RhcnRlZCBhIG5ldyBjb25uZWN0aW9uLCBvciBvdGhlcndpc2UKK2Fzc29jaWF0ZWQgd2l0aCBhIGNvbm5lY3Rpb24gd2hpY2ggaGFzIG5vdCBzZWVuIHBhY2tldHMgaW4gYm90aAorZGlyZWN0aW9ucywgYW5kCisuQiBSRUxBVEVECittZWFuaW5nIHRoYXQgdGhlIHBhY2tldCBpcyBzdGFydGluZyBhIG5ldyBjb25uZWN0aW9uLCBidXQgaXMKK2Fzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBjb25uZWN0aW9uLCBzdWNoIGFzIGFuIEZUUCBkYXRhIHRyYW5zZmVyLAorb3IgYW4gSUNNUCBlcnJvci4KKy5TUyB1bmNsZWFuCitUaGlzIG1vZHVsZSB0YWtlcyBubyBvcHRpb25zLCBidXQgYXR0ZW1wdHMgdG8gbWF0Y2ggcGFja2V0cyB3aGljaCBzZWVtCittYWxmb3JtZWQgb3IgdW51c3VhbC4gIFRoaXMgaXMgcmVnYXJkZWQgYXMgZXhwZXJpbWVudGFsLgorLlNTIHRvcworVGhpcyBtb2R1bGUgbWF0Y2hlcyB0aGUgOCBiaXRzIG9mIFR5cGUgb2YgU2VydmljZSBmaWVsZCBpbiB0aGUgSVAKK2hlYWRlciAoaWUuIGluY2x1ZGluZyB0aGUgcHJlY2VkZW5jZSBiaXRzKS4gCisuVFAKKy5CSSAiLS10b3MiICJ0b3MiCitUaGUgYXJndW1lbnQgaXMgZWl0aGVyIGEgc3RhbmRhcmQgbmFtZSwgKHVzZQorLmJyCisgaXB0YWJsZXMgLW0gdG9zIC1oCisuYnIKK3RvIHNlZSB0aGUgbGlzdCksIG9yIGEgbnVtZXJpYyB2YWx1ZSB0byBtYXRjaC4KKy5TSCBUQVJHRVQgRVhURU5TSU9OUworaXB0YWJsZXMgY2FuIHVzZSBleHRlbmRlZCB0YXJnZXQgbW9kdWxlczogdGhlIGZvbGxvd2luZyBhcmUgaW5jbHVkZWQKK2luIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uCisuU1MgTE9HCitUdXJuIG9uIGtlcm5lbCBsb2dnaW5nIG9mIG1hdGNoaW5nIHBhY2tldHMuICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldAorZm9yIGEgcnVsZSwgdGhlIExpbnV4IGtlcm5lbCB3aWxsIHByaW50IHNvbWUgaW5mb3JtYXRpb24gb24gYWxsCittYXRjaGluZyBwYWNrZXRzIChsaWtlIG1vc3QgSVAgaGVhZGVyIGZpZWxkcykgdmlhCisuSVIgcHJpbnRrICgpLgorLlRQCisuQkkgIi0tbG9nLWxldmVsICIgImxldmVsIgorTGV2ZWwgb2YgbG9nZ2luZyAobnVtZXJpYyBvciBzZWUgXGZJc3lzbG9nLmNvbmZcZlAoNSkpLgorLlRQCisuQkkgIi0tbG9nLXByZWZpeCAiICJwcmVmaXgiCitQcmVmaXggbG9nIG1lc3NhZ2VzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXg7IHVwIHRvIDE0IGxldHRlcnMgbG9uZywKK2FuZCB1c2VmdWwgZm9yIGRpc3Rpbmd1aXNoaW5nIG1lc3NhZ2VzIGluIHRoZSBsb2dzLgorLlRQCisuQiAtLWxvZy10Y3Atc2VxdWVuY2UKK0xvZyBUQ1Agc2VxdWVuY2UgbnVtYmVycy4gVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgaWYgdGhlIGxvZyBpcworcmVhZGFibGUgYnkgdXNlcnMuCisuVFAKKy5CIC0tbG9nLXRjcC1vcHRpb25zCitMb2cgb3B0aW9ucyBmcm9tIHRoZSBUQ1AgcGFja2V0IGhlYWRlci4KKy5UUAorLkIgLS1sb2ctaXAtb3B0aW9ucworTG9nIG9wdGlvbnMgZnJvbSB0aGUgSVAgcGFja2V0IGhlYWRlci4KKy5TUyBNQVJLCitUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBuZXRmaWx0ZXIgbWFyayB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCitwYWNrZXQuICBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZQorLkIgbWFuZ2xlCit0YWJsZS4KKy5UUAorLkJJICItLXNldC1tYXJrIiAibWFyayIKKy5TUyBSRUpFQ1QKK1RoaXMgaXMgdXNlZCB0byBzZW5kIGJhY2sgYW4gZXJyb3IgcGFja2V0IGluIHJlc3BvbnNlIHRvIHRoZSBtYXRjaGVkCitwYWNrZXQ6IG90aGVyd2lzZSBpdCBpcyBlcXVpdmFsZW50IHRvIAorLkJSIERST1AgLgorVGhpcyB0YXJnZXQgaXMgb25seSB2YWxpZCBpbiB0aGUKKy5CUiBJTlBVVCAsCisuQiBGT1JXQVJECithbmQKKy5CIE9VVFBVVAorY2hhaW5zLiAgU2V2ZXJhbCBvcHRpb25zIGNvbnRyb2wgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IgcGFja2V0CityZXR1cm5lZDoKKy5UUAorLkJJICItLXJlamVjdC13aXRoIiAidHlwZSIKK1RoZSB0eXBlIGdpdmVuIGNhbiBiZSAKKy5CUiBpY21wLW5ldC11bnJlYWNoYWJsZSAsCisuQlIgaWNtcC1ob3N0LXVucmVhY2hhYmxlICwKKy5CUiBpY21wLXBvcnQtdW5yZWFjaGFibGUgb3IKKy5CUiBpY21wLXByb3RvLXVucmVhY2hhYmxlCit3aGljaCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIElDTVAgZXJyb3IgbWVzc2FnZSAobmV0LXVucmVhY2hhYmxlIGlzCit0aGUgZGVmYXVsdCkuICBUaGUgZm9sbG93aW5nIHNwZWNpYWwgdHlwZXMgYXJlIGFsc28gYWxsb3dlZDoKKy5CIHRjcC1yZXNldCAKK2lzIG9ubHkgdmFsaWQgaWYgdGhlIHJ1bGUgYWxzbyBzcGVjaWZpZXMgCisuQlIgIi1wIHRjcCIgLAorYW5kIGdlbmVyYXRlcyBhIFRDUCByZXNldCBwYWNrZXQgaW4gcmVzcG9uc2UuICBUaGlzIGlzIGdlbmVyYWxseSBub3QgYQorZ29vZCBpZGVhIChtb2Rlcm4gc3RhY2tzIHNob3VsZCBkZWFsIHdpdGggSUNNUHMgb24gVENQIGNvbm5lY3Rpb24KK2luaXRpYXRpb24gYXR0ZW1wdHMpLgorLkIgZWNoby1yZXBseQorY2FuIG9ubHkgYmUgdXNlZCBmb3IgcnVsZXMgd2hpY2ggc3BlY2lmeSBhbiBJQ01QIHBpbmcgcGFja2V0LCBhbmQKK2dlbmVyYXRlcyBhIHBpbmcgcmVwbHkuCisuU1MgVE9TCitUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSA4LWJpdCBUeXBlIG9mIFNlcnZpY2UgZmllbGQgaW4gdGhlIElQIGhlYWRlci4KK0l0IGlzIG9ubHkgdmFsaWQgaW4gdGhlCisuQiBtYW5nbGUKK3RhYmxlLgorLlRQCisuQkkgIi0tc2V0LXRvcyIgInRvcyIKK1lvdSBjYW4gdXNlIGEgbnVtZXJpYyBUT1MgdmFsdWVzLCBvciB1c2UKKy5icgorIGlwdGFibGVzIC1qIFRPUyAtaAorLmJyCit0byBzZWUgdGhlIGxpc3Qgb2YgdmFsaWQgVE9TIG5hbWVzLgorLlNTIE1JUlJPUgorVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZGVtb25zdHJhdGlvbiB0YXJnZXQgd2hpY2ggaW52ZXJ0cyB0aGUgc291cmNlCithbmQgZGVzdGluYXRpb24gZmllbGRzIGluIHRoZSBJUCBoZWFkZXIgYW5kIHJldHJhbnNtaXRzIHRoZSBwYWNrZXQuCitJdCBpcyBvbmx5IHZhbGlkIGluIHRoZQorLkJSIElOUFVUICwKKy5CIEZPUldBUkQKK2FuZCAKKy5CIE9VVFBVVAorY2hhaW5zLgorLlNTIFNOQVQKK1RoaXMgdGFyZ2V0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIAorLkIgbmF0Cit0YWJsZSwgaW4gdGhlIAorLkIgUE9TVFJPVVRJTkcKK2NoYWluLiAgSXQgc3BlY2lmaWVzIHRoYXQgdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgc2hvdWxkIGJlCittb2RpZmllZCAoYW5kIGFsbCBmdXR1cmUgcGFja2V0cyBpbiB0aGlzIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGJlCittYW5nbGVkKSwgYW5kIHJ1bGVzIHNob3VsZCBjZWFzZSBiZWluZyBleGFtaW5lZC4gIEl0IHRha2VzIG9uZSBvcHRpb246CisuVFAKKy5CSSAiLS10by1zb3VyY2UiICI8aXBhZGRyPlstPGlwYWRkcj5dWzpwb3J0LXBvcnRdIgord2hpY2ggY2FuIHNwZWNpZnkgYSBzaW5nbGUgbmV3IHNvdXJjZSBJUCBhZGRyZXNzLCBhbiBpbmNsdXNpdmUgcmFuZ2UKK29mIElQIGFkZHJlc3NlcywgYW5kIG9wdGlvbmFsbHksIGEgcG9ydCByYW5nZSAod2hpY2ggaXMgb25seSB2YWxpZCBpZgordGhlIHJ1bGUgYWxzbyBzcGVjaWZpZXMKKy5CICItcCB0Y3AiCitvcgorLkJSICItcCB1ZHAiICkuCitJZiBubyBwb3J0IHJhbmdlIGlzIHNwZWNpZmllZCwgdGhlbiBzb3VyY2UgcG9ydHMgYmVsb3cgNTEyIHdpbGwgYmUKK21hcHBlZCB0byBvdGhlciBwb3J0cyBiZWxvdyA1MTI6IHRob3NlIGJldHdlZW4gMTAyNCB3aWxsIGJlIG1hcHBlZCB0bworcG9ydHMgYmVsb3cgMTAyNCwgYW5kIG90aGVyIHBvcnRzIHdpbGwgYmUgbWFwcGVkIHRvIDEwMjQgb3IgYWJvdmUuCitXaGVyZSBwb3NzaWJsZSwgbm8gcG9ydCBhbHRlcmF0aW9uIHdpbGwgb2NjdXIuCisuU1MgRE5BVAorVGhpcyB0YXJnZXQgaXMgb25seSB2YWxpZCBpbiB0aGUgCisuQiBuYXQKK3RhYmxlLCBpbiB0aGUgCisuQiBQUkVST1VUSU5HCithbmQKKy5CIE9VVFBVVAorY2hhaW5zLiAgSXQgc3BlY2lmaWVzIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBhY2tldAorc2hvdWxkIGJlIG1vZGlmaWVkIChhbmQgYWxsIGZ1dHVyZSBwYWNrZXRzIGluIHRoaXMgY29ubmVjdGlvbiB3aWxsCithbHNvIGJlIG1hbmdsZWQpLCBhbmQgcnVsZXMgc2hvdWxkIGNlYXNlIGJlaW5nIGV4YW1pbmVkLiAgSXQgdGFrZXMgb25lCitvcHRpb246CisuVFAKKy5CSSAiLS10by1kZXN0aW5hdGlvbiIgIjxpcGFkZHI+Wy08aXBhZGRyPl1bOnBvcnQtcG9ydF0iCit3aGljaCBjYW4gc3BlY2lmeSBhIHNpbmdsZSBuZXcgZGVzdGluYXRpb24gSVAgYWRkcmVzcywgYW4gaW5jbHVzaXZlCityYW5nZSBvZiBJUCBhZGRyZXNzZXMsIGFuZCBvcHRpb25hbGx5LCBhIHBvcnQgcmFuZ2UgKHdoaWNoIGlzIG9ubHkKK3ZhbGlkIGlmIHRoZSBydWxlIGFsc28gc3BlY2lmaWVzCisuQiAiLXAgdGNwIgorb3IKKy5CUiAiLXAgdWRwIiApLgorSWYgbm8gcG9ydCByYW5nZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIHBvcnQgd2lsbCBuZXZlciBiZQorbW9kaWZpZWQuCisuU1MgTUFTUVVFUkFERQorVGhpcyB0YXJnZXQgaXMgb25seSB2YWxpZCBpbiB0aGUgCisuQiBuYXQKK3RhYmxlLCBpbiB0aGUgCisuQiBQT1NUUk9VVElORworY2hhaW4uICBJdCBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggZHluYW1pY2FsbHkgYXNzaWduZWQgSVAgKGRpYWx1cCkKK2Nvbm5lY3Rpb25zOiBpZiB5b3UgaGF2ZSBhIHN0YXRpYyBJUCBhZGRyZXNzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgU05BVAordGFyZ2V0LiAgTWFzcXVlcmFkaW5nIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhIG1hcHBpbmcgdG8gdGhlIElQCithZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgdGhlIHBhY2tldCBpcyBnb2luZyBvdXQsIGJ1dCBhbHNvIGhhcyB0aGUKK2VmZmVjdCB0aGF0IGNvbm5lY3Rpb25zIGFyZSAKKy5JIGZvcmdvdHRlbgord2hlbiB0aGUgaW50ZXJmYWNlIGdvZXMgZG93bi4gIFRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIHdoZW4gdGhlCituZXh0IGRpYWx1cCBpcyB1bmxpa2VseSB0byBoYXZlIHRoZSBzYW1lIGludGVyZmFjZSBhZGRyZXNzIChhbmQgaGVuY2UKK2FueSBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucyBhcmUgbG9zdCBhbnl3YXkpLiAgSXQgdGFrZXMgb25lIG9wdGlvbjoKKy5UUAorLkJJICItLXRvLXBvcnRzIiAiPHBvcnQ+Wy08cG9ydD5dIgorVGhpcyBzcGVjaWZpZXMgYSByYW5nZSBvZiBzb3VyY2UgcG9ydHMgdG8gdXNlLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IAorLkIgU05BVAorc291cmNlIHBvcnQtc2VsZWN0aW9uIGhldXJpc3RpY3MgKHNlZSBhYm92ZSkuICBUaGlzIGlzIG9ubHkgdmFsaWQgd2l0aAoraWYgdGhlIHJ1bGUgYWxzbyBzcGVjaWZpZXMKKy5CICItcCB0Y3AiCitvcgorLkJSICItcCB1ZHAiICkuCisuU1MgUkVESVJFQ1QKK1RoaXMgdGFyZ2V0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIAorLkIgbmF0Cit0YWJsZSwgaW4gdGhlIAorLkIgUFJFUk9VVElORworYW5kCisuQiBPVVRQVVQKK2NoYWlucy4gIEl0IGFsdGVycyB0aGUgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byBzZW5kIHRoZSBwYWNrZXQgdG8KK3RoZSBtYWNoaW5lIGl0c2VsZiAobG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cyBhcmUgbWFwcGVkIHRvIHRoZQorMTI3LjAuMC4xIGFkZHJlc3MpLgorSXQgdGFrZXMgb25lIG9wdGlvbjoKKy5UUAorLkJJICItLXRvLXBvcnRzIiAiPHBvcnQ+Wy08cG9ydD5dIgorVGhpcyBzcGVjaWZpZXMgYSBkZXN0aW5hdGlvbiBwb3J0IG9yIHJhbmdlIG9yIHBvcnRzIHRvIHVzZTogd2l0aG91dAordGhpcywgdGhlIGRlc3RpbmF0aW9uIHBvcnQgaXMgbmV2ZXIgYWx0ZXJlZC4gIFRoaXMgaXMgb25seSB2YWxpZCB3aXRoCitpZiB0aGUgcnVsZSBhbHNvIHNwZWNpZmllcworLkIgIi1wIHRjcCIKK29yCisuQlIgIi1wIHVkcCIgKS4KKy5UUAorLlNIIERJQUdOT1NUSUNTCitWYXJpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIHN0YW5kYXJkIGVycm9yLiAgVGhlIGV4aXQgY29kZQoraXMgMCBmb3IgY29ycmVjdCBmdW5jdGlvbmluZy4gIEVycm9ycyB3aGljaCBhcHBlYXIgdG8gYmUgY2F1c2VkIGJ5CitpbnZhbGlkIG9yIGFidXNlZCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBjYXVzZSBhbiBleGl0IGNvZGUgb2YgMiwgYW5kCitvdGhlciBlcnJvcnMgY2F1c2UgYW4gZXhpdCBjb2RlIG9mIDEuCisuU0ggQlVHUworQ2hlY2sgaXMgbm90IGltcGxlbWVudGVkICh5ZXQpLgorLlNIIENPTVBBVElCSUxJVFkgV0lUSCBJUENIQUlOUworVGhpcyAKKy5CIGlwdGFibGVzCitpcyB2ZXJ5IHNpbWlsYXIgdG8gaXBjaGFpbnMgYnkgUnVzdHkgUnVzc2VsbC4gIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMKK3RoYXQgdGhlIGNoYWlucyAKKy5CIElOUFVUCithbmQKKy5CIE9VVFBVVAorYXJlIG9ubHkgdHJhdmVyc2VkIGZvciBwYWNrZXRzIGNvbWluZyBpbnRvIHRoZSBsb2NhbCBob3N0IGFuZAorb3JpZ2luYXRpbmcgZnJvbSB0aGUgbG9jYWwgaG9zdCByZXNwZWN0aXZlbHkuICBIZW5jZSBldmVyeSBwYWNrZXQgb25seQorcGFzc2VzIHRocm91Z2ggb25lIG9mIHRoZSB0aHJlZSBjaGFpbnM7IHByZXZpb3VzbHkgYSBmb3J3YXJkZWQgcGFja2V0Cit3b3VsZCBwYXNzIHRocm91Z2ggYWxsIHRocmVlLgorLlBQCitUaGUgb3RoZXIgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgCisuQiAtaQorcmVmZXJzIHRvIHRoZSBpbnB1dCBpbnRlcmZhY2U7CisuQiAtbworcmVmZXJzIHRvIHRoZSBvdXRwdXQgaW50ZXJmYWNlLCBhbmQgYm90aCBhcmUgYXZhaWxhYmxlIGZvciBwYWNrZXRzCitlbnRlcmluZyB0aGUKKy5CIEZPUldBUkQKK2NoYWluLgorLlBQIFRoZSB2YXJpb3VzIGZvcm1zIG9mIE5BVCBoYXZlIGJlZW4gc2VwYXJhdGVkIG91dDsgCisuQiBpcHRhYmxlcyAKK2lzIGEgcHVyZSBwYWNrZXQgZmlsdGVyIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgYGZpbHRlcicgdGFibGUsIHdpdGgKK29wdGlvbmFsIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhpcyBzaG91bGQgc2ltcGxpZnkgbXVjaCBvZiB0aGUgcHJldmlvdXMKK2NvbmZ1c2lvbiBvdmVyIHRoZSBjb21iaW5hdGlvbiBvZiBJUCBtYXNxdWVyYWRpbmcgYW5kIHBhY2tldCBmaWx0ZXJpbmcKK3NlZW4gcHJldmlvdXNseS4gIFNvIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseToKKy5icgorIC1qIE1BU1EKKy5icgorIC1NIC1TCisuYnIKKyAtTSAtTAorLmJyCitUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBjaGFuZ2VzIGluIGlwdGFibGVzLgorLlNIIFNFRSBBTFNPCitUaGUgaXB0YWJsZXMtSE9XVE8sIHdoaWNoIGRldGFpbHMgbW9yZSBpcHRhYmxlcyB1c2FnZSwgYW5kIHRoZQorbmV0ZmlsdGVyLWhhY2tpbmctSE9XVE8gd2hpY2ggZGV0YWlscyB0aGUgaW50ZXJuYWxzLgorLlNIIEFVVEhPUgorUnVzdHkgUnVzc2VsbCB3cm90ZSBpcHRhYmxlcywgaW4gZWFybHkgY29uc3VsdGF0aW9uIHdpdGggTWljaGFlbAorTmV1bGluZy4KKy5QUAorTWFyYyBCb3VjaGVyIHdyb3RlIHRoZSBvd25lciBtYXRjaCwgdGhlIG1hcmsgc3R1ZmYsIGFuZCByYW4gYXJvdW5kCitkb2luZyBjb29sIHN0dWZmIGV2ZXJ5d2hlcmUuCisuUFAKK0phbWVzIE1vcnJpcyB3cm90ZSB0aGUgVE9TIHRhcmdldCwgYW5kIHRvcyBtYXRjaC4KKy5QUAorSm96c2VmIEthZGxlY3NpayB3cm90ZSB0aGUgUkVKRUNUIHRhcmdldC4KKy5QUAorVGhlIE5ldGZpbHRlciBDb3JlIFRlYW0gaXM6IE1hcmMgQm91Y2hlciwgUnVzdHkgUnVzc2VsbC4KKy5cIiAuLiBhbmQgZGlkIEkgbWVudGlvbiB0aGF0IHdlIGFyZSBpbmNyZWRpYmx5IGNvb2wgcGVvcGxlPwpkaWZmIC0tZ2l0IGEvaXB0YWJsZXMuYyBiL2lwdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2lwdGFibGVzLmMKQEAgLTAsMCArMSwxOTYzIEBACisvKiBDb2RlIHRvIHRha2UgYW4gaXB0YWJsZXMtc3R5bGUgY29tbWFuZCBsaW5lIGFuZCBkbyBpdC4gKi8KKworLyoKKyAqIEF1dGhvcjogUGF1bC5SdXNzZWxsQHJ1c3Rjb3JwLmNvbS5hdSBhbmQgbW5ldWxpbmdAcmFkbG9naWMuY29tLmF1CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxpcHRhYmxlcy5oPgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZm5kZWYgSVBUX0xJQl9ESVIKKyNkZWZpbmUgSVBUX0xJQl9ESVIgIi91c3IvbG9jYWwvbGliL2lwdGFibGVzIgorI2VuZGlmCisKKyNkZWZpbmUgRk1UX05VTUVSSUMJMHgwMDAxCisjZGVmaW5lIEZNVF9OT0NPVU5UUwkweDAwMDIKKyNkZWZpbmUgRk1UX0tJTE9NRUdBR0lHQSAweDAwMDQKKyNkZWZpbmUgRk1UX09QVElPTlMJMHgwMDA4CisjZGVmaW5lIEZNVF9OT1RBQkxFCTB4MDAxMAorI2RlZmluZSBGTVRfTk9UQVJHRVQJMHgwMDIwCisjZGVmaW5lIEZNVF9WSUEJCTB4MDA0MAorI2RlZmluZSBGTVRfTk9ORVdMSU5FCTB4MDA4MAorI2RlZmluZSBGTVRfTElORU5VTUJFUlMgMHgwMTAwCisKKyNkZWZpbmUgRk1UX1BSSU5UX1JVTEUgKEZNVF9OT0NPVU5UUyB8IEZNVF9PUFRJT05TIHwgRk1UX1ZJQSBcCisJCQl8IEZNVF9OVU1FUklDIHwgRk1UX05PVEFCTEUpCisjZGVmaW5lIEZNVCh0YWIsbm90YWIpICgoZm9ybWF0KSAmIEZNVF9OT1RBQkxFID8gKG5vdGFiKSA6ICh0YWIpKQorCisKKyNkZWZpbmUgQ01EX05PTkUJCTB4MDAwMFUKKyNkZWZpbmUgQ01EX0lOU0VSVAkJMHgwMDAxVQorI2RlZmluZSBDTURfREVMRVRFCQkweDAwMDJVCisjZGVmaW5lIENNRF9ERUxFVEVfTlVNCQkweDAwMDRVCisjZGVmaW5lIENNRF9SRVBMQUNFCQkweDAwMDhVCisjZGVmaW5lIENNRF9BUFBFTkQJCTB4MDAxMFUKKyNkZWZpbmUgQ01EX0xJU1QJCTB4MDAyMFUKKyNkZWZpbmUgQ01EX0ZMVVNICQkweDAwNDBVCisjZGVmaW5lIENNRF9aRVJPCQkweDAwODBVCisjZGVmaW5lIENNRF9ORVdfQ0hBSU4JCTB4MDEwMFUKKyNkZWZpbmUgQ01EX0RFTEVURV9DSEFJTgkweDAyMDBVCisjZGVmaW5lIENNRF9TRVRfUE9MSUNZCQkweDA0MDBVCisjZGVmaW5lIENNRF9DSEVDSwkJMHgwODAwVQorI2RlZmluZSBDTURfUkVOQU1FX0NIQUlOCTB4MTAwMFUKKyNkZWZpbmUgTlVNQkVSX09GX0NNRAkxMworc3RhdGljIGNvbnN0IGNoYXIgY21kZmxhZ3NbXSA9IHsgJ0knLCAnRCcsICdEJywgJ1InLCAnQScsICdMJywgJ0YnLCAnWicsCisJCQkJICdOJywgJ1gnLCAnUCcsICdDJywgJ0UnIH07CisKKyNkZWZpbmUgT1BUSU9OX09GRlNFVCAyNTYKKworI2RlZmluZSBPUFRfTk9ORQkweDAwMDAwVQorI2RlZmluZSBPUFRfTlVNRVJJQwkweDAwMDAxVQorI2RlZmluZSBPUFRfU09VUkNFCTB4MDAwMDJVCisjZGVmaW5lIE9QVF9ERVNUSU5BVElPTgkweDAwMDA0VQorI2RlZmluZSBPUFRfUFJPVE9DT0wJMHgwMDAwOFUKKyNkZWZpbmUgT1BUX0pVTVAJMHgwMDAxMFUKKyNkZWZpbmUgT1BUX1ZFUkJPU0UJMHgwMDAyMFUKKyNkZWZpbmUgT1BUX0VYUEFOREVECTB4MDAwNDBVCisjZGVmaW5lIE9QVF9WSUFOQU1FSU4JMHgwMDA4MFUKKyNkZWZpbmUgT1BUX1ZJQU5BTUVPVVQJMHgwMDEwMFUKKyNkZWZpbmUgT1BUX0ZSQUdNRU5UICAgIDB4MDAyMDBVCisjZGVmaW5lIE9QVF9MSU5FTlVNQkVSUyAweDAwNDAwVQorI2RlZmluZSBOVU1CRVJfT0ZfT1BUCTExCitzdGF0aWMgY29uc3QgY2hhciBvcHRmbGFnc1tOVU1CRVJfT0ZfT1BUXQorPSB7ICduJywgJ3MnLCAnZCcsICdwJywgJ2onLCAndicsICd4JywgJ2knLCAnbycsICdmJywgJzMnfTsKKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3JpZ2luYWxfb3B0c1tdID0geworCXsgImFwcGVuZCIsIDEsIDAsICdBJyB9LAorCXsgImRlbGV0ZSIsIDEsIDAsICAnRCcgfSwKKwl7ICJpbnNlcnQiLCAxLCAwLCAgJ0knIH0sCisJeyAicmVwbGFjZSIsIDEsIDAsICAnUicgfSwKKwl7ICJsaXN0IiwgMiwgMCwgICdMJyB9LAorCXsgImZsdXNoIiwgMiwgMCwgICdGJyB9LAorCXsgInplcm8iLCAyLCAwLCAgJ1onIH0sCisJeyAiY2hlY2siLCAxLCAwLCAgJ0MnIH0sCisJeyAibmV3LWNoYWluIiwgMSwgMCwgICdOJyB9LAorCXsgImRlbGV0ZS1jaGFpbiIsIDIsIDAsICAnWCcgfSwKKwl7ICJyZW5hbWUtY2hhaW4iLCAyLCAwLCAgJ0UnIH0sCisJeyAicG9saWN5IiwgMSwgMCwgICdQJyB9LAorCXsgInNvdXJjZSIsIDEsIDAsICdzJyB9LAorCXsgImRlc3RpbmF0aW9uIiwgMSwgMCwgICdkJyB9LAorCXsgInNyYyIsIDEsIDAsICAncycgfSwgLyogc3lub255bSAqLworCXsgImRzdCIsIDEsIDAsICAnZCcgfSwgLyogc3lub255bSAqLworCXsgInByb3RvIiwgMSwgMCwgICdwJyB9LAorCXsgImluLWludGVyZmFjZSIsIDEsIDAsICdpJyB9LAorCXsgImp1bXAiLCAxLCAwLCAnaicgfSwKKwl7ICJ0YWJsZSIsIDEsIDAsICd0JyB9LAorCXsgIm1hdGNoIiwgMSwgMCwgJ20nIH0sCisJeyAibnVtZXJpYyIsIDAsIDAsICduJyB9LAorCXsgIm91dC1pbnRlcmZhY2UiLCAxLCAwLCAnbycgfSwKKwl7ICJ2ZXJib3NlIiwgMCwgMCwgJ3YnIH0sCisJeyAiZXhhY3QiLCAwLCAwLCAneCcgfSwKKwl7ICJmcmFnbWVudHMiLCAwLCAwLCAnZicgfSwKKwl7ICJ2ZXJzaW9uIiwgMCwgMCwgJ1YnIH0sCisJeyAiaGVscCIsIDIsIDAsICdoJyB9LAorCXsgImxpbmUtbnVtYmVycyIsIDAsIDAsICcwJyB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IG9wdGlvbiAqb3B0cyA9IG9yaWdpbmFsX29wdHM7CitzdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbF9vcHRpb25fb2Zmc2V0ID0gMDsKKworLyogVGFibGUgb2YgbGVnYWwgY29tYmluYXRpb25zIG9mIGNvbW1hbmRzIGFuZCBvcHRpb25zLiAgSWYgYW55IG9mIHRoZQorICogZ2l2ZW4gY29tbWFuZHMgbWFrZSBhbiBvcHRpb24gbGVnYWwsIHRoYXQgb3B0aW9uIGlzIGxlZ2FsIChhcHBsaWVzIHRvCisgKiBDTURfTElTVCBhbmQgQ01EX1pFUk8gb25seSkuCisgKiBLZXk6CisgKiAgKyAgY29tcHVsc29yeQorICogIHggIGlsbGVnYWwKKyAqICAgICBvcHRpb25hbAorICovCisKK3N0YXRpYyBjaGFyIGNvbW1hbmRzX3Zfb3B0aW9uc1tOVU1CRVJfT0ZfQ01EXVtOVU1CRVJfT0ZfT1BUXSA9CisvKiBXZWxsLCBpdCdzIGJldHRlciB0aGFuICJSZTogTGludXggdnMgRnJlZUJTRCIgKi8KK3sKKwkvKiAgICAgLW4gIC1zICAtZCAgLXAgIC1qICAtdiAgLXggIC1pICAtbyAgLWYgIC0tbGluZSAqLworLypJTlNFUlQqLyAgICB7J3gnLCcgJywnICcsJyAnLCcgJywnICcsJ3gnLCcgJywnICcsJyAnLCd4J30sCisvKkRFTEVURSovICAgIHsneCcsJyAnLCcgJywnICcsJyAnLCcgJywneCcsJyAnLCcgJywnICcsJ3gnfSwKKy8qREVMRVRFX05VTSoveyd4JywneCcsJ3gnLCd4JywneCcsJyAnLCd4JywneCcsJ3gnLCd4JywneCd9LAorLypSRVBMQUNFKi8gICB7J3gnLCcgJywnICcsJyAnLCcgJywnICcsJ3gnLCcgJywnICcsJyAnLCd4J30sCisvKkFQUEVORCovICAgIHsneCcsJyAnLCcgJywnICcsJyAnLCcgJywneCcsJyAnLCcgJywnICcsJ3gnfSwKKy8qTElTVCovICAgICAgeycgJywneCcsJ3gnLCd4JywneCcsJyAnLCcgJywneCcsJ3gnLCd4JywnICd9LAorLypGTFVTSCovICAgICB7J3gnLCd4JywneCcsJ3gnLCd4JywnICcsJ3gnLCd4JywneCcsJ3gnLCd4J30sCisvKlpFUk8qLyAgICAgIHsneCcsJ3gnLCd4JywneCcsJ3gnLCcgJywneCcsJ3gnLCd4JywneCcsJ3gnfSwKKy8qTkVXX0NIQUlOKi8geyd4JywneCcsJ3gnLCd4JywneCcsJyAnLCd4JywneCcsJ3gnLCd4JywneCd9LAorLypERUxfQ0hBSU4qLyB7J3gnLCd4JywneCcsJ3gnLCd4JywnICcsJ3gnLCd4JywneCcsJ3gnLCd4J30sCisvKlNFVF9QT0xJQ1kqL3sneCcsJ3gnLCd4JywneCcsJ3gnLCcgJywneCcsJ3gnLCd4JywneCcsJ3gnfSwKKy8qQ0hFQ0sqLyAgICAgeyd4JywnKycsJysnLCcrJywneCcsJyAnLCd4JywnKycsJysnLCcgJywneCd9LAorLypSRU5BTUUqLyAgICB7J3gnLCd4JywneCcsJ3gnLCd4JywnICcsJ3gnLCd4JywneCcsJ3gnLCd4J30KK307CisKK3N0YXRpYyBpbnQgaW52ZXJzZV9mb3Jfb3B0aW9uc1tOVU1CRVJfT0ZfT1BUXSA9Cit7CisvKiAtbiAqLyAwLAorLyogLXMgKi8gSVBUX0lOVl9TUkNJUCwKKy8qIC1kICovIElQVF9JTlZfRFNUSVAsCisvKiAtcCAqLyBJUFRfSU5WX1BST1RPLAorLyogLWogKi8gMCwKKy8qIC12ICovIDAsCisvKiAteCAqLyAwLAorLyogLWkgKi8gSVBUX0lOVl9WSUFfSU4sCisvKiAtbyAqLyBJUFRfSU5WX1ZJQV9PVVQsCisvKiAtZiAqLyBJUFRfSU5WX0ZSQUcsCisvKi0tbGluZSovIDAKK307CisKK2NvbnN0IGNoYXIgKnByb2dyYW1fdmVyc2lvbjsKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZTsKKworLyogS2VlcGluZyB0cmFjayBvZiBleHRlcm5hbCBtYXRjaGVzIGFuZCB0YXJnZXRzOiBsaW5rZWQgbGlzdHMsIGJ1dAorICAgdW5sZXNzIHdlJ3JlIGxpc3RpbmcgKC1MKSwgdGhleSBoYXZlIG9ubHkgMCBvciAxIGVudHJ5LiAgKi8KK3N0cnVjdCBpcHRhYmxlc19tYXRjaCAqaXB0YWJsZXNfbWF0Y2hlcyA9IE5VTEw7CitzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICppcHRhYmxlc190YXJnZXRzID0gTlVMTDsKKworLyogRXh0cmEgZGVidWdnaW5nIGZyb20gbGliaXB0YyAqLworZXh0ZXJuIHZvaWQgZHVtcF9lbnRyaWVzKGNvbnN0IGlwdGNfaGFuZGxlX3QgaGFuZGxlKTsKKworLyogQSBmZXcgaGFyZGNvZGVkIHByb3RvY29scyBmb3IgJ2FsbCcgYW5kIGluIGNhc2UgdGhlIHVzZXIgaGFzIG5vCisgICAvZXRjL3Byb3RvY29scyAqLworc3RydWN0IHBwcm90IHsKKwljaGFyICpuYW1lOworCXVfaW50OF90IG51bTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHByb3QgY2hhaW5fcHJvdG9zW10gPSB7CisJeyAidGNwIiwgSVBQUk9UT19UQ1AgfSwKKwl7ICJ1ZHAiLCBJUFBST1RPX1VEUCB9LAorCXsgImljbXAiLCBJUFBST1RPX0lDTVAgfSwKKwl7ICJhbGwiLCAwIH0sCit9OworCitzdGF0aWMgY2hhciAqCitwcm90b190b19uYW1lKHVfaW50OF90IHByb3RvKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHByb3RvKSB7CisJCXN0cnVjdCBwcm90b2VudCAqcGVudCA9IGdldHByb3RvYnludW1iZXIocHJvdG8pOworCQlpZiAocGVudCkKKwkJCXJldHVybiBwZW50LT5wX25hbWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFpbl9wcm90b3MpL3NpemVvZihzdHJ1Y3QgcHByb3QpOyBpKyspCisJCWlmIChjaGFpbl9wcm90b3NbaV0ubnVtID09IHByb3RvKQorCQkJcmV0dXJuIGNoYWluX3Byb3Rvc1tpXS5uYW1lOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpbl9hZGRyICoKK2RvdHRlZF90b19hZGRyKGNvbnN0IGNoYXIgKmRvdHRlZCkKK3sKKwlzdGF0aWMgc3RydWN0IGluX2FkZHIgYWRkcjsKKwl1bnNpZ25lZCBjaGFyICphZGRycDsKKwljaGFyICpwLCAqcTsKKwlpbnQgb25lYnl0ZSwgaTsKKwljaGFyIGJ1ZlsyMF07CisKKwkvKiBjb3B5IGRvdHRlZCBzdHJpbmcsIGJlY2F1c2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgKi8KKwlzdHJuY3B5KGJ1ZiwgZG90dGVkLCBzaXplb2YoYnVmKSAtIDEpOworCWFkZHJwID0gKHVuc2lnbmVkIGNoYXIgKikgJihhZGRyLnNfYWRkcik7CisKKwlwID0gYnVmOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKChxID0gc3RyY2hyKHAsICcuJykpID09IE5VTEwpCisJCQlyZXR1cm4gKHN0cnVjdCBpbl9hZGRyICopIE5VTEw7CisKKwkJKnEgPSAnXDAnOworCQlpZiAoKG9uZWJ5dGUgPSBzdHJpbmdfdG9fbnVtYmVyKHAsIDAsIDI1NSkpID09IC0xKQorCQkJcmV0dXJuIChzdHJ1Y3QgaW5fYWRkciAqKSBOVUxMOworCisJCWFkZHJwW2ldID0gKHVuc2lnbmVkIGNoYXIpIG9uZWJ5dGU7CisJCXAgPSBxICsgMTsKKwl9CisKKwkvKiB3ZSd2ZSBjaGVja2VkIDMgYnl0ZXMsIG5vdyB3ZSBjaGVjayB0aGUgbGFzdCBvbmUgKi8KKwlpZiAoKG9uZWJ5dGUgPSBzdHJpbmdfdG9fbnVtYmVyKHAsIDAsIDI1NSkpID09IC0xKQorCQlyZXR1cm4gKHN0cnVjdCBpbl9hZGRyICopIE5VTEw7CisKKwlhZGRycFszXSA9ICh1bnNpZ25lZCBjaGFyKSBvbmVieXRlOworCisJcmV0dXJuICZhZGRyOworfQorCitzdGF0aWMgc3RydWN0IGluX2FkZHIgKgorbmV0d29ya190b19hZGRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5ldGVudCAqbmV0OworCXN0YXRpYyBzdHJ1Y3QgaW5fYWRkciBhZGRyOworCisJaWYgKChuZXQgPSBnZXRuZXRieW5hbWUobmFtZSkpICE9IE5VTEwpIHsKKwkJaWYgKG5ldC0+bl9hZGRydHlwZSAhPSBBRl9JTkVUKQorCQkJcmV0dXJuIChzdHJ1Y3QgaW5fYWRkciAqKSBOVUxMOworCQlhZGRyLnNfYWRkciA9IGh0b25sKCh1bnNpZ25lZCBsb25nKSBuZXQtPm5fbmV0KTsKKwkJcmV0dXJuICZhZGRyOworCX0KKworCXJldHVybiAoc3RydWN0IGluX2FkZHIgKikgTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2luYWRkcmNweShzdHJ1Y3QgaW5fYWRkciAqZHN0LCBzdHJ1Y3QgaW5fYWRkciAqc3JjKQoreworCS8qIG1lbWNweShkc3QsIHNyYywgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7ICovCisJZHN0LT5zX2FkZHIgPSBzcmMtPnNfYWRkcjsKK30KKwordm9pZAorZXhpdF9lcnJvcihlbnVtIGV4aXR0eXBlIHN0YXR1cywgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgbXNnKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIHYlczogIiwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOworCXZmcHJpbnRmKHN0ZGVyciwgbXNnLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWlmIChzdGF0dXMgPT0gUEFSQU1FVEVSX1BST0JMRU0pCisJCWV4aXRfdHJ5aGVscChzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gVkVSU0lPTl9QUk9CTEVNKQorCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJQZXJoYXBzIGlwdGFibGVzIG9yIHlvdXIga2VybmVsIG5lZWRzIHRvIGJlIHVwZ3JhZGVkLlxuIik7CisJZXhpdChzdGF0dXMpOworfQorCit2b2lkCitleGl0X3RyeWhlbHAoaW50IHN0YXR1cykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlRyeSBgJXMgLWgnIG9yICclcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwKKwkJCXByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lICk7CisJZXhpdChzdGF0dXMpOworfQorCit2b2lkCitleGl0X3ByaW50aGVscCh2b2lkKQoreworCXByaW50ZigiJXMgdiVzXG5cbiIKKyJVc2FnZTogJXMgLVtBRENdIGNoYWluIHJ1bGUtc3BlY2lmaWNhdGlvbiBbb3B0aW9uc11cbiIKKyIgICAgICAgJXMgLVtSSV0gY2hhaW4gcnVsZW51bSBydWxlLXNwZWNpZmljYXRpb24gW29wdGlvbnNdXG4iCisiICAgICAgICVzIC1EIGNoYWluIHJ1bGVudW0gW29wdGlvbnNdXG4iCisiICAgICAgICVzIC1bTEZaXSBbY2hhaW5dIFtvcHRpb25zXVxuIgorIiAgICAgICAlcyAtW05YXSBjaGFpblxuIgorIiAgICAgICAlcyAtRSBvbGQtY2hhaW4tbmFtZSBuZXctY2hhaW4tbmFtZVxuIgorIiAgICAgICAlcyAtUCBjaGFpbiB0YXJnZXQgW29wdGlvbnNdXG4iCisiICAgICAgICVzIC1oIChwcmludCB0aGlzIGhlbHAgaW5mb3JtYXRpb24pXG5cbiIsCisJICAgICAgIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV92ZXJzaW9uLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSwKKwkgICAgICAgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lLAorCSAgICAgICBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSk7CisKKwlwcmludGYoCisiQ29tbWFuZHM6XG4iCisiRWl0aGVyIGxvbmcgb3Igc2hvcnQgb3B0aW9ucyBhcmUgYWxsb3dlZC5cbiIKKyIgIC0tYXBwZW5kICAtQSBjaGFpbgkJQXBwZW5kIHRvIGNoYWluXG4iCisiICAtLWRlbGV0ZSAgLUQgY2hhaW4JCURlbGV0ZSBtYXRjaGluZyBydWxlIGZyb20gY2hhaW5cbiIKKyIgIC0tZGVsZXRlICAtRCBjaGFpbiBydWxlbnVtXG4iCisiCQkJCURlbGV0ZSBydWxlIHJ1bGVudW0gKDEgPSBmaXJzdCkgZnJvbSBjaGFpblxuIgorIiAgLS1pbnNlcnQgIC1JIGNoYWluIFtydWxlbnVtXVxuIgorIgkJCQlJbnNlcnQgaW4gY2hhaW4gYXMgcnVsZW51bSAoZGVmYXVsdCAxPWZpcnN0KVxuIgorIiAgLS1yZXBsYWNlIC1SIGNoYWluIHJ1bGVudW1cbiIKKyIJCQkJUmVwbGFjZSBydWxlIHJ1bGVudW0gKDEgPSBmaXJzdCkgaW4gY2hhaW5cbiIKKyIgIC0tbGlzdCAgICAtTCBbY2hhaW5dCQlMaXN0IHRoZSBydWxlcyBpbiBhIGNoYWluIG9yIGFsbCBjaGFpbnNcbiIKKyIgIC0tZmx1c2ggICAtRiBbY2hhaW5dCQlEZWxldGUgYWxsIHJ1bGVzIGluICBjaGFpbiBvciBhbGwgY2hhaW5zXG4iCisiICAtLXplcm8gICAgLVogW2NoYWluXQkJWmVybyBjb3VudGVycyBpbiBjaGFpbiBvciBhbGwgY2hhaW5zXG4iCisiICAtLWNoZWNrICAgLUMgY2hhaW4JCVRlc3QgdGhpcyBwYWNrZXQgb24gY2hhaW5cbiIKKyIgIC0tbmV3ICAgICAtTiBjaGFpbgkJQ3JlYXRlIGEgbmV3IHVzZXItZGVmaW5lZCBjaGFpblxuIgorIiAgLS1kZWxldGUtY2hhaW5cbiIKKyIgICAgICAgICAgICAtWCBbY2hhaW5dCQlEZWxldGUgYSB1c2VyLWRlZmluZWQgY2hhaW5cbiIKKyIgIC0tcG9saWN5ICAtUCBjaGFpbiB0YXJnZXRcbiIKKyIJCQkJQ2hhbmdlIHBvbGljeSBvbiBjaGFpbiB0byB0YXJnZXRcbiIKKyIgIC0tcmVuYW1lLWNoYWluXG4iCisiICAgICAgICAgICAgLUUgb2xkLWNoYWluIG5ldy1jaGFpblxuIgorIgkJCQlDaGFuZ2UgY2hhaW4gbmFtZSwgKG1vdmluZyBhbnkgcmVmZXJlbmNlcylcbiIKKworIk9wdGlvbnM6XG4iCisiICAtLXByb3RvCS1wIFshXSBwcm90bwlwcm90b2NvbDogYnkgbnVtYmVyIG9yIG5hbWUsIGVnLiBgdGNwJ1xuIgorIiAgLS1zb3VyY2UJLXMgWyFdIGFkZHJlc3NbL21hc2tdXG4iCisiCQkJCXNvdXJjZSBzcGVjaWZpY2F0aW9uXG4iCisiICAtLWRlc3RpbmF0aW9uIC1kIFshXSBhZGRyZXNzWy9tYXNrXVxuIgorIgkJCQlkZXN0aW5hdGlvbiBzcGVjaWZpY2F0aW9uXG4iCisiICAtLWluLWludGVyZmFjZSAtaSBbIV0gaW5wdXQgbmFtZVsrXVxuIgorIgkJCQluZXR3b3JrIGludGVyZmFjZSBuYW1lIChbK10gZm9yIHdpbGRjYXJkKVxuIgorIiAgLS1qdW1wCS1qIHRhcmdldFxuIgorIgkJCQl0YXJnZXQgZm9yIHJ1bGVcbiIKKyIgIC0tbnVtZXJpYwktbgkJbnVtZXJpYyBvdXRwdXQgb2YgYWRkcmVzc2VzIGFuZCBwb3J0c1xuIgorIiAgLS1vdXQtaW50ZXJmYWNlIC1vIFshXSBvdXRwdXQgbmFtZVsrXVxuIgorIgkJCQluZXR3b3JrIGludGVyZmFjZSBuYW1lIChbK10gZm9yIHdpbGRjYXJkKVxuIgorIiAgLS10YWJsZQktdCB0YWJsZQl0YWJsZSB0byBtYW5pcHVsYXRlIChkZWZhdWx0OiBgZmlsdGVyJylcbiIKKyIgIC0tdmVyYm9zZQktdgkJdmVyYm9zZSBtb2RlXG4iCisiICAtLWV4YWN0CS14CQlleHBhbmQgbnVtYmVycyAoZGlzcGxheSBleGFjdCB2YWx1ZXMpXG4iCisiWyFdIC0tZnJhZ21lbnQJLWYJCW1hdGNoIHNlY29uZCBvciBmdXJ0aGVyIGZyYWdtZW50cyBvbmx5XG4iCisiWyFdIC0tdmVyc2lvbgktVgkJcHJpbnQgcGFja2FnZSB2ZXJzaW9uLlxuIik7CisKKwkvKiBQcmludCBvdXQgYW55IHNwZWNpYWwgaGVscHMuICovCisJaWYgKGlwdGFibGVzX3RhcmdldHMpIHsKKwkJcHJpbnRmKCJcbiIpOworCQlpcHRhYmxlc190YXJnZXRzLT5oZWxwKCk7CisJfQorCWlmIChpcHRhYmxlc19tYXRjaGVzKSB7CisJCXByaW50ZigiXG4iKTsKKwkJaXB0YWJsZXNfbWF0Y2hlcy0+aGVscCgpOworCX0KKworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZW5lcmljX29wdF9jaGVjayhpbnQgY29tbWFuZCwgaW50IG9wdGlvbnMpCit7CisJaW50IGksIGosIGxlZ2FsID0gMDsKKworCS8qIENoZWNrIHRoYXQgY29tbWFuZHMgYXJlIHZhbGlkIHdpdGggb3B0aW9ucy4gIENvbXBsaWNhdGVkIGJ5IHRoZQorCSAqIGZhY3QgdGhhdCBpZiBhbiBvcHRpb24gaXMgbGVnYWwgd2l0aCAqYW55KiBjb21tYW5kIGdpdmVuLCBpdCBpcworCSAqIGxlZ2FsIG92ZXJhbGwgKGllLiAteiBhbmQgLWwpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfT1BUOyBpKyspIHsKKwkJbGVnYWwgPSAwOyAvKiAtMSA9PiBpbGxlZ2FsLCAxID0+IGxlZ2FsLCAwID0+IHVuZGVjaWRlZC4gKi8KKworCQlmb3IgKGogPSAwOyBqIDwgTlVNQkVSX09GX0NNRDsgaisrKSB7CisJCQlpZiAoIShjb21tYW5kICYgKDE8PGopKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEob3B0aW9ucyAmICgxPDxpKSkpIHsKKwkJCQlpZiAoY29tbWFuZHNfdl9vcHRpb25zW2pdW2ldID09ICcrJykKKwkJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJCSAgICJZb3UgbmVlZCB0byBzdXBwbHkgdGhlIGAtJWMnICIKKwkJCQkJCSAgICJvcHRpb24gZm9yIHRoaXMgY29tbWFuZFxuIiwKKwkJCQkJCSAgIG9wdGZsYWdzW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbW1hbmRzX3Zfb3B0aW9uc1tqXVtpXSAhPSAneCcpCisJCQkJCWxlZ2FsID0gMTsKKwkJCQllbHNlIGlmIChsZWdhbCA9PSAwKQorCQkJCQlsZWdhbCA9IC0xOworCQkJfQorCQl9CisJCWlmIChsZWdhbCA9PSAtMSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIklsbGVnYWwgb3B0aW9uIGAtJWMnIHdpdGggdGhpcyBjb21tYW5kXG4iLAorCQkJCSAgIG9wdGZsYWdzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyCitvcHQyY2hhcihpbnQgb3B0aW9uKQoreworCWNvbnN0IGNoYXIgKnB0cjsKKwlmb3IgKHB0ciA9IG9wdGZsYWdzOyBvcHRpb24gPiAxOyBvcHRpb24gPj49IDEsIHB0cisrKTsKKworCXJldHVybiAqcHRyOworfQorCitzdGF0aWMgY2hhcgorY21kMmNoYXIoaW50IG9wdGlvbikKK3sKKwljb25zdCBjaGFyICpwdHI7CisJZm9yIChwdHIgPSBjbWRmbGFnczsgb3B0aW9uID4gMTsgb3B0aW9uID4+PSAxLCBwdHIrKyk7CisKKwlyZXR1cm4gKnB0cjsKK30KKworc3RhdGljIHZvaWQKK2FkZF9jb21tYW5kKGludCAqY21kLCBjb25zdCBpbnQgbmV3Y21kLCBjb25zdCBpbnQgb3RoZXJjbWRzLCBpbnQgaW52ZXJ0KQoreworCWlmIChpbnZlcnQpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJ1bmV4cGVjdGVkICEgZmxhZyIpOworCWlmICgqY21kICYgKH5vdGhlcmNtZHMpKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiQ2FuJ3QgdXNlIC0lYyB3aXRoIC0lY1xuIiwKKwkJCSAgIGNtZDJjaGFyKG5ld2NtZCksIGNtZDJjaGFyKCpjbWQgJiAofm90aGVyY21kcykpKTsKKwkqY21kIHw9IG5ld2NtZDsKK30KKworaW50CitjaGVja19pbnZlcnNlKGNvbnN0IGNoYXIgb3B0aW9uW10sIGludCAqaW52ZXJ0KQoreworCWlmIChvcHRpb24gJiYgc3RyY21wKG9wdGlvbiwgIiEiKSA9PSAwKSB7CisJCWlmICgqaW52ZXJ0KQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiTXVsdGlwbGUgYCEnIGZsYWdzIG5vdCBhbGxvd2VkIik7CisKKwkJKmludmVydCA9IFRSVUU7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkICoKK2Z3X2NhbGxvYyhzaXplX3QgY291bnQsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnA7CisKKwlpZiAoKHAgPSBjYWxsb2MoY291bnQsIHNpemUpKSA9PSBOVUxMKSB7CisJCXBlcnJvcigiaXB0YWJsZXM6IGNhbGxvYyBmYWlsZWQiKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkICoKK2Z3X21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwOworCisJaWYgKChwID0gbWFsbG9jKHNpemUpKSA9PSBOVUxMKSB7CisJCXBlcnJvcigiaXB0YWJsZXM6IG1hbGxvYyBmYWlsZWQiKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5fYWRkciAqCitob3N0X3RvX2FkZHIoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50ICpuYWRkcikKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKKwlzdHJ1Y3QgaW5fYWRkciAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCSpuYWRkciA9IDA7CisJaWYgKChob3N0ID0gZ2V0aG9zdGJ5bmFtZShuYW1lKSkgIT0gTlVMTCkgeworCQlpZiAoaG9zdC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUIHx8CisJCSAgICBob3N0LT5oX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKQorCQkJcmV0dXJuIChzdHJ1Y3QgaW5fYWRkciAqKSBOVUxMOworCisJCXdoaWxlIChob3N0LT5oX2FkZHJfbGlzdFsqbmFkZHJdICE9IChjaGFyICopIE5VTEwpCisJCQkoKm5hZGRyKSsrOworCQlhZGRyID0gZndfY2FsbG9jKCpuYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWZvciAoaSA9IDA7IGkgPCAqbmFkZHI7IGkrKykKKwkJCWluYWRkcmNweSgmKGFkZHJbaV0pLAorCQkJCSAgKHN0cnVjdCBpbl9hZGRyICopIGhvc3QtPmhfYWRkcl9saXN0W2ldKTsKKwkJcmV0dXJuIGFkZHI7CisJfQorCisJcmV0dXJuIChzdHJ1Y3QgaW5fYWRkciAqKSBOVUxMOworfQorCitzdGF0aWMgY2hhciAqCithZGRyX3RvX2hvc3QoY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IGhvc3RlbnQgKmhvc3Q7CisKKwlpZiAoKGhvc3QgPSBnZXRob3N0YnlhZGRyKChjaGFyICopIGFkZHIsCisJCQkJICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKSkgIT0gTlVMTCkKKwkJcmV0dXJuIChjaGFyICopIGhvc3QtPmhfbmFtZTsKKworCXJldHVybiAoY2hhciAqKSBOVUxMOworfQorCisvKgorICoJQWxsIGZ1bmN0aW9ucyBzdGFydGluZyB3aXRoICJwYXJzZSIgc2hvdWxkIHN1Y2NlZWQsIG90aGVyd2lzZQorICoJdGhlIHByb2dyYW0gZmFpbHMuCisgKglNb3N0IHJvdXRpbmVzIHJldHVybiBwb2ludGVycyB0byBzdGF0aWMgZGF0YSB0aGF0IG1heSBjaGFuZ2UKKyAqCWJldHdlZW4gY2FsbHMgdG8gdGhlIHNhbWUgb3Igb3RoZXIgcm91dGluZXMgd2l0aCBhIGZldyBleGNlcHRpb25zOgorICoJImhvc3RfdG9fYWRkciIsICJwYXJzZV9ob3N0bmV0d29yayIsIGFuZCAicGFyc2VfaG9zdG5ldHdvcmttYXNrIgorICoJcmV0dXJuIGdsb2JhbCBzdGF0aWMgZGF0YS4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgaW5fYWRkciAqCitwYXJzZV9ob3N0bmV0d29yayhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKm5hZGRycykKK3sKKwlzdHJ1Y3QgaW5fYWRkciAqYWRkcnAsICphZGRycHRtcDsKKworCWlmICgoYWRkcnB0bXAgPSBkb3R0ZWRfdG9fYWRkcihuYW1lKSkgIT0gTlVMTCB8fAorCSAgICAoYWRkcnB0bXAgPSBuZXR3b3JrX3RvX2FkZHIobmFtZSkpICE9IE5VTEwpIHsKKwkJYWRkcnAgPSBmd19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWluYWRkcmNweShhZGRycCwgYWRkcnB0bXApOworCQkqbmFkZHJzID0gMTsKKwkJcmV0dXJuIGFkZHJwOworCX0KKwlpZiAoKGFkZHJwID0gaG9zdF90b19hZGRyKG5hbWUsIG5hZGRycykpICE9IE5VTEwpCisJCXJldHVybiBhZGRycDsKKworCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJob3N0L25ldHdvcmsgYCVzJyBub3QgZm91bmQiLCBuYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBpbl9hZGRyICoKK3BhcnNlX21hc2soY2hhciAqbWFzaykKK3sKKwlzdGF0aWMgc3RydWN0IGluX2FkZHIgbWFza2FkZHI7CisJc3RydWN0IGluX2FkZHIgKmFkZHJwOworCWludCBiaXRzOworCisJaWYgKG1hc2sgPT0gTlVMTCkgeworCQkvKiBubyBtYXNrIGF0IGFsbCBkZWZhdWx0cyB0byAzMiBiaXRzICovCisJCW1hc2thZGRyLnNfYWRkciA9IDB4RkZGRkZGRkY7CisJCXJldHVybiAmbWFza2FkZHI7CisJfQorCWlmICgoYWRkcnAgPSBkb3R0ZWRfdG9fYWRkcihtYXNrKSkgIT0gTlVMTCkKKwkJLyogZG90dGVkX3RvX2FkZHIgYWxyZWFkeSByZXR1cm5zIGEgbmV0d29yayBieXRlIG9yZGVyIGFkZHIgKi8KKwkJcmV0dXJuIGFkZHJwOworCWlmICgoYml0cyA9IHN0cmluZ190b19udW1iZXIobWFzaywgMCwgMzIpKSA9PSAtMSkKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJpbnZhbGlkIG1hc2sgYCVzJyBzcGVjaWZpZWQiLCBtYXNrKTsKKwlpZiAoYml0cyAhPSAwKSB7CisJCW1hc2thZGRyLnNfYWRkciA9IGh0b25sKDB4RkZGRkZGRkYgPDwgKDMyIC0gYml0cykpOworCQlyZXR1cm4gJm1hc2thZGRyOworCX0KKworCW1hc2thZGRyLnNfYWRkciA9IDBMOworCXJldHVybiAmbWFza2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9ob3N0bmV0d29ya21hc2soY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGluX2FkZHIgKiphZGRycHAsCisJCSAgICAgIHN0cnVjdCBpbl9hZGRyICptYXNrcCwgdW5zaWduZWQgaW50ICpuYWRkcnMpCit7CisJc3RydWN0IGluX2FkZHIgKmFkZHJwOworCWNoYXIgYnVmWzI1Nl07CisJY2hhciAqcDsKKwlpbnQgaSwgaiwgaywgbjsKKworCXN0cm5jcHkoYnVmLCBuYW1lLCBzaXplb2YoYnVmKSAtIDEpOworCWlmICgocCA9IHN0cnJjaHIoYnVmLCAnLycpKSAhPSBOVUxMKSB7CisJCSpwID0gJ1wwJzsKKwkJYWRkcnAgPSBwYXJzZV9tYXNrKHAgKyAxKTsKKwl9IGVsc2UKKwkJYWRkcnAgPSBwYXJzZV9tYXNrKE5VTEwpOworCWluYWRkcmNweShtYXNrcCwgYWRkcnApOworCisJLyogaWYgYSBudWxsIG1hc2sgaXMgZ2l2ZW4sIHRoZSBuYW1lIGlzIGlnbm9yZWQsIGxpa2UgaW4gImFueS8wIiAqLworCWlmIChtYXNrcC0+c19hZGRyID09IDBMKQorCQlzdHJjcHkoYnVmLCAiMC4wLjAuMCIpOworCisJYWRkcnAgPSAqYWRkcnBwID0gcGFyc2VfaG9zdG5ldHdvcmsoYnVmLCBuYWRkcnMpOworCW4gPSAqbmFkZHJzOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbjsgaSsrKSB7CisJCWFkZHJwW2orK10uc19hZGRyICY9IG1hc2twLT5zX2FkZHI7CisJCWZvciAoayA9IDA7IGsgPCBqIC0gMTsgaysrKSB7CisJCQlpZiAoYWRkcnBba10uc19hZGRyID09IGFkZHJwW2ogLSAxXS5zX2FkZHIpIHsKKwkJCQkoKm5hZGRycyktLTsKKwkJCQlqLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0cnVjdCBpcHRhYmxlc19tYXRjaCAqCitmaW5kX21hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCB0cnlsb2FkKQoreworCXN0cnVjdCBpcHRhYmxlc19tYXRjaCAqcHRyOworCisJZm9yIChwdHIgPSBpcHRhYmxlc19tYXRjaGVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlpZiAoc3RyY21wKG5hbWUsIHB0ci0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmICghcHRyICYmIHRyeWxvYWQpIHsKKwkJY2hhciBwYXRoW3NpemVvZihJUFRfTElCX0RJUikgKyBzaXplb2YoIi9saWJpcHRfLnNvIikKKwkJCSArIHN0cmxlbihuYW1lKV07CisJCXNwcmludGYocGF0aCwgSVBUX0xJQl9ESVIgIi9saWJpcHRfJXMuc28iLCBuYW1lKTsKKwkJZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKKwkJcmV0dXJuIGZpbmRfbWF0Y2gobmFtZSwgMCk7CisJfQorCisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIHVfaW50MTZfdAorcGFyc2VfcHJvdG9jb2woY29uc3QgY2hhciAqcykKK3sKKwlpbnQgcHJvdG8gPSBzdHJpbmdfdG9fbnVtYmVyKHMsIDAsIDY1NTM1KTsKKworCWlmIChwcm90byA9PSAtMSkgeworCQlzdHJ1Y3QgcHJvdG9lbnQgKnBlbnQ7CisKKwkJaWYgKChwZW50ID0gZ2V0cHJvdG9ieW5hbWUocykpKQorCQkJcHJvdG8gPSBwZW50LT5wX3Byb3RvOworCQllbHNlIHsKKwkJCXVuc2lnbmVkIGludCBpOworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgaSA8IHNpemVvZihjaGFpbl9wcm90b3MpL3NpemVvZihzdHJ1Y3QgcHByb3QpOworCQkJICAgICBpKyspIHsKKwkJCQlpZiAoc3RyY21wKHMsIGNoYWluX3Byb3Rvc1tpXS5uYW1lKSA9PSAwKSB7CisJCQkJCXByb3RvID0gY2hhaW5fcHJvdG9zW2ldLm51bTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGkgPT0gc2l6ZW9mKGNoYWluX3Byb3Rvcykvc2l6ZW9mKHN0cnVjdCBwcHJvdCkpCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgInVua25vd24gcHJvdG9jb2wgYCVzJyBzcGVjaWZpZWQiLAorCQkJCQkgICBzKTsKKwkJfQorCX0KKworCXJldHVybiAodV9pbnQxNl90KXByb3RvOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqdmlhbmFtZSwgdW5zaWduZWQgY2hhciAqbWFzaykKK3sKKwlpbnQgdmlhbGVuID0gc3RybGVuKGFyZyk7CisJdW5zaWduZWQgaW50IGk7CisKKwltZW1zZXQobWFzaywgMCwgSUZOQU1TSVopOworCW1lbXNldCh2aWFuYW1lLCAwLCBJRk5BTVNJWik7CisKKwlpZiAodmlhbGVuICsgMSA+IElGTkFNU0laKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgImludGVyZmFjZSBuYW1lIGAlcycgbXVzdCBiZSBzaG9ydGVyIHRoYW4gSUZOQU1TSVoiCisJCQkgICAiICglaSkiLCBhcmcsIElGTkFNU0laLTEpOworCQorCXN0cmNweSh2aWFuYW1lLCBhcmcpOworCWlmICh2aWFsZW4gPT0gMCkKKwkJbWVtc2V0KG1hc2ssIDAsIElGTkFNU0laKTsKKwllbHNlIGlmICh2aWFuYW1lW3ZpYWxlbiAtIDFdID09ICcrJykgeworCQltZW1zZXQobWFzaywgMHhGRiwgdmlhbGVuIC0gMSk7CisJCW1lbXNldChtYXNrICsgdmlhbGVuIC0gMSwgMCwgSUZOQU1TSVogLSB2aWFsZW4gKyAxKTsKKwkJLyogUmVtb3ZlIGArJyAqLworCQl2aWFuYW1lW3ZpYWxlbiAtIDFdID0gJ1wwJzsKKwl9IGVsc2UgeworCQkvKiBJbmNsdWRlIG51bC10ZXJtaW5hdG9yIGluIG1hdGNoICovCisJCW1lbXNldChtYXNrLCAweEZGLCB2aWFsZW4gKyAxKTsKKwkJbWVtc2V0KG1hc2sgKyB2aWFsZW4gKyAxLCAwLCBJRk5BTVNJWiAtIHZpYWxlbiAtIDEpOworCX0KKwlmb3IgKGkgPSAwOyB2aWFuYW1lW2ldOyBpKyspIHsKKwkJaWYgKCFpc2FsbnVtKHZpYW5hbWVbaV0pKSB7CisJCQlwcmludGYoIldhcm5pbmc6IHdpZXJkIGNoYXJhY3RlciBpbiBpbnRlcmZhY2UiCisJCQkgICAgICAgIiBgJXMnIChObyBhbGlhc2VzLCA6LCAhIG9yICopLlxuIiwKKwkJCSAgICAgICB2aWFuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBDYW4ndCBiZSB6ZXJvLiAqLworc3RhdGljIGludAorcGFyc2VfcnVsZW51bWJlcihjb25zdCBjaGFyICpydWxlKQoreworCWludCBydWxlbnVtID0gc3RyaW5nX3RvX251bWJlcihydWxlLCAxLCBJTlRfTUFYKTsKKworCWlmIChydWxlbnVtID09IC0xKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIkludmFsaWQgcnVsZSBudW1iZXIgYCVzJyIsIHJ1bGUpOworCisJcmV0dXJuIHJ1bGVudW07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3RhcmdldChjb25zdCBjaGFyICp0YXJnZXRuYW1lKQoreworCWNvbnN0IGNoYXIgKnB0cjsKKworCWlmIChzdHJsZW4odGFyZ2V0bmFtZSkgPCAxKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIkludmFsaWQgdGFyZ2V0IG5hbWUgKHRvbyBzaG9ydCkiKTsKKworCWlmIChzdHJsZW4odGFyZ2V0bmFtZSkrMSA+IHNpemVvZihpcHRfY2hhaW5sYWJlbCkpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkgICAiSW52YWxpZCB0YXJnZXQgbmFtZSBgJXMnICglaSBjaGFycyBtYXgpIiwKKwkJCSAgIHRhcmdldG5hbWUsIHNpemVvZihpcHRfY2hhaW5sYWJlbCktMSk7CisKKwlmb3IgKHB0ciA9IHRhcmdldG5hbWU7ICpwdHI7IHB0cisrKQorCQlpZiAoaXNzcGFjZSgqcHRyKSkKKwkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJICAgIkludmFsaWQgdGFyZ2V0IG5hbWUgYCVzJyIsIHRhcmdldG5hbWUpOworCXJldHVybiB0YXJnZXRuYW1lOworfQorCitzdGF0aWMgY2hhciAqCithZGRyX3RvX25ldHdvcmsoY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IG5ldGVudCAqbmV0OworCisJaWYgKChuZXQgPSBnZXRuZXRieWFkZHIoKGxvbmcpIG50b2hsKGFkZHItPnNfYWRkciksIEFGX0lORVQpKSAhPSBOVUxMKQorCQlyZXR1cm4gKGNoYXIgKikgbmV0LT5uX25hbWU7CisKKwlyZXR1cm4gKGNoYXIgKikgTlVMTDsKK30KKworY2hhciAqCithZGRyX3RvX2RvdHRlZChjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcnApCit7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcDsKKworCWJ5dGVwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgJihhZGRycC0+c19hZGRyKTsKKwlzcHJpbnRmKGJ1ZiwgIiVkLiVkLiVkLiVkIiwgYnl0ZXBbMF0sIGJ5dGVwWzFdLCBieXRlcFsyXSwgYnl0ZXBbM10pOworCXJldHVybiBidWY7Cit9CitzdGF0aWMgY2hhciAqCithZGRyX3RvX2FueW5hbWUoY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJY2hhciAqbmFtZTsKKworCWlmICgobmFtZSA9IGFkZHJfdG9faG9zdChhZGRyKSkgIT0gTlVMTCB8fAorCSAgICAobmFtZSA9IGFkZHJfdG9fbmV0d29yayhhZGRyKSkgIT0gTlVMTCkKKwkJcmV0dXJuIG5hbWU7CisKKwlyZXR1cm4gYWRkcl90b19kb3R0ZWQoYWRkcik7Cit9CisKK3N0YXRpYyBjaGFyICoKK21hc2tfdG9fZG90dGVkKGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrKQoreworCWludCBpOworCXN0YXRpYyBjaGFyIGJ1ZlsyMF07CisJdV9pbnQzMl90IG1hc2thZGRyLCBiaXRzOworCisJbWFza2FkZHIgPSBudG9obChtYXNrLT5zX2FkZHIpOworCisJaWYgKG1hc2thZGRyID09IDB4RkZGRkZGRkZMKQorCQkvKiB3ZSBkb24ndCB3YW50IHRvIHNlZSAiLzMyIiAqLworCQlyZXR1cm4gIiI7CisKKwlpID0gMzI7CisJYml0cyA9IDB4RkZGRkZGRkVMOworCXdoaWxlICgtLWkgPj0gMCAmJiBtYXNrYWRkciAhPSBiaXRzKQorCQliaXRzIDw8PSAxOworCWlmIChpID49IDApCisJCXNwcmludGYoYnVmLCAiLyVkIiwgaSk7CisJZWxzZQorCQkvKiBtYXNrIHdhcyBub3QgYSBkZWNlbnQgY29tYmluYXRpb24gb2YgMSdzIGFuZCAwJ3MgKi8KKwkJc3ByaW50ZihidWYsICIvJXMiLCBhZGRyX3RvX2RvdHRlZChtYXNrKSk7CisKKwlyZXR1cm4gYnVmOworfQorCitpbnQKK3N0cmluZ190b19udW1iZXIoY29uc3QgY2hhciAqcywgaW50IG1pbiwgaW50IG1heCkKK3sKKwlpbnQgbnVtYmVyOworCWNoYXIgKmVuZDsKKworCS8qIEhhbmRsZSBoZXgsIG9jdGFsLCBldGMuICovCisJbnVtYmVyID0gKGludClzdHJ0b2wocywgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJyAmJiBlbmQgIT0gcykgeworCQkvKiB3ZSBwYXJzZWQgYSBudW1iZXIsIGxldCdzIHNlZSBpZiB3ZSB3YW50IHRoaXMgKi8KKwkJaWYgKG1pbiA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IG1heCkKKwkJCXJldHVybiBudW1iZXI7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK3NldF9vcHRpb24odW5zaWduZWQgaW50ICpvcHRpb25zLCB1bnNpZ25lZCBpbnQgb3B0aW9uLCB1X2ludDhfdCAqaW52ZmxnLAorCSAgIGludCBpbnZlcnQpCit7CisJaWYgKCpvcHRpb25zICYgb3B0aW9uKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAibXVsdGlwbGUgLSVjIGZsYWdzIG5vdCBhbGxvd2VkIiwKKwkJCSAgIG9wdDJjaGFyKG9wdGlvbikpOworCSpvcHRpb25zIHw9IG9wdGlvbjsKKworCWlmIChpbnZlcnQpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCWZvciAoaSA9IDA7IDEgPDwgaSAhPSBvcHRpb247IGkrKyk7CisKKwkJaWYgKCFpbnZlcnNlX2Zvcl9vcHRpb25zW2ldKQorCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkgICAiY2Fubm90IGhhdmUgISBiZWZvcmUgLSVjIiwKKwkJCQkgICBvcHQyY2hhcihvcHRpb24pKTsKKwkJKmludmZsZyB8PSBpbnZlcnNlX2Zvcl9vcHRpb25zW2ldOworCX0KK30KKworc3RydWN0IGlwdGFibGVzX3RhcmdldCAqCitmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCBpbnQgdHJ5bG9hZCkKK3sKKwlzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICpwdHI7CisKKwkvKiBTdGFuZGFyZCB0YXJnZXQ/ICovCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMAorCSAgICB8fCBzdHJjbXAobmFtZSwgSVBUQ19MQUJFTF9BQ0NFUFQpID09IDAKKwkgICAgfHwgc3RyY21wKG5hbWUsIElQVENfTEFCRUxfRFJPUCkgPT0gMAorCSAgICB8fCBzdHJjbXAobmFtZSwgSVBUQ19MQUJFTF9RVUVVRSkgPT0gMAorCSAgICB8fCBzdHJjbXAobmFtZSwgSVBUQ19MQUJFTF9SRVRVUk4pID09IDApCisJCW5hbWUgPSAic3RhbmRhcmQiOworCisJZm9yIChwdHIgPSBpcHRhYmxlc190YXJnZXRzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlpZiAoc3RyY21wKG5hbWUsIHB0ci0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmICghcHRyICYmIHRyeWxvYWQpIHsKKwkJY2hhciBwYXRoW3NpemVvZihJUFRfTElCX0RJUikgKyBzaXplb2YoIi9saWJpcHRfLnNvIikKKwkJCSArIHN0cmxlbihuYW1lKV07CisJCXNwcmludGYocGF0aCwgSVBUX0xJQl9ESVIgIi9saWJpcHRfJXMuc28iLCBuYW1lKTsKKwkJZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKKwkJcmV0dXJuIGZpbmRfdGFyZ2V0KG5hbWUsIDApOworCX0KKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uICoKK21lcmdlX29wdGlvbnMoc3RydWN0IG9wdGlvbiAqb2xkb3B0cywgc3RydWN0IG9wdGlvbiAqbmV3b3B0cywKKwkgICAgICB1bnNpZ25lZCBpbnQgKm9wdGlvbl9vZmZzZXQpCit7CisJdW5zaWduZWQgaW50IG51bV9vbGQsIG51bV9uZXcsIGk7CisJc3RydWN0IG9wdGlvbiAqbWVyZ2U7CisKKwlmb3IgKG51bV9vbGQgPSAwOyBvbGRvcHRzW251bV9vbGRdLm5hbWU7IG51bV9vbGQrKyk7CisJZm9yIChudW1fbmV3ID0gMDsgbmV3b3B0c1tudW1fbmV3XS5uYW1lOyBudW1fbmV3KyspOworCisJZ2xvYmFsX29wdGlvbl9vZmZzZXQgKz0gT1BUSU9OX09GRlNFVDsKKwkqb3B0aW9uX29mZnNldCA9IGdsb2JhbF9vcHRpb25fb2Zmc2V0OworCisJbWVyZ2UgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcHRpb24pICogKG51bV9uZXcgKyBudW1fb2xkICsgMSkpOworCW1lbWNweShtZXJnZSwgb2xkb3B0cywgbnVtX29sZCAqIHNpemVvZihzdHJ1Y3Qgb3B0aW9uKSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9uZXc7IGkrKykgeworCQltZXJnZVtudW1fb2xkICsgaV0gPSBuZXdvcHRzW2ldOworCQltZXJnZVtudW1fb2xkICsgaV0udmFsICs9ICpvcHRpb25fb2Zmc2V0OworCX0KKwltZW1zZXQobWVyZ2UgKyBudW1fb2xkICsgbnVtX25ldywgMCwgc2l6ZW9mKHN0cnVjdCBvcHRpb24pKTsKKworCXJldHVybiBtZXJnZTsKK30KKwordm9pZAorcmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwdGFibGVzX21hdGNoICptZSkKK3sKKwlpZiAoc3RyY21wKG1lLT52ZXJzaW9uLCBwcm9ncmFtX3ZlcnNpb24pICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbWF0Y2ggYCVzJyB2JXMgKEknbSB2JXMpLlxuIiwKKwkJCXByb2dyYW1fbmFtZSwgbWUtPm5hbWUsIG1lLT52ZXJzaW9uLCBwcm9ncmFtX3ZlcnNpb24pOworCQlleGl0KDEpOworCX0KKworCWlmIChmaW5kX21hdGNoKG1lLT5uYW1lLCAwKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBtYXRjaCBgJXMnIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIsCisJCQlwcm9ncmFtX25hbWUsIG1lLT5uYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBQcmVwZW5kIHRvIGxpc3QuICovCisJbWUtPm5leHQgPSBpcHRhYmxlc19tYXRjaGVzOworCWlwdGFibGVzX21hdGNoZXMgPSBtZTsKKwltZS0+bSA9IE5VTEw7CisJbWUtPm1mbGFncyA9IDA7CisKKwlvcHRzID0gbWVyZ2Vfb3B0aW9ucyhvcHRzLCBtZS0+ZXh0cmFfb3B0cywgJm1lLT5vcHRpb25fb2Zmc2V0KTsKK30KKwordm9pZAorcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcHRhYmxlc190YXJnZXQgKm1lKQoreworCWlmIChzdHJjbXAobWUtPnZlcnNpb24sIHByb2dyYW1fdmVyc2lvbikgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB0YXJnZXQgYCVzJyB2JXMgKEknbSB2JXMpLlxuIiwKKwkJCXByb2dyYW1fbmFtZSwgbWUtPm5hbWUsIG1lLT52ZXJzaW9uLCBwcm9ncmFtX3ZlcnNpb24pOworCQlleGl0KDEpOworCX0KKworCWlmIChmaW5kX3RhcmdldChtZS0+bmFtZSwgMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogdGFyZ2V0IGAlcycgYWxyZWFkeSByZWdpc3RlcmVkLlxuIiwKKwkJCXByb2dyYW1fbmFtZSwgbWUtPm5hbWUpOworCQlleGl0KDEpOworCX0KKworCS8qIFByZXBlbmQgdG8gbGlzdC4gKi8KKwltZS0+bmV4dCA9IGlwdGFibGVzX3RhcmdldHM7CisJaXB0YWJsZXNfdGFyZ2V0cyA9IG1lOworCW1lLT50ID0gTlVMTDsKKwltZS0+dGZsYWdzID0gMDsKKworCW9wdHMgPSBtZXJnZV9vcHRpb25zKG9wdHMsIG1lLT5leHRyYV9vcHRzLCAmbWUtPm9wdGlvbl9vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGVhZGVyKHVuc2lnbmVkIGludCBmb3JtYXQsIGNvbnN0IGNoYXIgKmNoYWluLCBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyczsKKwljb25zdCBjaGFyICpwb2wgPSBpcHRjX2dldF9wb2xpY3koY2hhaW4sICZjb3VudGVycywgaGFuZGxlKTsKKwlwcmludGYoIkNoYWluICVzIiwgY2hhaW4pOworCWlmIChwb2wpIHsKKwkJcHJpbnRmKCIgKHBvbGljeSAlcyIsIHBvbCk7CisJCWlmICghKGZvcm1hdCAmIEZNVF9OT0NPVU5UUykpCisJCQlwcmludGYoIiAlbGx1IHBhY2tldHMsICVsbHUgYnl0ZXMiLAorCQkJICAgICAgIGNvdW50ZXJzLnBjbnQsIGNvdW50ZXJzLmJjbnQpOworCQlwcmludGYoIilcbiIpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCByZWZzOworCQlpcHRjX2dldF9yZWZlcmVuY2VzKCZyZWZzLCBjaGFpbiwgaGFuZGxlKTsKKwkJcHJpbnRmKCIgKCV1IHJlZmVyZW5jZXMpXG4iLCByZWZzKTsKKwl9CisKKwlpZiAoZm9ybWF0ICYgRk1UX0xJTkVOVU1CRVJTKQorCQlwcmludGYoRk1UKCIlLTRzICIsICIlcyAiKSwgIm51bSIpOworCWlmICghKGZvcm1hdCAmIEZNVF9OT0NPVU5UUykpIHsKKwkJaWYgKGZvcm1hdCAmIEZNVF9LSUxPTUVHQUdJR0EpIHsKKwkJCXByaW50ZihGTVQoIiU1cyAiLCIlcyAiKSwgInBrdHMiKTsKKwkJCXByaW50ZihGTVQoIiU1cyAiLCIlcyAiKSwgImJ5dGVzIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoRk1UKCIlOHMgIiwiJXMgIiksICJwa3RzIik7CisJCQlwcmludGYoRk1UKCIlMTBzICIsIiVzICIpLCAiYnl0ZXMiKTsKKwkJfQorCX0KKwlpZiAoIShmb3JtYXQgJiBGTVRfTk9UQVJHRVQpKQorCQlwcmludGYoRk1UKCIlLTlzICIsIiVzICIpLCAidGFyZ2V0Iik7CisJZnB1dHMoIiBwcm90ICIsIHN0ZG91dCk7CisJaWYgKGZvcm1hdCAmIEZNVF9PUFRJT05TKQorCQlmcHV0cygib3B0Iiwgc3Rkb3V0KTsKKwlpZiAoZm9ybWF0ICYgRk1UX1ZJQSkgeworCQlwcmludGYoRk1UKCIgJS02cyAiLCIlcyAiKSwgImluIik7CisJCXByaW50ZihGTVQoIiUtNnMgIiwiJXMgIiksICJvdXQiKTsKKwl9CisJcHJpbnRmKEZNVCgiICUtMTlzICIsIiVzICIpLCAic291cmNlIik7CisJcHJpbnRmKEZNVCgiICUtMTlzICIsIiAlcyAiKSwgImRlc3RpbmF0aW9uIik7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbnVtKHVfaW50NjRfdCBudW1iZXIsIHVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJaWYgKGZvcm1hdCAmIEZNVF9LSUxPTUVHQUdJR0EpIHsKKwkJaWYgKG51bWJlciA+IDk5OTk5KSB7CisJCQludW1iZXIgPSAobnVtYmVyICsgNTAwKSAvIDEwMDA7CisJCQlpZiAobnVtYmVyID4gOTk5OSkgeworCQkJCW51bWJlciA9IChudW1iZXIgKyA1MDApIC8gMTAwMDsKKwkJCQlpZiAobnVtYmVyID4gOTk5OSkgeworCQkJCQludW1iZXIgPSAobnVtYmVyICsgNTAwKSAvIDEwMDA7CisJCQkJCXByaW50ZihGTVQoIiU0bGx1RyAiLCIlbGx1RyAiKSxudW1iZXIpOworCQkJCX0KKwkJCQllbHNlIHByaW50ZihGTVQoIiU0bGx1TSAiLCIlbGx1TSAiKSwgbnVtYmVyKTsKKwkJCX0gZWxzZQorCQkJCXByaW50ZihGTVQoIiU0bGx1SyAiLCIlbGx1SyAiKSwgbnVtYmVyKTsKKwkJfSBlbHNlCisJCQlwcmludGYoRk1UKCIlNWxsdSAiLCIlbGx1ICIpLCBudW1iZXIpOworCX0gZWxzZQorCQlwcmludGYoRk1UKCIlOGxsdSAiLCIlbGx1ICIpLCBudW1iZXIpOworfQorCitzdGF0aWMgaW50CitwcmludF9tYXRjaChjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAorCSAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICAgaW50IG51bWVyaWMpCit7CisJc3RydWN0IGlwdGFibGVzX21hdGNoICptYXRjaCA9IGZpbmRfbWF0Y2gobS0+dS5uYW1lLCAxKTsKKworCWlmIChtYXRjaCkgeworCQlpZiAobWF0Y2gtPnByaW50KQorCQkJbWF0Y2gtPnByaW50KGlwLCBtLCBudW1lcmljKTsKKwl9IGVsc2UgeworCQlpZiAobS0+dS5uYW1lWzBdKQorCQkJcHJpbnRmKCJVTktOT1dOIG1hdGNoIGAlcycgIiwgbS0+dS5uYW1lKTsKKwl9CisJLyogRG9uJ3Qgc3RvcCBpdGVyYXRpbmcuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIGUgaXMgY2FsbGVkIGBmdycgaGVyZSBmb3IgaHlzdGVyaWNhbCByYWlzaW5zICovCitzdGF0aWMgdm9pZAorcHJpbnRfZmlyZXdhbGwoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZncsCisJICAgICAgIGNvbnN0IGNoYXIgKnRhcmduYW1lLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtLAorCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCSAgICAgICBjb25zdCBpcHRjX2hhbmRsZV90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgaXB0YWJsZXNfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OworCXVfaW50OF90IGZsYWdzOworCWNoYXIgYnVmW0JVRlNJWl07CisKKwkvKiBVc2VyIGNyZWF0ZXMgYSBjaGFpbiBjYWxsZWQgIlJFSkVDVCI6IHRoaXMgb3ZlcnJpZGVzIHRoZQorCSAgIGBSRUpFQ1QnIHRhcmdldCBtb2R1bGUuICBLZWVwIGZlZWRpbmcgdGhlbSByb3BlIHVudGlsIHRoZQorCSAgIHJldm9sdXRpb24uLi4gQndhaGFoYWhhaGFoICovCisJaWYgKCFpcHRjX2lzX2NoYWluKHRhcmduYW1lLCBoYW5kbGUpKQorCQl0YXJnZXQgPSBmaW5kX3RhcmdldCh0YXJnbmFtZSwgMSk7CisJZWxzZQorCQl0YXJnZXQgPSBmaW5kX3RhcmdldChJUFRfU1RBTkRBUkRfVEFSR0VULCAxKTsKKworCXQgPSBpcHRfZ2V0X3RhcmdldCgoc3RydWN0IGlwdF9lbnRyeSAqKWZ3KTsKKwlmbGFncyA9IGZ3LT5pcC5mbGFnczsKKworCWlmIChmb3JtYXQgJiBGTVRfTElORU5VTUJFUlMpCisJCXByaW50ZihGTVQoIiUtNHUgIiwgIiV1ICIpLCBudW0rMSk7CisKKwlpZiAoIShmb3JtYXQgJiBGTVRfTk9DT1VOVFMpKSB7CisJCXByaW50X251bShmdy0+Y291bnRlcnMucGNudCwgZm9ybWF0KTsKKwkJcHJpbnRfbnVtKGZ3LT5jb3VudGVycy5iY250LCBmb3JtYXQpOworCX0KKworCWlmICghKGZvcm1hdCAmIEZNVF9OT1RBUkdFVCkpCisJCXByaW50ZihGTVQoIiUtOXMgIiwgIiVzICIpLCB0YXJnbmFtZSk7CisKKwlmcHV0Yyhmdy0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPID8gJyEnIDogJyAnLCBzdGRvdXQpOworCXsKKwkJY2hhciAqcG5hbWUgPSBwcm90b190b19uYW1lKGZ3LT5pcC5wcm90byk7CisJCWlmIChwbmFtZSkKKwkJCXByaW50ZihGTVQoIiUtNXMiLCAiJXMgIiksIHBuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRmKEZNVCgiJS01aHUiLCAiJWh1ICIpLCBmdy0+aXAucHJvdG8pOworCX0KKworCWlmIChmb3JtYXQgJiBGTVRfT1BUSU9OUykgeworCQlpZiAoZm9ybWF0ICYgRk1UX05PVEFCTEUpCisJCQlmcHV0cygib3B0ICIsIHN0ZG91dCk7CisJCWZwdXRjKGZ3LT5pcC5pbnZmbGFncyAmIElQVF9JTlZfRlJBRyA/ICchJyA6ICctJywgc3Rkb3V0KTsKKwkJZnB1dGMoZmxhZ3MgJiBJUFRfRl9GUkFHID8gJ2YnIDogJy0nLCBzdGRvdXQpOworCQlmcHV0YygnICcsIHN0ZG91dCk7CisJfQorCisJaWYgKGZvcm1hdCAmIEZNVF9WSUEpIHsKKwkJY2hhciBpZmFjZVtJRk5BTVNJWisyXTsKKworCQlpZiAoZnctPmlwLmludmZsYWdzICYgSVBUX0lOVl9WSUFfSU4pIHsKKwkJCWlmYWNlWzBdID0gJyEnOworCQkJaWZhY2VbMV0gPSAnXDAnOworCQl9CisJCWVsc2UgaWZhY2VbMF0gPSAnXDAnOworCisJCWlmIChmdy0+aXAuaW5pZmFjZVswXSAhPSAnXDAnKSB7CisJCQlzdHJjYXQoaWZhY2UsIGZ3LT5pcC5pbmlmYWNlKTsKKwkJCS8qIElmIGl0IGRvZXNuJ3QgY29tcGFyZSB0aGUgbnVsLXRlcm0sIGl0J3MgYQorCQkJICAgd2lsZGNhcmQuICovCisJCQlpZiAoZnctPmlwLmluaWZhY2VfbWFza1tzdHJsZW4oZnctPmlwLmluaWZhY2UpXSA9PSAwKQorCQkJCXN0cmNhdChpZmFjZSwgIisiKTsKKwkJfQorCQllbHNlIGlmIChmb3JtYXQgJiBGTVRfTlVNRVJJQykgc3RyY2F0KGlmYWNlLCAiKiIpOworCQllbHNlIHN0cmNhdChpZmFjZSwgImFueSIpOworCQlwcmludGYoRk1UKCIgJS02cyAiLCJpbiAlcyAiKSwgaWZhY2UpOworCisJCWlmIChmdy0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1ZJQV9PVVQpIHsKKwkJCWlmYWNlWzBdID0gJyEnOworCQkJaWZhY2VbMV0gPSAnXDAnOworCQl9CisJCWVsc2UgaWZhY2VbMF0gPSAnXDAnOworCisJCWlmIChmdy0+aXAub3V0aWZhY2VbMF0gIT0gJ1wwJykgeworCQkJc3RyY2F0KGlmYWNlLCBmdy0+aXAub3V0aWZhY2UpOworCQkJLyogSWYgaXQgZG9lc24ndCBjb21wYXJlIHRoZSBudWwtdGVybSwgaXQncyBhCisJCQkgICB3aWxkY2FyZC4gKi8KKwkJCWlmIChmdy0+aXAub3V0aWZhY2VfbWFza1tzdHJsZW4oZnctPmlwLm91dGlmYWNlKV0gPT0gMCkKKwkJCQlzdHJjYXQoaWZhY2UsICIrIik7CisJCX0KKwkJZWxzZSBpZiAoZm9ybWF0ICYgRk1UX05VTUVSSUMpIHN0cmNhdChpZmFjZSwgIioiKTsKKwkJZWxzZSBzdHJjYXQoaWZhY2UsICJhbnkiKTsKKwkJcHJpbnRmKEZNVCgiJS02cyAiLCJvdXQgJXMgIiksIGlmYWNlKTsKKwl9CisKKwlmcHV0Yyhmdy0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1NSQ0lQID8gJyEnIDogJyAnLCBzdGRvdXQpOworCWlmIChmdy0+aXAuc21zay5zX2FkZHIgPT0gMEwgJiYgIShmb3JtYXQgJiBGTVRfTlVNRVJJQykpCisJCXByaW50ZihGTVQoIiUtMTlzICIsIiVzICIpLCAiYW55d2hlcmUiKTsKKwllbHNlIHsKKwkJaWYgKGZvcm1hdCAmIEZNVF9OVU1FUklDKQorCQkJc3ByaW50ZihidWYsICIlcyIsIGFkZHJfdG9fZG90dGVkKCYoZnctPmlwLnNyYykpKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICIlcyIsIGFkZHJfdG9fYW55bmFtZSgmKGZ3LT5pcC5zcmMpKSk7CisJCXN0cmNhdChidWYsIG1hc2tfdG9fZG90dGVkKCYoZnctPmlwLnNtc2spKSk7CisJCXByaW50ZihGTVQoIiUtMTlzICIsIiVzICIpLCBidWYpOworCX0KKworCWZwdXRjKGZ3LT5pcC5pbnZmbGFncyAmIElQVF9JTlZfRFNUSVAgPyAnIScgOiAnICcsIHN0ZG91dCk7CisJaWYgKGZ3LT5pcC5kbXNrLnNfYWRkciA9PSAwTCAmJiAhKGZvcm1hdCAmIEZNVF9OVU1FUklDKSkKKwkJcHJpbnRmKEZNVCgiJS0xOXMiLCItPiAlcyIpLCAiYW55d2hlcmUiKTsKKwllbHNlIHsKKwkJaWYgKGZvcm1hdCAmIEZNVF9OVU1FUklDKQorCQkJc3ByaW50ZihidWYsICIlcyIsIGFkZHJfdG9fZG90dGVkKCYoZnctPmlwLmRzdCkpKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICIlcyIsIGFkZHJfdG9fYW55bmFtZSgmKGZ3LT5pcC5kc3QpKSk7CisJCXN0cmNhdChidWYsIG1hc2tfdG9fZG90dGVkKCYoZnctPmlwLmRtc2spKSk7CisJCXByaW50ZihGTVQoIiUtMTlzIiwiLT4gJXMiKSwgYnVmKTsKKwl9CisKKwlpZiAoZm9ybWF0ICYgRk1UX05PVEFCTEUpCisJCWZwdXRzKCIgICIsIHN0ZG91dCk7CisKKwlJUFRfTUFUQ0hfSVRFUkFURShmdywgcHJpbnRfbWF0Y2gsICZmdy0+aXAsIGZvcm1hdCAmIEZNVF9OVU1FUklDKTsKKworCWlmICh0YXJnZXQpIHsKKwkJaWYgKHRhcmdldC0+cHJpbnQpCisJCQkvKiBQcmludCB0aGUgdGFyZ2V0IGluZm9ybWF0aW9uLiAqLworCQkJdGFyZ2V0LT5wcmludCgmZnctPmlwLCB0LCBmb3JtYXQgJiBGTVRfTlVNRVJJQyk7CisJfSBlbHNlIGlmICh0LT50YXJnZXRfc2l6ZSAhPSBzaXplb2YoKnQpKQorCQlwcmludGYoIlsldSBieXRlcyBvZiB1bmtub3duIHRhcmdldCBkYXRhXSAiLAorCQkgICAgICAgdC0+dGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpKTsKKworCWlmICghKGZvcm1hdCAmIEZNVF9OT05FV0xJTkUpKQorCQlmcHV0YygnXG4nLCBzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZmlyZXdhbGxfbGluZShjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICpmdywKKwkJICAgIGNvbnN0IGlwdGNfaGFuZGxlX3QgaCkKK3sKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKworCXQgPSBpcHRfZ2V0X3RhcmdldCgoc3RydWN0IGlwdF9lbnRyeSAqKWZ3KTsKKwlwcmludF9maXJld2FsbChmdywgdC0+dS5uYW1lLCAwLCBGTVRfUFJJTlRfUlVMRSwgaCk7Cit9CisKK3N0YXRpYyBpbnQKK2FwcGVuZF9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkgICAgIHN0cnVjdCBpcHRfZW50cnkgKmZ3LAorCSAgICAgdW5zaWduZWQgaW50IG5zYWRkcnMsCisJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciBzYWRkcnNbXSwKKwkgICAgIHVuc2lnbmVkIGludCBuZGFkZHJzLAorCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgZGFkZHJzW10sCisJICAgICBpbnQgdmVyYm9zZSwKKwkgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlpbnQgcmV0ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuc2FkZHJzOyBpKyspIHsKKwkJZnctPmlwLnNyYy5zX2FkZHIgPSBzYWRkcnNbaV0uc19hZGRyOworCQlmb3IgKGogPSAwOyBqIDwgbmRhZGRyczsgaisrKSB7CisJCQlmdy0+aXAuZHN0LnNfYWRkciA9IGRhZGRyc1tqXS5zX2FkZHI7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludF9maXJld2FsbF9saW5lKGZ3LCAqaGFuZGxlKTsKKwkJCXJldCAmPSBpcHRjX2FwcGVuZF9lbnRyeShjaGFpbiwgZncsIGhhbmRsZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CityZXBsYWNlX2VudHJ5KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCSAgICAgIHN0cnVjdCBpcHRfZW50cnkgKmZ3LAorCSAgICAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCSAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpzYWRkciwKKwkgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqZGFkZHIsCisJICAgICAgaW50IHZlcmJvc2UsCisJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCWZ3LT5pcC5zcmMuc19hZGRyID0gc2FkZHItPnNfYWRkcjsKKwlmdy0+aXAuZHN0LnNfYWRkciA9IGRhZGRyLT5zX2FkZHI7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRfZmlyZXdhbGxfbGluZShmdywgKmhhbmRsZSk7CisJcmV0dXJuIGlwdGNfcmVwbGFjZV9lbnRyeShjaGFpbiwgZncsIHJ1bGVudW0sIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQKK2luc2VydF9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkgICAgIHN0cnVjdCBpcHRfZW50cnkgKmZ3LAorCSAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJICAgICB1bnNpZ25lZCBpbnQgbnNhZGRycywKKwkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyIHNhZGRyc1tdLAorCSAgICAgdW5zaWduZWQgaW50IG5kYWRkcnMsCisJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciBkYWRkcnNbXSwKKwkgICAgIGludCB2ZXJib3NlLAorCSAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXQgPSAxOworCisJZm9yIChpID0gMDsgaSA8IG5zYWRkcnM7IGkrKykgeworCQlmdy0+aXAuc3JjLnNfYWRkciA9IHNhZGRyc1tpXS5zX2FkZHI7CisJCWZvciAoaiA9IDA7IGogPCBuZGFkZHJzOyBqKyspIHsKKwkJCWZ3LT5pcC5kc3Quc19hZGRyID0gZGFkZHJzW2pdLnNfYWRkcjsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50X2ZpcmV3YWxsX2xpbmUoZncsICpoYW5kbGUpOworCQkJcmV0ICY9IGlwdGNfaW5zZXJ0X2VudHJ5KGNoYWluLCBmdywgcnVsZW51bSwgaGFuZGxlKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RlbGV0ZV9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkgICAgIHN0cnVjdCBpcHRfZW50cnkgKmZ3LAorCSAgICAgdW5zaWduZWQgaW50IG5zYWRkcnMsCisJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciBzYWRkcnNbXSwKKwkgICAgIHVuc2lnbmVkIGludCBuZGFkZHJzLAorCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgZGFkZHJzW10sCisJICAgICBpbnQgdmVyYm9zZSwKKwkgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlpbnQgcmV0ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuc2FkZHJzOyBpKyspIHsKKwkJZnctPmlwLnNyYy5zX2FkZHIgPSBzYWRkcnNbaV0uc19hZGRyOworCQlmb3IgKGogPSAwOyBqIDwgbmRhZGRyczsgaisrKSB7CisJCQlmdy0+aXAuZHN0LnNfYWRkciA9IGRhZGRyc1tqXS5zX2FkZHI7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludF9maXJld2FsbF9saW5lKGZ3LCAqaGFuZGxlKTsKKwkJCXJldCAmPSBpcHRjX2RlbGV0ZV9lbnRyeShjaGFpbiwgZncsIGhhbmRsZSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorY2hlY2tfcGFja2V0KGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCSAgICAgc3RydWN0IGlwdF9lbnRyeSAqZncsCisJICAgICB1bnNpZ25lZCBpbnQgbnNhZGRycywKKwkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyIHNhZGRyc1tdLAorCSAgICAgdW5zaWduZWQgaW50IG5kYWRkcnMsCisJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciBkYWRkcnNbXSwKKwkgICAgIGludCB2ZXJib3NlLAorCSAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCWludCByZXQgPSAxOworCXVuc2lnbmVkIGludCBpLCBqOworCWNvbnN0IGNoYXIgKm1zZzsKKworCWZvciAoaSA9IDA7IGkgPCBuc2FkZHJzOyBpKyspIHsKKwkJZnctPmlwLnNyYy5zX2FkZHIgPSBzYWRkcnNbaV0uc19hZGRyOworCQlmb3IgKGogPSAwOyBqIDwgbmRhZGRyczsgaisrKSB7CisJCQlmdy0+aXAuZHN0LnNfYWRkciA9IGRhZGRyc1tqXS5zX2FkZHI7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludF9maXJld2FsbF9saW5lKGZ3LCAqaGFuZGxlKTsKKwkJCW1zZyA9IGlwdGNfY2hlY2tfcGFja2V0KGNoYWluLCBmdywgaGFuZGxlKTsKKwkJCWlmICghbXNnKSByZXQgPSAwOworCQkJZWxzZSBwcmludGYoIiVzXG4iLCBtc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZm9yX2VhY2hfY2hhaW4oaW50ICgqZm4pKGNvbnN0IGlwdF9jaGFpbmxhYmVsLCBpbnQsIGlwdGNfaGFuZGxlX3QgKiksCisJICAgICAgIGludCB2ZXJib3NlLCBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgICAgIGludCByZXQgPSAxOworCWNvbnN0IGNoYXIgKmNoYWluID0gTlVMTDsKKworCXdoaWxlICgoY2hhaW4gPSBpcHRjX25leHRfY2hhaW4oY2hhaW4sIGhhbmRsZSkpKSB7CisJICAgICAgICByZXQgJj0gZm4oY2hhaW4sIHZlcmJvc2UsIGhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitmbHVzaF9lbnRyaWVzKGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLCBpbnQgdmVyYm9zZSwKKwkgICAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKCFjaGFpbikKKwkJcmV0dXJuIGZvcl9lYWNoX2NoYWluKGZsdXNoX2VudHJpZXMsIHZlcmJvc2UsIGhhbmRsZSk7CisJCisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRvdXQsICJGbHVzaGluZyBjaGFpbiBgJXMnXG4iLCBjaGFpbik7CisJCXJldHVybiBpcHRjX2ZsdXNoX2VudHJpZXMoY2hhaW4sIGhhbmRsZSk7CisJfQorCitzdGF0aWMgaW50Cit6ZXJvX2VudHJpZXMoY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sIGludCB2ZXJib3NlLAorCSAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCWlmICghY2hhaW4pCisJCXJldHVybiBmb3JfZWFjaF9jaGFpbih6ZXJvX2VudHJpZXMsIHZlcmJvc2UsIGhhbmRsZSk7CisJCisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3Rkb3V0LCAiWmVyb2luZyBjaGFpbiBgJXMnXG4iLCBjaGFpbik7CisJcmV0dXJuIGlwdGNfemVyb19lbnRyaWVzKGNoYWluLCBoYW5kbGUpOworfQorCitzdGF0aWMgaW50CitkZWxldGVfY2hhaW4oY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sIGludCB2ZXJib3NlLAorCSAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCWlmICghY2hhaW4pIHsKKwkJY29uc3QgY2hhciAqaSwgKmxhc3QgPSBOVUxMOworCQlpbnQgcmV0ID0gMTsKKworCQkvKiBJdGVyYXRlIG92ZXIgYnVpbHQtaW5zICovCisJCWZvciAoaSA9IGlwdGNfbmV4dF9jaGFpbihOVUxMLCBoYW5kbGUpOworCQkgICAgIGkgJiYgaXB0Y19idWlsdGluKGksICpoYW5kbGUpOworCQkgICAgIGkgPSBpcHRjX25leHRfY2hhaW4oaSwgaGFuZGxlKSkKKwkJCWxhc3QgPSBpOworCisJCS8qIE5vIHVzZXItZGVmaW5lZCBjaGFpbnM/ICovCisJCWlmICghaSkKKwkJCXJldHVybiByZXQ7CisJCQkKKwkJLyogQmUgY2FyZWZ1bCBpdGVyYXRpbmc6IGl0IGlzbid0IHNhZmUgZHVyaW5nIGRlbGV0ZS4gKi8KKwkJLyogUmUtaXRlcmF0ZSBhZnRlciBlYWNoIGRlbGV0ZSBzdWNjZXNzZnVsICovCisJCXdoaWxlICgoaSA9IGlwdGNfbmV4dF9jaGFpbihsYXN0LCBoYW5kbGUpKSAhPSBOVUxMKSB7CisJCQkvKiBTa2lwIG92ZXIgYnVpbHRpbnMuICovCisJCQlpZiAoIWRlbGV0ZV9jaGFpbihpLCB2ZXJib3NlLCBoYW5kbGUpKSB7CisJCQkJLyogRGVsZXRlIGZhaWxlZDsgc3RhcnQgbmV4dAorCQkJCSAgIGl0ZXJhdGlvbiBmcm9tIGhlcmUgKi8KKwkJCQlsYXN0ID0gaTsKKwkJCQlyZXQgPSAwOworCQkJfQorCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHZlcmJvc2UpCisJICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRlbGV0aW5nIGNoYWluIGAlcydcbiIsIGNoYWluKTsKKwlyZXR1cm4gaXB0Y19kZWxldGVfY2hhaW4oY2hhaW4sIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQKK2xpc3RfZW50cmllcyhjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwgaW50IHZlcmJvc2UsIGludCBudW1lcmljLAorCSAgICAgaW50IGV4cGFuZGVkLCBpbnQgbGluZW51bWJlcnMsIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpbnQgZm91bmQgPSAwOworCXVuc2lnbmVkIGludCBpLCBmb3JtYXQ7CisJY29uc3QgY2hhciAqdGhpcyA9IE5VTEw7CisKKwlmb3JtYXQgPSBGTVRfT1BUSU9OUzsKKwlpZiAoIXZlcmJvc2UpCisJCWZvcm1hdCB8PSBGTVRfTk9DT1VOVFM7CisJZWxzZQorCQlmb3JtYXQgfD0gRk1UX1ZJQTsKKworCWlmIChudW1lcmljKQorCQlmb3JtYXQgfD0gRk1UX05VTUVSSUM7CisKKwlpZiAoIWV4cGFuZGVkKQorCQlmb3JtYXQgfD0gRk1UX0tJTE9NRUdBR0lHQTsKKworCWlmIChsaW5lbnVtYmVycykKKwkJZm9ybWF0IHw9IEZNVF9MSU5FTlVNQkVSUzsKKworCisJd2hpbGUgKCh0aGlzID0gaXB0Y19uZXh0X2NoYWluKHRoaXMsIGhhbmRsZSkpICE9IE5VTEwpIHsKKwkJaWYgKGNoYWluICYmIHN0cmNtcChjaGFpbiwgdGhpcykgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmb3VuZCkgcHJpbnRmKCJcbiIpOworCisJCXByaW50X2hlYWRlcihmb3JtYXQsIHRoaXMsIGhhbmRsZSk7CisJCWZvciAoaSA9IDA7IGkgPCBpcHRjX251bV9ydWxlcyh0aGlzLCBoYW5kbGUpOyBpKyspCisJCQlwcmludF9maXJld2FsbChpcHRjX2dldF9ydWxlKHRoaXMsIGksIGhhbmRsZSksCisJCQkJICAgICAgIGlwdGNfZ2V0X3RhcmdldCh0aGlzLCBpLCBoYW5kbGUpLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICBmb3JtYXQsCisJCQkJICAgICAgICpoYW5kbGUpOworCQlmb3VuZCA9IDE7CisJfQorCisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9lbnRyeSAqCitnZW5lcmF0ZV9lbnRyeShjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICpmdywKKwkgICAgICAgc3RydWN0IGlwdGFibGVzX21hdGNoICptYXRjaGVzLAorCSAgICAgICBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCBpcHRhYmxlc19tYXRjaCAqbTsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KTsKKwlmb3IgKG0gPSBtYXRjaGVzOyBtOyBtID0gbS0+bmV4dCkKKwkJc2l6ZSArPSBtLT5tLT5tYXRjaF9zaXplOworCisJZSA9IGZ3X21hbGxvYyhzaXplICsgdGFyZ2V0LT50YXJnZXRfc2l6ZSk7CisJKmUgPSAqZnc7CisJZS0+dGFyZ2V0X29mZnNldCA9IHNpemU7CisJZS0+bmV4dF9vZmZzZXQgPSBzaXplICsgdGFyZ2V0LT50YXJnZXRfc2l6ZTsKKworCXNpemUgPSAwOworCWZvciAobSA9IG1hdGNoZXM7IG07IG0gPSBtLT5uZXh0KSB7CisJCW1lbWNweShlLT5lbGVtcyArIHNpemUsIG0tPm0sIG0tPm0tPm1hdGNoX3NpemUpOworCQlzaXplICs9IG0tPm0tPm1hdGNoX3NpemU7CisJfQorCW1lbWNweShlLT5lbGVtcyArIHNpemUsIHRhcmdldCwgdGFyZ2V0LT50YXJnZXRfc2l6ZSk7CisKKwlyZXR1cm4gZTsKK30KKworaW50IGRvX2NvbW1hbmQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqKnRhYmxlLCBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJc3RydWN0IGlwdF9lbnRyeSBmdywgKmUgPSBOVUxMOworCWludCBpbnZlcnQgPSAwOworCXVuc2lnbmVkIGludCBuc2FkZHJzID0gMCwgbmRhZGRycyA9IDA7CisJc3RydWN0IGluX2FkZHIgKnNhZGRycyA9IE5VTEwsICpkYWRkcnMgPSBOVUxMOworCisJaW50IGMsIHZlcmJvc2UgPSAwOworCWNvbnN0IGNoYXIgKmNoYWluID0gTlVMTDsKKwljb25zdCBjaGFyICpzaG9zdG5ldHdvcmttYXNrID0gTlVMTCwgKmRob3N0bmV0d29ya21hc2sgPSBOVUxMOworCWNvbnN0IGNoYXIgKnBvbGljeSA9IE5VTEwsICpuZXduYW1lID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcnVsZW51bSA9IDAsIG9wdGlvbnMgPSAwLCBjb21tYW5kID0gMDsKKwlpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggKm07CisJc3RydWN0IGlwdGFibGVzX3RhcmdldCAqdGFyZ2V0ID0gTlVMTDsKKwljb25zdCBjaGFyICpqdW1wdG8gPSAiIjsKKwljaGFyICpwcm90b2NvbCA9IE5VTEw7CisKKwltZW1zZXQoJmZ3LCAwLCBzaXplb2YoZncpKTsKKworCS8qIFN1cHByZXNzIGVycm9yIG1lc3NhZ2VzOiB3ZSBtYXkgYWRkIG5ldyBvcHRpb25zIGlmIHdlCisgICAgICAgICAgIGRlbWFuZC1sb2FkIGEgcHJvdG9jb2wuICovCisJb3B0ZXJyID0gMDsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsCisJICAgIi1BOkM6RDpSOkk6TDo6Rjo6Wjo6TjpYOjpFOlA6Vmg6Om86cDpzOmQ6ajppOmZidm50Om06eCIsCisJCQkJCSAgIG9wdHMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJCS8qCisJCQkgKiBDb21tYW5kIHNlbGVjdGlvbgorCQkJICovCisJCWNhc2UgJ0EnOgorCQkJYWRkX2NvbW1hbmQoJmNvbW1hbmQsIENNRF9BUFBFTkQsIENNRF9OT05FLAorCQkJCSAgICBpbnZlcnQpOworCQkJY2hhaW4gPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdEJzoKKwkJCWFkZF9jb21tYW5kKCZjb21tYW5kLCBDTURfREVMRVRFLCBDTURfTk9ORSwKKwkJCQkgICAgaW52ZXJ0KTsKKwkJCWNoYWluID0gb3B0YXJnOworCQkJaWYgKG9wdGluZCA8IGFyZ2MgJiYgYXJndltvcHRpbmRdWzBdICE9ICctJworCQkJICAgICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnIScpIHsKKwkJCQlydWxlbnVtID0gcGFyc2VfcnVsZW51bWJlcihhcmd2W29wdGluZCsrXSk7CisJCQkJY29tbWFuZCA9IENNRF9ERUxFVEVfTlVNOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnQyc6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX0NIRUNLLCBDTURfTk9ORSwKKwkJCQkgICAgaW52ZXJ0KTsKKwkJCWNoYWluID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnUic6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX1JFUExBQ0UsIENNRF9OT05FLAorCQkJCSAgICBpbnZlcnQpOworCQkJY2hhaW4gPSBvcHRhcmc7CisJCQlpZiAob3B0aW5kIDwgYXJnYyAmJiBhcmd2W29wdGluZF1bMF0gIT0gJy0nCisJCQkgICAgJiYgYXJndltvcHRpbmRdWzBdICE9ICchJykKKwkJCQlydWxlbnVtID0gcGFyc2VfcnVsZW51bWJlcihhcmd2W29wdGluZCsrXSk7CisJCQllbHNlCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIi0lYyByZXF1aXJlcyBhIHJ1bGUgbnVtYmVyIiwKKwkJCQkJICAgY21kMmNoYXIoQ01EX1JFUExBQ0UpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0knOgorCQkJYWRkX2NvbW1hbmQoJmNvbW1hbmQsIENNRF9JTlNFUlQsIENNRF9OT05FLAorCQkJCSAgICBpbnZlcnQpOworCQkJY2hhaW4gPSBvcHRhcmc7CisJCQlpZiAob3B0aW5kIDwgYXJnYyAmJiBhcmd2W29wdGluZF1bMF0gIT0gJy0nCisJCQkgICAgJiYgYXJndltvcHRpbmRdWzBdICE9ICchJykKKwkJCQlydWxlbnVtID0gcGFyc2VfcnVsZW51bWJlcihhcmd2W29wdGluZCsrXSk7CisJCQllbHNlIHJ1bGVudW0gPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnTCc6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX0xJU1QsIENNRF9aRVJPLAorCQkJCSAgICBpbnZlcnQpOworCQkJaWYgKG9wdGFyZykgY2hhaW4gPSBvcHRhcmc7CisJCQllbHNlIGlmIChvcHRpbmQgPCBhcmdjICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScKKwkJCQkgJiYgYXJndltvcHRpbmRdWzBdICE9ICchJykKKwkJCQljaGFpbiA9IGFyZ3Zbb3B0aW5kKytdOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX0ZMVVNILCBDTURfTk9ORSwKKwkJCQkgICAgaW52ZXJ0KTsKKwkJCWlmIChvcHRhcmcpIGNoYWluID0gb3B0YXJnOworCQkJZWxzZSBpZiAob3B0aW5kIDwgYXJnYyAmJiBhcmd2W29wdGluZF1bMF0gIT0gJy0nCisJCQkJICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnIScpCisJCQkJY2hhaW4gPSBhcmd2W29wdGluZCsrXTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1onOgorCQkJYWRkX2NvbW1hbmQoJmNvbW1hbmQsIENNRF9aRVJPLCBDTURfTElTVCwKKwkJCQkgICAgaW52ZXJ0KTsKKwkJCWlmIChvcHRhcmcpIGNoYWluID0gb3B0YXJnOworCQkJZWxzZSBpZiAob3B0aW5kIDwgYXJnYyAmJiBhcmd2W29wdGluZF1bMF0gIT0gJy0nCisJCQkJJiYgYXJndltvcHRpbmRdWzBdICE9ICchJykKKwkJCQljaGFpbiA9IGFyZ3Zbb3B0aW5kKytdOworCQkJYnJlYWs7CisKKwkJY2FzZSAnTic6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX05FV19DSEFJTiwgQ01EX05PTkUsCisJCQkJICAgIGludmVydCk7CisJCQljaGFpbiA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJYWRkX2NvbW1hbmQoJmNvbW1hbmQsIENNRF9ERUxFVEVfQ0hBSU4sIENNRF9OT05FLAorCQkJCSAgICBpbnZlcnQpOworCQkJaWYgKG9wdGFyZykgY2hhaW4gPSBvcHRhcmc7CisJCQllbHNlIGlmIChvcHRpbmQgPCBhcmdjICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScKKwkJCQkgJiYgYXJndltvcHRpbmRdWzBdICE9ICchJykKKwkJCQljaGFpbiA9IGFyZ3Zbb3B0aW5kKytdOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRSc6CisJCQlhZGRfY29tbWFuZCgmY29tbWFuZCwgQ01EX1JFTkFNRV9DSEFJTiwgQ01EX05PTkUsCisJCQkJICAgIGludmVydCk7CisJCQljaGFpbiA9IG9wdGFyZzsKKwkJCWlmIChvcHRpbmQgPCBhcmdjICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScKKwkJCSAgICAmJiBhcmd2W29wdGluZF1bMF0gIT0gJyEnKQorCQkJCW5ld25hbWUgPSBhcmd2W29wdGluZCsrXTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1AnOgorCQkJYWRkX2NvbW1hbmQoJmNvbW1hbmQsIENNRF9TRVRfUE9MSUNZLCBDTURfTk9ORSwKKwkJCQkgICAgaW52ZXJ0KTsKKwkJCWNoYWluID0gb3B0YXJnOworCQkJaWYgKG9wdGluZCA8IGFyZ2MgJiYgYXJndltvcHRpbmRdWzBdICE9ICctJworCQkJICAgICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnIScpCisJCQkJcG9saWN5ID0gYXJndltvcHRpbmQrK107CisJCQllbHNlCisJCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCQkJICAgIi0lYyByZXF1aXJlcyBhIGNoYWluIGFuZCBhIHBvbGljeSIsCisJCQkJCSAgIGNtZDJjaGFyKENNRF9TRVRfUE9MSUNZKSk7CisJCQlicmVhazsKKworCQljYXNlICdoJzoKKwkJCWlmICghb3B0YXJnKQorCQkJCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kXTsKKworCQkJZXhpdF9wcmludGhlbHAoKTsKKworCQkJLyoKKwkJCSAqIE9wdGlvbiBzZWxlY3Rpb24KKwkJCSAqLworCQljYXNlICdwJzoKKwkJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQkJb3B0aW5kKys7CisJCQlzZXRfb3B0aW9uKCZvcHRpb25zLCBPUFRfUFJPVE9DT0wsICZmdy5pcC5pbnZmbGFncywKKwkJCQkgICBpbnZlcnQpOworCisJCQkvKiBDYW5vbmljYWxpemUgaW50byBsb3dlciBjYXNlICovCisJCQlmb3IgKHByb3RvY29sID0gYXJndltvcHRpbmQtMV07ICpwcm90b2NvbDsgcHJvdG9jb2wrKykKKwkJCQkqcHJvdG9jb2wgPSB0b2xvd2VyKCpwcm90b2NvbCk7CisKKwkJCXByb3RvY29sID0gYXJndltvcHRpbmQtMV07CisJCQlmdy5pcC5wcm90byA9IHBhcnNlX3Byb3RvY29sKHByb3RvY29sKTsKKworCQkJaWYgKGZ3LmlwLnByb3RvID09IDAKKwkJCSAgICAmJiAoZncuaXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkKKwkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCQkgICAicnVsZSB3b3VsZCBuZXZlciBtYXRjaCBwcm90b2NvbCIpOworCQkJZncubmZjYWNoZSB8PSBORkNfSVBfUFJPVE87CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQkJb3B0aW5kKys7CisJCQlzZXRfb3B0aW9uKCZvcHRpb25zLCBPUFRfU09VUkNFLCAmZncuaXAuaW52ZmxhZ3MsCisJCQkJICAgaW52ZXJ0KTsKKwkJCXNob3N0bmV0d29ya21hc2sgPSBhcmd2W29wdGluZC0xXTsKKwkJCWZ3Lm5mY2FjaGUgfD0gTkZDX0lQX1NSQzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCQlvcHRpbmQrKzsKKwkJCXNldF9vcHRpb24oJm9wdGlvbnMsIE9QVF9ERVNUSU5BVElPTiwgJmZ3LmlwLmludmZsYWdzLAorCQkJCSAgIGludmVydCk7CisJCQlkaG9zdG5ldHdvcmttYXNrID0gYXJndltvcHRpbmQtMV07CisJCQlmdy5uZmNhY2hlIHw9IE5GQ19JUF9EU1Q7CisJCQlicmVhazsKKworCQljYXNlICdqJzoKKwkJCXNldF9vcHRpb24oJm9wdGlvbnMsIE9QVF9KVU1QLCAmZncuaXAuaW52ZmxhZ3MsCisJCQkJICAgaW52ZXJ0KTsKKwkJCWp1bXB0byA9IHBhcnNlX3RhcmdldChvcHRhcmcpOworCQkJdGFyZ2V0ID0gZmluZF90YXJnZXQoanVtcHRvLCAxKTsKKworCQkJaWYgKHRhcmdldCkgeworCQkJCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0KQorCQkJCQkrIElQVF9BTElHTih0YXJnZXQtPnNpemUpOworCisJCQkJdGFyZ2V0LT50ID0gZndfY2FsbG9jKHNpemUsIDEpOworCQkJCXRhcmdldC0+dC0+dGFyZ2V0X3NpemUgPSBzaXplOworCQkJCXN0cmNweSh0YXJnZXQtPnQtPnUubmFtZSwganVtcHRvKTsKKwkJCQl0YXJnZXQtPmluaXQodGFyZ2V0LT50LCAmZncubmZjYWNoZSk7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgJ2knOgorCQkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKKwkJCQlvcHRpbmQrKzsKKwkJCXNldF9vcHRpb24oJm9wdGlvbnMsIE9QVF9WSUFOQU1FSU4sICZmdy5pcC5pbnZmbGFncywKKwkJCQkgICBpbnZlcnQpOworCQkJcGFyc2VfaW50ZXJmYWNlKGFyZ3Zbb3B0aW5kLTFdLAorCQkJCQlmdy5pcC5pbmlmYWNlLAorCQkJCQlmdy5pcC5pbmlmYWNlX21hc2spOworCQkJZncubmZjYWNoZSB8PSBORkNfSVBfSUZfSU47CisJCQlicmVhazsKKworCQljYXNlICdvJzoKKwkJCWlmIChjaGVja19pbnZlcnNlKG9wdGFyZywgJmludmVydCkpCisJCQkJb3B0aW5kKys7CisJCQlzZXRfb3B0aW9uKCZvcHRpb25zLCBPUFRfVklBTkFNRU9VVCwgJmZ3LmlwLmludmZsYWdzLAorCQkJCSAgIGludmVydCk7CisJCQlwYXJzZV9pbnRlcmZhY2UoYXJndltvcHRpbmQtMV0sCisJCQkJCWZ3LmlwLm91dGlmYWNlLAorCQkJCQlmdy5pcC5vdXRpZmFjZV9tYXNrKTsKKwkJCWZ3Lm5mY2FjaGUgfD0gTkZDX0lQX0lGX09VVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2YnOgorCQkJc2V0X29wdGlvbigmb3B0aW9ucywgT1BUX0ZSQUdNRU5ULCAmZncuaXAuaW52ZmxhZ3MsCisJCQkJICAgaW52ZXJ0KTsKKwkJCWZ3LmlwLmZsYWdzIHw9IElQVF9GX0ZSQUc7CisJCQlmdy5uZmNhY2hlIHw9IE5GQ19JUF9GUkFHOworCQkJYnJlYWs7CisKKwkJY2FzZSAndic6CisJCQlpZiAoIXZlcmJvc2UpCisJCQkJc2V0X29wdGlvbigmb3B0aW9ucywgT1BUX1ZFUkJPU0UsCisJCQkJCSAgICZmdy5pcC5pbnZmbGFncywgaW52ZXJ0KTsKKwkJCXZlcmJvc2UrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ20nOgorCQkJaWYgKGludmVydCkKKwkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCQkgICAidW5leHBlY3RlZCAhIGZsYWcgYmVmb3JlIC0tbWF0Y2giKTsKKworCQkJbSA9IGZpbmRfbWF0Y2gob3B0YXJnLCAxKTsKKwkJCWlmICghbSkKKwkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCQkgICAiQ291bGRuJ3QgbG9hZCBtYXRjaCBgJXMnIiwgb3B0YXJnKTsKKwkJCWVsc2UgeworCQkJCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2gpCisJCQkJCSsgSVBUX0FMSUdOKG0tPnNpemUpOworCQkJCW0tPm0gPSBmd19jYWxsb2Moc2l6ZSwgMSk7CisJCQkJbS0+bS0+bWF0Y2hfc2l6ZSA9IHNpemU7CisJCQkJc3RyY3B5KG0tPm0tPnUubmFtZSwgb3B0YXJnKTsKKwkJCQltLT5pbml0KG0tPm0sICZmdy5uZmNhY2hlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ24nOgorCQkJc2V0X29wdGlvbigmb3B0aW9ucywgT1BUX05VTUVSSUMsICZmdy5pcC5pbnZmbGFncywKKwkJCQkgICBpbnZlcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAndCc6CisJCQlpZiAoaW52ZXJ0KQorCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJ1bmV4cGVjdGVkICEgZmxhZyBiZWZvcmUgLS10YWJsZSIpOworCQkJKnRhYmxlID0gYXJndltvcHRpbmQtMV07CisJCQlicmVhazsKKworCQljYXNlICd4JzoKKwkJCXNldF9vcHRpb24oJm9wdGlvbnMsIE9QVF9FWFBBTkRFRCwgJmZ3LmlwLmludmZsYWdzLAorCQkJCSAgIGludmVydCk7CisJCQlicmVhazsKKworCQljYXNlICdWJzoKKwkJCWlmIChpbnZlcnQpCisJCQkJcHJpbnRmKCJOb3QgJXMgOy0pXG4iLCBwcm9ncmFtX3ZlcnNpb24pOworCQkJZWxzZQorCQkJCXByaW50ZigiJXMgdiVzXG4iLAorCQkJCSAgICAgICBwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbik7CisJCQlleGl0KDApOworCisJCWNhc2UgJzAnOgorCQkJc2V0X29wdGlvbigmb3B0aW9ucywgT1BUX0xJTkVOVU1CRVJTLCAmZncuaXAuaW52ZmxhZ3MsCisJCQkJICAgaW52ZXJ0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgMTogLyogbm9uIG9wdGlvbiAqLworCQkJaWYgKG9wdGFyZ1swXSA9PSAnIScgJiYgb3B0YXJnWzFdID09ICdcMCcpIHsKKwkJCQlpZiAoaW52ZXJ0KQorCQkJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJCQkJICAgIm11bHRpcGxlIGNvbnNlY3V0aXZlICEgbm90IgorCQkJCQkJICAgIiBhbGxvd2VkIik7CisJCQkJaW52ZXJ0ID0gVFJVRTsKKwkJCQlvcHRhcmdbMF0gPSAnXDAnOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZXhpdF90cnloZWxwKDIpOworCisJCWRlZmF1bHQ6CisJCQkvKiBGSVhNRTogVGhpcyBzY2hlbWUgZG9lc24ndCBhbGxvdyB0d28gb2YgdGhlIHNhbWUKKwkJCSAgIG1hdGNoZXMgLS1SUiAqLworCQkJaWYgKCF0YXJnZXQKKwkJCSAgICB8fCAhKHRhcmdldC0+cGFyc2UoYyAtIHRhcmdldC0+b3B0aW9uX29mZnNldCwKKwkJCQkJICAgICAgIGFyZ3YsIGludmVydCwKKwkJCQkJICAgICAgICZ0YXJnZXQtPnRmbGFncywKKwkJCQkJICAgICAgICZmdywgJnRhcmdldC0+dCkpKSB7CisJCQkJZm9yIChtID0gaXB0YWJsZXNfbWF0Y2hlczsgbTsgbSA9IG0tPm5leHQpIHsKKwkJCQkJaWYgKG0tPnBhcnNlKGMgLSBtLT5vcHRpb25fb2Zmc2V0LAorCQkJCQkJICAgICBhcmd2LCBpbnZlcnQsCisJCQkJCQkgICAgICZtLT5tZmxhZ3MsCisJCQkJCQkgICAgICZmdywKKwkJCQkJCSAgICAgJmZ3Lm5mY2FjaGUsCisJCQkJCQkgICAgICZtLT5tKSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIElmIHlvdSBsaXN0ZW4gY2FyZWZ1bGx5LCB5b3UgY2FuCisJCQkJICAgYWN1YWxseSBoZWFyIHRoaXMgY29kZSBzdWNrLiAqLworCQkJCWlmICghaXB0YWJsZXNfbWF0Y2hlcworCQkJCSAgICAmJiBwcm90b2NvbAorCQkJCSAgICAmJiAobSA9IGZpbmRfbWF0Y2gocHJvdG9jb2wsIDEpKSkgeworCQkJCQkvKiBUcnkgbG9hZGluZyBwcm90b2NvbCAqLworCQkJCQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoKQorCQkJCQkJKyBJUFRfQUxJR04obS0+c2l6ZSk7CisKKwkJCQkJbS0+bSA9IGZ3X2NhbGxvYyhzaXplLCAxKTsKKwkJCQkJbS0+bS0+bWF0Y2hfc2l6ZSA9IHNpemU7CisJCQkJCXN0cmNweShtLT5tLT51Lm5hbWUsIHByb3RvY29sKTsKKwkJCQkJbS0+aW5pdChtLT5tLCAmZncubmZjYWNoZSk7CisKKwkJCQkJb3B0aW5kLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoIW0pCisJCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCQkgICAiVW5rbm93biBhcmcgYCVzJyIsCisJCQkJCQkgICBhcmd2W29wdGluZC0xXSk7CisJCQl9CisJCX0KKwkJaW52ZXJ0ID0gRkFMU0U7CisJfQorCisJZm9yIChtID0gaXB0YWJsZXNfbWF0Y2hlczsgbTsgbSA9IG0tPm5leHQpCisJCW0tPmZpbmFsX2NoZWNrKG0tPm1mbGFncyk7CisJaWYgKHRhcmdldCkKKwkJdGFyZ2V0LT5maW5hbF9jaGVjayh0YXJnZXQtPnRmbGFncyk7CisKKwkvKiBGaXggbWU6IG11c3QgcHV0IGludmVyc2Ugb3B0aW9ucyBjaGVja2luZyBoZXJlIC0tTU4gKi8KKworCWlmIChvcHRpbmQgPCBhcmdjKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgInVua25vd24gYXJndW1lbnRzIGZvdW5kIG9uIGNvbW1hbmRsaW5lIik7CisJaWYgKCFjb21tYW5kKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAibm8gY29tbWFuZCBzcGVjaWZpZWQiKTsKKwlpZiAoaW52ZXJ0KQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgIm5vdGhpbmcgYXBwcm9wcmlhdGUgZm9sbG93aW5nICEiKTsKKworCWlmIChjb21tYW5kICYgKENNRF9SRVBMQUNFIHwgQ01EX0lOU0VSVCB8IENNRF9ERUxFVEUgfCBDTURfQVBQRU5EKSkgeworCQlpZiAoIShvcHRpb25zICYgT1BUX0RFU1RJTkFUSU9OKSkKKwkJCWRob3N0bmV0d29ya21hc2sgPSAiMC4wLjAuMC8wIjsKKwkJaWYgKCEob3B0aW9ucyAmIE9QVF9TT1VSQ0UpKQorCQkJc2hvc3RuZXR3b3JrbWFzayA9ICIwLjAuMC4wLzAiOworCX0KKworCWlmIChzaG9zdG5ldHdvcmttYXNrKQorCQlwYXJzZV9ob3N0bmV0d29ya21hc2soc2hvc3RuZXR3b3JrbWFzaywgJnNhZGRycywKKwkJCQkgICAgICAmKGZ3LmlwLnNtc2spLCAmbnNhZGRycyk7CisKKwlpZiAoZGhvc3RuZXR3b3JrbWFzaykKKwkJcGFyc2VfaG9zdG5ldHdvcmttYXNrKGRob3N0bmV0d29ya21hc2ssICZkYWRkcnMsCisJCQkJICAgICAgJihmdy5pcC5kbXNrKSwgJm5kYWRkcnMpOworCisJaWYgKChuc2FkZHJzID4gMSB8fCBuZGFkZHJzID4gMSkgJiYKKwkgICAgKGZ3LmlwLmludmZsYWdzICYgKElQVF9JTlZfU1JDSVAgfCBJUFRfSU5WX0RTVElQKSkpCisJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICIhIG5vdCBhbGxvd2VkIHdpdGggbXVsdGlwbGUiCisJCQkgICAiIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzZXMiKTsKKworCWlmIChjb21tYW5kID09IENNRF9DSEVDSyAmJiBmdy5pcC5pbnZmbGFncyAhPSAwKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAiISBub3QgYWxsb3dlZCB3aXRoIC0lYyIsCisJCQkgICBjbWQyY2hhcihDTURfQ0hFQ0spKTsKKworCWlmIChjb21tYW5kID09IENNRF9SRVBMQUNFICYmIChuc2FkZHJzICE9IDEgfHwgbmRhZGRycyAhPSAxKSkKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwgIlJlcGxhY2VtZW50IHJ1bGUgZG9lcyBub3QgIgorCQkJICAgInNwZWNpZnkgYSB1bmlxdWUgYWRkcmVzcyIpOworCisJZ2VuZXJpY19vcHRfY2hlY2soY29tbWFuZCwgb3B0aW9ucyk7CisKKwlpZiAoY2hhaW4gJiYgc3RybGVuKGNoYWluKSA+IElQVF9GVU5DVElPTl9NQVhOQU1FTEVOKQorCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAorCQkJICAgImNoYWluIG5hbWUgYCVzJyB0b28gbG9uZyAobXVzdCBiZSB1bmRlciAlaSBjaGFycykiLAorCQkJICAgY2hhaW4sIElQVF9GVU5DVElPTl9NQVhOQU1FTEVOKTsKKworCSpoYW5kbGUgPSBpcHRjX2luaXQoKnRhYmxlKTsKKwlpZiAoISpoYW5kbGUpCisJCWV4aXRfZXJyb3IoVkVSU0lPTl9QUk9CTEVNLAorCQkJICAgImNhbid0IGluaXRpYWxpemUgaXB0YWJsZXMgdGFibGUgYCVzJzogJXMiLAorCQkJICAgKnRhYmxlLCBpcHRjX3N0cmVycm9yKGVycm5vKSk7CisKKwlpZiAoY29tbWFuZCA9PSBDTURfQVBQRU5ECisJICAgIHx8IGNvbW1hbmQgPT0gQ01EX0RFTEVURQorCSAgICB8fCBjb21tYW5kID09IENNRF9JTlNFUlQKKwkgICAgfHwgY29tbWFuZCA9PSBDTURfUkVQTEFDRSkgeworCQkvKiAtbyBub3QgdmFsaWQgd2l0aCBpbmNvbWluZyBwYWNrZXRzLiAqLworCQlpZiAob3B0aW9ucyAmIE9QVF9WSUFOQU1FT1VUKQorCQkJaWYgKHN0cmNtcChjaGFpbiwgIlBSRVJPVVRJTkciKSA9PSAwCisJCSAgICAJICAgIHx8IHN0cmNtcChjaGFpbiwgIklOUFVUIikgPT0gMCkgeworCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJDYW4ndCB1c2UgLSVjIHdpdGggJXNcbiIsCisJCQkJCSAgIG9wdDJjaGFyKE9QVF9WSUFOQU1FT1VUKSwKKwkJCQkJICAgY2hhaW4pOworCQl9CisKKwkJLyogLWkgbm90IHZhbGlkIHdpdGggb3V0Z29pbmcgcGFja2V0cyAqLworCQlpZiAob3B0aW9ucyAmIE9QVF9WSUFOQU1FSU4pCisJCQlpZiAoc3RyY21wKGNoYWluLCAiUE9TVFJPVVRJTkciKSA9PSAwCisJCQkgICAgfHwgc3RyY21wKGNoYWluLCAiT1VUUFVUIikgPT0gMCkgeworCQkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCisJCQkJCSAgICJDYW4ndCB1c2UgLSVjIHdpdGggJXNcbiIsCisJCQkJCSAgIG9wdDJjaGFyKE9QVF9WSUFOQU1FSU4pLAorCQkJCQkgICBjaGFpbik7CisJCX0KKworCQlpZiAodGFyZ2V0ICYmIGlwdGNfaXNfY2hhaW4oanVtcHRvLCAqaGFuZGxlKSkgeworCQkJcHJpbnRmKCJXYXJuaW5nOiB1c2luZyBjaGFpbiAlcywgbm90IGV4dGVuc2lvblxuIiwKKwkJCSAgICAgICBqdW1wdG8pOworCisJCQl0YXJnZXQgPSBOVUxMOworCQl9CisKKwkJLyogSWYgdGhleSBkaWRuJ3Qgc3BlY2lmeSBhIHRhcmdldCwgb3IgaXQncyBhIGNoYWluCisJCSAgIG5hbWUsIHVzZSBzdGFuZGFyZC4gKi8KKwkJaWYgKCF0YXJnZXQKKwkJICAgICYmIChzdHJsZW4oanVtcHRvKSA9PSAwCisJCQl8fCBpcHRjX2lzX2NoYWluKGp1bXB0bywgKmhhbmRsZSkpKSB7CisJCQlzaXplX3Qgc2l6ZTsKKwkJCXRhcmdldCA9IGZpbmRfdGFyZ2V0KElQVF9TVEFOREFSRF9UQVJHRVQsIDEpOworCisJCQlpZiAoIXRhcmdldCkKKwkJCQlleGl0X2Vycm9yKE9USEVSX1BST0JMRU0sCisJCQkJCSAgICJDYW4ndCBmaW5kIHN0YW5kYXJkIHRhcmdldFxuIik7CisKKwkJCXNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQpCisJCQkJKyBJUFRfQUxJR04odGFyZ2V0LT5zaXplKTsKKwkJCXRhcmdldC0+dCA9IGZ3X2NhbGxvYyhzaXplLCAxKTsKKwkJCXRhcmdldC0+dC0+dGFyZ2V0X3NpemUgPSBzaXplOworCQkJc3RyY3B5KHRhcmdldC0+dC0+dS5uYW1lLCBqdW1wdG8pOworCQkJdGFyZ2V0LT5pbml0KHRhcmdldC0+dCwgJmZ3Lm5mY2FjaGUpOworCQl9CisKKwkJaWYgKCF0YXJnZXQpIHsJCisJCQlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCB1bmtub3duX3RhcmdldDsKKwkKKwkJCS8qIERvbid0IGtub3cgaXQuICBNdXN0IGJlIGV4dGVuc2lvbiB3aXRoIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPyAqLworCQkJdW5rbm93bl90YXJnZXQudGFyZ2V0X3NpemUgPSBzaXplb2YodW5rbm93bl90YXJnZXQpOworCQkJc3RyY3B5KHVua25vd25fdGFyZ2V0LnUubmFtZSwganVtcHRvKTsKKworCQkJZSA9IGdlbmVyYXRlX2VudHJ5KCZmdywgaXB0YWJsZXNfbWF0Y2hlcywKKwkJCQkJICAgJnVua25vd25fdGFyZ2V0KTsKKwkJfSBlbHNlIHsKKwkJCWUgPSBnZW5lcmF0ZV9lbnRyeSgmZncsIGlwdGFibGVzX21hdGNoZXMsIHRhcmdldC0+dCk7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIENNRF9BUFBFTkQ6CisJCXJldCA9IGFwcGVuZF9lbnRyeShjaGFpbiwgZSwKKwkJCQkgICBuc2FkZHJzLCBzYWRkcnMsIG5kYWRkcnMsIGRhZGRycywKKwkJCQkgICBvcHRpb25zJk9QVF9WRVJCT1NFLAorCQkJCSAgIGhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NIRUNLOgorCQlyZXQgPSBjaGVja19wYWNrZXQoY2hhaW4sIGUsCisJCQkJICAgbnNhZGRycywgc2FkZHJzLCBuZGFkZHJzLCBkYWRkcnMsCisJCQkJICAgb3B0aW9ucyZPUFRfVkVSQk9TRSwgaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfREVMRVRFOgorCQlyZXQgPSBkZWxldGVfZW50cnkoY2hhaW4sIGUsCisJCQkJICAgbnNhZGRycywgc2FkZHJzLCBuZGFkZHJzLCBkYWRkcnMsCisJCQkJICAgb3B0aW9ucyZPUFRfVkVSQk9TRSwKKwkJCQkgICBoYW5kbGUpOworCQlicmVhazsKKwljYXNlIENNRF9ERUxFVEVfTlVNOgorCQlyZXQgPSBpcHRjX2RlbGV0ZV9udW1fZW50cnkoY2hhaW4sIHJ1bGVudW0gLSAxLCBoYW5kbGUpOworCQlicmVhazsKKwljYXNlIENNRF9SRVBMQUNFOgorCQlyZXQgPSByZXBsYWNlX2VudHJ5KGNoYWluLCBlLCBydWxlbnVtIC0gMSwKKwkJCQkgICAgc2FkZHJzLCBkYWRkcnMsIG9wdGlvbnMmT1BUX1ZFUkJPU0UsCisJCQkJICAgIGhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0lOU0VSVDoKKwkJcmV0ID0gaW5zZXJ0X2VudHJ5KGNoYWluLCBlLCBydWxlbnVtIC0gMSwKKwkJCQkgICBuc2FkZHJzLCBzYWRkcnMsIG5kYWRkcnMsIGRhZGRycywKKwkJCQkgICBvcHRpb25zJk9QVF9WRVJCT1NFLAorCQkJCSAgIGhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0xJU1Q6CisJCXJldCA9IGxpc3RfZW50cmllcyhjaGFpbiwKKwkJCQkgICBvcHRpb25zJk9QVF9WRVJCT1NFLAorCQkJCSAgIG9wdGlvbnMmT1BUX05VTUVSSUMsCisJCQkJICAgb3B0aW9ucyZPUFRfRVhQQU5ERUQsCisJCQkJICAgb3B0aW9ucyZPUFRfTElORU5VTUJFUlMsCisJCQkJICAgaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRkxVU0g6CisJCXJldCA9IGZsdXNoX2VudHJpZXMoY2hhaW4sIG9wdGlvbnMmT1BUX1ZFUkJPU0UsIGhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgQ01EX1pFUk86CisJCXJldCA9IHplcm9fZW50cmllcyhjaGFpbiwgb3B0aW9ucyZPUFRfVkVSQk9TRSwgaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfTElTVHxDTURfWkVSTzoKKwkJcmV0ID0gbGlzdF9lbnRyaWVzKGNoYWluLAorCQkJCSAgIG9wdGlvbnMmT1BUX1ZFUkJPU0UsCisJCQkJICAgb3B0aW9ucyZPUFRfTlVNRVJJQywKKwkJCQkgICBvcHRpb25zJk9QVF9FWFBBTkRFRCwKKwkJCQkgICBvcHRpb25zJk9QVF9MSU5FTlVNQkVSUywKKwkJCQkgICBoYW5kbGUpOworCQlpZiAocmV0KQorCQkJcmV0ID0gemVyb19lbnRyaWVzKGNoYWluLAorCQkJCQkgICBvcHRpb25zJk9QVF9WRVJCT1NFLCBoYW5kbGUpOworCQlicmVhazsKKwljYXNlIENNRF9ORVdfQ0hBSU46CisJCXJldCA9IGlwdGNfY3JlYXRlX2NoYWluKGNoYWluLCBoYW5kbGUpOworCQlicmVhazsKKwljYXNlIENNRF9ERUxFVEVfQ0hBSU46CisJCXJldCA9IGRlbGV0ZV9jaGFpbihjaGFpbiwgb3B0aW9ucyZPUFRfVkVSQk9TRSwgaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfUkVOQU1FX0NIQUlOOgorCQlyZXQgPSBpcHRjX3JlbmFtZV9jaGFpbihjaGFpbiwgbmV3bmFtZSwJaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfU0VUX1BPTElDWToKKwkJcmV0ID0gaXB0Y19zZXRfcG9saWN5KGNoYWluLCBwb2xpY3ksIGhhbmRsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzLi4uICovCisJCWV4aXRfdHJ5aGVscCgyKTsKKwl9CisKKwlpZiAodmVyYm9zZSA+IDEpCisJCWR1bXBfZW50cmllcygqaGFuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJpcHEvSVBRLm5vdGVzLnR4dCBiL2xpYmlwcS9JUFEubm90ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTQ3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpcHEvSVBRLm5vdGVzLnR4dApAQCAtMCwwICsxLDExOCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJUHY0IFF1ZXVpbmcgRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGU6IHRoaXMgZmlsZSBpcyB0ZW1wb3JhcnkgdW50aWwgdGhlIGRvY3VtZW50YXRpb24gaXMgY29tcGxldGUuCisKK1VwZ3JhZGUgaW5mb3JtYXRpb246CisJKiBJZiB1cGdyYWRpbmcgZnJvbSB0aGUgcXVldWUgZGV2aWNlICh2MC45MC40IG9yIGJlbG93KSwgeW91IHdpbGwgbmVlZCB0bworCSAgZGVsZXRlIHRoZSBvbGQgc2hhcmVkIGxpYnJhcnksIHVzdWFsbHkgZm91bmQgaW4KKwkgIC91c3IvbG9jYWwvbGliL2lwdGFibGVzL2xpYmlwdF9RVUVVRS5zbworCQorVE9ETyBMaXN0OgorCSogTm9uLWJsb2NraW5nIGkvbyBmb3IgdXNlcnNwYWNlIGFwaQorCSogQnVmZmVyZWQgdmVyZGljdHMKKwkqIFJlc2NoZWR1bGUgcHJvY2Vzc2luZyBpZiB1c2Vyc3BhY2UgYnVzeQorCSogQmV0dGVyIHNlc3Npb24gcmVsaWFiaWxpdHkKKwkqIFRlc3RzdWl0ZSBzY3JpcHRzLCBmaXgvaW1wcm92ZSB0b29scworCSogRG9jdW1lbnRhdGlvbgorCSogTXVsdGlwbGUgcXVldWVzIHBlciBwcm90b2NvbD8KKwkqIFBlcmZvcm1hbmNlIGFuYWx5c2lzCisJKiBVc2Vyc3BhY2UgbGFuZ3VhZ2UgYmluZGluZ3MKKworCitPdmVydmlldzoKK1RoZSBmb2xsb3dpbmcgZGlhZ3JhbSBpcyBhIGNvbmNlcHR1YWwgdmlldyBvZiBob3cgdGhlIHF1ZXVlIG9wZXJhdGVzOgorCisgKy0tLS0tLS0tLSsKKyB8ICBRVUVVRSAgfAorICstLS0tLS0tLS0rCisgfCAgICAgICAgIHwKKyB8ICArLS0tKyAgfCAtLT4gZGVxdWV1ZSgpIC0tPiBuZl9yZWluamVjdCgpIFtzdGFja10KKyB8ICB8IFYgfCAgfAorIHwgICstLS0rICB8CisgfCAgICAgICAgIHwKKyB8ICArLS0tKyAgfAorIHwgIHwgVyB8ICB8CisgfCAgKy0tLSsgIHwKKyB8ICAgICAgICAgfAorIHwgICstLS0rICB8IAorIHwgIHwgViB8ICB8CisgfCAgKy0tLSsgIHwKKyB8ICAgICAgICAgfAorIHwgICstLS0rICB8CisgfCAgfCBWIHwgIHwgPC0tIHNldF92ZXJkaWN0KCkgW3VzZXJdCisgfCAgKy0tLSsgIHwKKyB8ICAgICAgICAgfAorIHwgICstLS0rICB8IAorIHwgIHwgVyB8ICB8IAorIHwgICstLS0rICB8CisgfCAgICAgICAgIHwKKyB8ICArLS0tKyAgfAorIHwgIHwgTiB8ICB8IC0tPiBub3RpZnlfdXNlcigpIFt1c2VyXQorIHwgICstLS0rICB8CisgfCAgICAgICAgIHwKKyArLS0tLS0tLS0tKyA8LS0gc2V0X21vZGUoKSAgW3VzZXJdCisgICAgICBeCisgICAgICB8CisgICBlbnF1ZXVlKCkgCisgICAgICBeCisgICAgICB8IAorICAgbmZfcXVldWUoKSBbc3RhY2tdCisgIAorCitUaGUgcXVldWUgaXMgcHJvY2Vzc2VkIHZpYSBhIGtlcm5lbCB0aHJlYWQsIHdoaWNoIGlzIHdva2VuIHVwIHVwb24gZW5xdWV1ZSgpCitzZXRfbW9kZSgpIGFuZCBzZXRfdmVyZGljdCgpLgorCitBcyB0aGUgcXVldWUgaXMgbW9kYWwsIGFuZCBuZXRsaW5rIGlzIGNvbm5lY3Rpb25sZXNzLCBhIHJlYXNvbmFibGUgYW1vdW50IG9mCitzdGF0ZSBuZWVkcyB0byBiZSBtYWludGFpbmVkLgorIAorUGFja2V0IHN0YXRlczoKK04gPSBuZXcgcGFja2V0IChkZWZhdWx0IGluaXRpYWwgc3RhdGUpCitXID0gdXNlciBub3RmaWVkLCB3YWl0aW5nIGZvciB2ZXJkaWN0CitWID0gdmVyZGljdCBzZXQgKHVzdWFsbHkgYnkgdXNlcikKKworUXVldWUgc3RhdGVzIChzZXR0YWJsZSBieSB1c2VyKToKKyogSE9MRCAoZGVmYXVsdCBpbml0aWFsIHN0YXRlKQorZW5xdWV1ZSBwYWNrZXRzCitkbyBub3Qgbm90aWZ5IHVzZXIKK2RvIG5vdCBhY2NlcHQgdmVyZGljdHMKK2RvIG5vdCBkZXF1ZXVlIHBhY2tldHMKKworKiBOT1JNQUwKK2VucXVldWUgcGFja2V0cworbm90aWZ5IHVzZXIgb2YgbmV3IHBhY2tldHMgKG1heSBjb3B5IGVudGlyZSBwYWNrZXQpCithY2NlcHQgdmVyZGljdHMgZnJvbSB1c2VyIChtYXkgaW5jbHVkZSBtb2RpZmllZCBwYWNrZXQpCitkZXF1ZXVlIHBhY2tldHMKKworKiBGTFVTSCAocmV0dXJucyB0byBIT0xEIHdoZW4gcXVldWUgaXMgZW1wdHksIHVubGVzcyB0ZXJtaW5hdGluZykKK2RvIG5vdCBlbnF1ZXVlIHBhY2tldHMKK2RvIG5vdCBub3Qgbm90aWZ5IHVzZXIKK3NldCB2ZXJkaWN0cyBvbiBhbGwgcGFja2V0cyB0byBORl9EUk9QCitkZXF1ZXVlIGFsbCBwYWNrZXRzIGZvciBkcm9wcGluZworCitOb3RlIHRoYXQgZm9yIEhPTEQgJiBOT1JNQUwgcXVldWUgc3RhdGVzLCBuZXcgcGFja2V0cyBhcmUgZHJvcHBlZCBpZiB0aGUgCitxdWV1ZSBpcyBmdWxsLgorCitLbm93biBidWdzOgorLSBVc2Vyc3BhY2UgYXBwIGdldHMgdW5rbm93biBtZXNzYWdlIGZyb20ga2VybmVsIGlmIGl0IHNlbmRzIGFuIGludmFsaWQKKyAgbWVzc2FnZSB0eXBlIChzaG91bGQgZ2V0IGFuIE5MTVNHX0VSUk9SKS4KKyAgCitEb2N1bWVudGF0aW9uIG5vdGVzOgorbGliaXBxOgorLSBRdWV1ZSBpcyBoZWxkIGFmdGVyIGZsdXNoIGNvbXBsZXRlcywgdXNlciBtdXN0IGVpdGhlciBzdGFydCBjb3B5aW5nIAorICBvciBzaHV0ZG93biBvciB0aGUgcXVldWUgd2lsbCBmaWxsIHVwLgorICAKKy0gSWYgeW91IGdldCBhIElQUV9FUlJfUlRSVU5DIG1lc3NhZ2UsIHlvdXIgbG9jYWwgcmVjZWl2ZQorICBidWZmZXIgaXMgcHJvYmFibHkgdG9vIHNtYWxsLiAgTmV0bGluayBoYXMgbm8gd2F5IG9mIGRldGVjdGluZworICB0aGlzLCBhbmQgdGhpbmtzIHRoZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgKHRlY2huaWNhbGx5LCBpdCB3YXMsCisgIHRvIHlvdXIgKnNvY2tldCogcmVjZWl2ZSBidWZmZXIgdGhvdWdoKS4gIFRodXMgeW91IG5lZWQgdG8gcmVzcG9uZAorICB3aXRoIGFuIE5GX0RST1AgZm9yIHRoZSBwYWNrZXQgYW5kIHVzZSBhIGJpZ2dlciBidWZmZXIuCisgIAorLSBJZiB5b3UgbW9kaWZ5IGEgcGFja2V0LCB5b3UgbXVzdCByZWNhbGN1bGF0ZSBjaGVja3N1bXMgYXMgCisgIGFwcHJvcHJpYXRlIGJlZm9yZSBzZW5kaW5nIGl0IGJhY2suCisKKy0gVGhlIGNvZGUgd29udCBzdG9wIHlvdSBmcm9tIGRvaW5nIHRoaXMsIGJ1dCB0cnkgbm90IHRvIHNldCBORl9RVUVVRQorICB2ZXJkaWN0IG9uIHBhY2tldHMuCisKKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJpcHEvTWFrZWZpbGUgYi9saWJpcHEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZTVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlwcS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjISAvdXNyL2Jpbi9tYWtlCisKK0VYVFJBUys9bGliaXBxL2xpYmlwcS5hCisjQ0ZMQUdTKz0tRERFQlVHX0xJQklQVFEKKworaWZuZGVmIFRPUExFVkVMX0lOQ0xVREVECitsb2NhbDoKKwljZCAuLiAmJiAkKE1BS0UpICQoU0hBUkVEX0xJQlMpICQoRVhUUkFTKQorZWxzZQorbGliaXBxL2xpYmlwcS5hOiBsaWJpcHEvbGliaXBxLmEobGliaXBxL2xpYmlwcS5vKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmlwcS9saWJpcHEuYyBiL2xpYmlwcS9saWJpcHEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU0YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliaXBxL2xpYmlwcS5jCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogbGliaXBxLmMKKyAqCisgKiBJUFEgdXNlcnNwYWNlIGxpYnJhcnkuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGxpYnJhcnkgaXMgc3RpbGwgZGV2ZWxvcG1lbnRhbCwgYW5kIHRoZXJlIG1heQorICogYmUgc29tZSBBUEkgY2hhbmdlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICAgICAKKyNpbmNsdWRlIDxsaWJpcHEvbGliaXBxLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJpdmF0ZSBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSB7CisJSVBRX0VSUl9OT05FID0gMCwKKwlJUFFfRVJSX0lNUEwsCisJSVBRX0VSUl9IQU5ETEUsCisJSVBRX0VSUl9TT0NLRVQsCisJSVBRX0VSUl9CSU5ELAorCUlQUV9FUlJfQlVGRkVSLAorCUlQUV9FUlJfUkVDViwKKwlJUFFfRVJSX05MRU9GLAorCUlQUV9FUlJfQUREUkxFTiwKKwlJUFFfRVJSX1NUUlVOQywKKwlJUFFfRVJSX1JUUlVOQywKKwlJUFFfRVJSX05MUkVDViwKKwlJUFFfRVJSX1NFTkQsCisJSVBRX0VSUl9TVVBQLAorCUlQUV9FUlJfUkVDVkJVRgorfTsKKyNkZWZpbmUgSVBRX01BWEVSUiBJUFFfRVJSX1JFQ1ZCVUYKKworc3RydWN0IGlwcV9lcnJtYXBfdCB7CisJaW50IGVycmNvZGU7CisJY2hhciAqbWVzc2FnZTsKK30gaXBxX2Vycm1hcFtdID0geworCXsgSVBRX0VSUl9OT05FLCAiVW5rbm93biBlcnJvciIgfSwKKwl7IElQUV9FUlJfSU1QTCwgIkltcGxlbWVudGF0aW9uIGVycm9yIiB9LAorCXsgSVBRX0VSUl9IQU5ETEUsICJVbmFibGUgdG8gY3JlYXRlIG5ldGxpbmsgaGFuZGxlIiB9LAorCXsgSVBRX0VSUl9TT0NLRVQsICJVbmFibGUgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0IiB9LAorCXsgSVBRX0VSUl9CSU5ELCAiVW5hYmxlIHRvIGJpbmQgbmV0bGluayBzb2NrZXQiIH0sCisJeyBJUFFfRVJSX0JVRkZFUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIiIH0sCisJeyBJUFFfRVJSX1JFQ1YsICJGYWlsZWQgdG8gcmVjZWl2ZSBuZXRsaW5rIG1lc3NhZ2UiIH0sCisJeyBJUFFfRVJSX05MRU9GLCAiUmVjZWl2ZWQgRU9GIG9uIG5ldGxpbmsgc29ja2V0IiB9LAorCXsgSVBRX0VSUl9BRERSTEVOLCAiSW52YWxpZCBwZWVyIGFkZHJlc3MgbGVuZ3RoIiB9LAorCXsgSVBRX0VSUl9TVFJVTkMsICJTZW50IG1lc3NhZ2UgdHJ1bmNhdGVkIiB9LAorCXsgSVBRX0VSUl9SVFJVTkMsICJSZWNlaXZlZCBtZXNzYWdlIHRydW5jYXRlZCIgfSwKKwl7IElQUV9FUlJfTkxSRUNWLCAiUmVjZWl2ZWQgZXJyb3IgZnJvbSBuZXRsaW5rIiB9LAorCXsgSVBRX0VSUl9TRU5ELCAiRmFpbGVkIHRvIHNlbmQgbmV0bGluayBtZXNzYWdlIiB9LAorCXsgSVBRX0VSUl9TVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBJUFFfRVJSX1JFQ1ZCVUYsICJSZWNlaXZlIGJ1ZmZlciBzaXplIGludmFsaWQiIH0KK307CisKK3N0YXRpYyBpbnQgaXBxX2Vycm5vID0gSVBRX0VSUl9OT05FOworCitzdGF0aWMgc3NpemVfdCBpcHFfbmV0bGlua19zZW5kdG8oY29uc3Qgc3RydWN0IGlwcV9oYW5kbGUgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbXNnLCBzaXplX3QgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgc3NpemVfdCBpcHFfbmV0bGlua19yZWN2ZnJvbShjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgc3NpemVfdCBpcHFfbmV0bGlua19zZW5kbXNnKGNvbnN0IHN0cnVjdCBpcHFfaGFuZGxlICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbXNnaGRyICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBjaGFyICppcHFfc3RyZXJyb3IoaW50IGVycmNvZGUpOworCitzdGF0aWMgc3NpemVfdCBpcHFfbmV0bGlua19zZW5kdG8oY29uc3Qgc3RydWN0IGlwcV9oYW5kbGUgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbXNnLCBzaXplX3QgbGVuKQoreworCWludCBzdGF0dXMgPSBzZW5kdG8oaC0+ZmQsIG1zZywgbGVuLCAwLAorCSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZoLT5wZWVyLCBzaXplb2YoaC0+cGVlcikpOworCWlmIChzdGF0dXMgPCAwKQorCQlpcHFfZXJybm8gPSBJUFFfRVJSX1NFTkQ7CisJcmV0dXJuIHN0YXR1czsJCit9CisKK3N0YXRpYyBzc2l6ZV90IGlwcV9uZXRsaW5rX3NlbmRtc2coY29uc3Qgc3RydWN0IGlwcV9oYW5kbGUgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBtc2doZHIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBzdGF0dXMgPSBzZW5kbXNnKGgtPmZkLCBtc2csIGZsYWdzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJaXBxX2Vycm5vID0gSVBRX0VSUl9TRU5EOworCXJldHVybiBzdGF0dXM7CQorfQorCitzdGF0aWMgc3NpemVfdCBpcHFfbmV0bGlua19yZWN2ZnJvbShjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgYWRkcmxlbiwgc3RhdHVzOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCQorCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkgeworCQlpcHFfZXJybm8gPSBJUFFfRVJSX1JFQ1ZCVUY7CisJCXJldHVybiAtMTsKKwl9CisJYWRkcmxlbiA9IHNpemVvZihoLT5wZWVyKTsKKwlzdGF0dXMgPSByZWN2ZnJvbShoLT5mZCwgYnVmLCBsZW4sIDAsCisJICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmaC0+cGVlciwgJmFkZHJsZW4pOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWlwcV9lcnJubyA9IElQUV9FUlJfUkVDVjsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKGgtPnBlZXIpKSB7CisJCWlwcV9lcnJubyA9IElQUV9FUlJfUkVDVjsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3RhdHVzID09IDApIHsKKwkJaXBxX2Vycm5vID0gSVBRX0VSUl9OTEVPRjsKKwkJcmV0dXJuIC0xOworCX0KKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopYnVmOworCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTVNHX1RSVU5DIHx8IG5saC0+bmxtc2dfbGVuID4gc3RhdHVzKSB7CisJCWlwcV9lcnJubyA9IElQUV9FUlJfUlRSVU5DOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjaGFyICppcHFfc3RyZXJyb3IoaW50IGVycmNvZGUpCit7CisJaWYgKGVycmNvZGUgPCAwIHx8IGVycmNvZGUgPiBJUFFfTUFYRVJSKQorCQllcnJjb2RlID0gSVBRX0VSUl9JTVBMOworCXJldHVybiBpcHFfZXJybWFwW2VycmNvZGVdLm1lc3NhZ2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHVibGljIGludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGlzZSBhbiBpcHEgaGFuZGxlLgorICogRklYTUU6IGltcGxlbWVudCBmbGFncy4KKyAqLworc3RydWN0IGlwcV9oYW5kbGUgKmlwcV9jcmVhdGVfaGFuZGxlKHVfaW50MzJfdCBmbGFncykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBpcHFfaGFuZGxlICpoOworCQorCWggPSAoc3RydWN0IGlwcV9oYW5kbGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHFfaGFuZGxlKSk7CisJaWYgKGggPT0gTlVMTCkgeworCQlpcHFfZXJybm8gPSBJUFFfRVJSX0hBTkRMRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChoLCAwLCBzaXplb2Yoc3RydWN0IGlwcV9oYW5kbGUpKTsKKwloLT5mZCA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19GSVJFV0FMTCk7CisJaWYgKGgtPmZkID09IC0xKSB7CisJCWlwcV9lcnJubyA9IElQUV9FUlJfU09DS0VUOworCQljbG9zZShoLT5mZCk7CisJCWZyZWUoaCk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoJmgtPmxvY2FsLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSk7CisJaC0+bG9jYWwubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwloLT5sb2NhbC5ubF9waWQgPSBnZXRwaWQoKTsKKwloLT5sb2NhbC5ubF9ncm91cHMgPSAwOworCXN0YXR1cyA9IGJpbmQoaC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmaC0+bG9jYWwsIHNpemVvZihoLT5sb2NhbCkpOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJaXBxX2Vycm5vID0gSVBRX0VSUl9CSU5EOworCQljbG9zZShoLT5mZCk7CisJCWZyZWUoaCk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoJmgtPnBlZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpKTsKKwloLT5wZWVyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJaC0+cGVlci5ubF9waWQgPSAwOworCWgtPnBlZXIubmxfZ3JvdXBzID0gMDsKKwlyZXR1cm4gaDsKK30KKworLyoKKyAqIE5vIGVycm9yIGNvbmRpdGlvbiBpcyBjaGVja2VkIGhlcmUgYXQgdGhpcyBzdGFnZSwgYnV0IGl0IG1heSBoYXBwZW4gCisgKiBpZi93aGVuIHJlbGlhYmxlIG1lc3NhZ2luZyBpcyBpbXBsZW1lbnRlZC4KKyAqLworaW50IGlwcV9kZXN0cm95X2hhbmRsZShzdHJ1Y3QgaXBxX2hhbmRsZSAqaCkKK3sKKwlpZiAoaCkgeworCQljbG9zZShoLT5mZCk7CisJCWZyZWUoaCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaXBxX3NldF9tb2RlKGNvbnN0IHN0cnVjdCBpcHFfaGFuZGxlICpoLAorICAgICAgICAgICAgICAgICB1X2ludDhfdCBtb2RlLCBzaXplX3QgcmFuZ2UpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5saDsKKwkJaXBxX3BlZXJfbXNnX3QgcG07CisJfSByZXE7CisJCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlyZXEubmxoLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YocmVxKSk7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm5saC5ubG1zZ190eXBlID0gSVBRTV9NT0RFOworCXJlcS5ubGgubmxtc2dfcGlkID0gaC0+bG9jYWwubmxfcGlkOworCXJlcS5wbS5tc2cubW9kZS52YWx1ZSA9IG1vZGU7CisJcmVxLnBtLm1zZy5tb2RlLnJhbmdlID0gcmFuZ2U7CisJcmV0dXJuIGlwcV9uZXRsaW5rX3NlbmR0byhoLCAodm9pZCAqKSZyZXEsIHJlcS5ubGgubmxtc2dfbGVuKTsKK30KKworLyogTm90ZTogdGltZW91dCBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCitzc2l6ZV90IGlwcV9yZWFkKGNvbnN0IHN0cnVjdCBpcHFfaGFuZGxlICpoLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0KQoreworCXJldHVybiBpcHFfbmV0bGlua19yZWN2ZnJvbShoLCBidWYsIGxlbik7Cit9CisKK2ludCBpcHFfbWVzc2FnZV90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gKChzdHJ1Y3Qgbmxtc2doZHIqKWJ1ZiktPm5sbXNnX3R5cGU7Cit9CisKK2ludCBpcHFfZ2V0X21zZ2Vycihjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG5sbXNnaGRyICpoID0gKHN0cnVjdCBubG1zZ2hkciAqKWJ1ZjsKKwlzdHJ1Y3Qgbmxtc2dlcnIgKmVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEoaCk7CisJcmV0dXJuIC1lcnItPmVycm9yOworfQorCitpcHFfcGFja2V0X21zZ190ICppcHFfZ2V0X3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJcmV0dXJuIE5MTVNHX0RBVEEoKHN0cnVjdCBubG1zZ2hkciAqKShidWYpKTsKK30KKworaW50IGlwcV9zZXRfdmVyZGljdChjb25zdCBzdHJ1Y3QgaXBxX2hhbmRsZSAqaCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpZCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZlcmRpY3QsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgbnZlY3M7CisJc2l6ZV90IHRsZW47CisJc3RydWN0IG5sbXNnaGRyIG5saDsKKwlpcHFfcGVlcl9tc2dfdCBwbTsKKwlzdHJ1Y3QgaW92ZWMgaW92WzNdOworCXN0cnVjdCBtc2doZHIgbXNnOworCisJbWVtc2V0KCZubGgsIDAsIHNpemVvZihubGgpKTsKKwlubGgubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCW5saC5ubG1zZ190eXBlID0gSVBRTV9WRVJESUNUOworCW5saC5ubG1zZ19waWQgPSBoLT5sb2NhbC5ubF9waWQ7CisJbWVtc2V0KCZwbSwgMCwgc2l6ZW9mKHBtKSk7CisJcG0ubXNnLnZlcmRpY3QudmFsdWUgPSB2ZXJkaWN0OworCXBtLm1zZy52ZXJkaWN0LmlkID0gaWQ7CisJcG0ubXNnLnZlcmRpY3QuZGF0YV9sZW4gPSBkYXRhX2xlbjsKKwlpb3ZbMF0uaW92X2Jhc2UgPSAmbmxoOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKG5saCk7CisJaW92WzFdLmlvdl9iYXNlID0gJnBtOworCWlvdlsxXS5pb3ZfbGVuID0gc2l6ZW9mKHBtKTsKKwl0bGVuID0gc2l6ZW9mKG5saCkgKyBzaXplb2YocG0pOworCW52ZWNzID0gMjsKKwlpZiAoZGF0YV9sZW4gJiYgYnVmKSB7CisJCWlvdlsyXS5pb3ZfYmFzZSA9IGJ1ZjsKKwkJaW92WzJdLmlvdl9sZW4gPSBkYXRhX2xlbjsKKwkJdGxlbiArPSBkYXRhX2xlbjsKKwkJbnZlY3MrKzsKKwl9CisJbXNnLm1zZ19uYW1lID0gKHZvaWQgKikmaC0+cGVlcjsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YoaC0+cGVlcik7CisJbXNnLm1zZ19pb3YgPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSBudmVjczsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IDA7CisJbmxoLm5sbXNnX2xlbiA9IHRsZW47CisJcmV0dXJuIGlwcV9uZXRsaW5rX3NlbmRtc2coaCwgJm1zZywgMCk7Cit9CisKKy8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KK2ludCBpcHFfY3RsKGNvbnN0IHN0cnVjdCBpcHFfaGFuZGxlICpoLCBpbnQgcmVxdWVzdCwgLi4uKQoreworCXJldHVybiAxOworfQorCit2b2lkIGlwcV9wZXJyb3IoY29uc3QgY2hhciAqcykKK3sKKwlpZiAocykKKwkJZnB1dHMocywgc3RkZXJyKTsKKwllbHNlCisJCWZwdXRzKCJFUlJPUiIsIHN0ZGVycik7CisJaWYgKGlwcV9lcnJubykKKwkJZnByaW50ZihzdGRlcnIsICI6ICVzIiwgaXBxX3N0cmVycm9yKGlwcV9lcnJubykpOworCWlmIChlcnJubykKKwkJZnByaW50ZihzdGRlcnIsICI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlmcHV0YygnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvbGliaXB0Yy9NYWtlZmlsZSBiL2xpYmlwdGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiYzdiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlwdGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIyEgL3Vzci9iaW4vbWFrZQorCitFWFRSQVMrPWxpYmlwdGMvbGliaXB0Yy5hCisKK2lmbmRlZiBUT1BMRVZFTF9JTkNMVURFRAorbG9jYWw6CisJY2QgLi4gJiYgJChNQUtFKSAkKEtFUk5fVEFSR0VUUykgJChTSEFSRURfTElCUykgJChFWFRSQVMpCisKK2Vsc2UKK0VYVFJBX0RFUEVORFMrPWxpYmlwdGMvbGliaXB0Yy5kCisKK2xpYmlwdGMvbGliaXB0Yy5hOiBsaWJpcHRjL2xpYmlwdGMuYShsaWJpcHRjL2xpYmlwdGMubykKKworbGliaXB0Yy9saWJpcHRjLmQ6ICUuZDogJS5jCisJQC0kKENDKSAtTSAtTUcgJChDRkxBR1MpICQ8IHwgc2VkIC1lICdzQF4uKlwubzpAJCouZCAkKi5hOkAnID4gJEAKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJpcHRjL2xpYmlwdGMuYyBiL2xpYmlwdGMvbGliaXB0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDk3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpcHRjL2xpYmlwdGMuYwpAQCAtMCwwICsxLDE4MjggQEAKKy8qIExpYnJhcnkgd2hpY2ggbWFuaXB1bGF0ZXMgZmlyZXdhbGwgcnVsZXMuICBWZXJzaW9uIDAuMS4gKi8KKworLyogQXJjaGl0ZWN0dXJlIG9mIGZpcmV3YWxsIHJ1bGVzIGlzIGFzIGZvbGxvd3M6CisgKgorICogQ2hhaW5zIGdvIElOUFVULCBGT1JXQVJELCBPVVRQVVQgdGhlbiB1c2VyIGNoYWlucy4KKyAqIEVhY2ggdXNlciBjaGFpbiBzdGFydHMgd2l0aCBhbiBFUlJPUiBub2RlLgorICogRXZlcnkgY2hhaW4gZW5kcyB3aXRoIGFuIHVuY29uZGl0aW9uYWwganVtcDogYSBSRVRVUk4gZm9yIHVzZXIgY2hhaW5zLAorICogYW5kIGEgUE9MSUNZIGZvciBidWlsdC1pbnMuCisgKi8KKworLyogKEMpMTk5OSBQYXVsIGBgUnVzdHknJyBSdXNzZWxsIC0gUGxhY2VkIHVuZGVyIHRoZSBHTlUgR1BMIChTZWUKKyAgIENPUFlJTkcgZm9yIGRldGFpbHMpLiAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNvY2tsZW5fdDsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGliaXB0Yy9saWJpcHRjLmg+CisKKyNkZWZpbmUgSVBfVkVSU0lPTgk0CisjZGVmaW5lIElQX09GRlNFVAkweDFGRkYKKworI2lmbmRlZiBJUFRfTElCX0RJUgorI2RlZmluZSBJUFRfTElCX0RJUiAiL3Vzci9sb2NhbC9saWIvaXB0YWJsZXMiCisjZW5kaWYKKworc3RhdGljIGludCBzb2NrZmQgPSAtMTsKK3N0YXRpYyB2b2lkICppcHRjX2ZuID0gTlVMTDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmhvb2tuYW1lc1tdCis9IHsgW05GX0lQX1BSRV9ST1VUSU5HXSAgIlBSRVJPVVRJTkciLAorICAgIFtORl9JUF9MT0NBTF9JTl0gICAgICJJTlBVVCIsCisgICAgW05GX0lQX0ZPUldBUkRdICAgICAgIkZPUldBUkQiLAorICAgIFtORl9JUF9MT0NBTF9PVVRdICAgICJPVVRQVVQiLAorICAgIFtORl9JUF9QT1NUX1JPVVRJTkddICJQT1NUUk9VVElORyIKK307CisKK3N0cnVjdCBjb3VudGVyX21hcAoreworCWVudW0geworCQlDT1VOVEVSX01BUF9OT01BUCwKKwkJQ09VTlRFUl9NQVBfTk9STUFMX01BUCwKKwkJQ09VTlRFUl9NQVBfWkVST0VECisJfSBtYXB0eXBlOworCXVuc2lnbmVkIGludCBtYXBwb3M7Cit9OworCisvKiBDb252ZW5pZW5jZSBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldAoreworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0IHQ7CisJY2hhciBlcnJvcltJUFRfVEFCTEVfTUFYTkFNRUxFTl07Cit9OworCitzdHJ1Y3QgaXB0Y19oYW5kbGUKK3sKKwkvKiBIYXZlIGNoYW5nZXMgYmVlbiBtYWRlPyAqLworCWludCBjaGFuZ2VkOworCS8qIFNpemUgaW4gaGVyZSByZWZsZWN0cyBvcmlnaW5hbCBzdGF0ZS4gKi8KKwlzdHJ1Y3QgaXB0X2dldGluZm8gaW5mbzsKKworCXN0cnVjdCBjb3VudGVyX21hcCAqY291bnRlcl9tYXA7CisJLyogQXJyYXkgb2YgaG9vayBuYW1lcyAqLworCWNvbnN0IGNoYXIgKipob29rbmFtZXM7CisKKwkvKiBOdW1iZXIgaW4gaGVyZSByZWZsZWN0cyBjdXJyZW50IHN0YXRlLiAqLworCXVuc2lnbmVkIGludCBuZXdfbnVtYmVyOworCXN0cnVjdCBpcHRfZ2V0X2VudHJpZXMgZW50cmllczsKK307CisKK3N0YXRpYyB2b2lkIGRvX2NoZWNrKGlwdGNfaGFuZGxlX3QgaCwgdW5zaWduZWQgaW50IGxpbmUpOworI2RlZmluZSBDSEVDSyhoKSBkb19jaGVjaygoaCksIF9fTElORV9fKQorCitzdGF0aWMgaW5saW5lIGludAorZ2V0X251bWJlcihjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICppLAorCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKnNlZWssCisJICAgdW5zaWduZWQgaW50ICpwb3MpCit7CisJaWYgKGkgPT0gc2VlaykKKwkJcmV0dXJuIDE7CisJKCpwb3MpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2VudHJ5MmluZGV4KGNvbnN0IGlwdGNfaGFuZGxlX3QgaCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqc2VlaykKK3sKKwl1bnNpZ25lZCBpbnQgcG9zID0gMDsKKworCWlmIChJUFRfRU5UUllfSVRFUkFURShoLT5lbnRyaWVzLmVudHJpZXMsIGgtPmVudHJpZXMuc2l6ZSwKKwkJCSAgICAgIGdldF9udW1iZXIsIHNlZWssICZwb3MpID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogb2Zmc2V0ICVpIG5vdCBhbiBlbnRyeSFcbiIsCisJCQkodW5zaWduZWQgY2hhciAqKXNlZWsgLSBoLT5lbnRyaWVzLmVudHJpZXMpOworCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gcG9zOworfQorCitzdGF0aWMgaW5saW5lIGludAorZ2V0X2VudHJ5X24oc3RydWN0IGlwdF9lbnRyeSAqaSwKKwkgICAgdW5zaWduZWQgaW50IG51bWJlciwKKwkgICAgdW5zaWduZWQgaW50ICpwb3MsCisJICAgIHN0cnVjdCBpcHRfZW50cnkgKipwZSkKK3sKKwlpZiAoKnBvcyA9PSBudW1iZXIpIHsKKwkJKnBlID0gaTsKKwkJcmV0dXJuIDE7CisJfQorCSgqcG9zKSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9lbnRyeSAqCitpbmRleDJlbnRyeShpcHRjX2hhbmRsZV90IGgsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgcG9zID0gMDsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICpyZXQgPSBOVUxMOworCisJSVBUX0VOVFJZX0lURVJBVEUoaC0+ZW50cmllcy5lbnRyaWVzLCBoLT5lbnRyaWVzLnNpemUsCisJCQkgIGdldF9lbnRyeV9uLCBpbmRleCwgJnBvcywgJnJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfZW50cnkgKgorZ2V0X2VudHJ5KGlwdGNfaGFuZGxlX3QgaCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBpcHRfZW50cnkgKikoaC0+ZW50cmllcy5lbnRyaWVzICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitlbnRyeTJvZmZzZXQoY29uc3QgaXB0Y19oYW5kbGVfdCBoLCBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplKQoreworCXJldHVybiAodW5zaWduZWQgY2hhciAqKWUgLSBoLT5lbnRyaWVzLmVudHJpZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbmRleDJvZmZzZXQoaXB0Y19oYW5kbGVfdCBoLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGVudHJ5Mm9mZnNldChoLCBpbmRleDJlbnRyeShoLCBpbmRleCkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfZXJyb3JsYWJlbChpcHRjX2hhbmRsZV90IGgsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGlwdF9lbnRyeSAqZTsKKworCWUgPSBnZXRfZW50cnkoaCwgb2Zmc2V0KTsKKwlpZiAoc3RyY21wKGlwdF9nZXRfdGFyZ2V0KGUpLT51Lm5hbWUsIElQVF9FUlJPUl9UQVJHRVQpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogb2Zmc2V0ICV1IG5vdCBhbiBlcnJvciBub2RlIVxuIiwKKwkJCW9mZnNldCk7CisJCWFib3J0KCk7CisJfQorCisJcmV0dXJuIChjb25zdCBjaGFyICopaXB0X2dldF90YXJnZXQoZSktPmRhdGE7Cit9CisKKy8qIEFsbG9jYXRlIGhhbmRsZSBvZiBnaXZlbiBzaXplICovCitzdGF0aWMgaXB0Y19oYW5kbGVfdAorYWxsb2NfaGFuZGxlKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBudW1fcnVsZXMpCit7CisJc2l6ZV90IGxlbjsKKwlpcHRjX2hhbmRsZV90IGg7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGlwdGNfaGFuZGxlKQorCQkrIHNpemUKKwkJKyBudW1fcnVsZXMgKiBzaXplb2Yoc3RydWN0IGNvdW50ZXJfbWFwKTsKKworCWlmICgoaCA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloLT5jaGFuZ2VkID0gMDsKKwloLT5jb3VudGVyX21hcCA9ICh2b2lkICopaAorCQkrIHNpemVvZihzdHJ1Y3QgaXB0Y19oYW5kbGUpCisJCSsgc2l6ZTsKKwlzdHJjcHkoaC0+aW5mby5uYW1lLCB0YWJsZW5hbWUpOworCXN0cmNweShoLT5lbnRyaWVzLm5hbWUsIHRhYmxlbmFtZSk7CisKKwlyZXR1cm4gaDsKK30KKworaXB0Y19oYW5kbGVfdAoraXB0Y19pbml0KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSkKK3sKKwlpcHRjX2hhbmRsZV90IGg7CisJc3RydWN0IGlwdF9nZXRpbmZvIGluZm87CisJdW5zaWduZWQgaW50IGk7CisJaW50IHRtcDsKKwlzb2NrbGVuX3QgczsKKworCWlwdGNfZm4gPSBpcHRjX2luaXQ7CisKKwlzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKKwlpZiAoc29ja2ZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzID0gc2l6ZW9mKGluZm8pOworCWlmIChzdHJsZW4odGFibGVuYW1lKSA+PSBJUFRfVEFCTEVfTUFYTkFNRUxFTikgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN0cmNweShpbmZvLm5hbWUsIHRhYmxlbmFtZSk7CisJaWYgKGdldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQLCBJUFRfU09fR0VUX0lORk8sICZpbmZvLCAmcykgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoaCA9IGFsbG9jX2hhbmRsZShpbmZvLm5hbWUsIGluZm8uc2l6ZSwgaW5mby5udW1fZW50cmllcykpCisJICAgID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisvKiBUb28gaGFyZCAtLVJSICovCisjaWYgMAorCXNwcmludGYocGF0aG5hbWUsICIlcy8lcyIsIElQVF9MSUJfRElSLCBpbmZvLm5hbWUpOworCWR5bmxpYiA9IGRsb3BlbihwYXRobmFtZSwgUlRMRF9OT1cpOworCWlmICghZHlubGliKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaC0+aG9va25hbWVzID0gZGxzeW0oZHlubGliLCAiaG9va25hbWVzIik7CisJaWYgKCFoLT5ob29rbmFtZXMpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiBOVUxMOworCX0KKyNlbHNlCisJaC0+aG9va25hbWVzID0gaG9va25hbWVzOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIGN1cnJlbnQgc3RhdGUgKi8KKwloLT5pbmZvID0gaW5mbzsKKwloLT5uZXdfbnVtYmVyID0gaC0+aW5mby5udW1fZW50cmllczsKKwlmb3IgKGkgPSAwOyBpIDwgaC0+aW5mby5udW1fZW50cmllczsgaSsrKQorCQloLT5jb3VudGVyX21hcFtpXQorCQkJPSAoKHN0cnVjdCBjb3VudGVyX21hcCl7Q09VTlRFUl9NQVBfTk9STUFMX01BUCwgaX0pOworCisJaC0+ZW50cmllcy5zaXplID0gaC0+aW5mby5zaXplOworCisJdG1wID0gc2l6ZW9mKHN0cnVjdCBpcHRfZ2V0X2VudHJpZXMpICsgaC0+aW5mby5zaXplOworCisJaWYgKGdldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQLCBJUFRfU09fR0VUX0VOVFJJRVMsICZoLT5lbnRyaWVzLAorCQkgICAgICAgJnRtcCkgPCAwKSB7CisJCWZyZWUoaCk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlDSEVDSyhoKTsKKwlyZXR1cm4gaDsKK30KKworI2RlZmluZSBJUF9QQVJUU19OQVRJVkUobikJCQlcCisodW5zaWduZWQgaW50KSgobik+PjI0KSYweEZGLAkJCVwKKyh1bnNpZ25lZCBpbnQpKChuKT4+MTYpJjB4RkYsCQkJXAorKHVuc2lnbmVkIGludCkoKG4pPj44KSYweEZGLAkJCVwKKyh1bnNpZ25lZCBpbnQpKChuKSYweEZGKQorCisjZGVmaW5lIElQX1BBUlRTKG4pIElQX1BBUlRTX05BVElWRShudG9obChuKSkKKworc3RhdGljIGlubGluZSBpbnQKK3ByaW50X21hdGNoKGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0pCit7CisJcHJpbnRmKCJNYXRjaCBuYW1lOiBgJXMnXG4iLCBtLT51Lm5hbWUpOworCXJldHVybiAwOworfQorCitpbnQKK2R1bXBfZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgaXB0Y19oYW5kbGVfdCBoYW5kbGUpCit7CisJc2l6ZV90IGk7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7CisKKwlwcmludGYoIkVudHJ5ICV1ICglbHUpOlxuIiwgZW50cnkyaW5kZXgoaGFuZGxlLCBlKSwKKwkgICAgICAgZW50cnkyb2Zmc2V0KGhhbmRsZSwgZSkpOworCXByaW50ZigiU1JDIElQOiAldS4ldS4ldS4ldS8ldS4ldS4ldS4ldVxuIiwKKwkgICAgICAgSVBfUEFSVFMoZS0+aXAuc3JjLnNfYWRkciksSVBfUEFSVFMoZS0+aXAuc21zay5zX2FkZHIpKTsKKwlwcmludGYoIkRTVCBJUDogJXUuJXUuJXUuJXUvJXUuJXUuJXUuJXVcbiIsCisJICAgICAgIElQX1BBUlRTKGUtPmlwLmRzdC5zX2FkZHIpLElQX1BBUlRTKGUtPmlwLmRtc2suc19hZGRyKSk7CisJcHJpbnRmKCJJbnRlcmZhY2U6IGAlcycvIiwgZS0+aXAuaW5pZmFjZSk7CisJZm9yIChpID0gMDsgaSA8IElGTkFNU0laOyBpKyspCisJCXByaW50ZigiJWMiLCBlLT5pcC5pbmlmYWNlX21hc2tbaV0gPyAnWCcgOiAnLicpOworCXByaW50ZigidG8gYCVzJy8iLCBlLT5pcC5vdXRpZmFjZSk7CisJZm9yIChpID0gMDsgaSA8IElGTkFNU0laOyBpKyspCisJCXByaW50ZigiJWMiLCBlLT5pcC5vdXRpZmFjZV9tYXNrW2ldID8gJ1gnIDogJy4nKTsKKwlwcmludGYoIlxuUHJvdG9jb2w6ICV1XG4iLCBlLT5pcC5wcm90byk7CisJcHJpbnRmKCJGbGFnczogJTAyWFxuIiwgZS0+aXAuZmxhZ3MpOworCXByaW50ZigiSW52ZmxhZ3M6ICUwMlhcbiIsIGUtPmlwLmludmZsYWdzKTsKKwlwcmludGYoIkNvdW50ZXJzOiAlbGx1IHBhY2tldHMsICVsbHUgYnl0ZXNcbiIsCisJICAgICAgIGUtPmNvdW50ZXJzLnBjbnQsIGUtPmNvdW50ZXJzLmJjbnQpOworCXByaW50ZigiQ2FjaGU6ICUwOFggIiwgZS0+bmZjYWNoZSk7CisJaWYgKGUtPm5mY2FjaGUgJiBORkNfQUxURVJFRCkgcHJpbnRmKCJBTFRFUkVEICIpOworCWlmIChlLT5uZmNhY2hlICYgTkZDX1VOS05PV04pIHByaW50ZigiVU5LTk9XTiAiKTsKKwlpZiAoZS0+bmZjYWNoZSAmIE5GQ19JUF9TUkMpIHByaW50ZigiSVBfU1JDICIpOworCWlmIChlLT5uZmNhY2hlICYgTkZDX0lQX0RTVCkgcHJpbnRmKCJJUF9EU1QgIik7CisJaWYgKGUtPm5mY2FjaGUgJiBORkNfSVBfSUZfSU4pIHByaW50ZigiSVBfSUZfSU4gIik7CisJaWYgKGUtPm5mY2FjaGUgJiBORkNfSVBfSUZfT1VUKSBwcmludGYoIklQX0lGX09VVCAiKTsKKwlpZiAoZS0+bmZjYWNoZSAmIE5GQ19JUF9UT1MpIHByaW50ZigiSVBfVE9TICIpOworCWlmIChlLT5uZmNhY2hlICYgTkZDX0lQX1BST1RPKSBwcmludGYoIklQX1BST1RPICIpOworCWlmIChlLT5uZmNhY2hlICYgTkZDX0lQX09QVElPTlMpIHByaW50ZigiSVBfT1BUSU9OUyAiKTsKKwlpZiAoZS0+bmZjYWNoZSAmIE5GQ19JUF9UQ1BGTEFHUykgcHJpbnRmKCJJUF9UQ1BGTEFHUyAiKTsKKwlpZiAoZS0+bmZjYWNoZSAmIE5GQ19JUF9TUkNfUFQpIHByaW50ZigiSVBfU1JDX1BUICIpOworCWlmIChlLT5uZmNhY2hlICYgTkZDX0lQX0RTVF9QVCkgcHJpbnRmKCJJUF9EU1RfUFQgIik7CisJaWYgKGUtPm5mY2FjaGUgJiBORkNfSVBfUFJPVE9fVU5LTk9XTikgcHJpbnRmKCJJUF9QUk9UT19VTktOT1dOICIpOworCXByaW50ZigiXG4iKTsKKworCUlQVF9NQVRDSF9JVEVSQVRFKGUsIHByaW50X21hdGNoKTsKKworCXQgPSBpcHRfZ2V0X3RhcmdldChlKTsKKwlwcmludGYoIlRhcmdldCBuYW1lOiBgJXMnIFsldV1cbiIsIHQtPnUubmFtZSwgdC0+dGFyZ2V0X3NpemUpOworCWlmIChzdHJjbXAodC0+dS5uYW1lLCBJUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwKSB7CisJCWludCBwb3MgPSAqKGludCAqKXQtPmRhdGE7CisJCWlmIChwb3MgPCAwKQorCQkJcHJpbnRmKCJ2ZXJkaWN0PSVzXG4iLAorCQkJICAgICAgIHBvcyA9PSAtTkZfQUNDRVBULTEgPyAiTkZfQUNDRVBUIgorCQkJICAgICAgIDogcG9zID09IC1ORl9EUk9QLTEgPyAiTkZfRFJPUCIKKwkJCSAgICAgICA6IHBvcyA9PSAtTkZfUVVFVUUtMSA/ICJORl9RVUVVRSIKKwkJCSAgICAgICA6IHBvcyA9PSBJUFRfUkVUVVJOID8gIlJFVFVSTiIKKwkJCSAgICAgICA6ICJVTktOT1dOIik7CisJCWVsc2UKKwkJCXByaW50ZigidmVyZGljdD0ldVxuIiwgcG9zKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0LT51Lm5hbWUsIElQVF9FUlJPUl9UQVJHRVQpID09IDApCisJCXByaW50ZigiZXJyb3I9YCVzJ1xuIiwgdC0+ZGF0YSk7CisKKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2R1bXBfZW50cmllcyhjb25zdCBpcHRjX2hhbmRsZV90IGhhbmRsZSkKK3sKKwlDSEVDSyhoYW5kbGUpOworCisJcHJpbnRmKCJsaWJpcHRjIHYlcy4gICV1IGVudHJpZXMsICV1IGJ5dGVzLlxuIiwKKwkgICAgICAgTkVURklMVEVSX1ZFUlNJT04sCisJICAgICAgIGhhbmRsZS0+bmV3X251bWJlciwgaGFuZGxlLT5lbnRyaWVzLnNpemUpOworCXByaW50ZigiVGFibGUgYCVzJ1xuIiwgaGFuZGxlLT5pbmZvLm5hbWUpOworCXByaW50ZigiSG9va3M6IHByZS9pbi9md2Qvb3V0L3Bvc3QgPSAldS8ldS8ldS8ldS8ldVxuIiwKKwkgICAgICAgaGFuZGxlLT5pbmZvLmhvb2tfZW50cnlbTkZfSVBfUFJFX1JPVVRJTkddLAorCSAgICAgICBoYW5kbGUtPmluZm8uaG9va19lbnRyeVtORl9JUF9MT0NBTF9JTl0sCisJICAgICAgIGhhbmRsZS0+aW5mby5ob29rX2VudHJ5W05GX0lQX0ZPUldBUkRdLAorCSAgICAgICBoYW5kbGUtPmluZm8uaG9va19lbnRyeVtORl9JUF9MT0NBTF9PVVRdLAorCSAgICAgICBoYW5kbGUtPmluZm8uaG9va19lbnRyeVtORl9JUF9QT1NUX1JPVVRJTkddKTsKKwlwcmludGYoIlVuZGVyZmxvd3M6IHByZS9pbi9md2Qvb3V0L3Bvc3QgPSAldS8ldS8ldS8ldS8ldVxuIiwKKwkgICAgICAgaGFuZGxlLT5pbmZvLnVuZGVyZmxvd1tORl9JUF9QUkVfUk9VVElOR10sCisJICAgICAgIGhhbmRsZS0+aW5mby51bmRlcmZsb3dbTkZfSVBfTE9DQUxfSU5dLAorCSAgICAgICBoYW5kbGUtPmluZm8udW5kZXJmbG93W05GX0lQX0ZPUldBUkRdLAorCSAgICAgICBoYW5kbGUtPmluZm8udW5kZXJmbG93W05GX0lQX0xPQ0FMX09VVF0sCisJICAgICAgIGhhbmRsZS0+aW5mby51bmRlcmZsb3dbTkZfSVBfUE9TVF9ST1VUSU5HXSk7CisKKwlJUFRfRU5UUllfSVRFUkFURShoYW5kbGUtPmVudHJpZXMuZW50cmllcywgaGFuZGxlLT5lbnRyaWVzLnNpemUsCisJCQkgIGR1bXBfZW50cnksIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmaW5kX3VzZXJfbGFiZWwoc3RydWN0IGlwdF9lbnRyeSAqZSwgdW5zaWduZWQgaW50ICpvZmYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogSW5jcmVtZW50IGZpcnN0OiB0aGV5IHdhbnQgb2Zmc2V0IG9mIGVudHJ5IEFGVEVSIGxhYmVsICovCisJKCpvZmYpICs9IGUtPm5leHRfb2Zmc2V0OworCisJaWYgKHN0cmNtcChpcHRfZ2V0X3RhcmdldChlKS0+dS5uYW1lLCBJUFRfRVJST1JfVEFSR0VUKSA9PSAwCisJICAgICYmIHN0cmNtcChpcHRfZ2V0X3RhcmdldChlKS0+ZGF0YSwgbmFtZSkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyBvZmZzZXQgb2YgbGFiZWwuICovCitzdGF0aWMgaW50CitmaW5kX2xhYmVsKHVuc2lnbmVkIGludCAqb2ZmLAorCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgY29uc3QgaXB0Y19oYW5kbGVfdCBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBCdWlsdGluIGNoYWluIG5hbWU/ICovCisJaSA9IGlwdGNfYnVpbHRpbihuYW1lLCBoYW5kbGUpOworCWlmIChpICE9IDApIHsKKwkJKm9mZiA9IGhhbmRsZS0+aW5mby5ob29rX2VudHJ5W2ktMV07CisJCXJldHVybiAxOworCX0KKworCS8qIFVzZXIgY2hhaW4gbmFtZT8gKi8KKwkqb2ZmID0gMDsKKwlpZiAoSVBUX0VOVFJZX0lURVJBVEUoaGFuZGxlLT5lbnRyaWVzLmVudHJpZXMsIGhhbmRsZS0+ZW50cmllcy5zaXplLAorCQkJICAgICAgZmluZF91c2VyX2xhYmVsLCBvZmYsIG5hbWUpICE9IDApIHsKKwkJLyogbGFzdCBlcnJvciBub2RlIGRvZXNuJ3QgY291bnQgKi8KKwkJaWYgKCpvZmYgIT0gaGFuZGxlLT5lbnRyaWVzLnNpemUpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRG9lcyB0aGlzIGNoYWluIGV4aXN0PyAqLworaW50IGlwdGNfaXNfY2hhaW4oY29uc3QgY2hhciAqY2hhaW4sIGNvbnN0IGlwdGNfaGFuZGxlX3QgaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBkdW1teTsKKworCS8qIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiAqLworI2lmIDAKKwlDSEVDSyhoYW5kbGUpOworI2VuZGlmCisKKwlyZXR1cm4gZmluZF9sYWJlbCgmZHVtbXksIGNoYWluLCBoYW5kbGUpOworfQorCisvKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmluYWwgKGllLiB1bmNvbmRpdGlvbmFsKSBlbGVtZW50LiAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X2NoYWluX2VuZChjb25zdCBpcHRjX2hhbmRsZV90IGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KQoreworCXVuc2lnbmVkIGludCBsYXN0X29mZiwgb2ZmOworCXN0cnVjdCBpcHRfZW50cnkgKmU7CisKKwlsYXN0X29mZiA9IHN0YXJ0OworCWUgPSBnZXRfZW50cnkoaGFuZGxlLCBzdGFydCk7CisKKwkvKiBUZXJtaW5hdGUgd2hlbiB3ZSBtZWV0IGEgZXJyb3IgbGFiZWwgb3IgYSBob29rIGVudHJ5LiAqLworCWZvciAob2ZmID0gc3RhcnQgKyBlLT5uZXh0X29mZnNldDsKKwkgICAgIG9mZiA8IGhhbmRsZS0+ZW50cmllcy5zaXplOworCSAgICAgbGFzdF9vZmYgPSBvZmYsIG9mZiArPSBlLT5uZXh0X29mZnNldCkgeworCQlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJZSA9IGdldF9lbnRyeShoYW5kbGUsIG9mZik7CisKKwkJLyogV2UgaGl0IGFuIGVudHJ5IHBvaW50LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQkJaWYgKChoYW5kbGUtPmluZm8udmFsaWRfaG9va3MgJiAoMSA8PCBpKSkKKwkJCSAgICAmJiBvZmYgPT0gaGFuZGxlLT5pbmZvLmhvb2tfZW50cnlbaV0pCisJCQkJcmV0dXJuIGxhc3Rfb2ZmOworCQl9CisKKwkJLyogV2UgaGl0IGEgdXNlciBjaGFpbiBsYWJlbCAqLworCQl0ID0gaXB0X2dldF90YXJnZXQoZSk7CisJCWlmIChzdHJjbXAodC0+dS5uYW1lLCBJUFRfRVJST1JfVEFSR0VUKSA9PSAwKQorCQkJcmV0dXJuIGxhc3Rfb2ZmOworCX0KKwkvKiBTSE9VTEQgTkVWRVIgSEFQUEVOICovCisJZnByaW50ZihzdGRlcnIsICJFUlJPUjogT2ZmIGVuZCAoJXUpIG9mIGNoYWluIGZyb20gJXUhXG4iLAorCQloYW5kbGUtPmVudHJpZXMuc2l6ZSwgb2ZmKTsKKwlhYm9ydCgpOworfQorCisvKiBJdGVyYXRvciBmdW5jdGlvbnMgdG8gcnVuIHRocm91Z2ggdGhlIGNoYWluczsgcHJldiA9IE5VTEwgbWVhbnMKKyAgIGZpcnN0IGNoYWluLiAgUmV0dXJucyBOVUxMIGF0IGVuZC4gKi8KK2NvbnN0IGNoYXIgKgoraXB0Y19uZXh0X2NoYWluKGNvbnN0IGNoYXIgKnByZXYsIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgcG9zOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcHRfZW50cnkgKmU7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpZiAoIXByZXYpCisJCXBvcyA9IDA7CisJZWxzZSB7CisJCWlmICghZmluZF9sYWJlbCgmcG9zLCBwcmV2LCAqaGFuZGxlKSkgeworCQkJZXJybm8gPSBFTk9FTlQ7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwb3MgPSBnZXRfY2hhaW5fZW5kKCpoYW5kbGUsIHBvcyk7CisJCS8qIE5leHQgZW50cnkuICovCisJCWUgPSBnZXRfZW50cnkoKmhhbmRsZSwgcG9zKTsKKwkJcG9zICs9IGUtPm5leHRfb2Zmc2V0OworCX0KKwllID0gZ2V0X2VudHJ5KCpoYW5kbGUsIHBvcyk7CisKKwkvKiBSZXR1cm4gbmFtZXMgb2YgZW50cnkgcG9pbnRzIGlmIGl0IGlzIG9uZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQlpZiAoKCgqaGFuZGxlKS0+aW5mby52YWxpZF9ob29rcyAmICgxIDw8IGkpKQorCQkgICAgJiYgcG9zID09ICgqaGFuZGxlKS0+aW5mby5ob29rX2VudHJ5W2ldKQorCQkJcmV0dXJuICgqaGFuZGxlKS0+aG9va25hbWVzW2ldOworCX0KKwkvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQsIGl0ZXJhdGlvbiBmaW5pc2hlZCAqLworCWlmIChwb3MgKyBlLT5uZXh0X29mZnNldCA9PSAoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc3RyY21wKGlwdF9nZXRfdGFyZ2V0KGUpLT51Lm5hbWUsIElQVF9FUlJPUl9UQVJHRVQpICE9IDApIHsKKwkJLyogU0hPVUxEIE5FVkVSIEhBUFBFTiAqLworCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBwb3NpdGlvbiAldS8ldSBub3QgYW4gZXJyb3IgbGFiZWxcbiIsCisJCQlwb3MsICgqaGFuZGxlKS0+ZW50cmllcy5zaXplKTsKKwkJYWJvcnQoKTsKKwl9CisKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKilpcHRfZ2V0X3RhcmdldChlKS0+ZGF0YTsKK30KKworLyogSG93IG1hbnkgcnVsZXMgaW4gdGhpcyBjaGFpbj8gKi8KK3Vuc2lnbmVkIGludAoraXB0Y19udW1fcnVsZXMoY29uc3QgY2hhciAqY2hhaW4sIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgb2ZmID0gMDsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICpzdGFydCwgKmVuZDsKKworCUNIRUNLKCpoYW5kbGUpOworCWlmICghZmluZF9sYWJlbCgmb2ZmLCBjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAodW5zaWduZWQgaW50KS0xOworCX0KKworCXN0YXJ0ID0gZ2V0X2VudHJ5KCpoYW5kbGUsIG9mZik7CisJZW5kID0gZ2V0X2VudHJ5KCpoYW5kbGUsIGdldF9jaGFpbl9lbmQoKmhhbmRsZSwgb2ZmKSk7CisKKwlyZXR1cm4gZW50cnkyaW5kZXgoKmhhbmRsZSwgZW5kKSAtIGVudHJ5MmluZGV4KCpoYW5kbGUsIHN0YXJ0KTsKK30KKworLyogR2V0IG4ndGggcnVsZSBpbiB0aGlzIGNoYWluLiAqLworY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqaXB0Y19nZXRfcnVsZShjb25zdCBjaGFyICpjaGFpbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbiwKKwkJCQkgICAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IHBvcyA9IDAsIGNoYWluaW5kZXg7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpZiAoIWZpbmRfbGFiZWwoJnBvcywgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljaGFpbmluZGV4ID0gZW50cnkyaW5kZXgoKmhhbmRsZSwgZ2V0X2VudHJ5KCpoYW5kbGUsIHBvcykpOworCisJcmV0dXJuIGluZGV4MmVudHJ5KCpoYW5kbGUsIGNoYWluaW5kZXggKyBuKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lKGlwdGNfaGFuZGxlX3QgaGFuZGxlLCBzdHJ1Y3QgaXB0X2VudHJ5ICplKQoreworCWludCBzcG9zOworCXVuc2lnbmVkIGludCBsYWJlbGlkeDsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICpqdW1wdG87CisKKwlpZiAoc3RyY21wKGlwdF9nZXRfdGFyZ2V0KGUpLT51Lm5hbWUsIElQVF9TVEFOREFSRF9UQVJHRVQpICE9IDApCisJCXJldHVybiBpcHRfZ2V0X3RhcmdldChlKS0+dS5uYW1lOworCisJLyogU3RhbmRhcmQgdGFyZ2V0OiBldmFsdWF0ZSAqLworCXNwb3MgPSAqKGludCAqKWlwdF9nZXRfdGFyZ2V0KGUpLT5kYXRhOworCWlmIChzcG9zIDwgMCkgeworCQlpZiAoc3BvcyA9PSBJUFRfUkVUVVJOKQorCQkJcmV0dXJuIElQVENfTEFCRUxfUkVUVVJOOworCQllbHNlIGlmIChzcG9zID09IC1ORl9BQ0NFUFQtMSkKKwkJCXJldHVybiBJUFRDX0xBQkVMX0FDQ0VQVDsKKwkJZWxzZSBpZiAoc3BvcyA9PSAtTkZfRFJPUC0xKQorCQkJcmV0dXJuIElQVENfTEFCRUxfRFJPUDsKKwkJZWxzZSBpZiAoc3BvcyA9PSAtTkZfQUNDRVBULTEpCisJCQlyZXR1cm4gSVBUQ19MQUJFTF9RVUVVRTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBvZmYgJWx1LyV1IG5vdCBhIHZhbGlkIHRhcmdldCAoJWkpXG4iLAorCQkJZW50cnkyb2Zmc2V0KGhhbmRsZSwgZSksIGhhbmRsZS0+ZW50cmllcy5zaXplLAorCQkJc3Bvcyk7CisJCWFib3J0KCk7CisJfQorCisJanVtcHRvID0gZ2V0X2VudHJ5KGhhbmRsZSwgc3Bvcyk7CisKKwkvKiBGYWxsIHRocm91Z2ggcnVsZSAqLworCWlmIChqdW1wdG8gPT0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAiIjsKKworCS8qIE11c3QgcG9pbnQgdG8gaGVhZCBvZiBhIGNoYWluOiBpZS4gYWZ0ZXIgZXJyb3IgcnVsZSAqLworCWxhYmVsaWR4ID0gZW50cnkyaW5kZXgoaGFuZGxlLCBqdW1wdG8pIC0gMTsKKwlyZXR1cm4gZ2V0X2Vycm9ybGFiZWwoaGFuZGxlLCBpbmRleDJvZmZzZXQoaGFuZGxlLCBsYWJlbGlkeCkpOworfQorCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG5hbWUgb2YgdGhpcyBwb3NpdGlvbi4gKi8KK2NvbnN0IGNoYXIgKmlwdGNfZ2V0X3RhcmdldChjb25zdCBjaGFyICpjaGFpbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbiwKKwkJCSAgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IHBvcyA9IDAsIGNoYWluaW5kZXg7CisJc3RydWN0IGlwdF9lbnRyeSAqZTsKKworCUNIRUNLKCpoYW5kbGUpOworCWlmICghZmluZF9sYWJlbCgmcG9zLCBjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiBOVUxMOworCX0KKworCWNoYWluaW5kZXggPSBlbnRyeTJpbmRleCgqaGFuZGxlLCBnZXRfZW50cnkoKmhhbmRsZSwgcG9zKSk7CisJZSA9IGluZGV4MmVudHJ5KCpoYW5kbGUsIGNoYWluaW5kZXggKyBuKTsKKworCXJldHVybiB0YXJnZXRfbmFtZSgqaGFuZGxlLCBlKTsKK30KKworLyogSXMgdGhpcyBhIGJ1aWx0LWluIGNoYWluPyAgQWN0dWFsbHkgcmV0dXJucyBob29rICsgMS4gKi8KK2ludAoraXB0Y19idWlsdGluKGNvbnN0IGNoYXIgKmNoYWluLCBjb25zdCBpcHRjX2hhbmRsZV90IGhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBORl9JUF9OVU1IT09LUzsgaSsrKSB7CisJCWlmICgoaGFuZGxlLT5pbmZvLnZhbGlkX2hvb2tzICYgKDEgPDwgaSkpCisJCSAgICAmJiBoYW5kbGUtPmhvb2tuYW1lc1tpXQorCQkgICAgJiYgc3RyY21wKGhhbmRsZS0+aG9va25hbWVzW2ldLCBjaGFpbikgPT0gMCkKKwkJCXJldHVybiBpKzE7CisJfQorCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIHBvbGljeSBvZiBhIGdpdmVuIGJ1aWx0LWluIGNoYWluICovCitjb25zdCBjaGFyICoKK2lwdGNfZ2V0X3BvbGljeShjb25zdCBjaGFyICpjaGFpbiwKKwkJc3RydWN0IGlwdF9jb3VudGVycyAqY291bnRlcnMsCisJCWlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJc3RydWN0IGlwdF9lbnRyeSAqZTsKKwlpbnQgaG9vazsKKworCUNIRUNLKCpoYW5kbGUpOworCWhvb2sgPSBpcHRjX2J1aWx0aW4oY2hhaW4sICpoYW5kbGUpOworCWlmIChob29rICE9IDApCisJCXN0YXJ0ID0gKCpoYW5kbGUpLT5pbmZvLmhvb2tfZW50cnlbaG9vay0xXTsKKwllbHNlCisJCXJldHVybiBOVUxMOworCisJZSA9IGdldF9lbnRyeSgqaGFuZGxlLCBnZXRfY2hhaW5fZW5kKCpoYW5kbGUsIHN0YXJ0KSk7CisJKmNvdW50ZXJzID0gZS0+Y291bnRlcnM7CisKKwlyZXR1cm4gdGFyZ2V0X25hbWUoKmhhbmRsZSwgZSk7Cit9CisKK3N0YXRpYyBpbnQKK2NvcnJlY3RfdmVyZGljdChzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQl1bnNpZ25lZCBjaGFyICpiYXNlLAorCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgZGVsdGFfb2Zmc2V0KQoreworCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0ID0gKHZvaWQgKilpcHRfZ2V0X3RhcmdldChlKTsKKwl1bnNpZ25lZCBpbnQgY3VyciA9ICh1bnNpZ25lZCBjaGFyICopZSAtIGJhc2U7CisKKwkvKiBUcmFwOiBpbnNlcnQgb2YgZmFsbC10aHJvdWdoIHJ1bGUuICBEb24ndCBjaGFuZ2UgZmFsbC10aHJvdWdoCisJICAgdmVyZGljdCB0byBqdW1wLW92ZXItbmV4dC1ydWxlLiAqLworCWlmIChzdHJjbXAodC0+dGFyZ2V0LnUubmFtZSwgSVBUX1NUQU5EQVJEX1RBUkdFVCkgPT0gMAorCSAgICAmJiB0LT52ZXJkaWN0ID4gKGludClvZmZzZXQKKwkgICAgJiYgIShjdXJyID09IG9mZnNldCAmJgorCQkgdC0+dmVyZGljdCA9PSBjdXJyICsgZS0+bmV4dF9vZmZzZXQpKSB7CisJCXQtPnZlcmRpY3QgKz0gZGVsdGFfb2Zmc2V0OworCX0KKworCXJldHVybiAwOworfQorCisvKiBBZGp1c3RzIHN0YW5kYXJkIHZlcmRpY3QganVtcCBwb3NpdGlvbnMgYWZ0ZXIgYW4gaW5zZXJ0aW9uL2RlbGV0aW9uLiAqLworc3RhdGljIGludAorc2V0X3ZlcmRpY3QodW5zaWduZWQgaW50IG9mZnNldCwgaW50IGRlbHRhX29mZnNldCwgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCUlQVF9FTlRSWV9JVEVSQVRFKCgqaGFuZGxlKS0+ZW50cmllcy5lbnRyaWVzLAorCQkJICAoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSwKKwkJCSAgY29ycmVjdF92ZXJkaWN0LCAoKmhhbmRsZSktPmVudHJpZXMuZW50cmllcywKKwkJCSAgb2Zmc2V0LCBkZWx0YV9vZmZzZXQpOworCisJKCpoYW5kbGUpLT5jaGFuZ2VkID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyogSWYgcHJlcGVuZCBpcyBzZXQsIHRoZW4gd2UgYXJlIHByZXBlbmRpbmcgdG8gYSBjaGFpbjogaWYgdGhlCisgKiBpbnNlcnRpb24gcG9zaXRpb24gaXMgYW4gZW50cnkgcG9pbnQsIGtlZXAgdGhlIGVudHJ5IHBvaW50LiAqLworc3RhdGljIGludAoraW5zZXJ0X3J1bGVzKHVuc2lnbmVkIGludCBudW1fcnVsZXMsIHVuc2lnbmVkIGludCBydWxlc19zaXplLAorCSAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqaW5zZXJ0LAorCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IG51bV9ydWxlc19vZmZzZXQsCisJICAgICBpbnQgcHJlcGVuZCwKKwkgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpcHRjX2hhbmRsZV90IG5ld2g7CisJc3RydWN0IGlwdF9nZXRpbmZvIG5ld2luZm87CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAob2Zmc2V0ID49ICgqaGFuZGxlKS0+ZW50cmllcy5zaXplKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXdpbmZvID0gKCpoYW5kbGUpLT5pbmZvOworCisJLyogRml4IHVwIGVudHJ5IHBvaW50cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQkvKiBFbnRyeSBwb2ludHMgdG8gU1RBUlQgb2YgY2hhaW4sIHNvIGtlZXAgc2FtZSBpZgorICAgICAgICAgICAgICAgICAgIGluc2VydGluZyBvbiBhdCB0aGF0IHBvaW50LiAqLworCQlpZiAoKCpoYW5kbGUpLT5pbmZvLmhvb2tfZW50cnlbaV0gPiBvZmZzZXQpCisJCQluZXdpbmZvLmhvb2tfZW50cnlbaV0gKz0gcnVsZXNfc2l6ZTsKKworCQkvKiBVbmRlcmZsb3cgYWx3YXlzIHBvaW50cyB0byBFTkQgb2YgY2hhaW4gKHBvbGljeSksCisJCSAgIHNvIGlmIHNvbWV0aGluZyBpcyBpbnNlcnRlZCBhdCBzYW1lIHBvaW50LCBpdAorCQkgICBzaG91bGQgYmUgYWR2YW5jZWQuICovCisJCWlmICgoKmhhbmRsZSktPmluZm8udW5kZXJmbG93W2ldID49IG9mZnNldCkKKwkJCW5ld2luZm8udW5kZXJmbG93W2ldICs9IHJ1bGVzX3NpemU7CisJfQorCisJbmV3aCA9IGFsbG9jX2hhbmRsZSgoKmhhbmRsZSktPmluZm8ubmFtZSwKKwkJCSAgICAoKmhhbmRsZSktPmluZm8uc2l6ZSArIHJ1bGVzX3NpemUsCisJCQkgICAgKCpoYW5kbGUpLT5pbmZvLm51bV9lbnRyaWVzICsgbnVtX3J1bGVzKTsKKwlpZiAoIW5ld2gpCisJCXJldHVybiAwOworCW5ld2gtPmluZm8gPSBuZXdpbmZvOworCisJLyogQ29weSBwcmUuLi4gKi8KKwltZW1jcHkobmV3aC0+ZW50cmllcy5lbnRyaWVzLCAoKmhhbmRsZSktPmVudHJpZXMuZW50cmllcywgb2Zmc2V0KTsKKwkvKiAuLi4gSW5zZXJ0IG5ldyAuLi4gKi8KKwltZW1jcHkobmV3aC0+ZW50cmllcy5lbnRyaWVzICsgb2Zmc2V0LCBpbnNlcnQsIHJ1bGVzX3NpemUpOworCS8qIC4uLiBjb3B5IHBvc3QgKi8KKwltZW1jcHkobmV3aC0+ZW50cmllcy5lbnRyaWVzICsgb2Zmc2V0ICsgcnVsZXNfc2l6ZSwKKwkgICAgICAgKCpoYW5kbGUpLT5lbnRyaWVzLmVudHJpZXMgKyBvZmZzZXQsCisJICAgICAgICgqaGFuZGxlKS0+ZW50cmllcy5zaXplIC0gb2Zmc2V0KTsKKworCS8qIE1vdmUgY291bnRlciBtYXAuICovCisJLyogQ29weSBwcmUuLi4gKi8KKwltZW1jcHkobmV3aC0+Y291bnRlcl9tYXAsICgqaGFuZGxlKS0+Y291bnRlcl9tYXAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgY291bnRlcl9tYXApICogbnVtX3J1bGVzX29mZnNldCk7CisJLyogLi4uIGNvcHkgcG9zdCAqLworCW1lbWNweShuZXdoLT5jb3VudGVyX21hcCArIG51bV9ydWxlc19vZmZzZXQgKyBudW1fcnVsZXMsCisJICAgICAgICgqaGFuZGxlKS0+Y291bnRlcl9tYXAgKyBudW1fcnVsZXNfb2Zmc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGNvdW50ZXJfbWFwKSAqICgoKmhhbmRsZSktPm5ld19udW1iZXIKKwkJCQkJICAgICAtIG51bV9ydWxlc19vZmZzZXQpKTsKKwkvKiBTZXQgaW50ZXJtZWRpYXRlcyB0byBubyBjb3VudGVyIGNvcHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3J1bGVzOyBpKyspCisJCW5ld2gtPmNvdW50ZXJfbWFwW251bV9ydWxlc19vZmZzZXQraV0KKwkJCT0gKChzdHJ1Y3QgY291bnRlcl9tYXApeyBDT1VOVEVSX01BUF9OT01BUCwgMCB9KTsKKworCW5ld2gtPm5ld19udW1iZXIgPSAoKmhhbmRsZSktPm5ld19udW1iZXIgKyBudW1fcnVsZXM7CisJbmV3aC0+ZW50cmllcy5zaXplID0gKCpoYW5kbGUpLT5lbnRyaWVzLnNpemUgKyBydWxlc19zaXplOworCW5ld2gtPmhvb2tuYW1lcyA9ICgqaGFuZGxlKS0+aG9va25hbWVzOworCisJZnJlZSgqaGFuZGxlKTsKKwkqaGFuZGxlID0gbmV3aDsKKworCXJldHVybiBzZXRfdmVyZGljdChvZmZzZXQsIHJ1bGVzX3NpemUsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQKK2RlbGV0ZV9ydWxlcyh1bnNpZ25lZCBpbnQgbnVtX3J1bGVzLCB1bnNpZ25lZCBpbnQgcnVsZXNfc2l6ZSwKKwkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBudW1fcnVsZXNfb2Zmc2V0LAorCSAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG9mZnNldCArIHJ1bGVzX3NpemUgPiAoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRml4IHVwIGVudHJ5IHBvaW50cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQkvKiBJbiBwcmFjdGljZSwgd2UgbmV2ZXIgZGVsZXRlIHVwIHRvIGEgaG9vayBlbnRyeSwKKwkJICAgc2luY2UgdGhlIGJ1aWx0LWluIGNoYWlucyBhcmUgYWx3YXlzIGZpcnN0LAorCQkgICBzbyB0aGVzZSB0d28gYXJlIG5ldmVyIGVxdWFsICovCisJCWlmICgoKmhhbmRsZSktPmluZm8uaG9va19lbnRyeVtpXSA+PSBvZmZzZXQgKyBydWxlc19zaXplKQorCQkJKCpoYW5kbGUpLT5pbmZvLmhvb2tfZW50cnlbaV0gLT0gcnVsZXNfc2l6ZTsKKwkJZWxzZSBpZiAoKCpoYW5kbGUpLT5pbmZvLmhvb2tfZW50cnlbaV0gPiBvZmZzZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IERlbGV0aW5nIGVudHJ5ICV1ICV1ICV1XG4iLAorCQkJCWksICgqaGFuZGxlKS0+aW5mby5ob29rX2VudHJ5W2ldLCBvZmZzZXQpOworCQkJYWJvcnQoKTsKKwkJfQorCisJCS8qIFVuZGVyZmxvdyBwb2ludHMgdG8gcG9saWN5ICh0ZXJtaW5hbCkgcnVsZSBpbgorICAgICAgICAgICAgICAgICAgIGJ1aWx0LWluLCBzbyBzZXF1YWxpdHkgaXMgdmFsaWQgaGVyZSAod2hlbiBkZWxldGluZworICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IHJ1bGUpLiAqLworCQlpZiAoKCpoYW5kbGUpLT5pbmZvLnVuZGVyZmxvd1tpXSA+PSBvZmZzZXQgKyBydWxlc19zaXplKQorCQkJKCpoYW5kbGUpLT5pbmZvLnVuZGVyZmxvd1tpXSAtPSBydWxlc19zaXplOworCQllbHNlIGlmICgoKmhhbmRsZSktPmluZm8udW5kZXJmbG93W2ldID4gb2Zmc2V0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBEZWxldGluZyB1ZmxvdyAldSAldSAldVxuIiwKKwkJCQlpLCAoKmhhbmRsZSktPmluZm8udW5kZXJmbG93W2ldLCBvZmZzZXQpOworCQkJYWJvcnQoKTsKKwkJfQorCX0KKworCS8qIE1vdmUgdGhlIHJ1bGVzIGRvd24uICovCisJbWVtbW92ZSgoKmhhbmRsZSktPmVudHJpZXMuZW50cmllcyArIG9mZnNldCwKKwkJKCpoYW5kbGUpLT5lbnRyaWVzLmVudHJpZXMgKyBvZmZzZXQgKyBydWxlc19zaXplLAorCQkoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSAtIChvZmZzZXQgKyBydWxlc19zaXplKSk7CisKKwkvKiBNb3ZlIHRoZSBjb3VudGVyIG1hcCBkb3duLiAqLworCW1lbW1vdmUoJigqaGFuZGxlKS0+Y291bnRlcl9tYXBbbnVtX3J1bGVzX29mZnNldF0sCisJCSYoKmhhbmRsZSktPmNvdW50ZXJfbWFwW251bV9ydWxlc19vZmZzZXQgKyBudW1fcnVsZXNdLAorCQlzaXplb2Yoc3RydWN0IGNvdW50ZXJfbWFwKQorCQkqICgoKmhhbmRsZSktPm5ld19udW1iZXIgLSAobnVtX3J1bGVzICsgbnVtX3J1bGVzX29mZnNldCkpKTsKKworCS8qIEZpeCBudW1iZXJzICovCisJKCpoYW5kbGUpLT5uZXdfbnVtYmVyIC09IG51bV9ydWxlczsKKwkoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSAtPSBydWxlc19zaXplOworCisJcmV0dXJuIHNldF92ZXJkaWN0KG9mZnNldCwgLShpbnQpcnVsZXNfc2l6ZSwgaGFuZGxlKTsKK30KKworc3RhdGljIGludAorc3RhbmRhcmRfbWFwKHN0cnVjdCBpcHRfZW50cnkgKmUsIGludCB2ZXJkaWN0KQoreworCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0OworCisJdCA9IChzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqKWlwdF9nZXRfdGFyZ2V0KGUpOworCisJaWYgKHQtPnRhcmdldC50YXJnZXRfc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAwOworCX0KKwkvKiBtZW1zZXQgZm9yIG1lbWNtcCBjb252ZW5pZW5jZSBvbiBkZWxldGUvcmVwbGFjZSAqLworCW1lbXNldCh0LT50YXJnZXQudS5uYW1lLCAwLCBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTik7CisJc3RyY3B5KHQtPnRhcmdldC51Lm5hbWUsIElQVF9TVEFOREFSRF9UQVJHRVQpOworCXQtPnZlcmRpY3QgPSB2ZXJkaWN0OworCisJcmV0dXJuIDE7Cit9CisJCitzdGF0aWMgaW50CittYXBfdGFyZ2V0KGNvbnN0IGlwdGNfaGFuZGxlX3QgaGFuZGxlLAorCSAgIHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgdW5zaWduZWQgaW50IG9mZnNldCwKKwkgICBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqb2xkKQoreworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0ID0gaXB0X2dldF90YXJnZXQoZSk7CisKKwkvKiBTYXZlIG9sZCB0YXJnZXQgKGV4Y2VwdCBkYXRhLCB3aGljaCB3ZSBkb24ndCBjaGFuZ2UsIGV4Y2VwdCBmb3IKKwkgICBzdGFuZGFyZCBjYXNlLCB3aGVyZSB3ZSBkb24ndCBjYXJlKS4gKi8KKwkqb2xkID0gKnQ7CisKKwkvKiBNYXliZSBpdCdzIGVtcHR5ICg9PiBmYWxsIHRocm91Z2gpICovCisJaWYgKHN0cmNtcCh0LT51Lm5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gc3RhbmRhcmRfbWFwKGUsIG9mZnNldCArIGUtPm5leHRfb2Zmc2V0KTsKKwkvKiBNYXliZSBpdCdzIGEgc3RhbmRhcmQgdGFyZ2V0IG5hbWUuLi4gKi8KKwllbHNlIGlmIChzdHJjbXAodC0+dS5uYW1lLCBJUFRDX0xBQkVMX0FDQ0VQVCkgPT0gMCkKKwkJcmV0dXJuIHN0YW5kYXJkX21hcChlLCAtTkZfQUNDRVBUIC0gMSk7CisJZWxzZSBpZiAoc3RyY21wKHQtPnUubmFtZSwgSVBUQ19MQUJFTF9EUk9QKSA9PSAwKQorCQlyZXR1cm4gc3RhbmRhcmRfbWFwKGUsIC1ORl9EUk9QIC0gMSk7CisJZWxzZSBpZiAoc3RyY21wKHQtPnUubmFtZSwgSVBUQ19MQUJFTF9RVUVVRSkgPT0gMCkKKwkJcmV0dXJuIHN0YW5kYXJkX21hcChlLCAtTkZfUVVFVUUgLSAxKTsKKwllbHNlIGlmIChzdHJjbXAodC0+dS5uYW1lLCBJUFRDX0xBQkVMX1JFVFVSTikgPT0gMCkKKwkJcmV0dXJuIHN0YW5kYXJkX21hcChlLCBJUFRfUkVUVVJOKTsKKwllbHNlIGlmIChpcHRjX2J1aWx0aW4odC0+dS5uYW1lLCBoYW5kbGUpKSB7CisJCS8qIENhbid0IGp1bXAgdG8gYnVpbHRpbnMuICovCisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBNYXliZSBpdCdzIGFuIGV4aXN0aW5nIGNoYWluIG5hbWUuICovCisJCXVuc2lnbmVkIGludCBleGlzdHM7CisKKwkJaWYgKGZpbmRfbGFiZWwoJmV4aXN0cywgdC0+dS5uYW1lLCBoYW5kbGUpKQorCQkJcmV0dXJuIHN0YW5kYXJkX21hcChlLCBleGlzdHMpOworCX0KKworCS8qIE11c3QgYmUgYSBtb2R1bGU/ICBJZiBub3QsIGtlcm5lbCB3aWxsIHJlamVjdC4uLiAqLworCS8qIG1lbXNldCB0byBhbGwgMCBmb3IgeW91ciBtZW1jbXAgY29udmVuaWVuY2UuICovCisJbWVtc2V0KHQtPnUubmFtZSArIHN0cmxlbih0LT51Lm5hbWUpLAorCSAgICAgICAwLAorCSAgICAgICBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAtIHN0cmxlbih0LT51Lm5hbWUpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3VubWFwX3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5ICplLCBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqb2xkKQoreworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0ID0gaXB0X2dldF90YXJnZXQoZSk7CisKKwkvKiBTYXZlIG9sZCB0YXJnZXQgKGV4Y2VwdCBkYXRhLCB3aGljaCB3ZSBkb24ndCBjaGFuZ2UsIGV4Y2VwdCBmb3IKKwkgICBzdGFuZGFyZCBjYXNlLCB3aGVyZSB3ZSBkb24ndCBjYXJlKS4gKi8KKwkqdCA9ICpvbGQ7Cit9CisKKy8qIEluc2VydCB0aGUgZW50cnkgYGZ3JyBpbiBjaGFpbiBgY2hhaW4nIGludG8gcG9zaXRpb24gYHJ1bGVudW0nLiAqLworaW50CitpcHRjX2luc2VydF9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhaW5vZmYsIGNoYWluaW5kZXgsIG9mZnNldDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCBvbGQ7CisJaW50IHJldDsKKworCUNIRUNLKCpoYW5kbGUpOworCWlwdGNfZm4gPSBpcHRjX2luc2VydF9lbnRyeTsKKwlpZiAoIWZpbmRfbGFiZWwoJmNoYWlub2ZmLCBjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAwOworCX0KKworCWNoYWluaW5kZXggPSBlbnRyeTJpbmRleCgqaGFuZGxlLCBnZXRfZW50cnkoKmhhbmRsZSwgY2hhaW5vZmYpKTsKKworCWlmIChpbmRleDJlbnRyeSgqaGFuZGxlLCBjaGFpbmluZGV4ICsgcnVsZW51bSkKKwkgICAgPiBnZXRfZW50cnkoKmhhbmRsZSwgZ2V0X2NoYWluX2VuZCgqaGFuZGxlLCBjaGFpbm9mZikpKSB7CisJCWVycm5vID0gRTJCSUc7CisJCXJldHVybiAwOworCX0KKwlvZmZzZXQgPSBpbmRleDJvZmZzZXQoKmhhbmRsZSwgY2hhaW5pbmRleCArIHJ1bGVudW0pOworCisJLyogTWFwcGluZyB0YXJnZXQgYWN0dWFsbHkgYWx0ZXJzIGVudHJ5LCBidXQgdGhhdCdzCisgICAgICAgICAgIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXIuICovCisJaWYgKCFtYXBfdGFyZ2V0KCpoYW5kbGUsIChzdHJ1Y3QgaXB0X2VudHJ5ICopZSwgb2Zmc2V0LCAmb2xkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBpbnNlcnRfcnVsZXMoMSwgZS0+bmV4dF9vZmZzZXQsIGUsIG9mZnNldCwKKwkJCSAgIGNoYWluaW5kZXggKyBydWxlbnVtLCBydWxlbnVtID09IDAsIGhhbmRsZSk7CisJdW5tYXBfdGFyZ2V0KChzdHJ1Y3QgaXB0X2VudHJ5ICopZSwgJm9sZCk7CisJQ0hFQ0soKmhhbmRsZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogQXRvbWljYWxseSByZXBsYWNlIHJ1bGUgYHJ1bGVudW0nIGluIGBjaGFpbicgd2l0aCBgZncnLiAqLworaW50CitpcHRjX3JlcGxhY2VfZW50cnkoY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCSAgIHVuc2lnbmVkIGludCBydWxlbnVtLAorCQkgICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGNoYWlub2ZmLCBjaGFpbmluZGV4LCBvZmZzZXQ7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgb2xkOworCWludCByZXQ7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpcHRjX2ZuID0gaXB0Y19yZXBsYWNlX2VudHJ5OworCisJaWYgKCFmaW5kX2xhYmVsKCZjaGFpbm9mZiwgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwljaGFpbmluZGV4ID0gZW50cnkyaW5kZXgoKmhhbmRsZSwgZ2V0X2VudHJ5KCpoYW5kbGUsIGNoYWlub2ZmKSk7CisKKwlpZiAoaW5kZXgyZW50cnkoKmhhbmRsZSwgY2hhaW5pbmRleCArIHJ1bGVudW0pCisJICAgID49IGdldF9lbnRyeSgqaGFuZGxlLCBnZXRfY2hhaW5fZW5kKCpoYW5kbGUsIGNoYWlub2ZmKSkpIHsKKwkJZXJybm8gPSBFMkJJRzsKKwkJcmV0dXJuIDA7CisJfQorCisJb2Zmc2V0ID0gaW5kZXgyb2Zmc2V0KCpoYW5kbGUsIGNoYWluaW5kZXggKyBydWxlbnVtKTsKKwkvKiBSZXBsYWNlID0gZGVsZXRlIGFuZCBpbnNlcnQuICovCisJaWYgKCFkZWxldGVfcnVsZXMoMSwgZ2V0X2VudHJ5KCpoYW5kbGUsIG9mZnNldCktPm5leHRfb2Zmc2V0LAorCQkJICBvZmZzZXQsIGNoYWluaW5kZXggKyBydWxlbnVtLCBoYW5kbGUpKQorCQlyZXR1cm4gMDsKKworCWlmICghbWFwX3RhcmdldCgqaGFuZGxlLCAoc3RydWN0IGlwdF9lbnRyeSAqKWUsIG9mZnNldCwgJm9sZCkpCisJCXJldHVybiAwOworCUNIRUNLKCpoYW5kbGUpOworCisJcmV0ID0gaW5zZXJ0X3J1bGVzKDEsIGUtPm5leHRfb2Zmc2V0LCBlLCBvZmZzZXQsCisJCQkgICBjaGFpbmluZGV4ICsgcnVsZW51bSwgMSwgaGFuZGxlKTsKKwl1bm1hcF90YXJnZXQoKHN0cnVjdCBpcHRfZW50cnkgKillLCAmb2xkKTsKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBBcHBlbmQgZW50cnkgYGZ3JyB0byBjaGFpbiBgY2hhaW4nLiAgRXF1aXZhbGVudCB0byBpbnNlcnQgd2l0aAorICAgcnVsZW51bSA9IGxlbmd0aCBvZiBjaGFpbi4gKi8KK2ludAoraXB0Y19hcHBlbmRfZW50cnkoY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sCisJCSAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJICBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0b2ZmLCBlbmRvZmY7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgb2xkOworCWludCByZXQ7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpcHRjX2ZuID0gaXB0Y19hcHBlbmRfZW50cnk7CisJaWYgKCFmaW5kX2xhYmVsKCZzdGFydG9mZiwgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwllbmRvZmYgPSBnZXRfY2hhaW5fZW5kKCpoYW5kbGUsIHN0YXJ0b2ZmKTsKKwlpZiAoIW1hcF90YXJnZXQoKmhhbmRsZSwgKHN0cnVjdCBpcHRfZW50cnkgKillLCBlbmRvZmYsICZvbGQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGluc2VydF9ydWxlcygxLCBlLT5uZXh0X29mZnNldCwgZSwgZW5kb2ZmLAorCQkJICAgZW50cnkyaW5kZXgoKmhhbmRsZSwgZ2V0X2VudHJ5KCpoYW5kbGUsIGVuZG9mZikpLAorCQkJICAgMCwgaGFuZGxlKTsKKwl1bm1hcF90YXJnZXQoKHN0cnVjdCBpcHRfZW50cnkgKillLCAmb2xkKTsKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfZGlmZmVyZW50KGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKmEsCisJCWNvbnN0IGNoYXIgKmFfZWxlbXMsCisJCWNvbnN0IGNoYXIgKmJfZWxlbXMpCit7CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqYjsKKworCS8qIE9mZnNldCBvZiBiIGlzIHRoZSBzYW1lIGFzIGEuICovCisJYiA9ICh2b2lkICopYl9lbGVtcyArIChhX2VsZW1zIC0gKGNoYXIgKilhKTsKKworCWlmIChhLT5tYXRjaF9zaXplICE9IGItPm1hdGNoX3NpemUpCisJCXJldHVybiAxOworCisJaWYgKHN0cmNtcChhLT51Lm5hbWUsIGItPnUubmFtZSkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBGSVhNRTogSWYga2VybmVsIG1vZGlmaWVzIHRoZXNlIChlZy4gUkFURSksIHRoZW4gd2UnbGwKKyAgICAgICAgICAgbmV2ZXIgbWF0Y2ggLS1SUiAqLworCWlmIChtZW1jbXAoYS0+ZGF0YSwgYi0+ZGF0YSwgYS0+bWF0Y2hfc2l6ZSAtIHNpemVvZigqYSkpICE9IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc19zYW1lKGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmEsIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnRhLCAqdGI7CisKKwlpZiAoYS0+aXAuc3JjLnNfYWRkciAhPSBiLT5pcC5zcmMuc19hZGRyCisJICAgIHx8IGEtPmlwLmRzdC5zX2FkZHIgIT0gYi0+aXAuZHN0LnNfYWRkcgorCSAgICB8fCBhLT5pcC5zbXNrLnNfYWRkciAhPSBiLT5pcC5zbXNrLnNfYWRkcgorCSAgICB8fCBhLT5pcC5zbXNrLnNfYWRkciAhPSBiLT5pcC5zbXNrLnNfYWRkcgorCSAgICB8fCBhLT5pcC5wcm90byAhPSBiLT5pcC5wcm90bworCSAgICB8fCBhLT5pcC5mbGFncyAhPSBiLT5pcC5mbGFncworCSAgICB8fCBhLT5pcC5pbnZmbGFncyAhPSBiLT5pcC5pbnZmbGFncykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUZOQU1TSVo7IGkrKykgeworCQlpZiAoYS0+aXAuaW5pZmFjZV9tYXNrW2ldICE9IGItPmlwLmluaWZhY2VfbWFza1tpXSkKKwkJCXJldHVybiAwOworCQlpZiAoKGEtPmlwLmluaWZhY2VbaV0gJiBhLT5pcC5pbmlmYWNlX21hc2tbaV0pCisJCSAgICAhPSAoYi0+aXAuaW5pZmFjZVtpXSAmIGItPmlwLmluaWZhY2VfbWFza1tpXSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGEtPmlwLm91dGlmYWNlX21hc2tbaV0gIT0gYi0+aXAub3V0aWZhY2VfbWFza1tpXSkKKwkJCXJldHVybiAwOworCQlpZiAoKGEtPmlwLm91dGlmYWNlW2ldICYgYS0+aXAub3V0aWZhY2VfbWFza1tpXSkKKwkJICAgICE9IChiLT5pcC5vdXRpZmFjZVtpXSAmIGItPmlwLm91dGlmYWNlX21hc2tbaV0pKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGEtPm5mY2FjaGUgIT0gYi0+bmZjYWNoZQorCSAgICB8fCBhLT50YXJnZXRfb2Zmc2V0ICE9IGItPnRhcmdldF9vZmZzZXQKKwkgICAgfHwgYS0+bmV4dF9vZmZzZXQgIT0gYi0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAwOworCisJaWYgKElQVF9NQVRDSF9JVEVSQVRFKGEsIG1hdGNoX2RpZmZlcmVudCwgYS0+ZWxlbXMsIGItPmVsZW1zKSkKKwkJcmV0dXJuIDA7CisKKwl0YSA9IGlwdF9nZXRfdGFyZ2V0KChzdHJ1Y3QgaXB0X2VudHJ5ICopYSk7CisJdGIgPSBpcHRfZ2V0X3RhcmdldCgoc3RydWN0IGlwdF9lbnRyeSAqKWIpOworCWlmICh0YS0+dGFyZ2V0X3NpemUgIT0gdGItPnRhcmdldF9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKHRhLT51Lm5hbWUsIHRiLT51Lm5hbWUpICE9IDApCisJCXJldHVybiAwOworCS8qIEZJWE1FOiBJZiBrZXJuZWwgbW9kaWZpZXMgdGhlc2UsIHRoZW4gd2UgbmV2ZXIgbWF0Y2ggLS1SUiAqLworCWlmIChtZW1jbXAodGEtPmRhdGEsIHRiLT5kYXRhLCB0YS0+dGFyZ2V0X3NpemUgLSBzaXplb2YoKnRhKSkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogRGVsZXRlIHRoZSBmaXJzdCBydWxlIGluIGBjaGFpbicgd2hpY2ggbWF0Y2hlcyBgZncnLiAqLworaW50CitpcHRjX2RlbGV0ZV9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICpvcmlnZncsCisJCSAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQsIGxhc3RvZmY7CisJc3RydWN0IGlwdF9lbnRyeSAqZSwgKmZ3OworCisJQ0hFQ0soKmhhbmRsZSk7CisJaXB0Y19mbiA9IGlwdGNfZGVsZXRlX2VudHJ5OworCWlmICghZmluZF9sYWJlbCgmb2Zmc2V0LCBjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAwOworCX0KKworCWZ3ID0gbWFsbG9jKG9yaWdmdy0+bmV4dF9vZmZzZXQpOworCWlmIChmdyA9PSBOVUxMKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlyZXR1cm4gMDsKKwl9CisJbGFzdG9mZiA9IGdldF9jaGFpbl9lbmQoKmhhbmRsZSwgb2Zmc2V0KTsKKworCWZvciAoOyBvZmZzZXQgPCBsYXN0b2ZmOyBvZmZzZXQgKz0gZS0+bmV4dF9vZmZzZXQpIHsKKwkJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgZGlzY2FyZDsKKworCQltZW1jcHkoZncsIG9yaWdmdywgb3JpZ2Z3LT5uZXh0X29mZnNldCk7CisKKwkJLyogRklYTUU6IGhhbmRsZSB0aGlzIGluIGlzX3NhbWUgLS1SUiAqLworCQlpZiAoIW1hcF90YXJnZXQoKmhhbmRsZSwgZncsIG9mZnNldCwgJmRpc2NhcmQpKSB7CisJCQlmcmVlKGZ3KTsKKwkJCXJldHVybiAwOworCQl9CisJCWUgPSBnZXRfZW50cnkoKmhhbmRsZSwgb2Zmc2V0KTsKKworI2lmIDAKKwkJcHJpbnRmKCJEZWxldGluZzpcbiIpOworCQlkdW1wX2VudHJ5KG5ld2UpOworI2VuZGlmCisJCWlmIChpc19zYW1lKGUsIGZ3KSkgeworCQkJaW50IHJldDsKKwkJCXJldCA9IGRlbGV0ZV9ydWxlcygxLCBlLT5uZXh0X29mZnNldCwKKwkJCQkJICAgb2Zmc2V0LCBlbnRyeTJpbmRleCgqaGFuZGxlLCBlKSwKKwkJCQkJICAgaGFuZGxlKTsKKwkJCWZyZWUoZncpOworCQkJQ0hFQ0soKmhhbmRsZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZnJlZShmdyk7CisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIDA7Cit9CQorCisvKiBEZWxldGUgdGhlIHJ1bGUgaW4gcG9zaXRpb24gYHJ1bGVudW0nIGluIGBjaGFpbicuICovCitpbnQKK2lwdGNfZGVsZXRlX251bV9lbnRyeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJICAgICAgdW5zaWduZWQgaW50IHJ1bGVudW0sCisJCSAgICAgIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhaW5zdGFydDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICplOworCisJQ0hFQ0soKmhhbmRsZSk7CisJaXB0Y19mbiA9IGlwdGNfZGVsZXRlX251bV9lbnRyeTsKKwlpZiAoIWZpbmRfbGFiZWwoJmNoYWluc3RhcnQsIGNoYWluLCAqaGFuZGxlKSkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5kZXggPSBlbnRyeTJpbmRleCgqaGFuZGxlLCBnZXRfZW50cnkoKmhhbmRsZSwgY2hhaW5zdGFydCkpCisJCSsgcnVsZW51bTsKKworCWlmIChpbmRleAorCSAgICA+PSBlbnRyeTJpbmRleCgqaGFuZGxlLAorCQkJICBnZXRfZW50cnkoKmhhbmRsZSwKKwkJCQkgICAgZ2V0X2NoYWluX2VuZCgqaGFuZGxlLCBjaGFpbnN0YXJ0KSkpKSB7CisJCWVycm5vID0gRTJCSUc7CisJCXJldHVybiAwOworCX0KKworCWUgPSBpbmRleDJlbnRyeSgqaGFuZGxlLCBpbmRleCk7CisJaWYgKGUgPT0gTlVMTCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gZGVsZXRlX3J1bGVzKDEsIGUtPm5leHRfb2Zmc2V0LCBlbnRyeTJvZmZzZXQoKmhhbmRsZSwgZSksCisJCQkgICBpbmRleCwgaGFuZGxlKTsKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDaGVjayB0aGUgcGFja2V0IGBmdycgb24gY2hhaW4gYGNoYWluJy4gIFJldHVybnMgdGhlIHZlcmRpY3QsIG9yCisgICBOVUxMIGFuZCBzZXRzIGVycm5vLiAqLworY29uc3QgY2hhciAqCitpcHRjX2NoZWNrX3BhY2tldChjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJCSAgICAgIHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5LAorCQkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCWVycm5vID0gRU5PU1lTOworCXJldHVybiBOVUxMOworfQorCisvKiBGbHVzaGVzIHRoZSBlbnRyaWVzIGluIHRoZSBnaXZlbiBjaGFpbiAoaWUuIGVtcHRpZXMgY2hhaW4pLiAqLworaW50CitpcHRjX2ZsdXNoX2VudHJpZXMoY29uc3QgaXB0X2NoYWlubGFiZWwgY2hhaW4sIGlwdGNfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhcnRvZmYsIGVuZG9mZiwgc3RhcnRpbmRleCwgZW5kaW5kZXg7CisJaW50IHJldDsKKworCUNIRUNLKCpoYW5kbGUpOworCWlwdGNfZm4gPSBpcHRjX2ZsdXNoX2VudHJpZXM7CisJaWYgKCFmaW5kX2xhYmVsKCZzdGFydG9mZiwgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisJZW5kb2ZmID0gZ2V0X2NoYWluX2VuZCgqaGFuZGxlLCBzdGFydG9mZik7CisJc3RhcnRpbmRleCA9IGVudHJ5MmluZGV4KCpoYW5kbGUsIGdldF9lbnRyeSgqaGFuZGxlLCBzdGFydG9mZikpOworCWVuZGluZGV4ID0gZW50cnkyaW5kZXgoKmhhbmRsZSwgZ2V0X2VudHJ5KCpoYW5kbGUsIGVuZG9mZikpOworCisJcmV0ID0gZGVsZXRlX3J1bGVzKGVuZGluZGV4IC0gc3RhcnRpbmRleCwKKwkJCSAgIGVuZG9mZiAtIHN0YXJ0b2ZmLCBzdGFydG9mZiwgc3RhcnRpbmRleCwKKwkJCSAgIGhhbmRsZSk7CisJQ0hFQ0soKmhhbmRsZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogWmVyb2VzIHRoZSBjb3VudGVycyBpbiBhIGNoYWluLiAqLworaW50CitpcHRjX3plcm9fZW50cmllcyhjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBpLCBlbmQ7CisJCisJQ0hFQ0soKmhhbmRsZSk7CisJaWYgKCFmaW5kX2xhYmVsKCZpLCBjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAwOworCX0KKwllbmQgPSBnZXRfY2hhaW5fZW5kKCpoYW5kbGUsIGkpOworCisJaSA9IGVudHJ5MmluZGV4KCpoYW5kbGUsIGdldF9lbnRyeSgqaGFuZGxlLCBpKSk7CisJZW5kID0gZW50cnkyaW5kZXgoKmhhbmRsZSwgZ2V0X2VudHJ5KCpoYW5kbGUsIGVuZCkpOworCisJZm9yICg7IGkgPD0gZW5kOyBpKyspIHsKKwkJaWYgKCgqaGFuZGxlKS0+Y291bnRlcl9tYXBbaV0ubWFwdHlwZSA9PUNPVU5URVJfTUFQX05PUk1BTF9NQVApCisJCQkoKmhhbmRsZSktPmNvdW50ZXJfbWFwW2ldLm1hcHR5cGUgPSBDT1VOVEVSX01BUF9aRVJPRUQ7CisJfQorCSgqaGFuZGxlKS0+Y2hhbmdlZCA9IDE7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gMTsKK30KKworLyogQ3JlYXRlcyBhIG5ldyBjaGFpbi4gKi8KKy8qIFRvIGNyZWF0ZSBhIGNoYWluLCBjcmVhdGUgdHdvIHJ1bGVzOiBlcnJvciBub2RlIGFuZCB1bmNvbmRpdGlvbmFsCisgKiByZXR1cm4uICovCitpbnQKK2lwdGNfY3JlYXRlX2NoYWluKGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLCBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IHBvczsKKwlpbnQgcmV0OworCXN0cnVjdCB7CisJCXN0cnVjdCBpcHRfZW50cnkgaGVhZDsKKwkJc3RydWN0IGlwdF9lcnJvcl90YXJnZXQgbmFtZTsKKwkJc3RydWN0IGlwdF9lbnRyeSByZXQ7CisJCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKKwl9IG5ld2M7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpcHRjX2ZuID0gaXB0Y19jcmVhdGVfY2hhaW47CisKKwkvKiBmaW5kX2xhYmVsIGRvZXNuJ3QgY292ZXIgYnVpbHQtaW4gdGFyZ2V0czogRFJPUCwgQUNDRVBULAorICAgICAgICAgICBRVUVVRSwgUkVUVVJOLiAqLworCWlmIChmaW5kX2xhYmVsKCZwb3MsIGNoYWluLCAqaGFuZGxlKQorCSAgICB8fCBzdHJjbXAoY2hhaW4sIElQVENfTEFCRUxfRFJPUCkgPT0gMAorCSAgICB8fCBzdHJjbXAoY2hhaW4sIElQVENfTEFCRUxfQUNDRVBUKSA9PSAwCisJICAgIHx8IHN0cmNtcChjaGFpbiwgSVBUQ19MQUJFTF9RVUVVRSkgPT0gMAorCSAgICB8fCBzdHJjbXAoY2hhaW4sIElQVENfTEFCRUxfUkVUVVJOKSA9PSAwKSB7CisJCWVycm5vID0gRUVYSVNUOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybGVuKGNoYWluKSsxID4gc2l6ZW9mKGlwdF9jaGFpbmxhYmVsKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KCZuZXdjLCAwLCBzaXplb2YobmV3YykpOworCW5ld2MuaGVhZC50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpOworCW5ld2MuaGVhZC5uZXh0X29mZnNldAorCQk9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCk7CisJc3RyY3B5KG5ld2MubmFtZS50LnUubmFtZSwgSVBUX0VSUk9SX1RBUkdFVCk7CisJbmV3Yy5uYW1lLnQudGFyZ2V0X3NpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9lcnJvcl90YXJnZXQpOworCXN0cmNweShuZXdjLm5hbWUuZXJyb3IsIGNoYWluKTsKKworCW5ld2MucmV0LnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSk7CisJbmV3Yy5yZXQubmV4dF9vZmZzZXQKKwkJPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkrc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KTsKKwlzdHJjcHkobmV3Yy50YXJnZXQudGFyZ2V0LnUubmFtZSwgSVBUX1NUQU5EQVJEX1RBUkdFVCk7CisJbmV3Yy50YXJnZXQudGFyZ2V0LnRhcmdldF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KTsKKwluZXdjLnRhcmdldC52ZXJkaWN0ID0gSVBUX1JFVFVSTjsKKworCS8qIEFkZCBqdXN0IGJlZm9yZSB0ZXJtaW5hbCBlbnRyeSAqLworCXJldCA9IGluc2VydF9ydWxlcygyLCBzaXplb2YobmV3YyksICZuZXdjLmhlYWQsCisJCQkgICBpbmRleDJvZmZzZXQoKmhhbmRsZSwgKCpoYW5kbGUpLT5uZXdfbnVtYmVyIC0gMSksCisJCQkgICAoKmhhbmRsZSktPm5ld19udW1iZXIgLSAxLAorCQkJICAgMCwgaGFuZGxlKTsKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citjb3VudF9yZWYoc3RydWN0IGlwdF9lbnRyeSAqZSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50ICpyZWYpCit7CisJc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQgKnQ7CisKKwlpZiAoc3RyY21wKGlwdF9nZXRfdGFyZ2V0KGUpLT51Lm5hbWUsIElQVF9TVEFOREFSRF9UQVJHRVQpID09IDApIHsKKwkJdCA9IChzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqKWlwdF9nZXRfdGFyZ2V0KGUpOworCisJCWlmICh0LT52ZXJkaWN0ID09IG9mZnNldCkKKwkJCSgqcmVmKSsrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoaXMgY2hhaW4uICovCitpbnQKK2lwdGNfZ2V0X3JlZmVyZW5jZXModW5zaWduZWQgaW50ICpyZWYsIGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLAorCQkgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlpZiAoIWZpbmRfbGFiZWwoJm9mZnNldCwgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcmVmID0gMDsKKwlJUFRfRU5UUllfSVRFUkFURSgoKmhhbmRsZSktPmVudHJpZXMuZW50cmllcywKKwkJCSAgKCpoYW5kbGUpLT5lbnRyaWVzLnNpemUsCisJCQkgIGNvdW50X3JlZiwgb2Zmc2V0LCByZWYpOworCXJldHVybiAxOworfQorCisvKiBEZWxldGVzIGEgY2hhaW4uICovCitpbnQKK2lwdGNfZGVsZXRlX2NoYWluKGNvbnN0IGlwdF9jaGFpbmxhYmVsIGNoYWluLCBpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGNoYWlub2ZmLCBsYWJlbGlkeCwgbGFiZWxvZmY7CisJdW5zaWduZWQgaW50IHJlZmVyZW5jZXM7CisJc3RydWN0IGlwdF9lbnRyeSAqZTsKKwlpbnQgcmV0OworCisJQ0hFQ0soKmhhbmRsZSk7CisJaWYgKCFpcHRjX2dldF9yZWZlcmVuY2VzKCZyZWZlcmVuY2VzLCBjaGFpbiwgaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisJCisJaXB0Y19mbiA9IGlwdGNfZGVsZXRlX2NoYWluOworCisJaWYgKGlwdGNfYnVpbHRpbihjaGFpbiwgKmhhbmRsZSkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZWZlcmVuY2VzID4gMCkgeworCQllcnJubyA9IEVNTElOSzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmaW5kX2xhYmVsKCZjaGFpbm9mZiwgY2hhaW4sICpoYW5kbGUpKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwllID0gZ2V0X2VudHJ5KCpoYW5kbGUsIGNoYWlub2ZmKTsKKwlpZiAoZ2V0X2NoYWluX2VuZCgqaGFuZGxlLCBjaGFpbm9mZikgIT0gY2hhaW5vZmYpIHsKKwkJZXJybm8gPSBFTk9URU1QVFk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5lZWQgbGFiZWwgaW5kZXg6IHByZWNlZWRzIGNoYWluIHN0YXJ0ICovCisJbGFiZWxpZHggPSBlbnRyeTJpbmRleCgqaGFuZGxlLCBlKSAtIDE7CisJbGFiZWxvZmYgPSBpbmRleDJvZmZzZXQoKmhhbmRsZSwgbGFiZWxpZHgpOworCisJcmV0ID0gZGVsZXRlX3J1bGVzKDIsCisJCQkgICBnZXRfZW50cnkoKmhhbmRsZSwgbGFiZWxvZmYpLT5uZXh0X29mZnNldAorCQkJICAgKyBlLT5uZXh0X29mZnNldCwKKwkJCSAgIGxhYmVsb2ZmLCBsYWJlbGlkeCwgaGFuZGxlKTsKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW5hbWVzIGEgY2hhaW4uICovCitpbnQgaXB0Y19yZW5hbWVfY2hhaW4oY29uc3QgaXB0X2NoYWlubGFiZWwgb2xkbmFtZSwKKwkJICAgICAgY29uc3QgaXB0X2NoYWlubGFiZWwgbmV3bmFtZSwKKwkJICAgICAgaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBjaGFpbm9mZiwgbGFiZWxvZmYsIGxhYmVsaWR4OworCXN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0ICp0OworCisJQ0hFQ0soKmhhbmRsZSk7CisJaXB0Y19mbiA9IGlwdGNfcmVuYW1lX2NoYWluOworCisJLyogZmluZF9sYWJlbCBkb2Vzbid0IGNvdmVyIGJ1aWx0LWluIHRhcmdldHM6IERST1AsIEFDQ0VQVAorICAgICAgICAgICBSRVRVUk4uICovCisJaWYgKGZpbmRfbGFiZWwoJmNoYWlub2ZmLCBuZXduYW1lLCAqaGFuZGxlKQorCSAgICB8fCBzdHJjbXAobmV3bmFtZSwgSVBUQ19MQUJFTF9EUk9QKSA9PSAwCisJICAgIHx8IHN0cmNtcChuZXduYW1lLCBJUFRDX0xBQkVMX0FDQ0VQVCkgPT0gMAorCSAgICB8fCBzdHJjbXAobmV3bmFtZSwgSVBUQ19MQUJFTF9SRVRVUk4pID09IDApIHsKKwkJZXJybm8gPSBFRVhJU1Q7CisJCXJldHVybiAwOworCX0KKworCWlmICghZmluZF9sYWJlbCgmY2hhaW5vZmYsIG9sZG5hbWUsICpoYW5kbGUpCisJICAgIHx8IGlwdGNfYnVpbHRpbihvbGRuYW1lLCAqaGFuZGxlKSkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmxlbihuZXduYW1lKSsxID4gc2l6ZW9mKGlwdF9jaGFpbmxhYmVsKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTmVlZCBsYWJlbCBpbmRleDogcHJlY2VlZHMgY2hhaW4gc3RhcnQgKi8KKwlsYWJlbGlkeCA9IGVudHJ5MmluZGV4KCpoYW5kbGUsIGdldF9lbnRyeSgqaGFuZGxlLCBjaGFpbm9mZikpIC0gMTsKKwlsYWJlbG9mZiA9IGluZGV4Mm9mZnNldCgqaGFuZGxlLCBsYWJlbGlkeCk7CisKKwl0ID0gKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0ICopCisJCWlwdF9nZXRfdGFyZ2V0KGdldF9lbnRyeSgqaGFuZGxlLCBsYWJlbG9mZikpOworCisJbWVtc2V0KHQtPmVycm9yLCAwLCBzaXplb2YodC0+ZXJyb3IpKTsKKwlzdHJjcHkodC0+ZXJyb3IsIG5ld25hbWUpOworCSgqaGFuZGxlKS0+Y2hhbmdlZCA9IDE7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gMTsKK30KKworLyogU2V0cyB0aGUgcG9saWN5IG9uIGEgYnVpbHQtaW4gY2hhaW4uICovCitpbnQKK2lwdGNfc2V0X3BvbGljeShjb25zdCBpcHRfY2hhaW5sYWJlbCBjaGFpbiwKKwkJY29uc3QgaXB0X2NoYWlubGFiZWwgcG9saWN5LAorCQlpcHRjX2hhbmRsZV90ICpoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGhvb2s7CisJdW5zaWduZWQgaW50IHBvbGljeW9mZjsKKwlzdHJ1Y3QgaXB0X2VudHJ5ICplOworCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0OworCisJQ0hFQ0soKmhhbmRsZSk7CisJLyogRmlndXJlIG91dCB3aGljaCBjaGFpbi4gKi8KKwlob29rID0gaXB0Y19idWlsdGluKGNoYWluLCAqaGFuZGxlKTsKKwlpZiAoaG9vayA9PSAwKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJaG9vay0tOworCisJcG9saWN5b2ZmID0gZ2V0X2NoYWluX2VuZCgqaGFuZGxlLCAoKmhhbmRsZSktPmluZm8uaG9va19lbnRyeVtob29rXSk7CisJaWYgKHBvbGljeW9mZiAhPSAoKmhhbmRsZSktPmluZm8udW5kZXJmbG93W2hvb2tdKSB7CisJCXByaW50ZigiRVJST1I6IFBvbGljeSBmb3IgYCVzJyBvZmZzZXQgJXUgIT0gdW5kZXJmbG93ICV1XG4iLAorCQkgICAgICAgY2hhaW4sIHBvbGljeW9mZiwgKCpoYW5kbGUpLT5pbmZvLnVuZGVyZmxvd1tob29rXSk7CisJCXJldHVybiAwOworCX0KKworCWUgPSBnZXRfZW50cnkoKmhhbmRsZSwgcG9saWN5b2ZmKTsKKwl0ID0gKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICopaXB0X2dldF90YXJnZXQoZSk7CisKKwlpZiAoc3RyY21wKHBvbGljeSwgSVBUQ19MQUJFTF9BQ0NFUFQpID09IDApCisJCXQtPnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMTsKKwllbHNlIGlmIChzdHJjbXAocG9saWN5LCBJUFRDX0xBQkVMX0RST1ApID09IDApCisJCXQtPnZlcmRpY3QgPSAtTkZfRFJPUCAtIDE7CisJZWxzZSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisJKCpoYW5kbGUpLT5jb3VudGVyX21hcFtlbnRyeTJpbmRleCgqaGFuZGxlLCBlKV0KKwkJPSAoKHN0cnVjdCBjb3VudGVyX21hcCl7IENPVU5URVJfTUFQX05PTUFQLCAwIH0pOworCSgqaGFuZGxlKS0+Y2hhbmdlZCA9IDE7CisKKwlDSEVDSygqaGFuZGxlKTsKKwlyZXR1cm4gMTsKK30KKworLyogV2l0aG91dCB0aGlzLCBvbiBnY2MgMi43LjIuMywgd2UgZ2V0OgorICAgbGliaXB0Yy5jOiBJbiBmdW5jdGlvbiBgaXB0Y19jb21taXQnOgorICAgbGliaXB0Yy5jOjgzMzogZml4ZWQgb3IgZm9yYmlkZGVuIHJlZ2lzdGVyIHdhcyBzcGlsbGVkLgorICAgVGhpcyBtYXkgYmUgZHVlIHRvIGEgY29tcGlsZXIgYnVnIG9yIHRvIGltcG9zc2libGUgYXNtCisgICBzdGF0ZW1lbnRzIG9yIGNsYXVzZXMuCisqLworc3RhdGljIHZvaWQKK3N1YnRyYWN0X2NvdW50ZXJzKHN0cnVjdCBpcHRfY291bnRlcnMgKmFuc3dlciwKKwkJICBjb25zdCBzdHJ1Y3QgaXB0X2NvdW50ZXJzICphLAorCQkgIGNvbnN0IHN0cnVjdCBpcHRfY291bnRlcnMgKmIpCit7CisJYW5zd2VyLT5wY250ID0gYS0+cGNudCAtIGItPnBjbnQ7CisJYW5zd2VyLT5iY250ID0gYS0+YmNudCAtIGItPmJjbnQ7Cit9CisKK2ludAoraXB0Y19jb21taXQoaXB0Y19oYW5kbGVfdCAqaGFuZGxlKQoreworCS8qIFJlcGxhY2UsIHRoZW4gbWFwIGJhY2sgdGhlIGNvdW50ZXJzLiAqLworCXN0cnVjdCBpcHRfcmVwbGFjZSAqcmVwbDsKKwlzdHJ1Y3QgaXB0X2NvdW50ZXJzX2luZm8gKm5ld2NvdW50ZXJzOworCXVuc2lnbmVkIGludCBpOworCXNpemVfdCBjb3VudGVybGVuCisJCT0gc2l6ZW9mKHN0cnVjdCBpcHRfY291bnRlcnNfaW5mbykKKwkJKyBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykgKiAoKmhhbmRsZSktPm5ld19udW1iZXI7CisKKwlDSEVDSygqaGFuZGxlKTsKKyNpZiAwCisJZHVtcF9lbnRyaWVzKCpoYW5kbGUpOworI2VuZGlmCisKKwkvKiBEb24ndCBjb21taXQgaWYgbm90aGluZyBjaGFuZ2VkLiAqLworCWlmICghKCpoYW5kbGUpLT5jaGFuZ2VkKQorCQlnb3RvIGZpbmlzaGVkOworCisJcmVwbCA9IG1hbGxvYyhzaXplb2YoKnJlcGwpICsgKCpoYW5kbGUpLT5lbnRyaWVzLnNpemUpOworCWlmICghcmVwbCkgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhlc2UgYXJlIHRoZSBvbGQgY291bnRlcnMgd2Ugd2lsbCBnZXQgZnJvbSBrZXJuZWwgKi8KKwlyZXBsLT5jb3VudGVycyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykKKwkJCQkqICgqaGFuZGxlKS0+aW5mby5udW1fZW50cmllcyk7CisJaWYgKCFyZXBsLT5jb3VudGVycykgeworCQlmcmVlKHJlcGwpOworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIDA7CisJfQorCQkKKwkvKiBUaGVzZSBhcmUgdGhlIGNvdW50ZXJzIHdlJ3JlIGdvaW5nIHRvIHB1dCBiYWNrLCBsYXRlci4gKi8KKwluZXdjb3VudGVycyA9IG1hbGxvYyhjb3VudGVybGVuKTsKKwlpZiAoIW5ld2NvdW50ZXJzKSB7CisJCWZyZWUocmVwbC0+Y291bnRlcnMpOworCQlmcmVlKHJlcGwpOworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RyY3B5KHJlcGwtPm5hbWUsICgqaGFuZGxlKS0+aW5mby5uYW1lKTsKKwlyZXBsLT5udW1fZW50cmllcyA9ICgqaGFuZGxlKS0+bmV3X251bWJlcjsKKwlyZXBsLT5zaXplID0gKCpoYW5kbGUpLT5lbnRyaWVzLnNpemU7CisJbWVtY3B5KHJlcGwtPmhvb2tfZW50cnksICgqaGFuZGxlKS0+aW5mby5ob29rX2VudHJ5LAorCSAgICAgICBzaXplb2YocmVwbC0+aG9va19lbnRyeSkpOworCW1lbWNweShyZXBsLT51bmRlcmZsb3csICgqaGFuZGxlKS0+aW5mby51bmRlcmZsb3csCisJICAgICAgIHNpemVvZihyZXBsLT51bmRlcmZsb3cpKTsKKwlyZXBsLT5udW1fY291bnRlcnMgPSAoKmhhbmRsZSktPmluZm8ubnVtX2VudHJpZXM7CisJcmVwbC0+dmFsaWRfaG9va3MgPSAoKmhhbmRsZSktPmluZm8udmFsaWRfaG9va3M7CisJbWVtY3B5KHJlcGwtPmVudHJpZXMsICgqaGFuZGxlKS0+ZW50cmllcy5lbnRyaWVzLAorCSAgICAgICAoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSk7CisKKwlpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsIElQVF9TT19TRVRfUkVQTEFDRSwgcmVwbCwKKwkJICAgICAgIHNpemVvZigqcmVwbCkgKyAoKmhhbmRsZSktPmVudHJpZXMuc2l6ZSkgPCAwKSB7CisJCWZyZWUocmVwbC0+Y291bnRlcnMpOworCQlmcmVlKHJlcGwpOworCQlmcmVlKG5ld2NvdW50ZXJzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUHV0IGNvdW50ZXJzIGJhY2suICovCisJc3RyY3B5KG5ld2NvdW50ZXJzLT5uYW1lLCAoKmhhbmRsZSktPmluZm8ubmFtZSk7CisJbmV3Y291bnRlcnMtPm51bV9jb3VudGVycyA9ICgqaGFuZGxlKS0+bmV3X251bWJlcjsKKwlmb3IgKGkgPSAwOyBpIDwgKCpoYW5kbGUpLT5uZXdfbnVtYmVyOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IG1hcHBvcyA9ICgqaGFuZGxlKS0+Y291bnRlcl9tYXBbaV0ubWFwcG9zOworCQlzd2l0Y2ggKCgqaGFuZGxlKS0+Y291bnRlcl9tYXBbaV0ubWFwdHlwZSkgeworCQljYXNlIENPVU5URVJfTUFQX05PTUFQOgorCQkJbmV3Y291bnRlcnMtPmNvdW50ZXJzW2ldCisJCQkJPSAoKHN0cnVjdCBpcHRfY291bnRlcnMpeyAwLCAwIH0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT1VOVEVSX01BUF9OT1JNQUxfTUFQOgorCQkJLyogT3JpZ2luYWwgcmVhZDogWC4KKwkJCSAqIEF0b21pYyByZWFkIG9uIHJlcGxhY2VtZW50OiBYICsgWS4KKwkJCSAqIEN1cnJlbnRseSBpbiBrZXJuZWw6IFouCisJCQkgKiBXYW50IGluIGtlcm5lbDogWCArIFkgKyBaLgorCQkJICogPT4gQWRkIGluIFggKyBZCisJCQkgKiA9PiBBZGQgaW4gcmVwbGFjZW1lbnQgcmVhZC4KKwkJCSAqLworCQkJbmV3Y291bnRlcnMtPmNvdW50ZXJzW2ldID0gcmVwbC0+Y291bnRlcnNbbWFwcG9zXTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ09VTlRFUl9NQVBfWkVST0VEOgorCQkJLyogT3JpZ2luYWwgcmVhZDogWC4KKwkJCSAqIEF0b21pYyByZWFkIG9uIHJlcGxhY2VtZW50OiBYICsgWS4KKwkJCSAqIEN1cnJlbnRseSBpbiBrZXJuZWw6IFouCisJCQkgKiBXYW50IGluIGtlcm5lbDogWSArIFouCisJCQkgKiA9PiBBZGQgaW4gWS4KKwkJCSAqID0+IEFkZCBpbiAocmVwbGFjZW1lbnQgcmVhZCAtIG9yaWdpbmFsIHJlYWQpLgorCQkJICovCisJCQlzdWJ0cmFjdF9jb3VudGVycygmbmV3Y291bnRlcnMtPmNvdW50ZXJzW2ldLAorCQkJCQkgICZyZXBsLT5jb3VudGVyc1ttYXBwb3NdLAorCQkJCQkgICZpbmRleDJlbnRyeSgqaGFuZGxlLCBpKS0+Y291bnRlcnMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsIElQVF9TT19TRVRfQUREX0NPVU5URVJTLAkKKwkgICAgICAgbmV3Y291bnRlcnMsIGNvdW50ZXJsZW4pIDwgMCkgeworCQlmcmVlKHJlcGwtPmNvdW50ZXJzKTsKKwkJZnJlZShyZXBsKTsKKwkJZnJlZShuZXdjb3VudGVycyk7CisJCXJldHVybiAwOworCX0KKworCWZyZWUocmVwbC0+Y291bnRlcnMpOworCWZyZWUocmVwbCk7CisJZnJlZShuZXdjb3VudGVycyk7CisKKyBmaW5pc2hlZDoKKwlmcmVlKCpoYW5kbGUpOworCSpoYW5kbGUgPSBOVUxMOworCXJldHVybiAxOworfQorCisvKiBHZXQgcmF3IHNvY2tldC4gKi8KK2ludAoraXB0Y19nZXRfcmF3X3NvY2tldCgpCit7CisJcmV0dXJuIHNvY2tmZDsKK30KKworLyogVHJhbnNsYXRlcyBlcnJubyBudW1iZXJzIGludG8gbW9yZSBodW1hbi1yZWFkYWJsZSBmb3JtIHRoYW4gc3RyZXJyb3IuICovCitjb25zdCBjaGFyICoKK2lwdGNfc3RyZXJyb3IoaW50IGVycikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdGFibGVfc3RydWN0IHsKKwkJdm9pZCAqZm47CisJCWludCBlcnI7CisJCWNvbnN0IGNoYXIgKm1lc3NhZ2U7CisJfSB0YWJsZSBbXSA9CisJICB7IHsgTlVMTCwgMCwgIkluY29tcGF0aWJsZSB3aXRoIHRoaXMga2VybmVsIiB9LAorCSAgICB7IE5VTEwsIEVOT1BST1RPT1BULCAiaXB0YWJsZXMgd2hvPyAoZG8geW91IG5lZWQgdG8gaW5zbW9kPykiIH0sCisJICAgIHsgTlVMTCwgRU5PU1lTLCAiV2lsbCBiZSBpbXBsZW1lbnRlZCByZWFsIHNvb24uICBJIHByb21pc2UuIiB9LAorCSAgICB7IE5VTEwsIEVOT01FTSwgIk1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0iIH0sCisJICAgIHsgaXB0Y19pbml0LCBFUEVSTSwgIlBlcm1pc3Npb24gZGVuaWVkICh5b3UgbXVzdCBiZSByb290KSIgfSwKKwkgICAgeyBpcHRjX2luaXQsIEVJTlZBTCwgIk1vZHVsZSBpcyB3cm9uZyB2ZXJzaW9uIiB9LAorCSAgICB7IGlwdGNfZGVsZXRlX2NoYWluLCBFTk9URU1QVFksICJDaGFpbiBpcyBub3QgZW1wdHkiIH0sCisJICAgIHsgaXB0Y19kZWxldGVfY2hhaW4sIEVJTlZBTCwgIkNhbid0IGRlbGV0ZSBidWlsdC1pbiBjaGFpbiIgfSwKKwkgICAgeyBpcHRjX2RlbGV0ZV9jaGFpbiwgRU1MSU5LLAorCSAgICAgICJDYW4ndCBkZWxldGUgY2hhaW4gd2l0aCByZWZlcmVuY2VzIGxlZnQiIH0sCisJICAgIHsgaXB0Y19jcmVhdGVfY2hhaW4sIEVFWElTVCwgIkNoYWluIGFscmVhZHkgZXhpc3RzIiB9LAorCSAgICB7IGlwdGNfaW5zZXJ0X2VudHJ5LCBFMkJJRywgIkluZGV4IG9mIGluc2VydGlvbiB0b28gYmlnIiB9LAorCSAgICB7IGlwdGNfcmVwbGFjZV9lbnRyeSwgRTJCSUcsICJJbmRleCBvZiByZXBsYWNlbWVudCB0b28gYmlnIiB9LAorCSAgICB7IGlwdGNfZGVsZXRlX251bV9lbnRyeSwgRTJCSUcsICJJbmRleCBvZiBkZWxldGlvbiB0b28gYmlnIiB9LAorCSAgICB7IGlwdGNfaW5zZXJ0X2VudHJ5LCBFTE9PUCwgIkxvb3AgZm91bmQgaW4gdGFibGUiIH0sCisJICAgIHsgaXB0Y19pbnNlcnRfZW50cnksIEVJTlZBTCwgIlRhcmdldCBwcm9ibGVtIiB9LAorCSAgICAvKiBFSU5WQUwgZm9yIENIRUNLIHByb2JhYmx5IG1lYW5zIGJhZCBpbnRlcmZhY2UuICovCisJICAgIHsgaXB0Y19jaGVja19wYWNrZXQsIEVJTlZBTCwKKwkgICAgICAiYmFkIGFyZ3VtZW50cyAoZG9lcyB0aGF0IGludGVyZmFjZSBleGlzdD8pIiB9LAorCSAgICAvKiBFTk9FTlQgZm9yIERFTEVURSBwcm9iYWJseSBtZWFucyBubyBtYXRjaGluZyBydWxlICovCisJICAgIHsgaXB0Y19kZWxldGVfZW50cnksIEVOT0VOVCwKKwkgICAgICAiYmFkIHJ1bGUgKGRvZXMgYSBtYXRjaGluZyBydWxlIGV4aXN0IGluIHRoYXQgY2hhaW4/KSIgfSwKKwkgICAgeyBOVUxMLCBFTk9FTlQsICJObyBleHRlbmRlZCB0YXJnZXQvbWF0Y2ggYnkgdGhhdCBuYW1lIiB9CisJICB9OworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0YWJsZSkvc2l6ZW9mKHN0cnVjdCB0YWJsZV9zdHJ1Y3QpOyBpKyspIHsKKwkJaWYgKCghdGFibGVbaV0uZm4gfHwgdGFibGVbaV0uZm4gPT0gaXB0Y19mbikKKwkJICAgICYmIHRhYmxlW2ldLmVyciA9PSBlcnIpCisJCQlyZXR1cm4gdGFibGVbaV0ubWVzc2FnZTsKKwl9CisKKwlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHR0lORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZigqaXApL3NpemVvZih1X2ludDMyX3QpOyBpKyspCisJCWlmICgoKHVfaW50MzJfdCAqKWlwKVtpXSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19tYXRjaChjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm9mZikKK3sKKwlhc3NlcnQobS0+bWF0Y2hfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCkpOworCisJKCpvZmYpICs9IG0tPm1hdGNoX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19lbnRyeShjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLCB1bnNpZ25lZCBpbnQgKmksIHVuc2lnbmVkIGludCAqb2ZmLAorCSAgICB1bnNpZ25lZCBpbnQgdXNlcl9vZmZzZXQsIGludCAqd2FzX3JldHVybiwKKwkgICAgaXB0Y19oYW5kbGVfdCBoKQoreworCXVuc2lnbmVkIGludCB0b2ZmOworCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0OworCisJYXNzZXJ0KGUtPnRhcmdldF9vZmZzZXQgPj0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpKTsKKwlhc3NlcnQoZS0+bmV4dF9vZmZzZXQgPj0gZS0+dGFyZ2V0X29mZnNldAorCSAgICAgICArIHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCkpOworCXRvZmYgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSk7CisJSVBUX01BVENIX0lURVJBVEUoZSwgY2hlY2tfbWF0Y2gsICZ0b2ZmKTsKKworCWFzc2VydCh0b2ZmID09IGUtPnRhcmdldF9vZmZzZXQpOworCisJdCA9IChzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqKQorCQlpcHRfZ2V0X3RhcmdldCgoc3RydWN0IGlwdF9lbnRyeSAqKWUpOworCWFzc2VydCh0LT50YXJnZXQudGFyZ2V0X3NpemUgPT0gZS0+bmV4dF9vZmZzZXQgLSBlLT50YXJnZXRfb2Zmc2V0KTsKKwlhc3NlcnQoIWlwdGNfaXNfY2hhaW4odC0+dGFyZ2V0LnUubmFtZSwgaCkpOworCisJaWYgKHN0cmNtcCh0LT50YXJnZXQudS5uYW1lLCBJUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwKSB7CisJCWFzc2VydCh0LT50YXJnZXQudGFyZ2V0X3NpemUKKwkJICAgICAgID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSk7CisKKwkJYXNzZXJ0KHQtPnZlcmRpY3QgPT0gLU5GX0RST1AtMQorCQkgICAgICAgfHwgdC0+dmVyZGljdCA9PSAtTkZfQUNDRVBULTEKKwkJICAgICAgIHx8IHQtPnZlcmRpY3QgPT0gSVBUX1JFVFVSTgorCQkgICAgICAgfHwgdC0+dmVyZGljdCA8IChpbnQpaC0+ZW50cmllcy5zaXplKTsKKworCQlpZiAodC0+dmVyZGljdCA+PSAwKSB7CisJCQlzdHJ1Y3QgaXB0X2VudHJ5ICp0ZSA9IGdldF9lbnRyeShoLCB0LT52ZXJkaWN0KTsKKwkJCWludCBpZHg7CisKKwkJCWlkeCA9IGVudHJ5MmluZGV4KGgsIHRlKTsKKwkJCWFzc2VydChzdHJjbXAoaXB0X2dldF90YXJnZXQodGUpLT51Lm5hbWUsCisJCQkJICAgICAgSVBUX0VSUk9SX1RBUkdFVCkKKwkJCSAgICAgICAhPSAwKTsKKwkJCWFzc2VydCh0ZSAhPSBlKTsKKworCQkJLyogUHJpb3Igbm9kZSBtdXN0IGJlIGVycm9yIG5vZGUsIG9yIHRoaXMgbm9kZS4gKi8KKwkJCWFzc2VydCh0LT52ZXJkaWN0ID09IGVudHJ5Mm9mZnNldChoLCBlKStlLT5uZXh0X29mZnNldAorCQkJICAgICAgIHx8IHN0cmNtcChpcHRfZ2V0X3RhcmdldChpbmRleDJlbnRyeShoLCBpZHgtMSkpCisJCQkJCSAtPnUubmFtZSwgSVBUX0VSUk9SX1RBUkdFVCkKKwkJCSAgICAgICA9PSAwKTsKKwkJfQorCisJCWlmICh0LT52ZXJkaWN0ID09IElQVF9SRVRVUk4KKwkJICAgICYmIHVuY29uZGl0aW9uYWwoJmUtPmlwKQorCQkgICAgJiYgZS0+dGFyZ2V0X29mZnNldCA9PSBzaXplb2YoKmUpKQorCQkJKndhc19yZXR1cm4gPSAxOworCQllbHNlCisJCQkqd2FzX3JldHVybiA9IDA7CisJfSBlbHNlIGlmIChzdHJjbXAodC0+dGFyZ2V0LnUubmFtZSwgSVBUX0VSUk9SX1RBUkdFVCkgPT0gMCkgeworCQlhc3NlcnQodC0+dGFyZ2V0LnRhcmdldF9zaXplCisJCSAgICAgICA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSkpOworCisJCS8qIElmIHRoaXMgaXMgaW4gdXNlciBhcmVhLCBwcmV2aW91cyBtdXN0IGhhdmUgYmVlbiByZXR1cm4gKi8KKwkJaWYgKCpvZmYgPiB1c2VyX29mZnNldCkKKwkJCWFzc2VydCgqd2FzX3JldHVybik7CisKKwkJKndhc19yZXR1cm4gPSAwOworCX0KKwllbHNlICp3YXNfcmV0dXJuID0gMDsKKworCWlmICgqb2ZmID09IHVzZXJfb2Zmc2V0KQorCQlhc3NlcnQoc3RyY21wKHQtPnRhcmdldC51Lm5hbWUsIElQVF9FUlJPUl9UQVJHRVQpID09IDApOworCisJKCpvZmYpICs9IGUtPm5leHRfb2Zmc2V0OworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworLyogRG8gZXZlcnkgY29uY2VpdmFibGUgc2FuaXR5IGNoZWNrIG9uIHRoZSBoYW5kbGUgKi8KK3N0YXRpYyB2b2lkCitkb19jaGVjayhpcHRjX2hhbmRsZV90IGgsIHVuc2lnbmVkIGludCBsaW5lKQoreworCXVuc2lnbmVkIGludCBpLCBuOworCXVuc2lnbmVkIGludCB1c2VyX29mZnNldDsgLyogT2Zmc2V0IG9mIGZpcnN0IHVzZXIgY2hhaW4gKi8KKwlpbnQgd2FzX3JldHVybjsKKworCWFzc2VydChoLT5jaGFuZ2VkID09IDAgfHwgaC0+Y2hhbmdlZCA9PSAxKTsKKwlpZiAoc3RyY21wKGgtPmluZm8ubmFtZSwgImZpbHRlciIpID09IDApIHsKKwkJYXNzZXJ0KGgtPmluZm8udmFsaWRfaG9va3MKKwkJICAgICAgID09ICgxIDw8IE5GX0lQX0xPQ0FMX0lOCisJCQkgICB8IDEgPDwgTkZfSVBfRk9SV0FSRAorCQkJICAgfCAxIDw8IE5GX0lQX0xPQ0FMX09VVCkpOworCisJCS8qIEhvb2tzIHNob3VsZCBiZSBmaXJzdCB0aHJlZSAqLworCQlhc3NlcnQoaC0+aW5mby5ob29rX2VudHJ5W05GX0lQX0xPQ0FMX0lOXSA9PSAwKTsKKworCQluID0gZ2V0X2NoYWluX2VuZChoLCAwKTsKKwkJbiArPSBnZXRfZW50cnkoaCwgbiktPm5leHRfb2Zmc2V0OworCQlhc3NlcnQoaC0+aW5mby5ob29rX2VudHJ5W05GX0lQX0ZPUldBUkRdID09IG4pOworCisJCW4gPSBnZXRfY2hhaW5fZW5kKGgsIG4pOworCQluICs9IGdldF9lbnRyeShoLCBuKS0+bmV4dF9vZmZzZXQ7CisJCWFzc2VydChoLT5pbmZvLmhvb2tfZW50cnlbTkZfSVBfTE9DQUxfT1VUXSA9PSBuKTsKKworCQl1c2VyX29mZnNldCA9IGgtPmluZm8uaG9va19lbnRyeVtORl9JUF9MT0NBTF9PVVRdOworCX0gZWxzZSBpZiAoc3RyY21wKGgtPmluZm8ubmFtZSwgIm5hdCIpID09IDApIHsKKwkJYXNzZXJ0KGgtPmluZm8udmFsaWRfaG9va3MKKwkJICAgICAgID09ICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HCisJCQkgICB8IDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HCisJCQkgICB8IDEgPDwgTkZfSVBfTE9DQUxfT1VUKSk7CisKKwkJYXNzZXJ0KGgtPmluZm8uaG9va19lbnRyeVtORl9JUF9QUkVfUk9VVElOR10gPT0gMCk7CisKKwkJbiA9IGdldF9jaGFpbl9lbmQoaCwgMCk7CisJCW4gKz0gZ2V0X2VudHJ5KGgsIG4pLT5uZXh0X29mZnNldDsKKwkJYXNzZXJ0KGgtPmluZm8uaG9va19lbnRyeVtORl9JUF9QT1NUX1JPVVRJTkddID09IG4pOworCisJCW4gPSBnZXRfY2hhaW5fZW5kKGgsIG4pOworCQluICs9IGdldF9lbnRyeShoLCBuKS0+bmV4dF9vZmZzZXQ7CisJCWFzc2VydChoLT5pbmZvLmhvb2tfZW50cnlbTkZfSVBfTE9DQUxfT1VUXSA9PSBuKTsKKworCQl1c2VyX29mZnNldCA9IGgtPmluZm8uaG9va19lbnRyeVtORl9JUF9MT0NBTF9PVVRdOworCX0gZWxzZSBpZiAoc3RyY21wKGgtPmluZm8ubmFtZSwgIm1hbmdsZSIpID09IDApIHsKKwkJYXNzZXJ0KGgtPmluZm8udmFsaWRfaG9va3MKKwkJICAgICAgID09ICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HCisJCQkgICB8IDEgPDwgTkZfSVBfTE9DQUxfT1VUKSk7CisKKwkJLyogSG9va3Mgc2hvdWxkIGJlIGZpcnN0IHRocmVlICovCisJCWFzc2VydChoLT5pbmZvLmhvb2tfZW50cnlbTkZfSVBfUFJFX1JPVVRJTkddID09IDApOworCisJCW4gPSBnZXRfY2hhaW5fZW5kKGgsIDApOworCQluICs9IGdldF9lbnRyeShoLCBuKS0+bmV4dF9vZmZzZXQ7CisJCWFzc2VydChoLT5pbmZvLmhvb2tfZW50cnlbTkZfSVBfTE9DQUxfT1VUXSA9PSBuKTsKKworCQl1c2VyX29mZnNldCA9IGgtPmluZm8uaG9va19lbnRyeVtORl9JUF9MT0NBTF9PVVRdOworCX0gZWxzZQorCQlhYm9ydCgpOworCisJLyogVXNlciBjaGFpbiA9PSBlbmQgb2YgbGFzdCBidWlsdGluICsgcG9saWN5IGVudHJ5ICovCisJdXNlcl9vZmZzZXQgPSBnZXRfY2hhaW5fZW5kKGgsIHVzZXJfb2Zmc2V0KTsKKwl1c2VyX29mZnNldCArPSBnZXRfZW50cnkoaCwgdXNlcl9vZmZzZXQpLT5uZXh0X29mZnNldDsKKworCS8qIE92ZXJmbG93cyBzaG91bGQgYmUgZW5kIG9mIGVudHJ5IGNoYWlucywgYW5kIHVuY29uZGl0aW9uYWwKKyAgICAgICAgICAgcG9saWN5IG5vZGVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9JUF9OVU1IT09LUzsgaSsrKSB7CisJCXN0cnVjdCBpcHRfZW50cnkgKmU7CisJCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0OworCisJCWlmICghKGgtPmluZm8udmFsaWRfaG9va3MgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJYXNzZXJ0KGgtPmluZm8udW5kZXJmbG93W2ldCisJCSAgICAgICA9PSBnZXRfY2hhaW5fZW5kKGgsIGgtPmluZm8uaG9va19lbnRyeVtpXSkpOworCisJCWUgPSBnZXRfZW50cnkoaCwgZ2V0X2NoYWluX2VuZChoLCBoLT5pbmZvLmhvb2tfZW50cnlbaV0pKTsKKwkJYXNzZXJ0KHVuY29uZGl0aW9uYWwoJmUtPmlwKSk7CisJCWFzc2VydChlLT50YXJnZXRfb2Zmc2V0ID09IHNpemVvZigqZSkpOworCQlhc3NlcnQoZS0+bmV4dF9vZmZzZXQgPT0gc2l6ZW9mKCplKSArIHNpemVvZigqdCkpOworCQl0ID0gKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICopaXB0X2dldF90YXJnZXQoZSk7CisKKwkJYXNzZXJ0KHN0cmNtcCh0LT50YXJnZXQudS5uYW1lLCBJUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwKTsKKwkJYXNzZXJ0KHQtPnZlcmRpY3QgPT0gLU5GX0RST1AtMSB8fCB0LT52ZXJkaWN0ID09IC1ORl9BQ0NFUFQtMSk7CisKKwkJLyogSG9va3MgYW5kIHVuZGVyZmxvd3MgbXVzdCBiZSB2YWxpZCBlbnRyaWVzICovCisJCWVudHJ5MmluZGV4KGgsIGdldF9lbnRyeShoLCBoLT5pbmZvLmhvb2tfZW50cnlbaV0pKTsKKwkJZW50cnkyaW5kZXgoaCwgZ2V0X2VudHJ5KGgsIGgtPmluZm8udW5kZXJmbG93W2ldKSk7CisJfQorCisJYXNzZXJ0KGgtPmluZm8uc2l6ZQorCSAgICAgICA+PSBoLT5pbmZvLm51bV9lbnRyaWVzICogKHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KQorCQkJCQkgK3NpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpKTsKKworCWFzc2VydChoLT5lbnRyaWVzLnNpemUKKwkgICAgICAgPj0gKGgtPm5ld19udW1iZXIKKwkJICAgKiAoc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpCisJCSAgICAgICsgc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSkpKTsKKwlhc3NlcnQoc3RyY21wKGgtPmluZm8ubmFtZSwgaC0+ZW50cmllcy5uYW1lKSA9PSAwKTsKKworCWkgPSAwOyBuID0gMDsKKwl3YXNfcmV0dXJuID0gMDsKKwkvKiBDaGVjayBhbGwgdGhlIGVudHJpZXMuICovCisJSVBUX0VOVFJZX0lURVJBVEUoaC0+ZW50cmllcy5lbnRyaWVzLCBoLT5lbnRyaWVzLnNpemUsCisJCQkgIGNoZWNrX2VudHJ5LCAmaSwgJm4sIHVzZXJfb2Zmc2V0LCAmd2FzX3JldHVybiwgaCk7CisKKwlhc3NlcnQoaSA9PSBoLT5uZXdfbnVtYmVyKTsKKwlhc3NlcnQobiA9PSBoLT5lbnRyaWVzLnNpemUpOworCisJLyogRmluYWwgZW50cnkgbXVzdCBiZSBlcnJvciBub2RlICovCisJYXNzZXJ0KHN0cmNtcChpcHRfZ2V0X3RhcmdldChpbmRleDJlbnRyeShoLCBoLT5uZXdfbnVtYmVyLTEpKS0+dS5uYW1lLAorCQkgICAgICBJUFRfRVJST1JfVEFSR0VUKSA9PSAwKTsKK30K