LyoKICogV2luZSBNZXNzYWdlIENvbXBpbGVyIGxhbmd1YWdlIGFuZCBjb2RlcGFnZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndtYy5oIgojaW5jbHVkZSAibGFuZy5oIgoKCi8qCiAqIExhbmd1YWdlcyBzdXBwb3J0ZWQKICoKICogTVVTVCBiZSBzb3J0aW5nIGFzY2VuZGluZyBvbiBsYW5ndWFnZSBJRAogKi8Kc3RhdGljIGNvbnN0IGxhbmd1YWdlX3QgbGFuZ3VhZ2VzW10gPSB7CgoJezB4MDQwMiwgODY2LCAxMjUxLCAiQnVsZ2FyaWFuIiwgIkJ1bGdhcmlhIn0sCgl7MHgwNDAzLCA4NTAsIDEyNTIsICJDYXRhbGFuIiwgIlNwYWluIn0sCgl7MHgwNDA1LCA4NTIsIDEyNTAsICJDemVjaCIsICJDemVjaCBSZXB1YmxpYyJ9LAoJezB4MDQwNiwgODUwLCAxMjUyLCAiRGFuaXNoIiwgIkRlbm1hcmsifSwKCXsweDA0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJHZXJtYW55In0sCgl7MHgwNDA4LCA3MzcsIDEyNTMsICJHcmVlayIsICJHcmVlY2UifSwKCXsweDA0MDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIFN0YXRlcyJ9LAoJezB4MDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIFRyYWRpdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDA0MEIsIDg1MCwgMTI1MiwgIkZpbm5pc2giLCAiRmlubGFuZCJ9LAoJezB4MDQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkZyYW5jZSJ9LAoJezB4MDQwRSwgODUyLCAxMjUwLCAiSHVuZ2FyaWFuIiwgIkh1bmdhcnkifSwKCXsweDA0MEYsIDg1MCwgMTI1MiwgIkljZWxhbmRpYyIsICJJY2VsYW5kIn0sCgl7MHgwNDEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIkl0YWx5In0sCgl7MHgwNDExLCA5MzIsICA5MzIsICJKYXBhbmVzZSIsICJKYXBhbiJ9LAoJezB4MDQxMiwgOTQ5LCAgOTQ5LCAiS29yZWFuIiwgIktvcmVhIChzb3V0aCkifSwKCXsweDA0MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIk5ldGhlcmxhbmRzIn0sCgl7MHgwNDE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKEJva23lbCkiLCAiTm9yd2F5In0sCgl7MHgwNDE1LCA4NTIsIDEyNTAsICJQb2xpc2giLCAiUG9sYW5kIn0sCgl7MHgwNDE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIkJyYXppbCJ9LAoJezB4MDQxOCwgODUyLCAxMjUwLCAiUm9tYW5pYW4iLCAiUm9tYW5pYSJ9LAoJezB4MDQxOSwgODY2LCAxMjUxLCAiUnVzc2lhbiIsICJSdXNzaWEifSwKCXsweDA0MUEsIDg1MiwgMTI1MCwgIkNyb2F0aWFuIiwgIkNyb2F0aWEifSwKCXsweDA0MUIsIDg1MiwgMTI1MCwgIlNsb3ZhayIsICJTbG92YWtpYSJ9LAoJezB4MDQxQywgODUyLCAxMjUwLCAiQWxiYW5pYW4iLCAiQWxiYW5pYSJ9LAoJezB4MDQxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCIsICJTd2VkZW4ifSwKCXsweDA0MUYsIDg1NywgMTI1NCwgIlR1cmtpc2giLCAiVHVya2V5In0sCgl7MHgwNDIxLCA4NTAsIDEyNTIsICJJbmRvbmVzaWFuIiwgIkluZG9uZXNpYSJ9LAoJezB4MDQyMiwgODY2LCAxMjUxLCAiVWtyYWluaWFuIiwgIlVrcmFpbmUifSwKCXsweDA0MjMsIDg2NiwgMTI1MSwgIkJlbGFydXNpYW4iLCAiQmVsYXJ1cyJ9LAoJezB4MDQyNCwgODUyLCAxMjUwLCAiU2xvdmVuZSIsICJTbG92ZW5pYSJ9LAoJezB4MDQyNSwgNzc1LCAxMjU3LCAiRXN0b25pYW4iLCAiRXN0b25pYSJ9LAoJezB4MDQyNiwgNzc1LCAxMjU3LCAiTGF0dmlhbiIsICJMYXR2aWEifSwKCXsweDA0MjcsIDc3NSwgMTI1NywgIkxpdGh1YW5pYW4iLCAiTGl0aHVhbmlhIn0sCi8qCXsweDA0MkEsICAgPywgICAgPywgIlZpZXRuYW1lc2UiLCAiVmlldG5hbSJ9LCovCgl7MHgwNDJELCA4NTAsIDEyNTIsICJCYXNxdWUiLCAiU3BhaW4ifSwKCXsweDA0MkYsIDg2NiwgMTI1MSwgIk1hY2Vkb25pYW4iLCAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSJ9LAoJezB4MDQzNiwgODUwLCAxMjUyLCAiQWZyaWthYW5zIiwgIlNvdXRoIEFmcmljYSJ9LAovKgl7MHgwNDM4LCA4NTIsIDEyNTIsICJGYXJvZXNlIiwgIkZhcm9lIElzbGFuZHMifSwgRklYTUU6IE5vdCBzdXJlIGFib3V0IGNvZGVwYWdlcyAqLwoJezB4MDQzQywgNDM3LCAxMjUyLCAiSXJpc2giLCAiSXJlbGFuZCJ9LAoJezB4MDQzRSwgODUwLCAxMjUyLCAiTWFsYXkiLCAiTWFsYXlzaWEifSwKLyoJezB4MDQ4RiwgICA/LCAgICA/LCAiRXNwZXJhbnRvIiwgIjxub25lPiJ9LCovCi8qCXsweDA4MDQsICAgPywgICAgPywgIkNoaW5lc2UgKFBlb3BsZSdzIHJlcGx1YmxpYyBvZiBDaGluYSkiLCBQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSJ9LCovCgl7MHgwODA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiU3dpdHplcmxhbmQifSwKCXsweDA4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIEtpbmdkb20ifSwKCXsweDA4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiTWV4aWNvIn0sCgl7MHgwODBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiQmVsZ2l1bSJ9LAoJezB4MDgxMCwgODUwLCAxMjUyLCAiSXRhbGlhbiIsICJTd2l0emVybGFuZCJ9LAoJezB4MDgxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiQmVsZ2l1bSJ9LAoJezB4MDgxNCwgODUwLCAxMjUyLCAiTm9yd2VnaWFuIChOeW5vcnNrKSIsICJOb3J3YXkifSwKCXsweDA4MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiUG9ydHVnYWwifSwKLyoJezB4MDgxQSwgICA/LCAgICA/LCAiU2VyYmlhbiAobGF0aW4pIiwgIll1Z29zbGF2aWEifSwqLwoJezB4MDgxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCAoRmlubGFuZCkiLCAiRmlubGFuZCJ9LAoJezB4MEMwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkF1c3RyaWEifSwKCXsweDBDMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQXVzdHJhbGlhIn0sCgl7MHgwQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gSW50ZXJuYXRpb25hbCBTb3J0IiwgIlNwYWluIn0sCgl7MHgwQzBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiQ2FuYWRhIn0sCgl7MHgwQzFBLCA4NTUsIDEyNTEsICJTZXJiaWFuIChDeXJpbGxpYykiLCAiU2VyYmlhIn0sCgl7MHgxMDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiTHV4ZW1ib3VyZyJ9LAoJezB4MTAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYW5hZGEifSwKCXsweDEwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiR3VhdGVtYWxhIn0sCgl7MHgxMDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiU3dpdHplcmxhbmQifSwKCXsweDE0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMaWVjaHRlbnN0ZWluIn0sCgl7MHgxNDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIk5ldyBaZWFsYW5kIn0sCgl7MHgxNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNvc3RhIFJpY2EifSwKCXsweDE0MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJMdXhlbWJvdXJnIn0sCgl7MHgxODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIklyZWxhbmQifSwKCXsweDE4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGFuYW1hIn0sCgl7MHgxQzA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlNvdXRoIEFmcmljYSJ9LAoJezB4MUMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJEb21pbmljYW4gUmVwdWJsaWMifSwKCXsweDIwMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSmFtYWljYSJ9LAoJezB4MjAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJWZW5lenVlbGEifSwKCXsweDI0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQ2FyaWJiZWFuIn0sCgl7MHgyNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNvbG9tYmlhIn0sCgl7MHgyODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkJlbGl6ZSJ9LAoJezB4MjgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQZXJ1In0sCgl7MHgyQzA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlRyaW5pZGFkICYgVG9iYWdvIn0sCgl7MHgyQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkFyZ2VudGluYSJ9LAoJezB4MzAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJFY3VhZG9yIn0sCgl7MHgzNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNoaWxlIn0sCgl7MHgzODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlVydWd1YXkifSwKCXsweDNDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGFyYWd1YXkifSwKCXsweDQwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQm9saXZpYSJ9LAoJezB4NDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJFbCBTYWx2YWRvciJ9LAoJezB4NDgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJIb25kdXJhcyJ9LAoJezB4NEMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJOaWNhcmFndWEifSwKCXsweDUwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUHVlcnRvIFJpY28ifQp9OwoKI2RlZmluZSBOTEFOCShzaXplb2YobGFuZ3VhZ2VzKS9zaXplb2YobGFuZ3VhZ2VzWzBdKSkKCnZvaWQgc2hvd19sYW5ndWFnZXModm9pZCkKewoJdW5zaWduZWQgaW50IGk7CglwcmludGYoIiBDb2RlICB8IERPUy1jcCB8IFdJTi1jcCB8ICAgTGFuZ3VhZ2UgICB8IENvdW50cnlcbiIpOwoJcHJpbnRmKCItLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLVxuIik7Cglmb3IoaSA9IDA7IGkgPCBOTEFOOyBpKyspCgkJcHJpbnRmKCIweCUwNHggfCAlNWQgIHwgJTVkICAgfCAlLTEycyB8ICVzXG4iLAoJCQlsYW5ndWFnZXNbaV0uaWQsCgkJCWxhbmd1YWdlc1tpXS5kb3NjcCwKCQkJbGFuZ3VhZ2VzW2ldLndpbmNwLAoJCQlsYW5ndWFnZXNbaV0ubmFtZSwKCQkJbGFuZ3VhZ2VzW2ldLmNvdW50cnkpOwp9CgpzdGF0aWMgaW50IGxhbmdjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQp7CglyZXR1cm4gKih1bnNpZ25lZCAqKXAxIC0gKChsYW5ndWFnZV90ICopcDIpLT5pZDsKfQoKY29uc3QgbGFuZ3VhZ2VfdCAqZmluZF9sYW5ndWFnZSh1bnNpZ25lZCBpZCkKewoJcmV0dXJuIChjb25zdCBsYW5ndWFnZV90ICopYnNlYXJjaCgmaWQsIGxhbmd1YWdlcywgTkxBTiwgc2l6ZW9mKGxhbmd1YWdlc1swXSksIGxhbmdjbXApOwp9Cgp2b2lkIHNob3dfY29kZXBhZ2VzKHZvaWQpCnsKCXVuc2lnbmVkIGk7Cgljb25zdCB1bmlvbiBjcHRhYmxlICpjcHA7CglwcmludGYoIkNvZGVwYWdlczpcbiIpOwoJZm9yKGkgPSAwOyAoY3BwID0gY3BfZW51bV90YWJsZShpKSk7IGkrKykKCXsKCQlwcmludGYoIiUtNWQgJXNcbiIsIGNwcC0+aW5mby5jb2RlcGFnZSwgY3BwLT5pbmZvLm5hbWUpOwoJfQp9Cgpjb25zdCB1bmlvbiBjcHRhYmxlICpmaW5kX2NvZGVwYWdlKGludCBpZCkKewoJcmV0dXJuIGNwX2dldF90YWJsZShpZCk7Cn0KCg==