LyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgIEREREQgICAgICAgSiAgViAgIFYgIFUgICBVICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgRCAgIEQgICAgICBKICBWICAgViAgVSAgIFUgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICBEICAgRCAgICAgIEogIFYgICBWICBVICAgVSAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgIEQgICBEICBKICAgSiAgIFYgViAgIFUgICBVICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgRERERCAgICBKSkogICAgIFYgICAgIFVVVSAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgRGpWdSBJbWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRGVzaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaG4gQ3Jpc3R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bHkgMTk5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgQ29weXJpZ2h0IDE5OTktMjAxMSBJbWFnZU1hZ2ljayBTdHVkaW8gTExDLCBhIG5vbi1wcm9maXQgb3JnYW5pemF0aW9uICAgICAgJQolICBkZWRpY2F0ZWQgdG8gbWFraW5nIHNvZnR3YXJlIGltYWdpbmcgc29sdXRpb25zIGZyZWVseSBhdmFpbGFibGUuICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSAgJQolICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZy9zY3JpcHQvbGljZW5zZS5waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICUKJSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgJQolICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAlCiUgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICUKJSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolCiovCgwKLyoKICBJbmNsdWRlIGRlY2xhcmF0aW9ucy4KKi8KI2luY2x1ZGUgIk1hZ2lja0NvcmUvc3R1ZGlvLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2Jsb2IuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvYmxvYi1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NhY2hlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbG9ybWFwLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbnN0aXR1dGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvZXhjZXB0aW9uLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2V4Y2VwdGlvbi1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2xpc3QuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbWFnaWNrLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21lbW9yeV8uaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbW9uaXRvci5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9tb25pdG9yLXByaXZhdGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcGl4ZWwtYWNjZXNzb3IuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcXVhbnR1bS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3N0YXRpYy5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9zdHJpbmdfLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21vZHVsZS5oIgojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX0RKVlVfREVMRUdBVEUpCiNpbmNsdWRlIDxsaWJkanZ1L2RkanZ1YXBpLmg+CiNlbmRpZgoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIEkgcyBEIEogViBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgSXNESlZVKCkgcmV0dXJucyBNYWdpY2tUcnVlIGlmIHRoZSBpbWFnZSBmb3JtYXQgdHlwZSwgaWRlbnRpZmllZCBieSB0aGUKJSAgbWFnaWNrIHN0cmluZywgaXMgREpWVS4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBJc0RKVlUgbWV0aG9kIGlzOgolCiUgICAgICBNYWdpY2tCb29sZWFuVHlwZSBJc0RKVlUoY29uc3QgdW5zaWduZWQgY2hhciAqbWFnaWNrLGNvbnN0IHNpemVfdCBsZW5ndGgpCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzOgolCiUgICAgbyBtYWdpY2s6IGNvbXBhcmUgaW1hZ2UgZm9ybWF0IHBhdHRlcm4gYWdhaW5zdCB0aGVzZSBieXRlcy4KJQolICAgIG8gbGVuZ3RoOiBTcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWFnaWNrIHN0cmluZy4KJQoqLwpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSXNESlZVKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hZ2ljayxjb25zdCBzaXplX3QgbGVuZ3RoKQp7CiAgaWYgKGxlbmd0aCA8IDgpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIGlmIChtZW1jbXAobWFnaWNrLCJBVCZURk9STSIsOCkgPT0gMCkKICAgIHJldHVybihNYWdpY2tUcnVlKTsKICByZXR1cm4oTWFnaWNrRmFsc2UpOwp9CgwKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9ESlZVX0RFTEVHQVRFKQovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBSIGUgYSBkIEQgSiBWIFUgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFJlYWRESlZVSW1hZ2UoKSByZWFkcyBESlZVIGltYWdlIGFuZCByZXR1cm5zIGl0LiAgSXQgYWxsb2NhdGVzIHRoZSBtZW1vcnkKJSAgbmVjZXNzYXJ5IGZvciB0aGUgbmV3IEltYWdlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldwolICBpbWFnZSBvciBzZXQgb2YgaW1hZ2VzLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIFJlYWRESlZVSW1hZ2UgbWV0aG9kIGlzOgolCiUgICAgICBJbWFnZSAqUmVhZERKVlVJbWFnZShjb25zdCBJbWFnZUluZm8gKmltYWdlX2luZm8sCiUgICAgICAgIEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKJQolICBBIGRlc2NyaXB0aW9uIG9mIGVhY2ggcGFyYW1ldGVyIGZvbGxvd3M6CiUKJSAgICBvIGltYWdlX2luZm86IHRoZSBpbWFnZSBpbmZvLgolCiUgICAgbyBleGNlcHRpb246IHJldHVybiBhbnkgZXJyb3JzIG9yIHdhcm5pbmdzIGluIHRoaXMgc3RydWN0dXJlLgolCiovCgojaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQpleHRlcm4gIkMiIHsKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBfTG9hZENvbnRleHQKICAgTG9hZENvbnRleHQ7CgpzdHJ1Y3QgX0xvYWRDb250ZXh0CnsKICBkZGp2dV9jb250ZXh0X3QqIGNvbnRleHQ7CiAgZGRqdnVfZG9jdW1lbnRfdCAqZG9jdW1lbnQ7CiAgZGRqdnVfcGFnZV90ICpwYWdlOwogIGludCBzdHJlYW1pZDsKICBpbnQgcGFnZXM7CiAgSW1hZ2UgKmltYWdlOwp9OwoKI2RlZmluZSBCTE9DS1NJWkUgIDY1NTM2CiNpZiAwCnN0YXRpYyB2b2lkCnB1bXBfZGF0YShJbWFnZSAqaW1hZ2UsIExvYWRDb250ZXh0KiBsYykKewogICAgICAgIGludCBibG9ja3NpemUgPSBCTE9DS1NJWkU7CiAgICAgICAgY2hhciBkYXRhW0JMT0NLU0laRV07CiAgICAgICAgaW50IHNpemU7CgogICAgICAgIC8qIGkgbWlnaHQgY2hlY2sgZm9yIGEgY29uZGl0aW9uISAqLwogICAgICAgIHdoaWxlICgoc2l6ZSA9IChzaXplX3QpIFJlYWRCbG9iKGltYWdlLChzaXplX3QpIGJsb2Nrc2l6ZSxkYXRhKSkgPT0gYmxvY2tzaXplKSB7CiAgICAgICAgICAgICAgICBkZGp2dV9zdHJlYW1fd3JpdGUobGMtPmRvY3VtZW50LCBsYy0+c3RyZWFtaWQsIGRhdGEsIHNpemUpOwogICAgICAgIH0KICAgICAgICBpZiAoc2l6ZSkKICAgICAgICAgICAgICAgIGRkanZ1X3N0cmVhbV93cml0ZShsYy0+ZG9jdW1lbnQsIGxjLT5zdHJlYW1pZCwgZGF0YSwgc2l6ZSk7CiAgICAgICAgZGRqdnVfc3RyZWFtX2Nsb3NlKGxjLT5kb2N1bWVudCwgbGMtPnN0cmVhbWlkLCAwKTsKfQojZW5kaWYKCi8qIHJldHVybnMgTlVMTCBvbmx5IGFmdGVyIGFsbCBpcyBkZWxpdmVyZWQhICovCnN0YXRpYyBkZGp2dV9tZXNzYWdlX3QqCnB1bXBfZGF0YV91bnRpbF9tZXNzYWdlKExvYWRDb250ZXh0ICpsYyxJbWFnZSAqaW1hZ2UpIC8qIGRkanZ1X2NvbnRleHRfdCAqY29udGV4dCwgdHlwZSBkZGp2dV9kb2N1bWVudF90eXBlX3QgKi8KewogICAgICAgIHNpemVfdCBibG9ja3NpemUgPSBCTE9DS1NJWkU7CiAgICAgICAgdW5zaWduZWQgY2hhciBkYXRhW0JMT0NLU0laRV07CiAgICAgICAgc2l6ZV90IHNpemU7CiAgICAgICAgZGRqdnVfbWVzc2FnZV90ICptZXNzYWdlOwoKICAgICAgICAvKiBpIG1pZ2h0IGNoZWNrIGZvciBhIGNvbmRpdGlvbiEgKi8KICAgICAgICB3aGlsZSAoIShtZXNzYWdlID0gZGRqdnVfbWVzc2FnZV9wZWVrKGxjLT5jb250ZXh0KSkKICAgICAgICAgICAgICAgJiYgKHNpemUgPSAoc2l6ZV90KSBSZWFkQmxvYihpbWFnZSwoc2l6ZV90KSBibG9ja3NpemUsZGF0YSkpID09IGJsb2Nrc2l6ZSkgewogICAgICAgICAgICAgICAgZGRqdnVfc3RyZWFtX3dyaXRlKGxjLT5kb2N1bWVudCwgbGMtPnN0cmVhbWlkLCAoY2hhciAqKSBkYXRhLCBzaXplKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lc3NhZ2UpCiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgICAgICBpZiAoc2l6ZSkKICAgICAgICAgICAgICAgIGRkanZ1X3N0cmVhbV93cml0ZShsYy0+ZG9jdW1lbnQsIGxjLT5zdHJlYW1pZCwgKGNoYXIgKikgZGF0YSwgc2l6ZSk7CiAgICAgICAgZGRqdnVfc3RyZWFtX2Nsb3NlKGxjLT5kb2N1bWVudCwgbGMtPnN0cmVhbWlkLCAwKTsKICAgICAgICByZXR1cm4gTlVMTDsKfQojZGVmaW5lIERFQlVHIDAKCiNpZiBERUJVRwpzdGF0aWMgY29uc3QgY2hhcioKbWVzc2FnZV90YWdfbmFtZShkZGp2dV9tZXNzYWdlX3RhZ190IHRhZykKewogICBzdGF0aWMgY2hhciogbmFtZXNbXSA9CiAgICAgIHsKICAgICAgICAgIkVSUk9SIiwKICAgICAgICAgIklORk8iLAogICAgICAgICAiTkVXU1RSRUFNIiwKICAgICAgICAgIkRPQ0lORk8iLAogICAgICAgICAiUEFHRUlORk8iLAogICAgICAgICAiUkVMQVlPVVQiLAogICAgICAgICAiUkVESVNQTEFZIiwKICAgICAgICAgIkNIVU5LIiwKICAgICAgICAgIlRIVU1CTkFJTCIsCiAgICAgICAgICJQUk9HUkVTUyIsCiAgICAgIH07CiAgIGlmICh0YWcgPD0gRERKVlVfUFJPR1JFU1MpCiAgICAgIHJldHVybiBuYW1lc1t0YWddOwogICBlbHNlIHsKICAgICAgLyogYmFyayEgKi8KICAgICAgcmV0dXJuIDA7CiAgIH0KfQojZW5kaWYKCi8qIHdyaXRlIG91dCBuaWNlIGluZm8gb24gdGhlIG1lc3NhZ2UsCiAqIGFuZCBzdG9yZSBpbiAqdXNlciogZGF0YSB0aGUgaW5mbyBvbiBwcm9ncmVzcy4KICogKi8KaW50CnByb2Nlc3NfbWVzc2FnZShkZGp2dV9tZXNzYWdlX3QgKm1lc3NhZ2UpCnsKCiNpZiAwCiAgIGRkanZ1X2NvbnRleHRfdCogY29udGV4dD0gbWVzc2FnZS0+bV9hbnkuY29udGV4dDsKI2VuZGlmCgogICBpZiAoISBtZXNzYWdlKQogICAgICByZXR1cm4oLTEpOwojaWYgREVCVUcKICAgcHJpbnRmKCIqKiogJXM6ICVzLlxuIixfX0ZVTkNUSU9OX18sIG1lc3NhZ2VfdGFnX25hbWUobWVzc2FnZS0+bV9hbnkudGFnKSk7CiNlbmRpZgoKCiAgIHN3aXRjaCAobWVzc2FnZS0+bV9hbnkudGFnKXsKICAgY2FzZSBEREpWVV9ET0NJTkZPOgogICB7CiAgICAgIGRkanZ1X2RvY3VtZW50X3QqIGRvY3VtZW50PSBtZXNzYWdlLT5tX2FueS5kb2N1bWVudDsKICAgICAgLyogZGRqdnVfZG9jdW1lbnRfZGVjb2Rpbmdfc3RhdHVzICBpcyBzZXQgYnkgbGliZGp2dSEgKi8KICAgICAgLyogd2UgaGF2ZSBzb21lIGluZm8gb24gdGhlIGRvY3VtZW50ICAqLwogICAgICBMb2FkQ29udGV4dCAqbGMgPSAoTG9hZENvbnRleHQgKikgZGRqdnVfZG9jdW1lbnRfZ2V0X3VzZXJfZGF0YShkb2N1bWVudCk7CiAgICAgIGxjLT5wYWdlcyA9IGRkanZ1X2RvY3VtZW50X2dldF9wYWdlbnVtKGRvY3VtZW50KTsKI2lmIERFQlVHCiAgICAgIHByaW50ZigidGhlIGRvYyBoYXMgJWQgcGFnZXNcbiIsIGRkanZ1X2RvY3VtZW50X2dldF9wYWdlbnVtKGRvY3VtZW50KSk7CiNlbmRpZgogICAgICBicmVhazsKICAgfQogICBjYXNlIERESlZVX0NIVU5LOgojaWYgREVCVUcKICAgICAgICAgICBwcmludGYoInRoZSBuYW1lIG9mIHRoZSBjaHVuayBpczogJXNcbiIsIG1lc3NhZ2UtPm1fY2h1bmsuY2h1bmtpZCk7CiNlbmRpZgogICAgICAgICAgIGJyZWFrOwoKCiAgIGNhc2UgRERKVlVfUkVMQVlPVVQ6CiAgIGNhc2UgRERKVlVfUEFHRUlORk86CiAgIHsKI2lmIDAKICAgICAgZGRqdnVfcGFnZV90KiBwYWdlID0gbWVzc2FnZS0+bV9hbnkucGFnZTsKICAgICAgcGFnZV9pbmZvKiBpbmZvID0gZGRqdnVfcGFnZV9nZXRfdXNlcl9kYXRhKHBhZ2UpOwoKICAgICAgcHJpbnRmKCJwYWdlIGRlY29kaW5nIHN0YXR1czogJWQgJXMlcyVzXG4iLAogICAgICAgICAgICAgZGRqdnVfcGFnZV9kZWNvZGluZ19zdGF0dXMocGFnZSksCiAgICAgICAgICAgICBzdGF0dXNfY29sb3IsIHN0YXR1c19uYW1lKGRkanZ1X3BhZ2VfZGVjb2Rpbmdfc3RhdHVzKHBhZ2UpKSwgY29sb3JfcmVzZXQpOwoKICAgICAgcHJpbnRmKCJ0aGUgcGFnZSBMQVlPVVQgY2hhbmdlZDogd2lkdGggeCBoZWlnaHQ6ICVkIHggJWQgQCAlZCBkcGkuIFZlcnNpb24gJWQsIHR5cGUgJWRcbiIsCiAgICAgICAgICAgICAvLyBwcmludGYoInBhZ2UgaW5mbzpcbiB3aWR0aCB4IGhlaWdodDogJWQgeCAlZCBAICVkIGRwaSwgdmVyc2lvbiAlZCwgdHlwZSAlZFxuIiwKICAgICAgICAgICAgIGRkanZ1X3BhZ2VfZ2V0X3dpZHRoKHBhZ2UpLAogICAgICAgICAgICAgZGRqdnVfcGFnZV9nZXRfaGVpZ2h0KHBhZ2UpLAogICAgICAgICAgICAgZGRqdnVfcGFnZV9nZXRfcmVzb2x1dGlvbihwYWdlKSwKICAgICAgICAgICAgIGRkanZ1X3BhZ2VfZ2V0X3ZlcnNpb24ocGFnZSksCiAgICAgICAgICAgICAvKiBEREpWVV9QQUdFVFlQRV9CSVRPTkFMICovCiAgICAgICAgICAgICBkZGp2dV9wYWdlX2dldF90eXBlKHBhZ2UpKTsKCiAgICAgIGluZm8tPmluZm8gPSAxOwojZW5kaWYKICAgICAgYnJlYWs7CiAgIH0KCiAgIGNhc2UgRERKVlVfUkVESVNQTEFZOgogICB7CgojaWYgMAogICAgZGRqdnVfcGFnZV90KiBwYWdlID0gbWVzc2FnZS0+bV9hbnkucGFnZTsKICAgICAgcGFnZV9pbmZvKiBpbmZvID0gZGRqdnVfcGFnZV9nZXRfdXNlcl9kYXRhKHBhZ2UpOwoKICAgICAgcHJpbnRmKCJ0aGUgcGFnZSBjYW4vc2hvdWxkIGJlIFJFRElTUExBWUVEXG4iKTsKICAgICAgaW5mby0+ZGlzcGxheSA9IDE7CiNlbmRpZgogICAgICBicmVhazsKICAgfQoKICAgY2FzZSBEREpWVV9QUk9HUkVTUzoKI2lmIERFQlVHCiAgICAgICAgICAgcHJpbnRmKCJQUk9HUkVTUzpcbiIpOwojZW5kaWYKICAgICAgICAgICBicmVhazsKICAgY2FzZSBEREpWVV9FUlJPUjoKICAgICAgICAgICBwcmludGYoInNpbXBseSBFUlJPUiFcbiBtZXNzYWdlOlx0JXNcbmZ1bmN0aW9uOlx0JXMoZmlsZSAlcylcbmxpbmVubzpcdCVkXG4iLAogICAgICAgICAgICAgICAgICBtZXNzYWdlLT5tX2Vycm9yLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPm1fZXJyb3IuZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPm1fZXJyb3IuZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPm1fZXJyb3IubGluZW5vKTsKICAgICAgICAgICBicmVhazsKICAgY2FzZSBEREpWVV9JTkZPOgojaWYgREVCVUcKICAgICAgICAgICBwcmludGYoIklORk86ICVzIVxuIiwgbWVzc2FnZS0+bV9pbmZvLm1lc3NhZ2UpOwojZW5kaWYKICAgICAgICAgICBicmVhazsKICAgZGVmYXVsdDoKICAgICAgcHJpbnRmKCJ1bmV4cGVjdGVkXG4iKTsKICAgfTsKICByZXR1cm4obWVzc2FnZS0+bV9hbnkudGFnKTsKfQoKCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCn0KI2VuZGlmCgoKI2RlZmluZSBSR0IgMQoKLyoKICogRGpWdSBhZHZlcnRpc2VkIHJlYWRpbmVzcyB0byBwcm92aWRlIGJpdG1hcDogU28gZ2V0IGl0IQogKiB3ZSB1c2UgdGhlIFJHQiBmb3JtYXQhCiAqLwpzdGF0aWMgdm9pZApnZXRfcGFnZV9pbWFnZShMb2FkQ29udGV4dCAqbGMsIGRkanZ1X3BhZ2VfdCAqcGFnZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbyApIHsKICBkZGp2dV9mb3JtYXRfdAogICAgKmZvcm1hdDsKCiAgZGRqdnVfcGFnZV90eXBlX3QKICAgIHR5cGU7CgogIEltYWdlCiAgICAqaW1hZ2U7CgogIGludAogICAgcmV0LAogICAgc3RyaWRlOwoKICB1bnNpZ25lZCBjaGFyCiAgICAqcTsKCiAgICAgICAgZGRqdnVfcmVjdF90IHJlY3Q7CiAgICAgICAgcmVjdC54ID0geDsKICAgICAgICByZWN0LnkgPSB5OwogICAgICAgIHJlY3QudyA9ICh1bnNpZ25lZCBpbnQpIHc7ICAgICAgICAgICAgIC8qIC8xMCAqLwogICAgICAgIHJlY3QuaCA9ICh1bnNpZ25lZCBpbnQpIGg7ICAgICAgICAgICAgIC8qIC8xMCAqLwoKICAgICAgICBpbWFnZSA9IGxjLT5pbWFnZTsKICAgICAgICB0eXBlID0gZGRqdnVfcGFnZV9nZXRfdHlwZShsYy0+cGFnZSk7CgogICAgICAgIC8qIHN0cmlkZSBvZiB0aGlzIHRlbXBvcmFyeSBidWZmZXI6ICovCiAgICAgICAgc3RyaWRlID0gKHR5cGUgPT0gRERKVlVfUEFHRVRZUEVfQklUT05BTCk/CiAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbHVtbnMgKyA3KS84IDogaW1hZ2UtPmNvbHVtbnMgKjM7CgogICAgICAgIHEgPSAodW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShpbWFnZS0+cm93cyxzdHJpZGUpOwogICAgICAgIGlmIChxID09ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCiAgICAgICAgICByZXR1cm47CgogICAgICAgIGZvcm1hdCA9IGRkanZ1X2Zvcm1hdF9jcmVhdGUoCiAgICAgICAgICAgICAgICAodHlwZSA9PSBEREpWVV9QQUdFVFlQRV9CSVRPTkFMKT9EREpWVV9GT1JNQVRfTFNCVE9NU0IgOiBEREpWVV9GT1JNQVRfUkdCMjQsCiAgICAgICAgICAgICAgICAvKiBEREpWVV9GT1JNQVRfUkdCMjQKICAgICAgICAgICAgICAgICAqIERESlZVX0ZPUk1BVF9SR0JNQVNLMzIqLwogICAgICAgICAgICAgICAgLyogRERKVlVfRk9STUFUX1JHQk1BU0szMiAqLwogICAgICAgICAgICAgICAgMCwgTlVMTCk7CgojaWYgMAogICAgICAgIC8qIGZpeG1lOiAgVGhyb3dSZWFkZXJFeGNlcHRpb24gaXMgYSBtYWNybywgd2hpY2ggdXNlcyAgYGV4Y2VwdGlvbicgdmFyaWFibGUgKi8KICAgICAgICBpZiAoZm9ybWF0ID09IE5VTEwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRocm93UmVhZGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOyAqLwogICAgICAgICAgICAgICAgfQoKI2VuZGlmCiAgICAgICAgZGRqdnVfZm9ybWF0X3NldF9yb3dfb3JkZXIoZm9ybWF0LCAxKTsKICAgICAgICBkZGp2dV9mb3JtYXRfc2V0X3lfZGlyZWN0aW9uKGZvcm1hdCwgMSk7CgogICAgICAgIHJldCA9IGRkanZ1X3BhZ2VfcmVuZGVyKHBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERESlZVX1JFTkRFUl9DT0xPUiwgLyogZGRqdnVfcmVuZGVyX21vZGVfdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsICAgICAvKiBtbWM6ID8/ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCAvKiA/PyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcSk7CiAgICAgICAgKHZvaWQpIHJldDsKICAgICAgICBkZGp2dV9mb3JtYXRfcmVsZWFzZShmb3JtYXQpOwoKCiAgICAgICAgaWYgKHR5cGUgPT0gRERKVlVfUEFHRVRZUEVfQklUT05BTCkgewogICAgICAgICAgICAgICAgLyogICovCiNpZiBERUJVRwogICAgICAgICAgICAgICAgcHJpbnRmKCIlczogZXhwYW5kaW5nIEJJVE9OQUwgcGFnZS9pbWFnZVxuIiwgX19GVU5DVElPTl9fKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBzaXplX3QgYml0LCBieXRlOwoKICAgICAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFudHVtICogbyA9IFF1ZXVlQXV0aGVudGljUGl4ZWxzKGltYWdlLDAseSxpbWFnZS0+Y29sdW1ucywxLCZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSAoUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0PTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZT0wOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhtZTogIHRoZSBub24tYWxpZ25lZCwgbGFzdCA9PDcgYml0cyAhIHRoYXQncyBvayEhISovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4PSAwOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQgPT0gMCkgYnl0ZT0gKHNpemVfdCkgcVsoeSAqIHN0cmlkZSkgKyAoeCAvIDgpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsSW5kZXgoaW1hZ2UsKFF1YW50dW0pICgoKGJ5dGUgJiAweDAxKSAhPSAwKSA/IDB4MDAgOiAweDAxKSxvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQgPT0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQ9MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZT4+PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8rPUdldFBpeGVsQ29tcG9uZW50cyhpbWFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN5bmNBdXRoZW50aWNQaXhlbHMoaW1hZ2UsJmltYWdlLT5leGNlcHRpb24pID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaW1hZ2UtPnBpbmcpCiAgICAgICAgICAgICAgICAgIFN5bmNJbWFnZShpbWFnZSk7CiAgICAgICAgfSBlbHNlIHsKI2lmIERFQlVHCiAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBleHBhbmRpbmcgUEhPVE8gcGFnZS9pbWFnZVxuIiwgX19GVU5DVElPTl9fKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAvKiBub3cgdHJhbnNmZXIgbGluZS13aXNlOiAqLwogICAgICAgICAgICAgICAgc3NpemVfdCBpOwojaWYgMAogICAgICAgICAgICAgICAgLyogb2xkOiAqLwogICAgICAgICAgICAgICAgY2hhciogcjsKI2Vsc2UKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFF1YW50dW0gKnI7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzOwojZW5kaWYKICAgICAgICAgICAgICAgIHM9cTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7aTwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKI2lmIERFQlVHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDEwMDAgPT0gMCkgcHJpbnRmKCIlZFxuIixpKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gUXVldWVBdXRoZW50aWNQaXhlbHMoaW1hZ2UsMCxpLGltYWdlLT5jb2x1bW5zLDEsJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gKFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbFJlZChpbWFnZSxTY2FsZUNoYXJUb1F1YW50dW0oKnMrKykscik7CiAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWxHcmVlbihpbWFnZSxTY2FsZUNoYXJUb1F1YW50dW0oKnMrKykscik7CiAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWxCbHVlKGltYWdlLFNjYWxlQ2hhclRvUXVhbnR1bSgqcysrKSxyKTsKICAgICAgICAgICAgICAgICAgICByKz1HZXRQaXhlbENvbXBvbmVudHMoaW1hZ2UpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jQXV0aGVudGljUGl4ZWxzKGltYWdlLCZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBxPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkocSk7Cn0KCgojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX0RKVlVfREVMRUdBVEUpCgojaWYgMApzdGF0aWMgaW50CmdldF9wYWdlX2xpbmUoTG9hZENvbnRleHQgKmxjLCBpbnQgcm93LCBRdWFudHVtSW5mbyogcXVhbnR1bV9pbmZvKQp7CiAgZGRqdnVfZm9ybWF0X3QKICAgICpmb3JtYXQ7CgogIGludAogICAgcmV0OwoKICBzaXplX3QKICAgIHN0cmlkZTsKCiAgdW5zaWduZWQgY2hhcgogICAgKnE7CgogICAgICAgIGRkanZ1X3JlY3RfdCByZWN0LCBwYWdlcmVjdDsKICAgICAgICByZWN0LnggPSAwOwogICAgICAgIHJlY3QueSA9IHJvdzsKICAgICAgICByZWN0LncgPSBsYy0+aW1hZ2UtPmNvbHVtbnM7ICAgICAgICAgICAgIC8qIC8xMCAqLwogICAgICAgIHJlY3QuaCA9IDE7ICAgICAgICAgICAgIC8qIC8xMCAqLwoKICAgICAgICBwYWdlcmVjdC54ID0gMDsKICAgICAgICBwYWdlcmVjdC55ID0gMDsKICAgICAgICBwYWdlcmVjdC53ID0gbGMtPmltYWdlLT5jb2x1bW5zOwogICAgICAgIHBhZ2VyZWN0LmggPSBsYy0+aW1hZ2UtPnJvd3M7CgoKICAgICAgICBmb3JtYXQgPSBkZGp2dV9mb3JtYXRfY3JlYXRlKAojaWYgUkdCCiAgICAgICAgICAgICAgICBEREpWVV9GT1JNQVRfUkdCMjQKI2Vsc2UKICAgICAgICAgICAgICAgIERESlZVX0ZPUk1BVF9HUkVZOAojZW5kaWYKICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgIDAsIE5VTEwpOwogICAgICAgIGRkanZ1X2Zvcm1hdF9zZXRfcm93X29yZGVyKGZvcm1hdCwgMSk7CiAgICAgICAgZGRqdnVfZm9ybWF0X3NldF95X2RpcmVjdGlvbihmb3JtYXQsIDEpOwoKICAgICAgICBzdHJpZGU9MTsKI2lmIFJHQgogICAgICAgIHN0cmlkZT0zOwojZW5kaWYKICAgICAgICBxID0gKHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkobGMtPmltYWdlLT5jb2x1bW5zLHN0cmlkZSk7CgogICAgICAgIHJldCA9IGRkanZ1X3BhZ2VfcmVuZGVyKGxjLT5wYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREpWVV9SRU5ERVJfQ09MT1IsIC8qIGRkanZ1X3JlbmRlcl9tb2RlX3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZ2VyZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgICAgIC8qIG1tYzogPz8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcmVjdC53ICogMywgLyogPz8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXEpOwoKICAgICAgICBJbXBvcnRRdWFudHVtUGl4ZWxzKGxjLT5pbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYWNoZVZpZXcgKikgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50dW1faW5mbywKI2lmIFJHQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCUXVhbnR1bQojZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JheVF1YW50dW0KI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAscSwmbGMtPmltYWdlLT5leGNlcHRpb24pOwogICAgICAgIHE9KHVuc2lnbmVkIGNoYXIgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShxKTsKICAgICAgICBkZGp2dV9mb3JtYXRfcmVsZWFzZShmb3JtYXQpOwogICAgICAgIHJldHVybiByZXQ7Cn0KI2VuZGlmCiNlbmRpZgoKLyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgUiBlIGEgZCBPIG4gZSBEIEogViBVIEkgbSBhIGcgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolICBSZWFkT25lREpWVUltYWdlKCkgcmVhZHMgYSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChESlZVKSBpbWFnZSBmaWxlCiUgIChtaW51cyB0aGUgOC1ieXRlIHNpZ25hdHVyZSkgIGFuZCByZXR1cm5zIGl0LiAgSXQgYWxsb2NhdGVzIHRoZSBtZW1vcnkKJSAgbmVjZXNzYXJ5IGZvciB0aGUgbmV3IEltYWdlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldwolICBpbWFnZS4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBSZWFkT25lREpWVUltYWdlIG1ldGhvZCBpczoKJQolICAgICAgSW1hZ2UgKlJlYWRPbmVESlZVSW1hZ2UoTW5nSW5mbyAqbW5nX2luZm8sIGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbywKJSAgICAgICAgIEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKJQolICBBIGRlc2NyaXB0aW9uIG9mIGVhY2ggcGFyYW1ldGVyIGZvbGxvd3M6CiUKJSAgICBvIG1uZ19pbmZvOiBTcGVjaWZpZXMgYSBwb2ludGVyIHRvIGEgTW5nSW5mbyBzdHJ1Y3R1cmUuCiUKJSAgICBvIGltYWdlX2luZm86IHRoZSBpbWFnZSBpbmZvLgolCiUgICAgbyBleGNlcHRpb246IHJldHVybiBhbnkgZXJyb3JzIG9yIHdhcm5pbmdzIGluIHRoaXMgc3RydWN0dXJlLgolCiovCgpzdGF0aWMgaW5saW5lIGRvdWJsZSBNYWdpY2tNYXgoY29uc3QgZG91YmxlIHgsY29uc3QgZG91YmxlIHkpCnsKICBpZiAoeCA+IHkpCiAgICByZXR1cm4oeCk7CiAgcmV0dXJuKHkpOwp9CgpzdGF0aWMgSW1hZ2UgKlJlYWRPbmVESlZVSW1hZ2UoTG9hZENvbnRleHQqIGxjLGNvbnN0IGludCBwYWdlbnVtLAogIGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbyxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCnsKICBkZGp2dV9wYWdlX3R5cGVfdAogICAgIHR5cGU7CgogIGRkanZ1X3BhZ2VpbmZvX3QgaW5mbzsKICBkZGp2dV9tZXNzYWdlX3QgKm1lc3NhZ2U7CiAgSW1hZ2UgKmltYWdlOwogIGludCBsb2dnaW5nOwogIGludCB0YWc7CgogICAgICAgIC8qIHNvLCB3ZSBrbm93IHRoYXQgdGhlIHBhZ2UgaXMgdGhlcmUhIEdldCBpdHMgZGltZW5zaW9uLCBhbmQgICovCgogICAgICAgIC8qIFJlYWQgb25lIERKVlUgaW1hZ2UgKi8KICAgICAgICBpbWFnZSA9IGxjLT5pbWFnZTsKCiAgICAgICAgLyogcmVnaXN0ZXIgUXVhbnR1bSAqcTsgKi8KCiAgICAgICAgbG9nZ2luZz1Mb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCAiICBlbnRlciBSZWFkT25lREpWVUltYWdlKCkiKTsKICAgICAgICAodm9pZCkgbG9nZ2luZzsKCiNpZiBERUJVRwogICAgICAgIHByaW50ZigiPT09PSAgTG9hZGluZyB0aGUgcGFnZSAlZFxuIiwgcGFnZW51bSk7CiNlbmRpZgogICAgICAgIGxjLT5wYWdlID0gZGRqdnVfcGFnZV9jcmVhdGVfYnlfcGFnZW5vKGxjLT5kb2N1bWVudCwgcGFnZW51bSk7IC8qICAwPyAqLwoKICAgICAgICAvKiBwdW1wIGRhdGEgdW50aWxsIHRoZSBwYWdlIGlzIHJlYWR5IGZvciByZW5kZXJpbmcuICovCiAgICAgICAgdGFnPSgtMSk7CiAgICAgICAgZG8gewogICAgICAgICAgICAgICAgd2hpbGUgKChtZXNzYWdlID0gZGRqdnVfbWVzc2FnZV9wZWVrKGxjLT5jb250ZXh0KSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc9cHJvY2Vzc19tZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gMCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRqdnVfbWVzc2FnZV9wb3AobGMtPmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBmaXhtZTogbWF5YmUgZXhpdD8gKi8KICAgICAgICAgICAgICAgIC8qIGlmIChsYy0+ZXJyb3IpIGJyZWFrOyAqLwoKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBwdW1wX2RhdGFfdW50aWxfbWVzc2FnZShsYyxpbWFnZSk7CiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZz1wcm9jZXNzX21lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSAwKSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGp2dV9tZXNzYWdlX3BvcChsYy0+Y29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChtZXNzYWdlID0gZGRqdnVfbWVzc2FnZV9wZWVrKGxjLT5jb250ZXh0KSkpOwogICAgICAgIH0gd2hpbGUgKCFkZGp2dV9wYWdlX2RlY29kaW5nX2RvbmUobGMtPnBhZ2UpKTsKCiAgICAgICAgZGRqdnVfZG9jdW1lbnRfZ2V0X3BhZ2VpbmZvKGxjLT5kb2N1bWVudCwgcGFnZW51bSwgJmluZm8pOwoKICAgICAgICBpbWFnZS0+eF9yZXNvbHV0aW9uID0gKGZsb2F0KSBpbmZvLmRwaTsKICAgICAgICBpbWFnZS0+eV9yZXNvbHV0aW9uID0oZmxvYXQpIGluZm8uZHBpOwogICAgICAgIGlmIChpbWFnZV9pbmZvLT5kZW5zaXR5ICE9IChjaGFyICopIE5VTEwpCiAgICAgICAgICB7CiAgICAgICAgICAgIGludAogICAgICAgICAgICAgIGZsYWdzOwoKICAgICAgICAgICAgR2VvbWV0cnlJbmZvCiAgICAgICAgICAgICAgZ2VvbWV0cnlfaW5mbzsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgU2V0IHJlbmRlcmluZyByZXNvbHV0aW9uLgogICAgICAgICAgICAqLwogICAgICAgICAgICBmbGFncz1QYXJzZUdlb21ldHJ5KGltYWdlX2luZm8tPmRlbnNpdHksJmdlb21ldHJ5X2luZm8pOwogICAgICAgICAgICBpbWFnZS0+eF9yZXNvbHV0aW9uPWdlb21ldHJ5X2luZm8ucmhvOwogICAgICAgICAgICBpbWFnZS0+eV9yZXNvbHV0aW9uPWdlb21ldHJ5X2luZm8uc2lnbWE7CiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBTaWdtYVZhbHVlKSA9PSAwKQogICAgICAgICAgICAgIGltYWdlLT55X3Jlc29sdXRpb249aW1hZ2UtPnhfcmVzb2x1dGlvbjsKICAgICAgICAgICAgaW5mby53aWR0aCo9aW1hZ2UtPnhfcmVzb2x1dGlvbi9pbmZvLmRwaTsKICAgICAgICAgICAgaW5mby5oZWlnaHQqPWltYWdlLT55X3Jlc29sdXRpb24vaW5mby5kcGk7CiAgICAgICAgICAgIGluZm8uZHBpPShzc2l6ZV90KSBNYWdpY2tNYXgoaW1hZ2UtPnhfcmVzb2x1dGlvbixpbWFnZS0+eV9yZXNvbHV0aW9uKTsKICAgICAgICAgIH0KICAgICAgICB0eXBlID0gZGRqdnVfcGFnZV9nZXRfdHlwZShsYy0+cGFnZSk7CgogICAgICAgIC8qIGRvdWJsZSAtPiBmbG9hdCEgKi8KICAgICAgICAvKiBpbWFnZS0+Z2FtbWEgPSAoZmxvYXQpZGRqdnVfcGFnZV9nZXRfZ2FtbWEobGMtPnBhZ2UpOyAqLwoKICAgICAgICAvKiBtbWM6ICBzZXQgIGltYWdlLT5kZXB0aCAgKi8KICAgICAgICAvKiBtbWM6ICBUaGlzIGZyb20gdGhlIHR5cGUgKi8KCiAgICAgICAgaW1hZ2UtPmNvbHVtbnM9KHNpemVfdCkgaW5mby53aWR0aDsKICAgICAgICBpbWFnZS0+cm93cz0oc2l6ZV90KSBpbmZvLmhlaWdodDsKCiAgICAgICAgLyogbW1jOiBiaXRvbmFsIHNob3VsZCBiZSBwYWxldHRpemVkLCBhbmQgY29tcHJlc3NlZCEgKi8KICAgICAgICBpZiAodHlwZSA9PSBEREpWVV9QQUdFVFlQRV9CSVRPTkFMKXsKICAgICAgICAgICAgICAgIGltYWdlLT5jb2xvcnNwYWNlID0gR1JBWUNvbG9yc3BhY2U7CiAgICAgICAgICAgICAgICBpbWFnZS0+c3RvcmFnZV9jbGFzcyA9IFBzZXVkb0NsYXNzOwogICAgICAgICAgICAgICAgaW1hZ2UtPmRlcHRoID0gIDhVTDsgICAgLyogaSBvbmx5IHN1cHBvcnQgdGhhdD8gKi8KICAgICAgICAgICAgICAgIGltYWdlLT5jb2xvcnM9IDI7CiAgICAgICAgICAgICAgICBpZiAoQWNxdWlyZUltYWdlQ29sb3JtYXAoaW1hZ2UsaW1hZ2UtPmNvbG9ycykgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGltYWdlLT5jb2xvcnNwYWNlID0gUkdCQ29sb3JzcGFjZTsKICAgICAgICAgICAgICAgIGltYWdlLT5zdG9yYWdlX2NsYXNzID0gRGlyZWN0Q2xhc3M7CiAgICAgICAgICAgICAgICAvKiBmaXhtZTogIE1BR0lDS0NPUkVfUVVBTlRVTV9ERVBUSCA/Ki8KICAgICAgICAgICAgICAgIGltYWdlLT5kZXB0aCA9ICA4VUw7ICAgIC8qIGkgb25seSBzdXBwb3J0IHRoYXQ/ICovCgogICAgICAgICAgICAgICAgaW1hZ2UtPm1hdHRlID0gTWFnaWNrVHJ1ZTsKICAgICAgICAgICAgICAgIC8qIGlzIHRoaXMgdXNlZnVsPyAqLwogICAgICAgIH0KI2lmIERFQlVHCiAgICAgICAgcHJpbnRmKCJub3cgZmlsbGluZyAlLjIwZyB4ICUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCiAgICAgICAgICBpbWFnZS0+cm93cyk7CiNlbmRpZgoKCiNpZiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyX2xpbmUgKi8KCiAgICAgICAgLyogcSA9IFF1ZXVlQXV0aGVudGljUGl4ZWxzKGltYWdlLDAsMCxpbWFnZS0+Y29sdW1ucyxpbWFnZS0+cm93cyk7ICovCiAgICAgICAgZ2V0X3BhZ2VfaW1hZ2UobGMsIGxjLT5wYWdlLCAwLCAwLCBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCwgaW1hZ2VfaW5mbyk7CiNlbHNlCiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yIChpID0gMDtpPCBpbWFnZS0+cm93czsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkXG4iLGkpOwogICAgICAgICAgICAgICAgICAgICAgICBxID0gUXVldWVBdXRoZW50aWNQaXhlbHMoaW1hZ2UsMCxpLGltYWdlLT5jb2x1bW5zLDEpOwogICAgICAgICAgICAgICAgICAgICAgICBnZXRfcGFnZV9saW5lKGxjLCBpLCBxdWFudHVtX2luZm8pOwogICAgICAgICAgICAgICAgICAgICAgICBTeW5jQXV0aGVudGljUGl4ZWxzKGltYWdlKTsKICAgICAgICAgICAgICAgIH0KCiNlbmRpZiAvKiBwZXJfbGluZSAqLwoKCiNpZiBERUJVRwogICAgICAgIHByaW50ZigiRU5EOiBmaW5pc2hlZCBmaWxsaW5nICUuMjBnIHggJS4yMGdcbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsCiAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cm93cyk7CiNlbmRpZgoKICAgICAgICBpZiAoIWltYWdlLT5waW5nKQogICAgICAgICAgU3luY0ltYWdlKGltYWdlKTsKICAgICAgICAvKiBtbWM6ID8/PyBDb252ZXJ0IFBOTSBwaXhlbHMgdG8gcnVubGVuZ3RoLWVuY29kZWQgTUlGRiBwYWNrZXRzLiAqLwogICAgICAgIC8qIGltYWdlLT5jb2xvcnMgPSAgKi8KCiAgICAgICAgLyogaG93IGlzIHRoZSBsaW5lIHBhZGRpbmcgIC8gc3RyaWRlPyAqLwoKICAgICAgICBpZiAobGMtPnBhZ2UpIHsKICAgICAgICAgICAgICAgIGRkanZ1X3BhZ2VfcmVsZWFzZShsYy0+cGFnZSk7CiAgICAgICAgICAgICAgICBsYy0+cGFnZSA9IE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBpbWFnZS0+cGFnZS55PW1uZ19pbmZvLT55X29mZlttbmdfaW5mby0+b2JqZWN0X2lkXTsgKi8KICAgICAgICBpZiAodGFnID09IDApCiAgICAgICAgICBpbWFnZT1EZXN0cm95SW1hZ2UoaW1hZ2UpOwogICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICAvKiBlbmQgb2YgcmVhZGluZyBvbmUgREpWVSBwYWdlL2ltYWdlICovCn0KCiNpZiAwCi8qIHBhbGV0dGUgKi8KICBpZiAoQWNxdWlyZUltYWdlQ29sb3JtYXAoaW1hZ2UsMikgPT0gTWFnaWNrRmFsc2UpCiAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAvKgogICAgTW9ub2Nocm9tZSBjb2xvcm1hcC4gICBtbWM6IHRoaXMgdGhlIGRlZmF1bHQhCiAgKi8KICBpbWFnZS0+Y29sb3JtYXBbMF0ucmVkPVF1YW50dW1SYW5nZTsKICBpbWFnZS0+Y29sb3JtYXBbMF0uZ3JlZW49UXVhbnR1bVJhbmdlOwogIGltYWdlLT5jb2xvcm1hcFswXS5ibHVlPVF1YW50dW1SYW5nZTsKICBpbWFnZS0+Y29sb3JtYXBbMV0ucmVkPTA7CiAgaW1hZ2UtPmNvbG9ybWFwWzFdLmdyZWVuPTA7CiAgaW1hZ2UtPmNvbG9ybWFwWzFdLmJsdWU9MDsKI2VuZGlmCgpzdGF0aWMgdm9pZCBkanZ1X2Nsb3NlX2xjKExvYWRDb250ZXh0KiBsYykKewogICAgICAgIGlmIChsYy0+ZG9jdW1lbnQpCiAgICAgICAgICAgICAgICBkZGp2dV9kb2N1bWVudF9yZWxlYXNlKGxjLT5kb2N1bWVudCk7CiAgICAgICAgaWYgKGxjLT5jb250ZXh0KQogICAgICAgICAgICAgICAgZGRqdnVfY29udGV4dF9yZWxlYXNlKGxjLT5jb250ZXh0KTsKICAgICAgICBpZiAobGMtPnBhZ2UpCiAgICAgICAgICAgICAgICBkZGp2dV9wYWdlX3JlbGVhc2UobGMtPnBhZ2UpOwogICAgICAgIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkobGMpOwp9CgpzdGF0aWMgSW1hZ2UgKlJlYWRESlZVSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICppbWFnZV9pbmZvLAogIEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKewogIGNvbnN0IGNoYXIKICAgICp1cmw7CgogIGRkanZ1X21lc3NhZ2VfdAogICAgKm1lc3NhZ2U7CgogIEltYWdlCiAgICAqaW1hZ2UsCiAgICAqaW1hZ2VzOwoKICBpbnQKICAgIGxvZ2dpbmcsCiAgICB1c2VfY2FjaGU7CgogIExvYWRDb250ZXh0CiAgICAqbGM7CgogIE1hZ2lja0Jvb2xlYW5UeXBlCiAgICBzdGF0dXM7CgogIHJlZ2lzdGVyIHNzaXplX3QKICAgIGk7CgogIC8qCiAgICogT3BlbiBpbWFnZSBmaWxlLgogICAqLwogIGFzc2VydChpbWFnZV9pbmZvICE9IChjb25zdCBJbWFnZUluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlX2luZm8tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwoKCiAgaWYgKGltYWdlX2luZm8tPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFRyYWNlRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIiwgaW1hZ2VfaW5mby0+ZmlsZW5hbWUpOwoKICBhc3NlcnQoZXhjZXB0aW9uICE9IChFeGNlcHRpb25JbmZvICopIE5VTEwpOwogIGFzc2VydChleGNlcHRpb24tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwoKCiAgbG9nZ2luZyA9IExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksImVudGVyIFJlYWRESlZVSW1hZ2UoKSIpOwogICh2b2lkKSBsb2dnaW5nOwoKICBpbWFnZSA9IEFjcXVpcmVJbWFnZShpbWFnZV9pbmZvKTsgLyogbW1jOiA/PyAqLwoKCiAgbGMgPSAoTG9hZENvbnRleHQgKikgTlVMTDsKICBzdGF0dXMgPSBPcGVuQmxvYihpbWFnZV9pbmZvLGltYWdlLFJlYWRCaW5hcnlCbG9iTW9kZSxleGNlcHRpb24pOwogIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihGaWxlT3BlbkVycm9yLCJVbmFibGVUb09wZW5GaWxlIik7CiAgLyoKICAgIFZlcmlmeSBESlZVIHNpZ25hdHVyZS4KICAqLwojaWYgMAogIGNvdW50ID0gUmVhZEJsb2IoaW1hZ2UsOCwodW5zaWduZWQgY2hhciAqKSBtYWdpY19udW1iZXIpOwoKICAvKiBJc0RKVlUoY29uc3QgdW5zaWduZWQgY2hhciAqbWFnaWNrLGNvbnN0IHNpemVfdCBsZW5ndGgpICovCiAgaWYgKG1lbWNtcChtYWdpY19udW1iZXIsIkFUJlRGT1JNIiw4KSAhPSAwKQogICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oQ29ycnVwdEltYWdlRXJyb3IsIkltcHJvcGVySW1hZ2VIZWFkZXIiKTsKI2VuZGlmCgoKICAvKgogICAqIEFsbG9jYXRlIGEgTG9hZENvbnRleHQgc3RydWN0dXJlLgogICAqLwogIGxjID0gKExvYWRDb250ZXh0ICopIEFjcXVpcmVNYWdpY2tNZW1vcnkoc2l6ZW9mKCpsYykpOwogIGlmIChsYyA9PSBOVUxMKQogICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLCJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CgoKICAvKgogICAqIEluaXRpYWxpemUgbWVtYmVycyBvZiB0aGUgTW5nSW5mbyBzdHJ1Y3R1cmUuCiAgICovCiAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGxjLDAsc2l6ZW9mKExvYWRDb250ZXh0KSk7CgogIGxjLT5pbWFnZSA9IGltYWdlOwogIGxjLT5wYWdlcyA9IDA7CiAgbGMtPmNvbnRleHQgPSBkZGp2dV9jb250ZXh0X2NyZWF0ZSgiSW1hZ2VNYWdpY2sgZGp2dSBsb2FkZXIiKTsgLyogZ19wcm9ncmFtX25hbWUgKi8KCiAgZGRqdnVfY2FjaGVfc2V0X3NpemUobGMtPmNvbnRleHQsIDEpOyAvKiByaWdodD8gKi8KICB1c2VfY2FjaGUgPSAwOwogIC8qIGRvY3VtZW50OiBoZXJlIHdlIGRvbid0IGhhdmUgYSBmaWxlbmFtZSwgYnV0LCBmb3IgdGhlIHNha2Ugb2YgZ2VuZXJhbGl0eSwgYSBGSUxFKiAhICovCiAgdXJsPSJodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZy9mYWtlLmRqdnUiOwogIGxjLT5kb2N1bWVudCA9IGRkanZ1X2RvY3VtZW50X2NyZWF0ZShsYy0+Y29udGV4dCwgdXJsLCB1c2VfY2FjaGUpOyAvKiBkb24ndCBjYWNoZSAqLwogIGRkanZ1X2RvY3VtZW50X3NldF91c2VyX2RhdGEobGMtPmRvY3VtZW50LCBsYyk7CgoKICAvKiBub3cgd2Ugd2FpdCB0aGUgbWVzc2FnZS1yZXF1ZXN0IGZvciBkYXRhOiAqLwogIG1lc3NhZ2UgPSBkZGp2dV9tZXNzYWdlX3dhaXQobGMtPmNvbnRleHQpOwoKICBpZiAobWVzc2FnZS0+bV9hbnkudGFnICE9IERESlZVX05FV1NUUkVBTSkgewogICAgICAgICAgLyogZml4bWU6IHRoZSBkanZ1IGNvbnRleHQsIGRvY3VtZW50ISAqLwoKICAgICAgICAgIGRkanZ1X2RvY3VtZW50X3JlbGVhc2UobGMtPmRvY3VtZW50KTsKICAgICAgICAgIGRkanZ1X2NvbnRleHRfcmVsZWFzZShsYy0+Y29udGV4dCk7CgogICAgICAgICAgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShsYyk7CgogICAgICAgICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLCJEanZ1IGluaXRpYWwgbWVzc2FnZTogdW5leHBlY3RlZCB0eXBlIik7CiAgICAgICAgICByZXR1cm4gTlVMTDsgICAgLyogZXJyb3IhICovCiAgfTsKCiAgbGMtPnN0cmVhbWlkID0gbWVzc2FnZS0+bV9uZXdzdHJlYW0uc3RyZWFtaWQ7CiAgZGRqdnVfbWVzc2FnZV9wb3AobGMtPmNvbnRleHQpOwoKICBtZXNzYWdlID0gcHVtcF9kYXRhX3VudGlsX21lc3NhZ2UobGMsaW1hZ2UpOwogIC8qIG5vdyBwcm9jZXNzIHRoZSBtZXNzYWdlczogKi8KCgogIGlmIChtZXNzYWdlKSBkbyB7CiAgICAgICAgICBwcm9jZXNzX21lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICBkZGp2dV9tZXNzYWdlX3BvcChsYy0+Y29udGV4dCk7CiAgfSB3aGlsZSAoKG1lc3NhZ2UgPSBkZGp2dV9tZXNzYWdlX3BlZWsobGMtPmNvbnRleHQpKSk7CgogIC8qIGZpeG1lOiBpIGhvcGUgd2UgaGF2ZSBub3QgcmVhZCBhbnkgbWVzc2FnZXMgcGVydGluZW50KD8pIHJlbGF0ZWQgdG8gdGhlIHBhZ2UgaXRzZWxmISAgKi8KCiAgd2hpbGUgKGxjLT5wYWdlcyA9PSAwKSB7CiAgICAgICAgICBtZXNzYWdlID0gZGRqdnVfbWVzc2FnZV93YWl0KGxjLT5jb250ZXh0KTsKICAgICAgICAgIHByb2Nlc3NfbWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgIGRkanZ1X21lc3NhZ2VfcG9wKGxjLT5jb250ZXh0KTsKICB9CgogIGltYWdlcz1OZXdJbWFnZUxpc3QoKTsKICBpPTA7CiAgaWYgKGltYWdlX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKICAgIGk9aW1hZ2VfaW5mby0+c2NlbmU7CiAgZm9yICggOyBpIDwgKHNzaXplX3QpIGxjLT5wYWdlczsgaSsrKQogIHsKICAgIGltYWdlPVJlYWRPbmVESlZVSW1hZ2UobGMsaSxpbWFnZV9pbmZvLGV4Y2VwdGlvbik7CiAgICBpZiAoaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICAgIGJyZWFrOwogICAgaW1hZ2UtPnNjZW5lPWk7CiAgICBBcHBlbmRJbWFnZVRvTGlzdCgmaW1hZ2VzLENsb25lSW1hZ2VMaXN0KGltYWdlLGV4Y2VwdGlvbikpOwogICAgaWYgKGltYWdlX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKICAgICAgaWYgKGltYWdlLT5zY2VuZSA+PSAoaW1hZ2VfaW5mby0+c2NlbmUraW1hZ2VfaW5mby0+bnVtYmVyX3NjZW5lcy0xKSkKICAgICAgICBicmVhazsKICB9CiAgZGp2dV9jbG9zZV9sYyhsYyk7CiAgKHZvaWQpIENsb3NlQmxvYihpbWFnZXMpOwogIGlmIChpbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgIGltYWdlPURlc3Ryb3lJbWFnZUxpc3QoaW1hZ2UpOwoKI2lmIDAKICBpZiAoKGltYWdlLT5wYWdlLndpZHRoID09IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgPT0gMCkpCiAgICB7CiAgICAgIGltYWdlLT5wYWdlLndpZHRoID0gaW1hZ2UtPmNvbHVtbnMraW1hZ2UtPnBhZ2UueDsKICAgICAgaW1hZ2UtPnBhZ2UuaGVpZ2h0ID0gaW1hZ2UtPnJvd3MraW1hZ2UtPnBhZ2UueTsKICAgIH0KICBpZiAoaW1hZ2UtPmNvbHVtbnMgPT0gMCB8fCBpbWFnZS0+cm93cyA9PSAwKQogICAgewogICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICJleGl0IFJlYWRESlZVSW1hZ2UoKSB3aXRoIGVycm9yLiIpOwogICAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihDb3JydXB0SW1hZ2VFcnJvciwiQ29ycnVwdEltYWdlIik7CiAgICB9CgogIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksImV4aXQgUmVhZERKVlVJbWFnZSgpIik7CiNlbmRpZgoKCiAgcmV0dXJuKEdldEZpcnN0SW1hZ2VJbkxpc3QoaW1hZ2VzKSk7Cn0KI2VuZGlmCgwKLyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgUiBlIGcgaSBzIHQgZSByIEQgSiBWIFUgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolICBSZWdpc3RlckRKVlVJbWFnZSgpIGFkZHMgYXR0cmlidXRlcyBmb3IgdGhlIERKVlUgaW1hZ2UgZm9ybWF0IHRvCiUgIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLiAgVGhlIGF0dHJpYnV0ZXMgaW5jbHVkZSB0aGUgaW1hZ2UgZm9ybWF0CiUgIHRhZywgYSBtZXRob2QgdG8gcmVhZCBhbmQvb3Igd3JpdGUgdGhlIGZvcm1hdCwgd2hldGhlciB0aGUgZm9ybWF0CiUgIHN1cHBvcnRzIHRoZSBzYXZpbmcgb2YgbW9yZSB0aGFuIG9uZSBmcmFtZSB0byB0aGUgc2FtZSBmaWxlIG9yIGJsb2IsCiUgIHdoZXRoZXIgdGhlIGZvcm1hdCBzdXBwb3J0cyBuYXRpdmUgaW4tbWVtb3J5IEkvTywgYW5kIGEgYnJpZWYKJSAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBSZWdpc3RlckRKVlVJbWFnZSBtZXRob2QgaXM6CiUKJSAgICAgIHNpemVfdCBSZWdpc3RlckRKVlVJbWFnZSh2b2lkKQolCiovCk1vZHVsZUV4cG9ydCBzaXplX3QgUmVnaXN0ZXJESlZVSW1hZ2Uodm9pZCkKewogIGNoYXIKICAgIHZlcnNpb25bTWF4VGV4dEV4dGVudF07CgogIE1hZ2lja0luZm8KICAgICplbnRyeTsKCiAgc3RhdGljIGNvbnN0IGNoYXIKICAgICpESlZVTm90ZSA9CiAgICB7CiAgICAgICJTZWUgaHR0cDovL3d3dy5kanZ1em9uZS5vcmcvIGZvciBkZXRhaWxzIGFib3V0IHRoZSBESlZVIGZvcm1hdC4gIFRoZVxuIgogICAgICAiREpWVSAxLjIgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgdGhlcmUgYW5kIGF0XG4iCiAgICAgICJmdHA6Ly9zd3JpbmRlLm5kZS5zd3JpLmVkdS9wdWIvZGp2dS9kb2N1bWVudHMvLiIKICAgIH07CgogICp2ZXJzaW9uPSdcMCc7CiNpZiBkZWZpbmVkKERKVlVfTElCREpWVV9WRVJfU1RSSU5HKQogICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyh2ZXJzaW9uLCJsaWJkanZ1ICIsTWF4VGV4dEV4dGVudCk7CiAgKHZvaWQpIENvbmNhdGVuYXRlTWFnaWNrU3RyaW5nKHZlcnNpb24sREpWVV9MSUJESlZVX1ZFUl9TVFJJTkcsTWF4VGV4dEV4dGVudCk7CiNlbmRpZgogIGVudHJ5PVNldE1hZ2lja0luZm8oIkRKVlUiKTsKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9ESlZVX0RFTEVHQVRFKQogIGVudHJ5LT5kZWNvZGVyPShEZWNvZGVJbWFnZUhhbmRsZXIgKikgUmVhZERKVlVJbWFnZTsKI2VuZGlmCiAgZW50cnktPnJhdz1NYWdpY2tUcnVlOwogIGVudHJ5LT5tYWdpY2s9KElzSW1hZ2VGb3JtYXRIYW5kbGVyICopIElzREpWVTsKICBlbnRyeS0+YWRqb2luPU1hZ2lja0ZhbHNlOwogIGVudHJ5LT50aHJlYWRfc3VwcG9ydD1NYWdpY2tUcnVlOwogIGVudHJ5LT5kZXNjcmlwdGlvbj1BY3F1aXJlU3RyaW5nKCJE6WrgIHZ1Iik7CiAgZW50cnktPm1vZHVsZT1BY3F1aXJlU3RyaW5nKCJESlZVIik7CiAgaWYgKCp2ZXJzaW9uICE9ICdcMCcpCiAgICBlbnRyeS0+dmVyc2lvbj1BY3F1aXJlU3RyaW5nKHZlcnNpb24pOwogIGVudHJ5LT5ub3RlPUFjcXVpcmVTdHJpbmcoREpWVU5vdGUpOwogICh2b2lkKSBSZWdpc3Rlck1hZ2lja0luZm8oZW50cnkpOwogIHJldHVybihNYWdpY2tJbWFnZUNvZGVyU2lnbmF0dXJlKTsKfQoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIFUgbiByIGUgZyBpIHMgdCBlIHIgRCBKIFYgVSBJIG0gYSBnIGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgVW5yZWdpc3RlckRKVlVJbWFnZSgpIHJlbW92ZXMgZm9ybWF0IHJlZ2lzdHJhdGlvbnMgbWFkZSBieSB0aGUKJSAgREpWVSBtb2R1bGUgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cy4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBVbnJlZ2lzdGVyREpWVUltYWdlIG1ldGhvZCBpczoKJQolICAgICAgVW5yZWdpc3RlckRKVlVJbWFnZSh2b2lkKQolCiovCk1vZHVsZUV4cG9ydCB2b2lkIFVucmVnaXN0ZXJESlZVSW1hZ2Uodm9pZCkKewogICh2b2lkKSBVbnJlZ2lzdGVyTWFnaWNrSW5mbygiREpWVSIpOwp9Cg==