LyoKICogV2luZSBNZXNzYWdlIENvbXBpbGVyIGxhbmd1YWdlIGFuZCBjb2RlcGFnZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQogKgogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAid21jLmgiCiNpbmNsdWRlICJsYW5nLmgiCgoKLyoKICogTGFuZ3VhZ2VzIHN1cHBvcnRlZAogKgogKiBNVVNUIGJlIHNvcnRpbmcgYXNjZW5kaW5nIG9uIGxhbmd1YWdlIElECiAqLwpzdGF0aWMgY29uc3QgbGFuZ3VhZ2VfdCBsYW5ndWFnZXNbXSA9IHsKCgl7MHgwNDAyLCA4NjYsIDEyNTEsICJCdWxnYXJpYW4iLCAiQnVsZ2FyaWEifSwKCXsweDA0MDMsIDg1MCwgMTI1MiwgIkNhdGFsYW4iLCAiU3BhaW4ifSwKCXsweDA0MDUsIDg1MiwgMTI1MCwgIkN6ZWNoIiwgIkN6ZWNoIFJlcHVibGljIn0sCgl7MHgwNDA2LCA4NTAsIDEyNTIsICJEYW5pc2giLCAiRGVubWFyayJ9LAoJezB4MDQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkdlcm1hbnkifSwKCXsweDA0MDgsIDczNywgMTI1MywgIkdyZWVrIiwgIkdyZWVjZSJ9LAoJezB4MDQwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgU3RhdGVzIn0sCgl7MHgwNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gVHJhZGl0aW9uYWwgU29ydCIsICJTcGFpbiJ9LAoJezB4MDQwQiwgODUwLCAxMjUyLCAiRmlubmlzaCIsICJGaW5sYW5kIn0sCgl7MHgwNDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiRnJhbmNlIn0sCgl7MHgwNDBFLCA4NTIsIDEyNTAsICJIdW5nYXJpYW4iLCAiSHVuZ2FyeSJ9LAoJezB4MDQwRiwgODUwLCAxMjUyLCAiSWNlbGFuZGljIiwgIkljZWxhbmQifSwKCXsweDA0MTAsIDg1MCwgMTI1MiwgIkl0YWxpYW4iLCAiSXRhbHkifSwKCXsweDA0MTEsIDkzMiwgIDkzMiwgIkphcGFuZXNlIiwgIkphcGFuIn0sCgl7MHgwNDEyLCA5NDksICA5NDksICJLb3JlYW4iLCAiS29yZWEgKHNvdXRoKSJ9LAoJezB4MDQxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiTmV0aGVybGFuZHMifSwKCXsweDA0MTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoQm9rbeVsKSIsICJOb3J3YXkifSwKCXsweDA0MTUsIDg1MiwgMTI1MCwgIlBvbGlzaCIsICJQb2xhbmQifSwKCXsweDA0MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiQnJhemlsIn0sCgl7MHgwNDE4LCA4NTIsIDEyNTAsICJSb21hbmlhbiIsICJSb21hbmlhIn0sCgl7MHgwNDE5LCA4NjYsIDEyNTEsICJSdXNzaWFuIiwgIlJ1c3NpYSJ9LAoJezB4MDQxQSwgODUyLCAxMjUwLCAiQ3JvYXRpYW4iLCAiQ3JvYXRpYSJ9LAoJezB4MDQxQiwgODUyLCAxMjUwLCAiU2xvdmFrIiwgIlNsb3Zha2lhIn0sCgl7MHgwNDFDLCA4NTIsIDEyNTAsICJBbGJhbmlhbiIsICJBbGJhbmlhIn0sCgl7MHgwNDFELCA4NTAsIDEyNTIsICJTd2VkaXNoIiwgIlN3ZWRlbiJ9LAoJezB4MDQxRiwgODU3LCAxMjU0LCAiVHVya2lzaCIsICJUdXJrZXkifSwKCXsweDA0MjEsIDg1MCwgMTI1MiwgIkluZG9uZXNpYW4iLCAiSW5kb25lc2lhIn0sCgl7MHgwNDIyLCA4NjYsIDEyNTEsICJVa3JhaW5pYW4iLCAiVWtyYWluZSJ9LAoJezB4MDQyMywgODY2LCAxMjUxLCAiQmVsYXJ1c2lhbiIsICJCZWxhcnVzIn0sCgl7MHgwNDI0LCA4NTIsIDEyNTAsICJTbG92ZW5lIiwgIlNsb3ZlbmlhIn0sCgl7MHgwNDI1LCA3NzUsIDEyNTcsICJFc3RvbmlhbiIsICJFc3RvbmlhIn0sCgl7MHgwNDI2LCA3NzUsIDEyNTcsICJMYXR2aWFuIiwgIkxhdHZpYSJ9LAoJezB4MDQyNywgNzc1LCAxMjU3LCAiTGl0aHVhbmlhbiIsICJMaXRodWFuaWEifSwKLyoJezB4MDQyQSwgICA/LCAgICA/LCAiVmlldG5hbWVzZSIsICJWaWV0bmFtIn0sKi8KCXsweDA0MkQsIDg1MCwgMTI1MiwgIkJhc3F1ZSIsICJTcGFpbiJ9LAoJezB4MDQyRiwgODY2LCAxMjUxLCAiTWFjZWRvbmlhbiIsICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIn0sCgl7MHgwNDM2LCA4NTAsIDEyNTIsICJBZnJpa2FhbnMiLCAiU291dGggQWZyaWNhIn0sCi8qCXsweDA0MzgsIDg1MiwgMTI1MiwgIkZhcm9lc2UiLCAiRmFyb2UgSXNsYW5kcyJ9LCBGSVhNRTogTm90IHN1cmUgYWJvdXQgY29kZXBhZ2VzICovCgl7MHgwNDNDLCA0MzcsIDEyNTIsICJJcmlzaCIsICJJcmVsYW5kIn0sCgl7MHgwNDNFLCA4NTAsIDEyNTIsICJNYWxheSIsICJNYWxheXNpYSJ9LAovKgl7MHgwNDhGLCAgID8sICAgID8sICJFc3BlcmFudG8iLCAiPG5vbmU+In0sKi8KLyoJezB4MDgwNCwgICA/LCAgICA/LCAiQ2hpbmVzZSAoUGVvcGxlJ3MgcmVwbHVibGljIG9mIENoaW5hKSIsIFBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hIn0sKi8KCXsweDA4MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJTd2l0emVybGFuZCJ9LAoJezB4MDgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgS2luZ2RvbSJ9LAoJezB4MDgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJNZXhpY28ifSwKCXsweDA4MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJCZWxnaXVtIn0sCgl7MHgwODEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIlN3aXR6ZXJsYW5kIn0sCgl7MHgwODEzLCA4NTAsIDEyNTIsICJEdXRjaCIsICJCZWxnaXVtIn0sCgl7MHgwODE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKE55bm9yc2spIiwgIk5vcndheSJ9LAoJezB4MDgxNiwgODUwLCAxMjUyLCAiUG9ydHVndWVzZSIsICJQb3J0dWdhbCJ9LAovKgl7MHgwODFBLCAgID8sICAgID8sICJTZXJiaWFuIChsYXRpbikiLCAiWXVnb3NsYXZpYSJ9LCovCgl7MHgwODFELCA4NTAsIDEyNTIsICJTd2VkaXNoIChGaW5sYW5kKSIsICJGaW5sYW5kIn0sCgl7MHgwQzA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiQXVzdHJpYSJ9LAoJezB4MEMwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJBdXN0cmFsaWEifSwKCXsweDBDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2ggLSBJbnRlcm5hdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDBDMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJDYW5hZGEifSwKCXsweDBDMUEsIDg1NSwgMTI1MSwgIlNlcmJpYW4gKEN5cmlsbGljKSIsICJTZXJiaWEifSwKCXsweDEwMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMdXhlbWJvdXJnIn0sCgl7MHgxMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhbmFkYSJ9LAoJezB4MTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJHdWF0ZW1hbGEifSwKCXsweDEwMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJTd2l0emVybGFuZCJ9LAoJezB4MTQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkxpZWNodGVuc3RlaW4ifSwKCXsweDE0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiTmV3IFplYWxhbmQifSwKCXsweDE0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29zdGEgUmljYSJ9LAoJezB4MTQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkx1eGVtYm91cmcifSwKCXsweDE4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSXJlbGFuZCJ9LAoJezB4MTgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYW5hbWEifSwKCXsweDFDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiU291dGggQWZyaWNhIn0sCgl7MHgxQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkRvbWluaWNhbiBSZXB1YmxpYyJ9LAoJezB4MjAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJKYW1haWNhIn0sCgl7MHgyMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlZlbmV6dWVsYSJ9LAoJezB4MjQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYXJpYmJlYW4ifSwKCXsweDI0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29sb21iaWEifSwKCXsweDI4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQmVsaXplIn0sCgl7MHgyODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBlcnUifSwKCXsweDJDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVHJpbmlkYWQgJiBUb2JhZ28ifSwKCXsweDJDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQXJnZW50aW5hIn0sCgl7MHgzMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVjdWFkb3IifSwKCXsweDM0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ2hpbGUifSwKCXsweDM4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVXJ1Z3VheSJ9LAoJezB4M0MwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYXJhZ3VheSJ9LAoJezB4NDAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJCb2xpdmlhIn0sCgl7MHg0NDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVsIFNhbHZhZG9yIn0sCgl7MHg0ODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkhvbmR1cmFzIn0sCgl7MHg0QzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk5pY2FyYWd1YSJ9LAoJezB4NTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQdWVydG8gUmljbyJ9Cn07CgojZGVmaW5lIE5MQU4JKHNpemVvZihsYW5ndWFnZXMpL3NpemVvZihsYW5ndWFnZXNbMF0pKQoKdm9pZCBzaG93X2xhbmd1YWdlcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXByaW50ZigiIENvZGUgIHwgRE9TLWNwIHwgV0lOLWNwIHwgICBMYW5ndWFnZSAgIHwgQ291bnRyeVxuIik7CglwcmludGYoIi0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tXG4iKTsKCWZvcihpID0gMDsgaSA8IE5MQU47IGkrKykKCQlwcmludGYoIjB4JTA0eCB8ICU1ZCAgfCAlNWQgICB8ICUtMTJzIHwgJXNcbiIsCgkJCWxhbmd1YWdlc1tpXS5pZCwKCQkJbGFuZ3VhZ2VzW2ldLmRvc2NwLAoJCQlsYW5ndWFnZXNbaV0ud2luY3AsCgkJCWxhbmd1YWdlc1tpXS5uYW1lLAoJCQlsYW5ndWFnZXNbaV0uY291bnRyeSk7Cn0KCnN0YXRpYyBpbnQgbGFuZ2NtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKCXJldHVybiAqKHVuc2lnbmVkICopcDEgLSAoKGxhbmd1YWdlX3QgKilwMiktPmlkOwp9Cgpjb25zdCBsYW5ndWFnZV90ICpmaW5kX2xhbmd1YWdlKHVuc2lnbmVkIGlkKQp7CglyZXR1cm4gKGNvbnN0IGxhbmd1YWdlX3QgKilic2VhcmNoKCZpZCwgbGFuZ3VhZ2VzLCBOTEFOLCBzaXplb2YobGFuZ3VhZ2VzWzBdKSwgbGFuZ2NtcCk7Cn0KCnZvaWQgc2hvd19jb2RlcGFnZXModm9pZCkKewoJdW5zaWduZWQgaTsKCWNvbnN0IHVuaW9uIGNwdGFibGUgKmNwcDsKCXByaW50ZigiQ29kZXBhZ2VzOlxuIik7Cglmb3IoaSA9IDA7IChjcHAgPSBjcF9lbnVtX3RhYmxlKGkpKTsgaSsrKQoJewoJCXByaW50ZigiJS01ZCAlc1xuIiwgY3BwLT5pbmZvLmNvZGVwYWdlLCBjcHAtPmluZm8ubmFtZSk7Cgl9Cn0KCmNvbnN0IHVuaW9uIGNwdGFibGUgKmZpbmRfY29kZXBhZ2UoaW50IGlkKQp7CglyZXR1cm4gY3BfZ2V0X3RhYmxlKGlkKTsKfQoK