LyoKICogTG9jYWxlLWRlcGVuZGVudCBmb3JtYXQgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggRGF2aWQgTGVlIExhbWJlcnQKICogQ29weXJpZ2h0IDIwMDAgSnVsaW8gQ+lzYXIgR+F6cXVlegogKiBDb3B5cmlnaHQgMjAwMyBKb24gR3JpZmZpdGhzCiAqIENvcHlyaWdodCAyMDA1IERtaXRyeSBUaW1vc2hrb3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJrZXJuZWxfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobmxzKTsKCiNkZWZpbmUgREFURV9EQVRFVkFSU09OTFkgMHgwMTAwICAvKiBvbmx5IGRhdGUgc3R1ZmY6IHlNZGcgKi8KI2RlZmluZSBUSU1FX1RJTUVWQVJTT05MWSAweDAyMDAgIC8qIG9ubHkgdGltZSBzdHVmZjogaEhtc3QgKi8KCi8qIFNpbmNlIGNhbGN1bGF0aW5nIHRoZSBmb3JtYXR0aW5nIGRhdGEgZm9yIGVhY2ggbG9jYWxlIGlzIHRpbWUtY29uc3VtaW5nLAogKiB3ZSBnZXQgdGhlIGZvcm1hdCBkYXRhIGZvciBlYWNoIGxvY2FsZSBvbmx5IG9uY2UgYW5kIGNhY2hlIGl0IGluIG1lbW9yeS4KICogV2UgY2FjaGUgYm90aCB0aGUgc3lzdGVtIGRlZmF1bHQgYW5kIHVzZXIgb3ZlcnJpZGRlbiBkYXRhLCBhZnRlciBjb252ZXJ0aW5nCiAqIHRoZW0gaW50byB0aGUgZm9ybWF0cyB0aGF0IHRoZSBmdW5jdGlvbnMgaGVyZSBleHBlY3QuIFNpbmNlIHRoZXNlIGZ1bmN0aW9ucwogKiB3aWxsIHR5cGljYWxseSBiZSBjYWxsZWQgd2l0aCBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHRoZSB0b3RhbCBsb2NhbGVzCiAqIGluc3RhbGxlZCwgdGhlIG1lbW9yeSBvdmVyaGVhZCBpcyBtaW5pbWFsIHdoaWxlIHRoZSBzcGVlZHVwIGlzIHNpZ25pZmljYW50LgogKgogKiBPdXIgY2FjaGUgdGFrZXMgdGhlIGZvcm0gb2YgYSBzaW5nbHkgbGlua2VkIGxpc3QsIHdob3NlIG5vZGUgaXMgYmVsb3c6CiAqLwojZGVmaW5lIE5MU19OVU1fQ0FDSEVEX1NUUklOR1MgNDUKCnR5cGVkZWYgc3RydWN0IF9OTFNfRk9STUFUX05PREUKewogIExDSUQgIGxjaWQ7ICAgICAgICAgLyogTG9jYWxlIElkICovCiAgRFdPUkQgZHdGbGFnczsgICAgICAvKiAwIG9yIExPQ0FMRV9OT1VTRVJPVkVSUklERSAqLwogIERXT1JEIGR3Q29kZVBhZ2U7ICAgLyogRGVmYXVsdCBjb2RlIHBhZ2UgKGlmIExPQ0FMRV9VU0VfQU5TSV9DUCBub3QgZ2l2ZW4pICovCiAgTlVNQkVSRk1UVyAgIGZtdDsgICAvKiBEZWZhdWx0IGZvcm1hdCBmb3IgbnVtYmVycyAqLwogIENVUlJFTkNZRk1UVyBjeWZtdDsgLyogRGVmYXVsdCBmb3JtYXQgZm9yIGN1cnJlbmNpZXMgKi8KICBMUFdTVFIgbHBwc3pTdHJpbmdzW05MU19OVU1fQ0FDSEVEX1NUUklOR1NdOyAvKiBEZWZhdWx0IGZvcm1hdHMsZGF5L21vbnRoIG5hbWVzICovCiAgV0NIQVIgc3pTaG9ydEFNWzJdOyAvKiBTaG9ydCAnQU0nIG1hcmtlciAqLwogIFdDSEFSIHN6U2hvcnRQTVsyXTsgLyogU2hvcnQgJ1BNJyBtYXJrZXIgKi8KICBzdHJ1Y3QgX05MU19GT1JNQVRfTk9ERSAqbmV4dDsKfSBOTFNfRk9STUFUX05PREU7CgovKiBNYWNyb3MgdG8gZ2V0IHBhcnRpY3VsYXIgZGF0YSBzdHJpbmdzIGZyb20gYSBmb3JtYXQgbm9kZSAqLwojZGVmaW5lIEdldE5lZ2F0aXZlKGZtdCkgIGZtdC0+bHBwc3pTdHJpbmdzWzBdCiNkZWZpbmUgR2V0TG9uZ0RhdGUoZm10KSAgZm10LT5scHBzelN0cmluZ3NbMV0KI2RlZmluZSBHZXRTaG9ydERhdGUoZm10KSBmbXQtPmxwcHN6U3RyaW5nc1syXQojZGVmaW5lIEdldFRpbWUoZm10KSAgICAgIGZtdC0+bHBwc3pTdHJpbmdzWzNdCiNkZWZpbmUgR2V0QU0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDJdCiNkZWZpbmUgR2V0UE0oZm10KSAgICAgICAgZm10LT5scHBzelN0cmluZ3NbNDNdCiNkZWZpbmUgR2V0WWVhck1vbnRoKGZtdCkgZm10LT5scHBzelN0cmluZ3NbNDRdCgojZGVmaW5lIEdldExvbmdEYXkoZm10LGRheSkgICAgZm10LT5scHBzelN0cmluZ3NbNCArIGRheV0KI2RlZmluZSBHZXRTaG9ydERheShmbXQsZGF5KSAgIGZtdC0+bHBwc3pTdHJpbmdzWzExICsgZGF5XQojZGVmaW5lIEdldExvbmdNb250aChmbXQsbXRoKSAgZm10LT5scHBzelN0cmluZ3NbMTggKyBtdGhdCiNkZWZpbmUgR2V0U2hvcnRNb250aChmbXQsbXRoKSBmbXQtPmxwcHN6U3RyaW5nc1szMCArIG10aF0KCi8qIFdyaXRlIGFjY2VzcyB0byB0aGUgY2FjaGUgaXMgcHJvdGVjdGVkIGJ5IHRoaXMgY3JpdGljYWwgc2VjdGlvbiAqLwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBOTFNfRm9ybWF0c0NTOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBOTFNfRm9ybWF0c0NTX2RlYnVnID0KewogICAgMCwgMCwgJk5MU19Gb3JtYXRzQ1MsCiAgICB7ICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsCiAgICAgICZOTFNfRm9ybWF0c0NTX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBOTFNfRm9ybWF0cyIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gTkxTX0Zvcm1hdHNDUyA9IHsgJk5MU19Gb3JtYXRzQ1NfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0dldExvY2FsZU51bWJlciA8aW50ZXJuYWw+CiAqCiAqIEdldCBhIG51bWVyaWMgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBEV09SRCBOTFNfR2V0TG9jYWxlTnVtYmVyKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncykKewogIFdDSEFSIHN6QnVmZls4MF07CiAgRFdPUkQgZHdWYWwgPSAwOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKCiAgaWYgKHN6QnVmZlswXSAmJiBzekJ1ZmZbMV0gPT0gJzsnICYmIHN6QnVmZlsyXSAhPSAnMCcpCiAgICBkd1ZhbCA9IChzekJ1ZmZbMF0gLSAnMCcpICogMTAgKyAoc3pCdWZmWzJdIC0gJzAnKTsKICBlbHNlCiAgewogICAgY29uc3QgV0NIQVIqIGl0ZXIgPSBzekJ1ZmY7CiAgICBkd1ZhbCA9IDA7CiAgICB3aGlsZSgqaXRlciA+PSAnMCcgJiYgKml0ZXIgPD0gJzknKQogICAgICBkd1ZhbCA9IGR3VmFsICogMTAgKyAoKml0ZXIrKyAtICcwJyk7CiAgfQogIHJldHVybiBkd1ZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXRMb2NhbGVTdHJpbmcgPGludGVybmFsPgogKgogKiBHZXQgYSBzdHJpbmcgbG9jYWxlIGZvcm1hdCB2YWx1ZS4KICovCnN0YXRpYyBXQ0hBUiogTkxTX0dldExvY2FsZVN0cmluZyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MpCnsKICBXQ0hBUiBzekJ1ZmZbODBdLCAqc3RyOwogIERXT1JEIGR3TGVuOwoKICBzekJ1ZmZbMF0gPSAnXDAnOwogIEdldExvY2FsZUluZm9XKGxjaWQsIGR3RmxhZ3MsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpKTsKICBkd0xlbiA9IHN0cmxlblcoc3pCdWZmKSArIDE7CiAgc3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGR3TGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgaWYgKHN0cikKICAgIG1lbWNweShzdHIsIHN6QnVmZiwgZHdMZW4gKiBzaXplb2YoV0NIQVIpKTsKICByZXR1cm4gc3RyOwp9CgojZGVmaW5lIEdFVF9MT0NBTEVfTlVNQkVSKG51bSwgdHlwZSkgbnVtID0gTkxTX0dldExvY2FsZU51bWJlcihsY2lkLCB0eXBlfGR3RmxhZ3MpOyBcCiAgVFJBQ0UoICN0eXBlICI6ICVkICglMDh4KVxuIiwgKERXT1JEKW51bSwgKERXT1JEKW51bSkKCiNkZWZpbmUgR0VUX0xPQ0FMRV9TVFJJTkcoc3RyLCB0eXBlKSBzdHIgPSBOTFNfR2V0TG9jYWxlU3RyaW5nKGxjaWQsIHR5cGV8ZHdGbGFncyk7IFwKICBUUkFDRSggI3R5cGUgIjogJXNcbiIsIGRlYnVnc3RyX3coc3RyKSkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOTFNfR2V0Rm9ybWF0cyA8aW50ZXJuYWw+CiAqCiAqIENhbGN1bGF0ZSAoYW5kIGNhY2hlKSB0aGUgbnVtYmVyIGZvcm1hdHMgZm9yIGEgbG9jYWxlLgogKi8Kc3RhdGljIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqTkxTX0dldEZvcm1hdHMoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzKQp7CiAgLyogR2V0TG9jYWxlSW5mbygpIGlkZW50aWZpZXJzIGZvciBjYWNoZWQgZm9ybWF0dGluZyBzdHJpbmdzICovCiAgc3RhdGljIGNvbnN0IFVTSE9SVCBOTFNfTG9jYWxlSW5kaWNlc1tdID0gewogICAgTE9DQUxFX1NORUdBVElWRVNJR04sCiAgICBMT0NBTEVfU0xPTkdEQVRFLCAgIExPQ0FMRV9TU0hPUlREQVRFLAogICAgTE9DQUxFX1NUSU1FRk9STUFULAogICAgTE9DQUxFX1NEQVlOQU1FMSwgTE9DQUxFX1NEQVlOQU1FMiwgTE9DQUxFX1NEQVlOQU1FMywKICAgIExPQ0FMRV9TREFZTkFNRTQsIExPQ0FMRV9TREFZTkFNRTUsIExPQ0FMRV9TREFZTkFNRTYsIExPQ0FMRV9TREFZTkFNRTcsCiAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCBMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCBMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLAogICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwgTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwKICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsCiAgICBMT0NBTEVfU01PTlRITkFNRTEsIExPQ0FMRV9TTU9OVEhOQU1FMiwgTE9DQUxFX1NNT05USE5BTUUzLAogICAgTE9DQUxFX1NNT05USE5BTUU0LCBMT0NBTEVfU01PTlRITkFNRTUsIExPQ0FMRV9TTU9OVEhOQU1FNiwKICAgIExPQ0FMRV9TTU9OVEhOQU1FNywgTE9DQUxFX1NNT05USE5BTUU4LCBMT0NBTEVfU01PTlRITkFNRTksCiAgICBMT0NBTEVfU01PTlRITkFNRTEwLCBMT0NBTEVfU01PTlRITkFNRTExLCBMT0NBTEVfU01PTlRITkFNRTEyLAogICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywKICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsCiAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LAogICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwKICAgIExPQ0FMRV9TMTE1OSwgTE9DQUxFX1MyMzU5LAogICAgTE9DQUxFX1NZRUFSTU9OVEgKICB9OwogIHN0YXRpYyBOTFNfRk9STUFUX05PREUgKk5MU19DYWNoZWRGb3JtYXRzID0gTlVMTDsKICBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfQ2FjaGVkRm9ybWF0czsKCiAgZHdGbGFncyAmPSBMT0NBTEVfTk9VU0VST1ZFUlJJREU7CgogIFRSQUNFKCIoMHglMDR4LDB4JTA4eClcbiIsIGxjaWQsIGR3RmxhZ3MpOwoKICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGNhY2hlZCB0aGUgbG9jYWxlcyBudW1iZXIgZm9ybWF0ICovCiAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICBub2RlID0gbm9kZS0+bmV4dDsKCiAgaWYgKCFub2RlIHx8IG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpCiAgewogICAgTkxTX0ZPUk1BVF9OT0RFICpuZXdfbm9kZTsKICAgIERXT1JEIGk7CgogICAgVFJBQ0UoIkNyZWF0aW5nIG5ldyBjYWNoZSBlbnRyeVxuIik7CgogICAgaWYgKCEobmV3X25vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKE5MU19GT1JNQVRfTk9ERSkpKSkKICAgICAgcmV0dXJuIE5VTEw7CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmR3Q29kZVBhZ2UsIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSk7CgogICAgLyogTnVtYmVyIEZvcm1hdCAqLwogICAgbmV3X25vZGUtPmxjaWQgPSBsY2lkOwogICAgbmV3X25vZGUtPmR3RmxhZ3MgPSBkd0ZsYWdzOwogICAgbmV3X25vZGUtPm5leHQgPSBOVUxMOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTnVtRGlnaXRzLCBMT0NBTEVfSURJR0lUUyk7CiAgICBHRVRfTE9DQUxFX05VTUJFUihuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvLCBMT0NBTEVfSUxaRVJPKTsKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuTmVnYXRpdmVPcmRlciwgTE9DQUxFX0lORUdOVU1CRVIpOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcsIExPQ0FMRV9TR1JPVVBJTkcpOwogICAgaWYgKG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgPiA5ICYmIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcgIT0gMzIpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5mbXQuR3JvdXBpbmcpOwogICAgICBuZXdfbm9kZS0+Zm10Lkdyb3VwaW5nID0gMDsKICAgIH0KCiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCwgTE9DQUxFX1NERUNJTUFMKTsKICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NUSE9VU0FORCk7CgogICAgLyogQ3VycmVuY3kgRm9ybWF0ICovCiAgICBuZXdfbm9kZS0+Y3lmbXQuTnVtRGlnaXRzID0gbmV3X25vZGUtPmZtdC5OdW1EaWdpdHM7CiAgICBuZXdfbm9kZS0+Y3lmbXQuTGVhZGluZ1plcm8gPSBuZXdfbm9kZS0+Zm10LkxlYWRpbmdaZXJvOwoKICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZywgTE9DQUxFX1NHUk9VUElORyk7CgogICAgaWYgKG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA+IDkpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9TTU9OR1JPVVBJTkcgKCVkKSB1bmhhbmRsZWQsIHBsZWFzZSByZXBvcnQhXG4iLAogICAgICAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyk7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Hcm91cGluZyA9IDA7CiAgICB9CgogICAgR0VUX0xPQ0FMRV9OVU1CRVIobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIsIExPQ0FMRV9JTkVHQ1VSUik7CiAgICBpZiAobmV3X25vZGUtPmN5Zm10Lk5lZ2F0aXZlT3JkZXIgPiAxNSkKICAgIHsKICAgICAgV0FSTigiTE9DQUxFX0lORUdDVVJSICglZCkgdW5oYW5kbGVkLCBwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuTmVnYXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfTlVNQkVSKG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyLCBMT0NBTEVfSUNVUlJFTkNZKTsKICAgIGlmIChuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlciA+IDMpCiAgICB7CiAgICAgIFdBUk4oIkxPQ0FMRV9JUE9TQ1VSUiAoJWQpIHVuaGFuZGxlZCxwbGVhc2UgcmVwb3J0IVxuIiwKICAgICAgICAgICBuZXdfbm9kZS0+Y3lmbXQuUG9zaXRpdmVPcmRlcik7CiAgICAgIG5ld19ub2RlLT5jeWZtdC5Qb3NpdGl2ZU9yZGVyID0gMDsKICAgIH0KICAgIEdFVF9MT0NBTEVfU1RSSU5HKG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXAsIExPQ0FMRV9TTU9OREVDSU1BTFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCwgTE9DQUxFX1NNT05USE9VU0FORFNFUCk7CiAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+Y3lmbXQubHBDdXJyZW5jeVN5bWJvbCwgTE9DQUxFX1NDVVJSRU5DWSk7CgogICAgLyogRGF0ZS9UaW1lIEZvcm1hdCBpbmZvLCBuZWdhdGl2ZSBjaGFyYWN0ZXIsIGV0YyAqLwogICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgewogICAgICBHRVRfTE9DQUxFX1NUUklORyhuZXdfbm9kZS0+bHBwc3pTdHJpbmdzW2ldLCBOTFNfTG9jYWxlSW5kaWNlc1tpXSk7CiAgICB9CiAgICBuZXdfbm9kZS0+c3pTaG9ydEFNWzBdID0gR2V0QU0obmV3X25vZGUpWzBdOyBuZXdfbm9kZS0+c3pTaG9ydEFNWzFdID0gJ1wwJzsKICAgIG5ld19ub2RlLT5zelNob3J0UE1bMF0gPSBHZXRQTShuZXdfbm9kZSlbMF07IG5ld19ub2RlLT5zelNob3J0UE1bMV0gPSAnXDAnOwoKICAgIC8qIE5vdyBhZGQgdGhlIGNvbXB1dGVkIGZvcm1hdCB0byB0aGUgY2FjaGUgKi8KICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCZOTFNfRm9ybWF0c0NTKTsKCiAgICAvKiBTZWFyY2ggYWdhaW46IFdlIG1heSBoYXZlIHJhY2VkIHRvIGFkZCB0aGUgbm9kZSAqLwogICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzOwogICAgd2hpbGUgKG5vZGUgJiYgKG5vZGUtPmxjaWQgIT0gbGNpZCB8fCBub2RlLT5kd0ZsYWdzICE9IGR3RmxhZ3MpICYmIG5vZGUtPm5leHQpCiAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwoKICAgIGlmICghbm9kZSkKICAgIHsKICAgICAgbm9kZSA9IE5MU19DYWNoZWRGb3JtYXRzID0gbmV3X25vZGU7IC8qIEVtcHR5IGxpc3QgKi8KICAgICAgbmV3X25vZGUgPSBOVUxMOwogICAgfQogICAgZWxzZSBpZiAobm9kZS0+bGNpZCAhPSBsY2lkIHx8IG5vZGUtPmR3RmxhZ3MgIT0gZHdGbGFncykKICAgIHsKICAgICAgbm9kZS0+bmV4dCA9IG5ld19ub2RlOyAvKiBOb3QgaW4gdGhlIGxpc3QsIGFkZCB0byBlbmQgKi8KICAgICAgbm9kZSA9IG5ld19ub2RlOwogICAgICBuZXdfbm9kZSA9IE5VTEw7CiAgICB9CgogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oJk5MU19Gb3JtYXRzQ1MpOwoKICAgIGlmIChuZXdfbm9kZSkKICAgIHsKICAgICAgLyogV2UgcmFjZWQgYW5kIGxvc3Q6IFRoZSBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgdGhyZWFkLgogICAgICAgKiBub2RlIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGNhY2hlZCBub2RlLCBzbyBmcmVlIG5ld19ub2RlLgogICAgICAgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihOTFNfTG9jYWxlSW5kaWNlcykvc2l6ZW9mKE5MU19Mb2NhbGVJbmRpY2VzWzBdKTsgaSsrKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5scHBzelN0cmluZ3NbaV0pOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Zm10LmxwRGVjaW1hbFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5mbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scERlY2ltYWxTZXApOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfbm9kZS0+Y3lmbXQubHBUaG91c2FuZFNlcCk7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld19ub2RlLT5jeWZtdC5scEN1cnJlbmN5U3ltYm9sKTsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X25vZGUpOwogICAgfQogIH0KICByZXR1cm4gbm9kZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19Jc1VuaWNvZGVPbmx5TGNpZCA8aW50ZXJuYWw+CiAqCiAqIERldGVybWluZSBpZiBhIGxvY2FsZSBpcyBVbmljb2RlIG9ubHksIGFuZCB0aHVzIGludmFsaWQgaW4gQVNDSUkgY2FsbHMuCiAqLwpCT09MIE5MU19Jc1VuaWNvZGVPbmx5TGNpZChMQ0lEIGxjaWQpCnsKICBsY2lkID0gQ29udmVydERlZmF1bHRMb2NhbGUobGNpZCk7CgogIHN3aXRjaCAoUFJJTUFSWUxBTkdJRChsY2lkKSkKICB7CiAgY2FzZSBMQU5HX0FSTUVOSUFOOgogIGNhc2UgTEFOR19ESVZFSEk6CiAgY2FzZSBMQU5HX0dFT1JHSUFOOgogIGNhc2UgTEFOR19HVUpBUkFUSToKICBjYXNlIExBTkdfSElOREk6CiAgY2FzZSBMQU5HX0tBTk5BREE6CiAgY2FzZSBMQU5HX0tPTktBTkk6CiAgY2FzZSBMQU5HX01BUkFUSEk6CiAgY2FzZSBMQU5HX1BVTkpBQkk6CiAgY2FzZSBMQU5HX1NBTlNLUklUOgogICAgVFJBQ0UoImxjaWQgMHglMDh4OiBsYW5naWQgMHglNHggaXMgVW5pY29kZSBPbmx5XG4iLCBsY2lkLCBQUklNQVJZTEFOR0lEKGxjaWQpKTsKICAgIHJldHVybiBUUlVFOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gRkFMU0U7CiAgfQp9CgovKgogKiBGb3JtYXR0aW5nIG9mIGRhdGVzLCB0aW1lcywgbnVtYmVycyBhbmQgY3VycmVuY2llcy4KICovCgojZGVmaW5lIElzTGl0ZXJhbE1hcmtlcihwKSAocCA9PSAnXCcnKQojZGVmaW5lIElzRGF0ZUZtdENoYXIocCkgICAocCA9PSAnZCd8fHAgPT0gJ00nfHxwID09ICd5J3x8cCA9PSAnZycpCiNkZWZpbmUgSXNUaW1lRm10Q2hhcihwKSAgIChwID09ICdIJ3x8cCA9PSAnaCd8fHAgPT0gJ20nfHxwID09ICdzJ3x8cCA9PSAndCcpCgovKiBPbmx5IHRoZSBmb2xsb3dpbmcgZmxhZ3MgY2FuIGJlIGdpdmVuIGlmIGEgZGF0ZS90aW1lIGZvcm1hdCBpcyBzcGVjaWZpZWQgKi8KI2RlZmluZSBEQVRFX0ZPUk1BVF9GTEFHUyAoREFURV9EQVRFVkFSU09OTFkpCiNkZWZpbmUgVElNRV9GT1JNQVRfRkxBR1MgKFRJTUVfVElNRVZBUlNPTkxZfFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVR8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT01JTlVURVNPUlNFQ09ORFN8VElNRV9OT1NFQ09ORFN8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9OT1RJTUVNQVJLRVIpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXREYXRlVGltZUZvcm1hdFcgPGludGVybmFsPgogKgogKiBQZXJmb3JtcyB0aGUgZm9ybWF0dGluZyBmb3IgR2V0RGF0ZUZvcm1hdFcvR2V0VGltZUZvcm1hdFcuCiAqCiAqIEZJWE1FCiAqIERBVEVfVVNFX0FMVF9DQUxFTkRBUiAgICAgICAgICAgLSBSZXF1aXJlcyBHZXRDYWxlbmRhckluZm8gdG8gd29yayBmaXJzdC4KICogREFURV9MVFJSRUFESU5HL0RBVEVfUlRMUkVBRElORyAtIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAqLwpzdGF0aWMgSU5UIE5MU19HZXREYXRlVGltZUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1lTVEVNVElNRSogbHBUaW1lLCBMUENXU1RSIGxwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGxwU3RyLCBJTlQgY2NoT3V0KQp7CiAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlOwogIFNZU1RFTVRJTUUgc3Q7CiAgSU5UIGNjaFdyaXR0ZW4gPSAwOwogIElOVCBsYXN0Rm9ybWF0UG9zID0gMDsKICBCT09MIGJTa2lwcGluZyA9IEZBTFNFOyAvKiBTa2lwcGluZyB0ZXh0IGFyb3VuZCBtYXJrZXI/ICovCgogIC8qIFZlcmlmeSBvdXIgYXJndW1lbnRzICovCiAgaWYgKChjY2hPdXQgJiYgIWxwU3RyKSB8fCAhKG5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKSkpCiAgewpOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRQYXJhbWV0ZXI6CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZiAoZHdGbGFncyAmIH4oREFURV9EQVRFVkFSU09OTFl8VElNRV9USU1FVkFSU09OTFkpKQogIHsKICAgIGlmIChscEZvcm1hdCAmJgogICAgICAgICgoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZICYmIGR3RmxhZ3MgJiB+REFURV9GT1JNQVRfRkxBR1MpIHx8CiAgICAgICAgIChkd0ZsYWdzICYgVElNRV9USU1FVkFSU09OTFkgJiYgZHdGbGFncyAmIH5USU1FX0ZPUk1BVF9GTEFHUykpKQogICAgewpOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczoKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfRkxBR1MpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZKQogICAgewogICAgICBpZiAoKGR3RmxhZ3MgJiAoREFURV9MVFJSRUFESU5HfERBVEVfUlRMUkVBRElORykpID09IChEQVRFX0xUUlJFQURJTkd8REFURV9SVExSRUFESU5HKSkKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZEZsYWdzOwogICAgICBlbHNlIGlmIChkd0ZsYWdzICYgKERBVEVfTFRSUkVBRElOR3xEQVRFX1JUTFJFQURJTkcpKQogICAgICAgIEZJWE1FKCJVbnN1cHBvcnRlZCBmbGFnczogREFURV9MVFJSRUFESU5HL0RBVEVfUlRMUkVBRElOR1xuIik7CgogICAgICBzd2l0Y2ggKGR3RmxhZ3MgJiAoREFURV9TSE9SVERBVEV8REFURV9MT05HREFURXxEQVRFX1lFQVJNT05USCkpCiAgICAgIHsKICAgICAgY2FzZSAwOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKGxwRm9ybWF0KQogICAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX0ludmFsaWRGbGFnczsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZEZsYWdzOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoIWxwRm9ybWF0KQogIHsKICAgIC8qIFVzZSB0aGUgYXBwcm9wcmlhdGUgZGVmYXVsdCBmb3JtYXQgKi8KICAgIGlmIChkd0ZsYWdzICYgREFURV9EQVRFVkFSU09OTFkpCiAgICB7CiAgICAgIGlmIChkd0ZsYWdzICYgREFURV9ZRUFSTU9OVEgpCiAgICAgICAgbHBGb3JtYXQgPSBHZXRZZWFyTW9udGgobm9kZSk7CiAgICAgIGVsc2UgaWYgKGR3RmxhZ3MgJiBEQVRFX0xPTkdEQVRFKQogICAgICAgIGxwRm9ybWF0ID0gR2V0TG9uZ0RhdGUobm9kZSk7CiAgICAgIGVsc2UKICAgICAgICBscEZvcm1hdCA9IEdldFNob3J0RGF0ZShub2RlKTsKICAgIH0KICAgIGVsc2UKICAgICAgbHBGb3JtYXQgPSBHZXRUaW1lKG5vZGUpOwogIH0KCiAgaWYgKCFscFRpbWUpCiAgewogICAgR2V0TG9jYWxUaW1lKCZzdCk7IC8qIERlZmF1bHQgdG8gY3VycmVudCB0aW1lICovCiAgICBscFRpbWUgPSAmc3Q7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoZHdGbGFncyAmIERBVEVfREFURVZBUlNPTkxZKQogICAgewogICAgICBGSUxFVElNRSBmdFRtcDsKCiAgICAgIC8qIFZlcmlmeSB0aGUgZGF0ZSBhbmQgY29ycmVjdCB0aGUgRC5PLlcuIGlmIG5lZWRlZCAqLwogICAgICBtZW1zZXQoJnN0LCAwLCBzaXplb2Yoc3QpKTsKICAgICAgc3Qud1llYXIgPSBscFRpbWUtPndZZWFyOwogICAgICBzdC53TW9udGggPSBscFRpbWUtPndNb250aDsKICAgICAgc3Qud0RheSA9IGxwVGltZS0+d0RheTsKCiAgICAgIGlmIChzdC53RGF5ID4gMzEgfHwgc3Qud01vbnRoID4gMTIgfHwgIVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzdCwgJmZ0VG1wKSkKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfSW52YWxpZFBhcmFtZXRlcjsKCiAgICAgIEZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZmdFRtcCwgJnN0KTsKICAgICAgbHBUaW1lID0gJnN0OwogICAgfQoKICAgIGlmIChkd0ZsYWdzICYgVElNRV9USU1FVkFSU09OTFkpCiAgICB7CiAgICAgIC8qIFZlcmlmeSB0aGUgdGltZSAqLwogICAgICBpZiAobHBUaW1lLT53SG91ciA+IDI0IHx8IGxwVGltZS0+d01pbnV0ZSA+IDU5IHx8IGxwVGltZS0+d1NlY29uZCA+IDU5KQogICAgICAgIGdvdG8gTkxTX0dldERhdGVUaW1lRm9ybWF0V19JbnZhbGlkUGFyYW1ldGVyOwogICAgfQogIH0KCiAgLyogRm9ybWF0IHRoZSBvdXRwdXQgKi8KICB3aGlsZSAoKmxwRm9ybWF0KQogIHsKICAgIGlmIChJc0xpdGVyYWxNYXJrZXIoKmxwRm9ybWF0KSkKICAgIHsKICAgICAgLyogU3RhcnQgb2YgYSBsaXRlcmFsIHN0cmluZyAqLwogICAgICBscEZvcm1hdCsrOwoKICAgICAgLyogTG9vcCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsIG1hcmtlciBvciBlbmQgb2YgdGhlIHN0cmluZyAqLwogICAgICB3aGlsZSAoKmxwRm9ybWF0KQogICAgICB7CiAgICAgICAgaWYgKElzTGl0ZXJhbE1hcmtlcigqbHBGb3JtYXQpKQogICAgICAgIHsKICAgICAgICAgIGxwRm9ybWF0Kys7CiAgICAgICAgICBpZiAoIUlzTGl0ZXJhbE1hcmtlcigqbHBGb3JtYXQpKQogICAgICAgICAgICBicmVhazsgLyogVGVybWluYXRpbmcgbGl0ZXJhbCBtYXJrZXIgKi8KICAgICAgICB9CgogICAgICAgIGlmICghY2NoT3V0KQogICAgICAgICAgY2NoV3JpdHRlbisrOyAgIC8qIENvdW50IHNpemUgb25seSAqLwogICAgICAgIGVsc2UgaWYgKGNjaFdyaXR0ZW4gPj0gY2NoT3V0KQogICAgICAgICAgZ290byBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXX092ZXJydW47CiAgICAgICAgZWxzZSBpZiAoIWJTa2lwcGluZykKICAgICAgICB7CiAgICAgICAgICBscFN0cltjY2hXcml0dGVuXSA9ICpscEZvcm1hdDsKICAgICAgICAgIGNjaFdyaXR0ZW4rKzsKICAgICAgICB9CiAgICAgICAgbHBGb3JtYXQrKzsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKGR3RmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWSAmJiBJc0RhdGVGbXRDaGFyKCpscEZvcm1hdCkpIHx8CiAgICAgICAgICAgICAoZHdGbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZICYmIElzVGltZUZtdENoYXIoKmxwRm9ybWF0KSkpCiAgICB7CiAgICAgIGNoYXIgIGJ1ZmZBWzMyXTsKICAgICAgV0NIQVIgYnVmZlszMl0sIGZtdENoYXI7CiAgICAgIExQQ1dTVFIgc3pBZGQgPSBOVUxMOwogICAgICBEV09SRCBkd1ZhbCA9IDA7CiAgICAgIGludCAgIGNvdW50ID0gMCwgZHdMZW47CgogICAgICBiU2tpcHBpbmcgPSBGQUxTRTsKCiAgICAgIGZtdENoYXIgPSAqbHBGb3JtYXQ7CiAgICAgIHdoaWxlICgqbHBGb3JtYXQgPT0gZm10Q2hhcikKICAgICAgewogICAgICAgIGNvdW50Kys7CiAgICAgICAgbHBGb3JtYXQrKzsKICAgICAgfQogICAgICBidWZmWzBdID0gJ1wwJzsKCiAgICAgIHN3aXRjaChmbXRDaGFyKQogICAgICB7CiAgICAgIGNhc2UgJ2QnOgogICAgICAgIGlmIChjb3VudCA+PSA0KQogICAgICAgICAgc3pBZGQgPSBHZXRMb25nRGF5KG5vZGUsIChscFRpbWUtPndEYXlPZldlZWsgKyA2KSAlIDcpOwogICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDMpCiAgICAgICAgICBzekFkZCA9IEdldFNob3J0RGF5KG5vZGUsIChscFRpbWUtPndEYXlPZldlZWsgKyA2KSAlIDcpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d0RheTsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdNJzoKICAgICAgICBpZiAoY291bnQgPj0gNCkKICAgICAgICAgIHN6QWRkID0gR2V0TG9uZ01vbnRoKG5vZGUsIGxwVGltZS0+d01vbnRoIC0gMSk7CiAgICAgICAgZWxzZSBpZiAoY291bnQgPT0gMykKICAgICAgICAgIHN6QWRkID0gR2V0U2hvcnRNb250aChub2RlLCBscFRpbWUtPndNb250aCAtIDEpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d01vbnRoOwogICAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3knOgogICAgICAgIGlmIChjb3VudCA+PSA0KQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gNDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53WWVhcjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgICAgZHdWYWwgPSBscFRpbWUtPndZZWFyICUgMTAwOwogICAgICAgIH0KICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdnJzoKICAgICAgICBpZiAoY291bnQgPT0gMikKICAgICAgICB7CiAgICAgICAgICAvKiBGSVhNRTogT3VyIEdldENhbGVuZGFySW5mbygpIGRvZXMgbm90IHlldCBzdXBwb3J0IENBTF9TRVJBU1RSSU5HLgogICAgICAgICAgICogICAgICAgIFdoZW4gaXQgaXMgZml4ZWQsIHRoaXMgc3RyaW5nIHNob3VsZCBiZSBjYWNoZWQgaW4gJ25vZGUnLgogICAgICAgICAgICovCiAgICAgICAgICBGSVhNRSgiU2hvdWxkIGJlIHVzaW5nIEdldENhbGVuZGFySW5mbyhDQUxfU0VSQVNUUklORyksIGRlZmF1bHRpbmcgdG8gJ0FEJ1xuIik7CiAgICAgICAgICBidWZmWzBdID0gJ0EnOyBidWZmWzFdID0gJ0QnOyBidWZmWzJdID0gJ1wwJzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGJ1ZmZbMF0gPSAnZyc7IGJ1ZmZbMV0gPSAnXDAnOyAvKiBBZGQgYSBsaXRlcmFsICdnJyAqLwogICAgICAgIH0KICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdoJzoKICAgICAgICBpZiAoIShkd0ZsYWdzICYgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCkpCiAgICAgICAgewogICAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d0hvdXIgPT0gMCA/IDEyIDogKGxwVGltZS0+d0hvdXIgLSAxKSAlIDEyICsgMTsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiAuLiBmYWxsIHRocm91Z2ggaWYgd2UgYXJlIGZvcmNlZCB0byBvdXRwdXQgaW4gMjQgaG91ciBmb3JtYXQgKi8KCiAgICAgIGNhc2UgJ0gnOgogICAgICAgIGNvdW50ID0gY291bnQgPiAyID8gMiA6IGNvdW50OwogICAgICAgIGR3VmFsID0gbHBUaW1lLT53SG91cjsKICAgICAgICBzekFkZCA9IGJ1ZmY7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdtJzoKICAgICAgICBpZiAoZHdGbGFncyAmIFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKQogICAgICAgIHsKICAgICAgICAgIGNjaFdyaXR0ZW4gPSBsYXN0Rm9ybWF0UG9zOyAvKiBTa2lwICovCiAgICAgICAgICBiU2tpcHBpbmcgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgY291bnQgPSBjb3VudCA+IDIgPyAyIDogY291bnQ7CiAgICAgICAgICBkd1ZhbCA9IGxwVGltZS0+d01pbnV0ZTsKICAgICAgICAgIHN6QWRkID0gYnVmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzJzoKICAgICAgICBpZiAoZHdGbGFncyAmIChUSU1FX05PU0VDT05EU3xUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgICAgICAgewogICAgICAgICAgY2NoV3JpdHRlbiA9IGxhc3RGb3JtYXRQb3M7IC8qIFNraXAgKi8KICAgICAgICAgIGJTa2lwcGluZyA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBjb3VudCA9IGNvdW50ID4gMiA/IDIgOiBjb3VudDsKICAgICAgICAgIGR3VmFsID0gbHBUaW1lLT53U2Vjb25kOwogICAgICAgICAgc3pBZGQgPSBidWZmOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3QnOgogICAgICAgIGlmIChkd0ZsYWdzICYgVElNRV9OT1RJTUVNQVJLRVIpCiAgICAgICAgewogICAgICAgICAgY2NoV3JpdHRlbiA9IGxhc3RGb3JtYXRQb3M7IC8qIFNraXAgKi8KICAgICAgICAgIGJTa2lwcGluZyA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBpZiAoY291bnQgPT0gMSkKICAgICAgICAgICAgc3pBZGQgPSBscFRpbWUtPndIb3VyIDwgMTIgPyBub2RlLT5zelNob3J0QU0gOiBub2RlLT5zelNob3J0UE07CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHN6QWRkID0gbHBUaW1lLT53SG91ciA8IDEyID8gR2V0QU0obm9kZSkgOiBHZXRQTShub2RlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmIChzekFkZCA9PSBidWZmICYmIGJ1ZmZbMF0gPT0gJ1wwJykKICAgICAgewogICAgICAgIC8qIFdlIGhhdmUgYSBudW1lcmljIHZhbHVlIHRvIGFkZCAqLwogICAgICAgIHNwcmludGYoYnVmZkEsICIlLipkIiwgY291bnQsIGR3VmFsKTsKICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYnVmZkEsIC0xLCBidWZmLCBzaXplb2YoYnVmZikvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIH0KCiAgICAgIGR3TGVuID0gc3pBZGQgPyBzdHJsZW5XKHN6QWRkKSA6IDA7CgogICAgICBpZiAoY2NoT3V0ICYmIGR3TGVuKQogICAgICB7CiAgICAgICAgaWYgKGNjaFdyaXR0ZW4gKyBkd0xlbiA8IGNjaE91dCkKICAgICAgICAgIG1lbWNweShscFN0ciArIGNjaFdyaXR0ZW4sIHN6QWRkLCBkd0xlbiAqIHNpemVvZihXQ0hBUikpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBtZW1jcHkobHBTdHIgKyBjY2hXcml0dGVuLCBzekFkZCwgKGNjaE91dCAtIGNjaFdyaXR0ZW4pICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfT3ZlcnJ1bjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2NoV3JpdHRlbiArPSBkd0xlbjsKICAgICAgbGFzdEZvcm1hdFBvcyA9IGNjaFdyaXR0ZW47IC8qIFNhdmUgcG9zaXRpb24gb2YgbGFzdCBvdXRwdXQgZm9ybWF0IHRleHQgKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogTGl0ZXJhbCBjaGFyYWN0ZXIgKi8KICAgICAgaWYgKCFjY2hPdXQpCiAgICAgICAgY2NoV3JpdHRlbisrOyAgIC8qIENvdW50IHNpemUgb25seSAqLwogICAgICBlbHNlIGlmIChjY2hXcml0dGVuID49IGNjaE91dCkKICAgICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfT3ZlcnJ1bjsKICAgICAgZWxzZSBpZiAoIWJTa2lwcGluZyB8fCAqbHBGb3JtYXQgPT0gJyAnKQogICAgICB7CiAgICAgICAgbHBTdHJbY2NoV3JpdHRlbl0gPSAqbHBGb3JtYXQ7CiAgICAgICAgY2NoV3JpdHRlbisrOwogICAgICB9CiAgICAgIGxwRm9ybWF0Kys7CiAgICB9CiAgfQoKICAvKiBGaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgaWYgKGNjaE91dCkKICB7CiAgIGlmIChjY2hXcml0dGVuID49IGNjaE91dCkKICAgICBnb3RvIE5MU19HZXREYXRlVGltZUZvcm1hdFdfT3ZlcnJ1bjsKICAgZWxzZQogICAgIGxwU3RyW2NjaFdyaXR0ZW5dID0gJ1wwJzsKICB9CiAgY2NoV3JpdHRlbisrOyAvKiBJbmNsdWRlIHRlcm1pbmF0aW5nIE5VTCAqLwoKICBUUkFDRSgicmV0dXJuaW5nIGxlbmd0aD0lZCwgb3VwdXQ9JXNcbiIsIGNjaFdyaXR0ZW4sIGRlYnVnc3RyX3cobHBTdHIpKTsKICByZXR1cm4gY2NoV3JpdHRlbjsKCk5MU19HZXREYXRlVGltZUZvcm1hdFdfT3ZlcnJ1bjoKICBUUkFDRSgicmV0dXJuaW5nIDAsIChFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKVxuIik7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5MU19HZXREYXRlVGltZUZvcm1hdEEgPGludGVybmFsPgogKgogKiBBU0NJSSB3cmFwcGVyIGZvciBHZXREYXRlRm9ybWF0QS9HZXRUaW1lRm9ybWF0QS4KICovCnN0YXRpYyBJTlQgTkxTX0dldERhdGVUaW1lRm9ybWF0QShMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBGb3JtYXQsIExQU1RSIGxwU3RyLCBJTlQgY2NoT3V0KQp7CiAgRFdPUkQgY3AgPSBDUF9BQ1A7CiAgV0NIQVIgc3pGb3JtYXRbMTI4XSwgc3pPdXRbMTI4XTsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVwLCVzLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX2EobHBGb3JtYXQpLCBscFN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldERhdGVUaW1lRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXREYXRlVGltZUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjsKICAgIGNwID0gbm9kZS0+ZHdDb2RlUGFnZTsKICB9CgogIGlmIChscEZvcm1hdCkKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LCAtMSwgc3pGb3JtYXQsIHNpemVvZihzekZvcm1hdCkvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwgbHBGb3JtYXQgPyBzekZvcm1hdCA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBTdHIgPyBzek91dCA6IE5VTEwsIGNjaE91dCk7CgogIGlmIChscFN0cikKICB7CiAgICBpZiAoc3pPdXRbMF0pCiAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIDAsIHN6T3V0LCBpUmV0ID8gLTEgOiBjY2hPdXQsIGxwU3RyLCBjY2hPdXQsIDAsIDApOwogICAgZWxzZSBpZiAoY2NoT3V0ICYmIGlSZXQpCiAgICAgICpscFN0ciA9ICdcMCc7CiAgfQogIHJldHVybiBpUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXRBIFtLRVJORUwzMi5AXQogKgogKiBGb3JtYXQgYSBkYXRlIGZvciBhIGdpdmVuIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICBsY2lkICAgICAgW0ldIExvY2FsZSB0byBmb3JtYXQgZm9yCiAqICBkd0ZsYWdzICAgW0ldIExPQ0FMRV8gYW5kIERBVEVfIGZsYWdzIGZyb20gIndpbm5scy5oIgogKiAgbHBUaW1lICAgIFtJXSBEYXRlIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgIFtJXSBGb3JtYXQgc3RyaW5nLCBvciBOVUxMIHRvIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHRzCiAqICBscERhdGVTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgW0ldIFNpemUgb2YgbHBEYXRlU3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gSWYgbHBGb3JtYXQgaXMgTlVMTCwgbHBEYXRlU3RyIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0CiAqICAgIGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKSBhbmQgbW9kaWZpZWQgYnkgZHdGbGFncy4KICogIC0gbHBGb3JtYXQgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBhbmQgZm9ybWF0dGluZyB0b2tlbnMuIEFueSBjaGFyYWN0ZXJzCiAqICAgIGluIHRoZSBzdHJpbmcgYXJlIGNvcGllZCB2ZXJiYXRpbSB0byBscERhdGVTdHIsIHdpdGggdG9rZW5zIGJlaW5nIHJlcGxhY2VkCiAqICAgIGJ5IHRoZSBkYXRlIHZhbHVlcyB0aGV5IHJlcHJlc2VudC4KICogIC0gVGhlIGZvbGxvd2luZyB0b2tlbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGluIGEgZGF0ZSBmb3JtYXQgc3RyaW5nOgogKnwgIFRva2VuICBNZWFuaW5nCiAqfCAgLS0tLS0gIC0tLS0tLS0KICp8ICBkICAgICAgU2luZ2xlIGRpZ2l0IGRheSBvZiB0aGUgbW9udGggKG5vIGxlYWRpbmcgMCkKICp8ICBkZCAgICAgRG91YmxlIGRpZ2l0IGRheSBvZiB0aGUgbW9udGgKICp8ICBkZGQgICAgU2hvcnQgbmFtZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawogKnwgIGRkZGQgICBMb25nIG5hbWUgZm9yIHRoZSBkYXkgb2YgdGhlIHdlZWsKICp8ICBNICAgICAgU2luZ2xlIGRpZ2l0IG1vbnRoIG9mIHRoZSB5ZWFyIChubyBsZWFkaW5nIDApCiAqfCAgTU0gICAgIERvdWJsZSBkaWdpdCBtb250aCBvZiB0aGUgeWVhcgogKnwgIE1NTSAgICBTaG9ydCBuYW1lIGZvciB0aGUgbW9udGggb2YgdGhlIHllYXIKICp8ICBNTU1NICAgTG9uZyBuYW1lIGZvciB0aGUgbW9udGggb2YgdGhlIHllYXIKICp8ICB5ICAgICAgRG91YmxlIGRpZ2l0IHllYXIgbnVtYmVyIChubyBsZWFkaW5nIDApCiAqfCAgeXkgICAgIERvdWJsZSBkaWdpdCB5ZWFyIG51bWJlcgogKnwgIHl5eXkgICBGb3VyIGRpZ2l0IHllYXIgbnVtYmVyCiAqfCAgZ2cgICAgIEVyYSBzdHJpbmcsIGZvciBleGFtcGxlICdBRCcuCiAqICAtIFRvIG91dHB1dCBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgdGhhdCBjb3VsZCBiZSBtaXNpZGVudGlmaWVkIGFzIGEgdG9rZW4sCiAqICAgIGVuY2xvc2UgaXQgaW4gc2luZ2xlIHF1b3Rlcy4KICogIC0gVGhlIEFzY2lpIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBmYWlscyBpZiBsY2lkIGlzIFVuaWNvZGUgb25seS4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgd3JpdHRlbiB0byBscERhdGVTdHIsIG9yIHRoYXQgd291bGQKICogICAgICAgICAgIGhhdmUgYmVlbiB3cml0dGVuLCBpZiBjY2hPdXQgaXMgMC4KICogIEZhaWx1cmU6IDAuIFVzZSBHZXRMYXN0RXJyb3IoKSB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QSggTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscEZvcm1hdCwgTFBTVFIgbHBEYXRlU3RyLCBJTlQgY2NoT3V0KQp7CiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVwLCVzLCVwLCVkKVxuIixsY2lkLCBkd0ZsYWdzLCBscFRpbWUsCiAgICAgICAgZGVidWdzdHJfYShscEZvcm1hdCksIGxwRGF0ZVN0ciwgY2NoT3V0KTsKCiAgcmV0dXJuIE5MU19HZXREYXRlVGltZUZvcm1hdEEobGNpZCwgZHdGbGFncyB8IERBVEVfREFURVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwRGF0ZVN0ciwgY2NoT3V0KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RGF0ZUZvcm1hdFcJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBHZXREYXRlRm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscEZvcm1hdCwgTFBXU1RSIGxwRGF0ZVN0ciwgSU5UIGNjaE91dCkKewogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcCwlcywlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl93KGxwRm9ybWF0KSwgbHBEYXRlU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0VyhsY2lkLCBkd0ZsYWdzfERBVEVfREFURVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwRGF0ZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdEEJW0tFUk5FTDMyLkBdCiAqCiAqIEZvcm1hdCBhIHRpbWUgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogKgogKiBQQVJBTVMKICogIGxjaWQgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICBbSV0gTE9DQUxFXyBhbmQgVElNRV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscFRpbWUgICAgW0ldIFRpbWUgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgW0ldIEZvcm1hdHRpbmcgb3ZlcnJpZGVzCiAqICBscFRpbWVTdHIgW09dIERlc3RpbmF0aW9uIGZvciBmb3JtYXR0ZWQgc3RyaW5nCiAqICBjY2hPdXQgICAgW0ldIFNpemUgb2YgbHBUaW1lU3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gSWYgbHBGb3JtYXQgaXMgTlVMTCwgbHBzelZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0CiAqICAgIGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKSBhbmQgbW9kaWZpZWQgYnkgZHdGbGFncy4KICogIC0gbHBGb3JtYXQgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBhbmQgZm9ybWF0dGluZyB0b2tlbnMuIEFueSBjaGFyYWN0ZXJzCiAqICAgIGluIHRoZSBzdHJpbmcgYXJlIGNvcGllZCB2ZXJiYXRpbSB0byBscFRpbWVTdHIsIHdpdGggdG9rZW5zIGJlaW5nIHJlcGxhY2VkCiAqICAgIGJ5IHRoZSB0aW1lIHZhbHVlcyB0aGV5IHJlcHJlc2VudC4KICogIC0gVGhlIGZvbGxvd2luZyB0b2tlbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGluIGEgdGltZSBmb3JtYXQgc3RyaW5nOgogKnwgIFRva2VuICBNZWFuaW5nCiAqfCAgLS0tLS0gIC0tLS0tLS0KICp8ICBoICAgICAgSG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIgY2xvY2spCiAqfCAgaGggICAgIEhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzICgxMi1ob3VyIGNsb2NrKQogKnwgIEggICAgICBIb3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91ciBjbG9jaykKICp8ICBISCAgICAgSG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMgKDI0LWhvdXIgY2xvY2spCiAqfCAgbSAgICAgIE1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICp8ICBtbSAgICAgTWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKnwgIHMgICAgICBTZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqfCAgc3MgICAgIFNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICp8ICB0ICAgICAgU2hvcnQgdGltZSBtYXJrZXIgKGUuZy4gIkEiIG9yICJQIikKICp8ICB0dCAgICAgTG9uZyB0aW1lIG1hcmtlciAoZS5nLiAiQU0iLCAiUE0iKQogKiAgLSBUbyBvdXRwdXQgYW55IGxpdGVyYWwgY2hhcmFjdGVyIHRoYXQgY291bGQgYmUgbWlzaWRlbnRpZmllZCBhcyBhIHRva2VuLAogKiAgICBlbmNsb3NlIGl0IGluIHNpbmdsZSBxdW90ZXMuCiAqICAtIFRoZSBBc2NpaSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgbGNpZCBpcyBVbmljb2RlIG9ubHkuCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gbHBUaW1lU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0VGltZUZvcm1hdEEoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRm9ybWF0LCBMUFNUUiBscFRpbWVTdHIsIElOVCBjY2hPdXQpCnsKICBUUkFDRSgiKDB4JTA0eCwweCUwOHgsJXAsJXMsJXAsJWQpXG4iLGxjaWQsIGR3RmxhZ3MsIGxwVGltZSwKICAgICAgICBkZWJ1Z3N0cl9hKGxwRm9ybWF0KSwgbHBUaW1lU3RyLCBjY2hPdXQpOwoKICByZXR1cm4gTkxTX0dldERhdGVUaW1lRm9ybWF0QShsY2lkLCBkd0ZsYWdzfFRJTUVfVElNRVZBUlNPTkxZLCBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGb3JtYXQsIGxwVGltZVN0ciwgY2NoT3V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdFcJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBHZXRUaW1lRm9ybWF0QS4KICovCklOVCBXSU5BUEkgR2V0VGltZUZvcm1hdFcoTENJRCBsY2lkLCBEV09SRCBkd0ZsYWdzLCBjb25zdCBTWVNURU1USU1FKiBscFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscEZvcm1hdCwgTFBXU1RSIGxwVGltZVN0ciwgSU5UIGNjaE91dCkKewogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcCwlcywlcCwlZClcbiIsbGNpZCwgZHdGbGFncywgbHBUaW1lLAogICAgICAgIGRlYnVnc3RyX3cobHBGb3JtYXQpLCBscFRpbWVTdHIsIGNjaE91dCk7CgogIHJldHVybiBOTFNfR2V0RGF0ZVRpbWVGb3JtYXRXKGxjaWQsIGR3RmxhZ3N8VElNRV9USU1FVkFSU09OTFksIGxwVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEZvcm1hdCwgbHBUaW1lU3RyLCBjY2hPdXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdEEJKEtFUk5FTDMyLkApCiAqCiAqIEZvcm1hdCBhIG51bWJlciBzdHJpbmcgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogKgogKiBQQVJBTVMKICogIGxjaWQgICAgICAgIFtJXSBMb2NhbGUgdG8gZm9ybWF0IGZvcgogKiAgZHdGbGFncyAgICAgW0ldIExPQ0FMRV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscHN6VmFsdWUgICBbSV0gU3RyaW5nIHRvIGZvcm1hdAogKiAgbHBGb3JtYXQgICAgW0ldIEZvcm1hdHRpbmcgb3ZlcnJpZGVzCiAqICBscE51bWJlclN0ciBbT10gRGVzdGluYXRpb24gZm9yIGZvcm1hdHRlZCBzdHJpbmcKICogIGNjaE91dCAgICAgIFtJXSBTaXplIG9mIGxwTnVtYmVyU3RyLCBvciAwIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNpemUKICoKICogTk9URVMKICogIC0gbHBzelZhbHVlIGNhbiBjb250YWluIG9ubHkgJzAnIC0gJzknLCAnLScgYW5kICcuJy4KICogIC0gSWYgbHBGb3JtYXQgaXMgbm9uLU5VTEwsIGR3RmxhZ3MgbXVzdCBiZSAwLiBJbiB0aGlzIGNhc2UgbHBzelZhbHVlIHdpbGwKICogICAgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGRldGFpbHMgcmV0dXJuZWQgYnkgR2V0TG9jYWxlSW5mb0EoKS4KICogIC0gVGhpcyBmdW5jdGlvbiByb3VuZHMgdGhlIG51bWJlciBzdHJpbmcgaWYgdGhlIG51bWJlciBvZiBkZWNpbWFscyBleGNlZWRzIHRoZQogKiAgICBsb2NhbGVzIG5vcm1hbCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuCiAqICAtIElmIGNjaE91dCBpcyAwLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdyaXRlIHRvIGxwTnVtYmVyU3RyLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwTnVtYmVyU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzelZhbHVlLCAgY29uc3QgTlVNQkVSRk1UQSAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE91dCkKewogIERXT1JEIGNwID0gQ1BfQUNQOwogIFdDSEFSIHN6RGVjWzhdLCBzekdycFs4XSwgc3pJblsxMjhdLCBzek91dFsxMjhdOwogIE5VTUJFUkZNVFcgZm10OwogIGNvbnN0IE5VTUJFUkZNVFcgKnBmbXQgPSBOVUxMOwogIElOVCBpUmV0OwoKICBUUkFDRSgiKDB4JTA0eCwweCUwOHgsJXMsJXAsJXAsJWQpXG4iLCBsY2lkLCBkd0ZsYWdzLCBkZWJ1Z3N0cl9hKGxwc3pWYWx1ZSksCiAgICAgICAgbHBGb3JtYXQsIGxwTnVtYmVyU3RyLCBjY2hPdXQpOwoKICBpZiAoTkxTX0lzVW5pY29kZU9ubHlMY2lkKGxjaWQpKQogIHsKR2V0TnVtYmVyRm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXROdW1iZXJGb3JtYXRBX0ludmFsaWRQYXJhbWV0ZXI7CiAgICBjcCA9IG5vZGUtPmR3Q29kZVBhZ2U7CiAgfQoKICBpZiAobHBGb3JtYXQpCiAgewogICAgbWVtY3B5KCZmbXQsIGxwRm9ybWF0LCBzaXplb2YoZm10KSk7CiAgICBwZm10ID0gJmZtdDsKICAgIGlmIChscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwLCAtMSwgc3pEZWMsIHNpemVvZihzekRlYykvc2l6ZW9mKFdDSEFSKSk7CiAgICAgIGZtdC5scERlY2ltYWxTZXAgPSBzekRlYzsKICAgIH0KICAgIGlmIChscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgIHsKICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgMCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAsIC0xLCBzekdycCwgc2l6ZW9mKHN6R3JwKS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwVGhvdXNhbmRTZXAgPSBzekdycDsKICAgIH0KICB9CgogIGlmIChscHN6VmFsdWUpCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscHN6VmFsdWUsIC0xLCBzekluLCBzaXplb2Yoc3pJbikvc2l6ZW9mKFdDSEFSKSk7CgogIGlmIChjY2hPdXQgPiAoaW50KShzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUikpKQogICAgY2NoT3V0ID0gc2l6ZW9mKHN6T3V0KS9zaXplb2YoV0NIQVIpOwoKICBzek91dFswXSA9ICdcMCc7CgogIGlSZXQgPSBHZXROdW1iZXJGb3JtYXRXKGxjaWQsIGR3RmxhZ3MsIGxwc3pWYWx1ZSA/IHN6SW4gOiBOVUxMLCBwZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxwTnVtYmVyU3RyID8gc3pPdXQgOiBOVUxMLCBjY2hPdXQpOwoKICBpZiAoc3pPdXRbMF0gJiYgbHBOdW1iZXJTdHIpCiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKGNwLCAwLCBzek91dCwgLTEsIGxwTnVtYmVyU3RyLCBjY2hPdXQsIDAsIDApOwogIHJldHVybiBpUmV0Owp9CgovKiBOdW1iZXIgcGFyc2luZyBzdGF0ZSBmbGFncyAqLwojZGVmaW5lIE5GX0lTTkVHQVRJVkUgMHgxICAvKiAnLScgZm91bmQgKi8KI2RlZmluZSBORl9JU1JFQUwgICAgIDB4MiAgLyogJy4nIGZvdW5kICovCiNkZWZpbmUgTkZfRElHSVRTICAgICAweDQgIC8qICcwJy0nOScgZm91bmQgKi8KI2RlZmluZSBORl9ESUdJVFNfT1VUIDB4OCAgLyogRGlnaXRzIGJlZm9yZSB0aGUgJy4nIGZvdW5kICovCiNkZWZpbmUgTkZfUk9VTkQgICAgICAweDEwIC8qIE51bWJlciBuZWVkcyB0byBiZSByb3VuZGVkICovCgovKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIE51bWJlcnMgKi8KI2RlZmluZSBOTFNfTkVHX1BBUkVOUyAgICAgIDAgLyogIigxLjEpIiAqLwojZGVmaW5lIE5MU19ORUdfTEVGVCAgICAgICAgMSAvKiAiLTEuMSIgICovCiNkZWZpbmUgTkxTX05FR19MRUZUX1NQQUNFICAyIC8qICItIDEuMSIgKi8KI2RlZmluZSBOTFNfTkVHX1JJR0hUICAgICAgIDMgLyogIjEuMS0iICAqLwojZGVmaW5lIE5MU19ORUdfUklHSFRfU1BBQ0UgNCAvKiAiMS4xIC0iICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdFcJKEtFUk5FTDMyLkApCiAqCiAqIFNlZSBHZXROdW1iZXJGb3JtYXRBLgogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzelZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hPdXQpCnsKICBXQ0hBUiBzekJ1ZmZbMTI4XSwgKnN6T3V0ID0gc3pCdWZmICsgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpIC0gMTsKICBXQ0hBUiBzek5lZ0J1ZmZbOF07CiAgY29uc3QgV0NIQVIgKmxwc3pOZWcgPSBOVUxMLCAqbHBzek5lZ1N0YXJ0LCAqc3pTcmM7CiAgRFdPUkQgZHdTdGF0ZSA9IDAsIGR3RGVjaW1hbHMgPSAwLCBkd0dyb3VwQ291bnQgPSAwLCBkd0N1cnJlbnRHcm91cENvdW50ID0gMDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfdyhscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscE51bWJlclN0ciwgY2NoT3V0KTsKCiAgaWYgKCFscHN6VmFsdWUgfHwgY2NoT3V0IDwgMCB8fCAoY2NoT3V0ID4gMCAmJiAhbHBOdW1iZXJTdHIpIHx8CiAgICAgICFJc1ZhbGlkTG9jYWxlKGxjaWQsIDApIHx8CiAgICAgIChscEZvcm1hdCAmJiAoZHdGbGFncyB8fCAhbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCB8fCAhbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApKSkKICB7CkdldE51bWJlckZvcm1hdFdfRXJyb3I6CiAgICBTZXRMYXN0RXJyb3IobHBGb3JtYXQgJiYgZHdGbGFncyA/IEVSUk9SX0lOVkFMSURfRkxBR1MgOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghbHBGb3JtYXQpCiAgewogICAgY29uc3QgTkxTX0ZPUk1BVF9OT0RFICpub2RlID0gTkxTX0dldEZvcm1hdHMobGNpZCwgZHdGbGFncyk7CgogICAgaWYgKCFub2RlKQogICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7CiAgICBscEZvcm1hdCA9ICZub2RlLT5mbXQ7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gR2V0TmVnYXRpdmUobm9kZSk7CiAgfQogIGVsc2UKICB7CiAgICBHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU05FR0FUSVZFU0lHTnwoZHdGbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSksCiAgICAgICAgICAgICAgICAgICBzek5lZ0J1ZmYsIHNpemVvZihzek5lZ0J1ZmYpL3NpemVvZihXQ0hBUikpOwogICAgbHBzek5lZ1N0YXJ0ID0gbHBzek5lZyA9IHN6TmVnQnVmZjsKICB9CiAgbHBzek5lZyA9IGxwc3pOZWcgKyBzdHJsZW5XKGxwc3pOZWcpIC0gMTsKCiAgZHdGbGFncyAmPSAoTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCiAgLyogRm9ybWF0IHRoZSBudW1iZXIgYmFja3dhcmRzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCgogIHN6U3JjID0gbHBzelZhbHVlOwogICpzek91dC0tID0gJ1wwJzsKCiAgLyogQ2hlY2sgdGhlIG51bWJlciBmb3IgdmFsaWRpdHkgKi8KICB3aGlsZSAoKnN6U3JjKQogIHsKICAgIGlmICgqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgICB7CiAgICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTOwogICAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgICAgICBkd0RlY2ltYWxzKys7CiAgICB9CiAgICBlbHNlIGlmICgqc3pTcmMgPT0gJy0nKQogICAgewogICAgICBpZiAoZHdTdGF0ZSkKICAgICAgICBnb3RvIEdldE51bWJlckZvcm1hdFdfRXJyb3I7IC8qICctJyBub3QgZmlyc3QgY2hhcmFjdGVyICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNORUdBVElWRTsKICAgIH0KICAgIGVsc2UgaWYgKCpzelNyYyA9PSAnLicpCiAgICB7CiAgICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogTW9yZSB0aGFuIG9uZSAnLicgKi8KICAgICAgZHdTdGF0ZSB8PSBORl9JU1JFQUw7CiAgICB9CiAgICBlbHNlCiAgICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogSW52YWxpZCBjaGFyICovCiAgICBzelNyYysrOwogIH0KICBzelNyYy0tOyAvKiBQb2ludCB0byBsYXN0IGNoYXJhY3RlciAqLwoKICBpZiAoIShkd1N0YXRlICYgTkZfRElHSVRTKSkKICAgIGdvdG8gR2V0TnVtYmVyRm9ybWF0V19FcnJvcjsgLyogTm8gZGlnaXRzICovCgogIC8qIEFkZCBhbnkgdHJhaWxpbmcgbmVnYXRpdmUgc2lnbiAqLwogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICB7CiAgICBzd2l0Y2ggKGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKQogICAgewogICAgY2FzZSBOTFNfTkVHX1BBUkVOUzoKICAgICAgKnN6T3V0LS0gPSAnKSc7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOTFNfTkVHX1JJR0hUOgogICAgY2FzZSBOTFNfTkVHX1JJR0hUX1NQQUNFOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgIGlmIChscEZvcm1hdC0+TmVnYXRpdmVPcmRlciA9PSBOTFNfTkVHX1JJR0hUX1NQQUNFKQogICAgICAgKnN6T3V0LS0gPSAnICc7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgLyogQ29weSBhbGwgZGlnaXRzIHVwIHRvIHRoZSBkZWNpbWFsIHBvaW50ICovCiAgaWYgKCFscEZvcm1hdC0+TnVtRGlnaXRzKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgewogICAgICB3aGlsZSAoKnN6U3JjICE9ICcuJykgLyogRG9uJ3Qgd3JpdGUgYW55IGRlY2ltYWxzIG9yIGEgc2VwYXJhdG9yICovCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIExQV1NUUiBscHN6RGVjID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkgLSAxOwoKICAgIGlmIChkd0RlY2ltYWxzIDw9IGxwRm9ybWF0LT5OdW1EaWdpdHMpCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgPSBscEZvcm1hdC0+TnVtRGlnaXRzIC0gZHdEZWNpbWFsczsKICAgICAgd2hpbGUgKGR3RGVjaW1hbHMtLSkKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogUGFkIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGRwICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgLT0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgLyogU2tpcCBleGNlc3MgZGVjaW1hbHMsIGFuZCBkZXRlcm1pbmUgaWYgd2UgaGF2ZSB0byByb3VuZCB0aGUgbnVtYmVyICovCiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpCiAgICAgIHsKICAgICAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgICAgIHsKICAgICAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgICAgIH0KICAgICAgICAgIHN6U3JjLS07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICpzek91dC0tID0gKnN6U3JjLS07IC8qIFdyaXRlIGV4aXN0aW5nIGRlY2ltYWxzICovCiAgICAgIH0KICAgICAgc3pTcmMtLTsgLyogU2tpcCAnLicgKi8KICAgIH0KCiAgICB3aGlsZSAobHBzekRlYyA+PSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKQogICAgICAqc3pPdXQtLSA9ICpscHN6RGVjLS07IC8qIFdyaXRlIGRlY2ltYWwgc2VwYXJhdG9yICovCiAgfQoKICBkd0dyb3VwQ291bnQgPSBscEZvcm1hdC0+R3JvdXBpbmcgPT0gMzIgPyAzIDogbHBGb3JtYXQtPkdyb3VwaW5nOwoKICAvKiBXcml0ZSB0aGUgcmVtYWluaW5nIHdob2xlIG51bWJlciBkaWdpdHMsIGluY2x1ZGluZyBncm91cGluZyBjaGFycyAqLwogIHdoaWxlIChzelNyYyA+PSBscHN6VmFsdWUgJiYgKnN6U3JjID49ICcwJyAmJiAqc3pTcmMgPD0gJzknKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgICB7CiAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICpzek91dC0tID0gJzAnOyAvKiBjb250aW51ZSByb3VuZGluZyAqLwogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBkd1N0YXRlICY9IH5ORl9ST1VORDsKICAgICAgICAqc3pPdXQtLSA9ICgqc3pTcmMpKzE7CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICAgIGVsc2UKICAgICAgKnN6T3V0LS0gPSAqc3pTcmMtLTsKCiAgICBkd1N0YXRlIHw9IE5GX0RJR0lUU19PVVQ7CiAgICBkd0N1cnJlbnRHcm91cENvdW50Kys7CiAgICBpZiAoc3pTcmMgPj0gbHBzelZhbHVlICYmIGR3Q3VycmVudEdyb3VwQ291bnQgPT0gZHdHcm91cENvdW50ICYmICpzelNyYyAhPSAnLScpCiAgICB7CiAgICAgIExQV1NUUiBscHN6R3JwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXAgKyBzdHJsZW5XKGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKSAtIDE7CgogICAgICB3aGlsZSAobHBzekdycCA+PSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6R3JwLS07IC8qIFdyaXRlIGdyb3VwaW5nIGNoYXIgKi8KCiAgICAgIGR3Q3VycmVudEdyb3VwQ291bnQgPSAwOwogICAgICBpZiAobHBGb3JtYXQtPkdyb3VwaW5nID09IDMyKQogICAgICAgIGR3R3JvdXBDb3VudCA9IDI7IC8qIEluZGljIGdyb3VwaW5nOiAzIHRoZW4gMiAqLwogICAgfQogIH0KICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogIHsKICAgICpzek91dC0tID0gJzEnOyAvKiBlLmcuIC42ID4gMS4wICovCiAgfQogIGVsc2UgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUU19PVVQpICYmIGxwRm9ybWF0LT5MZWFkaW5nWmVybykKICAgICpzek91dC0tID0gJzAnOyAvKiBBZGQgbGVhZGluZyAwIGlmIHdlIGhhdmUgbm8gZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCAqLwoKICAvKiBBZGQgYW55IGxlYWRpbmcgbmVnYXRpdmUgc2lnbiAqLwogIGlmIChkd1N0YXRlICYgTkZfSVNORUdBVElWRSkKICB7CiAgICBzd2l0Y2ggKGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKQogICAgewogICAgY2FzZSBOTFNfTkVHX1BBUkVOUzoKICAgICAgKnN6T3V0LS0gPSAnKCc7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOTFNfTkVHX0xFRlRfU1BBQ0U6CiAgICAgICpzek91dC0tID0gJyAnOwogICAgICAvKiBGYWxsIHRocm91Z2ggKi8KICAgIGNhc2UgTkxTX05FR19MRUZUOgogICAgICB3aGlsZSAobHBzek5lZyA+PSBscHN6TmVnU3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzek5lZy0tOwogICAgICBicmVhazsKICAgIH0KICB9CiAgc3pPdXQrKzsKCiAgaVJldCA9IHN0cmxlblcoc3pPdXQpICsgMTsKICBpZiAoY2NoT3V0KQogIHsKICAgIGlmIChpUmV0IDw9IGNjaE91dCkKICAgICAgbWVtY3B5KGxwTnVtYmVyU3RyLCBzek91dCwgaVJldCAqIHNpemVvZihXQ0hBUikpOwogICAgZWxzZQogICAgewogICAgICBtZW1jcHkobHBOdW1iZXJTdHIsIHN6T3V0LCBjY2hPdXQgKiBzaXplb2YoV0NIQVIpKTsKICAgICAgbHBOdW1iZXJTdHJbY2NoT3V0IC0gMV0gPSAnXDAnOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIGlSZXQgPSAwOwogICAgfQogIH0KICByZXR1cm4gaVJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdEEJKEtFUk5FTDMyLkApCiAqCiAqIEZvcm1hdCBhIGN1cnJlbmN5IHN0cmluZyBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIFBBUkFNUwogKiAgbGNpZCAgICAgICAgICBbSV0gTG9jYWxlIHRvIGZvcm1hdCBmb3IKICogIGR3RmxhZ3MgICAgICAgW0ldIExPQ0FMRV8gZmxhZ3MgZnJvbSAid2lubmxzLmgiCiAqICBscHN6VmFsdWUgICAgIFtJXSBTdHJpbmcgdG8gZm9ybWF0CiAqICBscEZvcm1hdCAgICAgIFtJXSBGb3JtYXR0aW5nIG92ZXJyaWRlcwogKiAgbHBDdXJyZW5jeVN0ciBbT10gRGVzdGluYXRpb24gZm9yIGZvcm1hdHRlZCBzdHJpbmcKICogIGNjaE91dCAgICAgICAgW0ldIFNpemUgb2YgbHBDdXJyZW5jeVN0ciwgb3IgMCB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzaXplCiAqCiAqIE5PVEVTCiAqICAtIGxwc3pWYWx1ZSBjYW4gY29udGFpbiBvbmx5ICcwJyAtICc5JywgJy0nIGFuZCAnLicuCiAqICAtIElmIGxwRm9ybWF0IGlzIG5vbi1OVUxMLCBkd0ZsYWdzIG11c3QgYmUgMC4gSW4gdGhpcyBjYXNlIGxwc3pWYWx1ZSB3aWxsCiAqICAgIGJlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZXRhaWxzIHJldHVybmVkIGJ5IEdldExvY2FsZUluZm9BKCkuCiAqICAtIFRoaXMgZnVuY3Rpb24gcm91bmRzIHRoZSBjdXJyZW5jeSBpZiB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGV4Y2VlZHMgdGhlCiAqICAgIGxvY2FsZXMgbnVtYmVyIG9mIGN1cnJlbmN5IGRlY2ltYWwgcGxhY2VzLgogKiAgLSBJZiBjY2hPdXQgaXMgMCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3cml0ZSB0byBscEN1cnJlbmN5U3RyLgogKiAgLSBUaGUgQXNjaWkgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGZhaWxzIGlmIGxjaWQgaXMgVW5pY29kZSBvbmx5LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciB3cml0dGVuIHRvIGxwTnVtYmVyU3RyLCBvciB0aGF0IHdvdWxkCiAqICAgICAgICAgICBoYXZlIGJlZW4gd3JpdHRlbiwgaWYgY2NoT3V0IGlzIDAuCiAqICBGYWlsdXJlOiAwLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRBKExDSUQgbGNpZCwgRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3pWYWx1ZSwgIGNvbnN0IENVUlJFTkNZRk1UQSAqbHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hPdXQpCnsKICBEV09SRCBjcCA9IENQX0FDUDsKICBXQ0hBUiBzekRlY1s4XSwgc3pHcnBbOF0sIHN6Q3lbOF0sIHN6SW5bMTI4XSwgc3pPdXRbMTI4XTsKICBDVVJSRU5DWUZNVFcgZm10OwogIGNvbnN0IENVUlJFTkNZRk1UVyAqcGZtdCA9IE5VTEw7CiAgSU5UIGlSZXQ7CgogIFRSQUNFKCIoMHglMDR4LDB4JTA4eCwlcywlcCwlcCwlZClcbiIsIGxjaWQsIGR3RmxhZ3MsIGRlYnVnc3RyX2EobHBzelZhbHVlKSwKICAgICAgICBscEZvcm1hdCwgbHBDdXJyZW5jeVN0ciwgY2NoT3V0KTsKCiAgaWYgKE5MU19Jc1VuaWNvZGVPbmx5TGNpZChsY2lkKSkKICB7CkdldEN1cnJlbmN5Rm9ybWF0QV9JbnZhbGlkUGFyYW1ldGVyOgogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCEoZHdGbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSkKICB7CiAgICBjb25zdCBOTFNfRk9STUFUX05PREUgKm5vZGUgPSBOTFNfR2V0Rm9ybWF0cyhsY2lkLCBkd0ZsYWdzKTsKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdEFfSW52YWxpZFBhcmFtZXRlcjsKICAgIGNwID0gbm9kZS0+ZHdDb2RlUGFnZTsKICB9CgogIGlmIChscEZvcm1hdCkKICB7CiAgICBtZW1jcHkoJmZtdCwgbHBGb3JtYXQsIHNpemVvZihmbXQpKTsKICAgIHBmbXQgPSAmZm10OwogICAgaWYgKGxwRm9ybWF0LT5scERlY2ltYWxTZXApCiAgICB7CiAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwRm9ybWF0LT5scERlY2ltYWxTZXAsIC0xLCBzekRlYywgc2l6ZW9mKHN6RGVjKS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwRGVjaW1hbFNlcCA9IHN6RGVjOwogICAgfQogICAgaWYgKGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCwgLTEsIHN6R3JwLCBzaXplb2Yoc3pHcnApL3NpemVvZihXQ0hBUikpOwogICAgICBmbXQubHBUaG91c2FuZFNlcCA9IHN6R3JwOwogICAgfQogICAgaWYgKGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sKQogICAgewogICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCAwLCBscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCwgLTEsIHN6Q3ksIHNpemVvZihzekN5KS9zaXplb2YoV0NIQVIpKTsKICAgICAgZm10LmxwQ3VycmVuY3lTeW1ib2wgPSBzekN5OwogICAgfQogIH0KCiAgaWYgKGxwc3pWYWx1ZSkKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoY3AsIDAsIGxwc3pWYWx1ZSwgLTEsIHN6SW4sIHNpemVvZihzekluKS9zaXplb2YoV0NIQVIpKTsKCiAgaWYgKGNjaE91dCA+IChpbnQpKHNpemVvZihzek91dCkvc2l6ZW9mKFdDSEFSKSkpCiAgICBjY2hPdXQgPSBzaXplb2Yoc3pPdXQpL3NpemVvZihXQ0hBUik7CgogIHN6T3V0WzBdID0gJ1wwJzsKCiAgaVJldCA9IEdldEN1cnJlbmN5Rm9ybWF0VyhsY2lkLCBkd0ZsYWdzLCBscHN6VmFsdWUgPyBzekluIDogTlVMTCwgcGZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ3VycmVuY3lTdHIgPyBzek91dCA6IE5VTEwsIGNjaE91dCk7CgogIGlmIChzek91dFswXSAmJiBscEN1cnJlbmN5U3RyKQogICAgV2lkZUNoYXJUb011bHRpQnl0ZShjcCwgMCwgc3pPdXQsIC0xLCBscEN1cnJlbmN5U3RyLCBjY2hPdXQsIDAsIDApOwogIHJldHVybiBpUmV0Owp9CgovKiBGb3JtYXR0aW5nIHN0YXRlcyBmb3IgQ3VycmVuY2llcy4gV2UgdXNlIGZsYWdzIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uICovCiNkZWZpbmUgQ0ZfUEFSRU5TICAgICAgIDB4MSAgLyogUGFyZW50aGVzZXMgICAgICAqLwojZGVmaW5lIENGX01JTlVTX0xFRlQgICAweDIgIC8qICctJyB0byB0aGUgbGVmdCAgKi8KI2RlZmluZSBDRl9NSU5VU19SSUdIVCAgMHg0ICAvKiAnLScgdG8gdGhlIHJpZ2h0ICovCiNkZWZpbmUgQ0ZfTUlOVVNfQkVGT1JFIDB4OCAgLyogJy0nIGJlZm9yZSAnJCcgICAqLwojZGVmaW5lIENGX0NZX0xFRlQgICAgICAweDEwIC8qICckJyB0byB0aGUgbGVmdCAgKi8KI2RlZmluZSBDRl9DWV9SSUdIVCAgICAgMHgyMCAvKiAnJCcgdG8gdGhlIHJpZ2h0ICovCiNkZWZpbmUgQ0ZfQ1lfU1BBQ0UgICAgIDB4NDAgLyogJyAnIGJ5ICckJyAgICAgICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLkApCiAqCiAqIFNlZSBHZXRDdXJyZW5jeUZvcm1hdEEuCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0VyhMQ0lEIGxjaWQsIERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgbHBzelZhbHVlLCAgY29uc3QgQ1VSUkVOQ1lGTVRXICpscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hPdXQpCnsKICBzdGF0aWMgY29uc3QgQllURSBOTFNfTmVnQ3lGb3JtYXRzWzE2XSA9CiAgewogICAgQ0ZfUEFSRU5TfENGX0NZX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAvKiAoJDEuMSkgKi8KICAgIENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlQsICAgLyogLSQxLjEgICovCiAgICBDRl9NSU5VU19MRUZUfENGX0NZX0xFRlQsICAgICAgICAgICAgICAgICAgIC8qICQtMS4xICAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfTEVGVCwgICAgICAgICAgICAgICAgICAvKiAkMS4xLSAgKi8KICAgIENGX1BBUkVOU3xDRl9DWV9SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgLyogKDEuMSQpICovCiAgICBDRl9NSU5VU19MRUZUfENGX0NZX1JJR0hULCAgICAgICAgICAgICAgICAgIC8qIC0xLjEkICAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hULCAvKiAxLjEtJCAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX1JJR0hULCAgICAgICAgICAgICAgICAgLyogMS4xJC0gICovCiAgICBDRl9NSU5VU19MRUZUfENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAgICAgIC8qIC0xLjEgJCAqLwogICAgQ0ZfTUlOVVNfTEVGVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfTEVGVHxDRl9DWV9TUEFDRSwgICAvKiAtJCAxLjEgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX0NZX1JJR0hUfENGX0NZX1NQQUNFLCAgICAgLyogMS4xICQtICAqLwogICAgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfTEVGVHxDRl9DWV9TUEFDRSwgICAgICAvKiAkIDEuMS0gICovCiAgICBDRl9NSU5VU19MRUZUfENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAgICAgIC8qICQgLTEuMSAgKi8KICAgIENGX01JTlVTX1JJR0hUfENGX01JTlVTX0JFRk9SRXxDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgLyogMS4xLSAkICovCiAgICBDRl9QQVJFTlN8Q0ZfQ1lfTEVGVHxDRl9DWV9TUEFDRSwgICAgICAgICAgIC8qICgkIDEuMSkgKi8KICAgIENGX1BBUkVOU3xDRl9DWV9SSUdIVHxDRl9DWV9TUEFDRSwgICAgICAgICAgLyogKDEuMSAkKSAqLwogIH07CiAgc3RhdGljIGNvbnN0IEJZVEUgTkxTX1Bvc0N5Rm9ybWF0c1s0XSA9CiAgewogICAgQ0ZfQ1lfTEVGVCwgICAgICAgICAgICAgIC8qICQxLjEgICovCiAgICBDRl9DWV9SSUdIVCwgICAgICAgICAgICAgLyogMS4xJCAgKi8KICAgIENGX0NZX0xFRlR8Q0ZfQ1lfU1BBQ0UsICAvKiAkIDEuMSAqLwogICAgQ0ZfQ1lfUklHSFR8Q0ZfQ1lfU1BBQ0UsIC8qIDEuMSAkICovCiAgfTsKICBXQ0hBUiBzekJ1ZmZbMTI4XSwgKnN6T3V0ID0gc3pCdWZmICsgc2l6ZW9mKHN6QnVmZikgLyBzaXplb2YoV0NIQVIpIC0gMTsKICBXQ0hBUiBzek5lZ0J1ZmZbOF07CiAgY29uc3QgV0NIQVIgKmxwc3pOZWcgPSBOVUxMLCAqbHBzek5lZ1N0YXJ0LCAqc3pTcmMsICpscHN6Q3ksICpscHN6Q3lTdGFydDsKICBEV09SRCBkd1N0YXRlID0gMCwgZHdEZWNpbWFscyA9IDAsIGR3R3JvdXBDb3VudCA9IDAsIGR3Q3VycmVudEdyb3VwQ291bnQgPSAwLCBkd0ZtdDsKICBJTlQgaVJldDsKCiAgVFJBQ0UoIigweCUwNHgsMHglMDh4LCVzLCVwLCVwLCVkKVxuIiwgbGNpZCwgZHdGbGFncywgZGVidWdzdHJfdyhscHN6VmFsdWUpLAogICAgICAgIGxwRm9ybWF0LCBscEN1cnJlbmN5U3RyLCBjY2hPdXQpOwoKICBpZiAoIWxwc3pWYWx1ZSB8fCBjY2hPdXQgPCAwIHx8IChjY2hPdXQgPiAwICYmICFscEN1cnJlbmN5U3RyKSB8fAogICAgICAhSXNWYWxpZExvY2FsZShsY2lkLCAwKSB8fAogICAgICAobHBGb3JtYXQgJiYgKGR3RmxhZ3MgfHwgIWxwRm9ybWF0LT5scERlY2ltYWxTZXAgfHwgIWxwRm9ybWF0LT5scFRob3VzYW5kU2VwIHx8CiAgICAgICFscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCB8fCBscEZvcm1hdC0+TmVnYXRpdmVPcmRlciA+IDE1IHx8CiAgICAgIGxwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyID4gMykpKQogIHsKR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOgogICAgU2V0TGFzdEVycm9yKGxwRm9ybWF0ICYmIGR3RmxhZ3MgPyBFUlJPUl9JTlZBTElEX0ZMQUdTIDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZiAoIWxwRm9ybWF0KQogIHsKICAgIGNvbnN0IE5MU19GT1JNQVRfTk9ERSAqbm9kZSA9IE5MU19HZXRGb3JtYXRzKGxjaWQsIGR3RmxhZ3MpOwoKICAgIGlmICghbm9kZSkKICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7CiAgICBscEZvcm1hdCA9ICZub2RlLT5jeWZtdDsKICAgIGxwc3pOZWdTdGFydCA9IGxwc3pOZWcgPSBHZXROZWdhdGl2ZShub2RlKTsKICB9CiAgZWxzZQogIHsKICAgIEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTkVHQVRJVkVTSUdOfChkd0ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSwKICAgICAgICAgICAgICAgICAgIHN6TmVnQnVmZiwgc2l6ZW9mKHN6TmVnQnVmZikvc2l6ZW9mKFdDSEFSKSk7CiAgICBscHN6TmVnU3RhcnQgPSBscHN6TmVnID0gc3pOZWdCdWZmOwogIH0KICBkd0ZsYWdzICY9IChMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKICBscHN6TmVnID0gbHBzek5lZyArIHN0cmxlblcobHBzek5lZykgLSAxOwogIGxwc3pDeVN0YXJ0ID0gbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2w7CiAgbHBzekN5ID0gbHBzekN5U3RhcnQgKyBzdHJsZW5XKGxwc3pDeVN0YXJ0KSAtIDE7CgogIC8qIEZvcm1hdCB0aGUgY3VycmVuY3kgYmFja3dhcmRzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCgogIHN6U3JjID0gbHBzelZhbHVlOwogICpzek91dC0tID0gJ1wwJzsKCiAgLyogQ2hlY2sgdGhlIG51bWJlciBmb3IgdmFsaWRpdHkgKi8KICB3aGlsZSAoKnN6U3JjKQogIHsKICAgIGlmICgqc3pTcmMgPj0gJzAnICYmICpzelNyYyA8PSAnOScpCiAgICB7CiAgICAgIGR3U3RhdGUgfD0gTkZfRElHSVRTOwogICAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgICAgICBkd0RlY2ltYWxzKys7CiAgICB9CiAgICBlbHNlIGlmICgqc3pTcmMgPT0gJy0nKQogICAgewogICAgICBpZiAoZHdTdGF0ZSkKICAgICAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogJy0nIG5vdCBmaXJzdCBjaGFyYWN0ZXIgKi8KICAgICAgZHdTdGF0ZSB8PSBORl9JU05FR0FUSVZFOwogICAgfQogICAgZWxzZSBpZiAoKnN6U3JjID09ICcuJykKICAgIHsKICAgICAgaWYgKGR3U3RhdGUgJiBORl9JU1JFQUwpCiAgICAgICAgZ290byBHZXRDdXJyZW5jeUZvcm1hdFdfRXJyb3I7IC8qIE1vcmUgdGhhbiBvbmUgJy4nICovCiAgICAgIGR3U3RhdGUgfD0gTkZfSVNSRUFMOwogICAgfQogICAgZWxzZQogICAgICBnb3RvIEdldEN1cnJlbmN5Rm9ybWF0V19FcnJvcjsgLyogSW52YWxpZCBjaGFyICovCiAgICBzelNyYysrOwogIH0KICBzelNyYy0tOyAvKiBQb2ludCB0byBsYXN0IGNoYXJhY3RlciAqLwoKICBpZiAoIShkd1N0YXRlICYgTkZfRElHSVRTKSkKICAgIGdvdG8gR2V0Q3VycmVuY3lGb3JtYXRXX0Vycm9yOyAvKiBObyBkaWdpdHMgKi8KCiAgaWYgKGR3U3RhdGUgJiBORl9JU05FR0FUSVZFKQogICAgZHdGbXQgPSBOTFNfTmVnQ3lGb3JtYXRzW2xwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyXTsKICBlbHNlCiAgICBkd0ZtdCA9IE5MU19Qb3NDeUZvcm1hdHNbbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXJdOwoKICAvKiBBZGQgYW55IHRyYWlsaW5nIG5lZ2F0aXZlIG9yIGN1cnJlbmN5IHNpZ25zICovCiAgaWYgKGR3Rm10ICYgQ0ZfUEFSRU5TKQogICAgKnN6T3V0LS0gPSAnKSc7CgogIHdoaWxlIChkd0ZtdCAmIChDRl9NSU5VU19SSUdIVHxDRl9DWV9SSUdIVCkpCiAgewogICAgc3dpdGNoIChkd0ZtdCAmIChDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFQpKQogICAgewogICAgY2FzZSBDRl9NSU5VU19SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfUklHSFR8Q0ZfQ1lfUklHSFQ6CiAgICAgIHdoaWxlIChscHN6TmVnID49IGxwc3pOZWdTdGFydCkKICAgICAgICAqc3pPdXQtLSA9ICpscHN6TmVnLS07CiAgICAgIGR3Rm10ICY9IH5DRl9NSU5VU19SSUdIVDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBDRl9DWV9SSUdIVDoKICAgIGNhc2UgQ0ZfTUlOVVNfQkVGT1JFfENGX0NZX1JJR0hUOgogICAgY2FzZSBDRl9NSU5VU19SSUdIVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfUklHSFQ6CiAgICAgIHdoaWxlIChscHN6Q3kgPj0gbHBzekN5U3RhcnQpCiAgICAgICAgKnN6T3V0LS0gPSAqbHBzekN5LS07CiAgICAgIGlmIChkd0ZtdCAmIENGX0NZX1NQQUNFKQogICAgICAgICpzek91dC0tID0gJyAnOwogICAgICBkd0ZtdCAmPSB+KENGX0NZX1JJR0hUfENGX01JTlVTX0JFRk9SRSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgLyogQ29weSBhbGwgZGlnaXRzIHVwIHRvIHRoZSBkZWNpbWFsIHBvaW50ICovCiAgaWYgKCFscEZvcm1hdC0+TnVtRGlnaXRzKQogIHsKICAgIGlmIChkd1N0YXRlICYgTkZfSVNSRUFMKQogICAgewogICAgICB3aGlsZSAoKnN6U3JjICE9ICcuJykgLyogRG9uJ3Qgd3JpdGUgYW55IGRlY2ltYWxzIG9yIGEgc2VwYXJhdG9yICovCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgICAgc3pTcmMtLTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIExQV1NUUiBscHN6RGVjID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwRGVjaW1hbFNlcCkgLSAxOwoKICAgIGlmIChkd0RlY2ltYWxzIDw9IGxwRm9ybWF0LT5OdW1EaWdpdHMpCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgPSBscEZvcm1hdC0+TnVtRGlnaXRzIC0gZHdEZWNpbWFsczsKICAgICAgd2hpbGUgKGR3RGVjaW1hbHMtLSkKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogUGFkIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGRwICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGR3RGVjaW1hbHMgLT0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgLyogU2tpcCBleGNlc3MgZGVjaW1hbHMsIGFuZCBkZXRlcm1pbmUgaWYgd2UgaGF2ZSB0byByb3VuZCB0aGUgbnVtYmVyICovCiAgICAgIHdoaWxlIChkd0RlY2ltYWxzLS0pCiAgICAgIHsKICAgICAgICBpZiAoKnN6U3JjID49ICc1JyB8fCAoKnN6U3JjID09ICc0JyAmJiAoZHdTdGF0ZSAmIE5GX1JPVU5EKSkpCiAgICAgICAgICBkd1N0YXRlIHw9IE5GX1JPVU5EOwogICAgICAgIGVsc2UKICAgICAgICAgIGR3U3RhdGUgJj0gfk5GX1JPVU5EOwogICAgICAgIHN6U3JjLS07CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZHdTdGF0ZSAmIE5GX0lTUkVBTCkKICAgIHsKICAgICAgd2hpbGUgKCpzelNyYyAhPSAnLicpCiAgICAgIHsKICAgICAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgICAgIHsKICAgICAgICAgIGlmICgqc3pTcmMgPT0gJzknKQogICAgICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgICAgICpzek91dC0tID0gKCpzelNyYykrMTsKICAgICAgICAgIH0KICAgICAgICAgIHN6U3JjLS07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICpzek91dC0tID0gKnN6U3JjLS07IC8qIFdyaXRlIGV4aXN0aW5nIGRlY2ltYWxzICovCiAgICAgIH0KICAgICAgc3pTcmMtLTsgLyogU2tpcCAnLicgKi8KICAgIH0KICAgIHdoaWxlIChscHN6RGVjID49IGxwRm9ybWF0LT5scERlY2ltYWxTZXApCiAgICAgICpzek91dC0tID0gKmxwc3pEZWMtLTsgLyogV3JpdGUgZGVjaW1hbCBzZXBhcmF0b3IgKi8KICB9CgogIGR3R3JvdXBDb3VudCA9IGxwRm9ybWF0LT5Hcm91cGluZzsKCiAgLyogV3JpdGUgdGhlIHJlbWFpbmluZyB3aG9sZSBudW1iZXIgZGlnaXRzLCBpbmNsdWRpbmcgZ3JvdXBpbmcgY2hhcnMgKi8KICB3aGlsZSAoc3pTcmMgPj0gbHBzelZhbHVlICYmICpzelNyYyA+PSAnMCcgJiYgKnN6U3JjIDw9ICc5JykKICB7CiAgICBpZiAoZHdTdGF0ZSAmIE5GX1JPVU5EKQogICAgewogICAgICBpZiAoKnN6U3JjID09ICc5JykKICAgICAgICAqc3pPdXQtLSA9ICcwJzsgLyogY29udGludWUgcm91bmRpbmcgKi8KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgZHdTdGF0ZSAmPSB+TkZfUk9VTkQ7CiAgICAgICAgKnN6T3V0LS0gPSAoKnN6U3JjKSsxOwogICAgICB9CiAgICAgIHN6U3JjLS07CiAgICB9CiAgICBlbHNlCiAgICAgICpzek91dC0tID0gKnN6U3JjLS07CgogICAgZHdTdGF0ZSB8PSBORl9ESUdJVFNfT1VUOwogICAgZHdDdXJyZW50R3JvdXBDb3VudCsrOwogICAgaWYgKHN6U3JjID49IGxwc3pWYWx1ZSAmJiBkd0N1cnJlbnRHcm91cENvdW50ID09IGR3R3JvdXBDb3VudCkKICAgIHsKICAgICAgTFBXU1RSIGxwc3pHcnAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCArIHN0cmxlblcobHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApIC0gMTsKCiAgICAgIHdoaWxlIChscHN6R3JwID49IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKQogICAgICAgICpzek91dC0tID0gKmxwc3pHcnAtLTsgLyogV3JpdGUgZ3JvdXBpbmcgY2hhciAqLwoKICAgICAgZHdDdXJyZW50R3JvdXBDb3VudCA9IDA7CiAgICB9CiAgfQogIGlmIChkd1N0YXRlICYgTkZfUk9VTkQpCiAgICAqc3pPdXQtLSA9ICcxJzsgLyogZS5nLiAuNiA+IDEuMCAqLwogIGVsc2UgaWYgKCEoZHdTdGF0ZSAmIE5GX0RJR0lUU19PVVQpICYmIGxwRm9ybWF0LT5MZWFkaW5nWmVybykKICAgICpzek91dC0tID0gJzAnOyAvKiBBZGQgbGVhZGluZyAwIGlmIHdlIGhhdmUgbm8gZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCAqLwoKICAvKiBBZGQgYW55IGxlYWRpbmcgbmVnYXRpdmUgb3IgY3VycmVuY3kgc2lnbiAqLwogIHdoaWxlIChkd0ZtdCAmIChDRl9NSU5VU19MRUZUfENGX0NZX0xFRlQpKQogIHsKICAgIHN3aXRjaCAoZHdGbXQgJiAoQ0ZfTUlOVVNfTEVGVHxDRl9NSU5VU19CRUZPUkV8Q0ZfQ1lfTEVGVCkpCiAgICB7CiAgICBjYXNlIENGX01JTlVTX0xFRlQ6CiAgICBjYXNlIENGX01JTlVTX0xFRlR8Q0ZfQ1lfTEVGVDoKICAgICAgd2hpbGUgKGxwc3pOZWcgPj0gbHBzek5lZ1N0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pOZWctLTsKICAgICAgZHdGbXQgJj0gfkNGX01JTlVTX0xFRlQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ0ZfQ1lfTEVGVDoKICAgIGNhc2UgQ0ZfQ1lfTEVGVHxDRl9NSU5VU19CRUZPUkU6CiAgICBjYXNlIENGX01JTlVTX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFfENGX0NZX0xFRlQ6CiAgICAgIGlmIChkd0ZtdCAmIENGX0NZX1NQQUNFKQogICAgICAgICpzek91dC0tID0gJyAnOwogICAgICB3aGlsZSAobHBzekN5ID49IGxwc3pDeVN0YXJ0KQogICAgICAgICpzek91dC0tID0gKmxwc3pDeS0tOwogICAgICBkd0ZtdCAmPSB+KENGX0NZX0xFRlR8Q0ZfTUlOVVNfQkVGT1JFKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChkd0ZtdCAmIENGX1BBUkVOUykKICAgICpzek91dC0tID0gJygnOwogIHN6T3V0Kys7CgogIGlSZXQgPSBzdHJsZW5XKHN6T3V0KSArIDE7CiAgaWYgKGNjaE91dCkKICB7CiAgICBpZiAoaVJldCA8PSBjY2hPdXQpCiAgICAgIG1lbWNweShscEN1cnJlbmN5U3RyLCBzek91dCwgaVJldCAqIHNpemVvZihXQ0hBUikpOwogICAgZWxzZQogICAgewogICAgICBtZW1jcHkobHBDdXJyZW5jeVN0ciwgc3pPdXQsIGNjaE91dCAqIHNpemVvZihXQ0hBUikpOwogICAgICBscEN1cnJlbmN5U3RyW2NjaE91dCAtIDFdID0gJ1wwJzsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBpUmV0ID0gMDsKICAgIH0KICB9CiAgcmV0dXJuIGlSZXQ7Cn0KCi8qIEZJWE1FOiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgbmVlZHMgdG8gbW92ZSBzb21ld2hlcmUgZWxzZSBhbG9uZyB3aXRoIHRoZQogKiAgICAgICAgb3RoZXIgRW51bVhYWCBmdW5jdGlvbnMsIHdoZW4gYSBtZXRob2QgZm9yIHN0b3JpbmcgcmVzb3VyY2VzIGZvcgogKiAgICAgICAgYWx0ZXJuYXRlIGNhbGVuZGFycyBpcyBkZXRlcm1pbmVkLgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzRXhBICAgIChLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNFeEEoREFURUZNVF9FTlVNUFJPQ0VYQSBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBDQUxJRCBjYWxfaWQ7CiAgICBjaGFyIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAoIUdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFfExPQ0FMRV9SRVRVUk5fTlVNQkVSLCAoTFBXU1RSKSZjYWxfaWQsIHNpemVvZihjYWxfaWQpL3NpemVvZihXQ0hBUikpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBEQVRFX1NIT1JUREFURToKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NTSE9SVERBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmLCBjYWxfaWQpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzRXhXICAgIChLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzRXhXKERBVEVGTVRfRU5VTVBST0NFWFcgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgQ0FMSUQgY2FsX2lkOwogICAgV0NIQVIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmICghR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX0lDQUxFTkRBUlRZUEV8TE9DQUxFX1JFVFVSTl9OVU1CRVIsIChMUFdTVFIpJmNhbF9pZCwgc2l6ZW9mKGNhbF9pZCkvc2l6ZW9mKFdDSEFSKSkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1NIT1JUREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1ZiwgY2FsX2lkKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTE9OR0RBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX1lFQVJNT05USDoKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb1cobGNpZCwgTE9DQUxFX1NZRUFSTU9OVEggfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYsIGNhbF9pZCk7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNBCShLRVJORUwzMi5AKQogKgogKiBGSVhNRTogTVNETiBtZW50aW9ucyBvbmx5IExPQ0FMRV9VU0VfQ1BfQUNQLCBzaG91bGQgd2UgaGFuZGxlCiAqIExPQ0FMRV9OT1VTRVJPVkVSUklERSBoZXJlIGFzIHdlbGw/CiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKERBVEVGTVRfRU5VTVBST0NBIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIGNoYXIgYnVmWzI1Nl07CgogICAgaWYgKCFwcm9jKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN3aXRjaCAoZmxhZ3MgJiB+TE9DQUxFX1VTRV9DUF9BQ1ApCiAgICB7CiAgICBjYXNlIDA6CiAgICBjYXNlIERBVEVfU0hPUlREQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1NIT1JUREFURSB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0xPTkdEQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfWUVBUk1PTlRIOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU1lFQVJNT05USCB8IChmbGFncyAmIExPQ0FMRV9VU0VfQ1BfQUNQKSwgYnVmLCAyNTYpKQogICAgICAgICAgICBwcm9jKGJ1Zik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWQpXG4iLCBmbGFncyk7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVyhEQVRFRk1UX0VOVU1QUk9DVyBwcm9jLCBMQ0lEIGxjaWQsIERXT1JEIGZsYWdzKQp7CiAgICBXQ0hBUiBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgREFURV9TSE9SVERBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TU0hPUlREQVRFIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TTE9OR0RBVEUgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREFURV9ZRUFSTU9OVEg6CiAgICAgICAgaWYgKEdldExvY2FsZUluZm9XKGxjaWQsIExPQ0FMRV9TWUVBUk1PTlRIIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqCiAqIEZJWE1FOiBNU0ROIG1lbnRpb25zIG9ubHkgTE9DQUxFX1VTRV9DUF9BQ1AsIHNob3VsZCB3ZSBoYW5kbGUKICogTE9DQUxFX05PVVNFUk9WRVJSSURFIGhlcmUgYXMgd2VsbD8KICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoVElNRUZNVF9FTlVNUFJPQ0EgcHJvYywgTENJRCBsY2lkLCBEV09SRCBmbGFncykKewogICAgY2hhciBidWZbMjU2XTsKCiAgICBpZiAoIXByb2MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3dpdGNoIChmbGFncyAmIH5MT0NBTEVfVVNFX0NQX0FDUCkKICAgIHsKICAgIGNhc2UgMDoKICAgICAgICBpZiAoR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NUSU1FRk9STUFUIHwgKGZsYWdzICYgTE9DQUxFX1VTRV9DUF9BQ1ApLCBidWYsIDI1NikpCiAgICAgICAgICAgIHByb2MoYnVmKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIHRpbWUgZm9ybWF0ICglZClcbiIsIGZsYWdzKTsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKFRJTUVGTVRfRU5VTVBST0NXIHByb2MsIExDSUQgbGNpZCwgRFdPUkQgZmxhZ3MpCnsKICAgIFdDSEFSIGJ1ZlsyNTZdOwoKICAgIGlmICghcHJvYykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKGZsYWdzICYgfkxPQ0FMRV9VU0VfQ1BfQUNQKQogICAgewogICAgY2FzZSAwOgogICAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsY2lkLCBMT0NBTEVfU1RJTUVGT1JNQVQgfCAoZmxhZ3MgJiBMT0NBTEVfVVNFX0NQX0FDUCksIGJ1ZiwgMjU2KSkKICAgICAgICAgICAgcHJvYyhidWYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVkKVxuIiwgZmxhZ3MpOwogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTkxTX0VudW1DYWxlbmRhckluZm9BVyA8aW50ZXJuYWw+CiAqIEVudW1lcmF0ZXMgY2FsZW5kYXIgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWVkIGxvY2FsZS4KICoKICogUEFSQU1TCiAqICAgIGNhbGluZm9wcm9jIFtJXSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjawogKiAgICBsb2NhbGUgICAgICBbSV0gVGhlIGxvY2FsZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgY2FsZW5kYXIgaW5mb3JtYXRpb24uCiAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIGJ5IHRoZQogKiAgICAgICAgICAgICAgICAgICAgTUFLRUxDSUQgbWFjcm8sIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogICAgICAgICAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBkZWZhdWx0IHN5c3RlbSBsb2NhbGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxFX1VTRVJfREVGQVVMVAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGRlZmF1bHQgdXNlciBsb2NhbGUuCiAqICAgIGNhbGVuZGFyICAgIFtJXSBUaGUgY2FsZW5kYXIgZm9yIHdoaWNoIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCwgb3IKICogICAgICAgICAgICAgICAgICAgIEVOVU1fQUxMX0NBTEVOREFSUy4KICogICAgY2FsdHlwZSAgICAgW0ldIFRoZSB0eXBlIG9mIGNhbGVuZGFyIGluZm9ybWF0aW9uIHRvIGJlIHJldHVybmVkLiBOb3RlCiAqICAgICAgICAgICAgICAgICAgICB0aGF0IG9ubHkgb25lIENBTFRZUEUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBwZXIgY2FsbAogKiAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbiwgZXhjZXB0IHdoZXJlIG5vdGVkLgogKiAgICB1bmljb2RlICAgICBbSV0gU3BlY2lmaWVzIGlmIHRoZSBjYWxsYmFjayBleHBlY3RzIGEgdW5pY29kZSBzdHJpbmcuCiAqICAgIGV4ICAgICAgICAgIFtJXSBTcGVjaWZpZXMgaWYgdGhlIGNhbGxiYWNrIG5lZWRzIHRoZSBjYWxlbmRhciBpZGVudGlmaWVyLgogKgogKiBSRVRVUk5TCiAqICAgIFN1Y2Nlc3M6IFRSVUUuCiAqICAgIEZhaWx1cmU6IEZBTFNFLiBVc2UgR2V0TGFzdEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZS4KICoKICogTk9URVMKICogICAgV2hlbiB0aGUgQU5TSSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIGEgVW5pY29kZS1vbmx5IExDSUQsCiAqICAgIHRoZSBjYWxsIGNhbiBzdWNjZWVkIGJlY2F1c2UgdGhlIHN5c3RlbSB1c2VzIHRoZSBzeXN0ZW0gY29kZSBwYWdlLgogKiAgICBIb3dldmVyLCBjaGFyYWN0ZXJzIHRoYXQgYXJlIHVuZGVmaW5lZCBpbiB0aGUgc3lzdGVtIGNvZGUgcGFnZSBhcHBlYXIKICogICAgaW4gdGhlIHN0cmluZyBhcyBhIHF1ZXN0aW9uIG1hcmsgKD8pLgogKgogKiBUT0RPCiAqICAgIFRoZSBhYm92ZSBub3RlIHNob3VsZCBiZSByZXNwZWN0ZWQgYnkgR2V0Q2FsZW5kYXJJbmZvQS4KICovCnN0YXRpYyBCT09MIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcodm9pZCAqY2FsaW5mb3Byb2MsIExDSUQgbG9jYWxlLAogICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhciwgQ0FMVFlQRSBjYWx0eXBlLCBCT09MIHVuaWNvZGUsIEJPT0wgZXggKQp7CiAgV0NIQVIgKmJ1ZiwgKm9wdCA9IE5VTEwsICppdGVyID0gTlVMTDsKICBCT09MIHJldCA9IEZBTFNFOwogIGludCBidWZTeiA9IDIwMDsJCS8qIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KCiAgaWYgKGNhbGluZm9wcm9jID09IE5VTEwpCiAgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGJ1ZiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZTeik7CiAgaWYgKGJ1ZiA9PSBOVUxMKQogIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoY2FsZW5kYXIgPT0gRU5VTV9BTExfQ0FMRU5EQVJTKQogIHsKICAgIGludCBvcHRTeiA9IEdldExvY2FsZUluZm9XKGxvY2FsZSwgTE9DQUxFX0lPUFRJT05BTENBTEVOREFSLCBOVUxMLCAwKTsKICAgIGlmIChvcHRTeiA+IDEpCiAgICB7CiAgICAgIG9wdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBvcHRTeiAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAob3B0ID09IE5VTEwpCiAgICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgIGdvdG8gTkxTX0VudW1DYWxlbmRhckluZm9BV19DbGVhbnVwOwogICAgICB9CiAgICAgIGlmIChHZXRMb2NhbGVJbmZvVyhsb2NhbGUsIExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgb3B0LCBvcHRTeikpCiAgICAgICAgaXRlciA9IG9wdDsKICAgIH0KICAgIGNhbGVuZGFyID0gTkxTX0dldExvY2FsZU51bWJlcihsb2NhbGUsIExPQ0FMRV9JQ0FMRU5EQVJUWVBFKTsKICB9CgogIHdoaWxlIChUUlVFKQkJCS8qIGxvb3AgdGhyb3VnaCBjYWxlbmRhcnMgKi8KICB7CiAgICBkbwkJCQkvKiBsb29wIHVudGlsIHRoZXJlJ3Mgbm8gZXJyb3IgKi8KICAgIHsKICAgICAgaWYgKHVuaWNvZGUpCiAgICAgICAgcmV0ID0gR2V0Q2FsZW5kYXJJbmZvVyhsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBidWYsIGJ1ZlN6IC8gc2l6ZW9mKFdDSEFSKSwgTlVMTCk7CiAgICAgIGVsc2UgcmV0ID0gR2V0Q2FsZW5kYXJJbmZvQShsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCAoQ0hBUiopYnVmLCBidWZTeiAvIHNpemVvZihDSEFSKSwgTlVMTCk7CgogICAgICBpZiAoIXJldCkKICAgICAgewogICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQogICAgICAgIHsJCQkJLyogc28gcmVzaXplIGl0ICovCiAgICAgICAgICBpbnQgbmV3U3o7CiAgICAgICAgICBpZiAodW5pY29kZSkKICAgICAgICAgICAgbmV3U3ogPSBHZXRDYWxlbmRhckluZm9XKGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIE5VTEwsIDAsIE5VTEwpICogc2l6ZW9mKFdDSEFSKTsKICAgICAgICAgIGVsc2UgbmV3U3ogPSBHZXRDYWxlbmRhckluZm9BKGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIE5VTEwsIDAsIE5VTEwpICogc2l6ZW9mKENIQVIpOwogICAgICAgICAgaWYgKGJ1ZlN6ID49IG5ld1N6KQogICAgICAgICAgewogICAgICAgICAgICBFUlIoIkJ1ZmZlciByZXNpemluZyBkaXNvcmRlcjogd2FzICVkLCByZXF1ZXN0ZWQgJWQuXG4iLCBidWZTeiwgbmV3U3opOwogICAgICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgICAgIH0KICAgICAgICAgIGJ1ZlN6ID0gbmV3U3o7CiAgICAgICAgICBXQVJOKCJCdWZmZXIgdG9vIHNtYWxsOyByZXNpemluZyB0byAlZCBieXRlcy5cbiIsIGJ1ZlN6KTsKICAgICAgICAgIGJ1ZiA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiwgYnVmU3opOwogICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICBnb3RvIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDsKICAgICAgICB9IGVsc2UgZ290byBOTFNfRW51bUNhbGVuZGFySW5mb0FXX0NsZWFudXA7CiAgICAgIH0KICAgIH0gd2hpbGUgKCFyZXQpOwoKICAgIC8qIEhlcmUgd2UgYXJlLiBXZSBwYXNzIHRoZSBidWZmZXIgdG8gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZgogICAgICogdGhlIGNhbGxiYWNrLiBCZWNhdXNlIGl0J3Mgbm90IHRoZSBzYW1lIG51bWJlciBvZiBwYXJhbXMsCiAgICAgKiB3ZSBtdXN0IGNoZWNrIGZvciBFeCwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgVW5pY29kZQogICAgICogYmVjYXVzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LgogICAgICovCiAgICBpZiAoZXgpIHsKICAgICAgcmV0ID0gKChDQUxJTkZPX0VOVU1QUk9DRVhXKWNhbGluZm9wcm9jKShidWYsIGNhbGVuZGFyKTsKICAgIH0gZWxzZQogICAgICByZXQgPSAoKENBTElORk9fRU5VTVBST0NXKWNhbGluZm9wcm9jKShidWYpOwoKICAgIGlmICghcmV0KSB7CQkJLyogdGhlIGNhbGxiYWNrIHRvbGQgdG8gc3RvcCAqLwogICAgICByZXQgPSBUUlVFOwogICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoKGl0ZXIgPT0gTlVMTCkgfHwgKCppdGVyID09IDApKQkvKiBubyBtb3JlIGNhbGVuZGFycyAqLwogICAgICBicmVhazsKCiAgICBjYWxlbmRhciA9IDA7CiAgICB3aGlsZSAoKCppdGVyID49ICcwJykgJiYgKCppdGVyIDw9ICc5JykpCiAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIgKiAxMCArICppdGVyKysgLSAnMCc7CgogICAgaWYgKCppdGVyKysgIT0gMCkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRERCKTsKICAgICAgcmV0ID0gRkFMU0U7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCk5MU19FbnVtQ2FsZW5kYXJJbmZvQVdfQ2xlYW51cDoKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvcHQpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSggQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOHgsMHglMDh4LDB4JTA4eClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgRkFMU0UsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb1cJW0tFUk5FTDMyLkBdCiAqCiAqIFNlZSBFbnVtQ2FsZW5kYXJJbmZvQVcuCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvVyggQ0FMSU5GT19FTlVNUFJPQ1cgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUgKQp7CiAgVFJBQ0UoIiglcCwweCUwOHgsMHglMDh4LDB4JTA4eClcbiIsIGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlKTsKICByZXR1cm4gTkxTX0VudW1DYWxlbmRhckluZm9BVyhjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSwgVFJVRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtQ2FsZW5kYXJJbmZvRXhBCVtLRVJORUwzMi5AXQogKgogKiBTZWUgRW51bUNhbGVuZGFySW5mb0FXLgogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0V4QSggQ0FMSU5GT19FTlVNUFJPQ0VYQSBjYWxpbmZvcHJvYyxMQ0lEIGxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlICkKewogIFRSQUNFKCIoJXAsMHglMDh4LDB4JTA4eCwweCUwOHgpXG4iLCBjYWxpbmZvcHJvYywgbG9jYWxlLCBjYWxlbmRhciwgY2FsdHlwZSk7CiAgcmV0dXJuIE5MU19FbnVtQ2FsZW5kYXJJbmZvQVcoY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUsIEZBTFNFLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0V4VwlbS0VSTkVMMzIuQF0KICoKICogU2VlIEVudW1DYWxlbmRhckluZm9BVy4KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9FeFcoIENBTElORk9fRU5VTVBST0NFWFcgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZSApCnsKICBUUkFDRSgiKCVwLDB4JTA4eCwweCUwOHgsMHglMDh4KVxuIiwgY2FsaW5mb3Byb2MsIGxvY2FsZSwgY2FsZW5kYXIsIGNhbHR5cGUpOwogIHJldHVybiBOTFNfRW51bUNhbGVuZGFySW5mb0FXKGNhbGluZm9wcm9jLCBsb2NhbGUsIGNhbGVuZGFyLCBjYWx0eXBlLCBUUlVFLCBUUlVFKTsKfQo=