LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3BhdC5jLHYgMS4yIDIwMDIvMDIvMTUgMDY6MDE6Mjgga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCkZjUGF0dGVybiAqCkZjUGF0dGVybkNyZWF0ZSAodm9pZCkKewogICAgRmNQYXR0ZXJuCSpwOwoKICAgIHAgPSAoRmNQYXR0ZXJuICopIG1hbGxvYyAoc2l6ZW9mIChGY1BhdHRlcm4pKTsKICAgIGlmICghcCkKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX1BBVFRFUk4sIHNpemVvZiAoRmNQYXR0ZXJuKSk7CiAgICBwLT5udW0gPSAwOwogICAgcC0+c2l6ZSA9IDA7CiAgICBwLT5lbHRzID0gMDsKICAgIHJldHVybiBwOwp9Cgp2b2lkCkZjVmFsdWVEZXN0cm95IChGY1ZhbHVlIHYpCnsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCUZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdi51LnMpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZU1hdHJpeDoKCUZjTWF0cml4RnJlZSAoKEZjTWF0cml4ICopIHYudS5tKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgoJRmNDaGFyU2V0RGVzdHJveSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CglicmVhazsKICAgIGRlZmF1bHQ6CglicmVhazsKICAgIH0KfQoKRmNWYWx1ZQpGY1ZhbHVlU2F2ZSAoRmNWYWx1ZSB2KQp7CiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVTdHJpbmc6Cgl2LnUucyA9IEZjU3RyQ29weSAodi51LnMpOwoJaWYgKCF2LnUucykKCSAgICB2LnR5cGUgPSBGY1R5cGVWb2lkOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZU1hdHJpeDoKCXYudS5tID0gRmNNYXRyaXhDb3B5ICh2LnUubSk7CglpZiAoIXYudS5tKQoJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CglicmVhazsKICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKCXYudS5jID0gRmNDaGFyU2V0Q29weSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CglpZiAoIXYudS5jKQoJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CglicmVhazsKICAgIGRlZmF1bHQ6CglicmVhazsKICAgIH0KICAgIHJldHVybiB2Owp9Cgp2b2lkCkZjVmFsdWVMaXN0RGVzdHJveSAoRmNWYWx1ZUxpc3QgKmwpCnsKICAgIEZjVmFsdWVMaXN0ICAgICpuZXh0OwogICAgZm9yICg7IGw7IGwgPSBuZXh0KQogICAgewoJc3dpdGNoIChsLT52YWx1ZS50eXBlKSB7CgljYXNlIEZjVHlwZVN0cmluZzoKCSAgICBGY1N0ckZyZWUgKChGY0NoYXI4ICopIGwtPnZhbHVlLnUucyk7CgkgICAgYnJlYWs7CgljYXNlIEZjVHlwZU1hdHJpeDoKCSAgICBGY01hdHJpeEZyZWUgKChGY01hdHJpeCAqKSBsLT52YWx1ZS51Lm0pOwoJICAgIGJyZWFrOwoJY2FzZSBGY1R5cGVDaGFyU2V0OgoJICAgIEZjQ2hhclNldERlc3Ryb3kgKChGY0NoYXJTZXQgKikgbC0+dmFsdWUudS5jKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgYnJlYWs7Cgl9CgluZXh0ID0gbC0+bmV4dDsKCUZjTWVtRnJlZSAoRkNfTUVNX1ZBTExJU1QsIHNpemVvZiAoRmNWYWx1ZUxpc3QpKTsKCWZyZWUgKGwpOwogICAgfQp9Cgp2b2lkCkZjUGF0dGVybkRlc3Ryb3kgKEZjUGF0dGVybiAqcCkKewogICAgaW50CQkgICAgaTsKICAgIAogICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQoJRmNWYWx1ZUxpc3REZXN0cm95IChwLT5lbHRzW2ldLnZhbHVlcyk7CgogICAgcC0+bnVtID0gMDsKICAgIGlmIChwLT5lbHRzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fUEFURUxULCBwLT5zaXplICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKCWZyZWUgKHAtPmVsdHMpOwoJcC0+ZWx0cyA9IDA7CiAgICB9CiAgICBwLT5zaXplID0gMDsKICAgIEZjTWVtRnJlZSAoRkNfTUVNX1BBVFRFUk4sIHNpemVvZiAoRmNQYXR0ZXJuKSk7CiAgICBmcmVlIChwKTsKfQoKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuRmluZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBpbnNlcnQpCnsKICAgIGludAkJICAgIGk7CiAgICBpbnQJCSAgICBzOwogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICAKICAgIC8qIG1hdGNoIGV4aXN0aW5nICovCiAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspCiAgICB7CglpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAoKEZjQ2hhcjggKikgb2JqZWN0LCAoRmNDaGFyOCAqKSBwLT5lbHRzW2ldLm9iamVjdCkpCgkgICAgcmV0dXJuICZwLT5lbHRzW2ldOwogICAgfQoKICAgIGlmICghaW5zZXJ0KQoJcmV0dXJuIEZjRmFsc2U7CgogICAgLyogZ3JvdyBhcnJheSAqLwogICAgaWYgKGkgPT0gcC0+c2l6ZSkKICAgIHsKCXMgPSBwLT5zaXplICsgMTY7CglpZiAocC0+ZWx0cykKCSAgICBlID0gKEZjUGF0dGVybkVsdCAqKSByZWFsbG9jIChwLT5lbHRzLCBzICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKCWVsc2UKCSAgICBlID0gKEZjUGF0dGVybkVsdCAqKSBtYWxsb2MgKHMgKiBzaXplb2YgKEZjUGF0dGVybkVsdCkpOwoJaWYgKCFlKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJcC0+ZWx0cyA9IGU7CglpZiAocC0+c2l6ZSkKCSAgICBGY01lbUZyZWUgKEZDX01FTV9QQVRFTFQsIHAtPnNpemUgKiBzaXplb2YgKEZjUGF0dGVybkVsdCkpOwoJRmNNZW1BbGxvYyAoRkNfTUVNX1BBVEVMVCwgcyAqIHNpemVvZiAoRmNQYXR0ZXJuRWx0KSk7Cgl3aGlsZSAocC0+c2l6ZSA8IHMpCgl7CgkgICAgcC0+ZWx0c1twLT5zaXplXS5vYmplY3QgPSAwOwoJICAgIHAtPmVsdHNbcC0+c2l6ZV0udmFsdWVzID0gMDsKCSAgICBwLT5zaXplKys7Cgl9CiAgICB9CiAgICAKICAgIC8qIGJ1bXAgY291bnQgKi8KICAgIHAtPm51bSsrOwogICAgCiAgICBwLT5lbHRzW2ldLm9iamVjdCA9IG9iamVjdDsKICAgIAogICAgcmV0dXJuICZwLT5lbHRzW2ldOwp9CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZSwgRmNCb29sIGFwcGVuZCkKewogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICBGY1ZhbHVlTGlzdCAgICAqbmV3LCAqKnByZXY7CgogICAgbmV3ID0gKEZjVmFsdWVMaXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY1ZhbHVlTGlzdCkpOwogICAgaWYgKCFuZXcpCglnb3RvIGJhaWwwOwoKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9WQUxMSVNULCBzaXplb2YgKEZjVmFsdWVMaXN0KSk7CiAgICAvKiBkdXAgc3RyaW5nICovCiAgICB2YWx1ZSA9IEZjVmFsdWVTYXZlICh2YWx1ZSk7CiAgICBpZiAodmFsdWUudHlwZSA9PSBGY1R5cGVWb2lkKQoJZ290byBiYWlsMTsKCiAgICBuZXctPnZhbHVlID0gdmFsdWU7CiAgICBuZXctPm5leHQgPSAwOwogICAgCiAgICBlID0gRmNQYXR0ZXJuRmluZCAocCwgb2JqZWN0LCBGY1RydWUpOwogICAgaWYgKCFlKQoJZ290byBiYWlsMjsKICAgIAogICAgaWYgKGFwcGVuZCkKICAgIHsKCWZvciAocHJldiA9ICZlLT52YWx1ZXM7ICpwcmV2OyBwcmV2ID0gJigqcHJldiktPm5leHQpOwoJKnByZXYgPSBuZXc7CiAgICB9CiAgICBlbHNlCiAgICB7CgluZXctPm5leHQgPSBlLT52YWx1ZXM7CgllLT52YWx1ZXMgPSBuZXc7CiAgICB9CiAgICAKICAgIHJldHVybiBGY1RydWU7CgpiYWlsMjogICAgCiAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlU3RyaW5nOgoJRmNTdHJGcmVlICgoRmNDaGFyOCAqKSB2YWx1ZS51LnMpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZU1hdHJpeDoKCUZjTWF0cml4RnJlZSAoKEZjTWF0cml4ICopIHZhbHVlLnUubSk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKCUZjQ2hhclNldERlc3Ryb3kgKChGY0NoYXJTZXQgKikgdmFsdWUudS5jKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQpiYWlsMToKICAgIEZjTWVtRnJlZSAoRkNfTUVNX1ZBTExJU1QsIHNpemVvZiAoRmNWYWx1ZUxpc3QpKTsKICAgIGZyZWUgKG5ldyk7CmJhaWwwOgogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQm9vbApGY1BhdHRlcm5EZWwgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0KQp7CiAgICBGY1BhdHRlcm5FbHQgICAqZTsKICAgIGludAkJICAgIGk7CgogICAgZSA9IEZjUGF0dGVybkZpbmQgKHAsIG9iamVjdCwgRmNGYWxzZSk7CiAgICBpZiAoIWUpCglyZXR1cm4gRmNGYWxzZTsKCiAgICBpID0gZSAtIHAtPmVsdHM7CiAgICAKICAgIC8qIGRlc3Ryb3kgdmFsdWUgKi8KICAgIEZjVmFsdWVMaXN0RGVzdHJveSAoZS0+dmFsdWVzKTsKICAgIAogICAgLyogc2h1ZmZsZSBleGlzdGluZyBvbmVzIGRvd24gKi8KICAgIG1lbW1vdmUgKGUsIGUrMSwgKHAtPmVsdHMgKyBwLT5udW0gLSAoZSArIDEpKSAqIHNpemVvZiAoRmNQYXR0ZXJuRWx0KSk7CiAgICBwLT5udW0tLTsKICAgIHAtPmVsdHNbcC0+bnVtXS5vYmplY3QgPSAwOwogICAgcC0+ZWx0c1twLT5udW1dLnZhbHVlcyA9IDA7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkSW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpKQp7CiAgICBGY1ZhbHVlCXY7CgogICAgdi50eXBlID0gRmNUeXBlSW50ZWdlcjsKICAgIHYudS5pID0gaTsKICAgIHJldHVybiBGY1BhdHRlcm5BZGQgKHAsIG9iamVjdCwgdiwgRmNUcnVlKTsKfQoKRmNCb29sCkZjUGF0dGVybkFkZERvdWJsZSAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGRvdWJsZSBkKQp7CiAgICBGY1ZhbHVlCXY7CgogICAgdi50eXBlID0gRmNUeXBlRG91YmxlOwogICAgdi51LmQgPSBkOwogICAgcmV0dXJuIEZjUGF0dGVybkFkZCAocCwgb2JqZWN0LCB2LCBGY1RydWUpOwp9CgoKRmNCb29sCkZjUGF0dGVybkFkZFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjQ2hhcjggKnMpCnsKICAgIEZjVmFsdWUJdjsKCiAgICB2LnR5cGUgPSBGY1R5cGVTdHJpbmc7CiAgICB2LnUucyA9IHM7CiAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cn0KCkZjQm9vbApGY1BhdHRlcm5BZGRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY01hdHJpeCAqcykKewogICAgRmNWYWx1ZQl2OwoKICAgIHYudHlwZSA9IEZjVHlwZU1hdHJpeDsKICAgIHYudS5tID0gKEZjTWF0cml4ICopIHM7CiAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cn0KCgpGY0Jvb2wKRmNQYXR0ZXJuQWRkQm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBiKQp7CiAgICBGY1ZhbHVlCXY7CgogICAgdi50eXBlID0gRmNUeXBlQm9vbDsKICAgIHYudS5iID0gYjsKICAgIHJldHVybiBGY1BhdHRlcm5BZGQgKHAsIG9iamVjdCwgdiwgRmNUcnVlKTsKfQoKRmNCb29sCkZjUGF0dGVybkFkZENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0NoYXJTZXQgKmMpCnsKICAgIEZjVmFsdWUJdjsKCiAgICB2LnR5cGUgPSBGY1R5cGVDaGFyU2V0OwogICAgdi51LmMgPSAoRmNDaGFyU2V0ICopIGM7CiAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cn0KCkZjUmVzdWx0CkZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdikKewogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICBGY1ZhbHVlTGlzdCAgICAqbDsKCiAgICBlID0gRmNQYXR0ZXJuRmluZCAocCwgb2JqZWN0LCBGY0ZhbHNlKTsKICAgIGlmICghZSkKCXJldHVybiBGY1Jlc3VsdE5vTWF0Y2g7CiAgICBmb3IgKGwgPSBlLT52YWx1ZXM7IGw7IGwgPSBsLT5uZXh0KQogICAgewoJaWYgKCFpZCkKCXsKCSAgICAqdiA9IGwtPnZhbHVlOwoJICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOwoJfQoJaWQtLTsKICAgIH0KICAgIHJldHVybiBGY1Jlc3VsdE5vSWQ7Cn0KCkZjUmVzdWx0CkZjUGF0dGVybkdldEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaWQsIGludCAqaSkKewogICAgRmNWYWx1ZQl2OwogICAgRmNSZXN1bHQJcjsKCiAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CiAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQoJcmV0dXJuIHI7CiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVEb3VibGU6CgkqaSA9IChpbnQpIHYudS5kOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CgkqaSA9IHYudS5pOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKICAgIH0KICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOwp9CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaWQsIGRvdWJsZSAqZCkKewogICAgRmNWYWx1ZQl2OwogICAgRmNSZXN1bHQJcjsKCiAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CiAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQoJcmV0dXJuIHI7CiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVEb3VibGU6CgkqZCA9IHYudS5kOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CgkqZCA9IChkb3VibGUpIHYudS5pOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKICAgIH0KICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOwp9CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaWQsIEZjQ2hhcjggKiogcykKewogICAgRmNWYWx1ZQl2OwogICAgRmNSZXN1bHQJcjsKCiAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CiAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQoJcmV0dXJuIHI7CiAgICBpZiAodi50eXBlICE9IEZjVHlwZVN0cmluZykKICAgICAgICByZXR1cm4gRmNSZXN1bHRUeXBlTWlzbWF0Y2g7CiAgICAqcyA9IChGY0NoYXI4ICopIHYudS5zOwogICAgcmV0dXJuIEZjUmVzdWx0TWF0Y2g7Cn0KCkZjUmVzdWx0CkZjUGF0dGVybkdldE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNNYXRyaXggKiptKQp7CiAgICBGY1ZhbHVlCXY7CiAgICBGY1Jlc3VsdAlyOwoKICAgIHIgPSBGY1BhdHRlcm5HZXQgKHAsIG9iamVjdCwgaWQsICZ2KTsKICAgIGlmIChyICE9IEZjUmVzdWx0TWF0Y2gpCglyZXR1cm4gcjsKICAgIGlmICh2LnR5cGUgIT0gRmNUeXBlTWF0cml4KQogICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKICAgICptID0gKEZjTWF0cml4ICopIHYudS5tOwogICAgcmV0dXJuIEZjUmVzdWx0TWF0Y2g7Cn0KCgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY0Jvb2wgKmIpCnsKICAgIEZjVmFsdWUJdjsKICAgIEZjUmVzdWx0CXI7CgogICAgciA9IEZjUGF0dGVybkdldCAocCwgb2JqZWN0LCBpZCwgJnYpOwogICAgaWYgKHIgIT0gRmNSZXN1bHRNYXRjaCkKCXJldHVybiByOwogICAgaWYgKHYudHlwZSAhPSBGY1R5cGVCb29sKQogICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKICAgICpiID0gdi51LmI7CiAgICByZXR1cm4gRmNSZXN1bHRNYXRjaDsKfQoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0Q2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNDaGFyU2V0ICoqYykKewogICAgRmNWYWx1ZQl2OwogICAgRmNSZXN1bHQJcjsKCiAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CiAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQoJcmV0dXJuIHI7CiAgICBpZiAodi50eXBlICE9IEZjVHlwZUNoYXJTZXQpCiAgICAgICAgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoOwogICAgKmMgPSAoRmNDaGFyU2V0ICopIHYudS5jOwogICAgcmV0dXJuIEZjUmVzdWx0TWF0Y2g7Cn0KCkZjUGF0dGVybiAqCkZjUGF0dGVybkR1cGxpY2F0ZSAoRmNQYXR0ZXJuICpvcmlnKQp7CiAgICBGY1BhdHRlcm4JICAgICpuZXc7CiAgICBpbnQJCSAgICBpOwogICAgRmNWYWx1ZUxpc3QgICAgKmw7CgogICAgbmV3ID0gRmNQYXR0ZXJuQ3JlYXRlICgpOwogICAgaWYgKCFuZXcpCglnb3RvIGJhaWwwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBvcmlnLT5udW07IGkrKykKICAgIHsKCWZvciAobCA9IG9yaWctPmVsdHNbaV0udmFsdWVzOyBsOyBsID0gbC0+bmV4dCkKCSAgICBpZiAoIUZjUGF0dGVybkFkZCAobmV3LCBvcmlnLT5lbHRzW2ldLm9iamVjdCwgbC0+dmFsdWUsIEZjVHJ1ZSkpCgkJZ290byBiYWlsMTsKICAgIH0KCiAgICByZXR1cm4gbmV3OwoKYmFpbDE6CiAgICBGY1BhdHRlcm5EZXN0cm95IChuZXcpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5WYUJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIHZhX2xpc3QgdmEpCnsKICAgIEZjUGF0dGVybgkqcmV0OwogICAgCiAgICBGY1BhdHRlcm5WYXBCdWlsZCAocmV0LCBvcmlnLCB2YSk7CiAgICByZXR1cm4gcmV0Owp9CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5CdWlsZCAoRmNQYXR0ZXJuICpvcmlnLCAuLi4pCnsKICAgIHZhX2xpc3QJdmE7CiAgICAKICAgIHZhX3N0YXJ0ICh2YSwgb3JpZyk7CiAgICBGY1BhdHRlcm5WYXBCdWlsZCAob3JpZywgb3JpZywgdmEpOwogICAgdmFfZW5kICh2YSk7CiAgICByZXR1cm4gb3JpZzsKfQo=