LyoKICogTG9jYWxlLWRlcGVuZGVudCBmb3JtYXQgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggRGF2aWQgTGVlIExhbWJlcnQKICogQ29weXJpZ2h0IDIwMDAgSnVsaW8gQ+lzYXIgR+F6cXVlegogKiBDb3B5cmlnaHQgMjAwMyBKb24gR3JpZmZpdGhzCiAqIENvcHlyaWdodCAyMDA1IERtaXRyeSBUaW1vc2hrb3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJrZXJuZWxfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobmxzKTsKCiNkZWZpbmUgREFURV9EQVRFVkFSU09OTFkgMHgwMTAwICAvKiBvbmx5IGRhdGUgc3R1ZmY6IHlNZGcgKi8KI2RlZmluZSBUSU1FX1RJTUVWQVJTT05MWSAweDAyMDAgIC8qIG9ubHkgdGltZSBzdHVmZjogaEhtc3QgKi8KCi8qIFNpbmNlIGNhbGN1bGF0aW5nIHRoZSBmb3JtYXR0aW5nIGRhdGEgZm9yIGVhY2ggbG9jYWxlIGlzIHRpbWUtY29uc3VtaW5nLAogKiB3ZSBnZXQgdGhlIGZvcm1hdCBkYXRhIGZvciBlYWNoIGxvY2FsZSBvbmx5IG9uY2UgYW5kIGNhY2hlIGl0IGluIG1lbW9yeS4KICogV2UgY2FjaGUgYm90aCB0aGUgc3lzdGVtIGRlZmF1bHQgYW5kIHVzZXIgb3ZlcnJpZGRlbiBkYXRhLCBhZnRlciBjb252ZXJ0aW5nCiAqIHRoZW0gaW50byB0aGUgZm9ybWF0cyB0aGF0IHRoZSBmdW5jdGlvbnMgaGVyZSBleHBlY3QuIFNpbmNlIHRoZXNlIGZ1bmN0aW9ucwogKiB3aWxsIHR5cGljYWxseSBiZSBjYWxsZWQgd2l0aCBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHRoZSB0b3RhbCBsb2NhbGVzCiAqIGluc3RhbGxlZCwgdGhlIG1lbW9yeSBvdmVyaGVhZCBpcyBtaW5pbWFsIHdoaWxlIHRoZSBzcGVlZHVwIGlzIHNpZ25pZmljYW50LgogKgogKiBPdXIgY2FjaGUgdGFrZXMgdGhlIGZvcm0gb2YgYSBzaW5nbHkgbGlua2VkIGxpc3QsIHdob3NlIG5vZGUgaXMgYmVsb3c6CiAqLwojZGVmaW5lIE5MU19OVU1fQ0FDSEVEX1NUUklOR1MgNDUKCnR5cGVkZWYgc3RydWN0IF9OTFNfRk9STUFUX05PREUKewogIExDSUQgIGxjaWQ7ICAgICAgICAgLyogTG9jYWxlIElkICovCiAgRFdPUkQgZHdGbGFnczsgICAgICAvKiAwIG9yIExPQ0FMRV9OT1VTRVJPVkVSUklERSAqLwogIERXT1JEIGR3Q29kZVBhZ2U7ICAgLyogRGVmYXVsdCBjb2RlIHBhZ2UgKGlmIExPQ0FMRV9VU0VfQU5TSV9DUCBub3QgZ2l2ZW4pICovCiAgTlVNQkVSRk1UVyAgIGZtdDsgICAvKiBEZWZhdWx0IGZvcm1hdCBmb3IgbnVtYmVycyAqLwogIENVUlJFTkNZRk1UVyBjeWZtdDsgLyogRGVmYXVsdCBmb3JtYXQgZm9yIGN1cnJlbmNpZXMgKi8KICBMUFdTVFIgbHBwc3pTdHJpbmdzW05MU19OVU1fQ0FDSEVEX1NUUklOR1NdOyAvKiBEZWZhdWx0IGZvcm1hdHMsZGF5L21vbnRoIG5hbWVzICovCiAgV0NIQVIgc3pTaG9ydEFNWzJdOyAvKiBTaG9ydCAnQU0nIG1hcmtlciAqLwogIFdDSEFSIHN6U2hvcnRQTVsyXTsgLyogU2hvcnQgJ1BNJyBtYXJrZXIgKi8KICBzdHJ1Y3QgX05MU19GT1JNQVRfTk9ERSAqbmV4dDsKfSBOTFNfRk9STUFUX05PREU7CgovKiBNYWNyb3MgdG8gZ2V0IHBhcnRpY3VsYXIgZGF0YSBzdHJpbmdzIGZyb20gYSBmb3JtYXQgbm9kZSAqLwojZGVmaW5lIEdldE5lZ2F0aXZlKGZtdCkgIGZtdC0+bHBwc3pTdHJpbmdzWzBdCiNkZWZpbmUgR2V0TG9uZ0RhdGUoZm10KSAgZm10LT5scHBzelN0cmluZ3NbMV0KI2RlZmluZSBHZXRTaG9ydERhdGUoZm10KSBmbXQtPmxwcHN6U3RyaW5nc1syXQojZGVmaW5lIEdldFRpbWUoZm10KSAgICAgIGZtdC0+bHBwc3pTdHJpbmdzWzNdCiNkZWZpbmUgR2V0QU0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDJdCiNkZWZpbmUgR2V0UE0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDNdCiNkZWZpbmUgR2V0WWVhck1vbnRoKGZtdCkgZm10LT5scHBzelN0cmluZ3NbNDRdCgojZGVmaW5lIEdldExvbmdEYXkoZm10LGRheSkgICAgZm10LT5scHBzelN0cmluZ3NbNCArIGRheV0KI2RlZmluZSBHZXRTaG9ydERheShmbXQsZGF5KSAgIGZtdC0+bHBwc3pTdHJpbmdzWzExICsgZGF5XQojZGVmaW5lIEdldExvbmdNb250aChmbXQsbXRoKSAgZm10LT5scHBzelN0cmluZ3NbMTggKyBtdGhdCiNkZWZpbmUgR2V0U2hvcnRNb250aChmbXQsbXRoKSBmbXQtPmxwcHN6U3RyaW5nc1szMCArIG10aF0KCi8qIFdyaXRlIGFjY2VzcyB0byB0aGUgY2FjaGUgaXMgcHJvdGVjdGVkIGJ5IHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBOTFNfRm9ybWF0c0NTOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBOTFNfRm9ybWF0c0NTX2RlYnVnID0KewogICAgMCwgMCwgJk5MU19Gb3JtYXRzQ1MsCiAgICB7ICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsCiAgICAgICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBOTFNfRm9ybWF0cyIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gTkxTX0Zvcm1hdHNDUyA9IHsgJk5MU19Gb3JtYXRzQ1NfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldExvY2FsZU51bWJlciA8aW50ZXJuYWw+CiAqCiAqIEdldCBhIG51bWVyaWMgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBEV09SRCBOTFNfR2V0TG9jYWxlTnVtYmVyKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIFdDSEFSIHN6QnVmZls4MF07CiAgRFdPUkQgZHdWYWwgPSAwOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKCiAgaWYgKHN6QnVmZlswXSAmJiBzekJ1ZmZbMV0gPT0gJzsnICYmIHN6QnVmZlsyXSAhPSAnMCcpCiAgICBkd1ZhbCA9IChzekJ1ZmZbMF0gLSAnMCcpICogMTAgKyAoc3pCdWZmWzJdIC0gJzAnKTsKICBlbHNlCiAgewogICAgY29uc3QgV0NIQVIqIGl0ZXIgPSBzekJ1ZmY7CiAgICBkd1ZhbCA9IDA7CiAgICB3aGlsZSgqaXRlciA+PSAnMCcgJiYgKml0ZXIgPD0gJzknKQogICAgICBkd1ZhbCA9IGR3VmFsICogMTAgKyAoKml0ZXIrKyAtICcwJyk7CiAgfQogIHJldHVybiBkd1ZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXRMb2NhbGVTdHJpbmcgPGludGVybmFsPgogKgogKiBHZXQgYSBzdHJpbmcgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBXQ0hBUiogTkxTX0dldExvY2FsZVN0cmluZyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MpCnsKICBXQ0hBUiBzekJ1ZmZbODBdLCAqc3RyOwogIERXT1JEIGR3TGVuOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKICBkd0xlbiA9IHN0cmxlblcoc3pCdWZmKSArIDE7CiAgc3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgaWYgKHN0cikKICAgIG1lbWNweShzdHIsIHN6QnVmZiwgZHdMZW4gKiBzaXplb2YoV0NIQVIpKTsKICByZXR1cm4gc3RyOwp9CgojZGVmaW5lIEdFVF9MT0NBTEVfTlVNQkVSKG51bSwgdHlwZSkgbnVtID0gTkxTX0dldExvY2FsZU51bWJlcihsY2lkLCB0eXBlfGR3RmxhZ3MpOyBcCiAgVFJBQ0UoICN0eXBlICI6ICVkICglMDh4KVxuIiwgKERXT1JEKW51bSwgKERXT1JEKW51bSkKCiNkZWZpbmUgR0VUX0xPQ0FMRV9TVFJJTkcoc3RyLCB0eXBlKSBzdHIgPSBOTFNfR2V0TG9jYWxlU3RyaW5nKGxjaWQsIHR5cGV8ZHdGbGFncyk7IFwKICBUUkFDRSggI3R5cGUgIjogJyVzJ1xuIiwgZGVidWdzdHJfdyhzdHIpKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXRGb3JtYXRzIDxpbnRlcm5hbD4KICoKICogQ2FsY3VsYXRlIChhbmQgY2FjaGUpIHRoZSBudW1iZXIgZm9ybWF0cyBmb3IgYSBsb2NhbGUuCiAqLwpzdGF0aWMgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpOTFNfR2V0Rm9ybWF0cyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MpCnsKICAvKiBHZXRMb2NhbGVJbmZvKCkgaWRlbnRpZmllcnMgZm9yIGNhY2hlZCBmb3JtYXR0aW5nIHN0cmluZ3MgKi8KICBzdGF0aWMgY29uc3QgVVNIT1JUIE5MU19Mb2NhbGVJbmRpY2VzW10gPSB7CiAgICBMT0NBTEVfU05FR0FUSVZFU0lHTiwKICAgIExPQ0FMRV9TTE9OR0RBVEUsICAgTE9DQUxFX1NTSE9SVERBVEUsCiAgICBMT0NBTEVfU1RJTUVGT1JNQVQsCiAgICBMT0NBTEVfU0RBWU5BTUUxLCBMT0NBTEVfU0RBWU5BTUUyLCBMT0NBTEVfU0RBWU5BTUUzLAogICAgTE9DQUxFX1NEQVlOQU1FNCwgTE9DQUxFX1NEQVlOQU1FNSwgTE9DQUxFX1NEQVlOQU1FNiwgTE9DQUxFX1NEQVlOQU1FNywKICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsCiAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCBMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCBMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LAogICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywKICAgIExPQ0FMRV9TTU9OVEhOQU1FMSwgTE9DQUxFX1NNT05USE5BTUUyLCBMT0NBTEVfU01PTlRITkFNRTMsCiAgICBMT0NBTEVfU01PTlRITkFNRTQsIExPQ0FMRV9TTU9OVEhOQU1FNSwgTE9DQUxFX1NNT05USE5BTUU2LAogICAgTE9DQUxFX1NNT05USE5BTUU3LCBMT0NBTEVfU01PTlRITkFNRTgsIExPQ0FMRV9TTU9OVEhOQU1FOSwKICAgIExPQ0FMRV9TTU9OVEhOQU1FMTAsIExPQ0FMRV9TTU9OVEhOQU1FMTEsIExPQ0FMRV9TTU9OVEhOQU1FMTIsCiAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLAogICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksCiAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLAogICAgTE9DQUxFX1MxMTU5LCBMT0NBTEVfUzIzNTksCiAgICBMT0NBTEVfU1lFQVJNT05USAogIH07CiAgc3RhdGljIE5MU19GT1JNQVRfTk9ERSAqTkxTX0NhY2hlZEZvcm1hdHMgPSBOVUxMOwogIE5MU19GT1JNQVRfTk9ERSAqbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzOwoKICBkd0ZsYWdzICY9IExPQ0FMRV9OT1VTRVJPVkVSUklERTsKCiAgVFJBQ0UoIigweCUwNHgsMHglMDh4KVxuIiwgbGNpZCwgZHdGbGFncyk7CgogIC8qIFNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgY2FjaGVkIHRoZSBsb2NhbGVzIG51bWJlciBmb3JtYXQgKi8KICB3aGlsZSAobm9kZSAmJiAobm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykgJiYgbm9kZS0+bmV4dCkKICAgIG5vZGUgPSBub2RlLT5uZXh0OwoKICBpZiAoIW5vZGUgfHwgbm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykKICB7CiAgICBOTFNfRk9STUFUX05PREUgKm5ld19ub2RlOwogICAgRFdPUkQgaTsKCiAgICBUUkFDRSgiQ3JlYXRpbmcgbmV3IGNhY2hlIGVudHJ5XG4iKTsKCiAgICBpZiAoIShuZXdfbm9kZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoTkxTX0ZPUk1BVF9OT0RFKSkpKQogICAgICByZXR1cm4gTlVMTDsKCiAgICBHRVRfTE9DQUxFX05VTUJFUihuZXdfbm9kZS0+ZHdDb2RlUGFnZSwgTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKTsKCiAgICAvKiBOdW1iZXIgRm9ybWF0ICovCiAgICBuZXdfbm9kZS0+bGNpZCA9IGxjaWQ7CiAgICBuZXdfbm9kZS0+ZHdGbGFncyA9IGR3RmxhZ3M7CiAgICBuZXdfbm9kZS0+bmV4dCA9IE5VTEw7CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmZtdC5OdW1EaWdpdHMsIExPQ0FMRV9JRElHSVRTKTsKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTGVhZGluZ1plcm8sIExPQ0FMRV9JTFpFUk8pOwogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmZtdC5OZWdhdGl2ZU9yZGVyLCBMT0NBTEVfSU5FR05VTUJFUik7CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmZtdC5Hcm91cGluZywgTE9DQUxFX1NHUk9VUElORyk7CiAgICBpZiAobmV3X25vZGUtPmZtdC5Hcm91cGluZyA+IDkgJiYgbmV3X25vZGUtPmZtdC5Hcm91cGluZyAhPSAzMikKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX1NHUk9VUElORyAoJWQpIHVuaGFuZGxlZCwgcGxlYXNlIHJlcG9ydCFcbiIsCiAgICAgICAgICAgbmV3X25vZGUtPmZtdC5Hcm91cGluZyk7CiAgICAgIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgPSAwOwogICAgfQoKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5mbXQubHBEZWNpbWFsU2VwLCBMT0NBTEVfU0RFQ0lNQUwpOwogICAgR0VUX0xPQ0FMRV9TVFJJTkcobmV3X25vZGUtPmZtdC5scFRob3VzYW5kU2VwLCBMT0NBTEVfU1RIT1VTQU5EKTsKCiAgICAvKiBDdXJyZW5jeSBGb3JtYXQgKi8KICAgIG5ld19ub2RlLT5jeWZtdC5OdW1EaWdpdHMgPSBuZXdfbm9kZS0+Zm10Lk51bURpZ2l0czsKICAgIG5ld19ub2RlLT5jeWZtdC5MZWFkaW5nWmVybyA9IG5ld19ub2RlLT5mbXQuTGVhZGluZ1plcm87CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmN5Zm10Lkdyb3VwaW5nLCBMT0NBTEVfU0dST1VQSU5HKTsKCiAgICBpZiAobmV3X25vZGUtPmN5Zm10Lkdyb3VwaW5nID4gOSkKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX1NNT05HUk9VUElORyAoJWQpIHVuaGFuZGxlZCwgcGxlYXNlIHJlcG9ydCFcbiIsCiAgICAgICAgICAgbmV3X25vZGUtPmN5Zm10Lkdyb3VwaW5nKTsKICAgICAgbmV3X25vZGUtPmN5Zm10Lkdyb3VwaW5nID0gMDsKICAgIH0KCiAgICBHRVRfTE9DQUxFX05VTUJFUihuZXdfbm9kZS0+Y3lmbXQuTmVnYXRpdmVPcmRlciwgTE9DQUxFX0lORUdDVVJSKTsKICAgIGlmIChuZXdfbm9kZS0+Y3lmbXQuTmVnYXRpdmVPcmRlciA+IDE1KQogICAgewogICAgICBXQVJOKCJMT0NBTEVfSU5FR0NVUlIgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5jeWZtdC5OZWdhdGl2ZU9yZGVyKTsKICAgICAgbmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIgPSAwOwogICAgfQogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmN5Zm10LlBvc2l0aXZlT3JkZXIsIExPQ0FMRV9JQ1VSUkVOQ1kpOwogICAgaWYgKG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyID4gMykKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX0lQT1NDVVJSICglZCkgdW5oYW5kbGVkLHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyKTsKICAgICAgbmV3X25vZGUtPmN5Zm10LlBvc2l0aXZlT3JkZXIgPSAwOwogICAgfQogICAgR0VUX0xPQ0FMRV9TVFJJTkcobmV3X25vZGUtPmN5Zm10LmxwRGVjaW1hbFNlcCwgTE9DQUxFX1NNT05ERUNJTUFMU0VQKTsKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5jeWZtdC5scFRob3VzYW5kU2VwLCBMT0NBTEVfU01PTlRIT1VTQU5EU0VQKTsKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5jeWZtdC5scEN1cnJlbmN5U3ltYm9sLCBMT0NBTEVfU0NVUlJFTkNZKTsKCiAgICAvKiBEYXRlL1RpbWUgRm9ybWF0IGluZm8sIG5lZ2F0aXZlIGNoYXJhY3RlciwgZXRjICovCiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzKS9zaXplb2YoTkxTX0xvY2FsZUluZGljZXNbMF0pOyBpKyspCiAgICB7CiAgICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5scHBzelN0cmluZ3NbaV0sIE5MU19Mb2NhbGVJbmRpY2VzW2ldKTsKICAgIH0KICAgIG5ld19ub2RlLT5zelNob3J0QU1bMF0gPSBHZXRBTShuZXdfbm9kZSlbMF07IG5ld19ub2RlLT5zelNob3J0QU1bMV0gPSAnXDAnOwogICAgbmV3X25vZGUtPnN6U2hvcnRQTVswXSA9IEdldFBNKG5ld19ub2RlKVswXTsgbmV3X25vZGUtPnN6U2hvcnRQTVsxXSA9ICdcMCc7CgogICAgLyogTm93IGFkZCB0aGUgY29tcHV0ZWQgZm9ybWF0IHRvIHRoZSBjYWNoZSAqLwogICAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oJk5MU19Gb3JtYXRzQ1MpOwoKICAgIC8qIFNlYXJjaCBhZ2FpbjogV2UgbWF5IGhhdmUgcmFjZWQgdG8gYWRkIHRoZSBub2RlICovCiAgICBub2RlID0gTkxTX0NhY2hlZEZvcm1hdHM7CiAgICB3aGlsZSAobm9kZSAmJiAobm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykgJiYgbm9kZS0+bmV4dCkKICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CgogICAgaWYgKCFub2RlKQogICAgewogICAgICBub2RlID0gTkxTX0NhY2hlZEZvcm1hdHMgPSBuZXdfbm9kZTsgLyogRW1wdHkgbGlzdCAqLwogICAgICBuZXdfbm9kZSA9IE5VTEw7CiAgICB9CiAgICBlbHNlIGlmIChub2RlLT5sY2lkICE9IGxjaWQgfHwgbm9kZS0+ZHdGbGFncyAhPSBkd0ZsYWdzKQogICAgewogICAgICBub2RlLT5uZXh0ID0gbmV3X25vZGU7IC8qIE5vdCBpbiB0aGUgbGlzdCwgYWRkIHRvIGVuZCAqLwogICAgICBub2RlID0gbmV3X25vZGU7CiAgICAgIG5ld19ub2RlID0gTlVMTDsKICAgIH0KCiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbigmTkxTX0Zvcm1hdHNDUyk7CgogICAgaWYgKG5ld19ub2RlKQogICAgewogICAgICAvKiBXZSByYWNlZCBhbmQgbG9zdDogVGhlIG5vZGUgd2FzIGFscmVhZHkgYWRkZWQgYnkgYW5vdGhlciB0aHJlYWQuCiAgICAgICAqIG5vZGUgcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgY2FjaGVkIG5vZGUsIHNvIGZyZWUgbmV3X25vZGUuCiAgICAgICAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzKS9zaXplb2YoTkxTX0xvY2FsZUluZGljZXNbMF0pOyBpKyspCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUtPmxwcHN6U3RyaW5nc1tpXSk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5mbXQubHBEZWNpbWFsU2VwKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUtPmZtdC5scFRob3VzYW5kU2VwKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUtPmN5Zm10LmxwRGVjaW1hbFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scFRob3VzYW5kU2VwKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUtPmN5Zm10LmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZSk7CiAgICB9CiAgfQogIHJldHVybiBub2RlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0lzVW5pY29kZU9ubHlMY2lkIDxpbnRlcm5hbD4KICoKICogRGV0ZXJtaW5lIGlmIGEgbG9jYWxlIGlzIFVuaWNvZGUgb25seSwgYW5kIHRodXMgaW52YWxpZCBpbiBBU0NJSSBjYWxscy4KICovCkJPT0wgTkxTX0lzVW5pY29kZU9ubHlMY2lkKExDSUQgbGNpZCkKewogIHN3aXRjaCAoUFJJTUFSWUxBTkdJRChsY2lkKSkKICB7CiAgY2FzZSBMQU5HX0FSTUVOSUFOOgogIGNhc2UgTEFOR19ESVZFSEk6CiAgY2FzZSBMQU5HX0dFT1JHSUFOOgogIGNhc2UgTEFOR19HVUpBUkFUSToKICBjYXNlIExBTkdfSElOREk6CiAgY2FzZSBMQU5HX0tBTk5BREE6CiAgY2FzZSBMQU5HX0tPTktBTkk6CiAgY2FzZSBMQU5HX01BUkFUSEk6CiAgY2FzZSBMQU5HX1BVTkpBQkk6CiAgY2FzZSBMQU5HX1NBTlNLUklUOgogICAgVFJBQ0UoImxjaWQgMHglMDh4OiBsYW5naWQgMHglNHggaXMgVW5pY29kZSBPbmx5XG4iLCBsY2lkLCBQUklNQVJZTEFOR0lEKGxjaWQpKTsKICAgIHJldHVybiBUUlVFOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gRkFMU0U7CiAgfQp9CgovKgogKiBGb3JtYXR0aW5nIG9mIGRhdGVzLCB0aW1lcywgbnVtYmVycyBhbmQgY3VycmVuY2llcy4KICovCgojZGVmaW5lIElzTGl0ZXJhbE1hcmtlcihwKSAocCA9PSAnXCcnKQojZGVmaW5lIElzRGF0ZUZtdENoYXIocCkgICAocCA9PSAnZCd8fHAgPT0gJ00nfHxwID09ICd5J3x8cCA9PSAnZycpCiNkZWZpbmUgSXNUaW1lRm10Q2hhcihwKSAgIChwID09ICdIJ3x8cCA9PSAnaCd8fHAgPT0gJ20nfHxwID09ICdzJ3x8cCA9PSAndCcpCgovKiBPbmx5IHRoZSBmb2xsb3dpbmcgZmxhZ3MgY2FuIGJlIGdpdmVuIGlmIGEgZGF0ZS90aW1lIGZvcm1hdCBpcyBzcGVjaWZpZWQgKi8KI2RlZmluZSBEQVRFX0ZPUk1BVF9GTEFHUyAoREFURV9EQVRFVkFSU09OTFl8TE9DQUxFX05PVVNFUk9WRVJSSURFKQojZGVmaW5lIFRJTUVfRk9STUFUX0ZMQUdTIChUSU1FX1RJTUVWQVJTT05MWXxUSU1FX0ZPUkNFMjRIT1VSRk9STUFUfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTfFRJTUVfTk9TRUNPTkRTfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfTk9USU1FTUFSS0VSfExPQ0FMRV9OT1VTRVJPVkVSUklERSkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldERhdGVUaW1lRm9ybWF0VyA8aW50ZXJuYWw+CiAqCiAqIFBlcmZvcm1zIHRoZSBmb3JtYXR0aW5nIGZvciBHZXREYXRlRm9ybWF0Vy9HZXRUaW1lRm9ybWF0Vy4KICoKICogRklYTUUKICogREFURV9VU0VfQUxUX0NBTEVOREFSICAgICAgICAgICAtIFJlcXVpcmVzIEdldENhbGVuZGFySW5mbyB0byB3b3JrIGZpcnN0LgogKiBEQVRFX0xUUlJFQURJTkcvREFURV9SVExSRUFESU5HIC0gTm90IHlldCBpbXBsZW1lbnRlZC4KICovCnN0YXRpYyBJTlQgTkxTX0dldERhdGVUaW1lRm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsIExQQ1dTVFIgbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgbHBTdHIsIElOVCBjY2hPdXQpCnsKICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGU7CiAgU1lTVEVNVElNRSBzdDsKICBJTlQgY2NoV3JpdHRlbiA9IDA7CiAgSU5UIGxhc3RGb3JtYXRQb3MgPSAwOwogIEJPT0wgYlNraXBwaW5nID0gRkFMU0U7IC8qIFNraXBwaW5nIHRleHQgYXJvdW5kIG1hcmtlcj8gKi8KCiAgLyogVmVyaWZ5IG91ciBhcmd1bWVudHMgKi8KICBpZiAoKGNjaE91dCAmJiAhbHBTdHIpIHx8ICEobm9kZSA9IE5MU19HZXRGb3JtYXRzKGxjaWQsIGR3RmxhZ3MpKSkKICB7Ck5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmIChkd0ZsYWdzICYgfihEQVRFX0RBVEVWQVJTT05MWXxUSU1FX1RJTUVWQVJTT05MWSkpCiAgewogICAgaWYgKGxwRm9ybWF0ICYmCiAgICAgICAgKChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkgJiYgZHdGbGFncyAmIH5EQVRFX0ZPUk1BVF9GTEFHUykgfHwKICAgICAgICAgKGR3RmxhZ3MgJiBUSU1FX1RJTUVWQVJTT05MWSAmJiBkd0ZsYWdzICYgflRJTUVfRk9STUFUX0ZMQUdTKSkpCiAgICB7Ck5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZEZsYWdzOgogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9GTEFHUyk7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkpCiAgICB7CiAgICAgIGlmICgoZHdGbGFncyAmIChEQVRFX0xUUlJFQURJTkd8REFURV9SVExSRUFESU5HKSkgPT0gKERBVEVfTFRSUkVBRElOR3xEQVRFX1JUTFJFQURJTkcpKQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M7CiAgICAgIGVsc2UgaWYgKGR3RmxhZ3MgJiAoREFURV9MVFJSRUFESU5HfERBVEVfUlRMUkVBRElORykpCiAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIGZsYWdzOiBEQVRFX0xUUlJFQURJTkcvREFURV9SVExSRUFESU5HXG4iKTsKCiAgICAgIHN3aXRjaCAoZHdGbGFncyAmIChEQVRFX1NIT1JUREFURXxEQVRFX0xPTkdEQVRFfERBVEVfWUVBUk1PTlRIKSkKICAgICAgewogICAgICBjYXNlIDA6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgY2FzZSBEQVRFX1lFQVJNT05USDoKICAgICAgICBpZiAobHBGb3JtYXQpCiAgICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZEZsYWdzOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkRmxhZ3M7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghbHBGb3JtYXQpCiAgewogICAgLyogVXNlIHRoZSBhcHByb3ByaWF0ZSBkZWZhdWx0IGZvcm1hdCAqLwogICAgaWYgKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSkKICAgIHsKICAgICAgaWYgKGR3RmxhZ3MgJiBEQVRFX1lFQVJNT05USCkKICAgICAgICBscEZvcm1hdCA9IEdldFllYXJNb250aChub2RlKTsKICAgICAgZWxzZSBpZiAoZHdGbGFncyAmIERBVEVfTE9OR0RBVEUpCiAgICAgICAgbHBGb3JtYXQgPSBHZXRMb25nRGF0ZShub2RlKTsKICAgICAgZWxzZQogICAgICAgIGxwRm9ybWF0ID0gR2V0U2hvcnREYXRlKG5vZGUpOwogICAgfQogICAgZWxzZQogICAgICBscEZvcm1hdCA9IEdldFRpbWUobm9kZSk7CiAgfQoKICBpZiAoIWxwVGltZSkKICB7CiAgICBHZXRMb2NhbFRpbWUoJnN0KTsgLyogRGVmYXVsdCB0byBjdXJyZW50IHRpbWUgKi8KICAgIGxwVGltZSA9ICZzdDsKICB9CiAgZWxzZQogIHsKICAgIGlmIChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkpCiAgICB7CiAgICAgIEZJTEVUSU1FIGZ0VG1wOwoKICAgICAgLyogVmVyaWZ5IHRoZSBkYXRlIGFuZCBjb3JyZWN0IHRoZSBELk8uVy4gaWYgbmVlZGVkICovCiAgICAgIG1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOwogICAgICBzdC53WWVhciA9IGxwVGltZS0+d1llYXI7CiAgICAgIHN0LndNb250aCA9IGxwVGltZS0+d01vbnRoOwogICAgICBzdC53RGF5ID0gbHBUaW1lLT53RGF5OwoKICAgICAgaWYgKHN0LndEYXkgPiAzMSB8fCBzdC53TW9udGggPiAxMiB8fCAhU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0LCAmZnRUbXApKQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkUGFyYW1ldGVyOwoKICAgICAgRmlsZVRpbWVUb1N5c3RlbVRpbWUoJmZ0VG1wLCAmc3QpOwogICAgICBscFRpbWUgPSAmc3Q7CiAgICB9CgogICAgaWYgKGR3RmxhZ3MgJiBUSU1FX1RJTUVWQVJTT05MWSkKICAgIHsKICAgICAgLyogVmVyaWZ5IHRoZSB0aW1lICovCiAgICAgIGlmIChscFRpbWUtPndIb3VyID4gMjQgfHwgbHBUaW1lLT53TWludXRlID4gNTkgfHwgbHBUaW1lLT53U2Vjb25kID4gNTkpCiAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRQYXJhbWV0ZXI7CiAgICB9CiAgfQoKICAvKiBGb3JtYXQgdGhlIG91dHB1dCAqLwogIHdoaWxlICgqbHBGb3JtYXQpCiAgewogICAgaWYgKElzTGl0ZXJhbE1hcmtlcigqbHBGb3JtYXQpKQogICAgewogICAgICAvKiBTdGFydCBvZiBhIGxpdGVyYWwgc3RyaW5nICovCiAgICAgIGxwRm9ybWF0Kys7CgogICAgICAvKiBMb29wIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwgbWFya2VyIG9yIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICAgIHdoaWxlICgqbHBGb3JtYXQpCiAgICAgIHsKICAgICAgICBpZiAoSXNMaXRlcmFsTWFya2VyKCpscEZvcm1hdCkpCiAgICAgICAgewogICAgICAgICAgbHBGb3JtYXQrKzsKICAgICAgICAgIGlmICghSXNMaXRlcmFsTWFya2VyKCpscEZvcm1hdCkpCiAgICAgICAgICAgIGJyZWFrOyAvKiBUZXJtaW5hdGluZyBsaXRlcmFsIG1hcmtlciAqLwogICAgICAgIH0KCiAgICAgICAgaWYgKCFjY2hPdXQpCiAgICAgICAgICBjY2hXcml0dGVuKys7ICAgLyogQ291bnQgc2l6ZSBvbmx5ICovCiAgICAgICAgZWxzZSBpZiAoY2NoV3JpdHRlbiA+PSBjY2hPdXQpCiAgICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfT3ZlcnJ1bjsKICAgICAgICBlbHNlIGlmICghYlNraXBwaW5nKQogICAgICAgIHsKICAgICAgICAgIGxwU3RyW2NjaFdyaXR0ZW5dID0gKmxwRm9ybWF0OwogICAgICAgICAgY2NoV3JpdHRlbisrOwogICAgICAgIH0KICAgICAgICBscEZvcm1hdCsrOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZICYmIElzRGF0ZUZtdENoYXIoKmxwRm9ybWF0KSkgfHwKICAgICAgICAgICAgIChkd0ZsYWdzICYgVElNRV9USU1FVkFSU09OTFkgJiYgSXNUaW1lRm10Q2hhcigqbHBGb3JtYXQpKSkKICAgIHsKICAgICAgY2hhciAgYnVmZkFbMzJdOwogICAgICBXQ0hBUiBidWZmWzMyXSwgZm10Q2hhcjsKICAgICAgTFBDV1NUUiBzekFkZCA9IE5VTEw7CiAgICAgIERXT1JEIGR3VmFsID0gMDsKICAgICAgaW50ICAgY291bnQgPSAwLCBkd0xlbjsKCiAgICAgIGJTa2lwcGluZyA9IEZBTFNFOwoKICAgICAgZm10Q2hhciA9ICpscEZvcm1hdDsKICAgICAgd2hpbGUgKCpscEZvcm1hdCA9PSBmbXRDaGFyKQogICAgICB7CiAgICAgICAgY291bnQrKzsKICAgICAgICBscEZvcm1hdCsrOwogICAgICB9CiAgICAgIGJ1ZmZbMF0gPSAnXDAnOwoKICAgICAgc3dpdGNoKGZtdENoYXIpCiAgICAgIHsKICAgICAgY2FzZSAnZCc6CiAgICAgICAgaWYgKGNvdW50ID49IDQpCiAgICAgICAgICBzekFkZCA9IEdldExvbmdEYXkobm9kZSwgKGxwVGltZS0+d0RheU9mV2VlayArIDYpICUgNyk7CiAgICAgICAgZWxzZSBpZiAoY291bnQgPT0gMykKICAgICAgICAgIHN6QWRkID0gR2V0U2hvcnREYXkobm9kZSwgKGxwVGltZS0+d0RheU9mV2VlayArIDYpICUgNyk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53RGF5OwogICAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ00nOgogICAgICAgIGlmIChjb3VudCA+PSA0KQogICAgICAgICAgc3pBZGQgPSBHZXRMb25nTW9udGgobm9kZSwgbHBUaW1lLT53TW9udGggLSAxKTsKICAgICAgICBlbHNlIGlmIChjb3VudCA9PSAzKQogICAgICAgICAgc3pBZGQgPSBHZXRTaG9ydE1vbnRoKG5vZGUsIGxwVGltZS0+d01vbnRoIC0gMSk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53TW9udGg7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAneSc6CiAgICAgICAgaWYgKGNvdW50ID49IDQpCiAgICAgICAgewogICAgICAgICAgY291bnQgPSA0OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndZZWFyOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d1llYXIgJSAxMDA7CiAgICAgICAgfQogICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2cnOgogICAgICAgIGlmIChjb3VudCA9PSAyKQogICAgICAgIHsKICAgICAgICAgIC8qIEZJWE1FOiBPdXIgR2V0Q2FsZW5kYXJJbmZvKCkgZG9lcyBub3QgeWV0IHN1cHBvcnQgQ0FMX1NFUkFTVFJJTkcuCiAgICAgICAgICAgKiAgICAgICAgV2hlbiBpdCBpcyBmaXhlZCwgdGhpcyBzdHJpbmcgc2hvdWxkIGJlIGNhY2hlZCBpbiAnbm9kZScuCiAgICAgICAgICAgKi8KICAgICAgICAgIEZJWE1FKCJTaG91bGQgYmUgdXNpbmcgR2V0Q2FsZW5kYXJJbmZvKENBTF9TRVJBU1RSSU5HKSwgZGVmYXVsdGluZyB0byAnQUQnXG4iKTsKICAgICAgICAgIGJ1ZmZbMF0gPSAnQSc7IGJ1ZmZbMV0gPSAnRCc7IGJ1ZmZbMl0gPSAnXDAnOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgYnVmZlswXSA9ICdnJzsgYnVmZlsxXSA9ICdcMCc7IC8qIEFkZCBhIGxpdGVyYWwgJ2cnICovCiAgICAgICAgfQogICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2gnOgogICAgICAgIGlmICghKGR3RmxhZ3MgJiBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUKSkKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53SG91ciA9PSAwID8gMTIgOiAobHBUaW1lLT53SG91ciAtIDEpICUgMTIgKyAxOwogICAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIC4uIGZhbGwgdGhyb3VnaCBpZiB3ZSBhcmUgZm9yY2VkIHRvIG91dHB1dCBpbiAyNCBob3VyIGZvcm1hdCAqLwoKICAgICAgY2FzZSAnSCc6CiAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgZHdWYWwgPSBscFRpbWUtPndIb3VyOwogICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ20nOgogICAgICAgIGlmIChkd0ZsYWdzICYgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpCiAgICAgICAgewogICAgICAgICAgY2NoV3JpdHRlbiA9IGxhc3RGb3JtYXRQb3M7IC8qIFNraXAgKi8KICAgICAgICAgIGJTa2lwcGluZyA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53TWludXRlOwogICAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3MnOgogICAgICAgIGlmIChkd0ZsYWdzICYgKFRJTUVfTk9TRUNPTkRTfFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgICAgICB7CiAgICAgICAgICBjY2hXcml0dGVuID0gbGFzdEZvcm1hdFBvczsgLyogU2tpcCAqLwogICAgICAgICAgYlNraXBwaW5nID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndTZWNvbmQ7CiAgICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndCc6CiAgICAgICAgaWYgKGR3RmxhZ3MgJiBUSU1FX05PVElNRU1BUktFUikKICAgICAgICB7CiAgICAgICAgICBjY2hXcml0dGVuID0gbGFzdEZvcm1hdFBvczsgLyogU2tpcCAqLwogICAgICAgICAgYlNraXBwaW5nID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGlmIChjb3VudCA9PSAxKQogICAgICAgICAgICBzekFkZCA9IGxwVGltZS0+d0hvdXIgPCAxMiA/IG5vZGUtPnN6U2hvcnRBTSA6IG5vZGUtPnN6U2hvcnRQTTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc3pBZGQgPSBscFRpbWUtPndIb3VyIDwgMTIgPyBHZXRBTShub2RlKSA6IEdldFBNKG5vZGUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKHN6QWRkID09IGJ1ZmYgJiYgYnVmZlswXSA9PSAnXDAnKQogICAgICB7CiAgICAgICAgLyogV2UgaGF2ZSBhIG51bWVyaWMgdmFsdWUgdG8gYWRkICovCiAgICAgICAgc3ByaW50ZihidWZmQSwgIiUuKmQiLCBjb3VudCwgZHdWYWwpOwogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWZmQSwgLTEsIGJ1ZmYsIHNpemVvZihidWZmKS9zaXplb2YoV0NIQVIpKTsKICAgICAgfQoKICAgICAgZHdMZW4gPSBzekFkZCA/IHN0cmxlblcoc3pBZGQpIDogMDsKCiAgICAgIGlmIChjY2hPdXQgJiYgZHdMZW4pCiAgICAgIHsKICAgICAgICBpZiAoY2NoV3JpdHRlbiArIGR3TGVuIDwgY2NoT3V0KQogICAgICAgICAgbWVtY3B5KGxwU3RyICsgY2NoV3JpdHRlbiwgc3pBZGQsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIG1lbWNweShscFN0ciArIGNjaFdyaXR0ZW4sIHN6QWRkLCAoY2NoT3V0IC0gY2NoV3JpdHRlbikgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICAgIH0KICAgICAgfQogICAgICBjY2hXcml0dGVuICs9IGR3TGVuOwogICAgICBsYXN0Rm9ybWF0UG9zID0gY2NoV3JpdHRlbjsgLyogU2F2ZSBwb3NpdGlvbiBvZiBsYXN0IG91dHB1dCBmb3JtYXQgdGV4dCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBMaXRlcmFsIGNoYXJhY3RlciAqLwogICAgICBpZiAoIWNjaE91dCkKICAgICAgICBjY2hXcml0dGVuKys7ICAgLyogQ291bnQgc2l6ZSBvbmx5ICovCiAgICAgIGVsc2UgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICAgICBlbHNlIGlmICghYlNraXBwaW5nIHx8ICpscEZvcm1hdCA9PSAnICcpCiAgICAgIHsKICAgICAgICBscFN0cltjY2hXcml0dGVuXSA9ICpscEZvcm1hdDsKICAgICAgICBjY2hXcml0dGVuKys7CiAgICAgIH0KICAgICAgbHBGb3JtYXQrKzsKICAgIH0KICB9CgogIC8qIEZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICBpZiAoY2NoT3V0KQogIHsKICAgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19PdmVycnVuOwogICBlbHNlCiAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAnXDAnOwogIH0KICBjY2hXcml0dGVuKys7IC8qIEluY2x1ZGUgdGVybWluYXRpbmcgTlVMICovCgogIFRSQUNFKCJyZXR1cm5pbmcgbGVuZ3RoPSVkLCBvdXB1dD0nJXMnXG4iLCBjY2hXcml0dGVuLCBkZWJ1Z3N0cl93KGxwU3RyKSk7CiAgcmV0dXJuIGNjaFdyaXR0ZW47CgpOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX092ZXJydW46CiAgVFJBQ0UoInJldHVybmluZyAwLCAoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUilcbiIpOwogIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBIDxpbnRlcm5hbD4KICoKICogQVNDSUkgd3JhcHBlciBmb3IgR2V0RGF0ZUZvcm1hdEEvR2V0VGltZUZvcm1hdEEuCiAqLwpzdGF0aWMgSU5UIE5MU19HZXREYXRlVGltZUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscFN0ciwgSU5UIGNjaE91dCkKewogIERXT1JEIGNwID0gQ1BfQUNQOwogIFdDSEFSIHN6Rm9ybWF0WzEyOF0sIHN6T3V0WzEyOF07CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcCwlcywlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl9hKGxwRm9ybWF0KSwgbHBTdHIsIGNjaE91dCk7CgogIGlmIChOTFNfSXNVbmljb2RlT25seUxjaWQobGNpZCkpCiAgewpHZXREYXRlVGltZUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghKGR3RmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCkpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0RGF0ZVRpbWVGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI7CiAgICBjcCA9IG5vZGUtPmR3Q29kZVBhZ2U7CiAgfQoKICBpZiAobHBGb3JtYXQpCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdCwgLTEsIHN6Rm9ybWF0LCBzaXplb2Yoc3pGb3JtYXQpL3NpemVvZihXQ0hBUikpOwoKICBpZiAoY2NoT3V0ID4gKGludCkoc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpKSkKICAgIGNjaE91dCA9IHNpemVvZihzek91dCkvc2l6ZW9mKFdDSEFSKTsKCiAgc3pPdXRbMF0gPSAnXDAnOwoKICBpUmV0ID0gTkxTX0dldERhdGVUaW1lRm9ybWF0VyhsY2lkLCBkd0ZsYWdzLCBscFRpbWUsIGxwRm9ybWF0ID8gc3pGb3JtYXQgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwU3RyID8gc3pPdXQgOiBOVUxMLCBjY2hPdXQpOwoKICBpZiAobHBTdHIpCiAgewogICAgaWYgKHN6T3V0WzBdKQogICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKGNwLCAwLCBzek91dCwgaVJldCA/IC0xIDogY2NoT3V0LCBscFN0ciwgY2NoT3V0LCAwLCAwKTsKICAgIGVsc2UgaWYgKGNjaE91dCAmJiBpUmV0KQogICAgICAqbHBTdHIgPSAnXDAnOwogIH0KICByZXR1cm4gaVJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXREYXRlRm9ybWF0QSBbS0VSTkVMMzIuQF0KICoKICogRm9ybWF0IGEgZGF0ZSBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgbGNpZCAgICAgIFtJXSBMb2NhbGUgdG8gZm9ybWF0IGZvcgogKiAgZHdGbGFncyAgIFtJXSBMT0NBTEVfIGFuZCBEQVRFXyBmbGFncyBmcm9tICJ3aW5ubHMuaCIKICogIGxwVGltZSAgICBbSV0gRGF0ZSB0byBmb3JtYXQKICogIGxwRm9ybWF0ICBbSV0gRm9ybWF0IHN0cmluZywgb3IgTlVMTCB0byB1c2UgdGhlIHN5c3RlbSBkZWZhdWx0cwogKiAgbHBEYXRlU3RyIFtPXSBEZXN0aW5hdGlvbiBmb3IgZm9ybWF0dGVkIHN0cmluZwogKiAgY2NoT3V0ICAgIFtJXSBTaXplIG9mIGxwRGF0ZVN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIElmIGxwRm9ybWF0IGlzIE5VTEwsIGxwRGF0ZVN0ciB3aWxsIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdAogKiAgICBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkgYW5kIG1vZGlmaWVkIGJ5IGR3RmxhZ3MuCiAqICAtIGxwRm9ybWF0IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgYW5kIGZvcm1hdHRpbmcgdG9rZW5zLiBBbnkgY2hhcmFjdGVycwogKiAgICBpbiB0aGUgc3RyaW5nIGFyZSBjb3BpZWQgdmVyYmF0aW0gdG8gbHBEYXRlU3RyLCB3aXRoIHRva2VucyBiZWluZyByZXBsYWNlZAogKiAgICBieSB0aGUgZGF0ZSB2YWx1ZXMgdGhleSByZXByZXNlbnQuCiAqICAtIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBpbiBhIGRhdGUgZm9ybWF0IHN0cmluZzoKICp8ICBUb2tlbiAgTWVhbmluZwogKnwgIC0tLS0tICAtLS0tLS0tCiAqfCAgZCAgICAgIFNpbmdsZSBkaWdpdCBkYXkgb2YgdGhlIG1vbnRoIChubyBsZWFkaW5nIDApCiAqfCAgZGQgICAgIERvdWJsZSBkaWdpdCBkYXkgb2YgdGhlIG1vbnRoCiAqfCAgZGRkICAgIFNob3J0IG5hbWUgZm9yIHRoZSBkYXkgb2YgdGhlIHdlZWsKICp8ICBkZGRkICAgTG9uZyBuYW1lIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAqfCAgTSAgICAgIFNpbmdsZSBkaWdpdCBtb250aCBvZiB0aGUgeWVhciAobm8gbGVhZGluZyAwKQogKnwgIE1NICAgICBEb3VibGUgZGlnaXQgbW9udGggb2YgdGhlIHllYXIKICp8ICBNTU0gICAgU2hvcnQgbmFtZSBmb3IgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyCiAqfCAgTU1NTSAgIExvbmcgbmFtZSBmb3IgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyCiAqfCAgeSAgICAgIERvdWJsZSBkaWdpdCB5ZWFyIG51bWJlciAobm8gbGVhZGluZyAwKQogKnwgIHl5ICAgICBEb3VibGUgZGlnaXQgeWVhciBudW1iZXIKICp8ICB5eXl5ICAgRm91ciBkaWdpdCB5ZWFyIG51bWJlcgogKnwgIGdnICAgICBFcmEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnQUQnLgogKiAgLSBUbyBvdXRwdXQgYW55IGxpdGVyYWwgY2hhcmFjdGVyIHRoYXQgY291bGQgYmUgbWlzaWRlbnRpZmllZCBhcyBhIHRva2VuLAogKiAgICBlbmNsb3NlIGl0IGluIHNpbmdsZSBxdW90ZXMuCiAqICAtIFRoZSBBc2NpaSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgbGNpZCBpcyBVbmljb2RlIG9ubHkuCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gbHBEYXRlU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoIExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBGb3JtYXQsIExQU1RSIGxwRGF0ZVN0ciwgSU5UIGNjaE91dCkKewogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcCwlcywlcCwlZClcbiIsbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscERhdGVTdHIsIGNjaE91dCk7CgogIHJldHVybiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRBKGxjaWQsIGR3RmxhZ3MgfCBEQVRFX0RBVEVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscERhdGVTdHIsIGNjaE91dCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXRXCVtLRVJORUwzMi5AXQogKgogKiBTZWUgR2V0RGF0ZUZvcm1hdEEuCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBGb3JtYXQsIExQV1NUUiBscERhdGVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0eCwweCUwOHgsJXAsJXMsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBscFRpbWUsCiAgICAgICAgZGVidWdzdHJfdyhscEZvcm1hdCksIGxwRGF0ZVN0ciwgY2NoT3V0KTsKCiAgcmV0dXJuIE5MU19HZXREYXRlVGltZUZvcm1hdFcobGNpZCwgZHdGbGFnc3xEQVRFX0RBVEVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscERhdGVTdHIsIGNjaE91dCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRBCVtLRVJORUwzMi5AXQogKgogKiBGb3JtYXQgYSB0aW1lIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgW0ldIExPQ0FMRV8gYW5kIFRJTUVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBUaW1lICAgIFtJXSBUaW1lIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBUaW1lU3RyIFtPXSBEZXN0aW5hdGlvbiBmb3IgZm9ybWF0dGVkIHN0cmluZwogKiAgY2NoT3V0ICAgIFtJXSBTaXplIG9mIGxwVGltZVN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIElmIGxwRm9ybWF0IGlzIE5VTEwsIGxwc3pWYWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdAogKiAgICBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkgYW5kIG1vZGlmaWVkIGJ5IGR3RmxhZ3MuCiAqICAtIGxwRm9ybWF0IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgYW5kIGZvcm1hdHRpbmcgdG9rZW5zLiBBbnkgY2hhcmFjdGVycwogKiAgICBpbiB0aGUgc3RyaW5nIGFyZSBjb3BpZWQgdmVyYmF0aW0gdG8gbHBUaW1lU3RyLCB3aXRoIHRva2VucyBiZWluZyByZXBsYWNlZAogKiAgICBieSB0aGUgdGltZSB2YWx1ZXMgdGhleSByZXByZXNlbnQuCiAqICAtIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBpbiBhIHRpbWUgZm9ybWF0IHN0cmluZzoKICp8ICBUb2tlbiAgTWVhbmluZwogKnwgIC0tLS0tICAtLS0tLS0tCiAqfCAgaCAgICAgIEhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyIGNsb2NrKQogKnwgIGhoICAgICBIb3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cyAoMTItaG91ciBjbG9jaykKICp8ICBIICAgICAgSG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIgY2xvY2spCiAqfCAgSEggICAgIEhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzICgyNC1ob3VyIGNsb2NrKQogKnwgIG0gICAgICBNaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqfCAgbW0gICAgIE1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICp8ICBzICAgICAgU2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKnwgIHNzICAgICBTZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqfCAgdCAgICAgIFNob3J0IHRpbWUgbWFya2VyIChlLmcuICJBIiBvciAiUCIpCiAqfCAgdHQgICAgIExvbmcgdGltZSBtYXJrZXIgKGUuZy4gIkFNIiwgIlBNIikKICogIC0gVG8gb3V0cHV0IGFueSBsaXRlcmFsIGNoYXJhY3RlciB0aGF0IGNvdWxkIGJlIG1pc2lkZW50aWZpZWQgYXMgYSB0b2tlbiwKICogICAgZW5jbG9zZSBpdCBpbiBzaW5nbGUgcXVvdGVzLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwVGltZVN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldFRpbWVGb3JtYXRBKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZvcm1hdCwgTFBTVFIgbHBUaW1lU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVwLCVzLCVwLCVkKVxuIixsY2lkLCBkd0ZsYWdzLCBscFRpbWUsCiAgICAgICAgZGVidWdzdHJfYShscEZvcm1hdCksIGxwVGltZVN0ciwgY2NoT3V0KTsKCiAgcmV0dXJuIE5MU19HZXREYXRlVGltZUZvcm1hdEEobGNpZCwgZHdGbGFnc3xUSU1FX1RJTUVWQVJTT05MWSwgbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRm9ybWF0LCBscFRpbWVTdHIsIGNjaE91dCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRXCVtLRVJORUwzMi5AXQogKgogKiBTZWUgR2V0VGltZUZvcm1hdEEuCiAqLwpJTlQgV0lOQVBJIEdldFRpbWVGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBGb3JtYXQsIExQV1NUUiBscFRpbWVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0eCwweCUwOHgsJXAsJXMsJXAsJWQpXG4iLGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl93KGxwRm9ybWF0KSwgbHBUaW1lU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0VyhsY2lkLCBkd0ZsYWdzfFRJTUVfVElNRVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwVGltZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRBCShLRVJORUwzMi5AKQogKgogKiBGb3JtYXQgYSBudW1iZXIgc3RyaW5nIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICAgIFtJXSBMT0NBTEVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBzelZhbHVlICAgW0ldIFN0cmluZyB0byBmb3JtYXQKICogIGxwRm9ybWF0ICAgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBOdW1iZXJTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgICBbSV0gU2l6ZSBvZiBscE51bWJlclN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIGxwc3pWYWx1ZSBjYW4gY29udGFpbiBvbmx5ICcwJyAtICc5JywgJy0nIGFuZCAnLicuCiAqICAtIElmIGxwRm9ybWF0IGlzIG5vbi1OVUxMLCBkd0ZsYWdzIG11c3QgYmUgMC4gSW4gdGhpcyBjYXNlIGxwc3pWYWx1ZSB3aWxsCiAqICAgIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkuCiAqICAtIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBudW1iZXIgc3RyaW5nIGlmIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZXhjZWVkcyB0aGUKICogICAgbG9jYWxlcyBub3JtYWwgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLgogKiAgLSBJZiBjY2hPdXQgaXMgMCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3cml0ZSB0byBscE51bWJlclN0ci4KICogIC0gVGhlIEFzY2lpIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBmYWlscyBpZiBsY2lkIGlzIFVuaWNvZGUgb25seS4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgd3JpdHRlbiB0byBscE51bWJlclN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IE5VTUJFUkZNVEEgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hPdXQpCnsKICBEV09SRCBjcCA9IENQX0FDUDsKICBXQ0hBUiBzekRlY1s4XSwgc3pHcnBbOF0sIHN6SW5bMTI4XSwgc3pPdXRbMTI4XTsKICBOVU1CRVJGTVRXIGZtdDsKICBjb25zdCBOVU1CRVJGTVRXICpwZm10ID0gTlVMTDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfYShscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscE51bWJlclN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldE51bWJlckZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghKGR3RmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCkpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOwogICAgY3AgPSBub2RlLT5kd0NvZGVQYWdlOwogIH0KCiAgaWYgKGxwRm9ybWF0KQogIHsKICAgIG1lbWNweSgmZm10LCBscEZvcm1hdCwgc2l6ZW9mKGZtdCkpOwogICAgcGZtdCA9ICZmbXQ7CiAgICBpZiAobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCwgLTEsIHN6RGVjLCBzaXplb2Yoc3pEZWMpL3NpemVvZihXQ0hBUikpOwogICAgICBmbXQubHBEZWNpbWFsU2VwID0gc3pEZWM7CiAgICB9CiAgICBpZiAobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApCiAgICB7CiAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwLCAtMSwgc3pHcnAsIHNpemVvZihzekdycCkvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scFRob3VzYW5kU2VwID0gc3pHcnA7CiAgICB9CiAgfQoKICBpZiAobHBzelZhbHVlKQogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBzelZhbHVlLCAtMSwgc3pJbiwgc2l6ZW9mKHN6SW4pL3NpemVvZihXQ0hBUikpOwoKICBpZiAoY2NoT3V0ID4gKGludCkoc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpKSkKICAgIGNjaE91dCA9IHNpemVvZihzek91dCkvc2l6ZW9mKFdDSEFSKTsKCiAgc3pPdXRbMF0gPSAnXDAnOwoKICBpUmV0ID0gR2V0TnVtYmVyRm9ybWF0VyhsY2lkLCBkd0ZsYWdzLCBscHN6VmFsdWUgPyBzekluIDogTlVMTCwgcGZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBscE51bWJlclN0ciA/IHN6T3V0IDogTlVMTCwgY2NoT3V0KTsKCiAgaWYgKHN6T3V0WzBdICYmIGxwTnVtYmVyU3RyKQogICAgV2lkZUNoYXJUb011bHRpQnl0ZShjcCwgMCwgc3pPdXQsIC0xLCBscE51bWJlclN0ciwgY2NoT3V0LCAwLCAwKTsKICByZXR1cm4gaVJldDsKfQoKLyogTnVtYmVyIHBhcnNpbmcgc3RhdGUgZmxhZ3MgKi8KI2RlZmluZSBORl9JU05FR0FUSVZFIDB4MSAgLyogJy0nIGZvdW5kICovCiNkZWZpbmUgTkZfSVNSRUFMICAgICAweDIgIC8qICcuJyBmb3VuZCAqLwojZGVmaW5lIE5GX0RJR0lUUyAgICAgMHg0ICAvKiAnMCctJzknIGZvdW5kICovCiNkZWZpbmUgTkZfRElHSVRTX09VVCAweDggIC8qIERpZ2l0cyBiZWZvcmUgdGhlICcuJyBmb3VuZCAqLwojZGVmaW5lIE5GX1JPVU5EICAgICAgMHgxMCAvKiBOdW1iZXIgbmVlZHMgdG8gYmUgcm91bmRlZCAqLwoKLyogRm9ybWF0dGluZyBvcHRpb25zIGZvciBOdW1iZXJzICovCiNkZWZpbmUgTkxTX05FR19QQVJFTlMgICAgICAwIC8qICIoMS4xKSIgKi8KI2RlZmluZSBOTFNfTkVHX0xFRlQgICAgICAgIDEgLyogIi0xLjEiICAqLwojZGVmaW5lIE5MU19ORUdfTEVGVF9TUEFDRSAgMiAvKiAiLSAxLjEiICovCiNkZWZpbmUgTkxTX05FR19SSUdIVCAgICAgICAzIC8qICIxLjEtIiAgKi8KI2RlZmluZSBOTFNfTkVHX1JJR0hUX1NQQUNFIDQgLyogIjEuMSAtIiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRXCShLRVJORUwzMi5AKQogKgogKiBTZWUgR2V0TnVtYmVyRm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IE5VTUJFUkZNVFcgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoT3V0KQp7CiAgV0NIQVIgc3pCdWZmWzEyOF0sICpzek91dCA9IHN6QnVmZiArIHNpemVvZihzekJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSAtIDE7CiAgV0NIQVIgc3pOZWdCdWZmWzhdOwogIGNvbnN0IFdDSEFSICpscHN6TmVnID0gTlVMTCwgKmxwc3pOZWdTdGFydCwgKnN6U3JjOwogIERXT1JEIGR3U3RhdGUgPSAwLCBkd0RlY2ltYWxzID0gMCwgZHdHcm91cENvdW50ID0gMCwgZHdDdXJyZW50R3JvdXBDb3VudCA9IDA7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcywlcCwlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGRlYnVnc3RyX3cobHBzelZhbHVlKSwKICAgICAgICBscEZvcm1hdCwgbHBOdW1iZXJTdHIsIGNjaE91dCk7CgogIGlmICghbHBzelZhbHVlIHx8IGNjaE91dCA8IDAgfHwgKGNjaE91dCA+IDAgJiYgIWxwTnVtYmVyU3RyKSB8fAogICAgICAhSXNWYWxpZExvY2FsZShsY2lkLCAwKSB8fAogICAgICAobHBGb3JtYXQgJiYgKGR3RmxhZ3MgfHwgIWxwRm9ybWF0LT5scERlY2ltYWxTZXAgfHwgIWxwRm9ybWF0LT5scFRob3VzYW5kU2VwKSkpCiAgewpHZXROdW1iZXJGb3JtYXRXX0Vycm9yOgogICAgU2V0TGFzdEVycm9yKGxwRm9ybWF0ICYmIGR3RmxhZ3MgPyBFUlJPUl9JTlZBTElEX0ZMQUdTIDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZiAoIWxwRm9ybWF0KQogIHsKICAgIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZSA9IE5MU19HZXRGb3JtYXRzKGxjaWQsIGR3RmxhZ3MpOwoKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRXX0Vycm9yOwogICAgbHBGb3JtYXQgPSAmbm9kZS0+Zm10OwogICAgbHBzek5lZ1N0YXJ0ID0gbHBzek5lZyA9IEdldE5lZ2F0aXZlKG5vZGUpOwogIH0KICBlbHNlCiAgewogICAgR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NORUdBVElWRVNJR058KGR3RmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpLAogICAgICAgICAgICAgICAgICAgc3pOZWdCdWZmLCBzaXplb2Yoc3pOZWdCdWZmKS9zaXplb2YoV0NIQVIpKTsKICAgIGxwc3pOZWdTdGFydCA9IGxwc3pOZWcgPSBzek5lZ0J1ZmY7CiAgfQogIGxwc3pOZWcgPSBscHN6TmVnICsgc3RybGVuVyhscHN6TmVnKSAtIDE7CgogIGR3RmxhZ3MgJj0gKExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgogIC8qIEZvcm1hdCB0aGUgbnVtYmVyIGJhY2t3YXJkcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciAqLwoKICBzelNyYyA9IGxwc3pWYWx1ZTsKICAqc3pPdXQtLSA9ICdcMCc7CgogIC8qIENoZWNrIHRoZSBudW1iZXIgZm9yIHZhbGlkaXR5ICovCiAgd2hpbGUgKCpzelNyYykKICB7CiAgICBpZiAoKnN6U3JjID49ICcwJyAmJiAqc3pTcmMgPD0gJzknKQogICAgewogICAgICBkd1N0YXRlIHw9IE5GX0RJR0lUUzsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZHdEZWNpbWFscysrOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICctJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUpCiAgICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRXX0Vycm9yOyAvKiAnLScgbm90IGZpcnN0IGNoYXJhY3RlciAqLwogICAgICBkd1N0YXRlIHw9IE5GX0lTTkVHQVRJVkU7CiAgICB9CiAgICBlbHNlIGlmICgqc3pTcmMgPT0gJy4nKQogICAgewogICAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7IC8qIE1vcmUgdGhhbiBvbmUgJy4nICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNSRUFMOwogICAgfQogICAgZWxzZQogICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7IC8qIEludmFsaWQgY2hhciAqLwogICAgc3pTcmMrKzsKICB9CiAgc3pTcmMtLTsgLyogUG9pbnQgdG8gbGFzdCBjaGFyYWN0ZXIgKi8KCiAgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUUykpCiAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7IC8qIE5vIGRpZ2l0cyAqLwoKICAvKiBBZGQgYW55IHRyYWlsaW5nIG5lZ2F0aXZlIHNpZ24gKi8KICBpZiAoZHdTdGF0ZSAmIE5GX0lTTkVHQVRJVkUpCiAgewogICAgc3dpdGNoIChscEZvcm1hdC0+TmVnYXRpdmVPcmRlcikKICAgIHsKICAgIGNhc2UgTkxTX05FR19QQVJFTlM6CiAgICAgICpzek91dC0tID0gJyknOwogICAgICBicmVhazsKICAgIGNhc2UgTkxTX05FR19SSUdIVDoKICAgIGNhc2UgTkxTX05FR19SSUdIVF9TUEFDRToKICAgICAgd2hpbGUgKGxwc3pOZWcgPj0gbHBzek5lZ1N0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pOZWctLTsKICAgICBpZiAobHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIgPT0gTkxTX05FR19SSUdIVF9TUEFDRSkKICAgICAgICpzek91dC0tID0gJyAnOwogICAgICBicmVhazsKICAgIH0KICB9CgogIC8qIENvcHkgYWxsIGRpZ2l0cyB1cCB0byB0aGUgZGVjaW1hbCBwb2ludCAqLwogIGlmICghbHBGb3JtYXQtPk51bURpZ2l0cykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpIC8qIERvbid0IHdyaXRlIGFueSBkZWNpbWFscyBvciBhIHNlcGFyYXRvciAqLwogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBMUFdTVFIgbHBzekRlYyA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scERlY2ltYWxTZXApIC0gMTsKCiAgICBpZiAoZHdEZWNpbWFscyA8PSBscEZvcm1hdC0+TnVtRGlnaXRzKQogICAgewogICAgICBkd0RlY2ltYWxzID0gbHBGb3JtYXQtPk51bURpZ2l0cyAtIGR3RGVjaW1hbHM7CiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIFBhZCB0byBjb3JyZWN0IG51bWJlciBvZiBkcCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICBkd0RlY2ltYWxzIC09IGxwRm9ybWF0LT5OdW1EaWdpdHM7CiAgICAgIC8qIFNraXAgZXhjZXNzIGRlY2ltYWxzLCBhbmQgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgdG8gcm91bmQgdGhlIG51bWJlciAqLwogICAgICB3aGlsZSAoZHdEZWNpbWFscy0tKQogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICB9CgogICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICB7CiAgICAgIHdoaWxlICgqc3pTcmMgIT0gJy4nKQogICAgICB7CiAgICAgICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgICAgICB7CiAgICAgICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICAgICAqc3pPdXQtLSA9ICgqc3pTcmMpKzE7CiAgICAgICAgICB9CiAgICAgICAgICBzelNyYy0tOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOyAvKiBXcml0ZSBleGlzdGluZyBkZWNpbWFscyAqLwogICAgICB9CiAgICAgIHN6U3JjLS07IC8qIFNraXAgJy4nICovCiAgICB9CgogICAgd2hpbGUgKGxwc3pEZWMgPj0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkKICAgICAgKnN6T3V0LS0gPSAqbHBzekRlYy0tOyAvKiBXcml0ZSBkZWNpbWFsIHNlcGFyYXRvciAqLwogIH0KCiAgZHdHcm91cENvdW50ID0gbHBGb3JtYXQtPkdyb3VwaW5nID09IDMyID8gMyA6IGxwRm9ybWF0LT5Hcm91cGluZzsKCiAgLyogV3JpdGUgdGhlIHJlbWFpbmluZyB3aG9sZSBudW1iZXIgZGlnaXRzLCBpbmNsdWRpbmcgZ3JvdXBpbmcgY2hhcnMgKi8KICB3aGlsZSAoc3pTcmMgPj0gbHBzelZhbHVlICYmICpzelNyYyA+PSAnMCcgJiYgKnN6U3JjIDw9ICc5JykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgewogICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgKnN6T3V0LS0gPSAoKnN6U3JjKSsxOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgICBlbHNlCiAgICAgICpzek91dC0tID0gKnN6U3JjLS07CgogICAgZHdTdGF0ZSB8PSBORl9ESUdJVFNfT1VUOwogICAgZHdDdXJyZW50R3JvdXBDb3VudCsrOwogICAgaWYgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiBkd0N1cnJlbnRHcm91cENvdW50ID09IGR3R3JvdXBDb3VudCAmJiAqc3pTcmMgIT0gJy0nKQogICAgewogICAgICBMUFdTVFIgbHBzekdycCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwICsgc3RybGVuVyhscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkgLSAxOwoKICAgICAgd2hpbGUgKGxwc3pHcnAgPj0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzekdycC0tOyAvKiBXcml0ZSBncm91cGluZyBjaGFyICovCgogICAgICBkd0N1cnJlbnRHcm91cENvdW50ID0gMDsKICAgICAgaWYgKGxwRm9ybWF0LT5Hcm91cGluZyA9PSAzMikKICAgICAgICBkd0dyb3VwQ291bnQgPSAyOyAvKiBJbmRpYyBncm91cGluZzogMyB0aGVuIDIgKi8KICAgIH0KICB9CiAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICB7CiAgICAqc3pPdXQtLSA9ICcxJzsgLyogZS5nLiAuNiA+IDEuMCAqLwogIH0KICBlbHNlIGlmICghKGR3U3RhdGUgJiBORl9ESUdJVFNfT1VUKSAmJiBscEZvcm1hdC0+TGVhZGluZ1plcm8pCiAgICAqc3pPdXQtLSA9ICcwJzsgLyogQWRkIGxlYWRpbmcgMCBpZiB3ZSBoYXZlIG5vIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgKi8KCiAgLyogQWRkIGFueSBsZWFkaW5nIG5lZ2F0aXZlIHNpZ24gKi8KICBpZiAoZHdTdGF0ZSAmIE5GX0lTTkVHQVRJVkUpCiAgewogICAgc3dpdGNoIChscEZvcm1hdC0+TmVnYXRpdmVPcmRlcikKICAgIHsKICAgIGNhc2UgTkxTX05FR19QQVJFTlM6CiAgICAgICpzek91dC0tID0gJygnOwogICAgICBicmVhazsKICAgIGNhc2UgTkxTX05FR19MRUZUX1NQQUNFOgogICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgLyogRmFsbCB0aHJvdWdoICovCiAgICBjYXNlIE5MU19ORUdfTEVGVDoKICAgICAgd2hpbGUgKGxwc3pOZWcgPj0gbHBzek5lZ1N0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pOZWctLTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHN6T3V0Kys7CgogIGlSZXQgPSBzdHJsZW5XKHN6T3V0KSArIDE7CiAgaWYgKGNjaE91dCkKICB7CiAgICBpZiAoaVJldCA8PSBjY2hPdXQpCiAgICAgIG1lbWNweShscE51bWJlclN0ciwgc3pPdXQsIGlSZXQgKiBzaXplb2YoV0NIQVIpKTsKICAgIGVsc2UKICAgIHsKICAgICAgbWVtY3B5KGxwTnVtYmVyU3RyLCBzek91dCwgY2NoT3V0ICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGxwTnVtYmVyU3RyW2NjaE91dCAtIDFdID0gJ1wwJzsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBpUmV0ID0gMDsKICAgIH0KICB9CiAgcmV0dXJuIGlSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRBCShLRVJORUwzMi5AKQogKgogKiBGb3JtYXQgYSBjdXJyZW5jeSBzdHJpbmcgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogKgogKiBQQVJBTVMKICogIGxjaWQgICAgICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgICAgIFtJXSBMT0NBTEVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBzelZhbHVlICAgICBbSV0gU3RyaW5nIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgICAgICBbSV0gRm9ybWF0dGluZyBvdmVycmlkZXMKICogIGxwQ3VycmVuY3lTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgICAgIFtJXSBTaXplIG9mIGxwQ3VycmVuY3lTdHIsIG9yIDAgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHRpbmcgc2l6ZQogKgogKiBOT1RFUwogKiAgLSBscHN6VmFsdWUgY2FuIGNvbnRhaW4gb25seSAnMCcgLSAnOScsICctJyBhbmQgJy4nLgogKiAgLSBJZiBscEZvcm1hdCBpcyBub24tTlVMTCwgZHdGbGFncyBtdXN0IGJlIDAuIEluIHRoaXMgY2FzZSBscHN6VmFsdWUgd2lsbAogKiAgICBiZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgZGV0YWlscyByZXR1cm5lZCBieSBHZXRMb2NhbGVJbmZvQSgpLgogKiAgLSBUaGlzIGZ1bmN0aW9uIHJvdW5kcyB0aGUgY3VycmVuY3kgaWYgdGhlIG51bWJlciBvZiBkZWNpbWFscyBleGNlZWRzIHRoZQogKiAgICBsb2NhbGVzIG51bWJlciBvZiBjdXJyZW5jeSBkZWNpbWFsIHBsYWNlcy4KICogIC0gSWYgY2NoT3V0IGlzIDAsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd3JpdGUgdG8gbHBDdXJyZW5jeVN0ci4KICogIC0gVGhlIEFzY2lpIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBmYWlscyBpZiBsY2lkIGlzIFVuaWNvZGUgb25seS4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgd3JpdHRlbiB0byBscE51bWJlclN0ciwgb3IgdGhhdCB3b3VsZAogKiAgICAgICAgICAgaGF2ZSBiZWVuIHdyaXR0ZW4sIGlmIGNjaE91dCBpcyAwLgogKiAgRmFpbHVyZTogMC4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0QShMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscHN6VmFsdWUsICBjb25zdCBDVVJSRU5DWUZNVEEgKmxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoT3V0KQp7CiAgRFdPUkQgY3AgPSBDUF9BQ1A7CiAgV0NIQVIgc3pEZWNbOF0sIHN6R3JwWzhdLCBzekN5WzhdLCBzekluWzEyOF0sIHN6T3V0WzEyOF07CiAgQ1VSUkVOQ1lGTVRXIGZtdDsKICBjb25zdCBDVVJSRU5DWUZNVFcgKnBmbXQgPSBOVUxMOwogIElOVCBpUmV0OwoKICBUUkFDRSgiKDB4JTA0eCwweCUwOHgsJXMsJXAsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBkZWJ1Z3N0cl9hKGxwc3pWYWx1ZSksCiAgICAgICAgbHBGb3JtYXQsIGxwQ3VycmVuY3lTdHIsIGNjaE91dCk7CgogIGlmIChOTFNfSXNVbmljb2RlT25seUxjaWQobGNpZCkpCiAgewpHZXRDdXJyZW5jeUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjoKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghKGR3RmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCkpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI7CiAgICBjcCA9IG5vZGUtPmR3Q29kZVBhZ2U7CiAgfQoKICBpZiAobHBGb3JtYXQpCiAgewogICAgbWVtY3B5KCZmbXQsIGxwRm9ybWF0LCBzaXplb2YoZm10KSk7CiAgICBwZm10ID0gJmZtdDsKICAgIGlmIChscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwLCAtMSwgc3pEZWMsIHNpemVvZihzekRlYykvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scERlY2ltYWxTZXAgPSBzekRlYzsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAsIC0xLCBzekdycCwgc2l6ZW9mKHN6R3JwKS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwVGhvdXNhbmRTZXAgPSBzekdycDsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wsIC0xLCBzekN5LCBzaXplb2Yoc3pDeSkvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scEN1cnJlbmN5U3ltYm9sID0gc3pDeTsKICAgIH0KICB9CgogIGlmIChscHN6VmFsdWUpCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscHN6VmFsdWUsIC0xLCBzekluLCBzaXplb2Yoc3pJbikvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBHZXRDdXJyZW5jeUZvcm1hdFcobGNpZCwgZHdGbGFncywgbHBzelZhbHVlID8gc3pJbiA6IE5VTEwsIHBmbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEN1cnJlbmN5U3RyID8gc3pPdXQgOiBOVUxMLCBjY2hPdXQpOwoKICBpZiAoc3pPdXRbMF0gJiYgbHBDdXJyZW5jeVN0cikKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIDAsIHN6T3V0LCAtMSwgbHBDdXJyZW5jeVN0ciwgY2NoT3V0LCAwLCAwKTsKICByZXR1cm4gaVJldDsKfQoKLyogRm9ybWF0dGluZyBzdGF0ZXMgZm9yIEN1cnJlbmNpZXMuIFdlIHVzZSBmbGFncyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLiAqLwojZGVmaW5lIENGX1BBUkVOUyAgICAgICAweDEgIC8qIFBhcmVudGhlc2VzICAgICAgKi8KI2RlZmluZSBDRl9NSU5VU19MRUZUICAgMHgyICAvKiAnLScgdG8gdGhlIGxlZnQgICovCiNkZWZpbmUgQ0ZfTUlOVVNfUklHSFQgIDB4NCAgLyogJy0nIHRvIHRoZSByaWdodCAqLwojZGVmaW5lIENGX01JTlVTX0JFRk9SRSAweDggIC8qICctJyBiZWZvcmUgJyQnICAgKi8KI2RlZmluZSBDRl9DWV9MRUZUICAgICAgMHgxMCAvKiAnJCcgdG8gdGhlIGxlZnQgICovCiNkZWZpbmUgQ0ZfQ1lfUklHSFQgICAgIDB4MjAgLyogJyQnIHRvIHRoZSByaWdodCAqLwojZGVmaW5lIENGX0NZX1NQQUNFICAgICAweDQwIC8qICcgJyBieSAnJCcgICAgICAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRXCShLRVJORUwzMi5AKQogKgogKiBTZWUgR2V0Q3VycmVuY3lGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IENVUlJFTkNZRk1UVyAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoT3V0KQp7CiAgc3RhdGljIGNvbnN0IEJZVEUgTkxTX05lZ0N5Rm9ybWF0c1sxNl0gPQogIHsKICAgIENGX1BBUkVOU3xDRl9DWV9MRUZULCAgICAgICAgICAgICAgICAgICAgICAgLyogKCQxLjEpICovCiAgICBDRl9NSU5VU19MRUZUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9MRUZULCAgIC8qIC0kMS4xICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZULCAgICAgICAgICAgICAgICAgICAvKiAkLTEuMSAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX0xFRlQsICAgICAgICAgICAgICAgICAgLyogJDEuMS0gICovCiAgICBDRl9QQVJFTlN8Q0ZfQ1lfUklHSFQsICAgICAgICAgICAgICAgICAgICAgIC8qICgxLjEkKSAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9SSUdIVCwgICAgICAgICAgICAgICAgICAvKiAtMS4xJCAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9SSUdIVCwgLyogMS4xLSQgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVCwgICAgICAgICAgICAgICAgIC8qIDEuMSQtICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgICAgICAvKiAtMS4xICQgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgLyogLSQgMS4xICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgICAgIC8qIDEuMSAkLSAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgICAgLyogJCAxLjEtICAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgICAgICAvKiAkIC0xLjEgICovCiAgICBDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsIC8qIDEuMS0gJCAqLwogICAgQ0ZfUEFSRU5TfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgICAgICAgICAvKiAoJCAxLjEpICovCiAgICBDRl9QQVJFTlN8Q0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsICAgICAgICAgIC8qICgxLjEgJCkgKi8KICB9OwogIHN0YXRpYyBjb25zdCBCWVRFIE5MU19Qb3NDeUZvcm1hdHNbNF0gPQogIHsKICAgIENGX0NZX0xFRlQsICAgICAgICAgICAgICAvKiAkMS4xICAqLwogICAgQ0ZfQ1lfUklHSFQsICAgICAgICAgICAgIC8qIDEuMSQgICovCiAgICBDRl9DWV9MRUZUfENGX0NZX1NQQUNFLCAgLyogJCAxLjEgKi8KICAgIENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAvKiAxLjEgJCAqLwogIH07CiAgV0NIQVIgc3pCdWZmWzEyOF0sICpzek91dCA9IHN6QnVmZiArIHNpemVvZihzekJ1ZmYpIC8gc2l6ZW9mKFdDSEFSKSAtIDE7CiAgV0NIQVIgc3pOZWdCdWZmWzhdOwogIGNvbnN0IFdDSEFSICpscHN6TmVnID0gTlVMTCwgKmxwc3pOZWdTdGFydCwgKnN6U3JjLCAqbHBzekN5LCAqbHBzekN5U3RhcnQ7CiAgRFdPUkQgZHdTdGF0ZSA9IDAsIGR3RGVjaW1hbHMgPSAwLCBkd0dyb3VwQ291bnQgPSAwLCBkd0N1cnJlbnRHcm91cENvdW50ID0gMCwgZHdGbXQ7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcywlcCwlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGRlYnVnc3RyX3cobHBzelZhbHVlKSwKICAgICAgICBscEZvcm1hdCwgbHBDdXJyZW5jeVN0ciwgY2NoT3V0KTsKCiAgaWYgKCFscHN6VmFsdWUgfHwgY2NoT3V0IDwgMCB8fCAoY2NoT3V0ID4gMCAmJiAhbHBDdXJyZW5jeVN0cikgfHwKICAgICAgIUlzVmFsaWRMb2NhbGUobGNpZCwgMCkgfHwKICAgICAgKGxwRm9ybWF0ICYmIChkd0ZsYWdzIHx8ICFscEZvcm1hdC0+bHBEZWNpbWFsU2VwIHx8ICFscEZvcm1hdC0+bHBUaG91c2FuZFNlcCB8fAogICAgICAhbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wgfHwgbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIgPiAxNSB8fAogICAgICBscEZvcm1hdC0+UG9zaXRpdmVPcmRlciA+IDMpKSkKICB7CkdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjoKICAgIFNldExhc3RFcnJvcihscEZvcm1hdCAmJiBkd0ZsYWdzID8gRVJST1JfSU5WQUxJRF9GTEFHUyA6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCFscEZvcm1hdCkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKCiAgICBpZiAoIW5vZGUpCiAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOwogICAgbHBGb3JtYXQgPSAmbm9kZS0+Y3lmbXQ7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gR2V0TmVnYXRpdmUobm9kZSk7CiAgfQogIGVsc2UKICB7CiAgICBHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU05FR0FUSVZFU0lHTnwoZHdGbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSksCiAgICAgICAgICAgICAgICAgICBzek5lZ0J1ZmYsIHNpemVvZihzek5lZ0J1ZmYpL3NpemVvZihXQ0hBUikpOwogICAgbHBzek5lZ1N0YXJ0ID0gbHBzek5lZyA9IHN6TmVnQnVmZjsKICB9CiAgZHdGbGFncyAmPSAoTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCiAgbHBzek5lZyA9IGxwc3pOZWcgKyBzdHJsZW5XKGxwc3pOZWcpIC0gMTsKICBscHN6Q3lTdGFydCA9IGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sOwogIGxwc3pDeSA9IGxwc3pDeVN0YXJ0ICsgc3RybGVuVyhscHN6Q3lTdGFydCkgLSAxOwoKICAvKiBGb3JtYXQgdGhlIGN1cnJlbmN5IGJhY2t3YXJkcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciAqLwoKICBzelNyYyA9IGxwc3pWYWx1ZTsKICAqc3pPdXQtLSA9ICdcMCc7CgogIC8qIENoZWNrIHRoZSBudW1iZXIgZm9yIHZhbGlkaXR5ICovCiAgd2hpbGUgKCpzelNyYykKICB7CiAgICBpZiAoKnN6U3JjID49ICcwJyAmJiAqc3pTcmMgPD0gJzknKQogICAgewogICAgICBkd1N0YXRlIHw9IE5GX0RJR0lUUzsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZHdEZWNpbWFscysrOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICctJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUpCiAgICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qICctJyBub3QgZmlyc3QgY2hhcmFjdGVyICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNORUdBVElWRTsKICAgIH0KICAgIGVsc2UgaWYgKCpzelNyYyA9PSAnLicpCiAgICB7CiAgICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOyAvKiBNb3JlIHRoYW4gb25lICcuJyAqLwogICAgICBkd1N0YXRlIHw9IE5GX0lTUkVBTDsKICAgIH0KICAgIGVsc2UKICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qIEludmFsaWQgY2hhciAqLwogICAgc3pTcmMrKzsKICB9CiAgc3pTcmMtLTsgLyogUG9pbnQgdG8gbGFzdCBjaGFyYWN0ZXIgKi8KCiAgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUUykpCiAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogTm8gZGlnaXRzICovCgogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICAgIGR3Rm10ID0gTkxTX05lZ0N5Rm9ybWF0c1tscEZvcm1hdC0+TmVnYXRpdmVPcmRlcl07CiAgZWxzZQogICAgZHdGbXQgPSBOTFNfUG9zQ3lGb3JtYXRzW2xwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyXTsKCiAgLyogQWRkIGFueSB0cmFpbGluZyBuZWdhdGl2ZSBvciBjdXJyZW5jeSBzaWducyAqLwogIGlmIChkd0ZtdCAmIENGX1BBUkVOUykKICAgICpzek91dC0tID0gJyknOwoKICB3aGlsZSAoZHdGbXQgJiAoQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFQpKQogIHsKICAgIHN3aXRjaCAoZHdGbXQgJiAoQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUKSkKICAgIHsKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFQ6CiAgICBjYXNlIENGX01JTlVTX1JJR0hUfENGX0NZX1JJR0hUOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgICBkd0ZtdCAmPSB+Q0ZfTUlOVVNfUklHSFQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ0ZfQ1lfUklHSFQ6CiAgICBjYXNlIENGX01JTlVTX0JFRk9SRXxDRl9DWV9SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUOgogICAgICB3aGlsZSAobHBzekN5ID49IGxwc3pDeVN0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pDeS0tOwogICAgICBpZiAoZHdGbXQgJiBDRl9DWV9TUEFDRSkKICAgICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgZHdGbXQgJj0gfihDRl9DWV9SSUdIVHxDRl9NSU5VU19CRUZPUkUpOwogICAgICBicmVhazsKICAgIH0KICB9CgogIC8qIENvcHkgYWxsIGRpZ2l0cyB1cCB0byB0aGUgZGVjaW1hbCBwb2ludCAqLwogIGlmICghbHBGb3JtYXQtPk51bURpZ2l0cykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpIC8qIERvbid0IHdyaXRlIGFueSBkZWNpbWFscyBvciBhIHNlcGFyYXRvciAqLwogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBMUFdTVFIgbHBzekRlYyA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scERlY2ltYWxTZXApIC0gMTsKCiAgICBpZiAoZHdEZWNpbWFscyA8PSBscEZvcm1hdC0+TnVtRGlnaXRzKQogICAgewogICAgICBkd0RlY2ltYWxzID0gbHBGb3JtYXQtPk51bURpZ2l0cyAtIGR3RGVjaW1hbHM7CiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIFBhZCB0byBjb3JyZWN0IG51bWJlciBvZiBkcCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICBkd0RlY2ltYWxzIC09IGxwRm9ybWF0LT5OdW1EaWdpdHM7CiAgICAgIC8qIFNraXAgZXhjZXNzIGRlY2ltYWxzLCBhbmQgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgdG8gcm91bmQgdGhlIG51bWJlciAqLwogICAgICB3aGlsZSAoZHdEZWNpbWFscy0tKQogICAgICB7CiAgICAgICAgaWYgKCpzelNyYyA+PSAnNScgfHwgKCpzelNyYyA9PSAnNCcgJiYgKGR3U3RhdGUgJiBORl9ST1VORCkpKQogICAgICAgICAgZHdTdGF0ZSB8PSBORl9ST1VORDsKICAgICAgICBlbHNlCiAgICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICBzelNyYy0tOwogICAgICB9CiAgICB9CgogICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICB7CiAgICAgIHdoaWxlICgqc3pTcmMgIT0gJy4nKQogICAgICB7CiAgICAgICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgICAgICB7CiAgICAgICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICAgICAqc3pPdXQtLSA9ICgqc3pTcmMpKzE7CiAgICAgICAgICB9CiAgICAgICAgICBzelNyYy0tOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOyAvKiBXcml0ZSBleGlzdGluZyBkZWNpbWFscyAqLwogICAgICB9CiAgICAgIHN6U3JjLS07IC8qIFNraXAgJy4nICovCiAgICB9CiAgICB3aGlsZSAobHBzekRlYyA+PSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgICAqc3pPdXQtLSA9ICpscHN6RGVjLS07IC8qIFdyaXRlIGRlY2ltYWwgc2VwYXJhdG9yICovCiAgfQoKICBkd0dyb3VwQ291bnQgPSBscEZvcm1hdC0+R3JvdXBpbmc7CgogIC8qIFdyaXRlIHRoZSByZW1haW5pbmcgd2hvbGUgbnVtYmVyIGRpZ2l0cywgaW5jbHVkaW5nIGdyb3VwaW5nIGNoYXJzICovCiAgd2hpbGUgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiAqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgewogICAgaWYgKGR3U3RhdGUgJiBORl9ST1VORCkKICAgIHsKICAgICAgaWYgKCpzelNyYyA9PSAnOScpCiAgICAgICAgKnN6T3V0LS0gPSAnMCc7IC8qIGNvbnRpbnVlIHJvdW5kaW5nICovCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgfQogICAgICBzelNyYy0tOwogICAgfQogICAgZWxzZQogICAgICAqc3pPdXQtLSA9ICpzelNyYy0tOwoKICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTX09VVDsKICAgIGR3Q3VycmVudEdyb3VwQ291bnQrKzsKICAgIGlmIChzelNyYyA+PSBscHN6VmFsdWUgJiYgZHdDdXJyZW50R3JvdXBDb3VudCA9PSBkd0dyb3VwQ291bnQpCiAgICB7CiAgICAgIExQV1NUUiBscHN6R3JwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKSAtIDE7CgogICAgICB3aGlsZSAobHBzekdycCA+PSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6R3JwLS07IC8qIFdyaXRlIGdyb3VwaW5nIGNoYXIgKi8KCiAgICAgIGR3Q3VycmVudEdyb3VwQ291bnQgPSAwOwogICAgfQogIH0KICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgKnN6T3V0LS0gPSAnMSc7IC8qIGUuZy4gLjYgPiAxLjAgKi8KICBlbHNlIGlmICghKGR3U3RhdGUgJiBORl9ESUdJVFNfT1VUKSAmJiBscEZvcm1hdC0+TGVhZGluZ1plcm8pCiAgICAqc3pPdXQtLSA9ICcwJzsgLyogQWRkIGxlYWRpbmcgMCBpZiB3ZSBoYXZlIG5vIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgKi8KCiAgLyogQWRkIGFueSBsZWFkaW5nIG5lZ2F0aXZlIG9yIGN1cnJlbmN5IHNpZ24gKi8KICB3aGlsZSAoZHdGbXQgJiAoQ0ZfTUlOVVNfTEVGVHxDRl9DWV9MRUZUKSkKICB7CiAgICBzd2l0Y2ggKGR3Rm10ICYgKENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlQpKQogICAgewogICAgY2FzZSBDRl9NSU5VU19MRUZUOgogICAgY2FzZSBDRl9NSU5VU19MRUZUfENGX0NZX0xFRlQ6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgIGR3Rm10ICY9IH5DRl9NSU5VU19MRUZUOwogICAgICBicmVhazsKCiAgICBjYXNlIENGX0NZX0xFRlQ6CiAgICBjYXNlIENGX0NZX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFOgogICAgY2FzZSBDRl9NSU5VU19MRUZUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9MRUZUOgogICAgICBpZiAoZHdGbXQgJiBDRl9DWV9TUEFDRSkKICAgICAgICAqc3pPdXQtLSA9ICcgJzsKICAgICAgd2hpbGUgKGxwc3pDeSA+PSBscHN6Q3lTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6Q3ktLTsKICAgICAgZHdGbXQgJj0gfihDRl9DWV9MRUZUfENGX01JTlVTX0JFRk9SRSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoZHdGbXQgJiBDRl9QQVJFTlMpCiAgICAqc3pPdXQtLSA9ICcoJzsKICBzek91dCsrOwoKICBpUmV0ID0gc3RybGVuVyhzek91dCkgKyAxOwogIGlmIChjY2hPdXQpCiAgewogICAgaWYgKGlSZXQgPD0gY2NoT3V0KQogICAgICBtZW1jcHkobHBDdXJyZW5jeVN0ciwgc3pPdXQsIGlSZXQgKiBzaXplb2YoV0NIQVIpKTsKICAgIGVsc2UKICAgIHsKICAgICAgbWVtY3B5KGxwQ3VycmVuY3lTdHIsIHN6T3V0LCBjY2hPdXQgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgbHBDdXJyZW5jeVN0cltjY2hPdXQgLSAxXSA9ICdcMCc7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgaVJldCA9IDA7CiAgICB9CiAgfQogIHJldHVybiBpUmV0Owp9CgovKiBGSVhNRTogRXZlcnl0aGluZyBiZWxvdyBoZXJlIG5lZWRzIHRvIG1vdmUgc29tZXdoZXJlIGVsc2UgYWxvbmcgd2l0aCB0aGUKICogICAgICAgIG90aGVyIEVudW1YWFggZnVuY3Rpb25zLCB3aGVuIGEgbWV0aG9kIGZvciBzdG9yaW5nIHJlc291cmNlcyBmb3IKICogICAgICAgIGFsdGVybmF0ZSBjYWxlbmRhcnMgaXMgZGV0ZXJtaW5lZC4KICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0V4QSAgICAoS0VSTkVMMzIuQCkKICoKICogRklYTUU6IE1TRE4gbWVudGlvbnMgb25seSBMT0NBTEVfVVNFX0NQX0FDUCwgc2hvdWxkIHdlIGhhbmRsZQogKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgaGVyZSBhcyB3ZWxsPwogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzRXhBKERBVEVGTVRfRU5VTVBST0NFWEEgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgQ0FMSUQgY2FsX2lkOwogICAgY2hhciBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKCFHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfSUNBTEVOREFSVFlQRXxMT0NBTEVfUkVUVVJOX05VTUJFUiwgKExQV1NUUikmY2FsX2lkLCBzaXplb2YoY2FsX2lkKS9zaXplb2YoV0NIQVIpKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NMT05HREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0V4VyAgICAoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0V4VyhEQVRFRk1UX0VOVU1QUk9DRVhXIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIENBTElEIGNhbF9pZDsKICAgIFdDSEFSIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAoIUdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFfExPQ0FMRV9SRVRVUk5fTlVNQkVSLCAoTFBXU1RSKSZjYWxfaWQsIHNpemVvZihjYWxfaWQpL3NpemVvZihXQ0hBUikpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NTSE9SVERBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICoKICogRklYTUU6IE1TRE4gbWVudGlvbnMgb25seSBMT0NBTEVfVVNFX0NQX0FDUCwgc2hvdWxkIHdlIGhhbmRsZQogKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgaGVyZSBhcyB3ZWxsPwogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzQShEQVRFRk1UX0VOVU1QUk9DQSBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBjaGFyIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NTSE9SVERBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NMT05HREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX1lFQVJNT05USDoKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NZRUFSTU9OVEggfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c1coREFURUZNVF9FTlVNUFJPQ1cgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgV0NIQVIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1NIT1JUREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNBCShLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKFRJTUVGTVRfRU5VTVBST0NBIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIGNoYXIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TVElNRUZPUk1BVCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVyhUSU1FRk1UX0VOVU1QUk9DVyBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBXQ0hBUiBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NUSU1FRk9STUFUIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIHRpbWUgZm9ybWF0ICglZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcgPGludGVybmFsPgogKiBFbnVtZXJhdGVzIGNhbGVuZGFyIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmllZCBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgICBjYWxpbmZvcHJvYyBbSV0gUG9pbnRlciB0byB0aGUgY2FsbGJhY2sKICogICAgbG9jYWxlICAgICAgW0ldIFRoZSBsb2NhbGUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIGNhbGVuZGFyIGluZm9ybWF0aW9uLgogKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCBieSB0aGUKICogICAgICAgICAgICAgICAgICAgIE1BS0VMQ0lEIG1hY3JvLCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbG9jYWxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMRV9VU0VSX0RFRkFVTFQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBkZWZhdWx0IHVzZXIgbG9jYWxlLgogKiAgICBjYWxlbmRhciAgICBbSV0gVGhlIGNhbGVuZGFyIGZvciB3aGljaCBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQsIG9yCiAqICAgICAgICAgICAgICAgICAgICBFTlVNX0FMTF9DQUxFTkRBUlMuCiAqICAgIGNhbHR5cGUgICAgIFtJXSBUaGUgdHlwZSBvZiBjYWxlbmRhciBpbmZvcm1hdGlvbiB0byBiZSByZXR1cm5lZC4gTm90ZQogKiAgICAgICAgICAgICAgICAgICAgdGhhdCBvbmx5IG9uZSBDQUxUWVBFIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgcGVyIGNhbGwKICogICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZnVuY3Rpb24sIGV4Y2VwdCB3aGVyZSBub3RlZC4KICogICAgdW5pY29kZSAgICAgW0ldIFNwZWNpZmllcyBpZiB0aGUgY2FsbGJhY2sgZXhwZWN0cyBhIHVuaWNvZGUgc3RyaW5nLgogKiAgICBleCAgICAgICAgICBbSV0gU3BlY2lmaWVzIGlmIHRoZSBjYWxsYmFjayBuZWVkcyB0aGUgY2FsZW5kYXIgaWRlbnRpZmllci4KICoKICogUkVUVVJOUwogKiAgICBTdWNjZXNzOiBUUlVFLgogKiAgICBGYWlsdXJlOiBGQUxTRS4gVXNlIEdldExhc3RFcnJvcigpIHRvIGRldGVybWluZSB0aGUgY2F1c2UuCiAqCiAqIE5PVEVTCiAqICAgIFdoZW4gdGhlIEFOU0kgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCBhIFVuaWNvZGUtb25seSBMQ0lELAogKiAgICB0aGUgY2FsbCBjYW4gc3VjY2VlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gdXNlcyB0aGUgc3lzdGVtIGNvZGUgcGFnZS4KICogICAgSG93ZXZlciwgY2hhcmFjdGVycyB0aGF0IGFyZSB1bmRlZmluZWQgaW4gdGhlIHN5c3RlbSBjb2RlIHBhZ2UgYXBwZWFyCiAqICAgIGluIHRoZSBzdHJpbmcgYXMgYSBxdWVzdGlvbiBtYXJrICg/KS4KICoKICogVE9ETwogKiAgICBUaGUgYWJvdmUgbm90ZSBzaG91bGQgYmUgcmVzcGVjdGVkIGJ5IEdldENhbGVuZGFySW5mb0EuCiAqLwpzdGF0aWMgQk9PTCBOTFNfRW51bUNhbGVuZGFySW5mb0FXKHZvaWQgKmNhbGluZm9wcm9jLCBMQ0lEIGxvY2FsZSwKICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsIENBTFRZUEUgY2FsdHlwZSwgQk9PTCB1bmljb2RlLCBCT09MIGV4ICkKewogIFdDSEFSICpidWYsICpvcHQgPSBOVUxMLCAqaXRlciA9IE5VTEw7CiAgQk9PTCByZXQgPSBGQUxTRTsKICBpbnQgYnVmU3ogPSAyMDA7CQkvKiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCgogIGlmIChjYWxpbmZvcHJvYyA9PSBOVUxMKQogIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBidWYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmU3opOwogIGlmIChidWYgPT0gTlVMTCkKICB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKGNhbGVuZGFyID09IEVOVU1fQUxMX0NBTEVOREFSUykKICB7CiAgICBpbnQgb3B0U3ogPSBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsIExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgTlVMTCwgMCk7CiAgICBpZiAob3B0U3ogPiAxKQogICAgewogICAgICBvcHQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0U3ogKiBzaXplb2YoV0NIQVIpKTsKICAgICAgaWYgKG9wdCA9PSBOVUxMKQogICAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgfQogICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobG9jYWxlLCBMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsIG9wdCwgb3B0U3opKQogICAgICAgIGl0ZXIgPSBvcHQ7CiAgICB9CiAgICBjYWxlbmRhciA9IE5MU19HZXRMb2NhbGVOdW1iZXIobG9jYWxlLCBMT0NBTEVfSUNBTEVOREFSVFlQRSk7CiAgfQoKICB3aGlsZSAoVFJVRSkJCQkvKiBsb29wIHRocm91Z2ggY2FsZW5kYXJzICovCiAgewogICAgZG8JCQkJLyogbG9vcCB1bnRpbCB0aGVyZSdzIG5vIGVycm9yICovCiAgICB7CiAgICAgIGlmICh1bmljb2RlKQogICAgICAgIHJldCA9IEdldENhbGVuZGFySW5mb1cobG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgYnVmLCBidWZTeiAvIHNpemVvZihXQ0hBUiksIE5VTEwpOwogICAgICBlbHNlIHJldCA9IEdldENhbGVuZGFySW5mb0EobG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgKENIQVIqKWJ1ZiwgYnVmU3ogLyBzaXplb2YoQ0hBUiksIE5VTEwpOwoKICAgICAgaWYgKCFyZXQpCiAgICAgIHsKICAgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKICAgICAgICB7CQkJCS8qIHNvIHJlc2l6ZSBpdCAqLwogICAgICAgICAgaW50IG5ld1N6OwogICAgICAgICAgaWYgKHVuaWNvZGUpCiAgICAgICAgICAgIG5ld1N6ID0gR2V0Q2FsZW5kYXJJbmZvVyhsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBOVUxMLCAwLCBOVUxMKSAqIHNpemVvZihXQ0hBUik7CiAgICAgICAgICBlbHNlIG5ld1N6ID0gR2V0Q2FsZW5kYXJJbmZvQShsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBOVUxMLCAwLCBOVUxMKSAqIHNpemVvZihDSEFSKTsKICAgICAgICAgIGlmIChidWZTeiA+PSBuZXdTeikKICAgICAgICAgIHsKICAgICAgICAgICAgRVJSKCJCdWZmZXIgcmVzaXppbmcgZGlzb3JkZXI6IHdhcyAlZCwgcmVxdWVzdGVkICVkLlxuIiwgYnVmU3osIG5ld1N6KTsKICAgICAgICAgICAgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgICAgICB9CiAgICAgICAgICBidWZTeiA9IG5ld1N6OwogICAgICAgICAgV0FSTigiQnVmZmVyIHRvbyBzbWFsbDsgcmVzaXppbmcgdG8gJWQgYnl0ZXMuXG4iLCBidWZTeik7CiAgICAgICAgICBidWYgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYsIGJ1ZlN6KTsKICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgICAgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgICAgfSBlbHNlIGdvdG8gTkxTX0VudW1DYWxlbmRhckluZm9BV19DbGVhbnVwOwogICAgICB9CiAgICB9IHdoaWxlICghcmV0KTsKCiAgICAvKiBIZXJlIHdlIGFyZS4gV2UgcGFzcyB0aGUgYnVmZmVyIHRvIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YKICAgICAqIHRoZSBjYWxsYmFjay4gQmVjYXVzZSBpdCdzIG5vdCB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1zLAogICAgICogd2UgbXVzdCBjaGVjayBmb3IgRXgsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IFVuaWNvZGUKICAgICAqIGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KICAgICAqLwogICAgaWYgKGV4KSB7CiAgICAgIHJldCA9ICgoQ0FMSU5GT19FTlVNUFJPQ0VYVyljYWxpbmZvcHJvYykoYnVmLCBjYWxlbmRhcik7CiAgICB9IGVsc2UKICAgICAgcmV0ID0gKChDQUxJTkZPX0VOVU1QUk9DVyljYWxpbmZvcHJvYykoYnVmKTsKCiAgICBpZiAoIXJldCkgewkJCS8qIHRoZSBjYWxsYmFjayB0b2xkIHRvIHN0b3AgKi8KICAgICAgcmV0ID0gVFJVRTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKChpdGVyID09IE5VTEwpIHx8ICgqaXRlciA9PSAwKSkJLyogbm8gbW9yZSBjYWxlbmRhcnMgKi8KICAgICAgYnJlYWs7CgogICAgY2FsZW5kYXIgPSAwOwogICAgd2hpbGUgKCgqaXRlciA+PSAnMCcpICYmICgqaXRlciA8PSAnOScpKQogICAgICBjYWxlbmRhciA9IGNhbGVuZGFyICogMTAgKyAqaXRlcisrIC0gJzAnOwoKICAgIGlmICgqaXRlcisrICE9IDApCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9CQUREQik7CiAgICAgIHJldCA9IEZBTFNFOwogICAgICBicmVhazsKICAgIH0KICB9CgpOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA6CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0KTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0EoIENBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDh4LDB4JTA4eCwweCUwOHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIEZBTFNFLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9XCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb1coIENBTElORk9fRU5VTVBST0NXIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDh4LDB4JTA4eCwweCUwOHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIFRSVUUsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0V4QQlbS0VSTkVMMzIuQF0KICoKICogU2VlIEVudW1DYWxlbmRhckluZm9BVy4KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9FeEEoIENBTElORk9fRU5VTVBST0NFWEEgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZSApCnsKICBUUkFDRSgiKCVwLDB4JTA4eCwweCUwOHgsMHglMDh4KVxuIiwgY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUpOwogIHJldHVybiBOTFNfRW51bUNhbGVuZGFySW5mb0FXKGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBGQUxTRSwgVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9FeFcJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvRXhXKCBDQUxJTkZPX0VOVU1QUk9DRVhXIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOHgsMHglMDh4LDB4JTA4eClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgVFJVRSwgVFJVRSk7Cn0K