LyoKICogUlBDIHNlcnZlciBBUEkKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBUT0RPOgogKiAgLSBhIHdob2xlIGxvdAogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAicnBjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKCiNpbmNsdWRlICJycGNfc2VydmVyLmgiCiNpbmNsdWRlICJycGNfbWlzYy5oIgojaW5jbHVkZSAicnBjX21lc3NhZ2UuaCIKI2luY2x1ZGUgInJwY19kZWZzLmgiCgojZGVmaW5lIE1BWF9USFJFQURTIDEyOAoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwocnBjKTsKCnR5cGVkZWYgc3RydWN0IF9ScGNQYWNrZXQKewogIHN0cnVjdCBfUnBjUGFja2V0KiBuZXh0OwogIHN0cnVjdCBfUnBjQ29ubmVjdGlvbiogY29ubjsKICBScGNQa3RIZHIqIGhkcjsKICBSUENfTUVTU0FHRSogbXNnOwp9IFJwY1BhY2tldDsKCnR5cGVkZWYgc3RydWN0IF9ScGNPYmpUeXBlTWFwCnsKICAvKiBGSVhNRTogYSBoYXNoIHRhYmxlIHdvdWxkIGJlIGJldHRlci4gKi8KICBzdHJ1Y3QgX1JwY09ialR5cGVNYXAgKm5leHQ7CiAgVVVJRCBPYmplY3Q7CiAgVVVJRCBUeXBlOwp9IFJwY09ialR5cGVNYXA7CgpzdGF0aWMgUnBjT2JqVHlwZU1hcCAqUnBjT2JqVHlwZU1hcHM7CgpzdGF0aWMgUnBjU2VydmVyUHJvdHNlcSogcHJvdHNlcXM7CnN0YXRpYyBScGNTZXJ2ZXJJbnRlcmZhY2UqIGlmczsKCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIHNlcnZlcl9jczsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgc2VydmVyX2NzX2RlYnVnID0KewogICAgMCwgMCwgJnNlcnZlcl9jcywKICAgIHsgJnNlcnZlcl9jc19kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmc2VydmVyX2NzX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBzZXJ2ZXJfY3MiKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIHNlcnZlcl9jcyA9IHsgJnNlcnZlcl9jc19kZWJ1ZywgLTEsIDAsIDAsIDAsIDAgfTsKCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGxpc3Rlbl9jczsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgbGlzdGVuX2NzX2RlYnVnID0KewogICAgMCwgMCwgJmxpc3Rlbl9jcywKICAgIHsgJmxpc3Rlbl9jc19kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmbGlzdGVuX2NzX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiBsaXN0ZW5fY3MiKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGxpc3Rlbl9jcyA9IHsgJmxpc3Rlbl9jc19kZWJ1ZywgLTEsIDAsIDAsIDAsIDAgfTsKCi8qIHdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgbGlzdGVuaW5nICovCnN0YXRpYyBCT09MIHN0ZF9saXN0ZW47Ci8qIG51bWJlciBvZiBtYW51YWwgbGlzdGVuZXJzIChjYWxscyB0byBScGNTZXJ2ZXJMaXN0ZW4pICovCnN0YXRpYyBMT05HIG1hbnVhbF9saXN0ZW5fY291bnQ7Ci8qIHRvdGFsIGxpc3RlbmVycyBpbmNsdWRpbmcgYXV0byBsaXN0ZW5lcnMgKi8Kc3RhdGljIExPTkcgbGlzdGVuX2NvdW50OwovKiBzZXQgb24gY2hhbmdlIG9mIGNvbmZpZ3VyYXRpb24gKGUuZy4gbGlzdGVuaW5nIG9uIG5ldyBwcm90c2VxKSAqLwpzdGF0aWMgSEFORExFIG1ncl9ldmVudDsKLyogbXV0ZXggZm9yIGVuc3VyaW5nIG9ubHkgb25lIHRocmVhZCBjYW4gY2hhbmdlIHN0YXRlIGF0IGEgdGltZSAqLwpzdGF0aWMgSEFORExFIG1ncl9tdXRleDsKLyogc2V0IHdoZW4gc2VydmVyIHRocmVhZCBoYXMgZmluaXNoZWQgb3BlbmluZyBjb25uZWN0aW9ucyAqLwpzdGF0aWMgSEFORExFIHNlcnZlcl9yZWFkeV9ldmVudDsKCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIHNwYWNrZXRfY3M7CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OX0RFQlVHIHNwYWNrZXRfY3NfZGVidWcgPQp7CiAgICAwLCAwLCAmc3BhY2tldF9jcywKICAgIHsgJnNwYWNrZXRfY3NfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCwgJnNwYWNrZXRfY3NfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IChEV09SRF9QVFIpKF9fRklMRV9fICI6IHNwYWNrZXRfY3MiKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIHNwYWNrZXRfY3MgPSB7ICZzcGFja2V0X2NzX2RlYnVnLCAtMSwgMCwgMCwgMCwgMCB9OwoKc3RhdGljIFJwY1BhY2tldCogc3BhY2tldF9oZWFkOwpzdGF0aWMgUnBjUGFja2V0KiBzcGFja2V0X3RhaWw7CnN0YXRpYyBIQU5ETEUgc2VydmVyX3NlbTsKCnN0YXRpYyBMT05HIHdvcmtlcl9jb3VudCwgd29ya2VyX2ZyZWUsIHdvcmtlcl90bHM7CgpzdGF0aWMgVVVJRCB1dWlkX25pbDsKCmlubGluZSBzdGF0aWMgUnBjT2JqVHlwZU1hcCAqTG9va3VwT2JqVHlwZU1hcChVVUlEICpPYmpVdWlkKQp7CiAgUnBjT2JqVHlwZU1hcCAqcnNsdCA9IFJwY09ialR5cGVNYXBzOwogIFJQQ19TVEFUVVMgZHVtbXk7CgogIHdoaWxlIChyc2x0KSB7CiAgICBpZiAoISBVdWlkQ29tcGFyZShPYmpVdWlkLCAmcnNsdC0+T2JqZWN0LCAmZHVtbXkpKSBicmVhazsKICAgIHJzbHQgPSByc2x0LT5uZXh0OwogIH0KCiAgcmV0dXJuIHJzbHQ7Cn0KCmlubGluZSBzdGF0aWMgVVVJRCAqTG9va3VwT2JqVHlwZShVVUlEICpPYmpVdWlkKQp7CiAgUnBjT2JqVHlwZU1hcCAqbWFwID0gTG9va3VwT2JqVHlwZU1hcChPYmpVdWlkKTsKICBpZiAobWFwKQogICAgcmV0dXJuICZtYXAtPlR5cGU7CiAgZWxzZQogICAgcmV0dXJuICZ1dWlkX25pbDsKfQoKc3RhdGljIFJwY1NlcnZlckludGVyZmFjZSogUlBDUlQ0X2ZpbmRfaW50ZXJmYWNlKFVVSUQqIG9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19TWU5UQVhfSURFTlRJRklFUiogaWZfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGNoZWNrX29iamVjdCkKewogIFVVSUQqIE1nclR5cGUgPSBOVUxMOwogIFJwY1NlcnZlckludGVyZmFjZSogY2lmID0gTlVMTDsKICBSUENfU1RBVFVTIHN0YXR1czsKCiAgaWYgKGNoZWNrX29iamVjdCkKICAgIE1nclR5cGUgPSBMb29rdXBPYmpUeXBlKG9iamVjdCk7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgY2lmID0gaWZzOwogIHdoaWxlIChjaWYpIHsKICAgIGlmICghbWVtY21wKGlmX2lkLCAmY2lmLT5JZi0+SW50ZXJmYWNlSWQsIHNpemVvZihSUENfU1lOVEFYX0lERU5USUZJRVIpKSAmJgogICAgICAgIChjaGVja19vYmplY3QgPT0gRkFMU0UgfHwgVXVpZEVxdWFsKE1nclR5cGUsICZjaWYtPk1nclR5cGVVdWlkLCAmc3RhdHVzKSkgJiYKICAgICAgICBzdGRfbGlzdGVuKSBicmVhazsKICAgIGNpZiA9IGNpZi0+TmV4dDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgVFJBQ0UoInJldHVybmluZyAlcCBmb3IgJXNcbiIsIGNpZiwgZGVidWdzdHJfZ3VpZChvYmplY3QpKTsKICByZXR1cm4gY2lmOwp9CgpzdGF0aWMgdm9pZCBSUENSVDRfcHVzaF9wYWNrZXQoUnBjUGFja2V0KiBwYWNrZXQpCnsKICBwYWNrZXQtPm5leHQgPSBOVUxMOwogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzcGFja2V0X2NzKTsKICBpZiAoc3BhY2tldF90YWlsKSB7CiAgICBzcGFja2V0X3RhaWwtPm5leHQgPSBwYWNrZXQ7CiAgICBzcGFja2V0X3RhaWwgPSBwYWNrZXQ7CiAgfSBlbHNlIHsKICAgIHNwYWNrZXRfaGVhZCA9IHBhY2tldDsKICAgIHNwYWNrZXRfdGFpbCA9IHBhY2tldDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwp9CgpzdGF0aWMgUnBjUGFja2V0KiBSUENSVDRfcG9wX3BhY2tldCh2b2lkKQp7CiAgUnBjUGFja2V0KiBwYWNrZXQ7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwogIHBhY2tldCA9IHNwYWNrZXRfaGVhZDsKICBpZiAocGFja2V0KSB7CiAgICBzcGFja2V0X2hlYWQgPSBwYWNrZXQtPm5leHQ7CiAgICBpZiAoIXNwYWNrZXRfaGVhZCkgc3BhY2tldF90YWlsID0gTlVMTDsKICB9CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNwYWNrZXRfY3MpOwogIGlmIChwYWNrZXQpIHBhY2tldC0+bmV4dCA9IE5VTEw7CiAgcmV0dXJuIHBhY2tldDsKfQoKdHlwZWRlZiBzdHJ1Y3QgewogIFBSUENfTUVTU0FHRSBtc2c7CiAgdm9pZCogYnVmOwp9IHBhY2tldF9zdGF0ZTsKCnN0YXRpYyBXSU5FX0VYQ0VQVElPTl9GSUxURVIocnBjX2ZpbHRlcikKewogIHBhY2tldF9zdGF0ZSogc3RhdGU7CiAgUFJQQ19NRVNTQUdFIG1zZzsKICBzdGF0ZSA9IFRsc0dldFZhbHVlKHdvcmtlcl90bHMpOwogIG1zZyA9IHN0YXRlLT5tc2c7CiAgaWYgKG1zZy0+QnVmZmVyICE9IHN0YXRlLT5idWYpIElfUnBjRnJlZUJ1ZmZlcihtc2cpOwogIG1zZy0+UnBjRmxhZ3MgfD0gV0lORV9SUENGTEFHX0VYQ0VQVElPTjsKICBtc2ctPkJ1ZmZlckxlbmd0aCA9IHNpemVvZihEV09SRCk7CiAgSV9ScGNHZXRCdWZmZXIobXNnKTsKICAqKERXT1JEKiltc2ctPkJ1ZmZlciA9IEdldEV4Y2VwdGlvbkNvZGUoKTsKICBXQVJOKCJleGNlcHRpb24gY2F1Z2h0IHdpdGggY29kZSAweCUwOGx4ID0gJWxkXG4iLCAqKERXT1JEKiltc2ctPkJ1ZmZlciwgKihEV09SRCopbXNnLT5CdWZmZXIpOwogIFRSQUNFKCJyZXR1cm5pbmcgZmFpbHVyZSBwYWNrZXRcbiIpOwogIHJldHVybiBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSOwp9CgpzdGF0aWMgdm9pZCBSUENSVDRfcHJvY2Vzc19wYWNrZXQoUnBjQ29ubmVjdGlvbiogY29ubiwgUnBjUGt0SGRyKiBoZHIsIFJQQ19NRVNTQUdFKiBtc2cpCnsKICBScGNTZXJ2ZXJJbnRlcmZhY2UqIHNpZjsKICBSUENfRElTUEFUQ0hfRlVOQ1RJT04gZnVuYzsKICBwYWNrZXRfc3RhdGUgc3RhdGU7CiAgVVVJRCAqb2JqZWN0X3V1aWQ7CiAgUnBjUGt0SGRyICpyZXNwb25zZTsKICB2b2lkICpidWYgPSBtc2ctPkJ1ZmZlcjsKICBSUENfU1RBVFVTIHN0YXR1czsKCiAgc3RhdGUubXNnID0gbXNnOwogIHN0YXRlLmJ1ZiA9IGJ1ZjsKICBUbHNTZXRWYWx1ZSh3b3JrZXJfdGxzLCAmc3RhdGUpOwoKICBzd2l0Y2ggKGhkci0+Y29tbW9uLnB0eXBlKSB7CiAgICBjYXNlIFBLVF9CSU5EOgogICAgICBUUkFDRSgiZ290IGJpbmQgcGFja2V0XG4iKTsKCiAgICAgIC8qIEZJWE1FOiBkbyBtb3JlIGNoZWNrcyEgKi8KICAgICAgaWYgKGhkci0+YmluZC5tYXhfdHNpemUgPCBSUENfTUlOX1BBQ0tFVF9TSVpFIHx8CiAgICAgICAgICAhVXVpZElzTmlsKCZjb25uLT5BY3RpdmVJbnRlcmZhY2UuU3ludGF4R1VJRCwgJnN0YXR1cykpIHsKICAgICAgICBUUkFDRSgicGFja2V0IHNpemUgbGVzcyB0aGFuIG1pbiBzaXplLCBvciBhY3RpdmUgaW50ZXJmYWNlIHN5bnRheCBndWlkIG5vbi1udWxsXG4iKTsKICAgICAgICBzaWYgPSBOVUxMOwogICAgICB9IGVsc2UgewogICAgICAgIHNpZiA9IFJQQ1JUNF9maW5kX2ludGVyZmFjZShOVUxMLCAmaGRyLT5iaW5kLmFic3RyYWN0LCBGQUxTRSk7CiAgICAgIH0KICAgICAgaWYgKHNpZiA9PSBOVUxMKSB7CiAgICAgICAgVFJBQ0UoInJlamVjdGluZyBiaW5kIHJlcXVlc3Qgb24gY29ubmVjdGlvbiAlcFxuIiwgY29ubik7CiAgICAgICAgLyogUmVwb3J0IGZhaWx1cmUgdG8gY2xpZW50LiAqLwogICAgICAgIHJlc3BvbnNlID0gUlBDUlQ0X0J1aWxkQmluZE5hY2tIZWFkZXIoTkRSX0xPQ0FMX0RBVEFfUkVQUkVTRU5UQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfVkVSX01BSk9SLCBSUENfVkVSX01JTk9SKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBUUkFDRSgiYWNjZXB0aW5nIGJpbmQgcmVxdWVzdCBvbiBjb25uZWN0aW9uICVwXG4iLCBjb25uKTsKCiAgICAgICAgLyogYWNjZXB0LiAqLwogICAgICAgIHJlc3BvbnNlID0gUlBDUlQ0X0J1aWxkQmluZEFja0hlYWRlcihORFJfTE9DQUxfREFUQV9SRVBSRVNFTlRBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX01BWF9QQUNLRVRfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX01BWF9QQUNLRVRfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+RW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU1VMVF9BQ0NFUFQsIE5PX1JFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZi0+SWYtPlRyYW5zZmVyU3ludGF4KTsKCiAgICAgICAgLyogc2F2ZSB0aGUgaW50ZXJmYWNlIGZvciBsYXRlciB1c2UgKi8KICAgICAgICBjb25uLT5BY3RpdmVJbnRlcmZhY2UgPSBoZHItPmJpbmQuYWJzdHJhY3Q7CiAgICAgICAgY29ubi0+TWF4VHJhbnNtaXNzaW9uU2l6ZSA9IGhkci0+YmluZC5tYXhfdHNpemU7CiAgICAgIH0KCiAgICAgIHN0YXR1cyA9IFJQQ1JUNF9TZW5kKGNvbm4sIHJlc3BvbnNlLCBOVUxMLCAwKTsKICAgICAgUlBDUlQ0X0ZyZWVIZWFkZXIocmVzcG9uc2UpOwogICAgICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKQogICAgICAgIGdvdG8gZmFpbDsKCiAgICAgIGJyZWFrOwoKICAgIGNhc2UgUEtUX1JFUVVFU1Q6CiAgICAgIFRSQUNFKCJnb3QgcmVxdWVzdCBwYWNrZXRcbiIpOwoKICAgICAgLyogZmFpbCBpZiB0aGUgY29ubmVjdGlvbiBpc24ndCBib3VuZCB3aXRoIGFuIGludGVyZmFjZSAqLwogICAgICBpZiAoVXVpZElzTmlsKCZjb25uLT5BY3RpdmVJbnRlcmZhY2UuU3ludGF4R1VJRCwgJnN0YXR1cykpIHsKICAgICAgICByZXNwb25zZSA9IFJQQ1JUNF9CdWlsZEZhdWx0SGVhZGVyKE5EUl9MT0NBTF9EQVRBX1JFUFJFU0VOVEFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKCiAgICAgICAgUlBDUlQ0X1NlbmQoY29ubiwgcmVzcG9uc2UsIE5VTEwsIDApOwogICAgICAgIFJQQ1JUNF9GcmVlSGVhZGVyKHJlc3BvbnNlKTsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGhkci0+Y29tbW9uLmZsYWdzICYgUlBDX0ZMR19PQkpFQ1RfVVVJRCkgewogICAgICAgIG9iamVjdF91dWlkID0gKFVVSUQqKSgmaGRyLT5yZXF1ZXN0ICsgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqZWN0X3V1aWQgPSBOVUxMOwogICAgICB9CgogICAgICBzaWYgPSBSUENSVDRfZmluZF9pbnRlcmZhY2Uob2JqZWN0X3V1aWQsICZjb25uLT5BY3RpdmVJbnRlcmZhY2UsIFRSVUUpOwogICAgICBtc2ctPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uID0gc2lmLT5JZjsKICAgICAgLyogY29weSB0aGUgZW5kcG9pbnQgdmVjdG9yIGZyb20gc2lmIHRvIG1zZyBzbyB0aGF0IG1pZGwtZ2VuZXJhdGVkIGNvZGUgd2lsbCB1c2UgaXQgKi8KICAgICAgbXNnLT5NYW5hZ2VyRXB2ID0gc2lmLT5NZ3JFcHY7CiAgICAgIGlmIChvYmplY3RfdXVpZCAhPSBOVUxMKSB7CiAgICAgICAgUlBDUlQ0X1NldEJpbmRpbmdPYmplY3QobXNnLT5IYW5kbGUsIG9iamVjdF91dWlkKTsKICAgICAgfQoKICAgICAgLyogZmluZCBkaXNwYXRjaCBmdW5jdGlvbiAqLwogICAgICBtc2ctPlByb2NOdW0gPSBoZHItPnJlcXVlc3Qub3BudW07CiAgICAgIGlmIChzaWYtPkZsYWdzICYgUlBDX0lGX09MRSkgewogICAgICAgIC8qIG5hdGl2ZSBvbGUzMiBhbHdheXMgZ2l2ZXMgdXMgYSBkaXNwYXRjaCB0YWJsZSB3aXRoIGEgc2luZ2xlIGVudHJ5CiAgICAgICAgICogKEkgYXNzdW1lIHRoYXQncyBhIHdyYXBwZXIgZm9yIElScGNTdHViQnVmZmVyOjpJbnZva2UpICovCiAgICAgICAgZnVuYyA9ICpzaWYtPklmLT5EaXNwYXRjaFRhYmxlLT5EaXNwYXRjaFRhYmxlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChtc2ctPlByb2NOdW0gPj0gc2lmLT5JZi0+RGlzcGF0Y2hUYWJsZS0+RGlzcGF0Y2hUYWJsZUNvdW50KSB7CiAgICAgICAgICBFUlIoImludmFsaWQgcHJvY251bVxuIik7CiAgICAgICAgICBmdW5jID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgZnVuYyA9IHNpZi0+SWYtPkRpc3BhdGNoVGFibGUtPkRpc3BhdGNoVGFibGVbbXNnLT5Qcm9jTnVtXTsKICAgICAgfQoKICAgICAgLyogcHV0IGluIHRoZSBkcmVwLiBGSVhNRTogaXMgdGhpcyBtb3JlIHVuaXZlcnNhbGx5IGFwcGxpY2FibGU/CiAgICAgICAgIHBlcmhhcHMgd2Ugc2hvdWxkIG1vdmUgdGhpcyBvdXR3YXJkLi4uICovCiAgICAgIG1zZy0+RGF0YVJlcHJlc2VudGF0aW9uID0gCiAgICAgICAgTUFLRUxPTkcoIE1BS0VXT1JEKGhkci0+Y29tbW9uLmRyZXBbMF0sIGhkci0+Y29tbW9uLmRyZXBbMV0pLAogICAgICAgICAgICAgICAgICBNQUtFV09SRChoZHItPmNvbW1vbi5kcmVwWzJdLCBoZHItPmNvbW1vbi5kcmVwWzNdKSk7CgogICAgICAvKiBkaXNwYXRjaCAqLwogICAgICBfX1RSWSB7CiAgICAgICAgaWYgKGZ1bmMpIGZ1bmMobXNnKTsKICAgICAgfSBfX0VYQ0VQVChycGNfZmlsdGVyKSB7CiAgICAgICAgLyogZmFpbHVyZSBwYWNrZXQgd2FzIGNyZWF0ZWQgaW4gcnBjX2ZpbHRlciAqLwogICAgICB9IF9fRU5EVFJZCgogICAgICAvKiBzZW5kIHJlc3BvbnNlIHBhY2tldCAqLwogICAgICBJX1JwY1NlbmQobXNnKTsKCiAgICAgIG1zZy0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb24gPSBOVUxMOwoKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgRklYTUUoInVuaGFuZGxlZCBwYWNrZXQgdHlwZVxuIik7CiAgICAgIGJyZWFrOwogIH0KCmZhaWw6CiAgLyogY2xlYW4gdXAgKi8KICBpZiAobXNnLT5CdWZmZXIgPT0gYnVmKSBtc2ctPkJ1ZmZlciA9IE5VTEw7CiAgVFJBQ0UoImZyZWVpbmcgQnVmZmVyPSVwXG4iLCBidWYpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CiAgUlBDUlQ0X0Rlc3Ryb3lCaW5kaW5nKG1zZy0+SGFuZGxlKTsKICBtc2ctPkhhbmRsZSA9IDA7CiAgSV9ScGNGcmVlQnVmZmVyKG1zZyk7CiAgbXNnLT5CdWZmZXIgPSBOVUxMOwogIFJQQ1JUNF9GcmVlSGVhZGVyKGhkcik7CiAgVGxzU2V0VmFsdWUod29ya2VyX3RscywgTlVMTCk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXNnKTsKfQoKc3RhdGljIERXT1JEIENBTExCQUNLIFJQQ1JUNF93b3JrZXJfdGhyZWFkKExQVk9JRCB0aGVfYXJnKQp7CiAgRFdPUkQgb2JqOwogIFJwY1BhY2tldCogcGt0OwoKICBmb3IgKDs7KSB7CiAgICAvKiBpZGxlIHRpbWVvdXQgYWZ0ZXIgNXMgKi8KICAgIG9iaiA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VydmVyX3NlbSwgNTAwMCk7CiAgICBpZiAob2JqID09IFdBSVRfVElNRU9VVCkgewogICAgICAvKiBpZiBhbm90aGVyIGlkbGUgdGhyZWFkIGV4aXN0LCBzZWxmLWRlc3RydWN0ICovCiAgICAgIGlmICh3b3JrZXJfZnJlZSA+IDEpIGJyZWFrOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHBrdCA9IFJQQ1JUNF9wb3BfcGFja2V0KCk7CiAgICBpZiAoIXBrdCkgY29udGludWU7CiAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmd29ya2VyX2ZyZWUpOwogICAgZm9yICg7OykgewogICAgICBSUENSVDRfcHJvY2Vzc19wYWNrZXQocGt0LT5jb25uLCBwa3QtPmhkciwgcGt0LT5tc2cpOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwa3QpOwogICAgICAvKiB0cnkgdG8gZ3JhYiBhbm90aGVyIHBhY2tldCBoZXJlIHdpdGhvdXQgd2FpdGluZwogICAgICAgKiBvbiB0aGUgc2VtYXBob3JlLCBpbiBjYXNlIGl0IGhpdHMgbWF4ICovCiAgICAgIHBrdCA9IFJQQ1JUNF9wb3BfcGFja2V0KCk7CiAgICAgIGlmICghcGt0KSBicmVhazsKICAgICAgLyogZGVjcmVtZW50IHNlbWFwaG9yZSAqLwogICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlcnZlcl9zZW0sIDApOwogICAgfQogICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoJndvcmtlcl9mcmVlKTsKICB9CiAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJndvcmtlcl9mcmVlKTsKICBJbnRlcmxvY2tlZERlY3JlbWVudCgmd29ya2VyX2NvdW50KTsKICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgUlBDUlQ0X2NyZWF0ZV93b3JrZXJfaWZfbmVlZGVkKHZvaWQpCnsKICBpZiAoIXdvcmtlcl9mcmVlICYmIHdvcmtlcl9jb3VudCA8IE1BWF9USFJFQURTKSB7CiAgICBIQU5ETEUgdGhyZWFkOwogICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoJndvcmtlcl9jb3VudCk7CiAgICBJbnRlcmxvY2tlZEluY3JlbWVudCgmd29ya2VyX2ZyZWUpOwogICAgdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIFJQQ1JUNF93b3JrZXJfdGhyZWFkLCBOVUxMLCAwLCBOVUxMKTsKICAgIGlmICh0aHJlYWQpIENsb3NlSGFuZGxlKHRocmVhZCk7CiAgICBlbHNlIHsKICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJndvcmtlcl9mcmVlKTsKICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJndvcmtlcl9jb3VudCk7CiAgICB9CiAgfQp9CgpzdGF0aWMgRFdPUkQgQ0FMTEJBQ0sgUlBDUlQ0X2lvX3RocmVhZChMUFZPSUQgdGhlX2FyZykKewogIFJwY0Nvbm5lY3Rpb24qIGNvbm4gPSAoUnBjQ29ubmVjdGlvbiopdGhlX2FyZzsKICBScGNQa3RIZHIgKmhkcjsKICBScGNCaW5kaW5nICpwYmluZDsKICBSUENfTUVTU0FHRSAqbXNnOwogIFJQQ19TVEFUVVMgc3RhdHVzOwogIFJwY1BhY2tldCAqcGFja2V0OwoKICBUUkFDRSgiKCVwKVxuIiwgY29ubik7CgogIGZvciAoOzspIHsKICAgIG1zZyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoUlBDX01FU1NBR0UpKTsKCiAgICAvKiBjcmVhdGUgdGVtcG9yYXJ5IGJpbmRpbmcgZm9yIGRpc3BhdGNoLCBpdCB3aWxsIGJlIGZyZWVkIGluCiAgICAgKiBSUENSVDRfcHJvY2Vzc19wYWNrZXQgKi8KICAgIFJQQ1JUNF9NYWtlQmluZGluZygmcGJpbmQsIGNvbm4pOwogICAgbXNnLT5IYW5kbGUgPSAoUlBDX0JJTkRJTkdfSEFORExFKXBiaW5kOwoKICAgIHN0YXR1cyA9IFJQQ1JUNF9SZWNlaXZlKGNvbm4sICZoZHIsIG1zZyk7CiAgICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKSB7CiAgICAgIFdBUk4oInJlY2VpdmUgZmFpbGVkIHdpdGggZXJyb3IgJWx4XG4iLCBzdGF0dXMpOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtc2cpOwogICAgICBicmVhazsKICAgIH0KCiNpZiAwCiAgICBSUENSVDRfcHJvY2Vzc19wYWNrZXQoY29ubiwgaGRyLCBtc2cpOwojZWxzZQogICAgcGFja2V0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihScGNQYWNrZXQpKTsKICAgIHBhY2tldC0+Y29ubiA9IGNvbm47CiAgICBwYWNrZXQtPmhkciA9IGhkcjsKICAgIHBhY2tldC0+bXNnID0gbXNnOwogICAgUlBDUlQ0X2NyZWF0ZV93b3JrZXJfaWZfbmVlZGVkKCk7CiAgICBSUENSVDRfcHVzaF9wYWNrZXQocGFja2V0KTsKICAgIFJlbGVhc2VTZW1hcGhvcmUoc2VydmVyX3NlbSwgMSwgTlVMTCk7CiNlbmRpZgogICAgbXNnID0gTlVMTDsKICB9CiAgUlBDUlQ0X0Rlc3Ryb3lDb25uZWN0aW9uKGNvbm4pOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBSUENSVDRfbmV3X2NsaWVudChScGNDb25uZWN0aW9uKiBjb25uKQp7CiAgSEFORExFIHRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBSUENSVDRfaW9fdGhyZWFkLCBjb25uLCAwLCBOVUxMKTsKICBpZiAoIXRocmVhZCkgewogICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CiAgICBFUlIoImZhaWxlZCB0byBjcmVhdGUgdGhyZWFkLCBlcnJvcj0lMDhseFxuIiwgZXJyKTsKICAgIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihjb25uKTsKICB9CiAgLyogd2UgY291bGQgc2V0IGNvbm4tPnRocmVhZCwgYnV0IHRoZW4gd2UnZCBoYXZlIHRvIG1ha2UgdGhlIGlvX3RocmVhZCB3YWl0CiAgICogZm9yIHRoYXQsIG90aGVyd2lzZSB0aGUgdGhyZWFkIG1pZ2h0IGZpbmlzaCwgZGVzdHJveSB0aGUgY29ubmVjdGlvbiwgYW5kCiAgICogZnJlZSB0aGUgbWVtb3J5IHdlJ2Qgd3JpdGUgdG8gYmVmb3JlIHdlIGRpZCwgY2F1c2luZyBjcmFzaGVzIGFuZCBzdHVmZiAtCiAgICogc28gbGV0J3MgaW1wbGVtZW50IHRoYXQgbGF0ZXIsIHdoZW4gd2UgcmVhbGx5IG5lZWQgY29ubi0+dGhyZWFkICovCgogIENsb3NlSGFuZGxlKCB0aHJlYWQgKTsKfQoKc3RhdGljIERXT1JEIENBTExCQUNLIFJQQ1JUNF9zZXJ2ZXJfdGhyZWFkKExQVk9JRCB0aGVfYXJnKQp7CiAgSEFORExFIG1fZXZlbnQgPSBtZ3JfZXZlbnQsIGJfaGFuZGxlOwogIEhBTkRMRSAqb2JqcyA9IE5VTEw7CiAgRFdPUkQgY291bnQsIHJlczsKICBScGNTZXJ2ZXJQcm90c2VxKiBjcHM7CiAgUnBjQ29ubmVjdGlvbiogY29ubjsKICBScGNDb25uZWN0aW9uKiBjY29ubjsKICBCT09MIHNldF9yZWFkeV9ldmVudCA9IEZBTFNFOwoKICBUUkFDRSgiKHRoZV9hcmcgPT0gXiVwKVxuIiwgdGhlX2FyZyk7CgogIGZvciAoOzspIHsKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogICAgLyogb3BlbiBhbmQgY291bnQgY29ubmVjdGlvbnMgKi8KICAgIGNvdW50ID0gMTsKICAgIGNwcyA9IHByb3RzZXFzOwogICAgd2hpbGUgKGNwcykgewogICAgICBjb25uID0gY3BzLT5jb25uOwogICAgICB3aGlsZSAoY29ubikgewogICAgICAgIFJQQ1JUNF9PcGVuQ29ubmVjdGlvbihjb25uKTsKICAgICAgICBpZiAocnBjcnQ0X2Nvbm5fZ2V0X3dhaXRfb2JqZWN0KGNvbm4pKQogICAgICAgICAgY291bnQrKzsKICAgICAgICBjb25uID0gY29ubi0+TmV4dDsKICAgICAgfQogICAgICBjcHMgPSBjcHMtPk5leHQ7CiAgICB9CiAgICAvKiBtYWtlIGFycmF5IG9mIGNvbm5lY3Rpb25zICovCiAgICBpZiAob2JqcykKICAgICAgb2JqcyA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIG9ianMsIGNvdW50KnNpemVvZihIQU5ETEUpKTsKICAgIGVsc2UKICAgICAgb2JqcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjb3VudCpzaXplb2YoSEFORExFKSk7CgogICAgb2Jqc1swXSA9IG1fZXZlbnQ7CiAgICBjb3VudCA9IDE7CiAgICBjcHMgPSBwcm90c2VxczsKICAgIHdoaWxlIChjcHMpIHsKICAgICAgY29ubiA9IGNwcy0+Y29ubjsKICAgICAgd2hpbGUgKGNvbm4pIHsKICAgICAgICBpZiAoKG9ianNbY291bnRdID0gcnBjcnQ0X2Nvbm5fZ2V0X3dhaXRfb2JqZWN0KGNvbm4pKSkKICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICAgIH0KICAgICAgY3BzID0gY3BzLT5OZXh0OwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CgogICAgaWYgKHNldF9yZWFkeV9ldmVudCkKICAgIHsKICAgICAgICAvKiBzaWduYWwgdG8gZnVuY3Rpb24gdGhhdCBjaGFuZ2VkIHN0YXRlIHRoYXQgd2UgYXJlIG5vdyBzeW5jJ2VkICovCiAgICAgICAgU2V0RXZlbnQoc2VydmVyX3JlYWR5X2V2ZW50KTsKICAgICAgICBzZXRfcmVhZHlfZXZlbnQgPSBGQUxTRTsKICAgIH0KCiAgICAvKiBzdGFydCB3YWl0aW5nICovCiAgICByZXMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGNvdW50LCBvYmpzLCBGQUxTRSwgSU5GSU5JVEUpOwogICAgaWYgKHJlcyA9PSBXQUlUX09CSkVDVF8wKSB7CiAgICAgIGlmICghc3RkX2xpc3RlbikKICAgICAgewogICAgICAgIFNldEV2ZW50KHNlcnZlcl9yZWFkeV9ldmVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc2V0X3JlYWR5X2V2ZW50ID0gVFJVRTsKICAgIH0KICAgIGVsc2UgaWYgKHJlcyA9PSBXQUlUX0ZBSUxFRCkgewogICAgICBFUlIoIndhaXQgZmFpbGVkXG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICBiX2hhbmRsZSA9IG9ianNbcmVzIC0gV0FJVF9PQkpFQ1RfMF07CiAgICAgIC8qIGZpbmQgd2hpY2ggY29ubmVjdGlvbiBnb3QgYSBSUEMgKi8KICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgICAgIGNvbm4gPSBOVUxMOwogICAgICBjcHMgPSBwcm90c2VxczsKICAgICAgd2hpbGUgKGNwcykgewogICAgICAgIGNvbm4gPSBjcHMtPmNvbm47CiAgICAgICAgd2hpbGUgKGNvbm4pIHsKICAgICAgICAgIGlmIChiX2hhbmRsZSA9PSBycGNydDRfY29ubl9nZXRfd2FpdF9vYmplY3QoY29ubikpIGJyZWFrOwogICAgICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChjb25uKSBicmVhazsKICAgICAgICBjcHMgPSBjcHMtPk5leHQ7CiAgICAgIH0KICAgICAgY2Nvbm4gPSBOVUxMOwogICAgICBpZiAoY29ubikKICAgICAgICBSUENSVDRfU3Bhd25Db25uZWN0aW9uKCZjY29ubiwgY29ubik7CiAgICAgIGVsc2UKICAgICAgICBFUlIoImZhaWxlZCB0byBsb2NhdGUgY29ubmVjdGlvbiBmb3IgaGFuZGxlICVwXG4iLCBiX2hhbmRsZSk7CiAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogICAgICBpZiAoY2Nvbm4pIFJQQ1JUNF9uZXdfY2xpZW50KGNjb25uKTsKICAgIH0KICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2Jqcyk7CiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgLyogY2xvc2UgY29ubmVjdGlvbnMgKi8KICBjcHMgPSBwcm90c2VxczsKICB3aGlsZSAoY3BzKSB7CiAgICBjb25uID0gY3BzLT5jb25uOwogICAgd2hpbGUgKGNvbm4pIHsKICAgICAgUlBDUlQ0X0Nsb3NlQ29ubmVjdGlvbihjb25uKTsKICAgICAgY29ubiA9IGNvbm4tPk5leHQ7CiAgICB9CiAgICBjcHMgPSBjcHMtPk5leHQ7CiAgfQogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIHJldHVybiAwOwp9CgovKiB0ZWxscyB0aGUgc2VydmVyIHRocmVhZCB0aGF0IHRoZSBzdGF0ZSBoYXMgY2hhbmdlZCBhbmQgd2FpdHMgZm9yIGl0IHRvCiAqIG1ha2UgdGhlIGNoYW5nZXMgKi8Kc3RhdGljIHZvaWQgUlBDUlQ0X3N5bmNfd2l0aF9zZXJ2ZXJfdGhyZWFkKHZvaWQpCnsKICAvKiBtYWtlIHN1cmUgd2UgYXJlIHRoZSBvbmx5IHRocmVhZCBzeW5jJ2luZyB0aGUgc2VydmVyIHN0YXRlLCBvdGhlcndpc2UKICAgKiB0aGVyZSBpcyBhIHJhY2Ugd2l0aCB0aGUgc2VydmVyIHRocmVhZCBzZXR0aW5nIGFuIG9sZGVyIHN0YXRlIGFuZCBzZXR0aW5nCiAgICogdGhlIHNlcnZlcl9yZWFkeV9ldmVudCB3aGVuIHRoZSBuZXcgc3RhdGUgaGFzbid0IHlldCBiZWVuIGFwcGxpZWQgKi8KICBXYWl0Rm9yU2luZ2xlT2JqZWN0KG1ncl9tdXRleCwgSU5GSU5JVEUpOwoKICBTZXRFdmVudChtZ3JfZXZlbnQpOwogIC8qIHdhaXQgZm9yIHNlcnZlciB0aHJlYWQgdG8gbWFrZSB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYmVmb3JlIHJldHVybmluZyAqLwogIFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VydmVyX3JlYWR5X2V2ZW50LCBJTkZJTklURSk7CgogIFJlbGVhc2VNdXRleChtZ3JfbXV0ZXgpOwp9CgpzdGF0aWMgUlBDX1NUQVRVUyBSUENSVDRfc3RhcnRfbGlzdGVuKEJPT0wgYXV0b19saXN0ZW4pCnsKICBSUENfU1RBVFVTIHN0YXR1cyA9IFJQQ19TX0FMUkVBRFlfTElTVEVOSU5HOwoKICBUUkFDRSgiXG4iKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmxpc3Rlbl9jcyk7CiAgaWYgKGF1dG9fbGlzdGVuIHx8IChtYW51YWxfbGlzdGVuX2NvdW50KysgPT0gMCkpCiAgewogICAgc3RhdHVzID0gUlBDX1NfT0s7CiAgICBpZiAoKytsaXN0ZW5fY291bnQgPT0gMSkgewogICAgICBIQU5ETEUgc2VydmVyX3RocmVhZDsKICAgICAgLyogZmlyc3QgbGlzdGVuZXIgY3JlYXRlcyBzZXJ2ZXIgdGhyZWFkICovCiAgICAgIGlmICghbWdyX211dGV4KSBtZ3JfbXV0ZXggPSBDcmVhdGVNdXRleFcoTlVMTCwgRkFMU0UsIE5VTEwpOwogICAgICBpZiAoIW1ncl9ldmVudCkgbWdyX2V2ZW50ID0gQ3JlYXRlRXZlbnRXKE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CiAgICAgIGlmICghc2VydmVyX3JlYWR5X2V2ZW50KSBzZXJ2ZXJfcmVhZHlfZXZlbnQgPSBDcmVhdGVFdmVudFcoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKICAgICAgaWYgKCFzZXJ2ZXJfc2VtKSBzZXJ2ZXJfc2VtID0gQ3JlYXRlU2VtYXBob3JlVyhOVUxMLCAwLCBNQVhfVEhSRUFEUywgTlVMTCk7CiAgICAgIGlmICghd29ya2VyX3Rscykgd29ya2VyX3RscyA9IFRsc0FsbG9jKCk7CiAgICAgIHN0ZF9saXN0ZW4gPSBUUlVFOwogICAgICBzZXJ2ZXJfdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIFJQQ1JUNF9zZXJ2ZXJfdGhyZWFkLCBOVUxMLCAwLCBOVUxMKTsKICAgICAgQ2xvc2VIYW5kbGUoc2VydmVyX3RocmVhZCk7CiAgICB9CiAgfQogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwoKICByZXR1cm4gc3RhdHVzOwp9CgpzdGF0aWMgdm9pZCBSUENSVDRfc3RvcF9saXN0ZW4oQk9PTCBhdXRvX2xpc3RlbikKewogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogIGlmIChhdXRvX2xpc3RlbiB8fCAoLS1tYW51YWxfbGlzdGVuX2NvdW50ID09IDApKQogIHsKICAgIGlmIChsaXN0ZW5fY291bnQgIT0gMCAmJiAtLWxpc3Rlbl9jb3VudCA9PSAwKSB7CiAgICAgIHN0ZF9saXN0ZW4gPSBGQUxTRTsKICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmxpc3Rlbl9jcyk7CiAgICAgIFJQQ1JUNF9zeW5jX3dpdGhfc2VydmVyX3RocmVhZCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhc3NlcnQobGlzdGVuX2NvdW50ID49IDApOwogIH0KICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbGlzdGVuX2NzKTsKfQoKc3RhdGljIFJQQ19TVEFUVVMgUlBDUlQ0X3VzZV9wcm90c2VxKFJwY1NlcnZlclByb3RzZXEqIHBzKQp7CiAgUlBDUlQ0X0NyZWF0ZUNvbm5lY3Rpb24oJnBzLT5jb25uLCBUUlVFLCBwcy0+UHJvdHNlcSwgTlVMTCwgcHMtPkVuZHBvaW50LCBOVUxMLCBOVUxMKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnNlcnZlcl9jcyk7CiAgcHMtPk5leHQgPSBwcm90c2VxczsKICBwcm90c2VxcyA9IHBzOwogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwoKICBpZiAoc3RkX2xpc3RlbikgUlBDUlQ0X3N5bmNfd2l0aF9zZXJ2ZXJfdGhyZWFkKCk7CgogIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlcklucUJpbmRpbmdzIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlcklucUJpbmRpbmdzKCBSUENfQklORElOR19WRUNUT1IqKiBCaW5kaW5nVmVjdG9yICkKewogIFJQQ19TVEFUVVMgc3RhdHVzOwogIERXT1JEIGNvdW50OwogIFJwY1NlcnZlclByb3RzZXEqIHBzOwogIFJwY0Nvbm5lY3Rpb24qIGNvbm47CgogIGlmIChCaW5kaW5nVmVjdG9yKQogICAgVFJBQ0UoIigqQmluZGluZ1ZlY3RvciA9PSBeJXApXG4iLCAqQmluZGluZ1ZlY3Rvcik7CiAgZWxzZQogICAgRVJSKCIoQmluZGluZ1ZlY3RvciA9PSBOVUxMISE/KVxuIik7CgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIC8qIGNvdW50IGNvbm5lY3Rpb25zICovCiAgY291bnQgPSAwOwogIHBzID0gcHJvdHNlcXM7CiAgd2hpbGUgKHBzKSB7CiAgICBjb25uID0gcHMtPmNvbm47CiAgICB3aGlsZSAoY29ubikgewogICAgICBjb3VudCsrOwogICAgICBjb25uID0gY29ubi0+TmV4dDsKICAgIH0KICAgIHBzID0gcHMtPk5leHQ7CiAgfQogIGlmIChjb3VudCkgewogICAgLyogZXhwb3J0IGJpbmRpbmdzICovCiAgICAqQmluZGluZ1ZlY3RvciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUlBDX0JJTkRJTkdfVkVDVE9SKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSUENfQklORElOR19IQU5ETEUpKihjb3VudC0xKSk7CiAgICAoKkJpbmRpbmdWZWN0b3IpLT5Db3VudCA9IGNvdW50OwogICAgY291bnQgPSAwOwogICAgcHMgPSBwcm90c2VxczsKICAgIHdoaWxlIChwcykgewogICAgICBjb25uID0gcHMtPmNvbm47CiAgICAgIHdoaWxlIChjb25uKSB7CiAgICAgICBSUENSVDRfTWFrZUJpbmRpbmcoKFJwY0JpbmRpbmcqKikmKCpCaW5kaW5nVmVjdG9yKS0+QmluZGluZ0hbY291bnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4pOwogICAgICAgY291bnQrKzsKICAgICAgIGNvbm4gPSBjb25uLT5OZXh0OwogICAgICB9CiAgICAgIHBzID0gcHMtPk5leHQ7CiAgICB9CiAgICBzdGF0dXMgPSBSUENfU19PSzsKICB9IGVsc2UgewogICAgKkJpbmRpbmdWZWN0b3IgPSBOVUxMOwogICAgc3RhdHVzID0gUlBDX1NfTk9fQklORElOR1M7CiAgfQogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwogIHJldHVybiBzdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJVc2VQcm90c2VxRXBBIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFFcEEoIHVuc2lnbmVkIGNoYXIgKlByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIHVuc2lnbmVkIGNoYXIgKkVuZHBvaW50LCBMUFZPSUQgU2VjdXJpdHlEZXNjcmlwdG9yICkKewogIFJQQ19QT0xJQ1kgcG9saWN5OwogIAogIFRSQUNFKCAiKCVzLCV1LCVzLCVwKVxuIiwgUHJvdHNlcSwgTWF4Q2FsbHMsIEVuZHBvaW50LCBTZWN1cml0eURlc2NyaXB0b3IgKTsKICAKICAvKiBUaGlzIHNob3VsZCBwcm92aWRlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciAqLwogIHBvbGljeS5MZW5ndGggICAgICAgID0gc2l6ZW9mKCBwb2xpY3kgKTsKICBwb2xpY3kuRW5kcG9pbnRGbGFncyA9IDA7CiAgcG9saWN5Lk5JQ0ZsYWdzICAgICAgPSAwOwogIAogIHJldHVybiBScGNTZXJ2ZXJVc2VQcm90c2VxRXBFeEEoIFByb3RzZXEsIE1heENhbGxzLCBFbmRwb2ludCwgU2VjdXJpdHlEZXNjcmlwdG9yLCAmcG9saWN5ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJVc2VQcm90c2VxRXBXIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFFcFcoIExQV1NUUiBQcm90c2VxLCBVSU5UIE1heENhbGxzLCBMUFdTVFIgRW5kcG9pbnQsIExQVk9JRCBTZWN1cml0eURlc2NyaXB0b3IgKQp7CiAgUlBDX1BPTElDWSBwb2xpY3k7CiAgCiAgVFJBQ0UoICIoJXMsJXUsJXMsJXApXG4iLCBkZWJ1Z3N0cl93KCBQcm90c2VxICksIE1heENhbGxzLCBkZWJ1Z3N0cl93KCBFbmRwb2ludCApLCBTZWN1cml0eURlc2NyaXB0b3IgKTsKICAKICAvKiBUaGlzIHNob3VsZCBwcm92aWRlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciAqLwogIHBvbGljeS5MZW5ndGggICAgICAgID0gc2l6ZW9mKCBwb2xpY3kgKTsKICBwb2xpY3kuRW5kcG9pbnRGbGFncyA9IDA7CiAgcG9saWN5Lk5JQ0ZsYWdzICAgICAgPSAwOwogIAogIHJldHVybiBScGNTZXJ2ZXJVc2VQcm90c2VxRXBFeFcoIFByb3RzZXEsIE1heENhbGxzLCBFbmRwb2ludCwgU2VjdXJpdHlEZXNjcmlwdG9yLCAmcG9saWN5ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBhbGxvY19zZXJ2ZXJwcm90b3NlcSAoaW50ZXJuYWwpCiAqLwpzdGF0aWMgUnBjU2VydmVyUHJvdHNlcSAqYWxsb2Nfc2VydmVycHJvdG9zZXEoVUlOVCBNYXhDYWxscywgY2hhciAqUHJvdHNlcSwgY2hhciAqRW5kcG9pbnQpCnsKICBScGNTZXJ2ZXJQcm90c2VxKiBwczsKCiAgcHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFJwY1NlcnZlclByb3RzZXEpKTsKICBwcy0+TWF4Q2FsbHMgPSBNYXhDYWxsczsKICBwcy0+UHJvdHNlcSA9IFByb3RzZXE7CiAgcHMtPkVuZHBvaW50ID0gRW5kcG9pbnQ7CgogIHJldHVybiBwczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4QSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTZXJ2ZXJVc2VQcm90c2VxRXBFeEEoIHVuc2lnbmVkIGNoYXIgKlByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIHVuc2lnbmVkIGNoYXIgKkVuZHBvaW50LCBMUFZPSUQgU2VjdXJpdHlEZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSUENfUE9MSUNZIGxwUG9saWN5ICkKewogIGNoYXIgKnN6cHMgPSAoY2hhciopUHJvdHNlcSwgKnN6ZXAgPSAoY2hhciopRW5kcG9pbnQ7CiAgUnBjU2VydmVyUHJvdHNlcSogcHM7CgogIFRSQUNFKCIoJXMsJXUsJXMsJXAseyV1LCVsdSwlbHV9KVxuIiwgZGVidWdzdHJfYShzenBzKSwgTWF4Q2FsbHMsCiAgICAgICBkZWJ1Z3N0cl9hKHN6ZXApLCBTZWN1cml0eURlc2NyaXB0b3IsCiAgICAgICBscFBvbGljeS0+TGVuZ3RoLCBscFBvbGljeS0+RW5kcG9pbnRGbGFncywgbHBQb2xpY3ktPk5JQ0ZsYWdzICk7CgogIHBzID0gYWxsb2Nfc2VydmVycHJvdG9zZXEoTWF4Q2FsbHMsIFJQQ1JUNF9zdHJkdXBBKHN6cHMpLCBSUENSVDRfc3RyZHVwQShzemVwKSk7CgogIHJldHVybiBSUENSVDRfdXNlX3Byb3RzZXEocHMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVXNlUHJvdHNlcUVwRXhXIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVzZVByb3RzZXFFcEV4VyggTFBXU1RSIFByb3RzZXEsIFVJTlQgTWF4Q2FsbHMsIExQV1NUUiBFbmRwb2ludCwgTFBWT0lEIFNlY3VyaXR5RGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlBDX1BPTElDWSBscFBvbGljeSApCnsKICBScGNTZXJ2ZXJQcm90c2VxKiBwczsKCiAgVFJBQ0UoIiglcywldSwlcywlcCx7JXUsJWx1LCVsdX0pXG4iLCBkZWJ1Z3N0cl93KCBQcm90c2VxICksIE1heENhbGxzLAogICAgICAgZGVidWdzdHJfdyggRW5kcG9pbnQgKSwgU2VjdXJpdHlEZXNjcmlwdG9yLAogICAgICAgbHBQb2xpY3ktPkxlbmd0aCwgbHBQb2xpY3ktPkVuZHBvaW50RmxhZ3MsIGxwUG9saWN5LT5OSUNGbGFncyApOwoKICBwcyA9IGFsbG9jX3NlcnZlcnByb3Rvc2VxKE1heENhbGxzLCBSUENSVDRfc3RyZHVwV3RvQShQcm90c2VxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ1JUNF9zdHJkdXBXdG9BKEVuZHBvaW50KSk7CgogIHJldHVybiBSUENSVDRfdXNlX3Byb3RzZXEocHMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVXNlUHJvdHNlcUEgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVXNlUHJvdHNlcUEodW5zaWduZWQgY2hhciAqUHJvdHNlcSwgdW5zaWduZWQgaW50IE1heENhbGxzLCB2b2lkICpTZWN1cml0eURlc2NyaXB0b3IpCnsKICBUUkFDRSgiKFByb3RzZXEgPT0gJXMsIE1heENhbGxzID09ICVkLCBTZWN1cml0eURlc2NyaXB0b3IgPT0gXiVwKVxuIiwgZGVidWdzdHJfYSgoY2hhciopUHJvdHNlcSksIE1heENhbGxzLCBTZWN1cml0eURlc2NyaXB0b3IpOwogIHJldHVybiBScGNTZXJ2ZXJVc2VQcm90c2VxRXBBKFByb3RzZXEsIE1heENhbGxzLCBOVUxMLCBTZWN1cml0eURlc2NyaXB0b3IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVXNlUHJvdHNlcVcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVXNlUHJvdHNlcVcoTFBXU1RSIFByb3RzZXEsIHVuc2lnbmVkIGludCBNYXhDYWxscywgdm9pZCAqU2VjdXJpdHlEZXNjcmlwdG9yKQp7CiAgVFJBQ0UoIlByb3RzZXEgPT0gJXMsIE1heENhbGxzID09ICVkLCBTZWN1cml0eURlc2NyaXB0b3IgPT0gXiVwKVxuIiwgZGVidWdzdHJfdyhQcm90c2VxKSwgTWF4Q2FsbHMsIFNlY3VyaXR5RGVzY3JpcHRvcik7CiAgcmV0dXJuIFJwY1NlcnZlclVzZVByb3RzZXFFcFcoUHJvdHNlcSwgTWF4Q2FsbHMsIE5VTEwsIFNlY3VyaXR5RGVzY3JpcHRvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJSZWdpc3RlcklmIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclJlZ2lzdGVySWYoIFJQQ19JRl9IQU5ETEUgSWZTcGVjLCBVVUlEKiBNZ3JUeXBlVXVpZCwgUlBDX01HUl9FUFYqIE1nckVwdiApCnsKICBUUkFDRSgiKCVwLCVzLCVwKVxuIiwgSWZTcGVjLCBkZWJ1Z3N0cl9ndWlkKE1nclR5cGVVdWlkKSwgTWdyRXB2KTsKICByZXR1cm4gUnBjU2VydmVyUmVnaXN0ZXJJZjIoIElmU3BlYywgTWdyVHlwZVV1aWQsIE1nckVwdiwgMCwgUlBDX0NfTElTVEVOX01BWF9DQUxMU19ERUZBVUxULCAoVUlOVCktMSwgTlVMTCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyUmVnaXN0ZXJJZkV4IChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclJlZ2lzdGVySWZFeCggUlBDX0lGX0hBTkRMRSBJZlNwZWMsIFVVSUQqIE1nclR5cGVVdWlkLCBSUENfTUdSX0VQViogTWdyRXB2LAogICAgICAgICAgICAgICAgICAgICAgIFVJTlQgRmxhZ3MsIFVJTlQgTWF4Q2FsbHMsIFJQQ19JRl9DQUxMQkFDS19GTiogSWZDYWxsYmFja0ZuICkKewogIFRSQUNFKCIoJXAsJXMsJXAsJXUsJXUsJXApXG4iLCBJZlNwZWMsIGRlYnVnc3RyX2d1aWQoTWdyVHlwZVV1aWQpLCBNZ3JFcHYsIEZsYWdzLCBNYXhDYWxscywgSWZDYWxsYmFja0ZuKTsKICByZXR1cm4gUnBjU2VydmVyUmVnaXN0ZXJJZjIoIElmU3BlYywgTWdyVHlwZVV1aWQsIE1nckVwdiwgRmxhZ3MsIE1heENhbGxzLCAoVUlOVCktMSwgSWZDYWxsYmFja0ZuICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJSZWdpc3RlcklmMiAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTZXJ2ZXJSZWdpc3RlcklmMiggUlBDX0lGX0hBTkRMRSBJZlNwZWMsIFVVSUQqIE1nclR5cGVVdWlkLCBSUENfTUdSX0VQViogTWdyRXB2LAogICAgICAgICAgICAgICAgICAgICAgVUlOVCBGbGFncywgVUlOVCBNYXhDYWxscywgVUlOVCBNYXhScGNTaXplLCBSUENfSUZfQ0FMTEJBQ0tfRk4qIElmQ2FsbGJhY2tGbiApCnsKICBQUlBDX1NFUlZFUl9JTlRFUkZBQ0UgSWYgPSAoUFJQQ19TRVJWRVJfSU5URVJGQUNFKUlmU3BlYzsKICBScGNTZXJ2ZXJJbnRlcmZhY2UqIHNpZjsKICB1bnNpZ25lZCBpbnQgaTsKCiAgVFJBQ0UoIiglcCwlcywlcCwldSwldSwldSwlcClcbiIsIElmU3BlYywgZGVidWdzdHJfZ3VpZChNZ3JUeXBlVXVpZCksIE1nckVwdiwgRmxhZ3MsIE1heENhbGxzLAogICAgICAgICBNYXhScGNTaXplLCBJZkNhbGxiYWNrRm4pOwogIFRSQUNFKCIgaW50ZXJmYWNlIGlkOiAlcyAlZC4lZFxuIiwgZGVidWdzdHJfZ3VpZCgmSWYtPkludGVyZmFjZUlkLlN5bnRheEdVSUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYtPkludGVyZmFjZUlkLlN5bnRheFZlcnNpb24uTWFqb3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYtPkludGVyZmFjZUlkLlN5bnRheFZlcnNpb24uTWlub3JWZXJzaW9uKTsKICBUUkFDRSgiIHRyYW5zZmVyIHN5bnRheDogJXMgJWQuJWRcbiIsIGRlYnVnc3RyX2d1aWQoJklmLT5UcmFuc2ZlclN5bnRheC5TeW50YXhHVUlEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmLT5UcmFuc2ZlclN5bnRheC5TeW50YXhWZXJzaW9uLk1ham9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmLT5UcmFuc2ZlclN5bnRheC5TeW50YXhWZXJzaW9uLk1pbm9yVmVyc2lvbik7CiAgVFJBQ0UoIiBkaXNwYXRjaCB0YWJsZTogJXBcbiIsIElmLT5EaXNwYXRjaFRhYmxlKTsKICBpZiAoSWYtPkRpc3BhdGNoVGFibGUpIHsKICAgIFRSQUNFKCIgIGRpc3BhdGNoIHRhYmxlIGNvdW50OiAlZFxuIiwgSWYtPkRpc3BhdGNoVGFibGUtPkRpc3BhdGNoVGFibGVDb3VudCk7CiAgICBmb3IgKGk9MDsgaTxJZi0+RGlzcGF0Y2hUYWJsZS0+RGlzcGF0Y2hUYWJsZUNvdW50OyBpKyspIHsKICAgICAgVFJBQ0UoIiAgIGVudHJ5ICVkOiAlcFxuIiwgaSwgSWYtPkRpc3BhdGNoVGFibGUtPkRpc3BhdGNoVGFibGVbaV0pOwogICAgfQogICAgVFJBQ0UoIiAgcmVzZXJ2ZWQ6ICVsZFxuIiwgSWYtPkRpc3BhdGNoVGFibGUtPlJlc2VydmVkKTsKICB9CiAgVFJBQ0UoIiBwcm90c2VxIGVuZHBvaW50IGNvdW50OiAlZFxuIiwgSWYtPlJwY1Byb3RzZXFFbmRwb2ludENvdW50KTsKICBUUkFDRSgiIGRlZmF1bHQgbWFuYWdlciBlcHY6ICVwXG4iLCBJZi0+RGVmYXVsdE1hbmFnZXJFcHYpOwogIFRSQUNFKCIgaW50ZXJwcmV0ZXIgaW5mbzogJXBcbiIsIElmLT5JbnRlcnByZXRlckluZm8pOwoKICBzaWYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFJwY1NlcnZlckludGVyZmFjZSkpOwogIHNpZi0+SWYgICAgICAgICAgID0gSWY7CiAgaWYgKE1nclR5cGVVdWlkKSB7CiAgICBtZW1jcHkoJnNpZi0+TWdyVHlwZVV1aWQsIE1nclR5cGVVdWlkLCBzaXplb2YoVVVJRCkpOwogICAgc2lmLT5NZ3JFcHYgICAgICAgPSBNZ3JFcHY7CiAgfSBlbHNlIHsKICAgIG1lbXNldCgmc2lmLT5NZ3JUeXBlVXVpZCwgMCwgc2l6ZW9mKFVVSUQpKTsKICAgIHNpZi0+TWdyRXB2ICAgICAgID0gSWYtPkRlZmF1bHRNYW5hZ2VyRXB2OwogIH0KICBzaWYtPkZsYWdzICAgICAgICA9IEZsYWdzOwogIHNpZi0+TWF4Q2FsbHMgICAgID0gTWF4Q2FsbHM7CiAgc2lmLT5NYXhScGNTaXplICAgPSBNYXhScGNTaXplOwogIHNpZi0+SWZDYWxsYmFja0ZuID0gSWZDYWxsYmFja0ZuOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigmc2VydmVyX2NzKTsKICBzaWYtPk5leHQgPSBpZnM7CiAgaWZzID0gc2lmOwogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZzZXJ2ZXJfY3MpOwoKICBpZiAoc2lmLT5GbGFncyAmIFJQQ19JRl9BVVRPTElTVEVOKSB7CiAgICBSUENSVDRfc3RhcnRfbGlzdGVuKFRSVUUpOwoKICAgIC8qIG1ha2Ugc3VyZSBzZXJ2ZXIgaXMgYWN0dWFsbHkgbGlzdGVuaW5nIG9uIHRoZSBpbnRlcmZhY2UgYmVmb3JlCiAgICAgKiByZXR1cm5pbmcgKi8KICAgIFJQQ1JUNF9zeW5jX3dpdGhfc2VydmVyX3RocmVhZCgpOwogIH0KCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVW5yZWdpc3RlcklmIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclVucmVnaXN0ZXJJZiggUlBDX0lGX0hBTkRMRSBJZlNwZWMsIFVVSUQqIE1nclR5cGVVdWlkLCBVSU5UIFdhaXRGb3JDYWxsc1RvQ29tcGxldGUgKQp7CiAgRklYTUUoIihJZlNwZWMgPT0gKFJQQ19JRl9IQU5ETEUpXiVwLCBNZ3JUeXBlVXVpZCA9PSAlcywgV2FpdEZvckNhbGxzVG9Db21wbGV0ZSA9PSAldSk6IHN0dWJcbiIsCiAgICBJZlNwZWMsIGRlYnVnc3RyX2d1aWQoTWdyVHlwZVV1aWQpLCBXYWl0Rm9yQ2FsbHNUb0NvbXBsZXRlKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyVW5yZWdpc3RlcklmRXggKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU2VydmVyVW5yZWdpc3RlcklmRXgoIFJQQ19JRl9IQU5ETEUgSWZTcGVjLCBVVUlEKiBNZ3JUeXBlVXVpZCwgaW50IFJ1bmRvd25Db250ZXh0SGFuZGxlcyApCnsKICBGSVhNRSgiKElmU3BlYyA9PSAoUlBDX0lGX0hBTkRMRSleJXAsIE1nclR5cGVVdWlkID09ICVzLCBSdW5kb3duQ29udGV4dEhhbmRsZXMgPT0gJWQpOiBzdHViXG4iLAogICAgSWZTcGVjLCBkZWJ1Z3N0cl9ndWlkKE1nclR5cGVVdWlkKSwgUnVuZG93bkNvbnRleHRIYW5kbGVzKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjT2JqZWN0U2V0VHlwZSAoUlBDUlQ0LkApCiAqCiAqIFBBUkFNUwogKiAgIE9ialV1aWQgIFtJXSAiT2JqZWN0IiBVVUlECiAqICAgVHlwZVV1aWQgW0ldICJUeXBlIiBVVUlECiAqCiAqIFJFVFVSTlMKICogICBSUENfU19PSyAgICAgICAgICAgICAgICAgVGhlIGNhbGwgc3VjY2VlZGVkCiAqICAgUlBDX1NfSU5WQUxJRF9PQkpFQ1QgICAgIFRoZSBwcm92aWRlZCBvYmplY3QgKG5pbCkgaXMgbm90IHZhbGlkCiAqICAgUlBDX1NfQUxSRUFEWV9SRUdJU1RFUkVEIFRoZSBwcm92aWRlZCBvYmplY3QgaXMgYWxyZWFkeSByZWdpc3RlcmVkCiAqCiAqIE1hcHMgIk9iamVjdCIgVVVJRHMgdG8gIlR5cGUiIFVVSUQncy4gIFBhc3NpbmcgdGhlIG5pbCBVVUlEIGFzIHRoZSB0eXBlCiAqIHJlc2V0cyB0aGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgVVVJRCB0byBuaWwgKHRoZSBkZWZhdWx0KS4KICogVGhlIG5pbCBvYmplY3QgaXMgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmlsIHR5cGUgYW5kIGNhbm5vdCBiZQogKiByZWFzc2lnbmVkLiAgU2VydmVycyBjYW4gc3VwcG9ydCBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIHNhbWUKICogaW50ZXJmYWNlIGJ5IHJlZ2lzdGVyaW5nIGRpZmZlcmVudCBlbmQtcG9pbnQgdmVjdG9ycyBmb3IgdGhlIGRpZmZlcmVudAogKiB0eXBlcy4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsIHRoaXMgaWYgYSBzZXJ2ZXIgb25seSBzdXBwb3J0cyB0aGUgbmlsCiAqIHR5cGUsIGFzIGlzIHR5cGljYWwuCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNPYmplY3RTZXRUeXBlKCBVVUlEKiBPYmpVdWlkLCBVVUlEKiBUeXBlVXVpZCApCnsKICBScGNPYmpUeXBlTWFwICptYXAgPSBScGNPYmpUeXBlTWFwcywgKnByZXYgPSBOVUxMOwogIFJQQ19TVEFUVVMgZHVtbXk7CgogIFRSQUNFKCIoT2JqVVVJRCA9PSAlcywgVHlwZVV1aWQgPT0gJXMpLlxuIiwgZGVidWdzdHJfZ3VpZChPYmpVdWlkKSwgZGVidWdzdHJfZ3VpZChUeXBlVXVpZCkpOwogIGlmICgoISBPYmpVdWlkKSB8fCBVdWlkSXNOaWwoT2JqVXVpZCwgJmR1bW15KSkgewogICAgLyogbmlsIHV1aWQgY2Fubm90IGJlIHJlbWFwcGVkICovCiAgICByZXR1cm4gUlBDX1NfSU5WQUxJRF9PQkpFQ1Q7CiAgfQoKICAvKiBmaW5kIHRoZSBtYXBwaW5nIGZvciB0aGlzIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUgLi4uICovCiAgd2hpbGUgKG1hcCkgewogICAgaWYgKCEgVXVpZENvbXBhcmUoT2JqVXVpZCwgJm1hcC0+T2JqZWN0LCAmZHVtbXkpKSBicmVhazsKICAgIHByZXYgPSBtYXA7CiAgICBtYXAgPSBtYXAtPm5leHQ7CiAgfQogIGlmICgoISBUeXBlVXVpZCkgfHwgVXVpZElzTmlsKFR5cGVVdWlkLCAmZHVtbXkpKSB7CiAgICAvKiAuLi4gYW5kIGRyb3AgaXQgZnJvbSB0aGUgbGlzdCAqLwogICAgaWYgKG1hcCkgewogICAgICBpZiAocHJldikgCiAgICAgICAgcHJldi0+bmV4dCA9IG1hcC0+bmV4dDsKICAgICAgZWxzZQogICAgICAgIFJwY09ialR5cGVNYXBzID0gbWFwLT5uZXh0OwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtYXApOwogICAgfQogIH0gZWxzZSB7CiAgICAvKiAuLi4gLCBmYWlsIGlmIHdlIGZvdW5kIGl0IC4uLiAqLwogICAgaWYgKG1hcCkKICAgICAgcmV0dXJuIFJQQ19TX0FMUkVBRFlfUkVHSVNURVJFRDsKICAgIC8qIC4uLiBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IG9uZSBhbmQgYWRkIGl0IGluLiAqLwogICAgbWFwID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihScGNPYmpUeXBlTWFwKSk7CiAgICBtZW1jcHkoJm1hcC0+T2JqZWN0LCBPYmpVdWlkLCBzaXplb2YoVVVJRCkpOwogICAgbWVtY3B5KCZtYXAtPlR5cGUsIFR5cGVVdWlkLCBzaXplb2YoVVVJRCkpOwogICAgbWFwLT5uZXh0ID0gTlVMTDsKICAgIGlmIChwcmV2KQogICAgICBwcmV2LT5uZXh0ID0gbWFwOyAvKiBwcmV2IGlzIHRoZSBsYXN0IG1hcCBpbiB0aGUgbGlua2xpc3QgKi8KICAgIGVsc2UKICAgICAgUnBjT2JqVHlwZU1hcHMgPSBtYXA7CiAgfQoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTZXJ2ZXJSZWdpc3RlckF1dGhJbmZvQSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTZXJ2ZXJSZWdpc3RlckF1dGhJbmZvQSggdW5zaWduZWQgY2hhciAqU2VydmVyUHJpbmNOYW1lLCB1bnNpZ25lZCBsb25nIEF1dGhuU3ZjLCBSUENfQVVUSF9LRVlfUkVUUklFVkFMX0ZOIEdldEtleUZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIEFyZyApCnsKICBGSVhNRSggIiglcywlbHUsJXAsJXApOiBzdHViXG4iLCBTZXJ2ZXJQcmluY05hbWUsIEF1dGhuU3ZjLCBHZXRLZXlGbiwgQXJnICk7CiAgCiAgcmV0dXJuIFJQQ19TX1VOS05PV05fQVVUSE5fU0VSVklDRTsgLyogV2UgZG9uJ3Qga25vdyBhbnkgYXV0aGVudGljYXRpb24gc2VydmljZXMgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY1NlcnZlclJlZ2lzdGVyQXV0aEluZm9XIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlclJlZ2lzdGVyQXV0aEluZm9XKCBMUFdTVFIgU2VydmVyUHJpbmNOYW1lLCB1bnNpZ25lZCBsb25nIEF1dGhuU3ZjLCBSUENfQVVUSF9LRVlfUkVUUklFVkFMX0ZOIEdldEtleUZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIEFyZyApCnsKICBGSVhNRSggIiglcywlbHUsJXAsJXApOiBzdHViXG4iLCBkZWJ1Z3N0cl93KCBTZXJ2ZXJQcmluY05hbWUgKSwgQXV0aG5TdmMsIEdldEtleUZuLCBBcmcgKTsKICAKICByZXR1cm4gUlBDX1NfVU5LTk9XTl9BVVRITl9TRVJWSUNFOyAvKiBXZSBkb24ndCBrbm93IGFueSBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlcyAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU2VydmVyTGlzdGVuIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1NlcnZlckxpc3RlbiggVUlOVCBNaW5pbXVtQ2FsbFRocmVhZHMsIFVJTlQgTWF4Q2FsbHMsIFVJTlQgRG9udFdhaXQgKQp7CiAgUlBDX1NUQVRVUyBzdGF0dXM7CgogIFRSQUNFKCIoJXUsJXUsJXUpXG4iLCBNaW5pbXVtQ2FsbFRocmVhZHMsIE1heENhbGxzLCBEb250V2FpdCk7CgogIGlmICghcHJvdHNlcXMpCiAgICByZXR1cm4gUlBDX1NfTk9fUFJPVFNFUVNfUkVHSVNURVJFRDsKCiAgc3RhdHVzID0gUlBDUlQ0X3N0YXJ0X2xpc3RlbihGQUxTRSk7CgogIGlmIChzdGF0dXMgPT0gUlBDX1NfT0spCiAgICBSUENSVDRfc3luY193aXRoX3NlcnZlcl90aHJlYWQoKTsKCiAgaWYgKERvbnRXYWl0IHx8IChzdGF0dXMgIT0gUlBDX1NfT0spKSByZXR1cm4gc3RhdHVzOwoKICByZXR1cm4gUnBjTWdtdFdhaXRTZXJ2ZXJMaXN0ZW4oKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY01nbXRTZXJ2ZXJXYWl0TGlzdGVuIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY01nbXRXYWl0U2VydmVyTGlzdGVuKCB2b2lkICkKewogIFRSQUNFKCIoKVxuIik7CgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwoKICBpZiAoIXN0ZF9saXN0ZW4pIHsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwogICAgcmV0dXJuIFJQQ19TX05PVF9MSVNURU5JTkc7CiAgfQogIAogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZsaXN0ZW5fY3MpOwoKICBGSVhNRSgibm90IHdhaXRpbmcgZm9yIHNlcnZlciBjYWxscyB0byBmaW5pc2hcbiIpOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNNZ210U3RvcFNlcnZlckxpc3RlbmluZyAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNNZ210U3RvcFNlcnZlckxpc3RlbmluZyAoIFJQQ19CSU5ESU5HX0hBTkRMRSBCaW5kaW5nICkKewogIFRSQUNFKCIoQmluZGluZyA9PSAoUlBDX0JJTkRJTkdfSEFORExFKV4lcClcbiIsIEJpbmRpbmcpOwoKICBpZiAoQmluZGluZykgewogICAgRklYTUUoImNsaWVudC1zaWRlIGludm9jYXRpb24gbm90IGltcGxlbWVudGVkLlxuIik7CiAgICByZXR1cm4gUlBDX1NfV1JPTkdfS0lORF9PRl9CSU5ESU5HOwogIH0KICAKICBSUENSVDRfc3RvcF9saXN0ZW4oRkFMU0UpOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBJX1JwY1NlcnZlclN0YXJ0TGlzdGVuaW5nIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIElfUnBjU2VydmVyU3RhcnRMaXN0ZW5pbmcoIEhXTkQgaFduZCApCnsKICBGSVhNRSggIiglcCk6IHN0dWJcbiIsIGhXbmQgKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgSV9ScGNTZXJ2ZXJTdG9wTGlzdGVuaW5nIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIElfUnBjU2VydmVyU3RvcExpc3RlbmluZyggdm9pZCApCnsKICBGSVhNRSggIigpOiBzdHViXG4iICk7CgogIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIElfUnBjV2luZG93UHJvYyAoUlBDUlQ0LkApCiAqLwpVSU5UIFdJTkFQSSBJX1JwY1dpbmRvd1Byb2MoIHZvaWQgKmhXbmQsIFVJTlQgTWVzc2FnZSwgVUlOVCB3UGFyYW0sIFVMT05HIGxQYXJhbSApCnsKICBGSVhNRSggIiglcCwlMDh4LCUwOHgsJTA4bHgpOiBzdHViXG4iLCBoV25kLCBNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwoKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY01nbXRJbnFJZklkcyAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNNZ210SW5xSWZJZHMoUlBDX0JJTkRJTkdfSEFORExFIEJpbmRpbmcsIFJQQ19JRl9JRF9WRUNUT1IgKipJZklkVmVjdG9yKQp7CiAgRklYTUUoIiglcCwlcCk6IHN0dWJcbiIsIEJpbmRpbmcsIElmSWRWZWN0b3IpOwogIHJldHVybiBSUENfU19JTlZBTElEX0JJTkRJTkc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNNZ210RXBFbHRJbnFCZWdpbiAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNNZ210RXBFbHRJbnFCZWdpbihSUENfQklORElOR19IQU5ETEUgQmluZGluZywgdW5zaWduZWQgbG9uZyBJbnF1aXJ5VHlwZSwKICAgIFJQQ19JRl9JRCAqSWZJZCwgdW5zaWduZWQgbG9uZyBWZXJzT3B0aW9uLCBVVUlEICpPYmplY3RVdWlkLCBSUENfRVBfSU5RX0hBTkRMRSogSW5xdWlyeUNvbnRleHQpCnsKICBGSVhNRSgiKCVwLCVsdSwlcCwlbHUsJXAsJXApOiBzdHViXG4iLAogICAgICAgIEJpbmRpbmcsIElucXVpcnlUeXBlLCBJZklkLCBWZXJzT3B0aW9uLCBPYmplY3RVdWlkLCBJbnF1aXJ5Q29udGV4dCk7CiAgcmV0dXJuIFJQQ19TX0lOVkFMSURfQklORElORzsKfQo=