LyoKICogTG9jYWxlLWRlcGVuZGVudCBmb3JtYXQgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggRGF2aWQgTGVlIExhbWJlcnQKICogQ29weXJpZ2h0IDIwMDAgSnVsaW8gQ+lzYXIgR+F6cXVlegogKiBDb3B5cmlnaHQgMjAwMyBKb24gR3JpZmZpdGhzCiAqIENvcHlyaWdodCAyMDA1IERtaXRyeSBUaW1vc2hrb3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJrZXJuZWxfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobmxzKTsKCiNkZWZpbmUgREFURV9EQVRFVkFSU09OTFkgMHgwMTAwICAvKiBvbmx5IGRhdGUgc3R1ZmY6IHlNZGcgKi8KI2RlZmluZSBUSU1FX1RJTUVWQVJTT05MWSAweDAyMDAgIC8qIG9ubHkgdGltZSBzdHVmZjogaEhtc3QgKi8KCi8qIFNpbmNlIGNhbGN1bGF0aW5nIHRoZSBmb3JtYXR0aW5nIGRhdGEgZm9yIGVhY2ggbG9jYWxlIGlzIHRpbWUtY29uc3VtaW5nLAogKiB3ZSBnZXQgdGhlIGZvcm1hdCBkYXRhIGZvciBlYWNoIGxvY2FsZSBvbmx5IG9uY2UgYW5kIGNhY2hlIGl0IGluIG1lbW9yeS4KICogV2UgY2FjaGUgYm90aCB0aGUgc3lzdGVtIGRlZmF1bHQgYW5kIHVzZXIgb3ZlcnJpZGRlbiBkYXRhLCBhZnRlciBjb252ZXJ0aW5nCiAqIHRoZW0gaW50byB0aGUgZm9ybWF0cyB0aGF0IHRoZSBmdW5jdGlvbnMgaGVyZSBleHBlY3QuIFNpbmNlIHRoZXNlIGZ1bmN0aW9ucwogKiB3aWxsIHR5cGljYWxseSBiZSBjYWxsZWQgd2l0aCBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHRoZSB0b3RhbCBsb2NhbGVzCiAqIGluc3RhbGxlZCwgdGhlIG1lbW9yeSBvdmVyaGVhZCBpcyBtaW5pbWFsIHdoaWxlIHRoZSBzcGVlZHVwIGlzIHNpZ25pZmljYW50LgogKgogKiBPdXIgY2FjaGUgdGFrZXMgdGhlIGZvcm0gb2YgYSBzaW5nbHkgbGlua2VkIGxpc3QsIHdob3NlIG5vZGUgaXMgYmVsb3c6CiAqLwojZGVmaW5lIE5MU19OVU1fQ0FDSEVEX1NUUklOR1MgNDUKCnR5cGVkZWYgc3RydWN0IF9OTFNfRk9STUFUX05PREUKewogIExDSUQgIGxjaWQ7ICAgICAgICAgLyogTG9jYWxlIElkICovCiAgRFdPUkQgZHdGbGFnczsgICAgICAvKiAwIG9yIExPQ0FMRV9OT1VTRVJPVkVSUklERSAqLwogIERXT1JEIGR3Q29kZVBhZ2U7ICAgLyogRGVmYXVsdCBjb2RlIHBhZ2UgKGlmIExPQ0FMRV9VU0VfQU5TSV9DUCBub3QgZ2l2ZW4pICovCiAgTlVNQkVSRk1UVyAgIGZtdDsgICAvKiBEZWZhdWx0IGZvcm1hdCBmb3IgbnVtYmVycyAqLwogIENVUlJFTkNZRk1UVyBjeWZtdDsgLyogRGVmYXVsdCBmb3JtYXQgZm9yIGN1cnJlbmNpZXMgKi8KICBMUFdTVFIgbHBwc3pTdHJpbmdzW05MU19OVU1fQ0FDSEVEX1NUUklOR1NdOyAvKiBEZWZhdWx0IGZvcm1hdHMsZGF5L21vbnRoIG5hbWVzICovCiAgV0NIQVIgc3pTaG9ydEFNWzJdOyAvKiBTaG9ydCAnQU0nIG1hcmtlciAqLwogIFdDSEFSIHN6U2hvcnRQTVsyXTsgLyogU2hvcnQgJ1BNJyBtYXJrZXIgKi8KICBzdHJ1Y3QgX05MU19GT1JNQVRfTk9ERSAqbmV4dDsKfSBOTFNfRk9STUFUX05PREU7CgovKiBNYWNyb3MgdG8gZ2V0IHBhcnRpY3VsYXIgZGF0YSBzdHJpbmdzIGZyb20gYSBmb3JtYXQgbm9kZSAqLwojZGVmaW5lIEdldE5lZ2F0aXZlKGZtdCkgIGZtdC0+bHBwc3pTdHJpbmdzWzBdCiNkZWZpbmUgR2V0TG9uZ0RhdGUoZm10KSAgZm10LT5scHBzelN0cmluZ3NbMV0KI2RlZmluZSBHZXRTaG9ydERhdGUoZm10KSBmbXQtPmxwcHN6U3RyaW5nc1syXQojZGVmaW5lIEdldFRpbWUoZm10KSAgICAgIGZtdC0+bHBwc3pTdHJpbmdzWzNdCiNkZWZpbmUgR2V0QU0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDJdCiNkZWZpbmUgR2V0UE0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDNdCiNkZWZpbmUgR2V0WWVhck1vbnRoKGZtdCkgZm10LT5scHBzelN0cmluZ3NbNDRdCgojZGVmaW5lIEdldExvbmdEYXkoZm10LGRheSkgICAgZm10LT5scHBzelN0cmluZ3NbNCArIGRheV0KI2RlZmluZSBHZXRTaG9ydERheShmbXQsZGF5KSAgIGZtdC0+bHBwc3pTdHJpbmdzWzExICsgZGF5XQojZGVmaW5lIEdldExvbmdNb250aChmbXQsbXRoKSAgZm10LT5scHBzelN0cmluZ3NbMTggKyBtdGhdCiNkZWZpbmUgR2V0U2hvcnRNb250aChmbXQsbXRoKSBmbXQtPmxwcHN6U3RyaW5nc1szMCArIG10aF0KCi8qIFdyaXRlIGFjY2VzcyB0byB0aGUgY2FjaGUgaXMgcHJvdGVjdGVkIGJ5IHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBOTFNfRm9ybWF0c0NTOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBOTFNfRm9ybWF0c0NTX2RlYnVnID0KewogICAgMCwgMCwgJk5MU19Gb3JtYXRzQ1MsCiAgICB7ICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsCiAgICAgICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBOTFNfRm9ybWF0cyIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gTkxTX0Zvcm1hdHNDUyA9IHsgJk5MU19Gb3JtYXRzQ1NfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldExvY2FsZU51bWJlciA8aW50ZXJuYWw+CiAqCiAqIEdldCBhIG51bWVyaWMgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBEV09SRCBOTFNfR2V0TG9jYWxlTnVtYmVyKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIFdDSEFSIHN6QnVmZls4MF07CiAgRFdPUkQgZHdWYWwgPSAwOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKCiAgaWYgKHN6QnVmZlswXSAmJiBzekJ1ZmZbMV0gPT0gJzsnICYmIHN6QnVmZlsyXSAhPSAnMCcpCiAgICBkd1ZhbCA9IChzekJ1ZmZbMF0gLSAnMCcpICogMTAgKyAoc3pCdWZmWzJdIC0gJzAnKTsKICBlbHNlCiAgewogICAgY29uc3QgV0NIQVIqIGl0ZXIgPSBzekJ1ZmY7CiAgICBkd1ZhbCA9IDA7CiAgICB3aGlsZSgqaXRlciA+PSAnMCcgJiYgKml0ZXIgPD0gJzknKQogICAgICBkd1ZhbCA9IGR3VmFsICogMTAgKyAoKml0ZXIrKyAtICcwJyk7CiAgfQogIHJldHVybiBkd1ZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXRMb2NhbGVTdHJpbmcgPGludGVybmFsPgogKgogKiBHZXQgYSBzdHJpbmcgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBXQ0hBUiogTkxTX0dldExvY2FsZVN0cmluZyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MpCnsKICBXQ0hBUiBzekJ1ZmZbODBdLCAqc3RyOwogIERXT1JEIGR3TGVuOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKICBkd0xlbiA9IHN0cmxlblcoc3pCdWZmKSArIDE7CiAgc3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgaWYgKHN0cikKICAgIG1lbWNweShzdHIsIHN6QnVmZiwgZHdMZW4gKiBzaXplb2YoV0NIQVIpKTsKICByZXR1cm4gc3RyOwp9CgojZGVmaW5lIEdFVF9MT0NBTEVfTlVNQkVSKG51bSwgdHlwZSkgbnVtID0gTkxTX0dldExvY2FsZU51bWJlcihsY2lkLCB0eXBlfGR3RmxhZ3MpOyBcCiAgVFJBQ0UoICN0eXBlICI6ICVsZCAoJTA4bHgpXG4iLCAoRFdPUkQpbnVtLCAoRFdPUkQpbnVtKQoKI2RlZmluZSBHRVRfTE9DQUxFX1NUUklORyhzdHIsIHR5cGUpIHN0ciA9IE5MU19HZXRMb2NhbGVTdHJpbmcobGNpZCwgdHlwZXxkd0ZsYWdzKTsgXAogIFRSQUNFKCAjdHlwZSAiOiAnJXMnXG4iLCBkZWJ1Z3N0cl93KHN0cikpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldEZvcm1hdHMgPGludGVybmFsPgogKgogKiBDYWxjdWxhdGUgKGFuZCBjYWNoZSkgdGhlIG51bWJlciBmb3JtYXRzIGZvciBhIGxvY2FsZS4KICovCnN0YXRpYyBjb25zdCBOTFNfRk9STUFUX05PREUgKk5MU19HZXRGb3JtYXRzKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIC8qIEdldExvY2FsZUluZm8oKSBpZGVudGlmaWVycyBmb3IgY2FjaGVkIGZvcm1hdHRpbmcgc3RyaW5ncyAqLwogIHN0YXRpYyBjb25zdCBVU0hPUlQgTkxTX0xvY2FsZUluZGljZXNbXSA9IHsKICAgIExPQ0FMRV9TTkVHQVRJVkVTSUdOLAogICAgTE9DQUxFX1NMT05HREFURSwgICBMT0NBTEVfU1NIT1JUREFURSwKICAgIExPQ0FMRV9TVElNRUZPUk1BVCwKICAgIExPQ0FMRV9TREFZTkFNRTEsIExPQ0FMRV9TREFZTkFNRTIsIExPQ0FMRV9TREFZTkFNRTMsCiAgICBMT0NBTEVfU0RBWU5BTUU0LCBMT0NBTEVfU0RBWU5BTUU1LCBMT0NBTEVfU0RBWU5BTUU2LCBMT0NBTEVfU0RBWU5BTUU3LAogICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywKICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsCiAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LAogICAgTE9DQUxFX1NNT05USE5BTUUxLCBMT0NBTEVfU01PTlRITkFNRTIsIExPQ0FMRV9TTU9OVEhOQU1FMywKICAgIExPQ0FMRV9TTU9OVEhOQU1FNCwgTE9DQUxFX1NNT05USE5BTUU1LCBMT0NBTEVfU01PTlRITkFNRTYsCiAgICBMT0NBTEVfU01PTlRITkFNRTcsIExPQ0FMRV9TTU9OVEhOQU1FOCwgTE9DQUxFX1NNT05USE5BTUU5LAogICAgTE9DQUxFX1NNT05USE5BTUUxMCwgTE9DQUxFX1NNT05USE5BTUUxMSwgTE9DQUxFX1NNT05USE5BTUUxMiwKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsCiAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LAogICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsCiAgICBMT0NBTEVfUzExNTksIExPQ0FMRV9TMjM1OSwKICAgIExPQ0FMRV9TWUVBUk1PTlRICiAgfTsKICBzdGF0aWMgTkxTX0ZPUk1BVF9OT0RFICpOTFNfQ2FjaGVkRm9ybWF0cyA9IE5VTEw7CiAgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0NhY2hlZEZvcm1hdHM7CgogIGR3RmxhZ3MgJj0gTE9DQUxFX05PVVNFUk9WRVJSSURFOwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseClcbiIsIGxjaWQsIGR3RmxhZ3MpOwoKICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGNhY2hlZCB0aGUgbG9jYWxlcyBudW1iZXIgZm9ybWF0ICovCiAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICBub2RlID0gbm9kZS0+bmV4dDsKCiAgaWYgKCFub2RlIHx8IG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpCiAgewogICAgTkxTX0ZPUk1BVF9OT0RFICpuZXdfbm9kZTsKICAgIERXT1JEIGk7CgogICAgVFJBQ0UoIkNyZWF0aW5nIG5ldyBjYWNoZSBlbnRyeVxuIik7CgogICAgaWYgKCEobmV3X25vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKE5MU19GT1JNQVRfTk9ERSkpKSkKICAgICAgcmV0dXJuIE5VTEw7CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmR3Q29kZVBhZ2UsIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSk7CgogICAgLyogTnVtYmVyIEZvcm1hdCAqLwogICAgbmV3X25vZGUtPmxjaWQgPSBsY2lkOwogICAgbmV3X25vZGUtPmR3RmxhZ3MgPSBkd0ZsYWdzOwogICAgbmV3X25vZGUtPm5leHQgPSBOVUxMOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTnVtRGlnaXRzLCBMT0NBTEVfSURJR0lUUyk7CiAgICBHRVRfTE9DQUxFX05VTUJFUihuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvLCBMT0NBTEVfSUxaRVJPKTsKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTmVnYXRpdmVPcmRlciwgTE9DQUxFX0lORUdOVU1CRVIpOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcsIExPQ0FMRV9TR1JPVVBJTkcpOwogICAgaWYgKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgPiA5ICYmIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgIT0gMzIpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcpOwogICAgICBuZXdfbm9kZS0+Zm10Lkdyb3VwaW5nID0gMDsKICAgIH0KCiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCwgTE9DQUxFX1NERUNJTUFMKTsKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NUSE9VU0FORCk7CgogICAgLyogQ3VycmVuY3kgRm9ybWF0ICovCiAgICBuZXdfbm9kZS0+Y3lmbXQuTnVtRGlnaXRzID0gbmV3X25vZGUtPmZtdC5OdW1EaWdpdHM7CiAgICBuZXdfbm9kZS0+Y3lmbXQuTGVhZGluZ1plcm8gPSBuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZywgTE9DQUxFX1NHUk9VUElORyk7CgogICAgaWYgKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA+IDkpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TTU9OR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyk7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA9IDA7CiAgICB9CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIsIExPQ0FMRV9JTkVHQ1VSUik7CiAgICBpZiAobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIgPiAxNSkKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX0lORUdDVVJSICglZCkgdW5oYW5kbGVkLCBwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuTmVnYXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyLCBMT0NBTEVfSUNVUlJFTkNZKTsKICAgIGlmIChuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlciA+IDMpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9JUE9TQ1VSUiAoJWQpIHVuaGFuZGxlZCxwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXAsIExPQ0FMRV9TTU9OREVDSU1BTFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NNT05USE9VU0FORFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBDdXJyZW5jeVN5bWJvbCwgTE9DQUxFX1NDVVJSRU5DWSk7CgogICAgLyogRGF0ZS9UaW1lIEZvcm1hdCBpbmZvLCBuZWdhdGl2ZSBjaGFyYWN0ZXIsIGV0YyAqLwogICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgewogICAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+bHBwc3pTdHJpbmdzW2ldLCBOTFNfTG9jYWxlSW5kaWNlc1tpXSk7CiAgICB9CiAgICBuZXdfbm9kZS0+c3pTaG9ydEFNWzBdID0gR2V0QU0obmV3X25vZGUpWzBdOyBuZXdfbm9kZS0+c3pTaG9ydEFNWzFdID0gJ1wwJzsKICAgIG5ld19ub2RlLT5zelNob3J0UE1bMF0gPSBHZXRQTShuZXdfbm9kZSlbMF07IG5ld19ub2RlLT5zelNob3J0UE1bMV0gPSAnXDAnOwoKICAgIC8qIE5vdyBhZGQgdGhlIGNvbXB1dGVkIGZvcm1hdCB0byB0aGUgY2FjaGUgKi8KICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCZOTFNfRm9ybWF0c0NTKTsKCiAgICAvKiBTZWFyY2ggYWdhaW46IFdlIG1heSBoYXZlIHJhY2VkIHRvIGFkZCB0aGUgbm9kZSAqLwogICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzOwogICAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwoKICAgIGlmICghbm9kZSkKICAgIHsKICAgICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzID0gbmV3X25vZGU7IC8qIEVtcHR5IGxpc3QgKi8KICAgICAgbmV3X25vZGUgPSBOVUxMOwogICAgfQogICAgZWxzZSBpZiAobm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykKICAgIHsKICAgICAgbm9kZS0+bmV4dCA9IG5ld19ub2RlOyAvKiBOb3QgaW4gdGhlIGxpc3QsIGFkZCB0byBlbmQgKi8KICAgICAgbm9kZSA9IG5ld19ub2RlOwogICAgICBuZXdfbm9kZSA9IE5VTEw7CiAgICB9CgogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oJk5MU19Gb3JtYXRzQ1MpOwoKICAgIGlmIChuZXdfbm9kZSkKICAgIHsKICAgICAgLyogV2UgcmFjZWQgYW5kIGxvc3Q6IFRoZSBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgdGhyZWFkLgogICAgICAgKiBub2RlIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGNhY2hlZCBub2RlLCBzbyBmcmVlIG5ld19ub2RlLgogICAgICAgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5scHBzelN0cmluZ3NbaV0pOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXApOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scEN1cnJlbmN5U3ltYm9sKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUpOwogICAgfQogIH0KICByZXR1cm4gbm9kZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19Jc1VuaWNvZGVPbmx5TGNpZCA8aW50ZXJuYWw+CiAqCiAqIERldGVybWluZSBpZiBhIGxvY2FsZSBpcyBVbmljb2RlIG9ubHksIGFuZCB0aHVzIGludmFsaWQgaW4gQVNDSUkgY2FsbHMuCiAqLwpCT09MIE5MU19Jc1VuaWNvZGVPbmx5TGNpZChMQ0lEIGxjaWQpCnsKICBzd2l0Y2ggKFBSSU1BUllMQU5HSUQobGNpZCkpCiAgewogIGNhc2UgTEFOR19BUk1FTklBTjoKICBjYXNlIExBTkdfRElWRUhJOgogIGNhc2UgTEFOR19HRU9SR0lBTjoKICBjYXNlIExBTkdfR1VKQVJBVEk6CiAgY2FzZSBMQU5HX0hJTkRJOgogIGNhc2UgTEFOR19LQU5OQURBOgogIGNhc2UgTEFOR19LT05LQU5JOgogIGNhc2UgTEFOR19NQVJBVEhJOgogIGNhc2UgTEFOR19QVU5KQUJJOgogIGNhc2UgTEFOR19TQU5TS1JJVDoKICAgIFRSQUNFKCJsY2lkIDB4JTA4bHg6IGxhbmdpZCAweCU0eCBpcyBVbmljb2RlIE9ubHlcbiIsIGxjaWQsIFBSSU1BUllMQU5HSUQobGNpZCkpOwogICAgcmV0dXJuIFRSVUU7CiAgZGVmYXVsdDoKICAgIHJldHVybiBGQUxTRTsKICB9Cn0KCi8qCiAqIEZvcm1hdHRpbmcgb2YgZGF0ZXMsIHRpbWVzLCBudW1iZXJzIGFuZCBjdXJyZW5jaWVzLgogKi8KCiNkZWZpbmUgSXNMaXRlcmFsTWFya2VyKHApIChwID09ICdcJycpCiNkZWZpbmUgSXNEYXRlRm10Q2hhcihwKSAgIChwID09ICdkJ3x8cCA9PSAnTSd8fHAgPT0gJ3knfHxwID09ICdnJykKI2RlZmluZSBJc1RpbWVGbXRDaGFyKHApICAgKHAgPT0gJ0gnfHxwID09ICdoJ3x8cCA9PSAnbSd8fHAgPT0gJ3MnfHxwID09ICd0JykKCi8qIE9ubHkgdGhlIGZvbGxvd2luZyBmbGFncyBjYW4gYmUgZ2l2ZW4gaWYgYSBkYXRlL3RpbWUgZm9ybWF0IGlzIHNwZWNpZmllZCAqLwojZGVmaW5lIERBVEVfRk9STUFUX0ZMQUdTIChEQVRFX0RBVEVWQVJTT05MWXxMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiNkZWZpbmUgVElNRV9GT1JNQVRfRkxBR1MgKFRJTUVfVElNRVZBUlNPTkxZfFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVR8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT01JTlVURVNPUlNFQ09ORFN8VElNRV9OT1NFQ09ORFN8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT1RJTUVNQVJLRVJ8TE9DQUxFX05PVVNFUk9WRVJSSURFKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXIDxpbnRlcm5hbD4KICoKICogUGVyZm9ybXMgdGhlIGZvcm1hdHRpbmcgZm9yIEdldERhdGVGb3JtYXRXL0dldFRpbWVGb3JtYXRXLgogKgogKiBGSVhNRQogKiBEQVRFX1VTRV9BTFRfQ0FMRU5EQVIgICAgICAgICAgIC0gUmVxdWlyZXMgR2V0Q2FsZW5kYXJJbmZvIHRvIHdvcmsgZmlyc3QuCiAqIERBVEVfTFRSUkVBRElORy9EQVRFX1JUTFJFQURJTkcgLSBOb3QgeWV0IGltcGxlbWVudGVkLgogKi8Kc3RhdGljIElOVCBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIGxwVGltZSwgTFBDV1NUUiBscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBscFN0ciwgSU5UIGNjaE91dCkKewogIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZTsKICBTWVNURU1USU1FIHN0OwogIElOVCBjY2hXcml0dGVuID0gMDsKICBJTlQgbGFzdEZvcm1hdFBvcyA9IDA7CiAgQk9PTCBiU2tpcHBpbmcgPSBGQUxTRTsgLyogU2tpcHBpbmcgdGV4dCBhcm91bmQgbWFya2VyPyAqLwoKICAvKiBWZXJpZnkgb3VyIGFyZ3VtZW50cyAqLwogIGlmICgoY2NoT3V0ICYmICFscFN0cikgfHwgIShub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncykpKQogIHsKTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKGR3RmxhZ3MgJiB+KERBVEVfREFURVZBUlNPTkxZfFRJTUVfVElNRVZBUlNPTkxZKSkKICB7CiAgICBpZiAobHBGb3JtYXQgJiYKICAgICAgICAoKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSAmJiBkd0ZsYWdzICYgfkRBVEVfRk9STUFUX0ZMQUdTKSB8fAogICAgICAgICAoZHdGbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZICYmIGR3RmxhZ3MgJiB+VElNRV9GT1JNQVRfRkxBR1MpKSkKICAgIHsKTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M6CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX0ZMQUdTKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSkKICAgIHsKICAgICAgaWYgKChkd0ZsYWdzICYgKERBVEVfTFRSUkVBRElOR3xEQVRFX1JUTFJFQURJTkcpKSA9PSAoREFURV9MVFJSRUFESU5HfERBVEVfUlRMUkVBRElORykpCiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczsKICAgICAgZWxzZSBpZiAoZHdGbGFncyAmIChEQVRFX0xUUlJFQURJTkd8REFURV9SVExSRUFESU5HKSkKICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgZmxhZ3M6IERBVEVfTFRSUkVBRElORy9EQVRFX1JUTFJFQURJTkdcbiIpOwoKICAgICAgc3dpdGNoIChkd0ZsYWdzICYgKERBVEVfU0hPUlREQVRFfERBVEVfTE9OR0RBVEV8REFURV9ZRUFSTU9OVEgpKQogICAgICB7CiAgICAgIGNhc2UgMDoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChscEZvcm1hdCkKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKCFscEZvcm1hdCkKICB7CiAgICAvKiBVc2UgdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgZm9ybWF0ICovCiAgICBpZiAoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZKQogICAgewogICAgICBpZiAoZHdGbGFncyAmIERBVEVfWUVBUk1PTlRIKQogICAgICAgIGxwRm9ybWF0ID0gR2V0WWVhck1vbnRoKG5vZGUpOwogICAgICBlbHNlIGlmIChkd0ZsYWdzICYgREFURV9MT05HREFURSkKICAgICAgICBscEZvcm1hdCA9IEdldExvbmdEYXRlKG5vZGUpOwogICAgICBlbHNlCiAgICAgICAgbHBGb3JtYXQgPSBHZXRTaG9ydERhdGUobm9kZSk7CiAgICB9CiAgICBlbHNlCiAgICAgIGxwRm9ybWF0ID0gR2V0VGltZShub2RlKTsKICB9CgogIGlmICghbHBUaW1lKQogIHsKICAgIEdldExvY2FsVGltZSgmc3QpOyAvKiBEZWZhdWx0IHRvIGN1cnJlbnQgdGltZSAqLwogICAgbHBUaW1lID0gJnN0OwogIH0KICBlbHNlCiAgewogICAgaWYgKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSkKICAgIHsKICAgICAgRklMRVRJTUUgZnRUbXA7CgogICAgICAvKiBWZXJpZnkgdGhlIGRhdGUgYW5kIGNvcnJlY3QgdGhlIEQuTy5XLiBpZiBuZWVkZWQgKi8KICAgICAgbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CiAgICAgIHN0LndZZWFyID0gbHBUaW1lLT53WWVhcjsKICAgICAgc3Qud01vbnRoID0gbHBUaW1lLT53TW9udGg7CiAgICAgIHN0LndEYXkgPSBscFRpbWUtPndEYXk7CgogICAgICBpZiAoc3Qud0RheSA+IDMxIHx8IHN0LndNb250aCA+IDEyIHx8ICFTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdFRtcCkpCiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRQYXJhbWV0ZXI7CgogICAgICBGaWxlVGltZVRvU3lzdGVtVGltZSgmZnRUbXAsICZzdCk7CiAgICAgIGxwVGltZSA9ICZzdDsKICAgIH0KCiAgICBpZiAoZHdGbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZKQogICAgewogICAgICAvKiBWZXJpZnkgdGhlIHRpbWUgKi8KICAgICAgaWYgKGxwVGltZS0+d0hvdXIgPiAyNCB8fCBscFRpbWUtPndNaW51dGUgPiA1OSB8fCBscFRpbWUtPndTZWNvbmQgPiA1OSkKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZFBhcmFtZXRlcjsKICAgIH0KICB9CgogIC8qIEZvcm1hdCB0aGUgb3V0cHV0ICovCiAgd2hpbGUgKCpscEZvcm1hdCkKICB7CiAgICBpZiAoSXNMaXRlcmFsTWFya2VyKCpscEZvcm1hdCkpCiAgICB7CiAgICAgIC8qIFN0YXJ0IG9mIGEgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgbHBGb3JtYXQrKzsKCiAgICAgIC8qIExvb3AgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGl0ZXJhbCBtYXJrZXIgb3IgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgICAgd2hpbGUgKCpscEZvcm1hdCkKICAgICAgewogICAgICAgIGlmIChJc0xpdGVyYWxNYXJrZXIoKmxwRm9ybWF0KSkKICAgICAgICB7CiAgICAgICAgICBscEZvcm1hdCsrOwogICAgICAgICAgaWYgKCFJc0xpdGVyYWxNYXJrZXIoKmxwRm9ybWF0KSkKICAgICAgICAgICAgYnJlYWs7IC8qIFRlcm1pbmF0aW5nIGxpdGVyYWwgbWFya2VyICovCiAgICAgICAgfQoKICAgICAgICBpZiAoIWNjaE91dCkKICAgICAgICAgIGNjaFdyaXR0ZW4rKzsgICAvKiBDb3VudCBzaXplIG9ubHkgKi8KICAgICAgICBlbHNlIGlmIChjY2hXcml0dGVuID49IGNjaE91dCkKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICAgIGVsc2UgaWYgKCFiU2tpcHBpbmcpCiAgICAgICAgewogICAgICAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAqbHBGb3JtYXQ7CiAgICAgICAgICBjY2hXcml0dGVuKys7CiAgICAgICAgfQogICAgICAgIGxwRm9ybWF0Kys7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkgJiYgSXNEYXRlRm10Q2hhcigqbHBGb3JtYXQpKSB8fAogICAgICAgICAgICAgKGR3RmxhZ3MgJiBUSU1FX1RJTUVWQVJTT05MWSAmJiBJc1RpbWVGbXRDaGFyKCpscEZvcm1hdCkpKQogICAgewogICAgICBjaGFyICBidWZmQVszMl07CiAgICAgIFdDSEFSIGJ1ZmZbMzJdLCBmbXRDaGFyOwogICAgICBMUENXU1RSIHN6QWRkID0gTlVMTDsKICAgICAgRFdPUkQgZHdWYWwgPSAwOwogICAgICBpbnQgICBjb3VudCA9IDAsIGR3TGVuOwoKICAgICAgYlNraXBwaW5nID0gRkFMU0U7CgogICAgICBmbXRDaGFyID0gKmxwRm9ybWF0OwogICAgICB3aGlsZSAoKmxwRm9ybWF0ID09IGZtdENoYXIpCiAgICAgIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIGxwRm9ybWF0Kys7CiAgICAgIH0KICAgICAgYnVmZlswXSA9ICdcMCc7CgogICAgICBzd2l0Y2goZm10Q2hhcikKICAgICAgewogICAgICBjYXNlICdkJzoKICAgICAgICBpZiAoY291bnQgPj0gNCkKICAgICAgICAgIHN6QWRkID0gR2V0TG9uZ0RheShub2RlLCAobHBUaW1lLT53RGF5T2ZXZWVrICsgNikgJSA3KTsKICAgICAgICBlbHNlIGlmIChjb3VudCA9PSAzKQogICAgICAgICAgc3pBZGQgPSBHZXRTaG9ydERheShub2RlLCAobHBUaW1lLT53RGF5T2ZXZWVrICsgNikgJSA3KTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndEYXk7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnTSc6CiAgICAgICAgaWYgKGNvdW50ID49IDQpCiAgICAgICAgICBzekFkZCA9IEdldExvbmdNb250aChub2RlLCBscFRpbWUtPndNb250aCAtIDEpOwogICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDMpCiAgICAgICAgICBzekFkZCA9IEdldFNob3J0TW9udGgobm9kZSwgbHBUaW1lLT53TW9udGggLSAxKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndNb250aDsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd5JzoKICAgICAgICBpZiAoY291bnQgPj0gNCkKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IDQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d1llYXI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53WWVhciAlIDEwMDsKICAgICAgICB9CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZyc6CiAgICAgICAgaWYgKGNvdW50ID09IDIpCiAgICAgICAgewogICAgICAgICAgLyogRklYTUU6IE91ciBHZXRDYWxlbmRhckluZm8oKSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBDQUxfU0VSQVNUUklORy4KICAgICAgICAgICAqICAgICAgICBXaGVuIGl0IGlzIGZpeGVkLCB0aGlzIHN0cmluZyBzaG91bGQgYmUgY2FjaGVkIGluICdub2RlJy4KICAgICAgICAgICAqLwogICAgICAgICAgRklYTUUoIlNob3VsZCBiZSB1c2luZyBHZXRDYWxlbmRhckluZm8oQ0FMX1NFUkFTVFJJTkcpLCBkZWZhdWx0aW5nIHRvICdBRCdcbiIpOwogICAgICAgICAgYnVmZlswXSA9ICdBJzsgYnVmZlsxXSA9ICdEJzsgYnVmZlsyXSA9ICdcMCc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBidWZmWzBdID0gJ2cnOyBidWZmWzFdID0gJ1wwJzsgLyogQWRkIGEgbGl0ZXJhbCAnZycgKi8KICAgICAgICB9CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnaCc6CiAgICAgICAgaWYgKCEoZHdGbGFncyAmIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQpKQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndIb3VyID09IDAgPyAxMiA6IChscFRpbWUtPndIb3VyIC0gMSkgJSAxMiArIDE7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogLi4gZmFsbCB0aHJvdWdoIGlmIHdlIGFyZSBmb3JjZWQgdG8gb3V0cHV0IGluIDI0IGhvdXIgZm9ybWF0ICovCgogICAgICBjYXNlICdIJzoKICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d0hvdXI7CiAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnbSc6CiAgICAgICAgaWYgKGR3RmxhZ3MgJiBUSU1FX05PTUlOVVRFU09SU0VDT05EUykKICAgICAgICB7CiAgICAgICAgICBjY2hXcml0dGVuID0gbGFzdEZvcm1hdFBvczsgLyogU2tpcCAqLwogICAgICAgICAgYlNraXBwaW5nID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndNaW51dGU7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAncyc6CiAgICAgICAgaWYgKGR3RmxhZ3MgJiAoVElNRV9OT1NFQ09ORFN8VElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICAgICAgIHsKICAgICAgICAgIGNjaFdyaXR0ZW4gPSBsYXN0Rm9ybWF0UG9zOyAvKiBTa2lwICovCiAgICAgICAgICBiU2tpcHBpbmcgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d1NlY29uZDsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd0JzoKICAgICAgICBpZiAoZHdGbGFncyAmIFRJTUVfTk9USU1FTUFSS0VSKQogICAgICAgIHsKICAgICAgICAgIGNjaFdyaXR0ZW4gPSBsYXN0Rm9ybWF0UG9zOyAvKiBTa2lwICovCiAgICAgICAgICBiU2tpcHBpbmcgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgaWYgKGNvdW50ID09IDEpCiAgICAgICAgICAgIHN6QWRkID0gbHBUaW1lLT53SG91ciA8IDEyID8gbm9kZS0+c3pTaG9ydEFNIDogbm9kZS0+c3pTaG9ydFBNOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzekFkZCA9IGxwVGltZS0+d0hvdXIgPCAxMiA/IEdldEFNKG5vZGUpIDogR2V0UE0obm9kZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoc3pBZGQgPT0gYnVmZiAmJiBidWZmWzBdID09ICdcMCcpCiAgICAgIHsKICAgICAgICAvKiBXZSBoYXZlIGEgbnVtZXJpYyB2YWx1ZSB0byBhZGQgKi8KICAgICAgICBzcHJpbnRmKGJ1ZmZBLCAiJS4qbGQiLCBjb3VudCwgZHdWYWwpOwogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWZmQSwgLTEsIGJ1ZmYsIHNpemVvZihidWZmKS9zaXplb2YoV0NIQVIpKTsKICAgICAgfQoKICAgICAgZHdMZW4gPSBzekFkZCA/IHN0cmxlblcoc3pBZGQpIDogMDsKCiAgICAgIGlmIChjY2hPdXQgJiYgZHdMZW4pCiAgICAgIHsKICAgICAgICBpZiAoY2NoV3JpdHRlbiArIGR3TGVuIDwgY2NoT3V0KQogICAgICAgICAgbWVtY3B5KGxwU3RyICsgY2NoV3JpdHRlbiwgc3pBZGQsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIG1lbWNweShscFN0ciArIGNjaFdyaXR0ZW4sIHN6QWRkLCAoY2NoT3V0IC0gY2NoV3JpdHRlbikgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICAgIH0KICAgICAgfQogICAgICBjY2hXcml0dGVuICs9IGR3TGVuOwogICAgICBsYXN0Rm9ybWF0UG9zID0gY2NoV3JpdHRlbjsgLyogU2F2ZSBwb3NpdGlvbiBvZiBsYXN0IG91dHB1dCBmb3JtYXQgdGV4dCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBMaXRlcmFsIGNoYXJhY3RlciAqLwogICAgICBpZiAoIWNjaE91dCkKICAgICAgICBjY2hXcml0dGVuKys7ICAgLyogQ291bnQgc2l6ZSBvbmx5ICovCiAgICAgIGVsc2UgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICBlbHNlIGlmICghYlNraXBwaW5nIHx8ICpscEZvcm1hdCA9PSAnICcpCiAgICAgIHsKICAgICAgICBscFN0cltjY2hXcml0dGVuXSA9ICpscEZvcm1hdDsKICAgICAgICBjY2hXcml0dGVuKys7CiAgICAgIH0KICAgICAgbHBGb3JtYXQrKzsKICAgIH0KICB9CgogIC8qIEZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICBpZiAoY2NoT3V0KQogIHsKICAgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICBlbHNlCiAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAnXDAnOwogIH0KICBjY2hXcml0dGVuKys7IC8qIEluY2x1ZGUgdGVybWluYXRpbmcgTlVMICovCgogIFRSQUNFKCJyZXR1cm5pbmcgbGVuZ3RoPSVkLCBvdXB1dD0nJXMnXG4iLCBjY2hXcml0dGVuLCBkZWJ1Z3N0cl93KGxwU3RyKSk7CiAgcmV0dXJuIGNjaFdyaXR0ZW47CgpOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX092ZXJydW46CiAgVFJBQ0UoInJldHVybmluZyAwLCAoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUilcbiIpOwogIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBIDxpbnRlcm5hbD4KICoKICogQVNDSUkgd3JhcHBlciBmb3IgR2V0RGF0ZUZvcm1hdEEvR2V0VGltZUZvcm1hdEEuCiAqLwpzdGF0aWMgSU5UIE5MU19HZXREYXRlVGltZUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscFN0ciwgSU5UIGNjaE91dCkKewogIERXT1JEIGNwID0gQ1BfQUNQOwogIFdDSEFSIHN6Rm9ybWF0WzEyOF0sIHN6T3V0WzEyOF07CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscFN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldERhdGVUaW1lRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXREYXRlVGltZUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjsKICAgIGNwID0gbm9kZS0+ZHdDb2RlUGFnZTsKICB9CgogIGlmIChscEZvcm1hdCkKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LCAtMSwgc3pGb3JtYXQsIHNpemVvZihzekZvcm1hdCkvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwgbHBGb3JtYXQgPyBzekZvcm1hdCA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBTdHIgPyBzek91dCA6IE5VTEwsIGNjaE91dCk7CgogIGlmIChscFN0cikKICB7CiAgICBpZiAoc3pPdXRbMF0pCiAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIDAsIHN6T3V0LCAtMSwgbHBTdHIsIGNjaE91dCwgMCwgMCk7CiAgICBlbHNlIGlmIChjY2hPdXQgJiYgaVJldCkKICAgICAgKmxwU3RyID0gJ1wwJzsKICB9CiAgcmV0dXJuIGlSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RGF0ZUZvcm1hdEEgW0tFUk5FTDMyLkBdCiAqCiAqIEZvcm1hdCBhIGRhdGUgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogKgogKiBQQVJBTVMKICogIGxjaWQgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICBbSV0gTE9DQUxFXyBhbmQgREFURV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscFRpbWUgICAgW0ldIERhdGUgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgW0ldIEZvcm1hdCBzdHJpbmcsIG9yIE5VTEwgdG8gdXNlIHRoZSBzeXN0ZW0gZGVmYXVsdHMKICogIGxwRGF0ZVN0ciBbT10gRGVzdGluYXRpb24gZm9yIGZvcm1hdHRlZCBzdHJpbmcKICogIGNjaE91dCAgICBbSV0gU2l6ZSBvZiBscERhdGVTdHIsIG9yIDAgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHRpbmcgc2l6ZQogKgogKiBOT1RFUwogKiAgLSBJZiBscEZvcm1hdCBpcyBOVUxMLCBscERhdGVTdHIgd2lsbCBiZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQKICogICAgZGV0YWlscyByZXR1cm5lZCBieSBHZXRMb2NhbGVJbmZvQSgpIGFuZCBtb2RpZmllZCBieSBkd0ZsYWdzLgogKiAgLSBscEZvcm1hdCBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGFuZCBmb3JtYXR0aW5nIHRva2Vucy4gQW55IGNoYXJhY3RlcnMKICogICAgaW4gdGhlIHN0cmluZyBhcmUgY29waWVkIHZlcmJhdGltIHRvIGxwRGF0ZVN0ciwgd2l0aCB0b2tlbnMgYmVpbmcgcmVwbGFjZWQKICogICAgYnkgdGhlIGRhdGUgdmFsdWVzIHRoZXkgcmVwcmVzZW50LgogKiAgLSBUaGUgZm9sbG93aW5nIHRva2VucyBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgaW4gYSBkYXRlIGZvcm1hdCBzdHJpbmc6CiAqfCAgVG9rZW4gIE1lYW5pbmcKICp8ICAtLS0tLSAgLS0tLS0tLQogKnwgIGQgICAgICBTaW5nbGUgZGlnaXQgZGF5IG9mIHRoZSBtb250aCAobm8gbGVhZGluZyAwKQogKnwgIGRkICAgICBEb3VibGUgZGlnaXQgZGF5IG9mIHRoZSBtb250aAogKnwgIGRkZCAgICBTaG9ydCBuYW1lIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAqfCAgZGRkZCAgIExvbmcgbmFtZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawogKnwgIE0gICAgICBTaW5nbGUgZGlnaXQgbW9udGggb2YgdGhlIHllYXIgKG5vIGxlYWRpbmcgMCkKICp8ICBNTSAgICAgRG91YmxlIGRpZ2l0IG1vbnRoIG9mIHRoZSB5ZWFyCiAqfCAgTU1NICAgIFNob3J0IG5hbWUgZm9yIHRoZSBtb250aCBvZiB0aGUgeWVhcgogKnwgIE1NTU0gICBMb25nIG5hbWUgZm9yIHRoZSBtb250aCBvZiB0aGUgeWVhcgogKnwgIHkgICAgICBEb3VibGUgZGlnaXQgeWVhciBudW1iZXIgKG5vIGxlYWRpbmcgMCkKICp8ICB5eSAgICAgRG91YmxlIGRpZ2l0IHllYXIgbnVtYmVyCiAqfCAgeXl5eSAgIEZvdXIgZGlnaXQgeWVhciBudW1iZXIKICp8ICBnZyAgICAgRXJhIHN0cmluZywgZm9yIGV4YW1wbGUgJ0FEJy4KICogIC0gVG8gb3V0cHV0IGFueSBsaXRlcmFsIGNoYXJhY3RlciB0aGF0IGNvdWxkIGJlIG1pc2lkZW50aWZpZWQgYXMgYSB0b2tlbiwKICogICAgZW5jbG9zZSBpdCBpbiBzaW5nbGUgcXVvdGVzLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwRGF0ZVN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRBKCBMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsIGNvbnN0IFNZU1RFTVRJTUUqIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscERhdGVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscERhdGVTdHIsIGNjaE91dCk7CgogIHJldHVybiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBKGxjaWQsIGR3RmxhZ3MgfCBEQVRFX0RBVEVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscERhdGVTdHIsIGNjaE91dCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXRXCVtLRVJORUwzMi5AXQogKgogKiBTZWUgR2V0RGF0ZUZvcm1hdEEuCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBGb3JtYXQsIExQV1NUUiBscERhdGVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl93KGxwRm9ybWF0KSwgbHBEYXRlU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0VyhsY2lkLCBkd0ZsYWdzfERBVEVfREFURVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwRGF0ZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdEEJW0tFUk5FTDMyLkBdCiAqCiAqIEZvcm1hdCBhIHRpbWUgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogKgogKiBQQVJBTVMKICogIGxjaWQgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICBbSV0gTE9DQUxFXyBhbmQgVElNRV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscFRpbWUgICAgW0ldIFRpbWUgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgW0ldIEZvcm1hdHRpbmcgb3ZlcnJpZGVzCiAqICBscFRpbWVTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgW0ldIFNpemUgb2YgbHBUaW1lU3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gSWYgbHBGb3JtYXQgaXMgTlVMTCwgbHBzelZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0CiAqICAgIGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKSBhbmQgbW9kaWZpZWQgYnkgZHdGbGFncy4KICogIC0gbHBGb3JtYXQgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBhbmQgZm9ybWF0dGluZyB0b2tlbnMuIEFueSBjaGFyYWN0ZXJzCiAqICAgIGluIHRoZSBzdHJpbmcgYXJlIGNvcGllZCB2ZXJiYXRpbSB0byBscFRpbWVTdHIsIHdpdGggdG9rZW5zIGJlaW5nIHJlcGxhY2VkCiAqICAgIGJ5IHRoZSB0aW1lIHZhbHVlcyB0aGV5IHJlcHJlc2VudC4KICogIC0gVGhlIGZvbGxvd2luZyB0b2tlbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGluIGEgdGltZSBmb3JtYXQgc3RyaW5nOgogKnwgIFRva2VuICBNZWFuaW5nCiAqfCAgLS0tLS0gIC0tLS0tLS0KICp8ICBoICAgICAgSG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIgY2xvY2spCiAqfCAgaGggICAgIEhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzICgxMi1ob3VyIGNsb2NrKQogKnwgIEggICAgICBIb3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91ciBjbG9jaykKICp8ICBISCAgICAgSG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMgKDI0LWhvdXIgY2xvY2spCiAqfCAgbSAgICAgIE1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICp8ICBtbSAgICAgTWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKnwgIHMgICAgICBTZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqfCAgc3MgICAgIFNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICp8ICB0ICAgICAgU2hvcnQgdGltZSBtYXJrZXIgKGUuZy4gIkEiIG9yICJQIikKICp8ICB0dCAgICAgTG9uZyB0aW1lIG1hcmtlciAoZS5nLiAiQU0iLCAiUE0iKQogKiAgLSBUbyBvdXRwdXQgYW55IGxpdGVyYWwgY2hhcmFjdGVyIHRoYXQgY291bGQgYmUgbWlzaWRlbnRpZmllZCBhcyBhIHRva2VuLAogKiAgICBlbmNsb3NlIGl0IGluIHNpbmdsZSBxdW90ZXMuCiAqICAtIFRoZSBBc2NpaSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgbGNpZCBpcyBVbmljb2RlIG9ubHkuCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gbHBUaW1lU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0VGltZUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscFRpbWVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscFRpbWVTdHIsIGNjaE91dCk7CgogIHJldHVybiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBKGxjaWQsIGR3RmxhZ3N8VElNRV9USU1FVkFSU09OTFksIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEZvcm1hdCwgbHBUaW1lU3RyLCBjY2hPdXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuQF0KICoKICogU2VlIEdldFRpbWVGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXRUaW1lRm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsIGNvbnN0IFNZU1RFTVRJTUUqIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwRm9ybWF0LCBMUFdTVFIgbHBUaW1lU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl93KGxwRm9ybWF0KSwgbHBUaW1lU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0VyhsY2lkLCBkd0ZsYWdzfFRJTUVfVElNRVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwVGltZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRBCShLRVJORUwzMi5AKQogKgogKiBGb3JtYXQgYSBudW1iZXIgc3RyaW5nIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICAgIFtJXSBMT0NBTEVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBzelZhbHVlICAgW0ldIFN0cmluZyB0byBmb3JtYXQKICogIGxwRm9ybWF0ICAgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBOdW1iZXJTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgICBbSV0gU2l6ZSBvZiBscE51bWJlclN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIGxwc3pWYWx1ZSBjYW4gY29udGFpbiBvbmx5ICcwJyAtICc5JywgJy0nIGFuZCAnLicuCiAqICAtIElmIGxwRm9ybWF0IGlzIG5vbi1OVUxMLCBkd0ZsYWdzIG11c3QgYmUgMC4gSW4gdGhpcyBjYXNlIGxwc3pWYWx1ZSB3aWxsCiAqICAgIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkuCiAqICAtIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBudW1iZXIgc3RyaW5nIGlmIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZXhjZWVkcyB0aGUKICogICAgbG9jYWxlcyBub3JtYWwgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLgogKiAgLSBJZiBjY2hPdXQgaXMgMCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3cml0ZSB0byBscE51bWJlclN0ci4KICogIC0gVGhlIEFzY2lpIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBmYWlscyBpZiBsY2lkIGlzIFVuaWNvZGUgb25seS4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgd3JpdHRlbiB0byBscE51bWJlclN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IE5VTUJFUkZNVEEgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hPdXQpCnsKICBEV09SRCBjcCA9IENQX0FDUDsKICBXQ0hBUiBzekRlY1s4XSwgc3pHcnBbOF0sIHN6SW5bMTI4XSwgc3pPdXRbMTI4XTsKICBOVU1CRVJGTVRXIGZtdDsKICBjb25zdCBOVU1CRVJGTVRXICpwZm10ID0gTlVMTDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXMsJXAsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBkZWJ1Z3N0cl9hKGxwc3pWYWx1ZSksCiAgICAgICAgbHBGb3JtYXQsIGxwTnVtYmVyU3RyLCBjY2hPdXQpOwoKICBpZiAoTkxTX0lzVW5pY29kZU9ubHlMY2lkKGxjaWQpKQogIHsKR2V0TnVtYmVyRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI7CiAgICBjcCA9IG5vZGUtPmR3Q29kZVBhZ2U7CiAgfQoKICBpZiAobHBGb3JtYXQpCiAgewogICAgbWVtY3B5KCZmbXQsIGxwRm9ybWF0LCBzaXplb2YoZm10KSk7CiAgICBwZm10ID0gJmZtdDsKICAgIGlmIChscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwLCAtMSwgc3pEZWMsIHNpemVvZihzekRlYykvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scERlY2ltYWxTZXAgPSBzekRlYzsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAsIC0xLCBzekdycCwgc2l6ZW9mKHN6R3JwKS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwVGhvdXNhbmRTZXAgPSBzekdycDsKICAgIH0KICB9CgogIGlmIChscHN6VmFsdWUpCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscHN6VmFsdWUsIC0xLCBzekluLCBzaXplb2Yoc3pJbikvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBHZXROdW1iZXJGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwc3pWYWx1ZSA/IHN6SW4gOiBOVUxMLCBwZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxwTnVtYmVyU3RyID8gc3pPdXQgOiBOVUxMLCBjY2hPdXQpOwoKICBpZiAoc3pPdXRbMF0gJiYgbHBOdW1iZXJTdHIpCiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKGNwLCAwLCBzek91dCwgLTEsIGxwTnVtYmVyU3RyLCBjY2hPdXQsIDAsIDApOwogIHJldHVybiBpUmV0Owp9CgovKiBOdW1iZXIgcGFyc2luZyBzdGF0ZSBmbGFncyAqLwojZGVmaW5lIE5GX0lTTkVHQVRJVkUgMHgxICAvKiAnLScgZm91bmQgKi8KI2RlZmluZSBORl9JU1JFQUwgICAgIDB4MiAgLyogJy4nIGZvdW5kICovCiNkZWZpbmUgTkZfRElHSVRTICAgICAweDQgIC8qICcwJy0nOScgZm91bmQgKi8KI2RlZmluZSBORl9ESUdJVFNfT1VUIDB4OCAgLyogRGlnaXRzIGJlZm9yZSB0aGUgJy4nIGZvdW5kICovCiNkZWZpbmUgTkZfUk9VTkQgICAgICAweDEwIC8qIE51bWJlciBuZWVkcyB0byBiZSByb3VuZGVkICovCgovKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIE51bWJlcnMgKi8KI2RlZmluZSBOTFNfTkVHX1BBUkVOUyAgICAgIDAgLyogIigxLjEpIiAqLwojZGVmaW5lIE5MU19ORUdfTEVGVCAgICAgICAgMSAvKiAiLTEuMSIgICovCiNkZWZpbmUgTkxTX05FR19MRUZUX1NQQUNFICAyIC8qICItIDEuMSIgKi8KI2RlZmluZSBOTFNfTkVHX1JJR0hUICAgICAgIDMgLyogIjEuMS0iICAqLwojZGVmaW5lIE5MU19ORUdfUklHSFRfU1BBQ0UgNCAvKiAiMS4xIC0iICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdFcJKEtFUk5FTDMyLkApCiAqCiAqIFNlZSBHZXROdW1iZXJGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzelZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hPdXQpCnsKICBXQ0hBUiBzekJ1ZmZbMTI4XSwgKnN6T3V0ID0gc3pCdWZmICsgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpIC0gMTsKICBXQ0hBUiBzek5lZ0J1ZmZbOF07CiAgY29uc3QgV0NIQVIgKmxwc3pOZWcgPSBOVUxMLCAqbHBzek5lZ1N0YXJ0LCAqc3pTcmM7CiAgRFdPUkQgZHdTdGF0ZSA9IDAsIGR3RGVjaW1hbHMgPSAwLCBkd0dyb3VwQ291bnQgPSAwLCBkd0N1cnJlbnRHcm91cENvdW50ID0gMDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXMsJXAsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBkZWJ1Z3N0cl93KGxwc3pWYWx1ZSksCiAgICAgICAgbHBGb3JtYXQsIGxwTnVtYmVyU3RyLCBjY2hPdXQpOwoKICBpZiAoIWxwc3pWYWx1ZSB8fCBjY2hPdXQgPCAwIHx8IChjY2hPdXQgPiAwICYmICFscE51bWJlclN0cikgfHwKICAgICAgIUlzVmFsaWRMb2NhbGUobGNpZCwgMCkgfHwKICAgICAgKGxwRm9ybWF0ICYmIChkd0ZsYWdzIHx8ICFscEZvcm1hdC0+bHBEZWNpbWFsU2VwIHx8ICFscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkpKQogIHsKR2V0TnVtYmVyRm9ybWF0V19FcnJvcjoKICAgIFNldExhc3RFcnJvcihscEZvcm1hdCAmJiBkd0ZsYWdzID8gRVJST1JfSU5WQUxJRF9GTEFHUyA6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCFscEZvcm1hdCkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKCiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsKICAgIGxwRm9ybWF0ID0gJm5vZGUtPmZtdDsKICAgIGxwc3pOZWdTdGFydCA9IGxwc3pOZWcgPSBHZXROZWdhdGl2ZShub2RlKTsKICB9CiAgZWxzZQogIHsKICAgIEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTkVHQVRJVkVTSUdOfChkd0ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSwKICAgICAgICAgICAgICAgICAgIHN6TmVnQnVmZiwgc2l6ZW9mKHN6TmVnQnVmZikvc2l6ZW9mKFdDSEFSKSk7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gc3pOZWdCdWZmOwogIH0KICBscHN6TmVnID0gbHBzek5lZyArIHN0cmxlblcobHBzek5lZykgLSAxOwoKICBkd0ZsYWdzICY9IChMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKICAvKiBGb3JtYXQgdGhlIG51bWJlciBiYWNrd2FyZHMgaW50byBhIHRlbXBvcmFyeSBidWZmZXIgKi8KCiAgc3pTcmMgPSBscHN6VmFsdWU7CiAgKnN6T3V0LS0gPSAnXDAnOwoKICAvKiBDaGVjayB0aGUgbnVtYmVyIGZvciB2YWxpZGl0eSAqLwogIHdoaWxlICgqc3pTcmMpCiAgewogICAgaWYgKCpzelNyYyA+PSAnMCcgJiYgKnN6U3JjIDw9ICc5JykKICAgIHsKICAgICAgZHdTdGF0ZSB8PSBORl9ESUdJVFM7CiAgICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgICAgIGR3RGVjaW1hbHMrKzsKICAgIH0KICAgIGVsc2UgaWYgKCpzelNyYyA9PSAnLScpCiAgICB7CiAgICAgIGlmIChkd1N0YXRlKQogICAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogJy0nIG5vdCBmaXJzdCBjaGFyYWN0ZXIgKi8KICAgICAgZHdTdGF0ZSB8PSBORl9JU05FR0FUSVZFOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICcuJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRXX0Vycm9yOyAvKiBNb3JlIHRoYW4gb25lICcuJyAqLwogICAgICBkd1N0YXRlIHw9IE5GX0lTUkVBTDsKICAgIH0KICAgIGVsc2UKICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRXX0Vycm9yOyAvKiBJbnZhbGlkIGNoYXIgKi8KICAgIHN6U3JjKys7CiAgfQogIHN6U3JjLS07IC8qIFBvaW50IHRvIGxhc3QgY2hhcmFjdGVyICovCgogIGlmICghKGR3U3RhdGUgJiBORl9ESUdJVFMpKQogICAgZ290byBHZXROdW1iZXJGb3JtYXRXX0Vycm9yOyAvKiBObyBkaWdpdHMgKi8KCiAgLyogQWRkIGFueSB0cmFpbGluZyBuZWdhdGl2ZSBzaWduICovCiAgaWYgKGR3U3RhdGUgJiBORl9JU05FR0FUSVZFKQogIHsKICAgIHN3aXRjaCAobHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIpCiAgICB7CiAgICBjYXNlIE5MU19ORUdfUEFSRU5TOgogICAgICAqc3pPdXQtLSA9ICcpJzsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5MU19ORUdfUklHSFQ6CiAgICBjYXNlIE5MU19ORUdfUklHSFRfU1BBQ0U6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgaWYgKGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyID09IE5MU19ORUdfUklHSFRfU1BBQ0UpCiAgICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICAvKiBDb3B5IGFsbCBkaWdpdHMgdXAgdG8gdGhlIGRlY2ltYWwgcG9pbnQgKi8KICBpZiAoIWxwRm9ybWF0LT5OdW1EaWdpdHMpCiAgewogICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICB7CiAgICAgIHdoaWxlICgqc3pTcmMgIT0gJy4nKSAvKiBEb24ndCB3cml0ZSBhbnkgZGVjaW1hbHMgb3IgYSBzZXBhcmF0b3IgKi8KICAgICAgewogICAgICAgIGlmICgqc3pTcmMgPj0gJzUnIHx8ICgqc3pTcmMgPT0gJzQnICYmIChkd1N0YXRlICYgTkZfUk9VTkQpKSkKICAgICAgICAgIGR3U3RhdGUgfD0gTkZfUk9VTkQ7CiAgICAgICAgZWxzZQogICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgc3pTcmMtLTsKICAgICAgfQogICAgICBzelNyYy0tOwogICAgfQogIH0KICBlbHNlCiAgewogICAgTFBXU1RSIGxwc3pEZWMgPSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwICsgc3RybGVuVyhscEZvcm1hdC0+bHBEZWNpbWFsU2VwKSAtIDE7CgogICAgaWYgKGR3RGVjaW1hbHMgPD0gbHBGb3JtYXQtPk51bURpZ2l0cykKICAgIHsKICAgICAgZHdEZWNpbWFscyA9IGxwRm9ybWF0LT5OdW1EaWdpdHMgLSBkd0RlY2ltYWxzOwogICAgICB3aGlsZSAoZHdEZWNpbWFscy0tKQogICAgICAgICpzek91dC0tID0gJzAnOyAvKiBQYWQgdG8gY29ycmVjdCBudW1iZXIgb2YgZHAgKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZHdEZWNpbWFscyAtPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAvKiBTa2lwIGV4Y2VzcyBkZWNpbWFscywgYW5kIGRldGVybWluZSBpZiB3ZSBoYXZlIHRvIHJvdW5kIHRoZSBudW1iZXIgKi8KICAgICAgd2hpbGUgKGR3RGVjaW1hbHMtLSkKICAgICAgewogICAgICAgIGlmICgqc3pTcmMgPj0gJzUnIHx8ICgqc3pTcmMgPT0gJzQnICYmIChkd1N0YXRlICYgTkZfUk9VTkQpKSkKICAgICAgICAgIGR3U3RhdGUgfD0gTkZfUk9VTkQ7CiAgICAgICAgZWxzZQogICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgc3pTcmMtLTsKICAgICAgfQogICAgfQoKICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgewogICAgICB3aGlsZSAoKnN6U3JjICE9ICcuJykKICAgICAgewogICAgICAgIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgICAgICAgewogICAgICAgICAgaWYgKCpzelNyYyA9PSAnOScpCiAgICAgICAgICAgICpzek91dC0tID0gJzAnOyAvKiBjb250aW51ZSByb3VuZGluZyAqLwogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICAgICAgKnN6T3V0LS0gPSAoKnN6U3JjKSsxOwogICAgICAgICAgfQogICAgICAgICAgc3pTcmMtLTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgKnN6T3V0LS0gPSAqc3pTcmMtLTsgLyogV3JpdGUgZXhpc3RpbmcgZGVjaW1hbHMgKi8KICAgICAgfQogICAgICBzelNyYy0tOyAvKiBTa2lwICcuJyAqLwogICAgfQoKICAgIHdoaWxlIChscHN6RGVjID49IGxwRm9ybWF0LT5scERlY2ltYWxTZXApCiAgICAgICpzek91dC0tID0gKmxwc3pEZWMtLTsgLyogV3JpdGUgZGVjaW1hbCBzZXBhcmF0b3IgKi8KICB9CgogIGR3R3JvdXBDb3VudCA9IGxwRm9ybWF0LT5Hcm91cGluZyA9PSAzMiA/IDMgOiBscEZvcm1hdC0+R3JvdXBpbmc7CgogIC8qIFdyaXRlIHRoZSByZW1haW5pbmcgd2hvbGUgbnVtYmVyIGRpZ2l0cywgaW5jbHVkaW5nIGdyb3VwaW5nIGNoYXJzICovCiAgd2hpbGUgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiAqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgewogICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgIHsKICAgICAgaWYgKCpzelNyYyA9PSAnOScpCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgfQogICAgICBzelNyYy0tOwogICAgfQogICAgZWxzZQogICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOwoKICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTX09VVDsKICAgIGR3Q3VycmVudEdyb3VwQ291bnQrKzsKICAgIGlmIChzelNyYyA+PSBscHN6VmFsdWUgJiYgZHdDdXJyZW50R3JvdXBDb3VudCA9PSBkd0dyb3VwQ291bnQgJiYgKnN6U3JjICE9ICctJykKICAgIHsKICAgICAgTFBXU1RSIGxwc3pHcnAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApIC0gMTsKCiAgICAgIHdoaWxlIChscHN6R3JwID49IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKQogICAgICAgICpzek91dC0tID0gKmxwc3pHcnAtLTsgLyogV3JpdGUgZ3JvdXBpbmcgY2hhciAqLwoKICAgICAgZHdDdXJyZW50R3JvdXBDb3VudCA9IDA7CiAgICAgIGlmIChscEZvcm1hdC0+R3JvdXBpbmcgPT0gMzIpCiAgICAgICAgZHdHcm91cENvdW50ID0gMjsgLyogSW5kaWMgZ3JvdXBpbmc6IDMgdGhlbiAyICovCiAgICB9CiAgfQogIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgewogICAgKnN6T3V0LS0gPSAnMSc7IC8qIGUuZy4gLjYgPiAxLjAgKi8KICB9CiAgZWxzZSBpZiAoIShkd1N0YXRlICYgTkZfRElHSVRTX09VVCkgJiYgbHBGb3JtYXQtPkxlYWRpbmdaZXJvKQogICAgKnN6T3V0LS0gPSAnMCc7IC8qIEFkZCBsZWFkaW5nIDAgaWYgd2UgaGF2ZSBubyBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50ICovCgogIC8qIEFkZCBhbnkgbGVhZGluZyBuZWdhdGl2ZSBzaWduICovCiAgaWYgKGR3U3RhdGUgJiBORl9JU05FR0FUSVZFKQogIHsKICAgIHN3aXRjaCAobHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIpCiAgICB7CiAgICBjYXNlIE5MU19ORUdfUEFSRU5TOgogICAgICAqc3pPdXQtLSA9ICcoJzsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5MU19ORUdfTEVGVF9TUEFDRToKICAgICAgKnN6T3V0LS0gPSAnICc7CiAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwogICAgY2FzZSBOTFNfTkVHX0xFRlQ6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBzek91dCsrOwoKICBpUmV0ID0gc3RybGVuVyhzek91dCkgKyAxOwogIGlmIChjY2hPdXQpCiAgewogICAgaWYgKGlSZXQgPD0gY2NoT3V0KQogICAgICBtZW1jcHkobHBOdW1iZXJTdHIsIHN6T3V0LCBpUmV0ICogc2l6ZW9mKFdDSEFSKSk7CiAgICBlbHNlCiAgICB7CiAgICAgIG1lbWNweShscE51bWJlclN0ciwgc3pPdXQsIGNjaE91dCAqIHNpemVvZihXQ0hBUikpOwogICAgICBscE51bWJlclN0cltjY2hPdXQgLSAxXSA9ICdcMCc7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgaVJldCA9IDA7CiAgICB9CiAgfQogIHJldHVybiBpUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0QQkoS0VSTkVMMzIuQCkKICoKICogRm9ybWF0IGEgY3VycmVuY3kgc3RyaW5nIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgICAgIFtJXSBMb2NhbGUgdG8gZm9ybWF0IGZvcgogKiAgZHdGbGFncyAgICAgICBbSV0gTE9DQUxFXyBmbGFncyBmcm9tICJ3aW5ubHMuaCIKICogIGxwc3pWYWx1ZSAgICAgW0ldIFN0cmluZyB0byBmb3JtYXQKICogIGxwRm9ybWF0ICAgICAgW0ldIEZvcm1hdHRpbmcgb3ZlcnJpZGVzCiAqICBscEN1cnJlbmN5U3RyIFtPXSBEZXN0aW5hdGlvbiBmb3IgZm9ybWF0dGVkIHN0cmluZwogKiAgY2NoT3V0ICAgICAgICBbSV0gU2l6ZSBvZiBscEN1cnJlbmN5U3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gbHBzelZhbHVlIGNhbiBjb250YWluIG9ubHkgJzAnIC0gJzknLCAnLScgYW5kICcuJy4KICogIC0gSWYgbHBGb3JtYXQgaXMgbm9uLU5VTEwsIGR3RmxhZ3MgbXVzdCBiZSAwLiBJbiB0aGlzIGNhc2UgbHBzelZhbHVlIHdpbGwKICogICAgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKS4KICogIC0gVGhpcyBmdW5jdGlvbiByb3VuZHMgdGhlIGN1cnJlbmN5IGlmIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZXhjZWVkcyB0aGUKICogICAgbG9jYWxlcyBudW1iZXIgb2YgY3VycmVuY3kgZGVjaW1hbCBwbGFjZXMuCiAqICAtIElmIGNjaE91dCBpcyAwLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdyaXRlIHRvIGxwQ3VycmVuY3lTdHIuCiAqICAtIFRoZSBBc2NpaSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgbGNpZCBpcyBVbmljb2RlIG9ubHkuCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gbHBOdW1iZXJTdHIsIG9yIHRoYXQgd291bGQKICogICAgICAgICAgIGhhdmUgYmVlbiB3cml0dGVuLCBpZiBjY2hPdXQgaXMgMC4KICogIEZhaWx1cmU6IDAuIFVzZSBHZXRMYXN0RXJyb3IoKSB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLgogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzelZhbHVlLCAgY29uc3QgQ1VSUkVOQ1lGTVRBICpscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaE91dCkKewogIERXT1JEIGNwID0gQ1BfQUNQOwogIFdDSEFSIHN6RGVjWzhdLCBzekdycFs4XSwgc3pDeVs4XSwgc3pJblsxMjhdLCBzek91dFsxMjhdOwogIENVUlJFTkNZRk1UVyBmbXQ7CiAgY29uc3QgQ1VSUkVOQ1lGTVRXICpwZm10ID0gTlVMTDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXMsJXAsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBkZWJ1Z3N0cl9hKGxwc3pWYWx1ZSksCiAgICAgICAgbHBGb3JtYXQsIGxwQ3VycmVuY3lTdHIsIGNjaE91dCk7CgogIGlmIChOTFNfSXNVbmljb2RlT25seUxjaWQobGNpZCkpCiAgewpHZXRDdXJyZW5jeUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghKGR3RmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCkpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI7CiAgICBjcCA9IG5vZGUtPmR3Q29kZVBhZ2U7CiAgfQoKICBpZiAobHBGb3JtYXQpCiAgewogICAgbWVtY3B5KCZmbXQsIGxwRm9ybWF0LCBzaXplb2YoZm10KSk7CiAgICBwZm10ID0gJmZtdDsKICAgIGlmIChscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwLCAtMSwgc3pEZWMsIHNpemVvZihzekRlYykvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scERlY2ltYWxTZXAgPSBzekRlYzsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAsIC0xLCBzekdycCwgc2l6ZW9mKHN6R3JwKS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwVGhvdXNhbmRTZXAgPSBzekdycDsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wsIC0xLCBzekN5LCBzaXplb2Yoc3pDeSkvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scEN1cnJlbmN5U3ltYm9sID0gc3pDeTsKICAgIH0KICB9CgogIGlmIChscHN6VmFsdWUpCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscHN6VmFsdWUsIC0xLCBzekluLCBzaXplb2Yoc3pJbikvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBHZXRDdXJyZW5jeUZvcm1hdFcobGNpZCwgZHdGbGFncywgbHBzelZhbHVlID8gc3pJbiA6IE5VTEwsIHBmbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEN1cnJlbmN5U3RyID8gc3pPdXQgOiBOVUxMLCBjY2hPdXQpOwoKICBpZiAoc3pPdXRbMF0gJiYgbHBDdXJyZW5jeVN0cikKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIDAsIHN6T3V0LCAtMSwgbHBDdXJyZW5jeVN0ciwgY2NoT3V0LCAwLCAwKTsKICByZXR1cm4gaVJldDsKfQoKLyogRm9ybWF0dGluZyBzdGF0ZXMgZm9yIEN1cnJlbmNpZXMuIFdlIHVzZSBmbGFncyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLiAqLwojZGVmaW5lIENGX1BBUkVOUyAgICAgICAweDEgIC8qIFBhcmVudGhlc2VzICAgICAgKi8KI2RlZmluZSBDRl9NSU5VU19MRUZUICAgMHgyICAvKiAnLScgdG8gdGhlIGxlZnQgICovCiNkZWZpbmUgQ0ZfTUlOVVNfUklHSFQgIDB4NCAgLyogJy0nIHRvIHRoZSByaWdodCAqLwojZGVmaW5lIENGX01JTlVTX0JFRk9SRSAweDggIC8qICctJyBiZWZvcmUgJyQnICAgKi8KI2RlZmluZSBDRl9DWV9MRUZUICAgICAgMHgxMCAvKiAnJCcgdG8gdGhlIGxlZnQgICovCiNkZWZpbmUgQ0ZfQ1lfUklHSFQgICAgIDB4MjAgLyogJyQnIHRvIHRoZSByaWdodCAqLwojZGVmaW5lIENGX0NZX1NQQUNFICAgICAweDQwIC8qICcgJyBieSAnJCcgICAgICAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRXCShLRVJORUwzMi5AKQogKgogKiBTZWUgR2V0Q3VycmVuY3lGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IENVUlJFTkNZRk1UVyAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoT3V0KQp7CiAgc3RhdGljIGNvbnN0IEJZVEUgTkxTX05lZ0N5Rm9ybWF0c1sxNl0gPQogIHsKICAgIENGX1BBUkVOU3xDRl9DWV9MRUZULCAgICAgICAgICAgICAgICAgICAgICAgLyogKCQxLjEpICovCiAgICBDRl9NSU5VU19MRUZUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9MRUZULCAgIC8qIC0kMS4xICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZULCAgICAgICAgICAgICAgICAgICAvKiAkLTEuMSAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX0xFRlQsICAgICAgICAgICAgICAgICAgLyogJDEuMS0gICovCiAgICBDRl9QQVJFTlN8Q0ZfQ1lfUklHSFQsICAgICAgICAgICAgICAgICAgICAgIC8qICgxLjEkKSAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9SSUdIVCwgICAgICAgICAgICAgICAgICAvKiAtMS4xJCAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9SSUdIVCwgLyogMS4xLSQgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVCwgICAgICAgICAgICAgICAgIC8qIDEuMSQtICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgICAgICAvKiAtMS4xICQgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgLyogLSQgMS4xICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgICAgIC8qIDEuMSAkLSAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgICAgLyogJCAxLjEtICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgICAgICAvKiAkIC0xLjEgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsIC8qIDEuMS0gJCAqLwogICAgQ0ZfUEFSRU5TfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgICAgICAgICAvKiAoJCAxLjEpICovCiAgICBDRl9QQVJFTlN8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsICAgICAgICAgIC8qICgxLjEgJCkgKi8KICB9OwogIHN0YXRpYyBjb25zdCBCWVRFIE5MU19Qb3NDeUZvcm1hdHNbNF0gPQogIHsKICAgIENGX0NZX0xFRlQsICAgICAgICAgICAgICAvKiAkMS4xICAqLwogICAgQ0ZfQ1lfUklHSFQsICAgICAgICAgICAgIC8qIDEuMSQgICovCiAgICBDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgLyogJCAxLjEgKi8KICAgIENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAvKiAxLjEgJCAqLwogIH07CiAgV0NIQVIgc3pCdWZmWzEyOF0sICpzek91dCA9IHN6QnVmZiArIHNpemVvZihzekJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSAtIDE7CiAgV0NIQVIgc3pOZWdCdWZmWzhdOwogIGNvbnN0IFdDSEFSICpscHN6TmVnID0gTlVMTCwgKmxwc3pOZWdTdGFydCwgKnN6U3JjLCAqbHBzekN5LCAqbHBzekN5U3RhcnQ7CiAgRFdPUkQgZHdTdGF0ZSA9IDAsIGR3RGVjaW1hbHMgPSAwLCBkd0dyb3VwQ291bnQgPSAwLCBkd0N1cnJlbnRHcm91cENvdW50ID0gMCwgZHdGbXQ7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfdyhscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscEN1cnJlbmN5U3RyLCBjY2hPdXQpOwoKICBpZiAoIWxwc3pWYWx1ZSB8fCBjY2hPdXQgPCAwIHx8IChjY2hPdXQgPiAwICYmICFscEN1cnJlbmN5U3RyKSB8fAogICAgICAhSXNWYWxpZExvY2FsZShsY2lkLCAwKSB8fAogICAgICAobHBGb3JtYXQgJiYgKGR3RmxhZ3MgfHwgIWxwRm9ybWF0LT5scERlY2ltYWxTZXAgfHwgIWxwRm9ybWF0LT5scFRob3VzYW5kU2VwIHx8CiAgICAgICFscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCB8fCBscEZvcm1hdC0+TmVnYXRpdmVPcmRlciA+IDE1IHx8CiAgICAgIGxwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyID4gMykpKQogIHsKR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOgogICAgU2V0TGFzdEVycm9yKGxwRm9ybWF0ICYmIGR3RmxhZ3MgPyBFUlJPUl9JTlZBTElEX0ZMQUdTIDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZiAoIWxwRm9ybWF0KQogIHsKICAgIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZSA9IE5MU19HZXRGb3JtYXRzKGxjaWQsIGR3RmxhZ3MpOwoKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7CiAgICBscEZvcm1hdCA9ICZub2RlLT5jeWZtdDsKICAgIGxwc3pOZWdTdGFydCA9IGxwc3pOZWcgPSBHZXROZWdhdGl2ZShub2RlKTsKICB9CiAgZWxzZQogIHsKICAgIEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTkVHQVRJVkVTSUdOfChkd0ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSwKICAgICAgICAgICAgICAgICAgIHN6TmVnQnVmZiwgc2l6ZW9mKHN6TmVnQnVmZikvc2l6ZW9mKFdDSEFSKSk7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gc3pOZWdCdWZmOwogIH0KICBkd0ZsYWdzICY9IChMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKICBscHN6TmVnID0gbHBzek5lZyArIHN0cmxlblcobHBzek5lZykgLSAxOwogIGxwc3pDeVN0YXJ0ID0gbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2w7CiAgbHBzekN5ID0gbHBzekN5U3RhcnQgKyBzdHJsZW5XKGxwc3pDeVN0YXJ0KSAtIDE7CgogIC8qIEZvcm1hdCB0aGUgY3VycmVuY3kgYmFja3dhcmRzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCgogIHN6U3JjID0gbHBzelZhbHVlOwogICpzek91dC0tID0gJ1wwJzsKCiAgLyogQ2hlY2sgdGhlIG51bWJlciBmb3IgdmFsaWRpdHkgKi8KICB3aGlsZSAoKnN6U3JjKQogIHsKICAgIGlmICgqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgICB7CiAgICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTOwogICAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgICAgICBkd0RlY2ltYWxzKys7CiAgICB9CiAgICBlbHNlIGlmICgqc3pTcmMgPT0gJy0nKQogICAgewogICAgICBpZiAoZHdTdGF0ZSkKICAgICAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogJy0nIG5vdCBmaXJzdCBjaGFyYWN0ZXIgKi8KICAgICAgZHdTdGF0ZSB8PSBORl9JU05FR0FUSVZFOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICcuJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qIE1vcmUgdGhhbiBvbmUgJy4nICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNSRUFMOwogICAgfQogICAgZWxzZQogICAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogSW52YWxpZCBjaGFyICovCiAgICBzelNyYysrOwogIH0KICBzelNyYy0tOyAvKiBQb2ludCB0byBsYXN0IGNoYXJhY3RlciAqLwoKICBpZiAoIShkd1N0YXRlICYgTkZfRElHSVRTKSkKICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOyAvKiBObyBkaWdpdHMgKi8KCiAgaWYgKGR3U3RhdGUgJiBORl9JU05FR0FUSVZFKQogICAgZHdGbXQgPSBOTFNfTmVnQ3lGb3JtYXRzW2xwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyXTsKICBlbHNlCiAgICBkd0ZtdCA9IE5MU19Qb3NDeUZvcm1hdHNbbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXJdOwoKICAvKiBBZGQgYW55IHRyYWlsaW5nIG5lZ2F0aXZlIG9yIGN1cnJlbmN5IHNpZ25zICovCiAgaWYgKGR3Rm10ICYgQ0ZfUEFSRU5TKQogICAgKnN6T3V0LS0gPSAnKSc7CgogIHdoaWxlIChkd0ZtdCAmIChDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVCkpCiAgewogICAgc3dpdGNoIChkd0ZtdCAmIChDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFQpKQogICAgewogICAgY2FzZSBDRl9NSU5VU19SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFQ6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgIGR3Rm10ICY9IH5DRl9NSU5VU19SSUdIVDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBDRl9DWV9SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUOgogICAgY2FzZSBDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFQ6CiAgICAgIHdoaWxlIChscHN6Q3kgPj0gbHBzekN5U3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzekN5LS07CiAgICAgIGlmIChkd0ZtdCAmIENGX0NZX1NQQUNFKQogICAgICAgICpzek91dC0tID0gJyAnOwogICAgICBkd0ZtdCAmPSB+KENGX0NZX1JJR0hUfENGX01JTlVTX0JFRk9SRSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgLyogQ29weSBhbGwgZGlnaXRzIHVwIHRvIHRoZSBkZWNpbWFsIHBvaW50ICovCiAgaWYgKCFscEZvcm1hdC0+TnVtRGlnaXRzKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgewogICAgICB3aGlsZSAoKnN6U3JjICE9ICcuJykgLyogRG9uJ3Qgd3JpdGUgYW55IGRlY2ltYWxzIG9yIGEgc2VwYXJhdG9yICovCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIExQV1NUUiBscHN6RGVjID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkgLSAxOwoKICAgIGlmIChkd0RlY2ltYWxzIDw9IGxwRm9ybWF0LT5OdW1EaWdpdHMpCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgPSBscEZvcm1hdC0+TnVtRGlnaXRzIC0gZHdEZWNpbWFsczsKICAgICAgd2hpbGUgKGR3RGVjaW1hbHMtLSkKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogUGFkIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGRwICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgLT0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgLyogU2tpcCBleGNlc3MgZGVjaW1hbHMsIGFuZCBkZXRlcm1pbmUgaWYgd2UgaGF2ZSB0byByb3VuZCB0aGUgbnVtYmVyICovCiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpCiAgICAgIHsKICAgICAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgICAgIHsKICAgICAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgICAgIH0KICAgICAgICAgIHN6U3JjLS07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICpzek91dC0tID0gKnN6U3JjLS07IC8qIFdyaXRlIGV4aXN0aW5nIGRlY2ltYWxzICovCiAgICAgIH0KICAgICAgc3pTcmMtLTsgLyogU2tpcCAnLicgKi8KICAgIH0KICAgIHdoaWxlIChscHN6RGVjID49IGxwRm9ybWF0LT5scERlY2ltYWxTZXApCiAgICAgICpzek91dC0tID0gKmxwc3pEZWMtLTsgLyogV3JpdGUgZGVjaW1hbCBzZXBhcmF0b3IgKi8KICB9CgogIGR3R3JvdXBDb3VudCA9IGxwRm9ybWF0LT5Hcm91cGluZzsKCiAgLyogV3JpdGUgdGhlIHJlbWFpbmluZyB3aG9sZSBudW1iZXIgZGlnaXRzLCBpbmNsdWRpbmcgZ3JvdXBpbmcgY2hhcnMgKi8KICB3aGlsZSAoc3pTcmMgPj0gbHBzelZhbHVlICYmICpzelNyYyA+PSAnMCcgJiYgKnN6U3JjIDw9ICc5JykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgewogICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgKnN6T3V0LS0gPSAoKnN6U3JjKSsxOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgICBlbHNlCiAgICAgICpzek91dC0tID0gKnN6U3JjLS07CgogICAgZHdTdGF0ZSB8PSBORl9ESUdJVFNfT1VUOwogICAgZHdDdXJyZW50R3JvdXBDb3VudCsrOwogICAgaWYgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiBkd0N1cnJlbnRHcm91cENvdW50ID09IGR3R3JvdXBDb3VudCkKICAgIHsKICAgICAgTFBXU1RSIGxwc3pHcnAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApIC0gMTsKCiAgICAgIHdoaWxlIChscHN6R3JwID49IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKQogICAgICAgICpzek91dC0tID0gKmxwc3pHcnAtLTsgLyogV3JpdGUgZ3JvdXBpbmcgY2hhciAqLwoKICAgICAgZHdDdXJyZW50R3JvdXBDb3VudCA9IDA7CiAgICB9CiAgfQogIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgICAqc3pPdXQtLSA9ICcxJzsgLyogZS5nLiAuNiA+IDEuMCAqLwogIGVsc2UgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUU19PVVQpICYmIGxwRm9ybWF0LT5MZWFkaW5nWmVybykKICAgICpzek91dC0tID0gJzAnOyAvKiBBZGQgbGVhZGluZyAwIGlmIHdlIGhhdmUgbm8gZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCAqLwoKICAvKiBBZGQgYW55IGxlYWRpbmcgbmVnYXRpdmUgb3IgY3VycmVuY3kgc2lnbiAqLwogIHdoaWxlIChkd0ZtdCAmIChDRl9NSU5VU19MRUZUfENGX0NZX0xFRlQpKQogIHsKICAgIHN3aXRjaCAoZHdGbXQgJiAoQ0ZfTUlOVVNfTEVGVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfTEVGVCkpCiAgICB7CiAgICBjYXNlIENGX01JTlVTX0xFRlQ6CiAgICBjYXNlIENGX01JTlVTX0xFRlR8Q0ZfQ1lfTEVGVDoKICAgICAgd2hpbGUgKGxwc3pOZWcgPj0gbHBzek5lZ1N0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pOZWctLTsKICAgICAgZHdGbXQgJj0gfkNGX01JTlVTX0xFRlQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ0ZfQ1lfTEVGVDoKICAgIGNhc2UgQ0ZfQ1lfTEVGVHxDRl9NSU5VU19CRUZPUkU6CiAgICBjYXNlIENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlQ6CiAgICAgIGlmIChkd0ZtdCAmIENGX0NZX1NQQUNFKQogICAgICAgICpzek91dC0tID0gJyAnOwogICAgICB3aGlsZSAobHBzekN5ID49IGxwc3pDeVN0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pDeS0tOwogICAgICBkd0ZtdCAmPSB+KENGX0NZX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChkd0ZtdCAmIENGX1BBUkVOUykKICAgICpzek91dC0tID0gJygnOwogIHN6T3V0Kys7CgogIGlSZXQgPSBzdHJsZW5XKHN6T3V0KSArIDE7CiAgaWYgKGNjaE91dCkKICB7CiAgICBpZiAoaVJldCA8PSBjY2hPdXQpCiAgICAgIG1lbWNweShscEN1cnJlbmN5U3RyLCBzek91dCwgaVJldCAqIHNpemVvZihXQ0hBUikpOwogICAgZWxzZQogICAgewogICAgICBtZW1jcHkobHBDdXJyZW5jeVN0ciwgc3pPdXQsIGNjaE91dCAqIHNpemVvZihXQ0hBUikpOwogICAgICBscEN1cnJlbmN5U3RyW2NjaE91dCAtIDFdID0gJ1wwJzsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBpUmV0ID0gMDsKICAgIH0KICB9CiAgcmV0dXJuIGlSZXQ7Cn0KCi8qIEZJWE1FOiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgbmVlZHMgdG8gbW92ZSBzb21ld2hlcmUgZWxzZSBhbG9uZyB3aXRoIHRoZQogKiAgICAgICAgb3RoZXIgRW51bVhYWCBmdW5jdGlvbnMsIHdoZW4gYSBtZXRob2QgZm9yIHN0b3JpbmcgcmVzb3VyY2VzIGZvcgogKiAgICAgICAgYWx0ZXJuYXRlIGNhbGVuZGFycyBpcyBkZXRlcm1pbmVkLgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzRXhBICAgIChLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNFeEEoREFURUZNVF9FTlVNUFJPQ0VYQSBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBDQUxJRCBjYWxfaWQ7CiAgICBjaGFyIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAoIUdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFfExPQ0FMRV9SRVRVUk5fTlVNQkVSLCAoTFBXU1RSKSZjYWxfaWQsIHNpemVvZihjYWxfaWQpL3NpemVvZihXQ0hBUikpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NTSE9SVERBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0V4VyAgICAoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0V4VyhEQVRFRk1UX0VOVU1QUk9DRVhXIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIENBTElEIGNhbF9pZDsKICAgIFdDSEFSIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAoIUdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFfExPQ0FMRV9SRVRVUk5fTlVNQkVSLCAoTFBXU1RSKSZjYWxfaWQsIHNpemVvZihjYWxfaWQpL3NpemVvZihXQ0hBUikpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NTSE9SVERBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqCiAqIEZJWE1FOiBNU0ROIG1lbnRpb25zIG9ubHkgTE9DQUxFX1VTRV9DUF9BQ1AsIHNob3VsZCB3ZSBoYW5kbGUKICogTE9DQUxFX05PVVNFUk9WRVJSSURFIGhlcmUgYXMgd2VsbD8KICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0EoREFURUZNVF9FTlVNUFJPQ0EgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgY2hhciBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TTE9OR0RBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVyhEQVRFRk1UX0VOVU1QUk9DVyBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBXQ0hBUiBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTE9OR0RBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNBCShLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKFRJTUVGTVRfRU5VTVBST0NBIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIGNoYXIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TVElNRUZPUk1BVCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coVElNRUZNVF9FTlVNUFJPQ1cgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgV0NIQVIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TVElNRUZPUk1BVCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0VudW1DYWxlbmRhckluZm9BVyA8aW50ZXJuYWw+CiAqIEVudW1lcmF0ZXMgY2FsZW5kYXIgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWVkIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICAgIGNhbGluZm9wcm9jIFtJXSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjawogKiAgICBsb2NhbGUgICAgICBbSV0gVGhlIGxvY2FsZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgY2FsZW5kYXIgaW5mb3JtYXRpb24uCiAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIGJ5IHRoZQogKiAgICAgICAgICAgICAgICAgICAgTUFLRUxDSUQgbWFjcm8sIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBkZWZhdWx0IHN5c3RlbSBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxFX1VTRVJfREVGQVVMVAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGRlZmF1bHQgdXNlciBsb2NhbGUuCiAqICAgIGNhbGVuZGFyICAgIFtJXSBUaGUgY2FsZW5kYXIgZm9yIHdoaWNoIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCwgb3IKICogICAgICAgICAgICAgICAgICAgIEVOVU1fQUxMX0NBTEVOREFSUy4KICogICAgY2FsdHlwZSAgICAgW0ldIFRoZSB0eXBlIG9mIGNhbGVuZGFyIGluZm9ybWF0aW9uIHRvIGJlIHJldHVybmVkLiBOb3RlCiAqICAgICAgICAgICAgICAgICAgICB0aGF0IG9ubHkgb25lIENBTFRZUEUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBwZXIgY2FsbAogKiAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbiwgZXhjZXB0IHdoZXJlIG5vdGVkLgogKiAgICB1bmljb2RlICAgICBbSV0gU3BlY2lmaWVzIGlmIHRoZSBjYWxsYmFjayBleHBlY3RzIGEgdW5pY29kZSBzdHJpbmcuCiAqICAgIGV4ICAgICAgICAgIFtJXSBTcGVjaWZpZXMgaWYgdGhlIGNhbGxiYWNrIG5lZWRzIHRoZSBjYWxlbmRhciBpZGVudGlmaWVyLgogKgogKiBSRVRVUk5TCiAqICAgIFN1Y2Nlc3M6IFRSVUUuCiAqICAgIEZhaWx1cmU6IEZBTFNFLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICoKICogTk9URVMKICogICAgV2hlbiB0aGUgQU5TSSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIGEgVW5pY29kZS1vbmx5IExDSUQsCiAqICAgIHRoZSBjYWxsIGNhbiBzdWNjZWVkIGJlY2F1c2UgdGhlIHN5c3RlbSB1c2VzIHRoZSBzeXN0ZW0gY29kZSBwYWdlLgogKiAgICBIb3dldmVyLCBjaGFyYWN0ZXJzIHRoYXQgYXJlIHVuZGVmaW5lZCBpbiB0aGUgc3lzdGVtIGNvZGUgcGFnZSBhcHBlYXIKICogICAgaW4gdGhlIHN0cmluZyBhcyBhIHF1ZXN0aW9uIG1hcmsgKD8pLgogKgogKiBUT0RPCiAqICAgIFRoZSBhYm92ZSBub3RlIHNob3VsZCBiZSByZXNwZWN0ZWQgYnkgR2V0Q2FsZW5kYXJJbmZvQS4KICovCnN0YXRpYyBCT09MIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcodm9pZCAqY2FsaW5mb3Byb2MsIExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhciwgQ0FMVFlQRSBjYWx0eXBlLCBCT09MIHVuaWNvZGUsIEJPT0wgZXggKQp7CiAgV0NIQVIgKmJ1ZiwgKm9wdCA9IE5VTEwsICppdGVyID0gTlVMTDsKICBCT09MIHJldCA9IEZBTFNFOwogIGludCBidWZTeiA9IDIwMDsJCS8qIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KCiAgaWYgKGNhbGluZm9wcm9jID09IE5VTEwpCiAgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGJ1ZiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZTeik7CiAgaWYgKGJ1ZiA9PSBOVUxMKQogIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoY2FsZW5kYXIgPT0gRU5VTV9BTExfQ0FMRU5EQVJTKQogIHsKICAgIGludCBvcHRTeiA9IEdldExvY2FsZUluZm9XKGxvY2FsZSwgTE9DQUxFX0lPUFRJT05BTENBTEVOREFSLCBOVUxMLCAwKTsKICAgIGlmIChvcHRTeiA+IDEpCiAgICB7CiAgICAgIG9wdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBvcHRTeiAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAob3B0ID09IE5VTEwpCiAgICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgIGdvdG8gTkxTX0VudW1DYWxlbmRhckluZm9BV19DbGVhbnVwOwogICAgICB9CiAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsb2NhbGUsIExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgb3B0LCBvcHRTeikpCiAgICAgICAgaXRlciA9IG9wdDsKICAgIH0KICAgIGNhbGVuZGFyID0gTkxTX0dldExvY2FsZU51bWJlcihsb2NhbGUsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFKTsKICB9CgogIHdoaWxlIChUUlVFKQkJCS8qIGxvb3AgdGhyb3VnaCBjYWxlbmRhcnMgKi8KICB7CiAgICBkbwkJCQkvKiBsb29wIHVudGlsIHRoZXJlJ3Mgbm8gZXJyb3IgKi8KICAgIHsKICAgICAgaWYgKHVuaWNvZGUpCiAgICAgICAgcmV0ID0gR2V0Q2FsZW5kYXJJbmZvVyhsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBidWYsIGJ1ZlN6IC8gc2l6ZW9mKFdDSEFSKSwgTlVMTCk7CiAgICAgIGVsc2UgcmV0ID0gR2V0Q2FsZW5kYXJJbmZvQShsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCAoQ0hBUiopYnVmLCBidWZTeiAvIHNpemVvZihDSEFSKSwgTlVMTCk7CgogICAgICBpZiAoIXJldCkKICAgICAgewogICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQogICAgICAgIHsJCQkJLyogc28gcmVzaXplIGl0ICovCiAgICAgICAgICBpbnQgbmV3U3o7CiAgICAgICAgICBpZiAodW5pY29kZSkKICAgICAgICAgICAgbmV3U3ogPSBHZXRDYWxlbmRhckluZm9XKGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIE5VTEwsIDAsIE5VTEwpICogc2l6ZW9mKFdDSEFSKTsKICAgICAgICAgIGVsc2UgbmV3U3ogPSBHZXRDYWxlbmRhckluZm9BKGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIE5VTEwsIDAsIE5VTEwpICogc2l6ZW9mKENIQVIpOwogICAgICAgICAgaWYgKGJ1ZlN6ID49IG5ld1N6KQogICAgICAgICAgewogICAgICAgICAgICBFUlIoIkJ1ZmZlciByZXNpemluZyBkaXNvcmRlcjogd2FzICVkLCByZXF1ZXN0ZWQgJWQuXG4iLCBidWZTeiwgbmV3U3opOwogICAgICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgICAgIH0KICAgICAgICAgIGJ1ZlN6ID0gbmV3U3o7CiAgICAgICAgICBXQVJOKCJCdWZmZXIgdG9vIHNtYWxsOyByZXNpemluZyB0byAlZCBieXRlcy5cbiIsIGJ1ZlN6KTsKICAgICAgICAgIGJ1ZiA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiwgYnVmU3opOwogICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgICB9IGVsc2UgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgIH0KICAgIH0gd2hpbGUgKCFyZXQpOwoKICAgIC8qIEhlcmUgd2UgYXJlLiBXZSBwYXNzIHRoZSBidWZmZXIgdG8gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZgogICAgICogdGhlIGNhbGxiYWNrLiBCZWNhdXNlIGl0J3Mgbm90IHRoZSBzYW1lIG51bWJlciBvZiBwYXJhbXMsCiAgICAgKiB3ZSBtdXN0IGNoZWNrIGZvciBFeCwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgVW5pY29kZQogICAgICogYmVjYXVzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LgogICAgICovCiAgICBpZiAoZXgpIHsKICAgICAgcmV0ID0gKChDQUxJTkZPX0VOVU1QUk9DRVhXKWNhbGluZm9wcm9jKShidWYsIGNhbGVuZGFyKTsKICAgIH0gZWxzZQogICAgICByZXQgPSAoKENBTElORk9fRU5VTVBST0NXKWNhbGluZm9wcm9jKShidWYpOwoKICAgIGlmICghcmV0KSB7CQkJLyogdGhlIGNhbGxiYWNrIHRvbGQgdG8gc3RvcCAqLwogICAgICByZXQgPSBUUlVFOwogICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoKGl0ZXIgPT0gTlVMTCkgfHwgKCppdGVyID09IDApKQkvKiBubyBtb3JlIGNhbGVuZGFycyAqLwogICAgICBicmVhazsKCiAgICBjYWxlbmRhciA9IDA7CiAgICB3aGlsZSAoKCppdGVyID49ICcwJykgJiYgKCppdGVyIDw9ICc5JykpCiAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIgKiAxMCArICppdGVyKysgLSAnMCc7CgogICAgaWYgKCppdGVyKysgIT0gMCkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRERCKTsKICAgICAgcmV0ID0gRkFMU0U7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCk5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDoKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvcHQpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSggQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOGx4LDB4JTA4bHgsMHglMDhseClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgRkFMU0UsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb1cJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvVyggQ0FMSU5GT19FTlVNUFJPQ1cgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOGx4LDB4JTA4bHgsMHglMDhseClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgVFJVRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtQ2FsZW5kYXJJbmZvRXhBCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0V4QSggQ0FMSU5GT19FTlVNUFJPQ0VYQSBjYWxpbmZvcHJvYyxMQ0lEIGxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIEZBTFNFLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0V4VwlbS0VSTkVMMzIuQF0KICoKICogU2VlIEVudW1DYWxlbmRhckluZm9BVy4KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9FeFcoIENBTElORk9fRU5VTVBST0NFWFcgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZSApCnsKICBUUkFDRSgiKCVwLDB4JTA4bHgsMHglMDhseCwweCUwOGx4KVxuIiwgY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUpOwogIHJldHVybiBOTFNfRW51bUNhbGVuZGFySW5mb0FXKGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBUUlVFLCBUUlVFKTsKfQo=