LyoKICogUlBDIHNlcnZlciBBUEkKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqCiAqIFRPRE86CiAqICAtIGEgd2hvbGUgbG90CiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgInJwYy5oIgojaW5jbHVkZSAiZXhjcHQuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgoKI2luY2x1ZGUgInJwY19zZXJ2ZXIuaCIKI2luY2x1ZGUgInJwY19taXNjLmgiCiNpbmNsdWRlICJycGNfZGVmcy5oIgoKI2RlZmluZSBNQVhfVEhSRUFEUyAxMjgKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7Cgp0eXBlZGVmIHN0cnVjdCBfUnBjUGFja2V0CnsKICBzdHJ1Y3QgX1JwY1BhY2tldCogbmV4dDsKICBzdHJ1Y3QgX1JwY0Nvbm5lY3Rpb24qIGNvbm47CiAgUnBjUGt0SGRyIGhkcjsKICB2b2lkKiBidWY7Cn0gUnBjUGFja2V0OwoKc3RhdGljIFJwY1NlcnZlclByb3RzZXEqIHByb3RzZXFzOwpzdGF0aWMgUnBjU2VydmVySW50ZXJmYWNlKiBpZnM7CgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBzZXJ2ZXJfY3MgPSBDUklUSUNBTF9TRUNUSU9OX0lOSVQoIlJwY1NlcnZlciIpOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBsaXN0ZW5fY3MgPSBDUklUSUNBTF9TRUNUSU9OX0lOSVQoIlJwY0xpc3RlbiIpOwpzdGF0aWMgQk9PTCBzdGRfbGlzdGVuOwpzdGF0aWMgTE9ORyBsaXN0ZW5fY291bnQgPSAtMTsKc3RhdGljIEhBTkRMRSBtZ3JfZXZlbnQsIHNlcnZlcl90aHJlYWQ7CgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBzcGFja2V0X2NzID0gQ1JJVElDQUxfU0VDVElPTl9JTklUKCJScGNTZXJ2ZXJQYWNrZXQiKTsKc3RhdGljIFJwY1BhY2tldCogc3BhY2tldF9oZWFkOwpzdGF0aWMgUnBjUGFja2V0KiBzcGFja2V0X3RhaWw7CnN0YXRpYyBIQU5ETEUgc2VydmVyX3NlbTsKCnN0YXRpYyBEV09SRCB3b3JrZXJfY291bnQsIHdvcmtlcl9mcmVlLCB3b3JrZXJfdGxzOwoKc3RhdGljIFJwY1NlcnZlckludGVyZmFjZSogUlBDUlQ0X2ZpbmRfaW50ZXJmYWNlKFVVSUQqIG9iamVjdCwgVVVJRCogaWZfaWQpCnsKICBVVUlEKiBNZ3JUeXBlID0gTlVMTDsKICBScGNTZXJ2ZXJJbnRlcmZhY2UqIGNpZiA9IE5VTEw7CiAgUlBDX1NUQVRVUyBzdGF0dXM7CgogIC8qIEZJWE1FOiBvYmplY3QgLT4gTWdyVHlwZSAqLwogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIGNpZiA9IGlmczsKICB3aGlsZSAoY2lmKSB7CiAgICBpZiAoVXVpZEVxdWFsKGlmX2lkLCAmY2lmLT5JZi0+SW50ZXJmYWNlSWQuU3ludGF4R1VJRCwgJnN0YXR1cykgJiYKICAgICAgIFV1aWRFcXVhbChNZ3JUeXBlLCAmY2lmLT5NZ3JUeXBlVXVpZCwgJnN0YXR1cykgJiYKICAgICAgIChzdGRfbGlzdGVuIHx8IChjaWYtPkZsYWdzICYgUlBDX0lGX0FVVE9MSVNURU4pKSkgYnJlYWs7CiAgICBjaWYgPSBjaWYtPk5leHQ7CiAgfQogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIHJldHVybiBjaWY7Cn0KCnN0YXRpYyB2b2lkIFJQQ1JUNF9wdXNoX3BhY2tldChScGNQYWNrZXQqIHBhY2tldCkKewogIHBhY2tldC0+bmV4dCA9IE5VTEw7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwogIGlmIChzcGFja2V0X3RhaWwpIHNwYWNrZXRfdGFpbC0+bmV4dCA9IHBhY2tldDsKICBlbHNlIHsKICAgIHNwYWNrZXRfaGVhZCA9IHBhY2tldDsKICAgIHNwYWNrZXRfdGFpbCA9IHBhY2tldDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwp9CgpzdGF0aWMgUnBjUGFja2V0KiBSUENSVDRfcG9wX3BhY2tldCh2b2lkKQp7CiAgUnBjUGFja2V0KiBwYWNrZXQ7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwogIHBhY2tldCA9IHNwYWNrZXRfaGVhZDsKICBpZiAocGFja2V0KSB7CiAgICBzcGFja2V0X2hlYWQgPSBwYWNrZXQtPm5leHQ7CiAgICBpZiAoIXNwYWNrZXRfaGVhZCkgc3BhY2tldF90YWlsID0gTlVMTDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwogIGlmIChwYWNrZXQpIHBhY2tldC0+bmV4dCA9IE5VTEw7CiAgcmV0dXJuIHBhY2tldDsKfQoKc3RhdGljIFdJTkVfRVhDRVBUSU9OX0ZJTFRFUihycGNfZmlsdGVyKQp7CiAgUFJQQ19NRVNTQUdFIG1zZzsKICBtc2cgPSBUbHNHZXRWYWx1ZSh3b3JrZXJfdGxzKTsKICBJX1JwY0ZyZWVCdWZmZXIobXNnKTsKICBtc2ctPlJwY0ZsYWdzIHw9IFdJTkVfUlBDRkxBR19FWENFUFRJT047CiAgbXNnLT5CdWZmZXJMZW5ndGggPSBzaXplb2YoRFdPUkQpOwogIElfUnBjR2V0QnVmZmVyKG1zZyk7CiAgKihEV09SRCopbXNnLT5CdWZmZXIgPSBHZXRFeGNlcHRpb25Db2RlKCk7CiAgcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7Cn0KCnN0YXRpYyB2b2lkIFJQQ1JUNF9wcm9jZXNzX3BhY2tldChScGNDb25uZWN0aW9uKiBjb25uLCBScGNQa3RIZHIqIGhkciwgdm9pZCogYnVmKQp7CiAgUnBjQmluZGluZyogcGJpbmQ7CiAgUlBDX01FU1NBR0UgbXNnOwogIFJwY1NlcnZlckludGVyZmFjZSogc2lmOwogIFJQQ19ESVNQQVRDSF9GVU5DVElPTiBmdW5jOwoKICBUbHNTZXRWYWx1ZSh3b3JrZXJfdGxzLCAmbXNnKTsKICBtZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogIG1zZy5CdWZmZXJMZW5ndGggPSBoZHItPmxlbjsKICBtc2cuQnVmZmVyID0gYnVmOwogIHNpZiA9IFJQQ1JUNF9maW5kX2ludGVyZmFjZSgmaGRyLT5vYmplY3QsICZoZHItPmlmX2lkKTsKICBpZiAoc2lmKSB7CiAgICBUUkFDRSgicGFja2V0IHJlY2VpdmVkIGZvciBpbnRlcmZhY2UgJXNcbiIsIGRlYnVnc3RyX2d1aWQoJmhkci0+aWZfaWQpKTsKICAgIG1zZy5ScGNJbnRlcmZhY2VJbmZvcm1hdGlvbiA9IHNpZi0+SWY7CiAgICAvKiBjcmVhdGUgdGVtcG9yYXJ5IGJpbmRpbmcgZm9yIGRpc3BhdGNoICovCiAgICBSUENSVDRfTWFrZUJpbmRpbmcoJnBiaW5kLCBjb25uKTsKICAgIFJQQ1JUNF9TZXRCaW5kaW5nT2JqZWN0KHBiaW5kLCAmaGRyLT5vYmplY3QpOwogICAgbXNnLkhhbmRsZSA9IChSUENfQklORElOR19IQU5ETEUpcGJpbmQ7CiAgICAvKiBwcm9jZXNzIHBhY2tldCAqLwogICAgc3dpdGNoIChoZHItPnB0eXBlKSB7CiAgICBjYXNlIFBLVF9SRVFVRVNUOgogICAgICAvKiBmaW5kIGRpc3BhdGNoIGZ1bmN0aW9uICovCiAgICAgIG1zZy5Qcm9jTnVtID0gaGRyLT5vcG51bTsKICAgICAgaWYgKHNpZi0+RmxhZ3MgJiBSUENfSUZfT0xFKSB7CiAgICAgICAgLyogbmF0aXZlIG9sZTMyIGFsd2F5cyBnaXZlcyB1cyBhIGRpc3BhdGNoIHRhYmxlIHdpdGggYSBzaW5nbGUgZW50cnkKICAgICAgICAgKiAoSSBhc3N1bWUgdGhhdCdzIGEgd3JhcHBlciBmb3IgSVJwY1N0dWJCdWZmZXI6Okludm9rZSkgKi8KICAgICAgICBmdW5jID0gKnNpZi0+SWYtPkRpc3BhdGNoVGFibGUtPkRpc3BhdGNoVGFibGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG1zZy5Qcm9jTnVtID49IHNpZi0+SWYtPkRpc3BhdGNoVGFibGUtPkRpc3BhdGNoVGFibGVDb3VudCkgewogICAgICAgICAgRVJSKCJpbnZhbGlkIHByb2NudW1cbiIpOwogICAgICAgICAgZnVuYyA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGZ1bmMgPSBzaWYtPklmLT5EaXNwYXRjaFRhYmxlLT5EaXNwYXRjaFRhYmxlW21zZy5Qcm9jTnVtXTsKICAgICAgfQoKICAgICAgLyogcHV0IGluIHRoZSBkcmVwLiBGSVhNRTogaXMgdGhpcyBtb3JlIHVuaXZlcnNhbGx5IGFwcGxpY2FibGU/CiAgICAgICAgIHBlcmhhcHMgd2Ugc2hvdWxkIG1vdmUgdGhpcyBvdXR3YXJkLi4uICovCiAgICAgIG1zZy5EYXRhUmVwcmVzZW50YXRpb24gPSAKICAgICAgICBNQUtFTE9ORyggTUFLRVdPUkQoaGRyLT5kcmVwWzBdLCBoZHItPmRyZXBbMV0pLAogICAgICAgICAgICAgICAgICBNQUtFV09SRChoZHItPmRyZXBbMl0sIDApKTsKCiAgICAgIC8qIGRpc3BhdGNoICovCiAgICAgIF9fVFJZIHsKICAgICAgICBpZiAoZnVuYykgZnVuYygmbXNnKTsKICAgICAgfSBfX0VYQ0VQVChycGNfZmlsdGVyKSB7CiAgICAgICAgLyogZmFpbHVyZSBwYWNrZXQgd2FzIGNyZWF0ZWQgaW4gcnBjX2ZpbHRlciAqLwogICAgICAgIFRSQUNFKCJleGNlcHRpb24gY2F1Z2h0LCByZXR1cm5pbmcgZmFpbHVyZSBwYWNrZXRcbiIpOwogICAgICB9IF9fRU5EVFJZCgogICAgICAvKiBzZW5kIHJlc3BvbnNlIHBhY2tldCAqLwogICAgICBJX1JwY1NlbmQoJm1zZyk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRVJSKCJ1bmtub3duIHBhY2tldCB0eXBlXG4iKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgUlBDUlQ0X0Rlc3Ryb3lCaW5kaW5nKHBiaW5kKTsKICAgIG1zZy5IYW5kbGUgPSAwOwogICAgbXNnLlJwY0ludGVyZmFjZUluZm9ybWF0aW9uID0gTlVMTDsKICB9CiAgZWxzZSB7CiAgICBFUlIoImdvdCBSUEMgcGFja2V0IHRvIHVucmVnaXN0ZXJlZCBpbnRlcmZhY2UgJXNcbiIsIGRlYnVnc3RyX2d1aWQoJmhkci0+aWZfaWQpKTsKICB9CgogIC8qIGNsZWFuIHVwICovCiAgaWYgKG1zZy5CdWZmZXIgPT0gYnVmKSBtc2cuQnVmZmVyID0gTlVMTDsKICBUUkFDRSgiZnJlZWluZyBCdWZmZXI9JXBcbiIsIGJ1Zik7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmKTsKICBJX1JwY0ZyZWVCdWZmZXIoJm1zZyk7CiAgbXNnLkJ1ZmZlciA9IE5VTEw7CiAgVGxzU2V0VmFsdWUod29ya2VyX3RscywgTlVMTCk7Cn0KCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBSUENSVDRfd29ya2VyX3RocmVhZChMUFZPSUQgdGhlX2FyZykKewogIERXT1JEIG9iajsKICBScGNQYWNrZXQqIHBrdDsKCiAgZm9yICg7OykgewogICAgLyogaWRsZSB0aW1lb3V0IGFmdGVyIDVzICovCiAgICBvYmogPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlcnZlcl9zZW0sIDUwMDApOwogICAgaWYgKG9iaiA9PSBXQUlUX1RJTUVPVVQpIHsKICAgICAgLyogaWYgYW5vdGhlciBpZGxlIHRocmVhZCBleGlzdCwgc2VsZi1kZXN0cnVjdCAqLwogICAgICBpZiAod29ya2VyX2ZyZWUgPiAxKSBicmVhazsKICAgICAgY29udGludWU7CiAgICB9CiAgICBwa3QgPSBSUENSVDRfcG9wX3BhY2tldCgpOwogICAgaWYgKCFwa3QpIGNvbnRpbnVlOwogICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJndvcmtlcl9mcmVlKTsKICAgIGZvciAoOzspIHsKICAgICAgUlBDUlQ0X3Byb2Nlc3NfcGFja2V0KHBrdC0+Y29ubiwgJnBrdC0+aGRyLCBwa3QtPmJ1Zik7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBrdCk7CiAgICAgIC8qIHRyeSB0byBncmFiIGFub3RoZXIgcGFja2V0IGhlcmUgd2l0aG91dCB3YWl0aW5nCiAgICAgICAqIG9uIHRoZSBzZW1hcGhvcmUsIGluIGNhc2UgaXQgaGl0cyBtYXggKi8KICAgICAgcGt0ID0gUlBDUlQ0X3BvcF9wYWNrZXQoKTsKICAgICAgaWYgKCFwa3QpIGJyZWFrOwogICAgICAvKiBkZWNyZW1lbnQgc2VtYXBob3JlICovCiAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VydmVyX3NlbSwgMCk7CiAgICB9CiAgICBJbnRlcmxvY2tlZEluY3JlbWVudCgmd29ya2VyX2ZyZWUpOwogIH0KICBJbnRlcmxvY2tlZERlY3JlbWVudCgmd29ya2VyX2ZyZWUpOwogIEludGVybG9ja2VkRGVjcmVtZW50KCZ3b3JrZXJfY291bnQpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBSUENSVDRfY3JlYXRlX3dvcmtlcl9pZl9uZWVkZWQodm9pZCkKewogIGlmICghd29ya2VyX2ZyZWUgJiYgd29ya2VyX2NvdW50IDwgTUFYX1RIUkVBRFMpIHsKICAgIEhBTkRMRSB0aHJlYWQ7CiAgICBJbnRlcmxvY2tlZEluY3JlbWVudCgmd29ya2VyX2NvdW50KTsKICAgIEludGVybG9ja2VkSW5jcmVtZW50KCZ3b3JrZXJfZnJlZSk7CiAgICB0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgUlBDUlQ0X3dvcmtlcl90aHJlYWQsIE5VTEwsIDAsIE5VTEwpOwogICAgaWYgKHRocmVhZCkgQ2xvc2VIYW5kbGUodGhyZWFkKTsKICAgIGVsc2UgewogICAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmd29ya2VyX2ZyZWUpOwogICAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmd29ya2VyX2NvdW50KTsKICAgIH0KICB9Cn0KCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBSUENSVDRfaW9fdGhyZWFkKExQVk9JRCB0aGVfYXJnKQp7CiAgUnBjQ29ubmVjdGlvbiogY29ubiA9IChScGNDb25uZWN0aW9uKil0aGVfYXJnOwogIFJwY1BrdEhkciBoZHI7CiAgRFdPUkQgZHdSZWFkOwogIHZvaWQqIGJ1ZiA9IE5VTEw7CiAgUnBjUGFja2V0KiBwYWNrZXQ7CgogIFRSQUNFKCIoJXApXG4iLCBjb25uKTsKCiAgZm9yICg7OykgewogICAgLyogcmVhZCBwYWNrZXQgaGVhZGVyICovCiNpZmRlZiBPVkVSTEFQUEVEX1dPUktTCiAgICBpZiAoIVJlYWRGaWxlKGNvbm4tPmNvbm4sICZoZHIsIHNpemVvZihoZHIpLCAmZHdSZWFkLCAmY29ubi0+b3ZsKSkgewogICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKICAgICAgaWYgKGVyciAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CiAgICAgICAgVFJBQ0UoImNvbm5lY3Rpb24gbG9zdCwgZXJyb3I9JTA4bHhcbiIsIGVycik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFHZXRPdmVybGFwcGVkUmVzdWx0KGNvbm4tPmNvbm4sICZjb25uLT5vdmwsICZkd1JlYWQsIFRSVUUpKSBicmVhazsKICAgIH0KI2Vsc2UKICAgIGlmICghUmVhZEZpbGUoY29ubi0+Y29ubiwgJmhkciwgc2l6ZW9mKGhkciksICZkd1JlYWQsIE5VTEwpKSB7CiAgICAgIFRSQUNFKCJjb25uZWN0aW9uIGxvc3QsIGVycm9yPSUwOGx4XG4iLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgIGJyZWFrOwogICAgfQojZW5kaWYKICAgIGlmIChkd1JlYWQgIT0gc2l6ZW9mKGhkcikpIHsKICAgICAgaWYgKGR3UmVhZCkgVFJBQ0UoInByb3RvY29sIGVycm9yOiA8aGRyc3ogPT0gJWQsIGR3UmVhZCA9PSAlbHU+XG4iLCBzaXplb2YoaGRyKSwgZHdSZWFkKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogcmVhZCBwYWNrZXQgYm9keSAqLwogICAgYnVmID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGhkci5sZW4pOwogICAgVFJBQ0UoInJlY2VpdmluZyBwYXlsb2FkPSVkXG4iLCBoZHIubGVuKTsKICAgIGlmICghaGRyLmxlbikgZHdSZWFkID0gMDsgZWxzZQojaWZkZWYgT1ZFUkxBUFBFRF9XT1JLUwogICAgaWYgKCFSZWFkRmlsZShjb25uLT5jb25uLCBidWYsIGhkci5sZW4sICZkd1JlYWQsICZjb25uLT5vdmwpKSB7CiAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOwogICAgICBpZiAoZXJyICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKICAgICAgICBUUkFDRSgiY29ubmVjdGlvbiBsb3N0LCBlcnJvcj0lMDhseFxuIiwgZXJyKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoIUdldE92ZXJsYXBwZWRSZXN1bHQoY29ubi0+Y29ubiwgJmNvbm4tPm92bCwgJmR3UmVhZCwgVFJVRSkpIGJyZWFrOwogICAgfQojZWxzZQogICAgaWYgKCFSZWFkRmlsZShjb25uLT5jb25uLCBidWYsIGhkci5sZW4sICZkd1JlYWQsIE5VTEwpKSB7CiAgICAgIFRSQUNFKCJjb25uZWN0aW9uIGxvc3QsIGVycm9yPSUwOGx4XG4iLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgIGJyZWFrOwogICAgfQojZW5kaWYKICAgIGlmIChkd1JlYWQgIT0gaGRyLmxlbikgewogICAgICBUUkFDRSgicHJvdG9jb2wgZXJyb3I6IDxib2R5bGVuID09ICVkLCBkd1JlYWQgPT0gJWx1PlxuIiwgaGRyLmxlbiwgZHdSZWFkKTsKICAgICAgYnJlYWs7CiAgICB9CgojaWYgMAogICAgUlBDUlQ0X3Byb2Nlc3NfcGFja2V0KGNvbm4sICZoZHIsIGJ1Zik7CiNlbHNlCiAgICBwYWNrZXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKFJwY1BhY2tldCkpOwogICAgcGFja2V0LT5jb25uID0gY29ubjsKICAgIHBhY2tldC0+aGRyID0gaGRyOwogICAgcGFja2V0LT5idWYgPSBidWY7CiAgICBSUENSVDRfY3JlYXRlX3dvcmtlcl9pZl9uZWVkZWQoKTsKICAgIFJQQ1JUNF9wdXNoX3BhY2tldChwYWNrZXQpOwogICAgUmVsZWFzZVNlbWFwaG9yZShzZXJ2ZXJfc2VtLCAxLCBOVUxMKTsKI2VuZGlmCiAgICBidWYgPSBOVUxMOwogIH0KICBpZiAoYnVmKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOwogIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihjb25uKTsKICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgUlBDUlQ0X25ld19jbGllbnQoUnBjQ29ubmVjdGlvbiogY29ubikKewogIEhBTkRMRSB0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgUlBDUlQ0X2lvX3RocmVhZCwgY29ubiwgMCwgTlVMTCk7CiAgaWYgKCF0aHJlYWQpIHsKICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOwogICAgRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHRocmVhZCwgZXJyb3I9JTA4bHhcbiIsIGVycik7CiAgICBSUENSVDRfRGVzdHJveUNvbm5lY3Rpb24oY29ubik7CiAgfQogIC8qIHdlIGNvdWxkIHNldCBjb25uLT50aHJlYWQsIGJ1dCB0aGVuIHdlJ2QgaGF2ZSB0byBtYWtlIHRoZSBpb190aHJlYWQgd2FpdAogICAqIGZvciB0aGF0LCBvdGhlcndpc2UgdGhlIHRocmVhZCBtaWdodCBmaW5pc2gsIGRlc3Ryb3kgdGhlIGNvbm5lY3Rpb24sIGFuZAogICAqIGZyZWUgdGhlIG1lbW9yeSB3ZSdkIHdyaXRlIHRvIGJlZm9yZSB3ZSBkaWQsIGNhdXNpbmcgY3Jhc2hlcyBhbmQgc3R1ZmYgLQogICAqIHNvIGxldCdzIGltcGxlbWVudCB0aGF0IGxhdGVyLCB3aGVuIHdlIHJlYWxseSBuZWVkIGNvbm4tPnRocmVhZCAqLwoKICBDbG9zZUhhbmRsZSggdGhyZWFkICk7Cn0KCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBSUENSVDRfc2VydmVyX3RocmVhZChMUFZPSUQgdGhlX2FyZykKewogIEhBTkRMRSBtX2V2ZW50ID0gbWdyX2V2ZW50LCBiX2hhbmRsZTsKICBIQU5ETEUgKm9ianMgPSBOVUxMOwogIERXT1JEIGNvdW50LCByZXM7CiAgUnBjU2VydmVyUHJvdHNlcSogY3BzOwogIFJwY0Nvbm5lY3Rpb24qIGNvbm47CiAgUnBjQ29ubmVjdGlvbiogY2Nvbm47CgogIGZvciAoOzspIHsKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogICAgLyogb3BlbiBhbmQgY291bnQgY29ubmVjdGlvbnMgKi8KICAgIGNvdW50ID0gMTsKICAgIGNwcyA9IHByb3RzZXFzOwogICAgd2hpbGUgKGNwcykgewogICAgICBjb25uID0gY3BzLT5jb25uOwogICAgICB3aGlsZSAoY29ubikgewogICAgICAgIFJQQ1JUNF9PcGVuQ29ubmVjdGlvbihjb25uKTsKICAgICAgICBpZiAoY29ubi0+b3ZsLmhFdmVudCkgY291bnQrKzsKICAgICAgICBjb25uID0gY29ubi0+TmV4dDsKICAgICAgfQogICAgICBjcHMgPSBjcHMtPk5leHQ7CiAgICB9CiAgICAvKiBtYWtlIGFycmF5IG9mIGNvbm5lY3Rpb25zICovCiAgICBvYmpzID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqcywgY291bnQqc2l6ZW9mKEhBTkRMRSkpOwogICAgb2Jqc1swXSA9IG1fZXZlbnQ7CiAgICBjb3VudCA9IDE7CiAgICBjcHMgPSBwcm90c2VxczsKICAgIHdoaWxlIChjcHMpIHsKICAgICAgY29ubiA9IGNwcy0+Y29ubjsKICAgICAgd2hpbGUgKGNvbm4pIHsKICAgICAgICBpZiAoY29ubi0+b3ZsLmhFdmVudCkgb2Jqc1tjb3VudCsrXSA9IGNvbm4tPm92bC5oRXZlbnQ7CiAgICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICAgIH0KICAgICAgY3BzID0gY3BzLT5OZXh0OwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CgogICAgLyogc3RhcnQgd2FpdGluZyAqLwogICAgcmVzID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhjb3VudCwgb2JqcywgRkFMU0UsIElORklOSVRFKTsKICAgIGlmIChyZXMgPT0gV0FJVF9PQkpFQ1RfMCkgewogICAgICBSZXNldEV2ZW50KG1fZXZlbnQpOwogICAgICBpZiAoIXN0ZF9saXN0ZW4pIGJyZWFrOwogICAgfQogICAgZWxzZSBpZiAocmVzID09IFdBSVRfRkFJTEVEKSB7CiAgICAgIEVSUigid2FpdCBmYWlsZWRcbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGJfaGFuZGxlID0gb2Jqc1tyZXMgLSBXQUlUX09CSkVDVF8wXTsKICAgICAgLyogZmluZCB3aGljaCBjb25uZWN0aW9uIGdvdCBhIFJQQyAqLwogICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmc2VydmVyX2NzKTsKICAgICAgY29ubiA9IE5VTEw7CiAgICAgIGNwcyA9IHByb3RzZXFzOwogICAgICB3aGlsZSAoY3BzKSB7CiAgICAgICAgY29ubiA9IGNwcy0+Y29ubjsKICAgICAgICB3aGlsZSAoY29ubikgewogICAgICAgICAgaWYgKGNvbm4tPm92bC5oRXZlbnQgPT0gYl9oYW5kbGUpIGJyZWFrOwogICAgICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChjb25uKSBicmVhazsKICAgICAgICBjcHMgPSBjcHMtPk5leHQ7CiAgICAgIH0KICAgICAgY2Nvbm4gPSBOVUxMOwogICAgICBpZiAoY29ubikgUlBDUlQ0X1NwYXduQ29ubmVjdGlvbigmY2Nvbm4sIGNvbm4pOwogICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmc2VydmVyX2NzKTsKICAgICAgaWYgKCFjb25uKSB7CiAgICAgICAgRVJSKCJmYWlsZWQgdG8gbG9jYXRlIGNvbm5lY3Rpb24gZm9yIGhhbmRsZSAlcFxuIiwgYl9oYW5kbGUpOwogICAgICB9CiAgICAgIGlmIChjY29ubikgUlBDUlQ0X25ld19jbGllbnQoY2Nvbm4pOwogICAgfQogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmpzKTsKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmc2VydmVyX2NzKTsKICAvKiBjbG9zZSBjb25uZWN0aW9ucyAqLwogIGNwcyA9IHByb3RzZXFzOwogIHdoaWxlIChjcHMpIHsKICAgIGNvbm4gPSBjcHMtPmNvbm47CiAgICB3aGlsZSAoY29ubikgewogICAgICBSUENSVDRfQ2xvc2VDb25uZWN0aW9uKGNvbm4pOwogICAgICBjb25uID0gY29ubi0+TmV4dDsKICAgIH0KICAgIGNwcyA9IGNwcy0+TmV4dDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIFJQQ1JUNF9zdGFydF9saXN0ZW4odm9pZCkKewogIFRSQUNFKCJcbiIpOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKICBpZiAoISArK2xpc3Rlbl9jb3VudCkgewogICAgaWYgKCFtZ3JfZXZlbnQpIG1ncl9ldmVudCA9IENyZWF0ZUV2ZW50QShOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CiAgICBpZiAoIXNlcnZlcl9zZW0pIHNlcnZlcl9zZW0gPSBDcmVhdGVTZW1hcGhvcmVBKE5VTEwsIDAsIE1BWF9USFJFQURTLCBOVUxMKTsKICAgIGlmICghd29ya2VyX3Rscykgd29ya2VyX3RscyA9IFRsc0FsbG9jKCk7CiAgICBzdGRfbGlzdGVuID0gVFJVRTsKICAgIHNlcnZlcl90aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgUlBDUlQ0X3NlcnZlcl90aHJlYWQsIE5VTEwsIDAsIE5VTEwpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmxpc3Rlbl9jcyk7CiAgfSBlbHNlIHsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogICAgU2V0RXZlbnQobWdyX2V2ZW50KTsKICB9Cn0KCnN0YXRpYyB2b2lkIFJQQ1JUNF9zdG9wX2xpc3Rlbih2b2lkKQp7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmxpc3Rlbl9jcyk7CiAgaWYgKGxpc3Rlbl9jb3VudCA9PSAtMSkKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogIGVsc2UgaWYgKC0tbGlzdGVuX2NvdW50ID09IC0xKSB7CiAgICBzdGRfbGlzdGVuID0gRkFMU0U7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKICAgIFNldEV2ZW50KG1ncl9ldmVudCk7CiAgfSBlbHNlCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKICBhc3NlcnQobGlzdGVuX2NvdW50ID4gLTIpOwp9CgpzdGF0aWMgUlBDX1NUQVRVUyBSUENSVDRfdXNlX3Byb3RzZXEoUnBjU2VydmVyUHJvdHNlcSogcHMpCnsKICBSUENSVDRfQ3JlYXRlQ29ubmVjdGlvbigmcHMtPmNvbm4sIFRSVUUsIHBzLT5Qcm90c2VxLCBOVUxMLCBwcy0+RW5kcG9pbnQsIE5VTEwsIE5VTEwpOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmc2VydmVyX2NzKTsKICBwcy0+TmV4dCA9IHByb3RzZXFzOwogIHByb3RzZXFzID0gcHM7CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CgogIGlmIChzdGRfbGlzdGVuKSBTZXRFdmVudChtZ3JfZXZlbnQpOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJJbnFCaW5kaW5ncyAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTZXJ2ZXJJbnFCaW5kaW5ncyggUlBDX0JJTkRJTkdfVkVDVE9SKiogQmluZGluZ1ZlY3RvciApCnsKICBSUENfU1RBVFVTIHN0YXR1czsKICBEV09SRCBjb3VudDsKICBScGNTZXJ2ZXJQcm90c2VxKiBwczsKICBScGNDb25uZWN0aW9uKiBjb25uOwoKICBpZiAoQmluZGluZ1ZlY3RvcikKICAgIFRSQUNFKCIoKkJpbmRpbmdWZWN0b3IgPT0gXiVwKVxuIiwgKkJpbmRpbmdWZWN0b3IpOwogIGVsc2UKICAgIEVSUigiKEJpbmRpbmdWZWN0b3IgPT0gXm51bGwhIT8pXG4iKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgLyogY291bnQgY29ubmVjdGlvbnMgKi8KICBjb3VudCA9IDA7CiAgcHMgPSBwcm90c2VxczsKICB3aGlsZSAocHMpIHsKICAgIGNvbm4gPSBwcy0+Y29ubjsKICAgIHdoaWxlIChjb25uKSB7CiAgICAgIGNvdW50Kys7CiAgICAgIGNvbm4gPSBjb25uLT5OZXh0OwogICAgfQogICAgcHMgPSBwcy0+TmV4dDsKICB9CiAgaWYgKGNvdW50KSB7CiAgICAvKiBleHBvcnQgYmluZGluZ3MgKi8KICAgICpCaW5kaW5nVmVjdG9yID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSUENfQklORElOR19WRUNUT1IpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJQQ19CSU5ESU5HX0hBTkRMRSkqKGNvdW50LTEpKTsKICAgICgqQmluZGluZ1ZlY3RvciktPkNvdW50ID0gY291bnQ7CiAgICBjb3VudCA9IDA7CiAgICBwcyA9IHByb3RzZXFzOwogICAgd2hpbGUgKHBzKSB7CiAgICAgIGNvbm4gPSBwcy0+Y29ubjsKICAgICAgd2hpbGUgKGNvbm4pIHsKICAgICAgIFJQQ1JUNF9NYWtlQmluZGluZygoUnBjQmluZGluZyoqKSYoKkJpbmRpbmdWZWN0b3IpLT5CaW5kaW5nSFtjb3VudF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubik7CiAgICAgICBjb3VudCsrOwogICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICAgIH0KICAgICAgcHMgPSBwcy0+TmV4dDsKICAgIH0KICAgIHN0YXR1cyA9IFJQQ19TX09LOwogIH0gZWxzZSB7CiAgICAqQmluZGluZ1ZlY3RvciA9IE5VTEw7CiAgICBzdGF0dXMgPSBSUENfU19OT19CSU5ESU5HUzsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFFcEEgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVXNlUHJvdHNlcUVwQSggTFBTVFIgUHJvdHNlcSwgVUlOVCBNYXhDYWxscywgTFBTVFIgRW5kcG9pbnQsIExQVk9JRCBTZWN1cml0eURlc2NyaXB0b3IgKQp7CiAgUlBDX1BPTElDWSBwb2xpY3k7CiAgCiAgVFJBQ0UoICIoJXMsJXUsJXMsJXApXG4iLCBQcm90c2VxLCBNYXhDYWxscywgRW5kcG9pbnQsIFNlY3VyaXR5RGVzY3JpcHRvciApOwogIAogIC8qIFRoaXMgc2hvdWxkIHByb3ZpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyICovCiAgcG9saWN5Lkxlbmd0aCAgICAgICAgPSBzaXplb2YoIHBvbGljeSApOwogIHBvbGljeS5FbmRwb2ludEZsYWdzID0gMDsKICBwb2xpY3kuTklDRmxhZ3MgICAgICA9IDA7CiAgCiAgcmV0dXJuIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4QSggUHJvdHNlcSwgTWF4Q2FsbHMsIEVuZHBvaW50LCBTZWN1cml0eURlc2NyaXB0b3IsICZwb2xpY3kgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFFcFcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVXNlUHJvdHNlcUVwVyggTFBXU1RSIFByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIExQV1NUUiBFbmRwb2ludCwgTFBWT0lEIFNlY3VyaXR5RGVzY3JpcHRvciApCnsKICBSUENfUE9MSUNZIHBvbGljeTsKICAKICBUUkFDRSggIiglcywldSwlcywlcClcbiIsIGRlYnVnc3RyX3coIFByb3RzZXEgKSwgTWF4Q2FsbHMsIGRlYnVnc3RyX3coIEVuZHBvaW50ICksIFNlY3VyaXR5RGVzY3JpcHRvciApOwogIAogIC8qIFRoaXMgc2hvdWxkIHByb3ZpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyICovCiAgcG9saWN5Lkxlbmd0aCAgICAgICAgPSBzaXplb2YoIHBvbGljeSApOwogIHBvbGljeS5FbmRwb2ludEZsYWdzID0gMDsKICBwb2xpY3kuTklDRmxhZ3MgICAgICA9IDA7CiAgCiAgcmV0dXJuIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4VyggUHJvdHNlcSwgTWF4Q2FsbHMsIEVuZHBvaW50LCBTZWN1cml0eURlc2NyaXB0b3IsICZwb2xpY3kgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4QSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTZXJ2ZXJVc2VQcm90c2VxRXBFeEEoIExQU1RSIFByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIExQU1RSIEVuZHBvaW50LCBMUFZPSUQgU2VjdXJpdHlEZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSUENfUE9MSUNZIGxwUG9saWN5ICkKewogIFJwY1NlcnZlclByb3RzZXEqIHBzOwoKICBUUkFDRSgiKCVzLCV1LCVzLCVwLHsldSwlbHUsJWx1fSlcbiIsIGRlYnVnc3RyX2EoIFByb3RzZXEgKSwgTWF4Q2FsbHMsCiAgICAgICBkZWJ1Z3N0cl9hKCBFbmRwb2ludCApLCBTZWN1cml0eURlc2NyaXB0b3IsCiAgICAgICBscFBvbGljeS0+TGVuZ3RoLCBscFBvbGljeS0+RW5kcG9pbnRGbGFncywgbHBQb2xpY3ktPk5JQ0ZsYWdzICk7CgogIHBzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihScGNTZXJ2ZXJQcm90c2VxKSk7CiAgcHMtPk1heENhbGxzID0gTWF4Q2FsbHM7CiAgcHMtPlByb3RzZXEgPSBSUENSVDRfc3RyZHVwQShQcm90c2VxKTsKICBwcy0+RW5kcG9pbnQgPSBSUENSVDRfc3RyZHVwQShFbmRwb2ludCk7CgogIHJldHVybiBSUENSVDRfdXNlX3Byb3RzZXEocHMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVXNlUHJvdHNlcUVwRXhXIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4VyggTFBXU1RSIFByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIExQV1NUUiBFbmRwb2ludCwgTFBWT0lEIFNlY3VyaXR5RGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlBDX1BPTElDWSBscFBvbGljeSApCnsKICBScGNTZXJ2ZXJQcm90c2VxKiBwczsKCiAgVFJBQ0UoIiglcywldSwlcywlcCx7JXUsJWx1LCVsdX0pXG4iLCBkZWJ1Z3N0cl93KCBQcm90c2VxICksIE1heENhbGxzLAogICAgICAgZGVidWdzdHJfdyggRW5kcG9pbnQgKSwgU2VjdXJpdHlEZXNjcmlwdG9yLAogICAgICAgbHBQb2xpY3ktPkxlbmd0aCwgbHBQb2xpY3ktPkVuZHBvaW50RmxhZ3MsIGxwUG9saWN5LT5OSUNGbGFncyApOwoKICBwcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoUnBjU2VydmVyUHJvdHNlcSkpOwogIHBzLT5NYXhDYWxscyA9IE1heENhbGxzOwogIC8qIEZJWE1FOiBEaWQgT3ZlIGhhdmUgdGhlc2UgbmV4dCB0d28gYXMgUlBDUlQ0X3N0cmR1cFcgZm9yIGEgcmVhc29uPyAqLwogIHBzLT5Qcm90c2VxID0gUlBDUlQ0X3N0cmR1cFd0b0EoUHJvdHNlcSk7CiAgcHMtPkVuZHBvaW50ID0gUlBDUlQ0X3N0cmR1cFd0b0EoRW5kcG9pbnQpOwoKICByZXR1cm4gUlBDUlQ0X3VzZV9wcm90c2VxKHBzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFBIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFBKExQU1RSIFByb3RzZXEsIHVuc2lnbmVkIGludCBNYXhDYWxscywgdm9pZCAqU2VjdXJpdHlEZXNjcmlwdG9yKQp7CiAgVFJBQ0UoIihQcm90c2VxID09ICVzLCBNYXhDYWxscyA9PSAlZCwgU2VjdXJpdHlEZXNjcmlwdG9yID09IF4lcCkiLCBkZWJ1Z3N0cl9hKFByb3RzZXEpLCBNYXhDYWxscywgU2VjdXJpdHlEZXNjcmlwdG9yKTsKICByZXR1cm4gUnBjU2VydmVyVXNlUHJvdHNlcUVwQShQcm90c2VxLCBNYXhDYWxscywgTlVMTCwgU2VjdXJpdHlEZXNjcmlwdG9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFXIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFXKExQV1NUUiBQcm90c2VxLCB1bnNpZ25lZCBpbnQgTWF4Q2FsbHMsIHZvaWQgKlNlY3VyaXR5RGVzY3JpcHRvcikKewogIFRSQUNFKCJQcm90c2VxID09ICVzLCBNYXhDYWxscyA9PSAlZCwgU2VjdXJpdHlEZXNjcmlwdG9yID09IF4lcCkiLCBkZWJ1Z3N0cl93KFByb3RzZXEpLCBNYXhDYWxscywgU2VjdXJpdHlEZXNjcmlwdG9yKTsKICByZXR1cm4gUnBjU2VydmVyVXNlUHJvdHNlcUVwVyhQcm90c2VxLCBNYXhDYWxscywgTlVMTCwgU2VjdXJpdHlEZXNjcmlwdG9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclJlZ2lzdGVySWYgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyUmVnaXN0ZXJJZiggUlBDX0lGX0hBTkRMRSBJZlNwZWMsIFVVSUQqIE1nclR5cGVVdWlkLCBSUENfTUdSX0VQViogTWdyRXB2ICkKewogIFRSQUNFKCIoJXAsJXMsJXApXG4iLCBJZlNwZWMsIGRlYnVnc3RyX2d1aWQoTWdyVHlwZVV1aWQpLCBNZ3JFcHYpOwogIHJldHVybiBScGNTZXJ2ZXJSZWdpc3RlcklmMiggSWZTcGVjLCBNZ3JUeXBlVXVpZCwgTWdyRXB2LCAwLCBSUENfQ19MSVNURU5fTUFYX0NBTExTX0RFRkFVTFQsIChVSU5UKS0xLCBOVUxMICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJSZWdpc3RlcklmRXggKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyUmVnaXN0ZXJJZkV4KCBSUENfSUZfSEFORExFIElmU3BlYywgVVVJRCogTWdyVHlwZVV1aWQsIFJQQ19NR1JfRVBWKiBNZ3JFcHYsCiAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBGbGFncywgVUlOVCBNYXhDYWxscywgUlBDX0lGX0NBTExCQUNLX0ZOKiBJZkNhbGxiYWNrRm4gKQp7CiAgVFJBQ0UoIiglcCwlcywlcCwldSwldSwlcClcbiIsIElmU3BlYywgZGVidWdzdHJfZ3VpZChNZ3JUeXBlVXVpZCksIE1nckVwdiwgRmxhZ3MsIE1heENhbGxzLCBJZkNhbGxiYWNrRm4pOwogIHJldHVybiBScGNTZXJ2ZXJSZWdpc3RlcklmMiggSWZTcGVjLCBNZ3JUeXBlVXVpZCwgTWdyRXB2LCBGbGFncywgTWF4Q2FsbHMsIChVSU5UKS0xLCBJZkNhbGxiYWNrRm4gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclJlZ2lzdGVySWYyIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclJlZ2lzdGVySWYyKCBSUENfSUZfSEFORExFIElmU3BlYywgVVVJRCogTWdyVHlwZVV1aWQsIFJQQ19NR1JfRVBWKiBNZ3JFcHYsCiAgICAgICAgICAgICAgICAgICAgICBVSU5UIEZsYWdzLCBVSU5UIE1heENhbGxzLCBVSU5UIE1heFJwY1NpemUsIFJQQ19JRl9DQUxMQkFDS19GTiogSWZDYWxsYmFja0ZuICkKewogIFBSUENfU0VSVkVSX0lOVEVSRkFDRSBJZiA9IChQUlBDX1NFUlZFUl9JTlRFUkZBQ0UpSWZTcGVjOwogIFJwY1NlcnZlckludGVyZmFjZSogc2lmOwogIGludCBpOwoKICBUUkFDRSgiKCVwLCVzLCVwLCV1LCV1LCV1LCVwKVxuIiwgSWZTcGVjLCBkZWJ1Z3N0cl9ndWlkKE1nclR5cGVVdWlkKSwgTWdyRXB2LCBGbGFncywgTWF4Q2FsbHMsCiAgICAgICAgIE1heFJwY1NpemUsIElmQ2FsbGJhY2tGbik7CiAgVFJBQ0UoIiBpbnRlcmZhY2UgaWQ6ICVzICVkLiVkXG4iLCBkZWJ1Z3N0cl9ndWlkKCZJZi0+SW50ZXJmYWNlSWQuU3ludGF4R1VJRCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZi0+SW50ZXJmYWNlSWQuU3ludGF4VmVyc2lvbi5NYWpvclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZi0+SW50ZXJmYWNlSWQuU3ludGF4VmVyc2lvbi5NaW5vclZlcnNpb24pOwogIFRSQUNFKCIgdHJhbnNmZXIgc3ludGF4OiAlcyAlZC4lZFxuIiwgZGVidWdzdHJfZ3VpZCgmSWYtPlRyYW5zZmVyU3ludGF4LlN5bnRheEdVSUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYtPlRyYW5zZmVyU3ludGF4LlN5bnRheFZlcnNpb24uTWFqb3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYtPlRyYW5zZmVyU3ludGF4LlN5bnRheFZlcnNpb24uTWlub3JWZXJzaW9uKTsKICBUUkFDRSgiIGRpc3BhdGNoIHRhYmxlOiAlcFxuIiwgSWYtPkRpc3BhdGNoVGFibGUpOwogIGlmIChJZi0+RGlzcGF0Y2hUYWJsZSkgewogICAgVFJBQ0UoIiAgZGlzcGF0Y2ggdGFibGUgY291bnQ6ICVkXG4iLCBJZi0+RGlzcGF0Y2hUYWJsZS0+RGlzcGF0Y2hUYWJsZUNvdW50KTsKICAgIGZvciAoaT0wOyBpPElmLT5EaXNwYXRjaFRhYmxlLT5EaXNwYXRjaFRhYmxlQ291bnQ7IGkrKykgewogICAgICBUUkFDRSgiICAgZW50cnkgJWQ6ICVwXG4iLCBpLCBJZi0+RGlzcGF0Y2hUYWJsZS0+RGlzcGF0Y2hUYWJsZVtpXSk7CiAgICB9CiAgICBUUkFDRSgiICByZXNlcnZlZDogJWxkXG4iLCBJZi0+RGlzcGF0Y2hUYWJsZS0+UmVzZXJ2ZWQpOwogIH0KICBUUkFDRSgiIHByb3RzZXEgZW5kcG9pbnQgY291bnQ6ICVkXG4iLCBJZi0+UnBjUHJvdHNlcUVuZHBvaW50Q291bnQpOwogIFRSQUNFKCIgZGVmYXVsdCBtYW5hZ2VyIGVwdjogJXBcbiIsIElmLT5EZWZhdWx0TWFuYWdlckVwdik7CiAgVFJBQ0UoIiBpbnRlcnByZXRlciBpbmZvOiAlcFxuIiwgSWYtPkludGVycHJldGVySW5mbyk7CiAgVFJBQ0UoIiBmbGFnczogJTA4eFxuIiwgSWYtPkZsYWdzKTsKCiAgc2lmID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihScGNTZXJ2ZXJJbnRlcmZhY2UpKTsKICBzaWYtPklmICAgICAgICAgICA9IElmOwogIGlmIChNZ3JUeXBlVXVpZCkKICAgIG1lbWNweSgmc2lmLT5NZ3JUeXBlVXVpZCwgTWdyVHlwZVV1aWQsIHNpemVvZihVVUlEKSk7CiAgZWxzZQogICAgbWVtc2V0KCZzaWYtPk1nclR5cGVVdWlkLCAwLCBzaXplb2YoVVVJRCkpOwogIHNpZi0+TWdyRXB2ICAgICAgID0gTWdyRXB2OwogIHNpZi0+RmxhZ3MgICAgICAgID0gRmxhZ3M7CiAgc2lmLT5NYXhDYWxscyAgICAgPSBNYXhDYWxsczsKICBzaWYtPk1heFJwY1NpemUgICA9IE1heFJwY1NpemU7CiAgc2lmLT5JZkNhbGxiYWNrRm4gPSBJZkNhbGxiYWNrRm47CgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIHNpZi0+TmV4dCA9IGlmczsKICBpZnMgPSBzaWY7CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CgogIGlmIChzaWYtPkZsYWdzICYgUlBDX0lGX0FVVE9MSVNURU4pIHsKICAgIC8qIHdlbGwsIHN0YXJ0IGxpc3RlbmluZywgSSB0aGluay4uLiAqLwogICAgUlBDUlQ0X3N0YXJ0X2xpc3RlbigpOwogIH0KCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVW5yZWdpc3RlcklmIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVucmVnaXN0ZXJJZiggUlBDX0lGX0hBTkRMRSBJZlNwZWMsIFVVSUQqIE1nclR5cGVVdWlkLCBVSU5UIFdhaXRGb3JDYWxsc1RvQ29tcGxldGUgKQp7CiAgRklYTUUoIihJZlNwZWMgPT0gKFJQQ19JRl9IQU5ETEUpXiVwLCBNZ3JUeXBlVXVpZCA9PSAlcywgV2FpdEZvckNhbGxzVG9Db21wbGV0ZSA9PSAldSk6IHN0dWJcbiIsCiAgICBJZlNwZWMsIGRlYnVnc3RyX2d1aWQoTWdyVHlwZVV1aWQpLCBXYWl0Rm9yQ2FsbHNUb0NvbXBsZXRlKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVW5yZWdpc3RlcklmRXggKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVW5yZWdpc3RlcklmRXgoIFJQQ19JRl9IQU5ETEUgSWZTcGVjLCBVVUlEKiBNZ3JUeXBlVXVpZCwgaW50IFJ1bmRvd25Db250ZXh0SGFuZGxlcyApCnsKICBGSVhNRSgiKElmU3BlYyA9PSAoUlBDX0lGX0hBTkRMRSleJXAsIE1nclR5cGVVdWlkID09ICVzLCBSdW5kb3duQ29udGV4dEhhbmRsZXMgPT0gJWQpOiBzdHViXG4iLAogICAgSWZTcGVjLCBkZWJ1Z3N0cl9ndWlkKE1nclR5cGVVdWlkKSwgUnVuZG93bkNvbnRleHRIYW5kbGVzKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyUmVnaXN0ZXJBdXRoSW5mb0EgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyUmVnaXN0ZXJBdXRoSW5mb0EoIExQU1RSIFNlcnZlclByaW5jTmFtZSwgVUxPTkcgQXV0aG5TdmMsIFJQQ19BVVRIX0tFWV9SRVRSSUVWQUxfRk4gR2V0S2V5Rm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgQXJnICkKewogIEZJWE1FKCAiKCVzLCVsdSwlcCwlcCk6IHN0dWJcbiIsIFNlcnZlclByaW5jTmFtZSwgQXV0aG5TdmMsIEdldEtleUZuLCBBcmcgKTsKICAKICByZXR1cm4gUlBDX1NfVU5LTk9XTl9BVVRITl9TRVJWSUNFOyAvKiBXZSBkb24ndCBrbm93IGFueSBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlcyAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyUmVnaXN0ZXJBdXRoSW5mb1cgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyUmVnaXN0ZXJBdXRoSW5mb1coIExQV1NUUiBTZXJ2ZXJQcmluY05hbWUsIFVMT05HIEF1dGhuU3ZjLCBSUENfQVVUSF9LRVlfUkVUUklFVkFMX0ZOIEdldEtleUZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIEFyZyApCnsKICBGSVhNRSggIiglcywlbHUsJXAsJXApOiBzdHViXG4iLCBkZWJ1Z3N0cl93KCBTZXJ2ZXJQcmluY05hbWUgKSwgQXV0aG5TdmMsIEdldEtleUZuLCBBcmcgKTsKICAKICByZXR1cm4gUlBDX1NfVU5LTk9XTl9BVVRITl9TRVJWSUNFOyAvKiBXZSBkb24ndCBrbm93IGFueSBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlcyAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyTGlzdGVuIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlckxpc3RlbiggVUlOVCBNaW5pbXVtQ2FsbFRocmVhZHMsIFVJTlQgTWF4Q2FsbHMsIFVJTlQgRG9udFdhaXQgKQp7CiAgVFJBQ0UoIigldSwldSwldSlcbiIsIE1pbmltdW1DYWxsVGhyZWFkcywgTWF4Q2FsbHMsIERvbnRXYWl0KTsKCiAgaWYgKCFwcm90c2VxcykKICAgIHJldHVybiBSUENfU19OT19QUk9UU0VRU19SRUdJU1RFUkVEOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKCiAgaWYgKHN0ZF9saXN0ZW4pIHsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogICAgcmV0dXJuIFJQQ19TX0FMUkVBRFlfTElTVEVOSU5HOwogIH0KCiAgUlBDUlQ0X3N0YXJ0X2xpc3RlbigpOwoKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKCiAgaWYgKERvbnRXYWl0KSByZXR1cm4gUlBDX1NfT0s7CgogIHJldHVybiBScGNNZ210V2FpdFNlcnZlckxpc3RlbigpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjTWdtdFNlcnZlcldhaXRMaXN0ZW4gKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjTWdtdFdhaXRTZXJ2ZXJMaXN0ZW4oIHZvaWQgKQp7CiAgUlBDX1NUQVRVUyByc2x0ID0gUlBDX1NfT0s7CgogIFRSQUNFKCJcbiIpOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKCiAgaWYgKCFzdGRfbGlzdGVuKQogICAgaWYgKCAocnNsdCA9IFJwY1NlcnZlckxpc3RlbigxLCAwLCBUUlVFKSkgIT0gUlBDX1NfT0sgKSB7CiAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogICAgICByZXR1cm4gcnNsdDsKICAgIH0KICAKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKCiAgd2hpbGUgKHN0ZF9saXN0ZW4pIHsKICAgIFdhaXRGb3JTaW5nbGVPYmplY3QobWdyX2V2ZW50LCBJTkZJTklURSk7CiAgICBpZiAoIXN0ZF9saXN0ZW4pIHsKICAgICAgU2xlZXAoMTAwKTsgLyogZG9uJ3Qgc3BpbiB2aW9sZW50bHkgKi8KICAgICAgVFJBQ0UoInNwaW5uaW5nLlxuIik7CiAgICB9CiAgfQoKICByZXR1cm4gcnNsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY01nbXRTdG9wU2VydmVyTGlzdGVuaW5nIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY01nbXRTdG9wU2VydmVyTGlzdGVuaW5nICggUlBDX0JJTkRJTkdfSEFORExFIEJpbmRpbmcgKQp7CiAgVFJBQ0UoIihCaW5kaW5nID09IChSUENfQklORElOR19IQU5ETEUpXiVwKVxuIiwgQmluZGluZyk7CgogIGlmIChCaW5kaW5nKSB7CiAgICBGSVhNRSgiY2xpZW50LXNpZGUgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQuXG4iKTsKICAgIHJldHVybiBSUENfU19XUk9OR19LSU5EX09GX0JJTkRJTkc7CiAgfQogIAogIC8qIGhtbS4uLiAqLwogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogIHdoaWxlIChzdGRfbGlzdGVuKQogICAgUlBDUlQ0X3N0b3BfbGlzdGVuKCk7CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmxpc3Rlbl9jcyk7CgogIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIElfUnBjU2VydmVyU3RhcnRMaXN0ZW5pbmcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgSV9ScGNTZXJ2ZXJTdGFydExpc3RlbmluZyggdm9pZCogaFduZCApCnsKICBGSVhNRSggIiglcCk6IHN0dWJcbiIsIGhXbmQgKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgSV9ScGNTZXJ2ZXJTdG9wTGlzdGVuaW5nIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIElfUnBjU2VydmVyU3RvcExpc3RlbmluZyggdm9pZCApCnsKICBGSVhNRSggIigpOiBzdHViXG4iICk7CgogIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIElfUnBjV2luZG93UHJvYyAoUlBDUlQ0LkApCiAqLwpVSU5UIFdJTkFQSSBJX1JwY1dpbmRvd1Byb2MoIHZvaWQgKmhXbmQsIFVJTlQgTWVzc2FnZSwgVUlOVCB3UGFyYW0sIFVMT05HIGxQYXJhbSApCnsKICBGSVhNRSggIiglcCwlMDh4LCUwOHgsJTA4bHgpOiBzdHViXG4iLCBoV25kLCBNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwoKICByZXR1cm4gMDsKfQo=